Value SqlStatement::Fetch(Sql& cursor) const { ASSERT(text.GetCount()); if(!Execute(cursor)) return ErrorValue(SqlExc(cursor.GetSession())); if(!cursor.Fetch()) return Null; return cursor[0]; }
String ForceInsertRowid(const String& insert, Sql& cursor) { if(!cursor.Execute(insert + " returning ROWID into ?%s")) throw SqlExc(cursor.GetSession()); if(!cursor.Fetch()) throw Exc(t_("FETCH internal error (ForceInsertRowid)")); ASSERT(!IsNull(cursor[0])); return cursor[0]; }
bool Sql::Execute() { SqlSession &session = GetSession(); session.SetStatement(cn->statement); session.SetStatus(SqlSession::BEFORE_EXECUTING); cn->starttime = GetTickCount(); Stream *s = session.GetTrace(); if(s) { #ifndef NOAPPSQL if(this == &AppCursor()) *s << "SQL* "; else if(this == &AppCursorR()) *s << "SQLR* "; #endif String st = cn->statement; if(session.IsTraceCompression()) st = CompressLog(st); int i = 0; for(const char *q = st; *q; q++) if(*q == '?' && i < param.GetCount()) { Value v = param[i++]; if(IsString(v)) *s << '\'' << v << '\''; else *s << v; } else s->Put(*q); *s << '\n'; } if(!session.IsOpen()) { session.SetStatus(SqlSession::CONNECTION_ERROR); return false; } session.SetStatus(SqlSession::START_EXECUTING); bool b = cn->Execute(); session.SetTime(GetTickCount() - cn->starttime); session.SetStatus(SqlSession::END_EXECUTING); if(!b) session.SetStatus(SqlSession::EXECUTING_ERROR); for(int i = 0; i < cn->info.GetCount(); i++) cn->info[i].name = ToUpper(cn->info[i].name); session.SetStatus(SqlSession::AFTER_EXECUTING); if(!b && session.throwonerror) throw SqlExc(GetSession()); return b; }
void SqlStatement::Force(Sql& cursor) const { ASSERT(text.GetCount()); if(!cursor.Execute(*this)) throw SqlExc(cursor.GetSession()); }
void ForceExecute(const String& s, Sql& cursor) { if(!cursor.Execute(s)) throw SqlExc(cursor); }
void ForceDelete(SqlId table, SqlId key, const Value& keyval, Sql& cursor) { if(!cursor.Delete(table, key, keyval)) throw SqlExc(cursor); }
void Sql::ExecuteX() { if(!Execute()) throw SqlExc(GetSession()); }