php_monetdb.c

来自「这个是内存数据库的客户端」· C语言 代码 · 共 2,237 行 · 第 1/5 页

C
2,237
字号
/*   +----------------------------------------------------------------------+   | PHP Version 5                                                        |   +----------------------------------------------------------------------+   | Copyright (c) 1997-2006 The PHP Group                                |   +----------------------------------------------------------------------+   | This source file is subject to version 3.01 of the PHP license,      |   | that is bundled with this package in the file LICENSE, and is        |   | available through the world-wide-web at the following url:           |   | http://www.php.net/license/3_01.txt                                  |   | If you did not receive a copy of the PHP license and are unable to   |   | obtain it through the world-wide-web, please send a note to          |   | license@php.net so we can mail you a copy immediately.               |   +----------------------------------------------------------------------+   | Authors: Zeev Suraski <zeev@zend.com>                                |   |          Jouni Ahto <jouni.ahto@exdec.fi>                            |   |          Yasuo Ohgaki <yohgaki@php.net>                              |   |          Youichi Iwakiri <yiwakiri@st.rim.or.jp> (pg_copy_*)         |    |          Chris Kings-Lynne <chriskl@php.net> (v3 protocol)           |    |          Fabian Groffen <fabian@cwi.nl> (MonetDB version)            |   +----------------------------------------------------------------------+ */ /* $Id: php_monetdb.c,v 1.1.2.1 2007/02/19 12:00:44 sjoerd Exp $ */#define SMART_STR_PREALLOC 512#ifdef _MSC_VER#define WIN32 1#define WINNT 1#endif#include <stdlib.h>#include "php.h"#include "php_ini.h"#include "ext/standard/php_standard.h"#include "ext/standard/php_smart_str.h"#undef PACKAGE_BUGREPORT#undef PACKAGE_NAME#undef PACKAGE_STRING#undef PACKAGE_TARNAME#undef PACKAGE_VERSION#include "php_monetdb.h"#include "php_globals.h"#include "zend_exceptions.h"#define MONETDB_ASSOC		1<<0#define MONETDB_NUM			1<<1#define MONETDB_BOTH		(MONETDB_ASSOC|MONETDB_NUM)#define MONETDB_CONNECTION_OK	1#define MONETDB_CONNECTION_BAD	2#define MONETDB_STATUS_LONG     1#define MONETDB_STATUS_STRING   2#define MONETDB_MAX_LENGTH_OF_LONG   30#define MONETDB_MAX_LENGTH_OF_DOUBLE 60#define CHECK_DEFAULT_LINK(x) if ((x) == -1) { \	php_error_docref(NULL TSRMLS_CC, E_WARNING, "No MonetDB link opened yet"); \} \/* {{{ monetdb_functions[] */zend_function_entry monetdb_functions[] = {	/* connection functions */	PHP_FE(monetdb_connect,				NULL)	PHP_FE(monetdb_pconnect,			NULL)	PHP_FE(monetdb_close,				NULL)	PHP_FE(monetdb_connection_status,	NULL)	PHP_FE(monetdb_connection_reset,	NULL)	PHP_FE(monetdb_host,				NULL)	PHP_FE(monetdb_dbname,				NULL)	PHP_FE(monetdb_version,				NULL)	PHP_FE(monetdb_ping,				NULL)	/* query functions */	PHP_FE(monetdb_query,				NULL)#ifdef I_FEEL_LIKE_IMPLEMENTING_PREPARED_STUFF	PHP_FE(monetdb_connection_busy,		NULL)	PHP_FE(monetdb_query_params,		NULL)	PHP_FE(monetdb_prepare,				NULL)	PHP_FE(monetdb_execute,				NULL)	PHP_FE(monetdb_send_query,			NULL)	PHP_FE(monetdb_send_query_params,	NULL)	PHP_FE(monetdb_send_prepare,		NULL)	PHP_FE(monetdb_send_execute,		NULL)	PHP_FE(monetdb_get_result,			NULL)	PHP_FE(monetdb_result_status,		NULL)#endif	/* result functions */	PHP_FE(monetdb_fetch_result,		NULL)	PHP_FE(monetdb_fetch_row,			NULL)	PHP_FE(monetdb_fetch_assoc,			NULL)	PHP_FE(monetdb_fetch_array,			NULL)	PHP_FE(monetdb_fetch_object,		NULL)	PHP_FE(monetdb_affected_rows,		NULL)	PHP_FE(monetdb_result_seek,			NULL)	PHP_FE(monetdb_free_result,			NULL)	PHP_FE(monetdb_num_rows,			NULL)	PHP_FE(monetdb_num_fields,			NULL)	PHP_FE(monetdb_field_name,			NULL)	PHP_FE(monetdb_field_table,			NULL)	PHP_FE(monetdb_field_type,			NULL)	PHP_FE(monetdb_field_num,			NULL)	PHP_FE(monetdb_field_prtlen,		NULL)	PHP_FE(monetdb_field_is_null,		NULL)	/* error message functions */	PHP_FE(monetdb_last_error,			NULL)	PHP_FE(monetdb_last_notice,			NULL)	/* utility functions */	PHP_FE(monetdb_escape_string,		NULL)#ifdef I_FEEL_LIKE_IMPLEMENTING_COPY_INTO_PROPERLY	/* copy functions */	PHP_FE(monetdb_put_line,			NULL)	PHP_FE(monetdb_end_copy,			NULL)	PHP_FE(monetdb_copy_to,				NULL)	PHP_FE(monetdb_copy_from,			NULL)#endif#ifdef I_FEEL_LIKE_IMPLEMENTING_POSTGRES_EXPERIMENTAL_FUNCTIONS	/* misc functions */	PHP_FE(monetdb_meta_data,			NULL)	PHP_FE(monetdb_convert,				NULL)	PHP_FE(monetdb_insert,				NULL)	PHP_FE(monetdb_update,				NULL)	PHP_FE(monetdb_delete,				NULL)	PHP_FE(monetdb_select,				NULL)#endif	{NULL, NULL, NULL} };/* }}} *//* {{{ pgsql_module_entry */zend_module_entry monetdb_module_entry = {	STANDARD_MODULE_HEADER,	"monetdb",	monetdb_functions,	PHP_MINIT(monetdb),	PHP_MSHUTDOWN(monetdb),	PHP_RINIT(monetdb),	PHP_RSHUTDOWN(monetdb),	PHP_MINFO(monetdb),	NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_MONETDBZEND_GET_MODULE(monetdb)#endifstatic int le_link, le_plink, le_result, le_lofp, le_string;ZEND_DECLARE_MODULE_GLOBALS(monetdb)/* {{{ _php_monetdb_trim_message */static char * _php_monetdb_trim_message(const char *message, int *len){	register int i;	register const char* j = message;	if (message == NULL)		return(estrdup("(null)"));	i = strlen(message)-1;	/* trim newlines from the end */	while (i>0 && (message[i] == '\r' || message[i] == '\n'))		i--;	i++;	/* remove (!(ERROR: )?)? from the start */	if (*j == '!')		j++;	if (strncmp(j, "ERROR: ", 7) == 0)		j += 7;	/* correct the length based on the new start */	i -= (int)(j - message);	if (len)		*len = i;	return(estrndup(j, i));}/* }}} */#define PHP_MONETDB_ERROR(text, monetdb) { \	char *msgbuf = _php_monetdb_trim_message(mapi_error_str(monetdb), NULL); \	php_error_docref(NULL TSRMLS_CC, E_WARNING, text, msgbuf); \	_php_monetdb_error_handler(monetdb, msgbuf); \} \#define PHP_MONETDB_ERROR_RESULT(text, monetdb_rh) { \	char *msgbuf = _php_monetdb_trim_message(mapi_result_error(monetdb_rh->result), NULL); \	php_error_docref(NULL TSRMLS_CC, E_WARNING, text, msgbuf); \	_php_monetdb_error_handler(monetdb_rh->conn, msgbuf); \} \/* {{{ php_monetdb_set_default_link */static void php_monetdb_set_default_link(int id TSRMLS_DC){   	zend_list_addref(id);	if (MG(default_link) != -1) {		zend_list_delete(MG(default_link));	}	MG(default_link) = id;}/* }}} *//* {{{ _close_monetdb_link */static void _close_monetdb_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){	Mconn *link = (Mconn *)rsrc->ptr;	mapi_disconnect(link);	mapi_destroy(link);	MG(num_links)--;}/* }}} *//* {{{ _close_monetdb_plink */static void _close_monetdb_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){	Mconn *link = (Mconn *)rsrc->ptr;	mapi_disconnect(link);	mapi_destroy(link);	MG(num_persistent)--;	MG(num_links)--;}/* }}} */#if 0	reserved for future use/* {{{ _php_monetdb_notice_handler */static void _php_monetdb_notice_handler(void *resource_id, const char *message){	php_monetdb_notice *notice;		TSRMLS_FETCH();	if (! MG(ignore_notices)) {		notice = (php_monetdb_notice *)emalloc(sizeof(php_monetdb_notice));		notice->message = _php_monetdb_trim_message(message, &(notice->len));		if (MG(log_notices)) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message);		}		zend_hash_index_update(&MG(notices), (ulong)resource_id, (void **)&notice, sizeof(php_monetdb_notice *), NULL);	}}/* }}} */#endif#define PHP_MONETDB_NOTICE_PTR_DTOR (void (*)(void *))_php_monetdb_notice_ptr_dtor/* {{{ _php_monetdb_notice_dtor */static void _php_monetdb_notice_ptr_dtor(void **ptr) {	php_monetdb_notice *notice = (php_monetdb_notice *)*ptr;	if (notice) { 		efree(notice->message);  		efree(notice);  		notice = NULL;  	}}/* }}} *//* {{{ _php_monetdb_error_handler */static void _php_monetdb_error_handler(void *resource_id, const char *message){	php_monetdb_notice *notice;		TSRMLS_FETCH();	notice = (php_monetdb_notice *)emalloc(sizeof(php_monetdb_notice));	notice->message = _php_monetdb_trim_message(message, &(notice->len));	zend_hash_index_update(			&MG(errors),			(ulong)resource_id,			(void **)&notice,			sizeof(php_monetdb_notice *),			NULL		);}/* }}} */#define PHP_MONETDB_ERROR_PTR_DTOR (void (*)(void *))_php_monetdb_notice_ptr_dtor/* {{{ _rollback_transactions */static int _rollback_transactions(zend_rsrc_list_entry *rsrc TSRMLS_DC){	Mconn *link;	Mresult *res;	int orig;	if (Z_TYPE_P(rsrc) != le_plink) 		return 0;	link = (Mconn *) rsrc->ptr;	orig = MG(ignore_notices);	MG(ignore_notices) = 1;	if ((res = mapi_query(link, "START TRANSACTION;")) != NULL)		mapi_close_handle(res);	if ((res = mapi_query(link, "ROLLBACK;")) != NULL)		mapi_close_handle(res);	MG(ignore_notices) = orig;	return 0;}/* }}} *//* {{{ _free_ptr */static void _free_ptr(zend_rsrc_list_entry *rsrc TSRMLS_DC){	mLofp *lofp = (mLofp *)rsrc->ptr;	efree(lofp);}/* }}} *//* {{{ _free_result */static void _free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC){	php_monetdb_result_handle *monetdb_result =		(php_monetdb_result_handle *)rsrc->ptr;	mapi_close_handle(monetdb_result->result);	efree(monetdb_result);}/* }}} *//* {{{ PHP_INI */PHP_INI_BEGIN()STD_PHP_INI_BOOLEAN( "monetdb.allow_persistent",      "1",  PHP_INI_SYSTEM, OnUpdateBool, allow_persistent,      zend_monetdb_globals, monetdb_globals)STD_PHP_INI_ENTRY_EX("monetdb.max_persistent",       "-1",  PHP_INI_SYSTEM, OnUpdateLong, max_persistent,        zend_monetdb_globals, monetdb_globals, display_link_numbers)STD_PHP_INI_ENTRY_EX("monetdb.max_links",            "-1",  PHP_INI_SYSTEM, OnUpdateLong, max_links,             zend_monetdb_globals, monetdb_globals, display_link_numbers)STD_PHP_INI_BOOLEAN( "monetdb.auto_reset_persistent", "0",  PHP_INI_SYSTEM, OnUpdateBool, auto_reset_persistent, zend_monetdb_globals, monetdb_globals)STD_PHP_INI_BOOLEAN( "monetdb.ignore_notice",         "0",  PHP_INI_ALL,    OnUpdateBool, ignore_notices,        zend_monetdb_globals, monetdb_globals)STD_PHP_INI_BOOLEAN( "monetdb.log_notice",            "0",  PHP_INI_ALL,    OnUpdateBool, log_notices,           zend_monetdb_globals, monetdb_globals)PHP_INI_END()/* }}} *//* {{{ php_monetdb_init_globals */static void php_monetdb_init_globals(zend_monetdb_globals *monetdb_globals){	memset(monetdb_globals, 0, sizeof(zend_monetdb_globals));	/* Initialise notice message hash at MINIT only */	zend_hash_init_ex(&monetdb_globals->notices, 0, NULL, PHP_MONETDB_NOTICE_PTR_DTOR, 1, 0); 	zend_hash_init_ex(&monetdb_globals->errors, 0, NULL, PHP_MONETDB_ERROR_PTR_DTOR, 1, 0); 	/* Initialise user, pass, lang, etc defaults */	monetdb_globals->default_hostname = "localhost";	monetdb_globals->default_username = "monetdb";	monetdb_globals->default_password = "monetdb";	monetdb_globals->default_language = "sql";	monetdb_globals->default_port = 50000;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(monetdb){	ZEND_INIT_MODULE_GLOBALS(monetdb, php_monetdb_init_globals, NULL);	REGISTER_INI_ENTRIES();		le_link = zend_register_list_destructors_ex(_close_monetdb_link, NULL, "monetdb link", module_number);	le_plink = zend_register_list_destructors_ex(NULL, _close_monetdb_plink, "monetdb link persistent", module_number);	le_result = zend_register_list_destructors_ex(_free_result, NULL, "monetdb result", module_number);	le_lofp = zend_register_list_destructors_ex(_free_ptr, NULL, "monetdb large object", module_number);	le_string = zend_register_list_destructors_ex(_free_ptr, NULL, "monetdb string", module_number);	/* For connection option */	REGISTER_LONG_CONSTANT("MONETDB_CONNECT_FORCE_NEW", MONETDB_CONNECT_FORCE_NEW, CONST_CS | CONST_PERSISTENT);	/* For pg_fetch_array() */	REGISTER_LONG_CONSTANT("MONETDB_ASSOC", MONETDB_ASSOC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_NUM", MONETDB_NUM, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_BOTH", MONETDB_BOTH, CONST_CS | CONST_PERSISTENT);	/* For pg_connection_status() */	REGISTER_LONG_CONSTANT("MONETDB_CONNECTION_BAD", MONETDB_CONNECTION_BAD, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_CONNECTION_OK", MONETDB_CONNECTION_OK, CONST_CS | CONST_PERSISTENT);#ifdef I_FEEL_LIKE_IMPLEMENTING_PREPARED_STUFF	/* For monetdb_result_h() return value type */	REGISTER_LONG_CONSTANT("MONETDB_STATUS_LONG", MONETDB_STATUS_LONG, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_STATUS_STRING", MONETDB_STATUS_STRING, CONST_CS | CONST_PERSISTENT);	/* For monetdb_result_h() return value */	REGISTER_LONG_CONSTANT("MONETDB_EMPTY_QUERY", PGRES_EMPTY_QUERY, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_COMMAND_OK", PGRES_COMMAND_OK, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_TUPLES_OK", PGRES_TUPLES_OK, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_COPY_OUT", PGRES_COPY_OUT, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_COPY_IN", PGRES_COPY_IN, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_BAD_RESPONSE", PGRES_BAD_RESPONSE, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_NONFATAL_ERROR", PGRES_NONFATAL_ERROR, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_FATAL_ERROR", PGRES_FATAL_ERROR, CONST_CS | CONST_PERSISTENT);#endif /* I_FEEL_LIKE_IMPLEMENTING_PREPARED_STUFF */	/* pg_convert options */	REGISTER_LONG_CONSTANT("MONETDB_CONV_IGNORE_DEFAULT", MONETDB_CONV_IGNORE_DEFAULT, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_CONV_FORCE_NULL", MONETDB_CONV_FORCE_NULL, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_CONV_IGNORE_NOT_NULL", MONETDB_CONV_IGNORE_NOT_NULL, CONST_CS | CONST_PERSISTENT);	/* pg_insert/update/delete/select options */	REGISTER_LONG_CONSTANT("MONETDB_DML_NO_CONV", MONETDB_DML_NO_CONV, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_DML_EXEC", MONETDB_DML_EXEC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_DML_ASYNC", MONETDB_DML_ASYNC, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("MONETDB_DML_STRING", MONETDB_DML_STRING, CONST_CS | CONST_PERSISTENT);	return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(monetdb){	UNREGISTER_INI_ENTRIES();	zend_hash_destroy(&MG(notices));	zend_hash_destroy(&MG(errors));	return SUCCESS;}/* }}} *//* {{{ PHP_RINIT_FUNCTION */PHP_RINIT_FUNCTION(monetdb){	MG(default_link)=-1;	MG(num_links) = MG(num_persistent);	return SUCCESS;}/* }}} *//* {{{ PHP_RSHUTDOWN_FUNCTION */

⌨️ 快捷键说明

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