diff --git a/extensions/sqlite/AMBuilder b/extensions/sqlite/AMBuilder index ebed983432..58b20e15f6 100644 --- a/extensions/sqlite/AMBuilder +++ b/extensions/sqlite/AMBuilder @@ -12,7 +12,9 @@ elif binary.compiler.vendor == 'msvc': binary.compiler.defines += [ 'SQLITE_OMIT_LOAD_EXTENSION', - 'SQLITE_THREADSAFE' + 'SQLITE_THREADSAFE', + 'SQLITE_USE_URI', + 'SQLITE_ALLOW_URI_AUTHORITY', ] if builder.target_platform == 'linux': binary.compiler.postlink += ['-ldl', '-lpthread'] diff --git a/extensions/sqlite/driver/SqDriver.cpp b/extensions/sqlite/driver/SqDriver.cpp index 22769951e7..5c0710f530 100644 --- a/extensions/sqlite/driver/SqDriver.cpp +++ b/extensions/sqlite/driver/SqDriver.cpp @@ -33,6 +33,7 @@ #include "extension.h" #include "SqDriver.h" #include "SqDatabase.h" +#include SqDriver g_SqDriver; @@ -178,71 +179,80 @@ inline bool IsPathSepChar(char c) IDatabase *SqDriver::Connect(const DatabaseInfo *info, bool persistent, char *error, size_t maxlength) { ke::AutoLock lock(&m_OpenLock); + + /* Full path to the database file */ + char fullpath[PLATFORM_MAX_PATH]; - /* Format our path */ - char path[PLATFORM_MAX_PATH]; - size_t len = libsys->PathFormat(path, sizeof(path), "sqlite/%s", info->database); - - /* Chop any filename off */ - for (size_t i = len-1; - i <= len-1; - i--) + if (strcmp(info->database, ":memory:") == 0 || strncmp(info->database, "file:", 5) == 0) { - if (IsPathSepChar(path[i])) + ke::SafeStrcpy(fullpath, sizeof(fullpath), info->database); + } + else + { + /* Format our path */ + char path[PLATFORM_MAX_PATH]; + size_t len = libsys->PathFormat(path, sizeof(path), "sqlite/%s", info->database); + + /* Chop any filename off */ + for (size_t i = len-1; + i <= len-1; + i--) { - path[i] = '\0'; - break; + if (IsPathSepChar(path[i])) + { + path[i] = '\0'; + break; + } } - } - /* Test the full path */ - char fullpath[PLATFORM_MAX_PATH]; - g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data/%s", path); - if (!libsys->IsPathDirectory(fullpath)) - { - /* Make sure the data folder exists */ - len = g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data"); + /* Test the full path */ + g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data/%s", path); if (!libsys->IsPathDirectory(fullpath)) { - if (!libsys->CreateFolder(fullpath)) + /* Make sure the data folder exists */ + len = g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data"); + if (!libsys->IsPathDirectory(fullpath)) { - strncopy(error, "Could not create or open \"data\" folder\"", maxlength); - return NULL; + if (!libsys->CreateFolder(fullpath)) + { + strncopy(error, "Could not create or open \"data\" folder\"", maxlength); + return NULL; + } } - } - /* The data folder exists - create each subdir as needed! */ - char *cur_ptr = path; + /* The data folder exists - create each subdir as needed! */ + char *cur_ptr = path; - do - { - /* Find the next suitable path */ - char *next_ptr = cur_ptr; - while (*next_ptr != '\0') + do { - if (IsPathSepChar(*next_ptr)) + /* Find the next suitable path */ + char *next_ptr = cur_ptr; + while (*next_ptr != '\0') { - *next_ptr = '\0'; + if (IsPathSepChar(*next_ptr)) + { + *next_ptr = '\0'; + next_ptr++; + break; + } next_ptr++; + } + if (*next_ptr == '\0') + { + next_ptr = NULL; + } + len += libsys->PathFormat(&fullpath[len], sizeof(fullpath)-len, "/%s", cur_ptr); + if (!libsys->IsPathDirectory(fullpath) && !libsys->CreateFolder(fullpath)) + { break; } - next_ptr++; - } - if (*next_ptr == '\0') - { - next_ptr = NULL; - } - len += libsys->PathFormat(&fullpath[len], sizeof(fullpath)-len, "/%s", cur_ptr); - if (!libsys->IsPathDirectory(fullpath) && !libsys->CreateFolder(fullpath)) - { - break; - } - cur_ptr = next_ptr; - } while (cur_ptr); - } + cur_ptr = next_ptr; + } while (cur_ptr); + } - /* Build the FINAL path. */ - g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data/sqlite/%s.sq3", info->database); + /* Build the FINAL path. */ + g_pSM->BuildPath(Path_SM, fullpath, sizeof(fullpath), "data/sqlite/%s.sq3", info->database); + } /* If we're requesting a persistent connection, see if something is already open */ if (persistent)