diff options
author | Christoph M. Becker <cmb@php.net> | 2016-07-27 16:37:49 +0200 |
---|---|---|
committer | Christoph M. Becker <cmb@php.net> | 2016-07-27 16:41:03 +0200 |
commit | cc125f277b50e0f90fc8033fe7f47d2446389a15 (patch) | |
tree | 1a90a95e7ee1520ddff4314017cc6eca67e1e167 /ext/sqlite3/sqlite3.c | |
parent | cce457c68c3a15efafea3a30560c54f74f3f5ee1 (diff) | |
download | php-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.
Diffstat (limited to 'ext/sqlite3/sqlite3.c')
-rw-r--r-- | ext/sqlite3/sqlite3.c | 15 |
1 files changed, 7 insertions, 8 deletions
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); } } |