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

📄 mysql.c

📁 适合于Unix/Linux下的一个持久数据库连接池
💻 C
📖 第 1 页 / 共 3 页
字号:
unsigned long mysql_get_server_version(MYSQL *mysql) {	debugFunction();	// A number that represents the MySQL server version in format:	// main_version*10000 + minor_version *100 + sub_version	// For example, 4.1.0 is returned as 40100.	#ifdef COMPAT_MYSQL_3		return 32358;	#endif	#ifdef COMPAT_MYSQL_4_0		return 40017;	#endif	#ifdef COMPAT_MYSQL_4_1		return 40101;	#endif	#ifdef COMPAT_MYSQL_5_0		return 50000;	#endif}my_bool	mysql_change_user(MYSQL *mysql, const char *user,				const char *password, const char *db) {	debugFunction();	if (!mysql->sqlrcon->rollback()) {		return false;	}	mysql_stmt_close(mysql->currentstmt);	delete mysql->sqlrcon;	return (mysql_real_connect(mysql,mysql->host,user,password,db,				mysql->port,mysql->unix_socket,0))?true:false;}const char *mysql_character_set_name(MYSQL *mysql) {	debugFunction();	return "latin1";}void mysql_debug(const char *debug) {	// don't do anything...}int mysql_dump_debug_info(MYSQL *mysql) {	debugFunction();	return unknownError(mysql);}int mysql_create_db(MYSQL *mysql, const char *db) {	debugFunction();	return unknownError(mysql);}int mysql_select_db(MYSQL *mysql, const char *db) {	debugFunction();	return unknownError(mysql);}int mysql_drop_db(MYSQL *mysql, const char *db) {	debugFunction();	return unknownError(mysql);}MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) {	debugFunction();	return NULL;}MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) {	debugFunction();	return NULL;}unsigned long mysql_escape_string(char *to, const char *from,					unsigned long length) {	debugFunction();	return mysql_real_escape_string(NULL,to,from,length);}char *mysql_odbc_escape_string(MYSQL *mysql, char *to,				unsigned long to_length,				const char *from,				unsigned long from_length,				void *param,				char *(*extend_buffer)					(void *, char *to,					unsigned long *length)) {	debugFunction();	// FIXME: implement this	return NULL;}void myodbc_remove_escape(MYSQL *mysql, char *name) {	debugFunction();	// FIXME: implement this}unsigned long mysql_real_escape_string(MYSQL *mysql, char *to,					const char *from,					unsigned long length) {	debugFunction();	if (mysql && charstring::compare(mysql->sqlrcon->identify(),"mysql")) {		rawbuffer::copy(to,from,length);		to[length]=(char)NULL;		return length;	}		unsigned long	fromindex=0;	unsigned long	toindex=0;	while (fromindex<length) {		if (from[fromindex]=='\'') {			to[toindex++]='\\';			to[toindex++]='\'';		} else if (from[fromindex]=='\"') {			to[toindex++]='\\';			to[toindex++]='"';		} else if (from[fromindex]=='\n') {			to[toindex++]='\\';			to[toindex++]='n';		} else if (from[fromindex]=='\r') {			to[toindex++]='\\';			to[toindex++]='r';		} else if (from[fromindex]=='\\') {			to[toindex++]='\\';			to[toindex++]='\\';		} else if (from[fromindex]==26) {			to[toindex++]='\\';			to[toindex++]='Z';		} else {			to[toindex++]=from[fromindex];		}		fromindex++;	}	to[toindex]=(char)NULL;	return toindex;}int mysql_query(MYSQL *mysql, const char *query) {	debugFunction();	return mysql_real_query(mysql,query,charstring::length(query));}int mysql_send_query(MYSQL *mysql, const char *query, unsigned int length) {	debugFunction();	// FIXME: looks like this sends a query in the background then returns	// so we can do something else in the foreground.	return mysql_real_query(mysql,query,length);}int mysql_read_query_result(MYSQL *mysql) {	debugFunction();	// FIXME: looks like this checks to see if a query sent with	// mysql_send_query has finished or not	return 0;}int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) {	debugFunction();	mysql->currentstmt=mysql_prepare(mysql,query,length);	return mysql_execute(mysql->currentstmt);}char *mysql_info(MYSQL *mysql) {	debugFunction();	return "";}my_ulonglong mysql_insert_id(MYSQL *mysql) {	debugFunction();	return 0;}MYSQL_RES *mysql_store_result(MYSQL *mysql) {	debugFunction();	return mysql->currentstmt->result;}MYSQL_RES *mysql_use_result(MYSQL *mysql) {	debugFunction();	return mysql_store_result(mysql);}void mysql_free_result(MYSQL_RES *result) {	debugFunction();	if (result) {		delete result->sqlrcur;		if (result->fields) {			delete[] result->fields;		}		delete result;	}}my_bool mysql_more_results(MYSQL *mysql) {	debugFunction();	return false;}int mysql_next_result(MYSQL *mysql) {	return -1;}MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table,						const char *wild) {	debugFunction();	// FIXME: implement this	return NULL;}unsigned int mysql_num_fields(MYSQL_RES *result) {	debugFunction();	return result->sqlrcur->colCount();}MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) {	debugFunction();	if (result->currentfield>=		(MYSQL_FIELD_OFFSET)result->sqlrcur->colCount()) {		return NULL;	}	return &result->fields[result->currentfield++];}MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) {	debugFunction();	result->currentfield=0;	return result->fields;}MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr) {	debugFunction();	if (fieldnr>(unsigned int)result->sqlrcur->colCount()) {		return NULL;	}	// FIXME: it's possible that we shouldn't increment the fieldnr here	result->currentfield=fieldnr+1;	return &result->fields[fieldnr];}unsigned long *mysql_fetch_lengths(MYSQL_RES *result) {	debugFunction();	return (unsigned long *)result->sqlrcur->				getRowLengths(result->previousrow);}unsigned int mysql_field_count(MYSQL *mysql) {	debugFunction();	return mysql_num_fields(mysql->currentstmt->result);}MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,					MYSQL_FIELD_OFFSET offset) {	debugFunction();	MYSQL_FIELD_OFFSET	oldoffset=result->currentfield;	result->currentfield=offset;	return oldoffset;}MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result) {	debugFunction();	return result->currentfield;}my_ulonglong mysql_num_rows(MYSQL_RES *result) {	debugFunction();	return result->sqlrcur->rowCount();}my_ulonglong mysql_affected_rows(MYSQL *mysql) {	debugFunction();	return mysql_stmt_affected_rows(mysql->currentstmt);}// FIXME: MYSQL_ROW_OFFSET is (or could be) smaller than my_ulonglongMYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset) {	debugFunction();	result->previousrow=result->currentrow;	result->currentrow=(my_ulonglong)offset;	return (MYSQL_ROW_OFFSET)result->previousrow;}// FIXME: MYSQL_ROW_OFFSET is (or could be) smaller than my_ulonglongMYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result) {	debugFunction();	return (MYSQL_ROW_OFFSET)result->currentrow;}void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset) {	debugFunction();	result->previousrow=result->currentrow;	result->currentrow=offset;}MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) {	debugFunction();	MYSQL_ROW	retval=		(MYSQL_ROW)result->sqlrcur->getRow(result->currentrow);	if (retval) {		result->previousrow=result->currentrow;		result->currentrow++;	}	return retval;}my_bool mysql_eof(MYSQL_RES *result) {	debugFunction();	my_ulonglong	rowcount=(my_ulonglong)result->sqlrcur->rowCount();	return (!rowcount || result->currentrow>=rowcount);}unsigned int mysql_warning_count(MYSQL *mysql) {	debugFunction();	return 0;}unsigned int mysql_errno(MYSQL *mysql) {	debugFunction();	if (mysql && mysql->currentstmt && mysql->currentstmt->result) {		return mysql->currentstmt->result->errorno;	}	return mysql->errorno;}const char *mysql_error(MYSQL *mysql) {	debugFunction();	const char	*err;	if (mysql && mysql->currentstmt && mysql->currentstmt->result &&					mysql->currentstmt->result->sqlrcur) {		err=mysql->currentstmt->result->sqlrcur->errorMessage();	} else {		err=mysql->error;	}	return (err)?err:"";}const char *mysql_sqlstate(MYSQL *mysql) {	debugFunction();	return "";}my_bool mysql_commit(MYSQL *mysql) {	debugFunction();	return mysql->sqlrcon->commit();}my_bool mysql_rollback(MYSQL *mysql) {	debugFunction();	return mysql->sqlrcon->rollback();}my_bool mysql_autocommit(MYSQL *mysql, my_bool mode) {	debugFunction();	return (mode)?mysql->sqlrcon->autoCommitOn():				mysql->sqlrcon->autoCommitOff();}MYSQL_STMT *mysql_prepare(MYSQL *mysql, const char *query,					unsigned long length) {	debugPrintf(query);	debugPrintf("\n");	MYSQL_STMT	*stmt=new MYSQL_STMT;	stmt->result=new MYSQL_RES;	stmt->result->sqlrcur=new sqlrcursor(mysql->sqlrcon);	stmt->result->sqlrcur->copyReferences();	stmt->result->errorno=0;	stmt->result->fields=NULL;	stmt->result->sqlrcur->prepareQuery(query,length);	return stmt;}my_bool mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind) {	debugFunction();	unsigned long	paramcount=mysql_param_count(stmt);	for (unsigned long i=0; i<paramcount; i++) {		char		*variable=charstring::parseNumber((uint32_t)i);		sqlrcursor	*cursor=stmt->result->sqlrcur;		switch (bind[i].buffer_type) {			case MYSQL_TYPE_NULL: {				cursor->inputBind(variable,(char *)NULL);				break;			}			case MYSQL_TYPE_VAR_STRING:			case MYSQL_TYPE_STRING:			case MYSQL_TYPE_TIMESTAMP:			case MYSQL_TYPE_DATE:			case MYSQL_TYPE_TIME:			case MYSQL_TYPE_DATETIME:			case MYSQL_TYPE_NEWDATE: {				char	*value=(char *)bind[i].buffer;				cursor->inputBind(variable,value);				break;			}			case MYSQL_TYPE_DECIMAL:			case MYSQL_TYPE_FLOAT:			case MYSQL_TYPE_DOUBLE: {				double	value=*((double *)bind[i].buffer);				// FIXME: precision/scale???				cursor->inputBind(variable,value,0,0);				break;			}			case MYSQL_TYPE_TINY:			case MYSQL_TYPE_SHORT:			case MYSQL_TYPE_LONG:			case MYSQL_TYPE_YEAR: {				long	value=*((long *)bind[i].buffer);				cursor->inputBind(variable,value);				break;			}			case MYSQL_TYPE_LONGLONG:			case MYSQL_TYPE_INT24: {				// FIXME: what should I do here?				return false;				break;			}			case MYSQL_TYPE_TINY_BLOB:			case MYSQL_TYPE_MEDIUM_BLOB:			case MYSQL_TYPE_LONG_BLOB:			case MYSQL_TYPE_BLOB: {				char		*value=(char *)bind[i].buffer;				unsigned long	size=*(bind[i].length);				cursor->inputBindBlob(variable,value,size);				break;			}			case MYSQL_TYPE_ENUM:			case MYSQL_TYPE_SET:			case MYSQL_TYPE_GEOMETRY: {				// FIXME: what should I do here?				return false;				break;			}			default: {				// FIXME: what should I do here?				return false;			}		}	}	return true;}my_bool mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind) {	debugFunction();	stmt->resultbinds=bind;	return true;}static enum enum_field_types	mysqltypemap[]={	// "UNKNOWN"	MYSQL_TYPE_NULL,	// addded by freetds	// "CHAR"	MYSQL_TYPE_STRING,	// "INT"	MYSQL_TYPE_LONG,	// "SMALLINT"	MYSQL_TYPE_SHORT,	// "TINYINT"	MYSQL_TYPE_TINY,	// "MONEY"	MYSQL_TYPE_DECIMAL,	// "DATETIME"

⌨️ 快捷键说明

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