diff options
Diffstat (limited to 'ext/pgsql/pgsql.c')
| -rw-r--r-- | ext/pgsql/pgsql.c | 98 |
1 files changed, 62 insertions, 36 deletions
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index d372e290d0..20022607ea 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -212,11 +212,7 @@ ZEND_GET_MODULE(pgsql) static int le_link, le_plink, le_result, le_lofp, le_string; -#ifdef ZTS -int pgsql_globals_id; -#else -php_pgsql_globals pgsql_globals; -#endif +ZEND_DECLARE_MODULE_GLOBALS(pgsql); /* {{{ php_pgsql_set_default_link */ @@ -268,15 +264,21 @@ static void _close_pgsql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC) static void _php_pgsql_notice_handler(void *resource_id, const char *message) { php_pgsql_notice *notice; + int i; TSRMLS_FETCH(); if (! PGG(ignore_notices)) { + notice = (php_pgsql_notice *)emalloc(sizeof(php_pgsql_notice)); + i = strlen(message)-1; + while (i && (message[i] == '\r' || message[i] == '\n')) { + i--; + } + i++; + notice->message = estrndup(message, i); + notice->len = i; if (PGG(log_notices)) { - php_log_err((char *) message TSRMLS_CC); + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message); } - notice = (php_pgsql_notice *)emalloc(sizeof(php_pgsql_notice)); - notice->len = strlen(message); - notice->message = estrndup(message, notice->len); zend_hash_index_update(&PGG(notices), *(int *)resource_id, (void **)¬ice, sizeof(php_pgsql_notice *), NULL); } } @@ -348,22 +350,22 @@ static void _free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ PHP_INI */ PHP_INI_BEGIN() -STD_PHP_INI_BOOLEAN("pgsql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, php_pgsql_globals, pgsql_globals) -STD_PHP_INI_ENTRY_EX("pgsql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, php_pgsql_globals, pgsql_globals, display_link_numbers) -STD_PHP_INI_ENTRY_EX("pgsql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, php_pgsql_globals, pgsql_globals, display_link_numbers) -STD_PHP_INI_BOOLEAN("pgsql.auto_reset_persistent", "0", PHP_INI_SYSTEM, OnUpdateBool, auto_reset_persistent, php_pgsql_globals, pgsql_globals) -STD_PHP_INI_BOOLEAN("pgsql.ignore_notice", "0", PHP_INI_ALL, OnUpdateBool, ignore_notices, php_pgsql_globals, pgsql_globals) -STD_PHP_INI_BOOLEAN("pgsql.log_notice", "0", PHP_INI_ALL, OnUpdateBool, log_notices, php_pgsql_globals, pgsql_globals) +STD_PHP_INI_BOOLEAN( "pgsql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, zend_pgsql_globals, pgsql_globals) +STD_PHP_INI_ENTRY_EX("pgsql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_pgsql_globals, pgsql_globals, display_link_numbers) +STD_PHP_INI_ENTRY_EX("pgsql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, zend_pgsql_globals, pgsql_globals, display_link_numbers) +STD_PHP_INI_BOOLEAN( "pgsql.auto_reset_persistent", "0", PHP_INI_SYSTEM, OnUpdateBool, auto_reset_persistent, zend_pgsql_globals, pgsql_globals) +STD_PHP_INI_BOOLEAN( "pgsql.ignore_notice", "0", PHP_INI_ALL, OnUpdateBool, ignore_notices, zend_pgsql_globals, pgsql_globals) +STD_PHP_INI_BOOLEAN( "pgsql.log_notice", "0", PHP_INI_ALL, OnUpdateBool, log_notices, zend_pgsql_globals, pgsql_globals) PHP_INI_END() /* }}} */ /* {{{ php_pgsql_init_globals */ -static void php_pgsql_init_globals(php_pgsql_globals *pgsql_globals_p TSRMLS_DC) +static void php_pgsql_init_globals(zend_pgsql_globals *pgsql_globals) { - PGG(num_persistent) = 0; + memset(pgsql_globals, 0, sizeof(zend_pgsql_globals)); /* Initilize notice message hash at MINIT only */ - zend_hash_init_ex(&PGG(notices), 0, NULL, PHP_PGSQL_NOTICE_PTR_DTOR, 1, 0); + zend_hash_init_ex(&pgsql_globals->notices, 0, NULL, PHP_PGSQL_NOTICE_PTR_DTOR, 1, 0); } /* }}} */ @@ -371,11 +373,7 @@ static void php_pgsql_init_globals(php_pgsql_globals *pgsql_globals_p TSRMLS_DC) */ PHP_MINIT_FUNCTION(pgsql) { -#ifdef ZTS - ts_allocate_id(&pgsql_globals_id, sizeof(php_pgsql_globals), (ts_allocate_ctor) php_pgsql_init_globals, NULL); -#else - php_pgsql_init_globals(&pgsql_globals TSRMLS_CC); -#endif + ZEND_INIT_MODULE_GLOBALS(pgsql, php_pgsql_init_globals, NULL); REGISTER_INI_ENTRIES(); @@ -728,6 +726,9 @@ PHP_FUNCTION(pg_close) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -775,6 +776,9 @@ static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -914,6 +918,9 @@ PHP_FUNCTION(pg_query) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -1595,7 +1602,7 @@ PHP_FUNCTION(pg_last_oid) Enable tracing a PostgreSQL connection */ PHP_FUNCTION(pg_trace) { - zval **z_filename, **z_mode, **z_pgsql_link = NULL; + zval **z_filename, **z_mode, **pgsql_link = NULL; int id = -1; PGconn *pgsql; char *mode = "w"; @@ -1619,7 +1626,7 @@ PHP_FUNCTION(pg_trace) mode = Z_STRVAL_PP(z_mode); break; case 3: - if (zend_get_parameters_ex(3, &z_filename, &z_mode, &z_pgsql_link)==FAILURE) { + if (zend_get_parameters_ex(3, &z_filename, &z_mode, &pgsql_link)==FAILURE) { RETURN_FALSE; } convert_to_string_ex(z_mode); @@ -1629,8 +1636,11 @@ PHP_FUNCTION(pg_trace) ZEND_WRONG_PARAM_COUNT(); break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } - ZEND_FETCH_RESOURCE2(pgsql, PGconn *, z_pgsql_link, id, "PostgreSQL link", le_link, le_plink); + ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); convert_to_string_ex(z_filename); stream = php_stream_open_wrapper(Z_STRVAL_PP(z_filename), mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL); @@ -1671,6 +1681,9 @@ PHP_FUNCTION(pg_untrace) ZEND_WRONG_PARAM_COUNT(); break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); PQuntrace(pgsql); @@ -1701,6 +1714,9 @@ PHP_FUNCTION(pg_lo_create) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -1776,8 +1792,7 @@ PHP_FUNCTION(pg_lo_unlink) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 1 or 2 arguments."); RETURN_FALSE; } - - if (pgsql_link == NULL) { + if (pgsql_link == NULL && id == -1) { RETURN_FALSE; } @@ -1849,8 +1864,7 @@ PHP_FUNCTION(pg_lo_open) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 1 or 2 arguments."); RETURN_FALSE; } - - if (pgsql_link == NULL) { + if (pgsql_link == NULL && id == -1) { RETURN_FALSE; } @@ -2082,15 +2096,15 @@ PHP_FUNCTION(pg_lo_import) WRONG_PARAM_COUNT; } - if (pgsql_link == NULL) { + if (PG(safe_mode) &&(!php_checkuid(file_in, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } - if (PG(safe_mode) &&(!php_checkuid(file_in, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { + if (php_check_open_basedir(file_in TSRMLS_CC)) { RETURN_FALSE; } - if (php_check_open_basedir(file_in TSRMLS_CC)) { + if (pgsql_link == NULL && id == -1) { RETURN_FALSE; } @@ -2180,15 +2194,15 @@ PHP_FUNCTION(pg_lo_export) RETURN_FALSE; } - if (pgsql_link == NULL) { + if (PG(safe_mode) &&(!php_checkuid(file_out, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } - if (PG(safe_mode) &&(!php_checkuid(file_out, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { + if (php_check_open_basedir(file_out TSRMLS_CC)) { RETURN_FALSE; } - if (php_check_open_basedir(file_out TSRMLS_CC)) { + if (pgsql_link == NULL && id == -1) { RETURN_FALSE; } @@ -2274,6 +2288,9 @@ PHP_FUNCTION(pg_set_client_encoding) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -2306,6 +2323,9 @@ PHP_FUNCTION(pg_client_encoding) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -2350,6 +2370,9 @@ PHP_FUNCTION(pg_end_copy) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); @@ -2390,6 +2413,9 @@ PHP_FUNCTION(pg_put_line) WRONG_PARAM_COUNT; break; } + if (pgsql_link == NULL && id == -1) { + RETURN_FALSE; + } ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink); |
