ROOT logo
// @(#)root/sqlite:$Id$
// Author: o.freyermuth <o.f@cern.ch>, 01/06/2013

/*************************************************************************
 * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TSQLiteServer.h"
#include "TSQLiteResult.h"
#include "TSQLiteStatement.h"
#include "TSQLColumnInfo.h"
#include "TList.h"
#include "TSQLTableInfo.h"
#include "TSQLRow.h"

ClassImp(TSQLiteServer)

//______________________________________________________________________________
TSQLiteServer::TSQLiteServer(const char *db, const char* /*uid*/, const char* /*pw*/)
{
   // Open a connection to an SQLite DB server. The db arguments should be
   // of the form "sqlite://<database>", e.g.:
   // "sqlite://test.sqlite" or "sqlite://:memory:" for a temporary database
   // in memory.
   // Note that for SQLite versions >= 3.7.7 the full string behind
   // "sqlite://" is handed to sqlite3_open_v2() with SQLITE_OPEN_URI activated,
   // so all URI accepted by it can be used.

   fSQLite = NULL;
   fSrvInfo = "SQLite ";
   fSrvInfo += sqlite3_libversion();

   if (strncmp(db, "sqlite://", 9)) {
      TString givenProtocol(db, 9); // this TString-constructor allocs len+1 and does \0 termination already.
      Error("TSQLiteServer", "protocol in db argument should be sqlite it is %s",
            givenProtocol.Data());
      MakeZombie();
      return;
   }

   const char *dbase = db + 9;

#ifndef SQLITE_OPEN_URI
#define SQLITE_OPEN_URI 0x00000000
#endif
#if SQLITE_VERSION_NUMBER >= 3005000
   Int_t error = sqlite3_open_v2(dbase, &fSQLite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI, NULL);
#else
   Int_t error = sqlite3_open(dbase, &fSQLite);
#endif

   if (error == 0) {
      // Set members of the abstract interface
      fType = "SQLite";
      fHost = "";
      fDB = dbase;
      // fPort != -1 means we are 'connected'
      fPort = 0;
   } else {
      Error("TSQLiteServer", "opening of %s failed with error: %d %s", dbase, sqlite3_errcode(fSQLite), sqlite3_errmsg(fSQLite));
      sqlite3_close(fSQLite);
      MakeZombie();
   }

}

//______________________________________________________________________________
TSQLiteServer::~TSQLiteServer()
{
   // Close SQLite DB.

   if (IsConnected()) {
      sqlite3_close(fSQLite);
   }
}

//______________________________________________________________________________
void TSQLiteServer::Close(Option_t *)
{
   // Close connection to SQLite DB.

   if (!fSQLite) {
      return;
   }

   if (IsConnected()) {
      sqlite3_close(fSQLite);
      // Mark as disconnected:
      fPort = -1;
      fSQLite = NULL;
   }
}

//______________________________________________________________________________
Bool_t TSQLiteServer::StartTransaction()
{
   // submit "START TRANSACTION" query to database
   // return kTRUE, if successful

   return Exec("BEGIN TRANSACTION");
}

//______________________________________________________________________________
TSQLResult *TSQLiteServer::Query(const char *sql)
{
   // Execute SQL command. Result object must be deleted by the user.
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("Query", "not connected");
      return 0;
   }

   sqlite3_stmt *preparedStmt = NULL;

   // -1 as we read until we encounter a \0.
   // NULL because we do not check which char was read last.
#if SQLITE_VERSION_NUMBER >= 3005000
   int retVal = sqlite3_prepare_v2(fSQLite, sql, -1, &preparedStmt, NULL);
#else
   int retVal = sqlite3_prepare(fSQLite, sql, -1, &preparedStmt, NULL);
#endif
   if (retVal != SQLITE_OK) {
      Error("Query", "SQL Error: %d %s", retVal, sqlite3_errmsg(fSQLite));
      return 0;
   }

   return new TSQLiteResult(preparedStmt);
}

//______________________________________________________________________________
Bool_t TSQLiteServer::Exec(const char *sql)
{
   // Execute SQL command which does not produce any result sets.
   // Returns kTRUE if successful.

   if (!IsConnected()) {
      Error("Exec", "not connected");
      return kFALSE;
   }

   char *sqlite_err_msg;
   int ret = sqlite3_exec(fSQLite, sql, NULL, NULL, &sqlite_err_msg);
   if (ret != SQLITE_OK) {
      Error("Exec", "SQL Error: %d %s", ret, sqlite_err_msg);
      sqlite3_free(sqlite_err_msg);
      return kFALSE;
   }
   return kTRUE;
}


//______________________________________________________________________________
Int_t TSQLiteServer::SelectDataBase(const char* /*dbname*/)
{
   // Select a database. Always returns non-zero for SQLite,
   // as only one DB exists per file.

   Error("SelectDataBase", "SelectDataBase command makes no sense for SQLite!");
   return -1;
}

//______________________________________________________________________________
TSQLResult *TSQLiteServer::GetDataBases(const char* /*wild*/)
{
   // List all available databases. Always returns 0 for SQLite,
   // as only one DB exists per file.

   Error("GetDataBases", "GetDataBases command makes no sense for SQLite!");
   return 0;
}

//______________________________________________________________________________
TSQLResult *TSQLiteServer::GetTables(const char* /*dbname*/, const char *wild)
{
   // List all tables in the specified database. Wild is for wildcarding
   // "t%" list all tables starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("GetTables", "not connected");
      return 0;
   }

   TString sql = "SELECT name FROM sqlite_master where type='table'";
   if (wild)
      sql += Form(" AND name LIKE '%s'", wild);

   return Query(sql);
}

//______________________________________________________________________________
TSQLResult *TSQLiteServer::GetColumns(const char* /*dbname*/, const char* table,
      const char* wild)
{
   // List all columns in specified table (database argument is ignored).
   // Wild is for wildcarding "t%" list all columns starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.
   // For SQLite, this fails with wildcard, as the column names are not queryable!
   // If no wildcard is used, the result of PRAGMA table_info(table) is returned,
   // which contains the names in field 1.

   if (!IsConnected()) {
      Error("GetColumns", "not connected");
      return 0;
   }

   if (wild) {
      Error("GetColumns", "Not implementable for SQLite as a query with wildcard, use GetFieldNames() after SELECT instead!");
      return NULL;
   } else {
      TString sql = Form("PRAGMA table_info('%s')", table);
      return Query(sql);
   }
}

//______________________________________________________________________________
TSQLTableInfo *TSQLiteServer::GetTableInfo(const char* tablename)
{
   // Produces SQL table info.
   // Object must be deleted by user.

   if (!IsConnected()) {
      Error("GetTableInfo", "not connected");
      return 0;
   }

   if ((tablename==0) || (*tablename==0)) return 0;

   TSQLResult *columnRes = GetColumns("", tablename);

   if (columnRes == NULL) {
      Error("GetTableInfo", "could not query columns");
      return NULL;
   }

   TList* lst = NULL;

   TSQLRow *columnRow;

   while ((columnRow = columnRes->Next()) != NULL) {
      if (lst == NULL) {
         lst = new TList();
      }

      // Field 3 is 'notnull', i.e. if it is 0, column is nullable
      Bool_t isNullable = (strcmp(columnRow->GetField(3), "0") == 0);

      lst->Add(new TSQLColumnInfo(columnRow->GetField(1), // column name
                                  columnRow->GetField(2), // column type name
                                  isNullable,  // isNullable defined above
                                  -1,   // SQLite is totally free about types
                                  -1,   // SQLite imposes no declarable size-limits
                                  -1,   // Field length only available querying the field
                                  -1,   // no data scale in SQLite
                                  -1)); // SQLite does not enforce any sign(s)
      delete columnRow;
   }
   delete columnRes;

   // lst == NULL is ok as TSQLTableInfo accepts and handles this
   TSQLTableInfo*  info = new TSQLTableInfo(tablename,
                                            lst);

   return info;
}

//______________________________________________________________________________
Int_t TSQLiteServer::CreateDataBase(const char* /*dbname*/)
{
   // Create a database. Always returns non-zero for SQLite,
   // as it has only one DB per file.

   Error("CreateDataBase", "CreateDataBase command makes no sense for SQLite!");
   return -1;
}

//______________________________________________________________________________
Int_t TSQLiteServer::DropDataBase(const char* /*dbname*/)
{
   // Drop (i.e. delete) a database. Always returns non-zero for SQLite,
   // as it has only one DB per file.

   Error("DropDataBase", "DropDataBase command makes no sense for SQLite!");
   return -1;
}

//______________________________________________________________________________
Int_t TSQLiteServer::Reload()
{
   // Reload permission tables. Returns 0 if successful, non-zero
   // otherwise. User must have reload permissions.

   if (!IsConnected()) {
      Error("Reload", "not connected");
      return -1;
   }

   Error("Reload", "not implemented");
   return 0;
}

//______________________________________________________________________________
Int_t TSQLiteServer::Shutdown()
{
   // Shutdown the database server. Returns 0 if successful, non-zero
   // otherwise. Makes no sense for SQLite, always returns -1.

   if (!IsConnected()) {
      Error("Shutdown", "not connected");
      return -1;
   }

   Error("Shutdown", "not implemented");
   return -1;
}

//______________________________________________________________________________
Bool_t TSQLiteServer::HasStatement() const
{
   // We assume prepared statements work for all SQLite-versions.
   // As we actually use the recommended sqlite3_prepare(),
   // or, if possible, sqlite3_prepare_v2(),
   // this already introduces the "compile time check".

   return kTRUE;
}

//______________________________________________________________________________
TSQLStatement* TSQLiteServer::Statement(const char *sql, Int_t)
{
   // Produce TSQLiteStatement.

   if (!sql || !*sql) {
      SetError(-1, "no query string specified", "Statement");
      return 0;
   }

   if (!IsConnected()) {
      Error("Statement", "not connected");
      return 0;
   }

   sqlite3_stmt *preparedStmt = NULL;

   // -1 as we read until we encounter a \0.
   // NULL because we do not check which char was read last.
#if SQLITE_VERSION_NUMBER >= 3005000
   int retVal = sqlite3_prepare_v2(fSQLite, sql, -1, &preparedStmt, NULL);
#else
   int retVal = sqlite3_prepare(fSQLite, sql, -1, &preparedStmt, NULL);
#endif
   if (retVal != SQLITE_OK) {
      Error("Statement", "SQL Error: %d %s", retVal, sqlite3_errmsg(fSQLite));
      return 0;
   }

   SQLite3_Stmt_t *stmt = new SQLite3_Stmt_t;
   stmt->fConn = fSQLite;
   stmt->fRes  = preparedStmt;

   return new TSQLiteStatement(stmt);
}

//______________________________________________________________________________
const char *TSQLiteServer::ServerInfo()
{
   // Return server info, must be deleted by user.

   if (!IsConnected()) {
      Error("ServerInfo", "not connected");
      return 0;
   }

   return fSrvInfo.Data();
}
 TSQLiteServer.cxx:1
 TSQLiteServer.cxx:2
 TSQLiteServer.cxx:3
 TSQLiteServer.cxx:4
 TSQLiteServer.cxx:5
 TSQLiteServer.cxx:6
 TSQLiteServer.cxx:7
 TSQLiteServer.cxx:8
 TSQLiteServer.cxx:9
 TSQLiteServer.cxx:10
 TSQLiteServer.cxx:11
 TSQLiteServer.cxx:12
 TSQLiteServer.cxx:13
 TSQLiteServer.cxx:14
 TSQLiteServer.cxx:15
 TSQLiteServer.cxx:16
 TSQLiteServer.cxx:17
 TSQLiteServer.cxx:18
 TSQLiteServer.cxx:19
 TSQLiteServer.cxx:20
 TSQLiteServer.cxx:21
 TSQLiteServer.cxx:22
 TSQLiteServer.cxx:23
 TSQLiteServer.cxx:24
 TSQLiteServer.cxx:25
 TSQLiteServer.cxx:26
 TSQLiteServer.cxx:27
 TSQLiteServer.cxx:28
 TSQLiteServer.cxx:29
 TSQLiteServer.cxx:30
 TSQLiteServer.cxx:31
 TSQLiteServer.cxx:32
 TSQLiteServer.cxx:33
 TSQLiteServer.cxx:34
 TSQLiteServer.cxx:35
 TSQLiteServer.cxx:36
 TSQLiteServer.cxx:37
 TSQLiteServer.cxx:38
 TSQLiteServer.cxx:39
 TSQLiteServer.cxx:40
 TSQLiteServer.cxx:41
 TSQLiteServer.cxx:42
 TSQLiteServer.cxx:43
 TSQLiteServer.cxx:44
 TSQLiteServer.cxx:45
 TSQLiteServer.cxx:46
 TSQLiteServer.cxx:47
 TSQLiteServer.cxx:48
 TSQLiteServer.cxx:49
 TSQLiteServer.cxx:50
 TSQLiteServer.cxx:51
 TSQLiteServer.cxx:52
 TSQLiteServer.cxx:53
 TSQLiteServer.cxx:54
 TSQLiteServer.cxx:55
 TSQLiteServer.cxx:56
 TSQLiteServer.cxx:57
 TSQLiteServer.cxx:58
 TSQLiteServer.cxx:59
 TSQLiteServer.cxx:60
 TSQLiteServer.cxx:61
 TSQLiteServer.cxx:62
 TSQLiteServer.cxx:63
 TSQLiteServer.cxx:64
 TSQLiteServer.cxx:65
 TSQLiteServer.cxx:66
 TSQLiteServer.cxx:67
 TSQLiteServer.cxx:68
 TSQLiteServer.cxx:69
 TSQLiteServer.cxx:70
 TSQLiteServer.cxx:71
 TSQLiteServer.cxx:72
 TSQLiteServer.cxx:73
 TSQLiteServer.cxx:74
 TSQLiteServer.cxx:75
 TSQLiteServer.cxx:76
 TSQLiteServer.cxx:77
 TSQLiteServer.cxx:78
 TSQLiteServer.cxx:79
 TSQLiteServer.cxx:80
 TSQLiteServer.cxx:81
 TSQLiteServer.cxx:82
 TSQLiteServer.cxx:83
 TSQLiteServer.cxx:84
 TSQLiteServer.cxx:85
 TSQLiteServer.cxx:86
 TSQLiteServer.cxx:87
 TSQLiteServer.cxx:88
 TSQLiteServer.cxx:89
 TSQLiteServer.cxx:90
 TSQLiteServer.cxx:91
 TSQLiteServer.cxx:92
 TSQLiteServer.cxx:93
 TSQLiteServer.cxx:94
 TSQLiteServer.cxx:95
 TSQLiteServer.cxx:96
 TSQLiteServer.cxx:97
 TSQLiteServer.cxx:98
 TSQLiteServer.cxx:99
 TSQLiteServer.cxx:100
 TSQLiteServer.cxx:101
 TSQLiteServer.cxx:102
 TSQLiteServer.cxx:103
 TSQLiteServer.cxx:104
 TSQLiteServer.cxx:105
 TSQLiteServer.cxx:106
 TSQLiteServer.cxx:107
 TSQLiteServer.cxx:108
 TSQLiteServer.cxx:109
 TSQLiteServer.cxx:110
 TSQLiteServer.cxx:111
 TSQLiteServer.cxx:112
 TSQLiteServer.cxx:113
 TSQLiteServer.cxx:114
 TSQLiteServer.cxx:115
 TSQLiteServer.cxx:116
 TSQLiteServer.cxx:117
 TSQLiteServer.cxx:118
 TSQLiteServer.cxx:119
 TSQLiteServer.cxx:120
 TSQLiteServer.cxx:121
 TSQLiteServer.cxx:122
 TSQLiteServer.cxx:123
 TSQLiteServer.cxx:124
 TSQLiteServer.cxx:125
 TSQLiteServer.cxx:126
 TSQLiteServer.cxx:127
 TSQLiteServer.cxx:128
 TSQLiteServer.cxx:129
 TSQLiteServer.cxx:130
 TSQLiteServer.cxx:131
 TSQLiteServer.cxx:132
 TSQLiteServer.cxx:133
 TSQLiteServer.cxx:134
 TSQLiteServer.cxx:135
 TSQLiteServer.cxx:136
 TSQLiteServer.cxx:137
 TSQLiteServer.cxx:138
 TSQLiteServer.cxx:139
 TSQLiteServer.cxx:140
 TSQLiteServer.cxx:141
 TSQLiteServer.cxx:142
 TSQLiteServer.cxx:143
 TSQLiteServer.cxx:144
 TSQLiteServer.cxx:145
 TSQLiteServer.cxx:146
 TSQLiteServer.cxx:147
 TSQLiteServer.cxx:148
 TSQLiteServer.cxx:149
 TSQLiteServer.cxx:150
 TSQLiteServer.cxx:151
 TSQLiteServer.cxx:152
 TSQLiteServer.cxx:153
 TSQLiteServer.cxx:154
 TSQLiteServer.cxx:155
 TSQLiteServer.cxx:156
 TSQLiteServer.cxx:157
 TSQLiteServer.cxx:158
 TSQLiteServer.cxx:159
 TSQLiteServer.cxx:160
 TSQLiteServer.cxx:161
 TSQLiteServer.cxx:162
 TSQLiteServer.cxx:163
 TSQLiteServer.cxx:164
 TSQLiteServer.cxx:165
 TSQLiteServer.cxx:166
 TSQLiteServer.cxx:167
 TSQLiteServer.cxx:168
 TSQLiteServer.cxx:169
 TSQLiteServer.cxx:170
 TSQLiteServer.cxx:171
 TSQLiteServer.cxx:172
 TSQLiteServer.cxx:173
 TSQLiteServer.cxx:174
 TSQLiteServer.cxx:175
 TSQLiteServer.cxx:176
 TSQLiteServer.cxx:177
 TSQLiteServer.cxx:178
 TSQLiteServer.cxx:179
 TSQLiteServer.cxx:180
 TSQLiteServer.cxx:181
 TSQLiteServer.cxx:182
 TSQLiteServer.cxx:183
 TSQLiteServer.cxx:184
 TSQLiteServer.cxx:185
 TSQLiteServer.cxx:186
 TSQLiteServer.cxx:187
 TSQLiteServer.cxx:188
 TSQLiteServer.cxx:189
 TSQLiteServer.cxx:190
 TSQLiteServer.cxx:191
 TSQLiteServer.cxx:192
 TSQLiteServer.cxx:193
 TSQLiteServer.cxx:194
 TSQLiteServer.cxx:195
 TSQLiteServer.cxx:196
 TSQLiteServer.cxx:197
 TSQLiteServer.cxx:198
 TSQLiteServer.cxx:199
 TSQLiteServer.cxx:200
 TSQLiteServer.cxx:201
 TSQLiteServer.cxx:202
 TSQLiteServer.cxx:203
 TSQLiteServer.cxx:204
 TSQLiteServer.cxx:205
 TSQLiteServer.cxx:206
 TSQLiteServer.cxx:207
 TSQLiteServer.cxx:208
 TSQLiteServer.cxx:209
 TSQLiteServer.cxx:210
 TSQLiteServer.cxx:211
 TSQLiteServer.cxx:212
 TSQLiteServer.cxx:213
 TSQLiteServer.cxx:214
 TSQLiteServer.cxx:215
 TSQLiteServer.cxx:216
 TSQLiteServer.cxx:217
 TSQLiteServer.cxx:218
 TSQLiteServer.cxx:219
 TSQLiteServer.cxx:220
 TSQLiteServer.cxx:221
 TSQLiteServer.cxx:222
 TSQLiteServer.cxx:223
 TSQLiteServer.cxx:224
 TSQLiteServer.cxx:225
 TSQLiteServer.cxx:226
 TSQLiteServer.cxx:227
 TSQLiteServer.cxx:228
 TSQLiteServer.cxx:229
 TSQLiteServer.cxx:230
 TSQLiteServer.cxx:231
 TSQLiteServer.cxx:232
 TSQLiteServer.cxx:233
 TSQLiteServer.cxx:234
 TSQLiteServer.cxx:235
 TSQLiteServer.cxx:236
 TSQLiteServer.cxx:237
 TSQLiteServer.cxx:238
 TSQLiteServer.cxx:239
 TSQLiteServer.cxx:240
 TSQLiteServer.cxx:241
 TSQLiteServer.cxx:242
 TSQLiteServer.cxx:243
 TSQLiteServer.cxx:244
 TSQLiteServer.cxx:245
 TSQLiteServer.cxx:246
 TSQLiteServer.cxx:247
 TSQLiteServer.cxx:248
 TSQLiteServer.cxx:249
 TSQLiteServer.cxx:250
 TSQLiteServer.cxx:251
 TSQLiteServer.cxx:252
 TSQLiteServer.cxx:253
 TSQLiteServer.cxx:254
 TSQLiteServer.cxx:255
 TSQLiteServer.cxx:256
 TSQLiteServer.cxx:257
 TSQLiteServer.cxx:258
 TSQLiteServer.cxx:259
 TSQLiteServer.cxx:260
 TSQLiteServer.cxx:261
 TSQLiteServer.cxx:262
 TSQLiteServer.cxx:263
 TSQLiteServer.cxx:264
 TSQLiteServer.cxx:265
 TSQLiteServer.cxx:266
 TSQLiteServer.cxx:267
 TSQLiteServer.cxx:268
 TSQLiteServer.cxx:269
 TSQLiteServer.cxx:270
 TSQLiteServer.cxx:271
 TSQLiteServer.cxx:272
 TSQLiteServer.cxx:273
 TSQLiteServer.cxx:274
 TSQLiteServer.cxx:275
 TSQLiteServer.cxx:276
 TSQLiteServer.cxx:277
 TSQLiteServer.cxx:278
 TSQLiteServer.cxx:279
 TSQLiteServer.cxx:280
 TSQLiteServer.cxx:281
 TSQLiteServer.cxx:282
 TSQLiteServer.cxx:283
 TSQLiteServer.cxx:284
 TSQLiteServer.cxx:285
 TSQLiteServer.cxx:286
 TSQLiteServer.cxx:287
 TSQLiteServer.cxx:288
 TSQLiteServer.cxx:289
 TSQLiteServer.cxx:290
 TSQLiteServer.cxx:291
 TSQLiteServer.cxx:292
 TSQLiteServer.cxx:293
 TSQLiteServer.cxx:294
 TSQLiteServer.cxx:295
 TSQLiteServer.cxx:296
 TSQLiteServer.cxx:297
 TSQLiteServer.cxx:298
 TSQLiteServer.cxx:299
 TSQLiteServer.cxx:300
 TSQLiteServer.cxx:301
 TSQLiteServer.cxx:302
 TSQLiteServer.cxx:303
 TSQLiteServer.cxx:304
 TSQLiteServer.cxx:305
 TSQLiteServer.cxx:306
 TSQLiteServer.cxx:307
 TSQLiteServer.cxx:308
 TSQLiteServer.cxx:309
 TSQLiteServer.cxx:310
 TSQLiteServer.cxx:311
 TSQLiteServer.cxx:312
 TSQLiteServer.cxx:313
 TSQLiteServer.cxx:314
 TSQLiteServer.cxx:315
 TSQLiteServer.cxx:316
 TSQLiteServer.cxx:317
 TSQLiteServer.cxx:318
 TSQLiteServer.cxx:319
 TSQLiteServer.cxx:320
 TSQLiteServer.cxx:321
 TSQLiteServer.cxx:322
 TSQLiteServer.cxx:323
 TSQLiteServer.cxx:324
 TSQLiteServer.cxx:325
 TSQLiteServer.cxx:326
 TSQLiteServer.cxx:327
 TSQLiteServer.cxx:328
 TSQLiteServer.cxx:329
 TSQLiteServer.cxx:330
 TSQLiteServer.cxx:331
 TSQLiteServer.cxx:332
 TSQLiteServer.cxx:333
 TSQLiteServer.cxx:334
 TSQLiteServer.cxx:335
 TSQLiteServer.cxx:336
 TSQLiteServer.cxx:337
 TSQLiteServer.cxx:338
 TSQLiteServer.cxx:339
 TSQLiteServer.cxx:340
 TSQLiteServer.cxx:341
 TSQLiteServer.cxx:342
 TSQLiteServer.cxx:343
 TSQLiteServer.cxx:344
 TSQLiteServer.cxx:345
 TSQLiteServer.cxx:346
 TSQLiteServer.cxx:347
 TSQLiteServer.cxx:348
 TSQLiteServer.cxx:349
 TSQLiteServer.cxx:350
 TSQLiteServer.cxx:351
 TSQLiteServer.cxx:352
 TSQLiteServer.cxx:353
 TSQLiteServer.cxx:354
 TSQLiteServer.cxx:355
 TSQLiteServer.cxx:356
 TSQLiteServer.cxx:357
 TSQLiteServer.cxx:358
 TSQLiteServer.cxx:359
 TSQLiteServer.cxx:360
 TSQLiteServer.cxx:361
 TSQLiteServer.cxx:362
 TSQLiteServer.cxx:363
 TSQLiteServer.cxx:364
 TSQLiteServer.cxx:365
 TSQLiteServer.cxx:366
 TSQLiteServer.cxx:367
 TSQLiteServer.cxx:368
 TSQLiteServer.cxx:369
 TSQLiteServer.cxx:370
 TSQLiteServer.cxx:371
 TSQLiteServer.cxx:372
 TSQLiteServer.cxx:373
 TSQLiteServer.cxx:374
 TSQLiteServer.cxx:375
 TSQLiteServer.cxx:376
 TSQLiteServer.cxx:377
 TSQLiteServer.cxx:378
 TSQLiteServer.cxx:379
 TSQLiteServer.cxx:380
 TSQLiteServer.cxx:381
 TSQLiteServer.cxx:382
 TSQLiteServer.cxx:383