php_monetdb.c
来自「这个是内存数据库的客户端」· C语言 代码 · 共 2,237 行 · 第 1/5 页
C
2,237 行
if (zend_get_parameters_ex(2, &monetdb_link, &query)==FAILURE) { RETURN_FALSE; } break; default: WRONG_PARAM_COUNT; break; } if (monetdb_link == NULL && id == -1) { RETURN_FALSE; } ZEND_FETCH_RESOURCE2(monetdb, Mconn *, monetdb_link, id, "MonetDB link", le_link, le_plink); /* append ; to the query so it is terminated in those cases where * the user forgot it */ convert_to_string_ex(query); myq = alloca(sizeof(char) * (strlen(Z_STRVAL_PP(query)) + 2)); memcpy(myq, Z_STRVAL_PP(query), strlen(Z_STRVAL_PP(query)) + 1); strcat(myq, ";"); monetdb_result = mapi_query(monetdb, myq); if ((MG(auto_reset_persistent) & 2) && monetdb_result == NULL) { mapi_reconnect(monetdb); monetdb_result = mapi_query(monetdb, myq); } if (monetdb_result == NULL) { /* connection appears to be dead */ PHP_MONETDB_ERROR("Connection appears to be lost: %s", monetdb); RETURN_FALSE; } else { monetdb_result_h = (php_monetdb_result_handle *) emalloc(sizeof(php_monetdb_result_handle)); monetdb_result_h->conn = monetdb; monetdb_result_h->result = monetdb_result; monetdb_result_h->row = 0; if (mapi_result_error(monetdb_result) != NULL) { /* something went wrong */ PHP_MONETDB_ERROR_RESULT("Query failed: %s", monetdb_result_h); mapi_close_handle(monetdb_result); efree(monetdb_result_h); RETURN_FALSE; } ZEND_REGISTER_RESOURCE(return_value, monetdb_result_h, le_result); }}/* }}} */#ifdef I_FEEL_LIKE_IMPLEMENTING_PREPARED_STUFF/* {{{ _php_monetdb_free_params */static void _php_monetdb_free_params(char **params, int num_params){ if (num_params > 0) { efree(params); }}/* }}} *//* {{{ proto resource monetdb_query_params([resource connection,] string query, array params) Execute a query */PHP_FUNCTION(monetdb_query_params){ zval **query, **monetdb_link = NULL; zval **pv_param_arr, **tmp; int id = -1; int leftover = 0; int num_params = 0; char **params = NULL; unsigned char otype; Mconn *monetdb; Mresult *monetdb_result; ExecStatusType status; php_monetdb_result_handle *monetdb_result_h; switch(ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &query, &pv_param_arr)==FAILURE) { RETURN_FALSE; } id = MG(default_link); CHECK_DEFAULT_LINK(id); break; case 3: if (zend_get_parameters_ex(3, &monetdb_link, &query, &pv_param_arr)==FAILURE) { RETURN_FALSE; } break; default: WRONG_PARAM_COUNT; break; } if (monetdb_link == NULL && id == -1) { RETURN_FALSE; } if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed"); RETURN_FALSE; } ZEND_FETCH_RESOURCE2(monetdb, Mconn *, monetdb_link, id, "PostgreSQL link", le_link, le_plink); convert_to_string_ex(query); while ((monetdb_result = MgetResult(monetdb))) { Mclear(monetdb_result); leftover = 1; } if (leftover) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first"); } zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr)); num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr)); if (num_params > 0) { int i = 0; params = (char **)safe_emalloc(sizeof(char *), num_params, 0); for(i = 0; i < num_params; i++) { if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter"); _php_monetdb_free_params(params, num_params); RETURN_FALSE; } otype = (*tmp)->type; convert_to_string_ex(tmp); if (Z_TYPE_PP(tmp) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter"); _php_monetdb_free_params(params, num_params); RETURN_FALSE; } if (otype == IS_NULL) { params[i] = NULL; } else { params[i] = Z_STRVAL_PP(tmp); } zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr)); } } monetdb_result = PQexecParams(monetdb, Z_STRVAL_PP(query), num_params, NULL, (const char * const *)params, NULL, NULL, 0); if ((MG(auto_reset_persistent) & 2) && PQstatus(monetdb) != MONETDB_CONNECTION_OK) { Mclear(monetdb_result); PQreset(monetdb); monetdb_result = PQexecParams(monetdb, Z_STRVAL_PP(query), num_params, NULL, (const char * const *)params, NULL, NULL, 0); } if (monetdb_result) { status = PQresultStatus(monetdb_result); } else { status = (ExecStatusType) PQstatus(monetdb); } _php_monetdb_free_params(params, num_params); switch (status) { case PGRES_EMPTY_QUERY: case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: case PGRES_FATAL_ERROR: PHP_PQ_ERROR("Query failed: %s", monetdb); Mclear(monetdb_result); RETURN_FALSE; break; case PGRES_COMMAND_OK: /* successful command that did not return rows */ default: if (monetdb_result) { monetdb_result_h = (php_monetdb_result_handle *) emalloc(sizeof(php_monetdb_result_handle)); monetdb_result_h->conn = monetdb; monetdb_result_h->result = monetdb_result; monetdb_result_h->row = 0; ZEND_REGISTER_RESOURCE(return_value, monetdb_result_h, le_result); } else { Mclear(monetdb_result); RETURN_FALSE; } break; }}/* }}} *//* {{{ proto resource monetdb_prepare([resource connection,] string stmtname, string query) Prepare a query for future execution */PHP_FUNCTION(monetdb_prepare){ zval **query, **stmtname, **monetdb_link = NULL; int id = -1; int leftover = 0; Mconn *monetdb; Mresult *monetdb_result; ExecStatusType status; php_monetdb_result_handle *monetdb_result_h; switch(ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &stmtname, &query)==FAILURE) { RETURN_FALSE; } id = MG(default_link); CHECK_DEFAULT_LINK(id); break; case 3: if (zend_get_parameters_ex(3, &monetdb_link, &stmtname, &query)==FAILURE) { RETURN_FALSE; } break; default: WRONG_PARAM_COUNT; break; } if (monetdb_link == NULL && id == -1) { RETURN_FALSE; } ZEND_FETCH_RESOURCE2(monetdb, Mconn *, monetdb_link, id, "PostgreSQL link", le_link, le_plink); convert_to_string_ex(stmtname); convert_to_string_ex(query); while ((monetdb_result = MgetResult(monetdb))) { Mclear(monetdb_result); leftover = 1; } if (leftover) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first"); } monetdb_result = PQprepare(monetdb, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL); if ((MG(auto_reset_persistent) & 2) && PQstatus(monetdb) != MONETDB_CONNECTION_OK) { Mclear(monetdb_result); PQreset(monetdb); monetdb_result = PQprepare(monetdb, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL); } if (monetdb_result) { status = PQresultStatus(monetdb_result); } else { status = (ExecStatusType) PQstatus(monetdb); } switch (status) { case PGRES_EMPTY_QUERY: case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: case PGRES_FATAL_ERROR: PHP_PQ_ERROR("Query failed: %s", monetdb); Mclear(monetdb_result); RETURN_FALSE; break; case PGRES_COMMAND_OK: /* successful command that did not return rows */ default: if (monetdb_result) { monetdb_result_h = (php_monetdb_result_handle *) emalloc(sizeof(php_monetdb_result_handle)); monetdb_result_h->conn = monetdb; monetdb_result_h->result = monetdb_result; monetdb_result_h->row = 0; ZEND_REGISTER_RESOURCE(return_value, monetdb_result_h, le_result); } else { Mclear(monetdb_result); RETURN_FALSE; } break; }}/* }}} *//* {{{ proto resource monetdb_execute([resource connection,] string stmtname, array params) Execute a prepared query */PHP_FUNCTION(monetdb_execute){ zval **stmtname, **monetdb_link = NULL; zval **pv_param_arr, **tmp; int id = -1; int leftover = 0; int num_params = 0; char **params = NULL; unsigned char otype; Mconn *monetdb; Mresult *monetdb_result; ExecStatusType status; php_monetdb_result_handle *monetdb_result_h; switch(ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &stmtname, &pv_param_arr)==FAILURE) { RETURN_FALSE; } id = MG(default_link); CHECK_DEFAULT_LINK(id); break; case 3: if (zend_get_parameters_ex(3, &monetdb_link, &stmtname, &pv_param_arr)==FAILURE) { RETURN_FALSE; } break; default: WRONG_PARAM_COUNT; break; } if (monetdb_link == NULL && id == -1) { RETURN_FALSE; } if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed"); RETURN_FALSE; } ZEND_FETCH_RESOURCE2(monetdb, Mconn *, monetdb_link, id, "PostgreSQL link", le_link, le_plink); convert_to_string_ex(stmtname); while ((monetdb_result = MgetResult(monetdb))) { Mclear(monetdb_result); leftover = 1; } if (leftover) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first"); } zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr)); num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr)); if (num_params > 0) { int i = 0; params = (char **)safe_emalloc(sizeof(char *), num_params, 0); for(i = 0; i < num_params; i++) { if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter"); _php_monetdb_free_params(params, num_params); RETURN_FALSE; } otype = (*tmp)->type; convert_to_string(*tmp); if (Z_TYPE_PP(tmp) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter"); _php_monetdb_free_params(params, num_params); RETURN_FALSE; } if (otype == IS_NULL) { params[i] = NULL; } else { params[i] = Z_STRVAL_PP(tmp); } zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr)); } } monetdb_result = PQexecPrepared(monetdb, Z_STRVAL_PP(stmtname), num_params, (const char * const *)params, NULL, NULL, 0); if ((MG(auto_reset_persistent) & 2) && PQstatus(monetdb) != MONETDB_CONNECTION_OK) { Mclear(monetdb_result); PQreset(monetdb); monetdb_result = PQexecPrepared(monetdb, Z_STRVAL_PP(stmtname), num_params, (const char * const *)params, NULL, NULL, 0); } if (monetdb_result) { status = PQresultStatus(monetdb_result); } else { status = (ExecStatusType) PQstatus(monetdb); } _php_monetdb_free_params(params, num_params); switch (status) { case PGRES_EMPTY_QUERY: case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: case PGRES_FATAL_ERROR: Mclear(monetdb_result); PHP_PQ_ERROR("Query failed: %s", monetdb); RETURN_FALSE; break; case PGRES_COMMAND_OK: /* successful command that did not return rows */ default: if (monetdb_result) { monetdb_result_h = (php_monetdb_result_handle *) emalloc(sizeof(php_monetdb_result_handle)); monetdb_result_h->conn = monetdb; monetdb_result_h->result = monetdb_result; monetdb_result_h->row = 0; ZEND_REGISTER_RESOURCE(return_value, monetdb_result_h, le_result); } else { Mclear(monetdb_result); RETURN_FALSE; } break; }}/* }}} */#endif#define PHP_MONETDB_NUM_ROWS 1#define PHP_MONETDB_NUM_FIELDS 2#define PHP_MONETDB_CMD_TUPLES 3/* {{{ php_monetdb_get_result_info */static void php_monetdb_get_result_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type){ zval **result; Mresult *monetdb_result; php_monetdb_result_handle *monetdb_result_h; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result)==FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(monetdb_result_h, php_monetdb_result_handle *, result, -1, "MonetDB result", le_result); monetdb_result = monetdb_result_h->result; switch (entry_type) { case PHP_MONETDB_NUM_ROWS: Z_LVAL_P(return_value) = mapi_get_row_count(monetdb_result); break; case PHP_MONETDB_NUM_FIELDS: Z_LVAL_P(return_value) = mapi_get_field_count(monetdb_result); break; case PHP_MONETDB_CMD_TUPLES: Z_LVAL_P(return_value) = mapi_rows_affected(monetdb_result); break; default: RETURN_FALSE; } Z_TYPE_P(return_value) = IS_LONG;}/* }}} *//* {{{ proto int monetdb_num_rows(resource result) Return the number of rows in the result */PHP_FUNCTION(monetdb_num_rows){ php_monetdb_get_result_info(INTERNAL_FUNCTION_PARAM_PASSTHRU,PHP_MONETDB_NUM_ROWS);}/* }}} *//* {{{ proto int monetdb_num_fields(resource result) Return the number of fields in the result */PHP_FUNCTION(monetdb_num_fields){ php_monetdb_get_result_info(INTERNAL_FUNCTION_PARAM_PASSTHRU,PHP_MONETDB_NUM_FIELDS);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?