📄 mysqlnd.c
字号:
} return (ulong)(newstr - newstr_s);}/* }}} *//* {{{ _mysqlnd_real_escape_string */staticulong _mysqlnd_real_escape_string(const MYSQLND * const conn, char *newstr, const char *escapestr, int escapestr_len){ if (conn->upsert_status.server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) { return _mysqlnd_real_escape_quotes(conn, newstr, escapestr, escapestr_len); } return _mysqlnd_real_escape_slashes(conn, newstr, escapestr, escapestr_len);}/* {{{ _mysqlnd_dump_debug_info */static enum_func_status_mysqlnd_dump_debug_info(MYSQLND * const conn TSRMLS_DC){ return mysqlnd_simple_command(conn, COM_DEBUG, NULL, 0, PROT_EOF_PACKET, FALSE TSRMLS_CC);}/* }}} *//* {{{ _mysqlnd_select_db */static enum_func_status_mysqlnd_select_db(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC){ enum_func_status ret; ret = mysqlnd_simple_command(conn, COM_INIT_DB, db, db_len, PROT_OK_PACKET, FALSE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( */ SET_ERROR_AFF_ROWS(conn); return ret;}/* }}} *//* {{{ _mysqlnd_ping */static enum_func_status_mysqlnd_ping(MYSQLND * const conn TSRMLS_DC){ enum_func_status ret; ret = mysqlnd_simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, FALSE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( */ SET_ERROR_AFF_ROWS(conn); return ret;}/* }}} *//* {{{ mysqlnd_stat */static enum_func_status_mysqlnd_stat(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC){ enum_func_status ret; php_mysql_packet_stats stats_header; ret = mysqlnd_simple_command(conn, COM_STATISTICS, NULL, 0, PROT_LAST, FALSE TSRMLS_CC); if (FAIL == ret) { return FAIL; } PACKET_INIT_ALLOCA(stats_header, PROT_STATS_PACKET); if (FAIL == (ret = PACKET_READ_ALLOCA(stats_header, conn))) { return FAIL; } *message = stats_header.message; *message_len = stats_header.message_len; /* Ownership transfer */ stats_header.message = NULL; PACKET_FREE_ALLOCA(stats_header); return PASS;}/* }}} *//* {{{ _mysqlnd_kill */static enum_func_status_mysqlnd_kill(MYSQLND *conn, unsigned long pid TSRMLS_DC){ enum_func_status ret; char buff[4]; int4store(buff, pid); /* If we kill ourselves don't expect OK packet, PROT_LAST will skip it */ if (pid != conn->thread_id) { ret = mysqlnd_simple_command(conn, COM_PROCESS_KILL, buff, 4, PROT_OK_PACKET, FALSE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( */ conn->upsert_status.affected_rows = -1; } else if (PASS == (ret = mysqlnd_simple_command(conn, COM_PROCESS_KILL, buff, 4, PROT_LAST, FALSE TSRMLS_CC))) { conn->state = CONN_QUIT_SENT; } return ret;}/* }}} *//* {{{ _mysqlnd_set_charset */static enum_func_status_mysqlnd_set_charset(MYSQLND * const conn, const char * const csname TSRMLS_DC){ char query[MAX_CHARSET_LEN + 12]; const MYSQLND_CHARSET * const charset = mysqlnd_find_charset_name(csname); if (!charset) { SET_CLIENT_ERROR(conn->error_info, CR_CANT_FIND_CHARSET, UNKNOWN_SQLSTATE, "Invalid characterset or character set not supported"); return FAIL; } strcpy(query, "SET NAMES "); strcat(query, csname); if (FAIL == conn->m->query(conn, query, strlen(query) TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error executing query"); } else if (conn->error_info.error_no) { return FAIL; } conn->charset = charset; return PASS;}/* }}} *//* {{{ _mysqlnd_refresh */static enum_func_status_mysqlnd_refresh(MYSQLND * const conn, unsigned long options TSRMLS_DC){ zend_uchar bits[1]; int1store(bits, options); return mysqlnd_simple_command(conn, COM_REFRESH, (char *)bits, 1, PROT_OK_PACKET, FALSE TSRMLS_CC);}/* }}} *//* {{{ _mysqlnd_shutdown */static enum_func_status_mysqlnd_shutdown(MYSQLND * const conn, unsigned long level TSRMLS_DC){ zend_uchar bits[1]; int1store(bits, level); return mysqlnd_simple_command(conn, COM_SHUTDOWN, (char *)bits, 1, PROT_OK_PACKET, FALSE TSRMLS_CC);}/* }}} */static enum_mysqlnd_collected_statsclose_type_to_stat_map[MYSQLND_CLOSE_LAST] = { STAT_CLOSE_EXPLICIT, STAT_CLOSE_IMPLICIT, STAT_CLOSE_DISCONNECT};/* {{{ _mysqlnd_send_close */static enum_func_status_mysqlnd_send_close(MYSQLND * conn TSRMLS_DC){ enum_func_status ret = PASS; switch (conn->state) { case CONN_READY: ret = mysqlnd_simple_command(conn, COM_QUIT, NULL, 0, PROT_LAST, conn->tmp_int? TRUE : FALSE TSRMLS_CC); /* Do nothing */ break; case CONN_NEXT_RESULT_PENDING: case CONN_QUERY_SENT: case CONN_FETCHING_DATA: MYSQLND_INC_CONN_STATISTIC(NULL, STAT_CLOSE_IN_MIDDLE);#ifndef MYSQLND_SILENT php_printf("Brutally closing connection [%p][%s]\n", conn, conn->scheme);#endif /* Do nothing, the connection will be brutally closed and the server will catch it and free close from its side. */ case CONN_ALLOCED: /* Allocated but not connected or there was failure when trying to connect with pre-allocated connect. Fall-through */ case CONN_QUIT_SENT: /* The user has killed its own connection */ break; } /* We hold one reference, and every other object which needs the connection does increase it by 1. */ conn->state = CONN_QUIT_SENT; return ret;}/* }}} *//* {{{ _mysqlnd_close */static enum_func_status_mysqlnd_close(MYSQLND * conn, enum_connection_close_type close_type TSRMLS_DC){ enum_func_status ret = PASS; enum_mysqlnd_collected_stats stat = close_type_to_stat_map[close_type]; MYSQLND_INC_CONN_STATISTIC(NULL, stat); _mysqlnd_send_close(conn TSRMLS_CC); conn->m->free_reference(conn TSRMLS_CC); return ret;}/* }}} *//* {{{ _mysqlnd_num_fields */unsigned int _mysqlnd_num_fields(const MYSQLND_RES * const res){ return res->field_count;}/* }}} *//* {{{ _mysqlnd_num_fields */mynd_ulonglong _mysqlnd_num_rows(const MYSQLND_RES * const res){ /* Be compatible with libmysql. We count row_count, but will return 0 */ return res->data? res->data->row_count:0;}/* }}} *//* {{{ mysqlnd_field_count */staticunsigned int _mysqlnd_field_count(const MYSQLND * const conn){ return conn->field_count;}/* }}} *//* {{{ mysqlnd_fetch_field */static MYSQLND_FIELD *_mysqlnd_fetch_field(MYSQLND_RES * const result){ if (!result->meta || result->meta->current_field >= result->field_count) return NULL; return &result->meta->fields[result->meta->current_field++];}/* }}} *//* {{{ _mysqlnd_fetch_field_direct */static MYSQLND_FIELD *_mysqlnd_fetch_field_direct(const MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr){ return result->meta? &result->meta->fields[fieldnr]:NULL;}/* }}} *//* {{{ mysqlnd_field_seek */static MYSQLND_FIELD_OFFSET_mysqlnd_field_seek(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset){ MYSQLND_FIELD_OFFSET return_value = 0; if (result->meta) { return_value = result->meta->current_field; result->meta->current_field = field_offset; } return return_value;}/* }}} *//* {{{ _mysqlnd_field_tell */static MYSQLND_FIELD_OFFSET_mysqlnd_field_tell(const MYSQLND_RES * const result){ return result->meta? result->meta->current_field:0;}/* }}} *//* {{{ _mysqlnd_insert_id */staticmynd_ulonglong _mysqlnd_insert_id(const MYSQLND * const conn){ return conn->upsert_status.last_insert_id;}/* }}} *//* {{{ _mysqlnd_affected_rows */staticmynd_ulonglong _mysqlnd_affected_rows(const MYSQLND * const conn){ return conn->upsert_status.affected_rows;}/* }}} *//* {{{ _mysqlnd_warning_count */staticunsigned int _mysqlnd_warning_count(const MYSQLND * const conn){ return conn->upsert_status.warning_count;}/* }}} *//* {{{ _mysqlnd_info */staticconst char *_mysqlnd_info(const MYSQLND * const conn){ return conn->last_message;}/* }}} *//* {{{ _mysqlnd_client_info */const char *_mysqlnd_get_client_info(){ return MYSQLND_VERSION;}/* }}} *//* {{{ _mysqlnd_get_client_version */unsigned int _mysqlnd_get_client_version(){ return MYSQLND_VERSION_ID;}/* }}} *//* {{{ _mysqlnd_get_server_info */staticconst char * _mysqlnd_get_server_info(const MYSQLND * const conn){ return conn->server_version;}/* }}} *//* {{{ _mysqlnd_get_host_info */staticconst char * _mysqlnd_get_host_info(const MYSQLND * const conn){ return conn->host_info;}/* }}} *//* {{{ _mysqlnd_get_proto_info */staticunsigned int _mysqlnd_get_proto_info(const MYSQLND *const conn){ return conn->protocol_version;}/* }}} *//* {{{ _mysqlnd_thread_id */staticmynd_ulonglong _mysqlnd_thread_id(const MYSQLND * const conn){ return conn->thread_id;}/* }}} *//* {{{ _mysqlnd_get_server_version */staticunsigned long _mysqlnd_get_server_version(const MYSQLND * const conn){ long major, minor, patch; char *p = conn->server_version; if (!conn->server_version) { return 0; } major = strtol(p, &p, 10); p += 1; /* consume the dot */ minor = strtol(p, &p, 10); p += 1; /* consume the dot */ patch = strtol(p, &p, 10); return (unsigned long)(major * 10000L + (unsigned long)(minor * 100L + patch));}/* }}} *//* {{{ _mysqlnd_more_results */staticzend_bool _mysqlnd_more_results(const MYSQLND * const conn){ /* (conn->state == CONN_NEXT_RESULT_PENDING) too */ return conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS? TRUE:FALSE;}/* }}} *//* {{{ _mysqlnd_next_result */static enum_func_status_mysqlnd_next_result(MYSQLND * const conn TSRMLS_DC){ enum_func_status ret; if (conn->state != CONN_NEXT_RESULT_PENDING) { return FAIL; } SET_EMPTY_ERROR(conn->error_info); conn->upsert_status.affected_rows= ~(mynd_ulonglong) 0; /* We are sure that there is a result set, since conn->state is set accordingly in mysqlnd_store_result() or mysqlnd_fetch_row_unbuffered() */ if (FAIL == (ret = mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC))) {#ifndef MYSQLND_SILENT php_error_docref(NULL TSRMLS_CC, E_WARNING, "Serious error");#endif conn->state = CONN_QUIT_SENT; } return ret;}/* }}} *//* {{{ mysqlnd_field_type_name */const char *mysqlnd_field_type_name(enum mysqlnd_field_types field_type){ switch(field_type) { case FIELD_TYPE_STRING: case FIELD_TYPE_VAR_STRING: return "string"; case FIELD_TYPE_TINY: case FIELD_TYPE_SHORT: case FIELD_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -