20 ClassImp(TSQLiteServer);
31 TSQLiteServer::TSQLiteServer(
const char *db,
const char* ,
const char* )
35 fSrvInfo += sqlite3_libversion();
37 if (strncmp(db,
"sqlite://", 9)) {
38 TString givenProtocol(db, 9);
39 Error(
"TSQLiteServer",
"protocol in db argument should be sqlite it is %s",
40 givenProtocol.Data());
45 const char *dbase = db + 9;
47 #ifndef SQLITE_OPEN_URI
48 #define SQLITE_OPEN_URI 0x00000000
50 #if SQLITE_VERSION_NUMBER >= 3005000
51 Int_t error = sqlite3_open_v2(dbase, &fSQLite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI, NULL);
53 Int_t error = sqlite3_open(dbase, &fSQLite);
64 Error(
"TSQLiteServer",
"opening of %s failed with error: %d %s", dbase, sqlite3_errcode(fSQLite), sqlite3_errmsg(fSQLite));
65 sqlite3_close(fSQLite);
74 TSQLiteServer::~TSQLiteServer()
77 sqlite3_close(fSQLite);
84 void TSQLiteServer::Close(Option_t *)
91 sqlite3_close(fSQLite);
102 Bool_t TSQLiteServer::StartTransaction()
104 return Exec(
"BEGIN TRANSACTION");
112 TSQLResult *TSQLiteServer::Query(
const char *sql)
114 if (!IsConnected()) {
115 Error(
"Query",
"not connected");
119 sqlite3_stmt *preparedStmt = NULL;
123 #if SQLITE_VERSION_NUMBER >= 3005000
124 int retVal = sqlite3_prepare_v2(fSQLite, sql, -1, &preparedStmt, NULL);
126 int retVal = sqlite3_prepare(fSQLite, sql, -1, &preparedStmt, NULL);
128 if (retVal != SQLITE_OK) {
129 Error(
"Query",
"SQL Error: %d %s", retVal, sqlite3_errmsg(fSQLite));
133 return new TSQLiteResult(preparedStmt);
140 Bool_t TSQLiteServer::Exec(
const char *sql)
142 if (!IsConnected()) {
143 Error(
"Exec",
"not connected");
147 char *sqlite_err_msg;
148 int ret = sqlite3_exec(fSQLite, sql, NULL, NULL, &sqlite_err_msg);
149 if (ret != SQLITE_OK) {
150 Error(
"Exec",
"SQL Error: %d %s", ret, sqlite_err_msg);
151 sqlite3_free(sqlite_err_msg);
162 Int_t TSQLiteServer::SelectDataBase(
const char* )
164 Error(
"SelectDataBase",
"SelectDataBase command makes no sense for SQLite!");
172 TSQLResult *TSQLiteServer::GetDataBases(
const char* )
174 Error(
"GetDataBases",
"GetDataBases command makes no sense for SQLite!");
184 TSQLResult *TSQLiteServer::GetTables(
const char* ,
const char *wild)
186 if (!IsConnected()) {
187 Error(
"GetTables",
"not connected");
191 TString sql =
"SELECT name FROM sqlite_master where type='table'";
193 sql += Form(
" AND name LIKE '%s'", wild);
207 TSQLResult *TSQLiteServer::GetColumns(
const char* ,
const char* table,
210 if (!IsConnected()) {
211 Error(
"GetColumns",
"not connected");
216 Error(
"GetColumns",
"Not implementable for SQLite as a query with wildcard, use GetFieldNames() after SELECT instead!");
219 TString sql = Form(
"PRAGMA table_info('%s')", table);
228 TSQLTableInfo *TSQLiteServer::GetTableInfo(
const char* tablename)
230 if (!IsConnected()) {
231 Error(
"GetTableInfo",
"not connected");
235 if ((tablename==0) || (*tablename==0))
return 0;
237 TSQLResult *columnRes = GetColumns(
"", tablename);
239 if (columnRes == NULL) {
240 Error(
"GetTableInfo",
"could not query columns");
248 while ((columnRow = columnRes->Next()) != NULL) {
254 Bool_t isNullable = (strcmp(columnRow->GetField(3),
"0") == 0);
256 lst->Add(
new TSQLColumnInfo(columnRow->GetField(1),
257 columnRow->GetField(2),
269 TSQLTableInfo* info =
new TSQLTableInfo(tablename,
279 Int_t TSQLiteServer::CreateDataBase(
const char* )
281 Error(
"CreateDataBase",
"CreateDataBase command makes no sense for SQLite!");
289 Int_t TSQLiteServer::DropDataBase(
const char* )
291 Error(
"DropDataBase",
"DropDataBase command makes no sense for SQLite!");
299 Int_t TSQLiteServer::Reload()
301 if (!IsConnected()) {
302 Error(
"Reload",
"not connected");
306 Error(
"Reload",
"not implemented");
314 Int_t TSQLiteServer::Shutdown()
316 if (!IsConnected()) {
317 Error(
"Shutdown",
"not connected");
321 Error(
"Shutdown",
"not implemented");
331 Bool_t TSQLiteServer::HasStatement()
const
339 TSQLStatement* TSQLiteServer::Statement(
const char *sql, Int_t)
342 SetError(-1,
"no query string specified",
"Statement");
346 if (!IsConnected()) {
347 Error(
"Statement",
"not connected");
351 sqlite3_stmt *preparedStmt = NULL;
355 #if SQLITE_VERSION_NUMBER >= 3005000
356 int retVal = sqlite3_prepare_v2(fSQLite, sql, -1, &preparedStmt, NULL);
358 int retVal = sqlite3_prepare(fSQLite, sql, -1, &preparedStmt, NULL);
360 if (retVal != SQLITE_OK) {
361 Error(
"Statement",
"SQL Error: %d %s", retVal, sqlite3_errmsg(fSQLite));
365 SQLite3_Stmt_t *stmt =
new SQLite3_Stmt_t;
366 stmt->fConn = fSQLite;
367 stmt->fRes = preparedStmt;
369 return new TSQLiteStatement(stmt);
375 const char *TSQLiteServer::ServerInfo()
377 if (!IsConnected()) {
378 Error(
"ServerInfo",
"not connected");
382 return fSrvInfo.Data();