1
0
Fork 0
forked from fte/fteqw
fteqw/engine/server/sv_sql.h
Spoike 8197e0875f Track areas properly, so we don't bug out when a client has multiple cameras in different areas.
Fix up r_ignoreentpvs 0 to check areas properly.
checkpvs builtin can no longer mess up area checks elsewhere.
Write out foo.db files for release builds, in the hopes of at least getting function names from release-build crashes.
Implement _skyroom worldspawn field, still needs a few tweaks though.
Try to fix android surface-related crashes, AGAIN.
Separate parsing of connect requests, in preparation for formal logins (and removal of the old ranking code).
A few tweaks to try to improve compatibility with q3 mods.


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5484 fc73d0e0-1445-4013-8a0c-d673dee63da5
2019-07-02 04:12:20 +00:00

126 lines
4.6 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 *owner);
void SQL_DeInit(void);
sqlserver_t *SQL_GetServer (void *owner, 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(void *owner, 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