// ======================================================================== // METHOD ::decode // ======================================================================== void dbfile::decode (const string &outof, value &v) { value tmp; string l, r; v.clear (); switch (encoding) { case shox: v.fromshox (outof); break; case attriblist: // fallthrough to valuelist case valuelist: v = strutil::splitquoted (outof, sep); break; case courierdb: tmp = strutil::split (outof, '|'); foreach (word, tmp) { r = word; l = r.cutat ('='); v[l] = r; } break; default: v = outof; break; }
bool sqlitehandle::query (const string &sql, value &into, const statstring &indexby) { sqlite3_stmt *qhandle; int qres; int rowcount=0; int colcount; int i; statstring curidx; bool done = false; into.clear (); if (sqlite3_prepare (hdl, sql.str(), sql.strlen(), &qhandle, 0) != SQLITE_OK) { errcode = 1; errstr = "Could not prepare: %s" %format (sqlite3_errmsg(hdl)); return false; } if (! (qres = sqlite3_step (qhandle))) { errcode = 1; errstr = "Error making first step: %s" %format (sqlite3_errmsg(hdl)); sqlite3_finalize (qhandle); return false; } colcount = sqlite3_column_count (qhandle); if (colcount == 0) { into("rowschanged") = sqlite3_changes (hdl); sqlite3_finalize (qhandle); return true; } statstring colnames[colcount]; value colidx; for (i=0; i<colcount; ++i) { colnames[i] = sqlite3_column_name (qhandle, i); colidx[colnames[i]] = i; } int indexfield = -1; if (colidx.exists (indexby)) indexfield = colidx[indexby]; if (! done) do { switch (qres) { case SQLITE_BUSY: sleep (1); sqlite3_reset(qhandle); continue; case SQLITE_MISUSE: // achtung, fallthrough case SQLITE_ERROR: errcode = 1; errstr = "Error in sqlite3_step: %s" %format (sqlite3_errmsg(hdl)); done = true; break; case SQLITE_DONE: done = true; break; case SQLITE_ROW: { if (indexfield>=0) { curidx = sqlite3_column_text (qhandle, indexfield); } value &myrow = (indexfield<0) ? into.newval() : into[curidx]; for (int i=0; i<colcount; i++) { int ctype = sqlite3_column_type (qhandle, i); statstring &curcol = colnames[i]; switch (ctype) { case SQLITE_INTEGER: myrow[curcol] = sqlite3_column_int (qhandle, i); break; case SQLITE_FLOAT: myrow[curcol] = sqlite3_column_double (qhandle, i); break; case SQLITE_BLOB: // FIXME: use sqlite3_column_blob case SQLITE_TEXT: myrow[curcol] = sqlite3_column_text (qhandle, i); break; default: break; } } } break; } rowcount++; } while ((qres = sqlite3_step (qhandle)) && !done); int finalize_result = sqlite3_finalize (qhandle); if (finalize_result != SQLITE_OK && finalize_result != SQLITE_SCHEMA) { errcode = 1; errstr = "Error finalizing: %s" %format (sqlite3_errmsg(hdl)); return false; } into ("insertid") = sqlite3_last_insert_rowid (hdl); into.type (t_dict); string tmp = into.tojson(); return true; }