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 + -
显示快捷键?