⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sql_mysql.c

📁 打魔兽战网的都知道他是什么
💻 C
字号:
/* * Copyright (C) 2002,2003 Dizzy  * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#ifdef WITH_SQL_MYSQL#include "common/setup_before.h"#ifdef WIN32#include <windows.h>#include <mysql/mysql.h>#else#include <mysql.h>#endif#include <stdlib.h>#include "common/eventlog.h"#include "common/xalloc.h"#include "storage_sql.h"#include "sql_mysql.h"#include "common/setup_after.h"static int sql_mysql_init(const char *, const char *, const char *, const char *, const char *, const char *);static int sql_mysql_close(void);static t_sql_res * sql_mysql_query_res(const char *);static int sql_mysql_query(const char *);static t_sql_row * sql_mysql_fetch_row(t_sql_res *);static void sql_mysql_free_result(t_sql_res *);static unsigned int sql_mysql_num_rows(t_sql_res *);static unsigned int sql_mysql_num_fields(t_sql_res *);static unsigned int sql_mysql_affected_rows(void);static t_sql_field * sql_mysql_fetch_fields(t_sql_res *);static int sql_mysql_free_fields(t_sql_field *);static void sql_mysql_escape_string(char *, const char *, int);t_sql_engine sql_mysql = {    sql_mysql_init,    sql_mysql_close,    sql_mysql_query_res,    sql_mysql_query,    sql_mysql_fetch_row,    sql_mysql_free_result,    sql_mysql_num_rows,    sql_mysql_num_fields,    sql_mysql_affected_rows,    sql_mysql_fetch_fields,    sql_mysql_free_fields,    sql_mysql_escape_string};static MYSQL *mysql = NULL;#ifndef RUNTIME_LIBS#define p_mysql_affected_rows		mysql_affected_rows#define p_mysql_close			mysql_close#define p_mysql_error			mysql_error#define p_mysql_fetch_fields		mysql_fetch_fields#define p_mysql_fetch_row		mysql_fetch_row#define p_mysql_free_result		mysql_free_result#define p_mysql_init			mysql_init#define p_mysql_num_fields		mysql_num_fields#define p_mysql_num_rows		mysql_num_rows#define p_mysql_query			mysql_query#define p_mysql_real_connect		mysql_real_connect#define p_mysql_real_escape_string	mysql_real_escape_string#define p_mysql_store_result		mysql_store_result#else/* RUNTIME_LIBS */static int mysql_load_dll(void);typedef my_ulonglong	(STDCALL *f_mysql_affected_rows		)(MYSQL*);typedef void		(STDCALL *f_mysql_close			)(MYSQL*);typedef const char*	(STDCALL *f_mysql_error			)(MYSQL*);typedef MYSQL_FIELD*	(STDCALL *f_mysql_fetch_fields		)(MYSQL_RES*);typedef MYSQL_ROW	(STDCALL *f_mysql_fetch_row		)(MYSQL_RES*);typedef my_bool		(STDCALL *f_mysql_free_result		)(MYSQL_RES*);typedef MYSQL*		(STDCALL *f_mysql_init			)(MYSQL*);typedef unsigned int	(STDCALL *f_mysql_num_fields		)(MYSQL_RES*);typedef my_ulonglong	(STDCALL *f_mysql_num_rows		)(MYSQL_RES*);typedef int		(STDCALL *f_mysql_query			)(MYSQL*,const char*);typedef MYSQL*		(STDCALL *f_mysql_real_connect		)(MYSQL*,const char*,const char*,const char*,const char*,unsigned int,const char*,unsigned long);typedef unsigned long	(STDCALL *f_mysql_real_escape_string	)(MYSQL*,char*,const char*,unsigned long);typedef MYSQL_RES*	(STDCALL *f_mysql_store_result		)(MYSQL*);static f_mysql_affected_rows		p_mysql_affected_rows;static f_mysql_close			p_mysql_close;static f_mysql_error			p_mysql_error;static f_mysql_fetch_fields		p_mysql_fetch_fields;static f_mysql_fetch_row		p_mysql_fetch_row;static f_mysql_free_result		p_mysql_free_result;static f_mysql_init			p_mysql_init;static f_mysql_num_fields		p_mysql_num_fields;static f_mysql_num_rows			p_mysql_num_rows;static f_mysql_query			p_mysql_query;static f_mysql_real_connect		p_mysql_real_connect;static f_mysql_real_escape_string	p_mysql_real_escape_string;static f_mysql_store_result		p_mysql_store_result;#include "compat/runtime_libs.h" /* defines OpenLibrary(), GetFunction(), CloseLibrary() & MYSQL_LIB */static void * handle = NULL;static int mysql_load_dll(void){	if ((handle = OpenLibrary(MYSQL_LIB)) == NULL) return -1;		if (	((p_mysql_affected_rows		= (f_mysql_affected_rows)	GetFunction(handle, "mysql_affected_rows"))	== NULL) ||		((p_mysql_close			= (f_mysql_close)		GetFunction(handle, "mysql_close"))		== NULL) ||		((p_mysql_error			= (f_mysql_error)		GetFunction(handle, "mysql_error"))		== NULL) ||		((p_mysql_fetch_fields		= (f_mysql_fetch_fields)	GetFunction(handle, "mysql_fetch_fields"))	== NULL) ||		((p_mysql_fetch_row		= (f_mysql_fetch_row)		GetFunction(handle, "mysql_fetch_row"))		== NULL) ||		((p_mysql_free_result		= (f_mysql_free_result)		GetFunction(handle, "mysql_free_result"))	== NULL) ||		((p_mysql_init			= (f_mysql_init)		GetFunction(handle, "mysql_init"))		== NULL) ||		((p_mysql_num_fields		= (f_mysql_num_fields)		GetFunction(handle, "mysql_num_fields"))	== NULL) ||		((p_mysql_num_rows		= (f_mysql_num_rows)		GetFunction(handle, "mysql_num_rows"))		== NULL) ||		((p_mysql_query			= (f_mysql_query)		GetFunction(handle, "mysql_query"))		== NULL) ||		((p_mysql_real_connect		= (f_mysql_real_connect)	GetFunction(handle, "mysql_real_connect"))	== NULL) ||		((p_mysql_real_escape_string	= (f_mysql_real_escape_string)	GetFunction(handle, "mysql_real_escape_string"))== NULL) ||		((p_mysql_store_result		= (f_mysql_store_result)	GetFunction(handle, "mysql_store_result"))	== NULL) )	{		CloseLibrary(handle);		handle = NULL;		return -1;	}				return 0;}#endif /* RUNTIME_LIBS */static int sql_mysql_init(const char *host, const char *port, const char *socket, const char *name, const char *user, const char *pass){    if (name == NULL || user == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "got NULL parameter");        return -1;    }#ifdef RUNTIME_LIBS    if (mysql_load_dll()) {	eventlog(eventlog_level_error, __FUNCTION__, "error loading library file \"%s\"", MYSQL_LIB);	return -1;    }#endif    if ((mysql = p_mysql_init(NULL)) == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "got error from mysql_init");        return -1;    }    if (p_mysql_real_connect(mysql, host, user, pass, name, port ? atoi(port) : 0, socket, CLIENT_FOUND_ROWS) == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", p_mysql_error(mysql));	p_mysql_close(mysql);        return -1;    }        /* allows identifers (specificly column names) to be quoted using double quotes (") in addition to ticks (`) */    sql_mysql_query("SET sql_mode='ANSI_QUOTES'");    return 0;}static int sql_mysql_close(void){    if (mysql) {	p_mysql_close(mysql);	mysql = NULL;    }#ifdef RUNTIME_LIBS    if (handle) {	CloseLibrary(handle);	handle = NULL;    }#endif    return 0;}static t_sql_res * sql_mysql_query_res(const char * query){    t_sql_res *res;    if (mysql == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "mysql driver not initilized");        return NULL;    }    if (query == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "got NULL query");        return NULL;    }    if (p_mysql_query(mysql, query)) {//        eventlog(eventlog_level_debug, __FUNCTION__, "got error from query (%s)", query);	return NULL;    }    res = p_mysql_store_result(mysql);    if (res == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "got error from store result");        return NULL;    }    return res;}static int sql_mysql_query(const char * query){    if (mysql == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "mysql driver not initilized");        return -1;    }    if (query == NULL) {        eventlog(eventlog_level_error, __FUNCTION__, "got NULL query");        return -1;    }    return p_mysql_query(mysql, query) == 0 ? 0 : -1;}static t_sql_row * sql_mysql_fetch_row(t_sql_res *result){    if (result == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL result");	return NULL;    }    return p_mysql_fetch_row((MYSQL_RES *)result);}static void sql_mysql_free_result(t_sql_res *result){    if (result == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL result");	return;    }    p_mysql_free_result((MYSQL_RES *)result);}static unsigned int sql_mysql_num_rows(t_sql_res *result){    if (result == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL result");	return 0;    }    return p_mysql_num_rows((MYSQL_RES *)result);}static unsigned int sql_mysql_num_fields(t_sql_res *result){    if (result == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL result");	return 0;    }    return p_mysql_num_fields((MYSQL_RES *)result);}static unsigned int sql_mysql_affected_rows(void){    return p_mysql_affected_rows(mysql);}static t_sql_field * sql_mysql_fetch_fields(t_sql_res *result){    MYSQL_FIELD *fields;    unsigned fieldno, i;    t_sql_field *rfields;    if (result == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL result");	return NULL;    }    fieldno = p_mysql_num_fields((MYSQL_RES *)result);    fields = p_mysql_fetch_fields((MYSQL_RES *)result);    rfields = xmalloc(sizeof(t_sql_field) * (fieldno + 1));    for(i = 0; i < fieldno; i++)	rfields[i] = fields[i].name;    rfields[i] = NULL;    return rfields;}static int sql_mysql_free_fields(t_sql_field *fields){    if (fields == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL fields");	return -1;    }    xfree((void*)fields);    return 0; /* mysql_free_result() should free the rest properly */}static void sql_mysql_escape_string(char *escape, const char *from, int len){    if (mysql == NULL) {	eventlog(eventlog_level_error, __FUNCTION__, "mysql driver not initilized");	return;    }    p_mysql_real_escape_string(mysql, escape, from, len);}#endif /* WITH_SQL_MYSQL */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -