Changeset 15602


Ignore:
Timestamp:
2008-05-20T16:19:54+12:00 (16 years ago)
Author:
mdewsnip
Message:

(Adding new DB support) Partly implemented the sqliteclass::getinfo() function, requiring the sqlgetarray() function to be added.

Location:
gsdl/trunk/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/lib/sqliteclass.cpp

    r15601 r15602  
    8080bool sqliteclass::getinfo(const text_t& key, infodbclass &info)
    8181{
    82   // !! TO IMPLEMENT
    83   return false;
     82  text_t sql_cmd = "SELECT value FROM table WHERE key=" + key;
     83
     84  vector<text_tmap> sql_results;
     85  if (!sqlgetarray(sql_cmd, sql_results) || sql_results.size() == 0)
     86  {
     87    return false;
     88  }
     89
     90  text_tmap sql_result = sql_results[0];
     91
     92  // !! TO FINISH
     93
     94  return true;
    8495}
    8596
     
    131142// sqlexec simply executes the given sql statement - it doesn't obtain a
    132143// result set - returns true if the sql statement was executed successfully
    133 // logerrors may be set to false to prevent this method from logging an
    134 // error if it fails - this is useful in some circumstances when we execute
    135 // an sql command specifically to see if it fails (e.g. when testing if a
    136 // table exists in the db)
    137 bool sqliteclass::sqlexec(const text_t &sql_cmd, bool logerrors)
     144bool sqliteclass::sqlexec(const text_t &sql_cmd)
    138145{
    139146  char *sql_cmd_cstr = sql_cmd.getcstr();
     
    157164  if (rv == SQLITE_OK) return true;
    158165
    159   if (logerrors)
    160   {
    161     outconvertclass text_t2ascii;
    162     (*logout) << text_t2ascii << "Error executing sql statement: " << sql_cmd << "\n";
    163   }
    164 
     166  // sqlite3_exec failed - return false
     167  outconvertclass text_t2ascii;
     168  (*logout) << text_t2ascii << "Error executing sql statement: " << sql_cmd << "\n";
     169  return false;
     170}
     171
     172
     173// callback functions for sqlgetarray
     174static int sqlgetarray_callback(void *res, int numcols, char **vals, char **columnnames)
     175{
     176  vector<text_tmap> *result = (vector<text_tmap>*) res;
     177  text_tmap row;
     178
     179  for (int i = 0; i < numcols; i++)
     180  {
     181    row[columnnames[i]] = "";
     182    // vals[i] will be NULL if set to a NULL db value
     183    if (vals[i])
     184    {
     185      row[columnnames[i]] = vals[i];     
     186    }
     187  }
     188
     189  result->push_back(row);
     190  return 0;
     191}
     192
     193
     194// sqlgetarray executes sql and returns the result set in result
     195bool sqliteclass::sqlgetarray(const text_t &sql_cmd, vector<text_tmap> &sql_results)
     196{
     197  char *sql_cmd_cstr = sql_cmd.getcstr();
     198  sql_results.erase(sql_results.begin(), sql_results.end());
     199
     200  int rv = 0;
     201  int tries = 0;
     202  while ((rv = sqlite3_exec(sqlitefile, sql_cmd_cstr, sqlgetarray_callback, &sql_results, NULL)) == SQLITE_BUSY)
     203  {
     204    sleep(1000);
     205    tries++;
     206    if (tries > SQLITE_MAX_RETRIES)
     207    {
     208      outconvertclass text_t2ascii;
     209      (*logout) << text_t2ascii << "max_retries exceeded for sql query: " << sql_cmd << "\n";
     210      break;
     211    }
     212  }
     213
     214  delete[] sql_cmd_cstr;
     215
     216  if (rv == SQLITE_OK) return true;
     217
     218  // sqlite3_exec failed - return empty result set
     219  outconvertclass text_t2ascii;
     220  (*logout) << text_t2ascii << "Error executing sql statement: " << sql_cmd << "\n";
    165221  return false;
    166222}
  • gsdl/trunk/lib/sqliteclass.h

    r15601 r15602  
    6565  sqlite3* sqlitefile;
    6666
    67   bool sqlexec(const text_t &sql_cmd, bool logerrors);
     67  bool sqlgetarray(const text_t &sql_cmd, vector<text_tmap> &sql_results);
     68  bool sqlexec(const text_t &sql_cmd);
    6869};
    6970
Note: See TracChangeset for help on using the changeset viewer.