28 ClassImp(TSQLiteStatement);
34 TSQLiteStatement::TSQLiteStatement(SQLite3_Stmt_t* stmt, Bool_t errout):
35 TSQLStatement(errout),
41 unsigned long bindParamcount = sqlite3_bind_parameter_count(fStmt->fRes);
43 if (bindParamcount > 0) {
45 fNumPars = bindParamcount;
48 fNumPars = sqlite3_column_count(fStmt->fRes);
55 TSQLiteStatement::~TSQLiteStatement()
63 void TSQLiteStatement::Close(Option_t *)
66 sqlite3_finalize(fStmt->fRes);
76 #define CheckStmt(method, res) \
80 SetError(-1,"Statement handle is 0",method); \
85 #define CheckErrNo(method, force, res) \
87 int stmterrno = sqlite3_errcode(fStmt->fConn); \
88 if ((stmterrno!=0) || force) { \
89 const char* stmterrmsg = sqlite3_errmsg(fStmt->fConn); \
90 if (stmterrno==0) { stmterrno = -1; stmterrmsg = "SQLite statement error"; } \
91 SetError(stmterrno, stmterrmsg, method); \
96 #define CheckGetField(method, res) \
99 if (!IsResultSetMode()) { \
100 SetError(-1,"Cannot get statement parameters",method); \
103 if ((npar<0) || (npar>=fNumPars)) { \
104 SetError(-1,Form("Invalid parameter number %d", npar),method); \
110 Bool_t TSQLiteStatement::CheckBindError(
const char *method,
int res)
112 if (res == SQLITE_RANGE) {
113 SetError(-1, Form(
"SQLite parameter out of bounds, error: %d %s", res, sqlite3_errmsg(fStmt->fConn)), method);
116 if (res != SQLITE_OK) {
117 SetError(-1, Form(
"SQLite error code during parameter binding, error: %d %s", res, sqlite3_errmsg(fStmt->fConn)), method);
126 Bool_t TSQLiteStatement::Process()
128 CheckStmt(
"Process", kFALSE);
130 int res = sqlite3_step(fStmt->fRes);
131 if ((res != SQLITE_DONE) && (res != SQLITE_ROW)) {
132 SetError(-1, Form(
"SQLite error code during statement-stepping: %d %s", res, sqlite3_errmsg(fStmt->fConn)),
"Process");
138 if (res == SQLITE_DONE) {
139 sqlite3_reset(fStmt->fRes);
142 if (IsResultSetMode()) {
147 if (IsSetParsMode()) {
152 if (res == SQLITE_ROW) {
165 Int_t TSQLiteStatement::GetNumAffectedRows()
167 CheckStmt(
"GetNumAffectedRows", kFALSE);
169 return (Int_t) sqlite3_changes(fStmt->fConn);
175 Int_t TSQLiteStatement::GetNumParameters()
177 CheckStmt(
"GetNumParameters", -1);
179 Int_t res = sqlite3_bind_parameter_count(fStmt->fRes);
181 CheckErrNo(
"GetNumParameters", kFALSE, -1);
191 Bool_t TSQLiteStatement::StoreResult()
195 CheckStmt(
"StoreResult", kFALSE);
203 Int_t TSQLiteStatement::GetNumFields()
211 const char* TSQLiteStatement::GetFieldName(Int_t nfield)
213 if (!IsResultSetMode() || (nfield < 0) || (nfield >= sqlite3_column_count(fStmt->fRes))) {
217 return sqlite3_column_name(fStmt->fRes, nfield);
223 Bool_t TSQLiteStatement::NextResultRow()
227 if ((fStmt == 0) || !IsResultSetMode())
return kFALSE;
229 if (fIterationCount == 0) {
246 Bool_t TSQLiteStatement::NextIteration()
250 if (!IsSetParsMode()) {
251 SetError(-1,
"Cannot call for that statement",
"NextIteration");
255 if (fIterationCount == 0) {
271 const char* TSQLiteStatement::ConvertToString(Int_t npar)
273 CheckGetField(
"ConvertToString",
"");
275 return reinterpret_cast<const char *
>(sqlite3_column_text(fStmt->fRes, npar));
281 long double TSQLiteStatement::ConvertToNumeric(Int_t npar)
283 CheckGetField(
"ConvertToNumeric", -1);
285 return (
long double) sqlite3_column_double(fStmt->fRes, npar);
291 Bool_t TSQLiteStatement::IsNull(Int_t npar)
293 CheckGetField(
"IsNull", kFALSE);
295 return (sqlite3_column_type(fStmt->fRes, npar) == SQLITE_NULL);
301 Int_t TSQLiteStatement::GetInt(Int_t npar)
303 CheckGetField(
"GetInt", -1);
305 return (Int_t) sqlite3_column_int(fStmt->fRes, npar);
311 UInt_t TSQLiteStatement::GetUInt(Int_t npar)
313 CheckGetField(
"GetUInt", 0);
315 return (UInt_t) sqlite3_column_int(fStmt->fRes, npar);
321 Long_t TSQLiteStatement::GetLong(Int_t npar)
323 CheckGetField(
"GetLong", -1);
325 return (Long_t) sqlite3_column_int64(fStmt->fRes, npar);
331 Long64_t TSQLiteStatement::GetLong64(Int_t npar)
333 CheckGetField(
"GetLong64", -1);
335 return (Long64_t) sqlite3_column_int64(fStmt->fRes, npar);
341 ULong64_t TSQLiteStatement::GetULong64(Int_t npar)
343 CheckGetField(
"GetULong64", 0);
345 return (ULong64_t) sqlite3_column_int64(fStmt->fRes, npar);
351 Double_t TSQLiteStatement::GetDouble(Int_t npar)
353 CheckGetField(
"GetDouble", -1);
355 return (Double_t) sqlite3_column_double(fStmt->fRes, npar);
361 const char *TSQLiteStatement::GetString(Int_t npar)
363 CheckGetField(
"GetString",
"");
365 return reinterpret_cast<const char *
>(sqlite3_column_text(fStmt->fRes, npar));
373 Bool_t TSQLiteStatement::GetBinary(Int_t npar,
void* &mem, Long_t& size)
375 CheckGetField(
"GetBinary", kFALSE);
380 size_t sz = sqlite3_column_bytes(fStmt->fRes, npar);
381 if ((Long_t)sz > size) {
382 delete [](
unsigned char*) mem;
383 mem = (
void*)
new unsigned char[sz];
387 memcpy(mem, sqlite3_column_blob(fStmt->fRes, npar), sz);
395 Bool_t TSQLiteStatement::GetDate(Int_t npar, Int_t& year, Int_t& month, Int_t& day)
397 CheckGetField(
"GetDate", kFALSE);
399 TString val =
reinterpret_cast<const char*
>(sqlite3_column_text(fStmt->fRes, npar));
400 TDatime d = TDatime(val.Data());
402 month = d.GetMonth();
411 Bool_t TSQLiteStatement::GetTime(Int_t npar, Int_t& hour, Int_t& min, Int_t& sec)
413 CheckGetField(
"GetTime", kFALSE);
415 TString val =
reinterpret_cast<const char*
>(sqlite3_column_text(fStmt->fRes, npar));
416 TDatime d = TDatime(val.Data());
427 Bool_t TSQLiteStatement::GetDatime(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec)
429 CheckGetField(
"GetDatime", kFALSE);
431 TString val =
reinterpret_cast<const char*
>(sqlite3_column_text(fStmt->fRes, npar));
432 TDatime d = TDatime(val.Data());
434 month = d.GetMonth();
447 Bool_t TSQLiteStatement::GetTimestamp(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec, Int_t& frac)
449 CheckGetField(
"GetTimestamp", kFALSE);
451 TString val =
reinterpret_cast<const char*
>(sqlite3_column_text(fStmt->fRes, npar));
453 Ssiz_t p = val.Last(
'.');
454 TSubString ts_part = val(0, p);
456 TDatime d(ts_part.Data());
458 month = d.GetMonth();
464 TSubString s_frac = val(p, val.Length() - p+1);
465 frac=(Int_t) (atof(s_frac.Data())*1.E3);
473 Bool_t TSQLiteStatement::SetNull(Int_t npar)
475 int res = sqlite3_bind_null(fStmt->fRes, npar + 1);
477 return CheckBindError(
"SetNull", res);
483 Bool_t TSQLiteStatement::SetInt(Int_t npar, Int_t value)
485 int res = sqlite3_bind_int(fStmt->fRes, npar + 1, value);
487 return CheckBindError(
"SetInt", res);
494 Bool_t TSQLiteStatement::SetUInt(Int_t npar, UInt_t value)
496 int res = sqlite3_bind_int(fStmt->fRes, npar + 1, (Int_t)value);
498 return CheckBindError(
"SetUInt", res);
504 Bool_t TSQLiteStatement::SetLong(Int_t npar, Long_t value)
506 int res = sqlite3_bind_int64(fStmt->fRes, npar + 1, value);
508 return CheckBindError(
"SetLong", res);
514 Bool_t TSQLiteStatement::SetLong64(Int_t npar, Long64_t value)
516 int res = sqlite3_bind_int64(fStmt->fRes, npar + 1, value);
518 return CheckBindError(
"SetLong64", res);
525 Bool_t TSQLiteStatement::SetULong64(Int_t npar, ULong64_t value)
527 int res = sqlite3_bind_int64(fStmt->fRes, npar + 1, (Long64_t)value);
529 return CheckBindError(
"SetULong64", res);
535 Bool_t TSQLiteStatement::SetDouble(Int_t npar, Double_t value)
537 int res = sqlite3_bind_double(fStmt->fRes, npar + 1, value);
539 return CheckBindError(
"SetDouble", res);
545 Bool_t TSQLiteStatement::SetString(Int_t npar,
const char* value, Int_t maxsize)
547 int res = sqlite3_bind_text(fStmt->fRes, npar + 1, value, maxsize, SQLITE_TRANSIENT);
549 return CheckBindError(
"SetString", res);
557 Bool_t TSQLiteStatement::SetBinary(Int_t npar,
void* mem, Long_t size, Long_t )
560 SetError(-1,
"Passing negative value to size for BLOB to SQLite would cause undefined behaviour, refusing it!",
"SetBinary");
564 int res = sqlite3_bind_blob(fStmt->fRes, npar + 1, mem, (
size_t)size, SQLITE_TRANSIENT);
566 return CheckBindError(
"SetBinary", res);
572 Bool_t TSQLiteStatement::SetDate(Int_t npar, Int_t year, Int_t month, Int_t day)
574 TDatime d = TDatime(year, month, day, 0, 0, 0);
575 int res = sqlite3_bind_text(fStmt->fRes, npar + 1, (
char*)d.AsSQLString(), -1, SQLITE_TRANSIENT);
577 return CheckBindError(
"SetDate", res);
583 Bool_t TSQLiteStatement::SetTime(Int_t npar, Int_t hour, Int_t min, Int_t sec)
585 TDatime d = TDatime(2000, 1, 1, hour, min, sec);
587 int res = sqlite3_bind_text(fStmt->fRes, npar + 1, (
char*)d.AsSQLString(), -1, SQLITE_TRANSIENT);
589 return CheckBindError(
"SetTime", res);
595 Bool_t TSQLiteStatement::SetDatime(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec)
597 TDatime d = TDatime(year, month, day, hour, min, sec);
599 int res = sqlite3_bind_text(fStmt->fRes, npar + 1, (
char*)d.AsSQLString(), -1, SQLITE_TRANSIENT);
601 return CheckBindError(
"SetDatime", res);
609 Bool_t TSQLiteStatement::SetTimestamp(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec, Int_t frac)
611 TDatime d(year,month,day,hour,min,sec);
613 value.Form(
"%s.%03d", (
char*)d.AsSQLString(), frac);
615 int res = sqlite3_bind_text(fStmt->fRes, npar + 1, value.Data(), -1, SQLITE_TRANSIENT);
617 return CheckBindError(
"SetTimestamp", res);