Permalink
Browse files

Add support for more SQLite database open options. (#565)

* Add support for in-memory SQLite databases.

* Add support for opening SQLite databases via file URI.
  • Loading branch information...
1 parent 19db7ae commit 70d81430f8ed98d43b224603119fbf5ef7bc0cdf @psychonic psychonic committed on GitHub Dec 4, 2016
Showing with 61 additions and 49 deletions.
  1. +3 −1 extensions/sqlite/AMBuilder
  2. +58 −48 extensions/sqlite/driver/SqDriver.cpp
@@ -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']
@@ -33,6 +33,7 @@
#include "extension.h"
#include "SqDriver.h"
#include "SqDatabase.h"
+#include <am-string.h>
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)

0 comments on commit 70d8143

Please sign in to comment.