diff --git a/uppsrc/Sql/MassInsert.cpp b/uppsrc/Sql/MassInsert.cpp index e8fb4972d..491bb2a1d 100644 --- a/uppsrc/Sql/MassInsert.cpp +++ b/uppsrc/Sql/MassInsert.cpp @@ -26,8 +26,9 @@ SqlMassInsert& SqlMassInsert::operator()(SqlId col, const Value& val) return *this; } -SqlMassInsert& SqlMassInsert::EndRow() +SqlMassInsert& SqlMassInsert::EndRow(SqlBool remove) { + cache.Top().remove = remove; if(cache.GetCount() && cache[0].value.GetCount() * cache.GetCount() > 5000) Flush(); ASSERT(column.GetCount() == pos); @@ -40,6 +41,18 @@ void SqlMassInsert::Flush() const dword DONE = 0xffffffff; if(cache.GetCount() == 0) return; + sql.GetSession().Begin(); + SqlBool remove; + bool doremove = false; + for(int ii = 0; ii < cache.GetCount(); ii++) { + SqlBool rm = cache[ii].remove; + if(!rm.IsEmpty()) { + doremove = true; + remove = remove || rm; + } + } + if(doremove) + sql * Delete(SqlId(table)).Where(remove); for(int ii = 0; ii < cache.GetCount(); ii++) { dword nulls = cache[ii].nulls; if(nulls != DONE) { @@ -79,6 +92,12 @@ void SqlMassInsert::Flush() sql.Execute(insert); } } + if(sql.WasError()) { + error = true; + sql.GetSession().Rollback(); + } + else + sql.GetSession().Commit(); cache.Clear(); column.Clear(); pos = 0; diff --git a/uppsrc/Sql/Sqls.h b/uppsrc/Sql/Sqls.h index e74ecd059..fe75db224 100644 --- a/uppsrc/Sql/Sqls.h +++ b/uppsrc/Sql/Sqls.h @@ -429,6 +429,7 @@ class SqlMassInsert { struct Row : Moveable { dword nulls; Vector value; + SqlBool remove; }; Sql& sql; @@ -436,17 +437,19 @@ class SqlMassInsert { Vector column; Vector cache; int pos; + bool error; void NewRow(); public: SqlMassInsert& operator()(SqlId col, const Value& val); - SqlMassInsert& EndRow(); + SqlMassInsert& EndRow(SqlBool remove = SqlBool()); void Flush(); + bool IsError() const { return error; } - SqlMassInsert(Sql& sql, SqlId table) : sql(sql), table(~table) { pos = 0; } + SqlMassInsert(Sql& sql, SqlId table) : sql(sql), table(~table) { pos = 0; error = false; } #ifndef NOAPPSQL - SqlMassInsert(SqlId table) : sql(SQL), table(~table) { pos = 0; } + SqlMassInsert(SqlId table) : sql(SQL), table(~table) { pos = 0; error = false; } #endif ~SqlMassInsert(); };