25 #include <csutil/scf.h> 26 #include <csutil/scf_implementation.h> 27 #include <csutil/threading/thread.h> 29 #include "iutil/comp.h" 35 #include <csutil/csstring.h> 41 struct iObjectRegistry;
45 #ifdef USE_DELAY_QUERY 46 #define THREADED_BUFFER_SIZE 300 47 class DelayedQueryManager :
public CS::Threading::Runnable
50 DelayedQueryManager(
const char *host,
unsigned int port,
const char *database,
51 const char *user,
const char *pwd);
54 void Push(csString query);
58 csString arr[THREADED_BUFFER_SIZE];
60 CS::Threading::Mutex mutex;
61 CS::Threading::RecursiveMutex mutexArray;
62 CS::Threading::Condition datacondition;
73 class psMysqlConnection :
public scfImplementation2<psMysqlConnection, iComponent, iDataConnection>
78 iObjectRegistry *objectReg;
84 psMysqlConnection(
iBase *iParent);
85 virtual ~psMysqlConnection();
88 bool Initialize(
const char *host,
unsigned int port,
const char *database,
89 const char *user,
const char *pwd,
LogCSV* logcsv);
98 void Escape(csString& to,
const char *from);
100 iResultSet *Select(
const char *sql,...);
101 int SelectSingleNumber(
const char *sql, ...);
102 unsigned long Command(
const char *sql,...);
103 unsigned long CommandPump(
const char *sql,...);
105 uint64 GenericInsertWithID(
const char *table,
const char **fieldnames,
psStringArray& fieldvalues);
106 bool GenericUpdateWithID(
const char *table,
const char *idfield,
const char *
id,
const char **fieldnames,
psStringArray& fieldvalues);
107 bool GenericUpdateWithID(
const char *table,
const char *idfield,
const char *
id,
psStringArray& fields);
109 const char *GetLastError(
void);
110 const char *GetLastQuery(
void)
114 uint64 GetLastInsertID();
116 const char *uint64tostring(uint64 value,csString& recv);
118 virtual const char* DumpProfile();
119 virtual void ResetProfile();
121 iRecord* NewUpdatePreparedStatement(
const char* table,
const char* idfield,
unsigned int count,
const char* file,
unsigned int line);
122 iRecord* NewInsertPreparedStatement(
const char* table,
unsigned int count,
const char* file,
unsigned int line);
124 #ifdef USE_DELAY_QUERY 125 csRef<DelayedQueryManager> dqm;
126 csRef<Thread> dqmThread;
131 class psResultRow :
public iResultRow
145 void SetMaxFields(
int fields) { max = fields; };
146 void SetResultSet(
void* resultsettoken);
150 const char *operator[](
int whichfield);
151 const char *operator[](
const char *fieldname);
153 const char* GetString(
int whichfield);
154 const char* GetString(
const char *fieldname);
156 int GetInt(
int whichfield);
157 int GetInt(
const char *fieldname);
159 unsigned long GetUInt32(
int whichfield);
160 unsigned long GetUInt32(
const char *fieldname);
162 float GetFloat(
int whichfield);
163 float GetFloat(
const char *fieldname);
165 uint64 GetUInt64(
int whichfield);
166 uint64 GetUInt64(
const char *fieldname);
168 uint64 stringtouint64(
const char *stringbuf);
169 const char *uint64tostring(uint64 value,
char *stringbuf,
int buflen);
172 class psResultSet :
public iResultSet
176 unsigned long rows, fields, current;
180 psResultSet(
char **result,
int rows,
int columns);
181 virtual ~psResultSet();
183 void Release(
void) {
delete this; };
185 iResultRow& operator[](
unsigned long whichrow);
187 unsigned long Count(
void) {
return rows; };
190 class dbRecord :
public iRecord
193 enum FIELDTYPE { SQL_TYPE_FLOAT, SQL_TYPE_INT, SQL_TYPE_STRING, SQL_TYPE_NULL };
222 virtual void AddToStatement(
const char* fname) = 0;
224 virtual void SetID(uint32 uid) = 0;
227 dbRecord(sqlite3*
db,
const char* Table,
const char* Idfield,
unsigned int count,
LogCSV* logcsv,
const char* file,
unsigned int line)
232 temp =
new StatField[count];
235 this->logcsv = logcsv;
245 sqlite3_finalize(stmt);
258 void AddField(
const char* fname,
float fValue);
260 void AddField(
const char* fname,
int iValue);
262 void AddField(
const char* fname,
unsigned int uiValue);
264 void AddField(
const char* fname,
unsigned short usValue);
266 void AddField(
const char* fname,
const char* sValue);
268 void AddFieldNull(
const char* fname);
270 virtual bool Prepare() = 0;
272 virtual bool Execute(uint32 uid);
275 class dbInsert :
public dbRecord
277 virtual void AddToStatement(
const char* fname)
283 virtual void SetID(uint32 ) { };
286 dbInsert(sqlite3*
db,
const char* Table,
unsigned int count,
LogCSV* logcsv,
const char* file,
unsigned int line)
287 : dbRecord(db, Table,
"", count, logcsv, file, line) { }
289 virtual bool Prepare();
292 class dbUpdate :
public dbRecord
294 virtual void AddToStatement(
const char* fname)
297 command.FormatPush(
"%s = ?", fname);
300 virtual void SetID(uint32 uid)
302 temp[index].iValue = uid;
303 temp[index].type = SQL_TYPE_INT;
307 dbUpdate(sqlite3*
db,
const char* Table,
const char* Idfield,
unsigned int count,
LogCSV* logcsv,
const char* file,
unsigned int line)
308 : dbRecord(db, Table, Idfield, count, logcsv, file, line) { }
309 virtual bool Prepare();
312 } CS_PLUGIN_NAMESPACE_END(dbsqlite3)
iDataConnection * db
Global connection to the Database. Set from the psDatabase class.
CS_PLUGIN_NAMESPACE_BEGIN(dbmysql)
Statistics of time consumed by SQL statements.
void void Initialize(iObjectRegistry *object_reg)
A slightly improved version of csStringArray, sporting the handy FormatPush method.