From 03618e002c49511982c61820bbfacd714d4a6a31 Mon Sep 17 00:00:00 2001 From: cxl Date: Thu, 19 Jan 2012 14:39:30 +0000 Subject: [PATCH] Sql: MassInsert now has remove option git-svn-id: svn://ultimatepp.org/upp/trunk@4443 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Sql/MassInsert.cpp | 21 ++++++++++++++++++++- uppsrc/Sql/Sqls.h | 9 ++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) 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(); };