diff --git a/uppsrc/Sql/SqlStatement.cpp b/uppsrc/Sql/SqlStatement.cpp index 26246f653..eb7f8c295 100644 --- a/uppsrc/Sql/SqlStatement.cpp +++ b/uppsrc/Sql/SqlStatement.cpp @@ -304,6 +304,81 @@ void SqlStatement::Force() const { Value SqlStatement::Fetch() const { return Fetch(SQL); } + +bool SqlPerformScript(SqlSession& session, Stream& script, + Gate2 progress_canceled, bool stoponerror) +{ + String stmt; + int level = 0; + bool ok = true; + while(!script.IsEof()) { + int c = script.Term(); + if(IsAlpha(c)) { + String id; + while(IsAlpha(script.Term())) { + c = script.Get(); + stmt.Cat(c); + id.Cat(ToUpper(c)); + } + if(id == "BEGIN") + level++; + if(id == "END") + level--; + } + else + if(c == '\'') { + stmt.Cat(c); + script.Get(); + for(;;) { + c = script.Get(); + if(c < 0) { + ok = false; + if(stoponerror) + return false; + break; + } + stmt.Cat(c); + if(c == '\'') + break; + } + } + else + if(c == ';' && level == 0) { + Sql sql(session); + session.ClearError(); + if(!sql.Execute(stmt)) { + ok = false; + if(stoponerror) + break; + } + stmt.Clear(); + script.Get(); + } + else + stmt.Cat(script.Get()); + } + return ok; +} + +bool SqlPerformScript(Stream& script, + Gate2 progress_canceled, bool stoponerror) +{ + SqlPerformScript(SQL.GetSession(), script, progress_canceled, stoponerror); +} + +bool SqlPerformScript(SqlSession& session, const String& script, + Gate2 progress_canceled, bool stoponerror) +{ + StringStream ss(s); + return SqlPerformScript(session, ss, progress_canceled, stoponerror); +} + +bool SqlPerformScript(const String& script, + Gate2 progress_canceled, bool stoponerror) +{ + SqlPerformScript(SQL.GetSession(), script, progress_canceled, stoponerror); +} + #endif END_UPP_NAMESPACE diff --git a/uppsrc/Sql/Sqls.h b/uppsrc/Sql/Sqls.h index d47f28626..406ba96c6 100644 --- a/uppsrc/Sql/Sqls.h +++ b/uppsrc/Sql/Sqls.h @@ -355,6 +355,15 @@ public: class OciConnection; +bool SqlPerformScript(SqlSession& session, Stream& script, + Gate2 progress_canceled = false, bool stoponerror = false); +bool SqlPerformScript(Stream& script, + Gate2 progress_canceled = false, bool stoponerror = false); +bool SqlPerformScript(SqlSession& session, const String& script, + Gate2 progress_canceled = false, bool stoponerror = false); +bool SqlPerformScript(const String& script, + Gate2 progress_canceled = false, bool stoponerror = false); + struct StdStatementExecutor : StatementExecutor { StdStatementExecutor(SqlSession& session) : cursor(session) {} virtual bool Execute(const String& stmt);