📄 mysql.c
字号:
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 + -