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 **)¬ice, 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 **)¬ice, 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 + -
显示快捷键?