6a831e2f99
enabled ssl support in windows for plugins. updated jabber plugin. tweaked downloading logic in an effort to end the madness. Updated sql code to support sleeping the qc thread until query completion, as a more readable alternative to callbacks. Client updates should be more explicit now, removing a potential bug. networked terrain editing should now be in a better state. updated the dir command to show paths too (so when the same file is listed twice, the pak its in will at least be different). Many files changed because of this. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4273 fc73d0e0-1445-4013-8a0c-d673dee63da5
119 lines
4.4 KiB
C
119 lines
4.4 KiB
C
#ifndef SV_SQL_H
|
|
#define SV_SQL_H
|
|
|
|
#ifdef USE_MYSQL
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
#include <mysql/mysql.h>
|
|
#endif
|
|
|
|
#define SQL_CONNECT_STRUCTPARAMS 2
|
|
#define SQL_CONNECT_PARAMS 4
|
|
|
|
typedef enum
|
|
{
|
|
SQLDRV_MYSQL,
|
|
SQLDRV_SQLITE, /* NOT IN YET */
|
|
SQLDRV_INVALID
|
|
} sqldrv_t;
|
|
|
|
typedef struct queryrequest_s
|
|
{
|
|
int srvid;
|
|
int num; /* query number reference */
|
|
struct queryrequest_s *nextqueue; /* next request in queue */
|
|
struct queryrequest_s *nextreq; /* next request in queue */
|
|
struct queryresult_s *results; /* chain of received results */
|
|
enum
|
|
{
|
|
SR_NEW,
|
|
SR_PENDING,
|
|
SR_PARTIAL, //
|
|
SR_FINISHED, //waiting for close
|
|
SR_ABORTED //don't notify. destroy on finish.
|
|
} state; //maintained by main thread. worker *may* check for aborted state as a way to quickly generate an error.
|
|
qboolean (*callback)(struct queryrequest_s *req, int firstrow, int numrows, int numcols, qboolean eof); /* called on main thread once complete */
|
|
struct
|
|
{
|
|
qboolean persistant; /* persistant query */
|
|
int qccallback; /* callback function reference */
|
|
int selfent; /* self entity on call */
|
|
float selfid; /* self entity id on call */
|
|
int otherent; /* other entity on call */
|
|
float otherid; /* other entity id on call */
|
|
void *thread;
|
|
} user; /* sql code does not write anything in this struct */
|
|
char query[1]; /* query to run */
|
|
} queryrequest_t;
|
|
|
|
typedef struct queryresult_s
|
|
{
|
|
struct queryrequest_s *request; /* corresponding request */
|
|
struct queryresult_s *next; /* next result in queue */
|
|
int rows; /* rows contained in single result set */
|
|
int firstrow; /* 0 on first result block */
|
|
int columns; /* fields */
|
|
qboolean eof; /* end of query reached */
|
|
void *result; /* result set from mysql */
|
|
#if 0
|
|
char **resultset; /* stored result set from partial fetch */
|
|
#endif
|
|
char error[1]; /* error string, "" if none */
|
|
} queryresult_t;
|
|
|
|
typedef struct sqlserver_s
|
|
{
|
|
void *thread; /* worker thread for server */
|
|
sqldrv_t driver; /* driver type */
|
|
#ifdef USE_MYSQL
|
|
MYSQL *mysql; /* mysql server */
|
|
#endif
|
|
#ifdef USE_SQLITE
|
|
struct sqlite3 *sqlite;
|
|
#endif
|
|
volatile qboolean active; /* set to false to kill thread */
|
|
volatile qboolean terminated; /* set by the worker to say that it won't block (for long) and can be joined */
|
|
void *requestcondv; /* lock and conditional variable for queue read/write */
|
|
void *resultlock; /* mutex for queue read/write */
|
|
int querynum; /* next reference number for queries */
|
|
queryrequest_t *requests; /* list of pending and persistant requests */
|
|
queryrequest_t *requestqueue; /* query requests queue */
|
|
queryrequest_t *requestslast; /* query requests queue last link */
|
|
queryresult_t *results; /* query results queue */
|
|
queryresult_t *resultslast; /* query results queue last link */
|
|
queryresult_t *serverresult; /* most recent (orphaned) server error result */
|
|
char **connectparams; /* connect parameters (0 = host, 1 = user, 2 = pass, 3 = defaultdb) */
|
|
} sqlserver_t;
|
|
|
|
/* prototypes */
|
|
void SQL_Init(void);
|
|
void SQL_KillServers(void);
|
|
void SQL_DeInit(void);
|
|
|
|
sqlserver_t *SQL_GetServer (int serveridx, qboolean inactives);
|
|
queryrequest_t *SQL_GetQueryRequest (sqlserver_t *server, int queryidx);
|
|
queryresult_t *SQL_GetQueryResult (sqlserver_t *server, int queryidx, int row);
|
|
//void SQL_DeallocResult(sqlserver_t *server, queryresult_t *qres);
|
|
void SQL_ClosePersistantResult(sqlserver_t *server, queryresult_t *qres);
|
|
void SQL_CloseResult(sqlserver_t *server, queryresult_t *qres);
|
|
void SQL_CloseRequest(sqlserver_t *server, queryrequest_t *qres, qboolean force);
|
|
void SQL_CloseAllResults(sqlserver_t *server);
|
|
char *SQL_ReadField (sqlserver_t *server, queryresult_t *qres, int row, int col, qboolean fields);
|
|
int SQL_NewServer(char *driver, char **paramstr);
|
|
int SQL_NewQuery(sqlserver_t *server, qboolean (*callback)(queryrequest_t *req, int firstrow, int numrows, int numcols, qboolean eof), char *str, queryrequest_t **reqout); //callback will be called on the main thread once the result is back
|
|
void SQL_Disconnect(sqlserver_t *server);
|
|
void SQL_Escape(sqlserver_t *server, char *src, char *dst, int dstlen);
|
|
const char *SQL_Info(sqlserver_t *server);
|
|
qboolean SQL_Available(void);
|
|
void SQL_ServerCycle (void);
|
|
|
|
extern cvar_t sql_driver;
|
|
extern cvar_t sql_host;
|
|
extern cvar_t sql_username;
|
|
extern cvar_t sql_password;
|
|
extern cvar_t sql_defaultdb;
|
|
|
|
#define SQLCVAROPTIONS "SQL Defaults"
|
|
|
|
#endif
|