diff --git a/uppsrc/MSSQL/MSSQL.cpp b/uppsrc/MSSQL/MSSQL.cpp index d38b86596..2340c8bc3 100644 --- a/uppsrc/MSSQL/MSSQL.cpp +++ b/uppsrc/MSSQL/MSSQL.cpp @@ -20,4 +20,18 @@ void IdentityInsert(const SqlInsert& ins) IdentityInsert(SQL, ins); } +Value MsSqlSequence::Get() +{ +#ifndef NOAPPSQL + Sql sql(session ? *session : SQL.GetSession()); +#else + ASSERT(session); + Sql sql(*session); +#endif + if(!sql.Execute("select next value for " + ~seq) || !sql.Fetch()) + return ErrorValue(); + return sql[0]; +} + + }; diff --git a/uppsrc/MSSQL/MSSQL.h b/uppsrc/MSSQL/MSSQL.h index 024b1f56a..cd1e15be4 100644 --- a/uppsrc/MSSQL/MSSQL.h +++ b/uppsrc/MSSQL/MSSQL.h @@ -19,6 +19,27 @@ bool MSSQLPerformScript(const String& text, StatementExecutor& executor, void IdentityInsert(Sql& sql, const SqlInsert& ins); void IdentityInsert(const SqlInsert& ins); +class MsSqlSequence : public ValueGen { + SqlId seq; + SqlSession *session; + +public: + virtual Value Get(); + + Value operator++() { return Get(); } + + void Set(SqlId id, SqlSession& s) { seq = id; session = &s; } + +#ifndef NOAPPSQL + void Set(SqlId id) { seq = id; session = NULL; } + + MsSqlSequence(SqlId seq) { Set(seq); } +#endif + MsSqlSequence(SqlId seq, SqlSession& s) { Set(seq, s); } + + MsSqlSequence() { session = NULL; } +}; + }; #endif