ikptr ik_sqlite3_uri_parameter (ikptr s_filename, ikptr s_param_name, ikpcb * pcb) { #ifdef HAVE_SQLITE3_URI_PARAMETER const char * filename = IK_CHARP_FROM_BYTEVECTOR_OR_POINTER_OR_MBLOCK(s_filename); const char * param_name = IK_CHARP_FROM_BYTEVECTOR_OR_POINTER_OR_MBLOCK(s_param_name); const char * rv; rv = sqlite3_uri_parameter(filename, param_name); return (rv)? ika_bytevector_from_cstring(pcb, rv) : IK_FALSE; #else feature_failure(__func__); #endif }
static int VFSAccess(sqlite3_vfs* pVfs, const char* zPath, int flags, int* pResOut) { *pResOut = 0; if (flags != SQLITE_ACCESS_EXISTS && flags != SQLITE_ACCESS_READ) return SQLITE_OK; // Allow *.db or *.sqlite as file extension. // It seems to be safe to ignore other extensions. // (the db is readonly but these extensions are -journal -wal etc. for writing purpose) if (!Wildcard::match("*.db", zPath) && !Wildcard::match("*.sqlite", zPath)) return SQLITE_OK; Ref<StreamLocator> locator; const char* packname = sqlite3_uri_parameter(zPath, "pack"); if (packname) { if (strcmp(packname, "$bundle") == 0) locator = g_Package->getBundle(); else locator = g_Package->load(packname); } else if (g_SessionService && g_Session) locator = g_Session->getPackage(); if (locator == NULL) return SQLITE_OK; Ref<StreamSource> source = locator->locate(zPath, false); if (source == NULL) return SQLITE_OK; *pResOut = 1; return SQLITE_OK; }
static int VFSOpen(sqlite3_vfs* pVfs, const char* zPath, sqlite3_file* pFile, int flags, int* pOutFlags) { const NitSqliteVFS* vfs = (NitSqliteVFS*)pVfs; DBFile* file = (DBFile*)pFile; // methods must be set to NULL, even if xOpen call fails file->methods = NULL; // Only permit readonly permission if ( zPath == NULL || (flags & SQLITE_OPEN_DELETEONCLOSE) || (flags & SQLITE_OPEN_READWRITE) || (flags & SQLITE_OPEN_CREATE) || !(flags & SQLITE_OPEN_READONLY) || !(flags & SQLITE_OPEN_MAIN_DB) ) return SQLITE_PERM; Ref<StreamLocator> locator; const char* packname = sqlite3_uri_parameter(zPath, "pack"); if (packname) { if (strcmp(packname, "$bundle") == 0) locator = g_Package->getBundle(); else locator = g_Package->load(packname); } else if (g_SessionService && g_Session) locator = g_Session->getPackage(); if (locator == NULL) { LOG(0, "*** can't find package for db path '%s'\n", zPath); return SQLITE_CANTOPEN; } Ref<StreamSource> source = locator->locate(zPath, false); if (source == NULL) { LOG(0, "*** can't find db file '%s' from '%s'\n", zPath, locator->getName().c_str()); return SQLITE_CANTOPEN; } Ref<StreamReader> reader = source->open(); if (dynamic_cast<FileReader*>(reader.get()) == NULL) { LOG(0, "?? db file '%s' is not based on a real file\n", source->getUrl().c_str()); } if (!(reader->isSized() && reader->isSeekable()) ) { LOG(0, "?? db file '%s': whole contents into memory\n", source->getUrl().c_str()); reader = new MemoryBuffer::Reader(reader); } file->reader = reader; file->size = reader->getSize(); file->locator = locator; locator->incUseCount(); file->methods = vfs->methods; if (pOutFlags) *pOutFlags = flags; return SQLITE_OK; }
DLL_FUNCTION(const char*) BU_SQLite_URI_Parameter(const char* zFilename, const char* zParam) { #pragma comment(linker, "/EXPORT:BU_SQLite_URI_Parameter=_BU_SQLite_URI_Parameter@8") return sqlite3_uri_parameter(zFilename, zParam); }