38 if (strncmp(db,
"sqlite://", 9)) {
40 Error(
"TSQLiteServer",
"protocol in db argument should be sqlite it is %s",
41 givenProtocol.
Data());
46 const char *dbase = db + 9;
48#ifndef SQLITE_OPEN_URI
49#define SQLITE_OPEN_URI 0x00000000
51#if SQLITE_VERSION_NUMBER >= 3005000
65 Error(
"TSQLiteServer",
"opening of %s failed with error: %d %s", dbase, sqlite3_errcode(
fSQLite), sqlite3_errmsg(
fSQLite));
105 return Exec(
"BEGIN TRANSACTION");
116 return sqlite3_get_autocommit(
fSQLite) == 0;
126 return Exec(
"COMMIT TRANSACTION");
135 return Exec(
"ROLLBACK TRANSACTION");
146 Error(
"Query",
"not connected");
150 sqlite3_stmt *preparedStmt =
nullptr;
151 const char *tail =
nullptr;
154#if SQLITE_VERSION_NUMBER >= 3005000
155 int retVal = sqlite3_prepare_v2(
fSQLite, sql, -1, &preparedStmt, &tail);
157 int retVal = sqlite3_prepare(
fSQLite, sql, -1, &preparedStmt, &tail);
159 if (retVal != SQLITE_OK) {
160 Error(
"Query",
"SQL Error: %d %s", retVal, sqlite3_errmsg(
fSQLite));
163 if (tail && tail[0] !=
'\0')
164 Warning(
"Query",
"Don't use multiple queries, '%s' query was ignored", tail);
176 Error(
"Exec",
"not connected");
180 char *sqlite_err_msg;
181 int ret = sqlite3_exec(
fSQLite, sql, NULL, NULL, &sqlite_err_msg);
182 if (
ret != SQLITE_OK) {
183 Error(
"Exec",
"SQL Error: %d %s",
ret, sqlite_err_msg);
184 sqlite3_free(sqlite_err_msg);
197 Error(
"SelectDataBase",
"SelectDataBase command makes no sense for SQLite!");
207 Error(
"GetDataBases",
"GetDataBases command makes no sense for SQLite!");
220 Error(
"GetTables",
"not connected");
224 TString sql =
"SELECT name FROM sqlite_master where type='table'";
226 sql +=
Form(
" AND name LIKE '%s'", wild);
244 Error(
"GetColumns",
"not connected");
249 Error(
"GetColumns",
"Not implementable for SQLite as a query with wildcard, use GetFieldNames() after SELECT instead!");
252 TString sql =
Form(
"PRAGMA table_info('%s')", table);
264 Error(
"GetTableInfo",
"not connected");
268 if (!tablename || (*tablename==0))
return nullptr;
272 if (columnRes ==
nullptr) {
273 Error(
"GetTableInfo",
"could not query columns");
277 TList* lst =
nullptr;
281 while ((columnRow = columnRes->
Next()) !=
nullptr) {
314 Error(
"CreateDataBase",
"CreateDataBase command makes no sense for SQLite!");
324 Error(
"DropDataBase",
"DropDataBase command makes no sense for SQLite!");
335 Error(
"Reload",
"not connected");
339 Error(
"Reload",
"not implemented");
350 Error(
"Shutdown",
"not connected");
354 Error(
"Shutdown",
"not implemented");
375 SetError(-1,
"no query string specified",
"Statement");
380 Error(
"Statement",
"not connected");
384 sqlite3_stmt *preparedStmt =
nullptr;
385 const char *tail =
nullptr;
388#if SQLITE_VERSION_NUMBER >= 3005000
389 int retVal = sqlite3_prepare_v2(
fSQLite, sql, -1, &preparedStmt, &tail);
391 int retVal = sqlite3_prepare(
fSQLite, sql, -1, &preparedStmt, &tail);
393 if (retVal != SQLITE_OK) {
394 Error(
"Statement",
"SQL Error: %d %s", retVal, sqlite3_errmsg(
fSQLite));
397 if (tail && tail[0] !=
'\0')
398 Warning(
"Statement",
"Don't use multiple statements, '%s' statement was ignored", tail);
402 stmt->
fRes = preparedStmt;
413 Error(
"ServerInfo",
"not connected");
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
const char Option_t
Option string (const char).
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void Add(TObject *obj) override
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual TSQLRow * Next()=0
virtual const char * GetField(Int_t field)=0
void SetError(Int_t code, const char *msg, const char *method=nullptr)
set new values for error fields if method is specified, displays error message
virtual Bool_t IsConnected() const
Int_t SelectDataBase(const char *dbname) final
Select a database.
TSQLStatement * Statement(const char *sql, Int_t=100) final
Produce TSQLiteStatement.
Bool_t HasStatement() const final
We assume prepared statements work for all SQLite-versions.
Int_t DropDataBase(const char *dbname) final
Drop (i.e.
TSQLResult * GetTables(const char *dbname, const char *wild=nullptr) final
List all tables in the specified database.
Bool_t Commit() final
submit "COMMIT TRANSACTION" query to database return kTRUE, if successful
TSQLResult * Query(const char *sql) final
Execute SQL command.
Bool_t HasTransactionInFlight() final
returns kTRUE when transaction is running
const char * ServerInfo() final
Return server info, must be deleted by user.
Bool_t Rollback() final
submit "ROLLBACK TRANSACTION" query to database return kTRUE, if successful
TSQLResult * GetColumns(const char *dbname, const char *table, const char *wild=nullptr) final
List all columns in specified table (database argument is ignored).
Int_t Shutdown() final
Shutdown the database server.
Bool_t Exec(const char *sql) final
Execute SQL command which does not produce any result sets.
Int_t Reload() final
Reload permission tables.
TSQLResult * GetDataBases(const char *wild=nullptr) final
List all available databases.
Int_t CreateDataBase(const char *dbname) final
Create a database.
~TSQLiteServer()
Close SQLite DB.
void Close(Option_t *opt="") final
Close connection to SQLite DB.
TSQLiteServer(const char *db, const char *uid=nullptr, const char *pw=nullptr)
Open a connection to an SQLite DB server.
Bool_t StartTransaction() final
submit "BEGIN TRANSACTION" query to database return kTRUE, if successful
TSQLTableInfo * GetTableInfo(const char *tablename) final
Produces SQL table info.
const char * Data() const