Index: SQLite.Interop/SQLite.Interop.2005.vcproj ================================================================== --- SQLite.Interop/SQLite.Interop.2005.vcproj +++ SQLite.Interop/SQLite.Interop.2005.vcproj @@ -1415,11 +1415,11 @@ Name="VCCLCompilerTool" /> @@ -1501,11 +1501,11 @@ @@ -1501,11 +1501,11 @@ true true - + true @@ -505,11 +505,11 @@ - + Index: SQLite.Interop/SQLite.Interop.2010.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.2010.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.2010.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.2012.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.2012.vcxproj +++ SQLite.Interop/SQLite.Interop.2012.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.2012.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.2012.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.2012.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.2013.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.2013.vcxproj +++ SQLite.Interop/SQLite.Interop.2013.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.2013.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.2013.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.2013.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.2015.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.2015.vcxproj +++ SQLite.Interop/SQLite.Interop.2015.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.2015.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.2015.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.2015.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.CE.2005.vcproj ================================================================== --- SQLite.Interop/SQLite.Interop.CE.2005.vcproj +++ SQLite.Interop/SQLite.Interop.CE.2005.vcproj @@ -1097,11 +1097,11 @@ Name="VCCLCompilerTool" /> @@ -1159,11 +1159,11 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > Index: SQLite.Interop/SQLite.Interop.CE.2008.vcproj ================================================================== --- SQLite.Interop/SQLite.Interop.CE.2008.vcproj +++ SQLite.Interop/SQLite.Interop.CE.2008.vcproj @@ -1097,11 +1097,11 @@ Name="VCCLCompilerTool" /> @@ -1159,11 +1159,11 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > Index: SQLite.Interop/SQLite.Interop.CE.2012.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.CE.2012.vcxproj +++ SQLite.Interop/SQLite.Interop.CE.2012.vcxproj @@ -199,11 +199,11 @@ true true - + true @@ -213,14 +213,14 @@ - + Index: SQLite.Interop/SQLite.Interop.CE.2012.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.CE.2012.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.CE.2012.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,15 +73,15 @@ Header Files Header Files - + Header Files Resource Files Index: SQLite.Interop/SQLite.Interop.Static.2005.vcproj ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2005.vcproj +++ SQLite.Interop/SQLite.Interop.Static.2005.vcproj @@ -1415,11 +1415,11 @@ Name="VCCLCompilerTool" /> @@ -1501,11 +1501,11 @@ @@ -1501,11 +1501,11 @@ true true - + true @@ -505,11 +505,11 @@ - + Index: SQLite.Interop/SQLite.Interop.Static.2010.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2010.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.Static.2010.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.Static.2012.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2012.vcxproj +++ SQLite.Interop/SQLite.Interop.Static.2012.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.Static.2012.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2012.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.Static.2012.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.Static.2013.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2013.vcxproj +++ SQLite.Interop/SQLite.Interop.Static.2013.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.Static.2013.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2013.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.Static.2013.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files Index: SQLite.Interop/SQLite.Interop.Static.2015.vcxproj ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2015.vcxproj +++ SQLite.Interop/SQLite.Interop.Static.2015.vcxproj @@ -500,11 +500,11 @@ true true - + true @@ -512,11 +512,11 @@ - + Index: SQLite.Interop/SQLite.Interop.Static.2015.vcxproj.filters ================================================================== --- SQLite.Interop/SQLite.Interop.Static.2015.vcxproj.filters +++ SQLite.Interop/SQLite.Interop.Static.2015.vcxproj.filters @@ -51,11 +51,11 @@ Source Files Source Files - + Source Files Source Files @@ -73,11 +73,11 @@ Header Files Header Files - + Header Files ADDED SQLite.Interop/src/generic/interop.c Index: SQLite.Interop/src/generic/interop.c ================================================================== --- /dev/null +++ SQLite.Interop/src/generic/interop.c @@ -0,0 +1,1184 @@ +/******************************************************** + * ADO.NET 2.0 Data Provider for SQLite Version 3.X + * Written by Robert Simpson (robert@blackcastlesoft.com) + * + * Released to the public domain, use at your own risk! + ********************************************************/ + +#ifdef _WIN32 +#define SQLITE_API __declspec(dllexport) +#else +#define WINAPI +#endif + +#include "../core/sqlite3.c" + +#if !SQLITE_OS_WIN +#include +#endif + +#if defined(INTEROP_INCLUDE_EXTRA) +#include "../ext/extra.c" +#endif + +#if defined(INTEROP_INCLUDE_CEROD) +#include "../ext/cerod.c" +#endif + +#if defined(INTEROP_INCLUDE_SEE) +#include "../ext/see.c" +#endif + +#if defined(INTEROP_INCLUDE_ZIPVFS) +#include "../ext/zipvfs.c" +#include "../ext/algorithms.c" +#endif + +#if defined(INTEROP_EXTENSION_FUNCTIONS) +#undef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE +#include "../contrib/extension-functions.c" +extern int RegisterExtensionFunctions(sqlite3 *db); +#endif + +#if defined(INTEROP_CODEC) && !defined(INTEROP_INCLUDE_SEE) +#ifdef SQLITE_ENABLE_ZIPVFS +#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c,0) +#elif SQLITE_VERSION_NUMBER > 3009002 +#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c,0) +#else +#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c) +#endif +#include "../win/crypt.c" +#endif + +#include "interop.h" + +#define INTEROP_DEBUG_NONE (0x0000) +#define INTEROP_DEBUG_CLOSE (0x0001) +#define INTEROP_DEBUG_FINALIZE (0x0002) +#define INTEROP_DEBUG_BACKUP_FINISH (0x0004) +#define INTEROP_DEBUG_OPEN (0x0008) +#define INTEROP_DEBUG_OPEN16 (0x0010) +#define INTEROP_DEBUG_PREPARE (0x0020) +#define INTEROP_DEBUG_PREPARE16 (0x0040) +#define INTEROP_DEBUG_RESET (0x0080) +#define INTEROP_DEBUG_CHANGES (0x0100) +#define INTEROP_DEBUG_BREAK (0x0200) + +#if defined(_MSC_VER) && defined(INTEROP_DEBUG) && \ + (INTEROP_DEBUG & INTEROP_DEBUG_BREAK) +#define sqlite3InteropBreak(a) { sqlite3InteropDebug("%s\n", (a)); __debugbreak(); } +#else +#define sqlite3InteropBreak(a) +#endif + +typedef void (*SQLITEUSERFUNC)(sqlite3_context *, int, sqlite3_value **); +typedef void (*SQLITEFUNCFINAL)(sqlite3_context *); + +/* +** An array of names of all compile-time options. This array should +** be sorted A-Z. +** +** This array looks large, but in a typical installation actually uses +** only a handful of compile-time options, so most times this array is usually +** rather short and uses little memory space. +*/ +static const char * const azInteropCompileOpt[] = { + +/* These macros are provided to "stringify" the value of the define +** for those options in which the value is meaningful. */ +#ifndef CTIMEOPT_VAL_ +#define CTIMEOPT_VAL_(opt) #opt +#endif + +#ifndef CTIMEOPT_VAL +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) +#endif + +#ifdef INTEROP_CODEC + "CODEC", +#endif +#ifdef INTEROP_DEBUG + "DEBUG=" CTIMEOPT_VAL(INTEROP_DEBUG), +#endif +#ifdef INTEROP_EXTENSION_FUNCTIONS + "EXTENSION_FUNCTIONS", +#endif +#ifdef INTEROP_INCLUDE_CEROD + "INCLUDE_CEROD", +#endif +#ifdef INTEROP_INCLUDE_EXTRA + "INCLUDE_EXTRA", +#endif +#ifdef INTEROP_INCLUDE_SEE + "INCLUDE_SEE", +#endif +#ifdef INTEROP_INCLUDE_ZIPVFS + "INCLUDE_ZIPVFS", +#endif +#ifdef INTEROP_JSON1_EXTENSION + "JSON1_EXTENSION", +#endif +#ifdef INTEROP_LEGACY_CLOSE + "LEGACY_CLOSE", +#endif +#ifdef INTEROP_LOG + "LOG", +#endif +#ifdef INTEROP_PERCENTILE_EXTENSION + "PERCENTILE_EXTENSION", +#endif +#ifdef INTEROP_REGEXP_EXTENSION + "REGEXP_EXTENSION", +#endif +#ifdef INTEROP_TEST_EXTENSION + "TEST_EXTENSION", +#endif +#ifdef INTEROP_TOTYPE_EXTENSION + "TOTYPE_EXTENSION", +#endif +#ifdef SQLITE_VERSION_NUMBER + "VERSION_NUMBER=" CTIMEOPT_VAL(SQLITE_VERSION_NUMBER), +#endif +#ifdef INTEROP_VIRTUAL_TABLE + "VIRTUAL_TABLE", +#endif +}; + +/* +** Given the name of a compile-time option, return true if that option +** was used and false if not. +** +** The name can optionally begin with "SQLITE_" or "INTEROP_" but those +** prefixes are not required for a match. +*/ +SQLITE_API int WINAPI interop_compileoption_used(const char *zOptName){ + int i, n; + if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + if( sqlite3StrNICmp(zOptName, "INTEROP_", 8)==0 ) zOptName += 8; + n = sqlite3Strlen30(zOptName); + + /* Since ArraySize(azInteropCompileOpt) is normally in single digits, a + ** linear search is adequate. No need for a binary search. */ + for(i=0; i=0 && N= 3008010 + sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); +#else + sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0); + acc.useMalloc = 0; +#endif +#if SQLITE_VERSION_NUMBER >= 3011000 + sqlite3VXPrintf(&acc, zFormat, ap); +#else + sqlite3VXPrintf(&acc, 0, zFormat, ap); +#endif + va_end(ap); +#if SQLITE_OS_WIN && SQLITE_VERSION_NUMBER >= 3007013 + sqlite3_win32_write_debug(sqlite3StrAccumFinish(&acc), -1); +#elif SQLITE_OS_WIN && defined(SQLITE_WIN32_HAS_ANSI) + OutputDebugStringA(sqlite3StrAccumFinish(&acc)); +#elif SQLITE_OS_WIN && defined(SQLITE_WIN32_HAS_WIDE) + { + LPWSTR zWideMsg = utf8ToUnicode(sqlite3StrAccumFinish(&acc)); + if( zWideMsg ){ + OutputDebugStringW(zWideMsg); + sqlite3_free(zWideMsg); + } + } +#else + fprintf(stderr, "%s", sqlite3StrAccumFinish(&acc)); +#endif +} +#endif + +#if defined(INTEROP_LOG) +SQLITE_PRIVATE int logConfigured = 0; + +SQLITE_PRIVATE void sqlite3InteropLogCallback(void *pArg, int iCode, const char *zMsg){ + sqlite3InteropDebug("INTEROP_LOG (%d) %s\n", iCode, zMsg); +} +#endif + +SQLITE_API int WINAPI sqlite3_malloc_size_interop(void *p){ + return sqlite3MallocSize(p); +} + +#if defined(INTEROP_LEGACY_CLOSE) || SQLITE_VERSION_NUMBER < 3007014 +SQLITE_PRIVATE void * sqlite3DbMallocZero_interop(sqlite3 *db, int n) +{ + void *p; + if (db) { + sqlite3_mutex_enter(db->mutex); + } + p = sqlite3DbMallocZero(db,n); + if (db) { + sqlite3_mutex_leave(db->mutex); + } + return p; +} + +SQLITE_PRIVATE void sqlite3DbFree_interop(sqlite3 *db, void *p) +{ + if (db) { + sqlite3_mutex_enter(db->mutex); + } + if (p) { + sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP); + } + sqlite3DbFree(db,p); + if (db) { + sqlite3_mutex_leave(db->mutex); + } +} +#endif + +/* + The goal of this version of close is different than that of sqlite3_close(), and is designed to lend itself better to .NET's non-deterministic finalizers and + the GC thread. SQLite will not close a database if statements are open on it -- but for our purposes, we'd rather finalize all active statements + and forcibly close the database. The reason is simple -- a lot of people don't Dispose() of their objects correctly and let the garbage collector + do it. This leads to unexpected behavior when a user thinks they've closed a database, but it's still open because not all the statements have + hit the GC yet. + + So, here we have a problem ... .NET has a pointer to any number of sqlite3_stmt objects. We can't call sqlite3_finalize() on these because + their memory is freed and can be used for something else. The GC thread could potentially try and call finalize again on the statement after + that memory was deallocated. BAD. So, what we need to do is make a copy of each statement, and call finalize() on the copy -- so that the original + statement's memory is preserved, and marked as BAD, but we can still manage to finalize everything and forcibly close the database. Later when the + GC gets around to calling finalize_interop() on the "bad" statement, we detect that and finish deallocating the pointer. +*/ +SQLITE_API int WINAPI sqlite3_close_interop(sqlite3 *db) +{ + int ret; +#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CLOSE) + sqlite3InteropDebug("sqlite3_close_interop(): calling sqlite3_close_v2(%p)...\n", db); +#endif + + ret = sqlite3_close_v2(db); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CLOSE) + sqlite3InteropDebug("sqlite3_close_interop(): sqlite3_close_v2(%p) returned %d.\n", db, ret); +#endif + + return ret; +#else + ret = sqlite3_close(db); + + if (ret == SQLITE_BUSY) + { + sqlite3_mutex_enter(db->mutex); + + if (!db->pVdbe) + { + sqlite3_mutex_leave(db->mutex); + return ret; + } + + while (db->pVdbe) + { + /* Make a copy of the first prepared statement */ + Vdbe *p = (Vdbe *)sqlite3DbMallocZero_interop(db, sizeof(Vdbe)); + Vdbe *po = db->pVdbe; + + if (!p) + { + ret = SQLITE_NOMEM; + break; + } + + CopyMemory(p, po, sizeof(Vdbe)); + + /* Put it on the chain so we can free it */ + db->pVdbe = p; + ret = sqlite3_finalize((sqlite3_stmt *)p); /* This will also free the copy's memory */ + if (ret) + { + /* finalize failed -- so we must put back anything we munged */ + CopyMemory(po, p, sizeof(Vdbe)); + db->pVdbe = po; + + /* + ** NOTE: Ok, we must free this block that *we* allocated (above) since + ** finalize did not do so. + */ + sqlite3DbFree_interop(db, p); + break; + } + else + { + ZeroMemory(po, sizeof(Vdbe)); + po->magic = VDBE_MAGIC_DEAD; + } + } + sqlite3_mutex_leave(db->mutex); + ret = sqlite3_close(db); + } + return ret; +#endif +} + +#if defined(INTEROP_LOG) +SQLITE_API int WINAPI sqlite3_config_log_interop() +{ + int ret; + if( !logConfigured ){ + ret = sqlite3_config(SQLITE_CONFIG_LOG, sqlite3InteropLogCallback, 0); + if( ret==SQLITE_OK ){ + logConfigured = 1; + }else{ + sqlite3InteropDebug("sqlite3_config_log_interop(): sqlite3_config(SQLITE_CONFIG_LOG) returned %d.\n", ret); + } + }else{ + ret = SQLITE_OK; + } + return ret; +} +#endif + +SQLITE_API const char *WINAPI interop_libversion(void) +{ + return INTEROP_VERSION; +} + +SQLITE_API const char *WINAPI interop_sourceid(void) +{ + return INTEROP_SOURCE_ID " " INTEROP_SOURCE_TIMESTAMP; +} + +SQLITE_API int WINAPI sqlite3_open_interop(const char *filename, const char *vfsName, int flags, int extFuncs, sqlite3 **ppdb) +{ + int ret; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN) + sqlite3InteropDebug("sqlite3_open_interop(): calling sqlite3_open_v2(\"%s\", \"%s\", %d, %d, %p)...\n", filename, vfsName, flags, extFuncs, ppdb); +#endif + + ret = sqlite3_open_v2(filename, ppdb, flags, vfsName); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN) + sqlite3InteropDebug("sqlite3_open_interop(): sqlite3_open_v2(\"%s\", \"%s\", %d, %d, %p) returned %d.\n", filename, vfsName, flags, extFuncs, ppdb, ret); +#endif + +#if defined(INTEROP_EXTENSION_FUNCTIONS) + if ((ret == SQLITE_OK) && ppdb && extFuncs) + RegisterExtensionFunctions(*ppdb); +#endif + + return ret; +} + +SQLITE_API int WINAPI sqlite3_open16_interop(const char *filename, const char *vfsName, int flags, int extFuncs, sqlite3 **ppdb) +{ + int ret; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN16) + sqlite3InteropDebug("sqlite3_open16_interop(): calling sqlite3_open_interop(\"%s\", \"%s\", %d, %d, %p)...\n", filename, vfsName, flags, extFuncs, ppdb); +#endif + + ret = sqlite3_open_interop(filename, vfsName, flags, extFuncs, ppdb); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN16) + sqlite3InteropDebug("sqlite3_open16_interop(): sqlite3_open_interop(\"%s\", \"%s\", %d, %d, %p) returned %d.\n", filename, vfsName, flags, extFuncs, ppdb, ret); +#endif + + if ((ret == SQLITE_OK) && ppdb && !DbHasProperty(*ppdb, 0, DB_SchemaLoaded)) + { + ENC(*ppdb) = SQLITE_UTF16NATIVE; + +#if SQLITE_VERSION_NUMBER >= 3008008 + // + // BUGFIX: See ticket [7c151a2f0e22804c]. + // + SCHEMA_ENC(*ppdb) = SQLITE_UTF16NATIVE; +#endif + } + + return ret; +} + +SQLITE_API const char *WINAPI sqlite3_errmsg_interop(sqlite3 *db, int *plen) +{ + const char *pval = sqlite3_errmsg(db); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API int WINAPI sqlite3_changes_interop(sqlite3 *db) +{ + int result; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CHANGES) + sqlite3InteropDebug("sqlite3_changes_interop(): calling sqlite3_changes(%p)...\n", db); +#endif + +#ifndef NDEBUG + if (!db) + sqlite3InteropBreak("null database handle for sqlite3_changes()"); +#endif + + result = sqlite3_changes(db); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CHANGES) + sqlite3InteropDebug("sqlite3_changes_interop(): sqlite3_changes(%p) returned %d.\n", db, result); +#endif + + return result; +} + +SQLITE_API int WINAPI sqlite3_prepare_interop(sqlite3 *db, const char *sql, int nbytes, sqlite3_stmt **ppstmt, const char **pztail, int *plen) +{ + int n; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE) + sqlite3InteropDebug("sqlite3_prepare_interop(): calling sqlite3_prepare(%p, \"%s\", %d, %p)...\n", db, sql, nbytes, ppstmt); +#endif + +#if SQLITE_VERSION_NUMBER >= 3003009 + n = sqlite3_prepare_v2(db, sql, nbytes, ppstmt, pztail); +#else + n = sqlite3_prepare(db, sql, nbytes, ppstmt, pztail); +#endif + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE) + sqlite3InteropDebug("sqlite3_prepare_interop(): sqlite3_prepare(%p, \"%s\", %d, %p) returned %d.\n", db, sql, nbytes, ppstmt, n); +#endif + + if (plen) *plen = (pztail && *pztail) ? strlen(*pztail) : 0; + + return n; +} + +SQLITE_API int WINAPI sqlite3_prepare16_interop(sqlite3 *db, const void *sql, int nchars, sqlite3_stmt **ppstmt, const void **pztail, int *plen) +{ + int n; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE16) + sqlite3InteropDebug("sqlite3_prepare_interop(): calling sqlite3_prepare16(%p, \"%s\", %d, %p)...\n", db, sql, nchars, ppstmt); +#endif + +#if SQLITE_VERSION_NUMBER >= 3003009 + n = sqlite3_prepare16_v2(db, sql, nchars * sizeof(wchar_t), ppstmt, pztail); +#else + n = sqlite3_prepare16(db, sql, nchars * sizeof(wchar_t), ppstmt, pztail); +#endif + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE16) + sqlite3InteropDebug("sqlite3_prepare_interop(): sqlite3_prepare16(%p, \"%s\", %d, %p) returned %d.\n", db, sql, nchars, ppstmt, n); +#endif + + if (plen) *plen = (pztail && *pztail) ? wcslen((wchar_t *)*pztail) * sizeof(wchar_t) : 0; + + return n; +} + +#if defined(INTEROP_VIRTUAL_TABLE) && SQLITE_VERSION_NUMBER >= 3004001 +#ifdef _WIN32 +__declspec(dllexport) +#endif +void *sqlite3_create_disposable_module( + sqlite3 *db, + const char *zName, + const sqlite3_module *p, + void *pClientData, + void(*xDestroy)(void*) +); /* defined in "src/ext/vtshim.c" (included below) */ + +SQLITE_API void *WINAPI sqlite3_create_disposable_module_interop( + sqlite3 *db, + const char *zName, + sqlite3_module *pModule, + int iVersion, + int (*xCreate)(sqlite3*, void *, int, const char *const*, sqlite3_vtab **, char**), + int (*xConnect)(sqlite3*, void *, int, const char *const*, sqlite3_vtab **, char**), + int (*xBestIndex)(sqlite3_vtab *, sqlite3_index_info*), + int (*xDisconnect)(sqlite3_vtab *), + int (*xDestroy)(sqlite3_vtab *), + int (*xOpen)(sqlite3_vtab *, sqlite3_vtab_cursor **), + int (*xClose)(sqlite3_vtab_cursor*), + int (*xFilter)(sqlite3_vtab_cursor*, int, const char *, int, sqlite3_value **), + int (*xNext)(sqlite3_vtab_cursor*), + int (*xEof)(sqlite3_vtab_cursor*), + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int), + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *), + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *), + int (*xBegin)(sqlite3_vtab *), + int (*xSync)(sqlite3_vtab *), + int (*xCommit)(sqlite3_vtab *), + int (*xRollback)(sqlite3_vtab *), + int (*xFindFunction)(sqlite3_vtab *, int, const char *, void (**pxFunc)(sqlite3_context*, int, sqlite3_value**), void **ppArg), + int (*xRename)(sqlite3_vtab *, const char *), + int (*xSavepoint)(sqlite3_vtab *, int), + int (*xRelease)(sqlite3_vtab *, int), + int (*xRollbackTo)(sqlite3_vtab *, int), + void *pClientData, + void(*xDestroyModule)(void*) +){ + if (!pModule) return 0; + memset(pModule, 0, sizeof(*pModule)); + pModule->iVersion = iVersion; + pModule->xCreate = xCreate; + pModule->xConnect = xConnect; + pModule->xBestIndex = xBestIndex; + pModule->xDisconnect = xDisconnect; + pModule->xDestroy = xDestroy; + pModule->xOpen = xOpen; + pModule->xClose = xClose; + pModule->xFilter = xFilter; + pModule->xNext = xNext; + pModule->xEof = xEof; + pModule->xColumn = xColumn; + pModule->xRowid = xRowid; + pModule->xUpdate = xUpdate; + pModule->xBegin = xBegin; + pModule->xSync = xSync; + pModule->xCommit = xCommit; + pModule->xRollback = xRollback; + pModule->xFindFunction = xFindFunction; + pModule->xRename = xRename; + pModule->xSavepoint = xSavepoint; + pModule->xRelease = xRelease; + pModule->xRollbackTo = xRollbackTo; + return sqlite3_create_disposable_module(db, zName, pModule, pClientData, xDestroyModule); +} +#endif + +SQLITE_API int WINAPI sqlite3_bind_double_interop(sqlite3_stmt *stmt, int iCol, double *val) +{ + if (!val) return SQLITE_ERROR; + return sqlite3_bind_double(stmt,iCol,*val); +} + +SQLITE_API int WINAPI sqlite3_bind_int64_interop(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val) +{ + if (!val) return SQLITE_ERROR; + return sqlite3_bind_int64(stmt,iCol,*val); +} + +SQLITE_API const char * WINAPI sqlite3_bind_parameter_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_bind_parameter_name(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const char * WINAPI sqlite3_column_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_column_name(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_name16(stmt, iCol); + if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; + return pval; +} + +SQLITE_API const char * WINAPI sqlite3_column_decltype_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_column_decltype(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_decltype16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_decltype16(stmt, iCol); + if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; + return pval; +} + +SQLITE_API void WINAPI sqlite3_column_double_interop(sqlite3_stmt *stmt, int iCol, double *val) +{ + if (!val) return; + *val = sqlite3_column_double(stmt,iCol); +} + +SQLITE_API void WINAPI sqlite3_column_int64_interop(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val) +{ + if (!val) return; + *val = sqlite3_column_int64(stmt,iCol); +} + +SQLITE_API void WINAPI sqlite3_last_insert_rowid_interop(sqlite3 *db, sqlite_int64 *rowId) +{ + if (!rowId) return; + *rowId = sqlite3_last_insert_rowid(db); +} + +SQLITE_API void WINAPI sqlite3_memory_used_interop(sqlite_int64 *nBytes) +{ + if (!nBytes) return; + *nBytes = sqlite3_memory_used(); +} + +SQLITE_API void WINAPI sqlite3_memory_highwater_interop(int resetFlag, sqlite_int64 *nBytes) +{ + if (!nBytes) return; + *nBytes = sqlite3_memory_highwater(resetFlag); +} + +SQLITE_API const unsigned char * WINAPI sqlite3_column_text_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const unsigned char *pval = sqlite3_column_text(stmt, iCol); + if (plen) *plen = sqlite3_column_bytes(stmt, iCol); + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_text16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_text16(stmt, iCol); + if (plen) *plen = sqlite3_column_bytes16(stmt, iCol); + return pval; +} + +SQLITE_API int WINAPI sqlite3_finalize_interop(sqlite3_stmt *stmt) +{ + int ret; +#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_FINALIZE) + Vdbe *p = (Vdbe *)stmt; + sqlite3 *db = p ? p->db : 0; + sqlite3InteropDebug("sqlite3_finalize_interop(): calling sqlite3_finalize(%p, %p)...\n", db, stmt); +#endif + + ret = sqlite3_finalize(stmt); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_FINALIZE) + sqlite3InteropDebug("sqlite3_finalize_interop(): sqlite3_finalize(%p, %p) returned %d.\n", db, stmt, ret); +#endif + + return ret; +#else + Vdbe *p; + ret = SQLITE_OK; + + p = (Vdbe *)stmt; + if (p) + { + sqlite3 *db = p->db; + + if (db != NULL) + sqlite3_mutex_enter(db->mutex); + + if ((p->magic == VDBE_MAGIC_DEAD) && (db == NULL)) + { + sqlite3DbFree_interop(db, p); + } + else + { + ret = sqlite3_finalize(stmt); + } + + if (db != NULL) + sqlite3_mutex_leave(db->mutex); + } + + return ret; +#endif +} + +SQLITE_API int WINAPI sqlite3_backup_finish_interop(sqlite3_backup *p) +{ + int ret; + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_BACKUP_FINISH) + sqlite3* pDestDb = p ? p->pDestDb : 0; + sqlite3* pSrcDb = p ? p->pSrcDb : 0; + sqlite3InteropDebug("sqlite3_backup_finish_interop(): calling sqlite3_backup_finish(%p, %p, %p)...\n", pDestDb, pSrcDb, p); +#endif + + ret = sqlite3_backup_finish(p); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_BACKUP_FINISH) + sqlite3InteropDebug("sqlite3_backup_finish_interop(): sqlite3_backup_finish(%p, %p, %p) returned %d.\n", pDestDb, pSrcDb, p, ret); +#endif + + return ret; +} + +SQLITE_API int WINAPI sqlite3_reset_interop(sqlite3_stmt *stmt) +{ + int ret; +#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_RESET) + sqlite3InteropDebug("sqlite3_reset_interop(): calling sqlite3_reset(%p)...\n", stmt); +#endif + + ret = sqlite3_reset(stmt); + +#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_RESET) + sqlite3InteropDebug("sqlite3_reset_interop(): sqlite3_reset(%p) returned %d.\n", stmt, ret); +#endif + + return ret; +#else + if (stmt && ((Vdbe *)stmt)->magic == VDBE_MAGIC_DEAD) return SQLITE_SCHEMA; + ret = sqlite3_reset(stmt); + return ret; +#endif +} + +SQLITE_API int WINAPI sqlite3_create_function_interop(sqlite3 *psql, const char *zFunctionName, int nArg, int eTextRep, void *pvUser, SQLITEUSERFUNC func, SQLITEUSERFUNC funcstep, SQLITEFUNCFINAL funcfinal, int needCollSeq) +{ + int n; + + if (eTextRep == SQLITE_UTF16) + eTextRep = SQLITE_UTF16NATIVE; + + n = sqlite3_create_function(psql, zFunctionName, nArg, eTextRep, pvUser, func, funcstep, funcfinal); + if (n == SQLITE_OK) + { + if (needCollSeq) + { + FuncDef *pFunc = sqlite3FindFunction(psql, zFunctionName, strlen(zFunctionName), nArg, eTextRep, 0); + if( pFunc ) + { +#if SQLITE_VERSION_NUMBER >= 3008001 + pFunc->funcFlags |= SQLITE_FUNC_NEEDCOLL; +#else + pFunc->flags |= SQLITE_FUNC_NEEDCOLL; +#endif + } + } + } + + return n; +} + +SQLITE_API void WINAPI sqlite3_value_double_interop(sqlite3_value *pval, double *val) +{ + if (!val) return; + *val = sqlite3_value_double(pval); +} + +SQLITE_API void WINAPI sqlite3_value_int64_interop(sqlite3_value *pval, sqlite_int64 *val) +{ + if (!val) return; + *val = sqlite3_value_int64(pval); +} + +SQLITE_API const unsigned char * WINAPI sqlite3_value_text_interop(sqlite3_value *val, int *plen) +{ + const unsigned char *pval = sqlite3_value_text(val); + if (plen) *plen = sqlite3_value_bytes(val); + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_value_text16_interop(sqlite3_value *val, int *plen) +{ + const void *pval = sqlite3_value_text16(val); + if (plen) *plen = sqlite3_value_bytes16(val); + return pval; +} + +SQLITE_API void WINAPI sqlite3_result_double_interop(sqlite3_context *pctx, double *val) +{ + if (!val) return; + sqlite3_result_double(pctx, *val); +} + +SQLITE_API void WINAPI sqlite3_result_int64_interop(sqlite3_context *pctx, sqlite_int64 *val) +{ + if (!val) return; + sqlite3_result_int64(pctx, *val); +} + +SQLITE_API int WINAPI sqlite3_context_collcompare_interop(sqlite3_context *ctx, const void *p1, int p1len, const void *p2, int p2len) +{ +#if SQLITE_VERSION_NUMBER >= 3008007 + CollSeq *pColl = ctx ? sqlite3GetFuncCollSeq(ctx) : 0; +#else + CollSeq *pColl = ctx ? ctx->pColl : 0; +#endif + if (!ctx || !ctx->pFunc) return 4; /* ERROR */ + if (!pColl || !pColl->xCmp) return 3; /* ERROR */ +#if SQLITE_VERSION_NUMBER >= 3008001 + if ((ctx->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) == 0) return 2; /* ERROR */ +#else + if ((ctx->pFunc->flags & SQLITE_FUNC_NEEDCOLL) == 0) return 2; /* ERROR */ +#endif + return pColl->xCmp(pColl->pUser, p1len, p1, p2len, p2); +} + +SQLITE_API const char * WINAPI sqlite3_context_collseq_interop(sqlite3_context *ctx, int *ptype, int *enc, int *plen) +{ +#if SQLITE_VERSION_NUMBER >= 3008007 + CollSeq *pColl = ctx ? sqlite3GetFuncCollSeq(ctx) : 0; +#else + CollSeq *pColl = ctx ? ctx->pColl : 0; +#endif + if (ptype) *ptype = 0; + if (plen) *plen = 0; + if (enc) *enc = 0; + + if (!ctx || !ctx->pFunc) return NULL; +#if SQLITE_VERSION_NUMBER >= 3008001 + if ((ctx->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) == 0) return NULL; +#else + if ((ctx->pFunc->flags & SQLITE_FUNC_NEEDCOLL) == 0) return NULL; +#endif + + if (pColl) + { + if (enc) *enc = pColl->enc; +#if SQLITE_VERSION_NUMBER < 3007010 + if (ptype) *ptype = pColl->type; +#endif + if (plen) *plen = pColl->zName ? strlen(pColl->zName) : 0; + + return pColl->zName; + } + return NULL; +} + +SQLITE_API const char * WINAPI sqlite3_column_database_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_column_database_name(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_database_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_database_name16(stmt, iCol); + if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; + return pval; +} + +SQLITE_API const char * WINAPI sqlite3_column_table_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_column_table_name(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_table_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_table_name16(stmt, iCol); + if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; + return pval; +} + +SQLITE_API const char * WINAPI sqlite3_column_origin_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const char *pval = sqlite3_column_origin_name(stmt, iCol); + if (plen) *plen = pval ? strlen(pval) : 0; + return pval; +} + +SQLITE_API const void * WINAPI sqlite3_column_origin_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) +{ + const void *pval = sqlite3_column_origin_name16(stmt, iCol); + if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; + return pval; +} + +SQLITE_API int WINAPI sqlite3_table_column_metadata_interop(sqlite3 *db, const char *zDbName, const char *zTableName, const char *zColumnName, char const **pzDataType, char const **pzCollSeq, int *pNotNull, int *pPrimaryKey, int *pAutoinc, int *pdtLen, int *pcsLen) +{ + int n; + + n = sqlite3_table_column_metadata(db, zDbName, zTableName, zColumnName, pzDataType, pzCollSeq, pNotNull, pPrimaryKey, pAutoinc); + + if (pdtLen) *pdtLen = (pzDataType && *pzDataType) ? strlen(*pzDataType) : 0; + if (pcsLen) *pcsLen = (pzCollSeq && *pzCollSeq) ? strlen(*pzCollSeq) : 0; + + return n; +} + +SQLITE_API int WINAPI sqlite3_index_column_info_interop(sqlite3 *db, const char *zDb, const char *zIndexName, const char *zColumnName, int *sortOrder, int *onError, const char **pzColl, int *plen) +{ + Index *pIdx; + Table *pTab; + int n; + + if (!db) return SQLITE_ERROR; + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + + pIdx = sqlite3FindIndex(db, zIndexName, zDb); + + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + + if (!pIdx) return SQLITE_ERROR; + + pTab = pIdx->pTable; + for (n = 0; n < pIdx->nColumn; n++) + { + int cnum = pIdx->aiColumn[n]; + if (sqlite3StrICmp(pTab->aCol[cnum].zName, zColumnName) == 0) + { + if ( sortOrder ) *sortOrder = pIdx->aSortOrder[n]; + if ( pzColl ) *pzColl = pIdx->azColl[n]; + if ( plen ) *plen = strlen(*pzColl); + if ( onError ) *onError = pIdx->onError; + + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +SQLITE_API int WINAPI sqlite3_table_cursor_interop(sqlite3_stmt *pstmt, int iDb, Pgno tableRootPage) +{ + Vdbe *p = (Vdbe *)pstmt; + sqlite3 *db = (p == NULL) ? NULL : p->db; + int n; + int ret = -1; /* NOT FOUND */ + + if (!p || !db) return ret; + sqlite3_mutex_enter(db->mutex); + for (n = 0; n < p->nCursor && p->apCsr[n] != NULL; n++) + { + if (p->apCsr[n]->isTable == 0) continue; + if (p->apCsr[n]->iDb != iDb) continue; +#if SQLITE_VERSION_NUMBER >= 3010000 + if (p->apCsr[n]->uc.pCursor->pgnoRoot == tableRootPage) +#else + if (p->apCsr[n]->pCursor->pgnoRoot == tableRootPage) +#endif + { + ret = n; + break; + } + } + sqlite3_mutex_leave(db->mutex); + + return ret; +} + +SQLITE_API int WINAPI sqlite3_cursor_rowid_interop(sqlite3_stmt *pstmt, int cursor, sqlite_int64 *prowid) +{ + Vdbe *p = (Vdbe *)pstmt; + sqlite3 *db = (p == NULL) ? NULL : p->db; + VdbeCursor *pC; +#if SQLITE_VERSION_NUMBER >= 3011000 + int p2 = 0; +#endif + int ret = SQLITE_OK; + + if (!p || !db) return SQLITE_ERROR; + sqlite3_mutex_enter(db->mutex); + while (1) + { + if (cursor < 0 || cursor >= p->nCursor) + { + ret = SQLITE_ERROR; + break; + } + if (p->apCsr[cursor] == NULL) + { + ret = SQLITE_ERROR; + break; + } + + pC = p->apCsr[cursor]; + +#if SQLITE_VERSION_NUMBER >= 3011000 + ret = sqlite3VdbeCursorMoveto(&pC, &p2); +#else + ret = sqlite3VdbeCursorMoveto(pC); +#endif + if(ret) + break; + +#if SQLITE_VERSION_NUMBER < 3008007 + if(pC->rowidIsValid) + { + if (prowid) *prowid = pC->lastRowid; + } + else +#endif +#if SQLITE_VERSION_NUMBER >= 3010000 + if(pC->uc.pseudoTableReg > 0) +#else + if(pC->pseudoTableReg > 0) +#endif + { + ret = SQLITE_ERROR; + break; + } +#if SQLITE_VERSION_NUMBER >= 3010000 + else if(pC->nullRow || pC->uc.pCursor==0) +#else + else if(pC->nullRow || pC->pCursor==0) +#endif + { + ret = SQLITE_ERROR; + break; + } + else + { +#if SQLITE_VERSION_NUMBER >= 3010000 + if (pC->uc.pCursor == NULL) +#else + if (pC->pCursor == NULL) +#endif + { + ret = SQLITE_ERROR; + break; + } +#if SQLITE_VERSION_NUMBER >= 3010000 + sqlite3BtreeKeySize(pC->uc.pCursor, prowid); +#else + sqlite3BtreeKeySize(pC->pCursor, prowid); +#endif + if (prowid) *prowid = *prowid; + } + break; + } + sqlite3_mutex_leave(db->mutex); + + return ret; +} + +/*****************************************************************************/ + +#if defined(SQLITE_CORE) +#undef SQLITE_CORE +#endif + +#if defined(INTEROP_VIRTUAL_TABLE) && SQLITE_VERSION_NUMBER >= 3004001 +#include "../ext/vtshim.c" +#endif + +#if defined(INTEROP_FTS5_EXTENSION) +#include "../ext/fts5.c" +#endif + +#if defined(INTEROP_JSON1_EXTENSION) +#include "../ext/json1.c" +#endif + +#if defined(INTEROP_PERCENTILE_EXTENSION) +#include "../ext/percentile.c" +#endif + +#if defined(INTEROP_REGEXP_EXTENSION) +#include "../ext/regexp.c" +#endif + +#if defined(INTEROP_TOTYPE_EXTENSION) +#include "../ext/totype.c" +#endif + +/*****************************************************************************/ + +/* +** The INTEROP_TEST_EXTENSION block must be at the end of this source file +** because it includes the "sqlite3ext.h" file, which defines the sqlite3 +** public API function names to be macros and that would cause the code +** above this point to malfunction. +*/ +#if defined(INTEROP_TEST_EXTENSION) +#if !SQLITE_OS_WIN +#include +#endif + +#include "../core/sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + +/* +** The interopTest() SQL function returns its first argument or raises an +** error if there are not enough arguments. +*/ +SQLITE_PRIVATE void interopTestFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z; + if( argc!=1 ){ + sqlite3_result_error(context, "need exactly one argument", -1); + return; + } + z = sqlite3_value_text(argv[0]); + if( z ){ + sqlite3_result_text(context, (char*)z, -1, SQLITE_STATIC); + }else{ + sqlite3_result_null(context); + } +} + +/* +** The interopSleep() SQL function waits the specified number of milliseconds +** or raises an error if there are not enough arguments. +*/ +SQLITE_PRIVATE void interopSleepFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int m; + if( argc!=1 ){ + sqlite3_result_error(context, "need exactly one argument", -1); + return; + } + m = sqlite3_value_int(argv[0]); +#if SQLITE_OS_WIN +#if SQLITE_OS_WINCE + Sleep(m); + sqlite3_result_int(context, WAIT_OBJECT_0); +#else + sqlite3_result_int(context, SleepEx(m, TRUE)); +#endif +#else + if( m>0 ){ + sqlite3_result_int64(context, sleep((unsigned)m)); + }else{ + sqlite3_result_null(context); + } +#endif +} + +/* SQLite invokes this routine once when it loads the extension. +** Create new functions, collating sequences, and virtual table +** modules here. This is usually the only exported symbol in +** the shared library. +*/ +SQLITE_API int interop_test_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc; + SQLITE_EXTENSION_INIT2(pApi) + rc = sqlite3_create_function(db, "interopTest", -1, SQLITE_ANY, 0, + interopTestFunc, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "interopSleep", 1, SQLITE_ANY, 0, + interopSleepFunc, 0, 0); + } + return rc; +} +#endif /* SQLITE_OS_WIN */ ADDED SQLite.Interop/src/generic/interop.h Index: SQLite.Interop/src/generic/interop.h ================================================================== --- /dev/null +++ SQLite.Interop/src/generic/interop.h @@ -0,0 +1,18 @@ +/* + * interop.h - + * + * Written by Joe Mistachkin. + * Released to the public domain, use at your own risk! + */ + +#ifndef INTEROP_VERSION +#define INTEROP_VERSION "1.0.100.0" +#endif + +#ifndef INTEROP_SOURCE_ID +#define INTEROP_SOURCE_ID "0000000000000000000000000000000000000000" +#endif + +#ifndef INTEROP_SOURCE_TIMESTAMP +#define INTEROP_SOURCE_TIMESTAMP "0000-00-00 00:00:00 UTC" +#endif Index: SQLite.Interop/src/win/AssemblyInfo.cpp ================================================================== --- SQLite.Interop/src/win/AssemblyInfo.cpp +++ SQLite.Interop/src/win/AssemblyInfo.cpp @@ -7,11 +7,11 @@ using namespace System::Reflection; using namespace System::Resources; using namespace System::Runtime::InteropServices; -#include "interop.h" +#include "../generic/interop.h" [assembly:AssemblyTitleAttribute("SQLite.Interop")]; [assembly:AssemblyCompanyAttribute("https://system.data.sqlite.org/")]; [assembly:AssemblyDescriptionAttribute("System.Data.SQLite Interop Assembly")]; [assembly:AssemblyProductAttribute("System.Data.SQLite")]; Index: SQLite.Interop/src/win/SQLite.Interop.rc ================================================================== --- SQLite.Interop/src/win/SQLite.Interop.rc +++ SQLite.Interop/src/win/SQLite.Interop.rc @@ -14,11 +14,11 @@ #if !defined(VS_FF_NONE) # define VS_FF_NONE 0x00000000L #endif /* !defined(VS_FF_NONE) */ #include "..\core\sqlite3.h" -#include "interop.h" +#include "..\generic\interop.h" /* ** English (U.S.) resources */ DELETED SQLite.Interop/src/win/interop.c Index: SQLite.Interop/src/win/interop.c ================================================================== --- SQLite.Interop/src/win/interop.c +++ /dev/null @@ -1,1184 +0,0 @@ -/******************************************************** - * ADO.NET 2.0 Data Provider for SQLite Version 3.X - * Written by Robert Simpson (robert@blackcastlesoft.com) - * - * Released to the public domain, use at your own risk! - ********************************************************/ - -#ifdef _WIN32 -#define SQLITE_API __declspec(dllexport) -#else -#define WINAPI -#endif - -#include "../core/sqlite3.c" - -#if !SQLITE_OS_WIN -#include -#endif - -#if defined(INTEROP_INCLUDE_EXTRA) -#include "../ext/extra.c" -#endif - -#if defined(INTEROP_INCLUDE_CEROD) -#include "../ext/cerod.c" -#endif - -#if defined(INTEROP_INCLUDE_SEE) -#include "../ext/see.c" -#endif - -#if defined(INTEROP_INCLUDE_ZIPVFS) -#include "../ext/zipvfs.c" -#include "../ext/algorithms.c" -#endif - -#if defined(INTEROP_EXTENSION_FUNCTIONS) -#undef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE -#include "../contrib/extension-functions.c" -extern int RegisterExtensionFunctions(sqlite3 *db); -#endif - -#if defined(INTEROP_CODEC) && !defined(INTEROP_INCLUDE_SEE) -#ifdef SQLITE_ENABLE_ZIPVFS -#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c,0) -#elif SQLITE_VERSION_NUMBER > 3009002 -#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c,0) -#else -#define INTEROP_CODEC_GET_PAGER(a,b,c) sqlite3PagerGet(a,b,c) -#endif -#include "crypt.c" -#endif - -#include "interop.h" - -#define INTEROP_DEBUG_NONE (0x0000) -#define INTEROP_DEBUG_CLOSE (0x0001) -#define INTEROP_DEBUG_FINALIZE (0x0002) -#define INTEROP_DEBUG_BACKUP_FINISH (0x0004) -#define INTEROP_DEBUG_OPEN (0x0008) -#define INTEROP_DEBUG_OPEN16 (0x0010) -#define INTEROP_DEBUG_PREPARE (0x0020) -#define INTEROP_DEBUG_PREPARE16 (0x0040) -#define INTEROP_DEBUG_RESET (0x0080) -#define INTEROP_DEBUG_CHANGES (0x0100) -#define INTEROP_DEBUG_BREAK (0x0200) - -#if defined(_MSC_VER) && defined(INTEROP_DEBUG) && \ - (INTEROP_DEBUG & INTEROP_DEBUG_BREAK) -#define sqlite3InteropBreak(a) { sqlite3InteropDebug("%s\n", (a)); __debugbreak(); } -#else -#define sqlite3InteropBreak(a) -#endif - -typedef void (*SQLITEUSERFUNC)(sqlite3_context *, int, sqlite3_value **); -typedef void (*SQLITEFUNCFINAL)(sqlite3_context *); - -/* -** An array of names of all compile-time options. This array should -** be sorted A-Z. -** -** This array looks large, but in a typical installation actually uses -** only a handful of compile-time options, so most times this array is usually -** rather short and uses little memory space. -*/ -static const char * const azInteropCompileOpt[] = { - -/* These macros are provided to "stringify" the value of the define -** for those options in which the value is meaningful. */ -#ifndef CTIMEOPT_VAL_ -#define CTIMEOPT_VAL_(opt) #opt -#endif - -#ifndef CTIMEOPT_VAL -#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) -#endif - -#ifdef INTEROP_CODEC - "CODEC", -#endif -#ifdef INTEROP_DEBUG - "DEBUG=" CTIMEOPT_VAL(INTEROP_DEBUG), -#endif -#ifdef INTEROP_EXTENSION_FUNCTIONS - "EXTENSION_FUNCTIONS", -#endif -#ifdef INTEROP_INCLUDE_CEROD - "INCLUDE_CEROD", -#endif -#ifdef INTEROP_INCLUDE_EXTRA - "INCLUDE_EXTRA", -#endif -#ifdef INTEROP_INCLUDE_SEE - "INCLUDE_SEE", -#endif -#ifdef INTEROP_INCLUDE_ZIPVFS - "INCLUDE_ZIPVFS", -#endif -#ifdef INTEROP_JSON1_EXTENSION - "JSON1_EXTENSION", -#endif -#ifdef INTEROP_LEGACY_CLOSE - "LEGACY_CLOSE", -#endif -#ifdef INTEROP_LOG - "LOG", -#endif -#ifdef INTEROP_PERCENTILE_EXTENSION - "PERCENTILE_EXTENSION", -#endif -#ifdef INTEROP_REGEXP_EXTENSION - "REGEXP_EXTENSION", -#endif -#ifdef INTEROP_TEST_EXTENSION - "TEST_EXTENSION", -#endif -#ifdef INTEROP_TOTYPE_EXTENSION - "TOTYPE_EXTENSION", -#endif -#ifdef SQLITE_VERSION_NUMBER - "VERSION_NUMBER=" CTIMEOPT_VAL(SQLITE_VERSION_NUMBER), -#endif -#ifdef INTEROP_VIRTUAL_TABLE - "VIRTUAL_TABLE", -#endif -}; - -/* -** Given the name of a compile-time option, return true if that option -** was used and false if not. -** -** The name can optionally begin with "SQLITE_" or "INTEROP_" but those -** prefixes are not required for a match. -*/ -SQLITE_API int WINAPI interop_compileoption_used(const char *zOptName){ - int i, n; - if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; - if( sqlite3StrNICmp(zOptName, "INTEROP_", 8)==0 ) zOptName += 8; - n = sqlite3Strlen30(zOptName); - - /* Since ArraySize(azInteropCompileOpt) is normally in single digits, a - ** linear search is adequate. No need for a binary search. */ - for(i=0; i=0 && N= 3008010 - sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); -#else - sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0); - acc.useMalloc = 0; -#endif -#if SQLITE_VERSION_NUMBER >= 3011000 - sqlite3VXPrintf(&acc, zFormat, ap); -#else - sqlite3VXPrintf(&acc, 0, zFormat, ap); -#endif - va_end(ap); -#if SQLITE_OS_WIN && SQLITE_VERSION_NUMBER >= 3007013 - sqlite3_win32_write_debug(sqlite3StrAccumFinish(&acc), -1); -#elif SQLITE_OS_WIN && defined(SQLITE_WIN32_HAS_ANSI) - OutputDebugStringA(sqlite3StrAccumFinish(&acc)); -#elif SQLITE_OS_WIN && defined(SQLITE_WIN32_HAS_WIDE) - { - LPWSTR zWideMsg = utf8ToUnicode(sqlite3StrAccumFinish(&acc)); - if( zWideMsg ){ - OutputDebugStringW(zWideMsg); - sqlite3_free(zWideMsg); - } - } -#else - fprintf(stderr, "%s", sqlite3StrAccumFinish(&acc)); -#endif -} -#endif - -#if defined(INTEROP_LOG) -SQLITE_PRIVATE int logConfigured = 0; - -SQLITE_PRIVATE void sqlite3InteropLogCallback(void *pArg, int iCode, const char *zMsg){ - sqlite3InteropDebug("INTEROP_LOG (%d) %s\n", iCode, zMsg); -} -#endif - -SQLITE_API int WINAPI sqlite3_malloc_size_interop(void *p){ - return sqlite3MallocSize(p); -} - -#if defined(INTEROP_LEGACY_CLOSE) || SQLITE_VERSION_NUMBER < 3007014 -SQLITE_PRIVATE void * sqlite3DbMallocZero_interop(sqlite3 *db, int n) -{ - void *p; - if (db) { - sqlite3_mutex_enter(db->mutex); - } - p = sqlite3DbMallocZero(db,n); - if (db) { - sqlite3_mutex_leave(db->mutex); - } - return p; -} - -SQLITE_PRIVATE void sqlite3DbFree_interop(sqlite3 *db, void *p) -{ - if (db) { - sqlite3_mutex_enter(db->mutex); - } - if (p) { - sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP); - } - sqlite3DbFree(db,p); - if (db) { - sqlite3_mutex_leave(db->mutex); - } -} -#endif - -/* - The goal of this version of close is different than that of sqlite3_close(), and is designed to lend itself better to .NET's non-deterministic finalizers and - the GC thread. SQLite will not close a database if statements are open on it -- but for our purposes, we'd rather finalize all active statements - and forcibly close the database. The reason is simple -- a lot of people don't Dispose() of their objects correctly and let the garbage collector - do it. This leads to unexpected behavior when a user thinks they've closed a database, but it's still open because not all the statements have - hit the GC yet. - - So, here we have a problem ... .NET has a pointer to any number of sqlite3_stmt objects. We can't call sqlite3_finalize() on these because - their memory is freed and can be used for something else. The GC thread could potentially try and call finalize again on the statement after - that memory was deallocated. BAD. So, what we need to do is make a copy of each statement, and call finalize() on the copy -- so that the original - statement's memory is preserved, and marked as BAD, but we can still manage to finalize everything and forcibly close the database. Later when the - GC gets around to calling finalize_interop() on the "bad" statement, we detect that and finish deallocating the pointer. -*/ -SQLITE_API int WINAPI sqlite3_close_interop(sqlite3 *db) -{ - int ret; -#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CLOSE) - sqlite3InteropDebug("sqlite3_close_interop(): calling sqlite3_close_v2(%p)...\n", db); -#endif - - ret = sqlite3_close_v2(db); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CLOSE) - sqlite3InteropDebug("sqlite3_close_interop(): sqlite3_close_v2(%p) returned %d.\n", db, ret); -#endif - - return ret; -#else - ret = sqlite3_close(db); - - if (ret == SQLITE_BUSY) - { - sqlite3_mutex_enter(db->mutex); - - if (!db->pVdbe) - { - sqlite3_mutex_leave(db->mutex); - return ret; - } - - while (db->pVdbe) - { - /* Make a copy of the first prepared statement */ - Vdbe *p = (Vdbe *)sqlite3DbMallocZero_interop(db, sizeof(Vdbe)); - Vdbe *po = db->pVdbe; - - if (!p) - { - ret = SQLITE_NOMEM; - break; - } - - CopyMemory(p, po, sizeof(Vdbe)); - - /* Put it on the chain so we can free it */ - db->pVdbe = p; - ret = sqlite3_finalize((sqlite3_stmt *)p); /* This will also free the copy's memory */ - if (ret) - { - /* finalize failed -- so we must put back anything we munged */ - CopyMemory(po, p, sizeof(Vdbe)); - db->pVdbe = po; - - /* - ** NOTE: Ok, we must free this block that *we* allocated (above) since - ** finalize did not do so. - */ - sqlite3DbFree_interop(db, p); - break; - } - else - { - ZeroMemory(po, sizeof(Vdbe)); - po->magic = VDBE_MAGIC_DEAD; - } - } - sqlite3_mutex_leave(db->mutex); - ret = sqlite3_close(db); - } - return ret; -#endif -} - -#if defined(INTEROP_LOG) -SQLITE_API int WINAPI sqlite3_config_log_interop() -{ - int ret; - if( !logConfigured ){ - ret = sqlite3_config(SQLITE_CONFIG_LOG, sqlite3InteropLogCallback, 0); - if( ret==SQLITE_OK ){ - logConfigured = 1; - }else{ - sqlite3InteropDebug("sqlite3_config_log_interop(): sqlite3_config(SQLITE_CONFIG_LOG) returned %d.\n", ret); - } - }else{ - ret = SQLITE_OK; - } - return ret; -} -#endif - -SQLITE_API const char *WINAPI interop_libversion(void) -{ - return INTEROP_VERSION; -} - -SQLITE_API const char *WINAPI interop_sourceid(void) -{ - return INTEROP_SOURCE_ID " " INTEROP_SOURCE_TIMESTAMP; -} - -SQLITE_API int WINAPI sqlite3_open_interop(const char *filename, const char *vfsName, int flags, int extFuncs, sqlite3 **ppdb) -{ - int ret; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN) - sqlite3InteropDebug("sqlite3_open_interop(): calling sqlite3_open_v2(\"%s\", \"%s\", %d, %d, %p)...\n", filename, vfsName, flags, extFuncs, ppdb); -#endif - - ret = sqlite3_open_v2(filename, ppdb, flags, vfsName); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN) - sqlite3InteropDebug("sqlite3_open_interop(): sqlite3_open_v2(\"%s\", \"%s\", %d, %d, %p) returned %d.\n", filename, vfsName, flags, extFuncs, ppdb, ret); -#endif - -#if defined(INTEROP_EXTENSION_FUNCTIONS) - if ((ret == SQLITE_OK) && ppdb && extFuncs) - RegisterExtensionFunctions(*ppdb); -#endif - - return ret; -} - -SQLITE_API int WINAPI sqlite3_open16_interop(const char *filename, const char *vfsName, int flags, int extFuncs, sqlite3 **ppdb) -{ - int ret; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN16) - sqlite3InteropDebug("sqlite3_open16_interop(): calling sqlite3_open_interop(\"%s\", \"%s\", %d, %d, %p)...\n", filename, vfsName, flags, extFuncs, ppdb); -#endif - - ret = sqlite3_open_interop(filename, vfsName, flags, extFuncs, ppdb); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_OPEN16) - sqlite3InteropDebug("sqlite3_open16_interop(): sqlite3_open_interop(\"%s\", \"%s\", %d, %d, %p) returned %d.\n", filename, vfsName, flags, extFuncs, ppdb, ret); -#endif - - if ((ret == SQLITE_OK) && ppdb && !DbHasProperty(*ppdb, 0, DB_SchemaLoaded)) - { - ENC(*ppdb) = SQLITE_UTF16NATIVE; - -#if SQLITE_VERSION_NUMBER >= 3008008 - // - // BUGFIX: See ticket [7c151a2f0e22804c]. - // - SCHEMA_ENC(*ppdb) = SQLITE_UTF16NATIVE; -#endif - } - - return ret; -} - -SQLITE_API const char *WINAPI sqlite3_errmsg_interop(sqlite3 *db, int *plen) -{ - const char *pval = sqlite3_errmsg(db); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API int WINAPI sqlite3_changes_interop(sqlite3 *db) -{ - int result; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CHANGES) - sqlite3InteropDebug("sqlite3_changes_interop(): calling sqlite3_changes(%p)...\n", db); -#endif - -#ifndef NDEBUG - if (!db) - sqlite3InteropBreak("null database handle for sqlite3_changes()"); -#endif - - result = sqlite3_changes(db); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_CHANGES) - sqlite3InteropDebug("sqlite3_changes_interop(): sqlite3_changes(%p) returned %d.\n", db, result); -#endif - - return result; -} - -SQLITE_API int WINAPI sqlite3_prepare_interop(sqlite3 *db, const char *sql, int nbytes, sqlite3_stmt **ppstmt, const char **pztail, int *plen) -{ - int n; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE) - sqlite3InteropDebug("sqlite3_prepare_interop(): calling sqlite3_prepare(%p, \"%s\", %d, %p)...\n", db, sql, nbytes, ppstmt); -#endif - -#if SQLITE_VERSION_NUMBER >= 3003009 - n = sqlite3_prepare_v2(db, sql, nbytes, ppstmt, pztail); -#else - n = sqlite3_prepare(db, sql, nbytes, ppstmt, pztail); -#endif - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE) - sqlite3InteropDebug("sqlite3_prepare_interop(): sqlite3_prepare(%p, \"%s\", %d, %p) returned %d.\n", db, sql, nbytes, ppstmt, n); -#endif - - if (plen) *plen = (pztail && *pztail) ? strlen(*pztail) : 0; - - return n; -} - -SQLITE_API int WINAPI sqlite3_prepare16_interop(sqlite3 *db, const void *sql, int nchars, sqlite3_stmt **ppstmt, const void **pztail, int *plen) -{ - int n; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE16) - sqlite3InteropDebug("sqlite3_prepare_interop(): calling sqlite3_prepare16(%p, \"%s\", %d, %p)...\n", db, sql, nchars, ppstmt); -#endif - -#if SQLITE_VERSION_NUMBER >= 3003009 - n = sqlite3_prepare16_v2(db, sql, nchars * sizeof(wchar_t), ppstmt, pztail); -#else - n = sqlite3_prepare16(db, sql, nchars * sizeof(wchar_t), ppstmt, pztail); -#endif - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_PREPARE16) - sqlite3InteropDebug("sqlite3_prepare_interop(): sqlite3_prepare16(%p, \"%s\", %d, %p) returned %d.\n", db, sql, nchars, ppstmt, n); -#endif - - if (plen) *plen = (pztail && *pztail) ? wcslen((wchar_t *)*pztail) * sizeof(wchar_t) : 0; - - return n; -} - -#if defined(INTEROP_VIRTUAL_TABLE) && SQLITE_VERSION_NUMBER >= 3004001 -#ifdef _WIN32 -__declspec(dllexport) -#endif -void *sqlite3_create_disposable_module( - sqlite3 *db, - const char *zName, - const sqlite3_module *p, - void *pClientData, - void(*xDestroy)(void*) -); /* defined in "src/ext/vtshim.c" (included below) */ - -SQLITE_API void *WINAPI sqlite3_create_disposable_module_interop( - sqlite3 *db, - const char *zName, - sqlite3_module *pModule, - int iVersion, - int (*xCreate)(sqlite3*, void *, int, const char *const*, sqlite3_vtab **, char**), - int (*xConnect)(sqlite3*, void *, int, const char *const*, sqlite3_vtab **, char**), - int (*xBestIndex)(sqlite3_vtab *, sqlite3_index_info*), - int (*xDisconnect)(sqlite3_vtab *), - int (*xDestroy)(sqlite3_vtab *), - int (*xOpen)(sqlite3_vtab *, sqlite3_vtab_cursor **), - int (*xClose)(sqlite3_vtab_cursor*), - int (*xFilter)(sqlite3_vtab_cursor*, int, const char *, int, sqlite3_value **), - int (*xNext)(sqlite3_vtab_cursor*), - int (*xEof)(sqlite3_vtab_cursor*), - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int), - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *), - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *), - int (*xBegin)(sqlite3_vtab *), - int (*xSync)(sqlite3_vtab *), - int (*xCommit)(sqlite3_vtab *), - int (*xRollback)(sqlite3_vtab *), - int (*xFindFunction)(sqlite3_vtab *, int, const char *, void (**pxFunc)(sqlite3_context*, int, sqlite3_value**), void **ppArg), - int (*xRename)(sqlite3_vtab *, const char *), - int (*xSavepoint)(sqlite3_vtab *, int), - int (*xRelease)(sqlite3_vtab *, int), - int (*xRollbackTo)(sqlite3_vtab *, int), - void *pClientData, - void(*xDestroyModule)(void*) -){ - if (!pModule) return 0; - memset(pModule, 0, sizeof(*pModule)); - pModule->iVersion = iVersion; - pModule->xCreate = xCreate; - pModule->xConnect = xConnect; - pModule->xBestIndex = xBestIndex; - pModule->xDisconnect = xDisconnect; - pModule->xDestroy = xDestroy; - pModule->xOpen = xOpen; - pModule->xClose = xClose; - pModule->xFilter = xFilter; - pModule->xNext = xNext; - pModule->xEof = xEof; - pModule->xColumn = xColumn; - pModule->xRowid = xRowid; - pModule->xUpdate = xUpdate; - pModule->xBegin = xBegin; - pModule->xSync = xSync; - pModule->xCommit = xCommit; - pModule->xRollback = xRollback; - pModule->xFindFunction = xFindFunction; - pModule->xRename = xRename; - pModule->xSavepoint = xSavepoint; - pModule->xRelease = xRelease; - pModule->xRollbackTo = xRollbackTo; - return sqlite3_create_disposable_module(db, zName, pModule, pClientData, xDestroyModule); -} -#endif - -SQLITE_API int WINAPI sqlite3_bind_double_interop(sqlite3_stmt *stmt, int iCol, double *val) -{ - if (!val) return SQLITE_ERROR; - return sqlite3_bind_double(stmt,iCol,*val); -} - -SQLITE_API int WINAPI sqlite3_bind_int64_interop(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val) -{ - if (!val) return SQLITE_ERROR; - return sqlite3_bind_int64(stmt,iCol,*val); -} - -SQLITE_API const char * WINAPI sqlite3_bind_parameter_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_bind_parameter_name(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const char * WINAPI sqlite3_column_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_column_name(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_name16(stmt, iCol); - if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; - return pval; -} - -SQLITE_API const char * WINAPI sqlite3_column_decltype_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_column_decltype(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_decltype16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_decltype16(stmt, iCol); - if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; - return pval; -} - -SQLITE_API void WINAPI sqlite3_column_double_interop(sqlite3_stmt *stmt, int iCol, double *val) -{ - if (!val) return; - *val = sqlite3_column_double(stmt,iCol); -} - -SQLITE_API void WINAPI sqlite3_column_int64_interop(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val) -{ - if (!val) return; - *val = sqlite3_column_int64(stmt,iCol); -} - -SQLITE_API void WINAPI sqlite3_last_insert_rowid_interop(sqlite3 *db, sqlite_int64 *rowId) -{ - if (!rowId) return; - *rowId = sqlite3_last_insert_rowid(db); -} - -SQLITE_API void WINAPI sqlite3_memory_used_interop(sqlite_int64 *nBytes) -{ - if (!nBytes) return; - *nBytes = sqlite3_memory_used(); -} - -SQLITE_API void WINAPI sqlite3_memory_highwater_interop(int resetFlag, sqlite_int64 *nBytes) -{ - if (!nBytes) return; - *nBytes = sqlite3_memory_highwater(resetFlag); -} - -SQLITE_API const unsigned char * WINAPI sqlite3_column_text_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const unsigned char *pval = sqlite3_column_text(stmt, iCol); - if (plen) *plen = sqlite3_column_bytes(stmt, iCol); - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_text16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_text16(stmt, iCol); - if (plen) *plen = sqlite3_column_bytes16(stmt, iCol); - return pval; -} - -SQLITE_API int WINAPI sqlite3_finalize_interop(sqlite3_stmt *stmt) -{ - int ret; -#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_FINALIZE) - Vdbe *p = (Vdbe *)stmt; - sqlite3 *db = p ? p->db : 0; - sqlite3InteropDebug("sqlite3_finalize_interop(): calling sqlite3_finalize(%p, %p)...\n", db, stmt); -#endif - - ret = sqlite3_finalize(stmt); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_FINALIZE) - sqlite3InteropDebug("sqlite3_finalize_interop(): sqlite3_finalize(%p, %p) returned %d.\n", db, stmt, ret); -#endif - - return ret; -#else - Vdbe *p; - ret = SQLITE_OK; - - p = (Vdbe *)stmt; - if (p) - { - sqlite3 *db = p->db; - - if (db != NULL) - sqlite3_mutex_enter(db->mutex); - - if ((p->magic == VDBE_MAGIC_DEAD) && (db == NULL)) - { - sqlite3DbFree_interop(db, p); - } - else - { - ret = sqlite3_finalize(stmt); - } - - if (db != NULL) - sqlite3_mutex_leave(db->mutex); - } - - return ret; -#endif -} - -SQLITE_API int WINAPI sqlite3_backup_finish_interop(sqlite3_backup *p) -{ - int ret; - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_BACKUP_FINISH) - sqlite3* pDestDb = p ? p->pDestDb : 0; - sqlite3* pSrcDb = p ? p->pSrcDb : 0; - sqlite3InteropDebug("sqlite3_backup_finish_interop(): calling sqlite3_backup_finish(%p, %p, %p)...\n", pDestDb, pSrcDb, p); -#endif - - ret = sqlite3_backup_finish(p); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_BACKUP_FINISH) - sqlite3InteropDebug("sqlite3_backup_finish_interop(): sqlite3_backup_finish(%p, %p, %p) returned %d.\n", pDestDb, pSrcDb, p, ret); -#endif - - return ret; -} - -SQLITE_API int WINAPI sqlite3_reset_interop(sqlite3_stmt *stmt) -{ - int ret; -#if !defined(INTEROP_LEGACY_CLOSE) && SQLITE_VERSION_NUMBER >= 3007014 - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_RESET) - sqlite3InteropDebug("sqlite3_reset_interop(): calling sqlite3_reset(%p)...\n", stmt); -#endif - - ret = sqlite3_reset(stmt); - -#if defined(INTEROP_DEBUG) && (INTEROP_DEBUG & INTEROP_DEBUG_RESET) - sqlite3InteropDebug("sqlite3_reset_interop(): sqlite3_reset(%p) returned %d.\n", stmt, ret); -#endif - - return ret; -#else - if (stmt && ((Vdbe *)stmt)->magic == VDBE_MAGIC_DEAD) return SQLITE_SCHEMA; - ret = sqlite3_reset(stmt); - return ret; -#endif -} - -SQLITE_API int WINAPI sqlite3_create_function_interop(sqlite3 *psql, const char *zFunctionName, int nArg, int eTextRep, void *pvUser, SQLITEUSERFUNC func, SQLITEUSERFUNC funcstep, SQLITEFUNCFINAL funcfinal, int needCollSeq) -{ - int n; - - if (eTextRep == SQLITE_UTF16) - eTextRep = SQLITE_UTF16NATIVE; - - n = sqlite3_create_function(psql, zFunctionName, nArg, eTextRep, pvUser, func, funcstep, funcfinal); - if (n == SQLITE_OK) - { - if (needCollSeq) - { - FuncDef *pFunc = sqlite3FindFunction(psql, zFunctionName, strlen(zFunctionName), nArg, eTextRep, 0); - if( pFunc ) - { -#if SQLITE_VERSION_NUMBER >= 3008001 - pFunc->funcFlags |= SQLITE_FUNC_NEEDCOLL; -#else - pFunc->flags |= SQLITE_FUNC_NEEDCOLL; -#endif - } - } - } - - return n; -} - -SQLITE_API void WINAPI sqlite3_value_double_interop(sqlite3_value *pval, double *val) -{ - if (!val) return; - *val = sqlite3_value_double(pval); -} - -SQLITE_API void WINAPI sqlite3_value_int64_interop(sqlite3_value *pval, sqlite_int64 *val) -{ - if (!val) return; - *val = sqlite3_value_int64(pval); -} - -SQLITE_API const unsigned char * WINAPI sqlite3_value_text_interop(sqlite3_value *val, int *plen) -{ - const unsigned char *pval = sqlite3_value_text(val); - if (plen) *plen = sqlite3_value_bytes(val); - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_value_text16_interop(sqlite3_value *val, int *plen) -{ - const void *pval = sqlite3_value_text16(val); - if (plen) *plen = sqlite3_value_bytes16(val); - return pval; -} - -SQLITE_API void WINAPI sqlite3_result_double_interop(sqlite3_context *pctx, double *val) -{ - if (!val) return; - sqlite3_result_double(pctx, *val); -} - -SQLITE_API void WINAPI sqlite3_result_int64_interop(sqlite3_context *pctx, sqlite_int64 *val) -{ - if (!val) return; - sqlite3_result_int64(pctx, *val); -} - -SQLITE_API int WINAPI sqlite3_context_collcompare_interop(sqlite3_context *ctx, const void *p1, int p1len, const void *p2, int p2len) -{ -#if SQLITE_VERSION_NUMBER >= 3008007 - CollSeq *pColl = ctx ? sqlite3GetFuncCollSeq(ctx) : 0; -#else - CollSeq *pColl = ctx ? ctx->pColl : 0; -#endif - if (!ctx || !ctx->pFunc) return 4; /* ERROR */ - if (!pColl || !pColl->xCmp) return 3; /* ERROR */ -#if SQLITE_VERSION_NUMBER >= 3008001 - if ((ctx->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) == 0) return 2; /* ERROR */ -#else - if ((ctx->pFunc->flags & SQLITE_FUNC_NEEDCOLL) == 0) return 2; /* ERROR */ -#endif - return pColl->xCmp(pColl->pUser, p1len, p1, p2len, p2); -} - -SQLITE_API const char * WINAPI sqlite3_context_collseq_interop(sqlite3_context *ctx, int *ptype, int *enc, int *plen) -{ -#if SQLITE_VERSION_NUMBER >= 3008007 - CollSeq *pColl = ctx ? sqlite3GetFuncCollSeq(ctx) : 0; -#else - CollSeq *pColl = ctx ? ctx->pColl : 0; -#endif - if (ptype) *ptype = 0; - if (plen) *plen = 0; - if (enc) *enc = 0; - - if (!ctx || !ctx->pFunc) return NULL; -#if SQLITE_VERSION_NUMBER >= 3008001 - if ((ctx->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) == 0) return NULL; -#else - if ((ctx->pFunc->flags & SQLITE_FUNC_NEEDCOLL) == 0) return NULL; -#endif - - if (pColl) - { - if (enc) *enc = pColl->enc; -#if SQLITE_VERSION_NUMBER < 3007010 - if (ptype) *ptype = pColl->type; -#endif - if (plen) *plen = pColl->zName ? strlen(pColl->zName) : 0; - - return pColl->zName; - } - return NULL; -} - -SQLITE_API const char * WINAPI sqlite3_column_database_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_column_database_name(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_database_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_database_name16(stmt, iCol); - if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; - return pval; -} - -SQLITE_API const char * WINAPI sqlite3_column_table_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_column_table_name(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_table_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_table_name16(stmt, iCol); - if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; - return pval; -} - -SQLITE_API const char * WINAPI sqlite3_column_origin_name_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const char *pval = sqlite3_column_origin_name(stmt, iCol); - if (plen) *plen = pval ? strlen(pval) : 0; - return pval; -} - -SQLITE_API const void * WINAPI sqlite3_column_origin_name16_interop(sqlite3_stmt *stmt, int iCol, int *plen) -{ - const void *pval = sqlite3_column_origin_name16(stmt, iCol); - if (plen) *plen = pval ? wcslen((wchar_t *)pval) * sizeof(wchar_t) : 0; - return pval; -} - -SQLITE_API int WINAPI sqlite3_table_column_metadata_interop(sqlite3 *db, const char *zDbName, const char *zTableName, const char *zColumnName, char const **pzDataType, char const **pzCollSeq, int *pNotNull, int *pPrimaryKey, int *pAutoinc, int *pdtLen, int *pcsLen) -{ - int n; - - n = sqlite3_table_column_metadata(db, zDbName, zTableName, zColumnName, pzDataType, pzCollSeq, pNotNull, pPrimaryKey, pAutoinc); - - if (pdtLen) *pdtLen = (pzDataType && *pzDataType) ? strlen(*pzDataType) : 0; - if (pcsLen) *pcsLen = (pzCollSeq && *pzCollSeq) ? strlen(*pzCollSeq) : 0; - - return n; -} - -SQLITE_API int WINAPI sqlite3_index_column_info_interop(sqlite3 *db, const char *zDb, const char *zIndexName, const char *zColumnName, int *sortOrder, int *onError, const char **pzColl, int *plen) -{ - Index *pIdx; - Table *pTab; - int n; - - if (!db) return SQLITE_ERROR; - sqlite3_mutex_enter(db->mutex); - sqlite3BtreeEnterAll(db); - - pIdx = sqlite3FindIndex(db, zIndexName, zDb); - - sqlite3BtreeLeaveAll(db); - sqlite3_mutex_leave(db->mutex); - - if (!pIdx) return SQLITE_ERROR; - - pTab = pIdx->pTable; - for (n = 0; n < pIdx->nColumn; n++) - { - int cnum = pIdx->aiColumn[n]; - if (sqlite3StrICmp(pTab->aCol[cnum].zName, zColumnName) == 0) - { - if ( sortOrder ) *sortOrder = pIdx->aSortOrder[n]; - if ( pzColl ) *pzColl = pIdx->azColl[n]; - if ( plen ) *plen = strlen(*pzColl); - if ( onError ) *onError = pIdx->onError; - - return SQLITE_OK; - } - } - return SQLITE_ERROR; -} - -SQLITE_API int WINAPI sqlite3_table_cursor_interop(sqlite3_stmt *pstmt, int iDb, Pgno tableRootPage) -{ - Vdbe *p = (Vdbe *)pstmt; - sqlite3 *db = (p == NULL) ? NULL : p->db; - int n; - int ret = -1; /* NOT FOUND */ - - if (!p || !db) return ret; - sqlite3_mutex_enter(db->mutex); - for (n = 0; n < p->nCursor && p->apCsr[n] != NULL; n++) - { - if (p->apCsr[n]->isTable == 0) continue; - if (p->apCsr[n]->iDb != iDb) continue; -#if SQLITE_VERSION_NUMBER >= 3010000 - if (p->apCsr[n]->uc.pCursor->pgnoRoot == tableRootPage) -#else - if (p->apCsr[n]->pCursor->pgnoRoot == tableRootPage) -#endif - { - ret = n; - break; - } - } - sqlite3_mutex_leave(db->mutex); - - return ret; -} - -SQLITE_API int WINAPI sqlite3_cursor_rowid_interop(sqlite3_stmt *pstmt, int cursor, sqlite_int64 *prowid) -{ - Vdbe *p = (Vdbe *)pstmt; - sqlite3 *db = (p == NULL) ? NULL : p->db; - VdbeCursor *pC; -#if SQLITE_VERSION_NUMBER >= 3011000 - int p2 = 0; -#endif - int ret = SQLITE_OK; - - if (!p || !db) return SQLITE_ERROR; - sqlite3_mutex_enter(db->mutex); - while (1) - { - if (cursor < 0 || cursor >= p->nCursor) - { - ret = SQLITE_ERROR; - break; - } - if (p->apCsr[cursor] == NULL) - { - ret = SQLITE_ERROR; - break; - } - - pC = p->apCsr[cursor]; - -#if SQLITE_VERSION_NUMBER >= 3011000 - ret = sqlite3VdbeCursorMoveto(&pC, &p2); -#else - ret = sqlite3VdbeCursorMoveto(pC); -#endif - if(ret) - break; - -#if SQLITE_VERSION_NUMBER < 3008007 - if(pC->rowidIsValid) - { - if (prowid) *prowid = pC->lastRowid; - } - else -#endif -#if SQLITE_VERSION_NUMBER >= 3010000 - if(pC->uc.pseudoTableReg > 0) -#else - if(pC->pseudoTableReg > 0) -#endif - { - ret = SQLITE_ERROR; - break; - } -#if SQLITE_VERSION_NUMBER >= 3010000 - else if(pC->nullRow || pC->uc.pCursor==0) -#else - else if(pC->nullRow || pC->pCursor==0) -#endif - { - ret = SQLITE_ERROR; - break; - } - else - { -#if SQLITE_VERSION_NUMBER >= 3010000 - if (pC->uc.pCursor == NULL) -#else - if (pC->pCursor == NULL) -#endif - { - ret = SQLITE_ERROR; - break; - } -#if SQLITE_VERSION_NUMBER >= 3010000 - sqlite3BtreeKeySize(pC->uc.pCursor, prowid); -#else - sqlite3BtreeKeySize(pC->pCursor, prowid); -#endif - if (prowid) *prowid = *prowid; - } - break; - } - sqlite3_mutex_leave(db->mutex); - - return ret; -} - -/*****************************************************************************/ - -#if defined(SQLITE_CORE) -#undef SQLITE_CORE -#endif - -#if defined(INTEROP_VIRTUAL_TABLE) && SQLITE_VERSION_NUMBER >= 3004001 -#include "../ext/vtshim.c" -#endif - -#if defined(INTEROP_FTS5_EXTENSION) -#include "../ext/fts5.c" -#endif - -#if defined(INTEROP_JSON1_EXTENSION) -#include "../ext/json1.c" -#endif - -#if defined(INTEROP_PERCENTILE_EXTENSION) -#include "../ext/percentile.c" -#endif - -#if defined(INTEROP_REGEXP_EXTENSION) -#include "../ext/regexp.c" -#endif - -#if defined(INTEROP_TOTYPE_EXTENSION) -#include "../ext/totype.c" -#endif - -/*****************************************************************************/ - -/* -** The INTEROP_TEST_EXTENSION block must be at the end of this source file -** because it includes the "sqlite3ext.h" file, which defines the sqlite3 -** public API function names to be macros and that would cause the code -** above this point to malfunction. -*/ -#if defined(INTEROP_TEST_EXTENSION) -#if !SQLITE_OS_WIN -#include -#endif - -#include "../core/sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - -/* -** The interopTest() SQL function returns its first argument or raises an -** error if there are not enough arguments. -*/ -SQLITE_PRIVATE void interopTestFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *z; - if( argc!=1 ){ - sqlite3_result_error(context, "need exactly one argument", -1); - return; - } - z = sqlite3_value_text(argv[0]); - if( z ){ - sqlite3_result_text(context, (char*)z, -1, SQLITE_STATIC); - }else{ - sqlite3_result_null(context); - } -} - -/* -** The interopSleep() SQL function waits the specified number of milliseconds -** or raises an error if there are not enough arguments. -*/ -SQLITE_PRIVATE void interopSleepFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int m; - if( argc!=1 ){ - sqlite3_result_error(context, "need exactly one argument", -1); - return; - } - m = sqlite3_value_int(argv[0]); -#if SQLITE_OS_WIN -#if SQLITE_OS_WINCE - Sleep(m); - sqlite3_result_int(context, WAIT_OBJECT_0); -#else - sqlite3_result_int(context, SleepEx(m, TRUE)); -#endif -#else - if( m>0 ){ - sqlite3_result_int64(context, sleep((unsigned)m)); - }else{ - sqlite3_result_null(context); - } -#endif -} - -/* SQLite invokes this routine once when it loads the extension. -** Create new functions, collating sequences, and virtual table -** modules here. This is usually the only exported symbol in -** the shared library. -*/ -SQLITE_API int interop_test_extension_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - int rc; - SQLITE_EXTENSION_INIT2(pApi) - rc = sqlite3_create_function(db, "interopTest", -1, SQLITE_ANY, 0, - interopTestFunc, 0, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "interopSleep", 1, SQLITE_ANY, 0, - interopSleepFunc, 0, 0); - } - return rc; -} -#endif /* SQLITE_OS_WIN */ DELETED SQLite.Interop/src/win/interop.h Index: SQLite.Interop/src/win/interop.h ================================================================== --- SQLite.Interop/src/win/interop.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * interop.h - - * - * Written by Joe Mistachkin. - * Released to the public domain, use at your own risk! - */ - -#ifndef INTEROP_VERSION -#define INTEROP_VERSION "1.0.100.0" -#endif - -#ifndef INTEROP_SOURCE_ID -#define INTEROP_SOURCE_ID "0000000000000000000000000000000000000000" -#endif - -#ifndef INTEROP_SOURCE_TIMESTAMP -#define INTEROP_SOURCE_TIMESTAMP "0000-00-00 00:00:00 UTC" -#endif Index: Setup/build.bat ================================================================== --- Setup/build.bat +++ Setup/build.bat @@ -368,14 +368,14 @@ ECHO WARNING: Property file modification skipped, disabled via NOPROPS environment variable. ) IF NOT DEFINED NOTAG ( IF EXIST Externals\Eagle\bin\EagleShell.exe ( - %__ECHO% Externals\Eagle\bin\EagleShell.exe -file Setup\sourceTag.eagle SourceIdMode SQLite.Interop\src\win\interop.h + %__ECHO% Externals\Eagle\bin\EagleShell.exe -file Setup\sourceTag.eagle SourceIdMode SQLite.Interop\src\generic\interop.h IF ERRORLEVEL 1 ( - ECHO Source tagging of "SQLite.Interop\src\win\interop.h" failed. + ECHO Source tagging of "SQLite.Interop\src\generic\interop.h" failed. GOTO errors ) %__ECHO% Externals\Eagle\bin\EagleShell.exe -file Setup\sourceTag.eagle SourceIdMode System.Data.SQLite\SQLitePatchLevel.cs Index: Setup/data/verify.lst ================================================================== --- Setup/data/verify.lst +++ Setup/data/verify.lst @@ -507,15 +507,15 @@ SQLite.Interop/src/ext/json1.c SQLite.Interop/src/ext/percentile.c SQLite.Interop/src/ext/regexp.c SQLite.Interop/src/ext/totype.c SQLite.Interop/src/ext/vtshim.c + SQLite.Interop/src/generic/interop.c + SQLite.Interop/src/generic/interop.h SQLite.Interop/src/win/ SQLite.Interop/src/win/AssemblyInfo.cpp SQLite.Interop/src/win/crypt.c - SQLite.Interop/src/win/interop.c - SQLite.Interop/src/win/interop.h SQLite.Interop/src/win/SQLite.Interop.rc SQLite.NET.2005.MSBuild.sln SQLite.NET.2005.sln SQLite.NET.2008.MSBuild.sln SQLite.NET.2008.sln Index: www/build.wiki ================================================================== --- www/build.wiki +++ www/build.wiki @@ -158,11 +158,11 @@
  • <root>\SQLite.Interop\props\SQLite.Interop.2008.vsprops
  • <root>\SQLite.Interop\props\SQLite.Interop.2010.props
  • <root>\SQLite.Interop\props\SQLite.Interop.2012.props
  • <root>\SQLite.Interop\props\SQLite.Interop.2013.props
  • <root>\SQLite.Interop\props\SQLite.Interop.2015.props
  • -
  • <root>\SQLite.Interop\src\win\interop.h
  • +
  • <root>\SQLite.Interop\src\generic\interop.h
  • <root>\System.Data.SQLite\AssemblyInfo.cs
  • <root>\System.Data.SQLite\SQLite3.cs
  • <root>\System.Data.SQLite\UnsafeNativeMethods.cs
  • <root>\System.Data.SQLite.Linq\AssemblyInfo.cs
  • <root>\test\AssemblyInfo.cs