c4d3497054
PF_VarString can now shortcircuit, directly returning the first argument (which also bypasses related length limitations). this required const correctness fixes. r_showshaders cvar reports the wall texture being pointed at. improve dp compat in a number of areas, should now mostly be able to run xonotic 0.8.2, but will need some more extra cvars/defaults/stuff. fix q3bsp loader race condition. fix dpm loader multi-surface issue. remove limit on stringbuffer count. don't poll xinput (because its disturbingly slow), instead wait for some window message before re-checking. fixed splitscreen saved games. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5140 fc73d0e0-1445-4013-8a0c-d673dee63da5
126 lines
4.5 KiB
C
126 lines
4.5 KiB
C
#ifndef SV_SQL_H
|
|
#define SV_SQL_H
|
|
|
|
#ifdef USE_MYSQL
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
#include <mysql/mysql.h>
|
|
#endif
|
|
#ifdef USE_SQLITE
|
|
typedef struct
|
|
{
|
|
char *ptr;
|
|
int len;
|
|
} sqliteresult_t;
|
|
#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, size_t *resultsize);
|
|
int SQL_NewServer(const char *driver, const char **paramstr);
|
|
int SQL_NewQuery(sqlserver_t *server, qboolean (*callback)(queryrequest_t *req, int firstrow, int numrows, int numcols, qboolean eof), const 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, const 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
|