summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmb@php.net>2016-07-27 16:37:49 +0200
committerChristoph M. Becker <cmb@php.net>2016-07-27 16:41:03 +0200
commitcc125f277b50e0f90fc8033fe7f47d2446389a15 (patch)
tree1a90a95e7ee1520ddff4314017cc6eca67e1e167
parentcce457c68c3a15efafea3a30560c54f74f3f5ee1 (diff)
downloadphp-git-cc125f277b50e0f90fc8033fe7f47d2446389a15.tar.gz
Implement #72653: SQLite should allow opening with empty filename
From the [sqlite3_open](https://www.sqlite.org/c3ref/open.html) docs: | If the filename is an empty string, then a private, temporary on-disk | database will be created. This private database will be automatically | deleted as soon as the database connection is closed. We make that facility available to userland. While we're at it, we also do some minor optimizations, remove the unnecessary check for NUL characters in filename, which is already catered to by ZPP(p), and add a missing `return` in case db_obj isn't initialized.
-rw-r--r--NEWS4
-rw-r--r--ext/sqlite3/sqlite3.c15
-rw-r--r--ext/sqlite3/tests/sqlite3_open_empty_string.phpt9
3 files changed, 13 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 1e3ef3be4e..bd65b76d6b 100644
--- a/NEWS
+++ b/NEWS
@@ -65,6 +65,10 @@ PHP NEWS
. Fixed bug #72646 (SplFileObject::getCsvControl does not return the escape
character). (cmb)
+- SQLite3:
+ . Implemented FR #72653 (SQLite should allow opening with empty filename).
+ (cmb)
+
21 Jul 2016, PHP 5.6.24
- Core:
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c
index c901e536a0..54ec73d6ac 100644
--- a/ext/sqlite3/sqlite3.c
+++ b/ext/sqlite3/sqlite3.c
@@ -118,13 +118,11 @@ PHP_METHOD(sqlite3, open)
if (db_obj->initialised) {
zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Already initialised DB Object", 0 TSRMLS_CC);
- }
-
- if (strlen(filename) != filename_len) {
return;
}
- if (filename_len != sizeof(":memory:")-1 ||
- memcmp(filename, ":memory:", sizeof(":memory:")-1) != 0) {
+
+ if (filename_len != 0 && (filename_len != sizeof(":memory:")-1 ||
+ memcmp(filename, ":memory:", sizeof(":memory:")-1) != 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);
return;
@@ -144,7 +142,8 @@ PHP_METHOD(sqlite3, open)
return;
}
} else {
- fullpath = estrdup(filename);
+ /* filename equals "" or ":memory:" */
+ fullpath = filename;
}
#if SQLITE_VERSION_NUMBER >= 3005000
@@ -153,7 +152,7 @@ PHP_METHOD(sqlite3, open)
if (sqlite3_open(fullpath, &(db_obj->db)) != SQLITE_OK) {
#endif
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) {
+ if (fullpath != filename) {
efree(fullpath);
}
return;
@@ -178,7 +177,7 @@ PHP_METHOD(sqlite3, open)
sqlite3_set_authorizer(db_obj->db, php_sqlite3_authorizer, NULL);
}
- if (fullpath) {
+ if (fullpath != filename) {
efree(fullpath);
}
}
diff --git a/ext/sqlite3/tests/sqlite3_open_empty_string.phpt b/ext/sqlite3/tests/sqlite3_open_empty_string.phpt
index 86868eeed1..940056bf0a 100644
--- a/ext/sqlite3/tests/sqlite3_open_empty_string.phpt
+++ b/ext/sqlite3/tests/sqlite3_open_empty_string.phpt
@@ -7,13 +7,8 @@ Thijs Feryn <thijs@feryn.eu>
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
--FILE--
<?php
-try{
- $db = new SQLite3('');
-} catch(Exception $e) {
- echo $e->getMessage().PHP_EOL;
-}
+$db = new SQLite3('');
echo "Done\n";
?>
---EXPECTF--
-Unable to expand filepath
+--EXPECT--
Done