From cf8d87306f61df4e56ee744039fc74eb28037afc Mon Sep 17 00:00:00 2001 From: Scott MacVicar Date: Tue, 10 Feb 2009 00:44:09 +0000 Subject: [PATCH] MFB: The constructor should also throw exceptions, make this semi useful now. --- ext/sqlite3/sqlite3.c | 22 ++++++++++++++------ ext/sqlite3/tests/sqlite3_15_open_error.phpt | 12 +++++------ ext/sqlite3/tests/sqlite3_21_security.phpt | 12 ++++++----- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index cc44f50b62..a04de94508 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -74,36 +74,46 @@ PHP_METHOD(sqlite3, open) zend_uchar filename_type; int filename_len, encryption_key_len = 0; long flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + zend_error_handling error_handling; + db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); + zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|lS", &filename, &filename_len, &filename_type, &flags, &encryption_key, &encryption_key_len)) { + zend_restore_error_handling(&error_handling TSRMLS_CC); return; } + zend_restore_error_handling(&error_handling TSRMLS_CC); + if (db_obj->initialised) { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Already initialised DB Object"); + zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Already initialised DB Object", 0 TSRMLS_CC); + return; } if (filename_type == IS_UNICODE) { if (php_stream_path_encode(NULL, &filename, &filename_len, (UChar *)filename, filename_len, REPORT_ERRORS, FG(default_context)) == FAILURE) { - RETURN_FALSE; + zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Unable to decode filepath", 0 TSRMLS_CC); + return; } } if (strncmp(filename, ":memory:", 8) != 0) { if (!(fullpath = expand_filepath(filename, NULL TSRMLS_CC))) { + zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Unable to expand filepath", 0 TSRMLS_CC); if (filename_type == IS_UNICODE) { efree(filename); } - RETURN_FALSE; + return; } if (php_check_open_basedir(fullpath TSRMLS_CC)) { + zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "open_basedir prohibits opening %s", fullpath); if (filename_type == IS_UNICODE) { efree(filename); } efree(fullpath); - RETURN_FALSE; + return; } } else { fullpath = estrdup(filename); @@ -119,7 +129,7 @@ PHP_METHOD(sqlite3, open) /* Todo: utf-16 = sqlite3_open16 */ if (sqlite3_open(fullpath, &(db_obj->db)) != SQLITE_OK) { #endif - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unable to open database: %s", sqlite3_errmsg(db_obj->db)); + zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Unable to open database: %s", sqlite3_errmsg(db_obj->db)); if (fullpath) { efree(fullpath); } @@ -131,6 +141,7 @@ PHP_METHOD(sqlite3, open) #if SQLITE_HAS_CODEC if (encryption_key_len > 0) { if (sqlite3_key(db_obj->db, encryption_key, encryption_key_len) != SQLITE_OK) { + zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Unable to open database: %s", sqlite3_errmsg(db_obj->db)); return; } } @@ -143,7 +154,6 @@ PHP_METHOD(sqlite3, open) if (fullpath) { efree(fullpath); } - RETURN_TRUE; } /* }}} */ diff --git a/ext/sqlite3/tests/sqlite3_15_open_error.phpt b/ext/sqlite3/tests/sqlite3_15_open_error.phpt index 2e5e8a9c0c..1d49ba09d5 100644 --- a/ext/sqlite3/tests/sqlite3_15_open_error.phpt +++ b/ext/sqlite3/tests/sqlite3_15_open_error.phpt @@ -7,14 +7,14 @@ SQLite3::open error test $unreadable = dirname(__FILE__) . '/unreadable.db'; touch($unreadable); chmod($unreadable, 0200); -$db = new SQLite3($unreadable); - -var_dump($db); +try { + $db = new SQLite3($unreadable); +} catch (Exception $e) { + echo $e->getMessage() . "\n"; +} echo "Done\n"; unlink($unreadable); ?> --EXPECTF-- -Notice: SQLite3::__construct(): Unable to open database: unable to open database file in %s/sqlite3_15_open_error.php on line %d -object(SQLite3)#%d (0) { -} +Unable to open database: unable to open database file Done diff --git a/ext/sqlite3/tests/sqlite3_21_security.phpt b/ext/sqlite3/tests/sqlite3_21_security.phpt index f0b8d5aeb8..f7f894af54 100644 --- a/ext/sqlite3/tests/sqlite3_21_security.phpt +++ b/ext/sqlite3/tests/sqlite3_21_security.phpt @@ -16,8 +16,11 @@ var_dump($db->close()); unlink($directory . $file); echo "Above test directory\n"; -$db = new SQLite3('../bad' . $file); -var_dump($db); +try { + $db = new SQLite3('../bad' . $file); +} catch (Exception $e) { + echo $e->getMessage() . "\n"; +} echo "Done\n"; ?> @@ -28,7 +31,6 @@ object(SQLite3)#%d (0) { bool(true) Above test directory -Warning: SQLite3::__construct(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (.) in %s on line %d -object(SQLite3)#%d (0) { -} +Warning: SQLite3::__construct(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (.) in %s/sqlite3_21_security.php on line %d +open_basedir prohibits opening %s Done -- 2.50.1