SqlStatement SqlCreateTable::As(const SqlSelect& select) { String text = "create "; if(!permanent) text << "temporary "; text << "table " << table.Quoted() << " as (" + SqlStatement(select).GetText() + ")"; return SqlStatement(text); }
SqlUpdate::operator SqlStatement() const { StringBuffer stmt; stmt << "update " << table.Quoted() << " set " << ~set; if(sel.IsValid()) stmt << SqlStatement(sel).GetText().Mid(9 + 2 * SqlId::IsUseQuotes()); else if(!where.IsEmpty()) stmt << " where " << ~where; return SqlStatement(stmt); }
SqlInsert::operator SqlStatement() const { String s = "insert into " + table.Quoted(); if(!set1.IsEmpty()) { s << set1(); if(sel.IsValid()) s << ' ' << SqlStatement(sel).GetText(); else if(!set2.IsEmpty()) s << " values " << set2(); } return SqlStatement(s); }
SqlStatement Database::CreateStatement(SqlStatementID& index, const char* fmt) { int nId = -1; //check if statement ID is initialized if (!index.initialized()) { //convert to lower register std::string szFmt(fmt); //count input parameters int nParams = std::count(szFmt.begin(), szFmt.end(), '?'); //find existing or add a new record in registry LOCK_GUARD _guard(m_stmtGuard); PreparedStmtRegistry::const_iterator iter = m_stmtRegistry.find(szFmt); if (iter == m_stmtRegistry.end()) { nId = ++m_iStmtIndex; m_stmtRegistry[szFmt] = nId; } else nId = iter->second; //save initialized statement index info index.init(nId, nParams); } return SqlStatement(index, *this); }
SqlUpdate::operator SqlStatement() const { StringBuffer stmt; stmt << "update " << table.Quoted() << " set " << ~set; if(!where.IsEmpty()) stmt << " where " << ~where; return SqlStatement(stmt); }
SqlWith& SqlWith::As(const SqlSelect& select) { if(args) text << ')'; text << " as (" + SqlStatement(select).GetText() + ")"; args = false; return *this; }
SqlInsert::operator SqlStatement() const { String s = "insert into " + table.Quoted(); if(!set1.IsEmpty()) { s << set1(); if(from.IsEmpty() && where.IsEmpty() && groupby.IsEmpty()) { if(!set2.IsEmpty()) s << " values " << set2(); } else { SqlSelect sel; sel = Select(set2).From(from).Where(where); if(!groupby.IsEmpty()) sel.GroupBy(groupby); if(!having.IsEmpty()) sel.Having(having); s << ' ' + SqlStatement(sel).GetText(); } } return SqlStatement(s); }
SqlStatement SqlDatabase::sqlCompile(const char* szSQL) { require(mpDB); const char* szTail=0; sqlite3_stmt* pVM; const int result = sqlite3_prepare_v2(mpDB, szSQL, -1, &pVM, &szTail); assert(szTail != 0); const bool extra_statements = (szTail[0] != '\0'); // was (szTail && szTail[0] != '\0') if (result != SQLITE_OK) throw SqlDatabaseException(sqlite3_errmsg(mpDB)); if (extra_statements) throw SqlDatabaseException("sqlCompile() only compiles the first statement; other statements have been ignored."); return SqlStatement(pVM); }
SqlStatement SqlDatabase::sqlQueryVar(const char* szSQL, va_list args) { require(mpDB); char* szSqlFormatted = sqlite3_vmprintf(szSQL, args); if (!szSqlFormatted) throw new SqlDatabaseException("Unable to apply format to SQL string"); const char* szTail=0; sqlite3_stmt* pVM; const int result = sqlite3_prepare_v2(mpDB, szSqlFormatted, -1, &pVM, &szTail); assert(szTail != 0); const bool extra_statements = (szTail[0] != '\0'); // was (szTail && szTail[0] != '\0') sqlite3_free(szSqlFormatted); if (result != SQLITE_OK) throw SqlDatabaseException(sqlite3_errmsg(mpDB)); if (extra_statements) throw SqlDatabaseException("sqlQuery() only compiles the first statement; other statements have been ignored."); return SqlStatement(pVM).execute(); }
SqlStatement SqlWith::operator()(const SqlDelete& deletes) { return SqlStatement(text + " " + SqlStatement(deletes).GetText()); }
SqlStatement SqlWith::operator()(const SqlUpdate& update) { return SqlStatement(text + " " + SqlStatement(update).GetText()); }
SqlStatement SqlWith::operator()(const SqlInsert& insert) { return SqlStatement(text + " " + SqlStatement(insert).GetText()); }
SqlSelect SqlWith::operator()(const SqlSelect& select) { SqlSet set; set.SetRaw(text + " " + SqlStatement(select).GetText()); return set; }
void ForceInsert(SqlId table, Fields nf, Sql& cursor) { SqlUtil::InsertColumns helper; nf(helper); cursor & SqlStatement(helper.Get(table)); }
String ForceInsertRowid(const SqlInsert& insert, Sql& cursor) { return ForceInsertRowid(SqlStatement(insert).Get(cursor.GetDialect()), cursor); }