]> granicus.if.org Git - php/commitdiff
MFB: The constructor should also throw exceptions, make this semi useful now.
authorScott MacVicar <scottmac@php.net>
Tue, 10 Feb 2009 00:44:09 +0000 (00:44 +0000)
committerScott MacVicar <scottmac@php.net>
Tue, 10 Feb 2009 00:44:09 +0000 (00:44 +0000)
ext/sqlite3/sqlite3.c
ext/sqlite3/tests/sqlite3_15_open_error.phpt
ext/sqlite3/tests/sqlite3_21_security.phpt

index cc44f50b6244982d5ff3d2cefe7697eecbf2ec47..a04de94508ce879a30e43f0a591e381e995f2ff5 100644 (file)
@@ -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;
 }
 /* }}} */
 
index 2e5e8a9c0c750c824061fe400fb380b74dfe092b..1d49ba09d53e98f5c85b35ca04ee7e866a62597e 100644 (file)
@@ -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
index f0b8d5aeb832e17c1ef9294b3bd343e3a42338f1..f7f894af5465aca147f62cfa9122aa4870c4445c 100644 (file)
@@ -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