packages feed

persistent-sqlite 2.9.0 → 2.9.1

raw patch · 6 files changed

+214/−13 lines, 6 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Database.Sqlite: instance GHC.Exception.Exception Database.Sqlite.SqliteException
+ Database.Sqlite: instance GHC.Exception.Type.Exception Database.Sqlite.SqliteException
- Database.Persist.Sqlite: wrapConnection :: (IsSqlBackend backend) => Connection -> LogFunc -> IO backend
+ Database.Persist.Sqlite: wrapConnection :: IsSqlBackend backend => Connection -> LogFunc -> IO backend
- Database.Persist.Sqlite: wrapConnectionInfo :: (IsSqlBackend backend) => SqliteConnectionInfo -> Connection -> LogFunc -> IO backend
+ Database.Persist.Sqlite: wrapConnectionInfo :: IsSqlBackend backend => SqliteConnectionInfo -> Connection -> LogFunc -> IO backend

Files

ChangeLog.md view
@@ -1,5 +1,9 @@ # Changelog for persistent-sqlite +## 2.9.1++* Bump vendored SQLite library to [3.26.0](https://www.sqlite.org/releaselog/3_26_0.html) to address [RCE bug: `magellan`](https://blade.tencent.com/magellan/index_en.html).+ ## 2.9.0  * Added support for SQL isolation levels to via SqlBackend. [#812] SQLite technically only supports Serializable.
Database/Persist/Sqlite.hs view
@@ -118,6 +118,47 @@  -- | Wrap up a raw 'Sqlite.Connection' as a Persistent SQL 'Connection'. --+-- === __Example usage__+--+-- > {-# LANGUAGE GADTs #-}+-- > {-# LANGUAGE ScopedTypeVariables #-}+-- > {-# LANGUAGE OverloadedStrings #-}+-- > {-# LANGUAGE MultiParamTypeClasses #-}+-- > {-# LANGUAGE TypeFamilies #-}+-- > {-# LANGUAGE TemplateHaskell #-}+-- > {-# LANGUAGE QuasiQuotes #-}+-- > {-# LANGUAGE GeneralizedNewtypeDeriving #-}+-- > +-- > import Control.Monad.IO.Class  (liftIO)+-- > import Database.Persist+-- > import Database.Sqlite+-- > import Database.Persist.Sqlite+-- > import Database.Persist.TH+-- > +-- > share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|+-- > Person+-- >   name String+-- >   age Int Maybe+-- >   deriving Show+-- > |]+-- > +-- > main :: IO ()+-- > main = do+-- >   conn <- open "/home/sibi/test.db"+-- >   (backend :: SqlBackend) <- wrapConnection conn (\_ _ _ _ -> return ())+-- >   flip runSqlPersistM backend $ do+-- >          runMigration migrateAll+-- >          insert_ $ Person "John doe" $ Just 35+-- >          insert_ $ Person "Hema" $ Just 36+-- >          (pers :: [Entity Person]) <- selectList [] []+-- >          liftIO $ print pers+-- >   close' backend+--+-- On executing it, you get this output:+--+-- > Migrating: CREATE TABLE "person"("id" INTEGER PRIMARY KEY,"name" VARCHAR NOT NULL,"age" INTEGER NULL)+-- > [Entity {entityKey = PersonKey {unPersonKey = SqlBackendKey {unSqlBackendKey = 1}}, entityVal = Person {personName = "John doe", personAge = Just 35}},Entity {entityKey = PersonKey {unPersonKey = SqlBackendKey {unSqlBackendKey = 2}}, entityVal = Person {personName = "Hema", personAge = Just 36}}]+--  -- @since 1.1.5 wrapConnection :: (IsSqlBackend backend) => Sqlite.Connection -> LogFunc -> IO backend wrapConnection = wrapConnectionInfo (mkSqliteConnectionInfo "")
Database/Sqlite.hs view
@@ -14,6 +14,44 @@                          LogFunction,                          SqliteStatus (..),                          SqliteStatusVerb (..),+    -- * Basic usage guide+    -- |+    --+    -- Note that the example code shown here is a low level interface+    -- usage. Let's create a small demo sqlite3 database which we will+    -- use in our program:+    --+    -- > $ sqlite3 ~/test.db+    -- > sqlite> create table t1(a,b);+    -- > sqlite> insert into t1(a,b) values (1,1);+    -- > sqlite> insert into t1(a,b) values (2,2);+    -- > sqlite> select * from t1;+    -- > 1|1+    -- > 2|2+    --+    -- Now let's write code using the functions in this module to+    -- fetch the rows from the table:+    --+    -- > {-#LANGUAGE OverloadedStrings#-}+    -- > +    -- > import Database.Sqlite+    -- > import Data.Text+    -- > +    -- > main :: IO ()+    -- > main = do+    -- >   conn <- open "/home/sibi/test.db"+    -- >   smt <- prepare conn "select * from t1;"+    -- >   row1 <- step smt >> columns smt+    -- >   row2 <- step smt >> columns smt+    -- >   print (row1, row2)+    -- >   finalize smt+    -- >   close conn+    --+    -- On executing the above code:+    --+    -- > $ ./demo-program+    -- > $ ([PersistInt64 1,PersistInt64 1],[PersistInt64 2,PersistInt64 2])+                          open,                          close,                          prepare,
cbits/sqlite3.c view

file too large to diff

cbits/sqlite3.h view
@@ -123,9 +123,9 @@ ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */-#define SQLITE_VERSION        "3.25.2"-#define SQLITE_VERSION_NUMBER 3025002-#define SQLITE_SOURCE_ID      "2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7"+#define SQLITE_VERSION        "3.26.0"+#define SQLITE_VERSION_NUMBER 3026000+#define SQLITE_SOURCE_ID      "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9"  /* ** CAPI3REF: Run-Time Library Version Numbers@@ -2017,6 +2017,7 @@ ** is invoked. ** ** <dl>+** [[SQLITE_DBCONFIG_LOOKASIDE]] ** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt> ** <dd> ^This option takes three additional arguments that determine the  ** [lookaside memory allocator] configuration for the [database connection].@@ -2039,6 +2040,7 @@ ** memory is in use leaves the configuration unchanged and returns  ** [SQLITE_BUSY].)^</dd> **+** [[SQLITE_DBCONFIG_ENABLE_FKEY]] ** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt> ** <dd> ^This option is used to enable or disable the enforcement of ** [foreign key constraints].  There should be two additional arguments.@@ -2049,6 +2051,7 @@ ** following this call.  The second parameter may be a NULL pointer, in ** which case the FK enforcement setting is not reported back. </dd> **+** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]] ** <dt>SQLITE_DBCONFIG_ENABLE_TRIGGER</dt> ** <dd> ^This option is used to enable or disable [CREATE TRIGGER | triggers]. ** There should be two additional arguments.@@ -2059,6 +2062,7 @@ ** following this call.  The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back. </dd> **+** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] ** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt> ** <dd> ^This option is used to enable or disable the two-argument ** version of the [fts3_tokenizer()] function which is part of the@@ -2072,6 +2076,7 @@ ** following this call.  The second parameter may be a NULL pointer, in ** which case the new setting is not reported back. </dd> **+** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] ** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt> ** <dd> ^This option is used to enable or disable the [sqlite3_load_extension()] ** interface independently of the [load_extension()] SQL function.@@ -2089,7 +2094,7 @@ ** be a NULL pointer, in which case the new setting is not reported back. ** </dd> **-** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt>+** [[SQLITE_DBCONFIG_MAINDBNAME]] <dt>SQLITE_DBCONFIG_MAINDBNAME</dt> ** <dd> ^This option is used to change the name of the "main" database ** schema.  ^The sole argument is a pointer to a constant UTF8 string ** which will become the new schema name in place of "main".  ^SQLite@@ -2098,6 +2103,7 @@ ** until after the database connection closes. ** </dd> **+** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]]  ** <dt>SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</dt> ** <dd> Usually, when a database in wal mode is closed or detached from a  ** database handle, SQLite checks if this will mean that there are now no @@ -2111,7 +2117,7 @@ ** have been disabled - 0 if they are not disabled, 1 if they are. ** </dd> **-** <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt>+** [[SQLITE_DBCONFIG_ENABLE_QPSG]] <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt> ** <dd>^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates ** the [query planner stability guarantee] (QPSG).  When the QPSG is active, ** a single SQL query statement will always use the same algorithm regardless@@ -2127,7 +2133,7 @@ ** following this call. ** </dd> **-** <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt>+** [[SQLITE_DBCONFIG_TRIGGER_EQP]] <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt> ** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not  ** include output for any operations performed by trigger programs. This ** option is used to set or clear (the default) a flag that governs this@@ -2139,7 +2145,7 @@ ** it is not disabled, 1 if it is.   ** </dd> **-** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>+** [[SQLITE_DBCONFIG_RESET_DATABASE]] <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt> ** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run ** [VACUUM] in order to reset a database back to an empty database ** with no schema and no content. The following process works even for@@ -2158,6 +2164,18 @@ ** Because resetting a database is destructive and irreversible, the ** process requires the use of this obscure API and multiple steps to help ** ensure that it does not happen by accident.+**+** [[SQLITE_DBCONFIG_DEFENSIVE]] <dt>SQLITE_DBCONFIG_DEFENSIVE</dt>+** <dd>The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the+** "defensive" flag for a database connection.  When the defensive+** flag is enabled, language features that allow ordinary SQL to +** deliberately corrupt the database file are disabled.  The disabled+** features include but are not limited to the following:+** <ul>+** <li> The [PRAGMA writable_schema=ON] statement.+** <li> Writes to the [sqlite_dbpage] virtual table.+** <li> Direct writes to [shadow tables].+** </ul> ** </dd> ** </dl> */@@ -2171,7 +2189,8 @@ #define SQLITE_DBCONFIG_ENABLE_QPSG           1007 /* int int* */ #define SQLITE_DBCONFIG_TRIGGER_EQP           1008 /* int int* */ #define SQLITE_DBCONFIG_RESET_DATABASE        1009 /* int int* */-#define SQLITE_DBCONFIG_MAX                   1009 /* Largest DBCONFIG */+#define SQLITE_DBCONFIG_DEFENSIVE             1010 /* int int* */+#define SQLITE_DBCONFIG_MAX                   1010 /* Largest DBCONFIG */  /* ** CAPI3REF: Enable Or Disable Extended Result Codes@@ -3609,9 +3628,19 @@ ** on this hint by avoiding the use of [lookaside memory] so as not to ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently.+**+** [[SQLITE_PREPARE_NORMALIZE]] ^(<dt>SQLITE_PREPARE_NORMALIZE</dt>+** <dd>The SQLITE_PREPARE_NORMALIZE flag indicates that a normalized+** representation of the SQL statement should be calculated and then+** associated with the prepared statement, which can be obtained via+** the [sqlite3_normalized_sql()] interface.)^  The semantics used to+** normalize a SQL statement are unspecified and subject to change.+** At a minimum, literal values will be replaced with suitable+** placeholders. ** </dl> */ #define SQLITE_PREPARE_PERSISTENT              0x01+#define SQLITE_PREPARE_NORMALIZE               0x02  /* ** CAPI3REF: Compiling An SQL Statement@@ -3769,6 +3798,11 @@ ** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 ** string containing the SQL text of prepared statement P with ** [bound parameters] expanded.+** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8+** string containing the normalized SQL text of prepared statement P.  The+** semantics used to normalize a SQL statement are unspecified and subject+** to change.  At a minimum, literal values will be replaced with suitable+** placeholders. ** ** ^(For example, if a prepared statement is created using the SQL ** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345@@ -3784,14 +3818,16 @@ ** bound parameter expansions.  ^The [SQLITE_OMIT_TRACE] compile-time ** option causes sqlite3_expanded_sql() to always return NULL. **-** ^The string returned by sqlite3_sql(P) is managed by SQLite and is-** automatically freed when the prepared statement is finalized.+** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P)+** are managed by SQLite and are automatically freed when the prepared+** statement is finalized. ** ^The string returned by sqlite3_expanded_sql(P), on the other hand, ** is obtained from [sqlite3_malloc()] and must be free by the application ** by passing it to [sqlite3_free()]. */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt);+SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);  /* ** CAPI3REF: Determine If An SQL Statement Writes The Database@@ -6281,6 +6317,9 @@   int (*xSavepoint)(sqlite3_vtab *pVTab, int);   int (*xRelease)(sqlite3_vtab *pVTab, int);   int (*xRollbackTo)(sqlite3_vtab *pVTab, int);+  /* The methods above are in versions 1 and 2 of the sqlite_module object.+  ** Those below are for version 3 and greater. */+  int (*xShadowName)(const char*); };  /*@@ -7203,6 +7242,7 @@ #define SQLITE_TESTCTRL_OPTIMIZATIONS           15 #define SQLITE_TESTCTRL_ISKEYWORD               16  /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC           17  /* NOT USED */+#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS      17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT         18 #define SQLITE_TESTCTRL_EXPLAIN_STMT            19  /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD    19@@ -8615,6 +8655,7 @@ ** can use to customize and optimize their behavior. ** ** <dl>+** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] ** <dt>SQLITE_VTAB_CONSTRAINT_SUPPORT ** <dd>Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported,@@ -9384,7 +9425,7 @@   sqlite3_int64 iRowid;             /* Rowid for current entry */   sqlite3_rtree_dbl rParentScore;   /* Score of parent node */   int eParentWithin;                /* Visibility of parent node */-  int eWithin;                      /* OUT: Visiblity */+  int eWithin;                      /* OUT: Visibility */   sqlite3_rtree_dbl rScore;         /* OUT: Write the score here */   /* The following fields are only available in 3.8.11 and later */   sqlite3_value **apSqlParam;       /* Original SQL values of parameters */@@ -9880,14 +9921,40 @@ ** consecutively. There is no chance that the iterator will visit a change  ** the applies to table X, then one for table Y, and then later on visit  ** another change for table X.+**+** The behavior of sqlite3changeset_start_v2() and its streaming equivalent+** may be modified by passing a combination of+** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter.+**+** Note that the sqlite3changeset_start_v2() API is still <b>experimental</b>+** and therefore subject to change. */ SQLITE_API int sqlite3changeset_start(   sqlite3_changeset_iter **pp,    /* OUT: New changeset iterator handle */   int nChangeset,                 /* Size of changeset blob in bytes */   void *pChangeset                /* Pointer to blob containing changeset */ );+SQLITE_API int sqlite3changeset_start_v2(+  sqlite3_changeset_iter **pp,    /* OUT: New changeset iterator handle */+  int nChangeset,                 /* Size of changeset blob in bytes */+  void *pChangeset,               /* Pointer to blob containing changeset */+  int flags                       /* SESSION_CHANGESETSTART_* flags */+); +/*+** CAPI3REF: Flags for sqlite3changeset_start_v2+**+** The following flags may passed via the 4th parameter to+** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]:+**+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>+**   Invert the changeset while iterating through it. This is equivalent to+**   inverting a changeset using sqlite3changeset_invert() before applying it.+**   It is an error to specify this flag with a patchset.+*/+#define SQLITE_CHANGESETSTART_INVERT        0x0002 + /* ** CAPI3REF: Advance A Changeset Iterator ** METHOD: sqlite3_changeset_iter@@ -10540,7 +10607,7 @@   ),   void *pCtx,                     /* First argument passed to xConflict */   void **ppRebase, int *pnRebase, /* OUT: Rebase data */-  int flags                       /* Combination of SESSION_APPLY_* flags */+  int flags                       /* SESSION_CHANGESETAPPLY_* flags */ );  /*@@ -10558,8 +10625,14 @@ **   causes the sessions module to omit this savepoint. In this case, if the **   caller has an open transaction or savepoint when apply_v2() is called,  **   it may revert the partially applied changeset by rolling it back.+**+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>+**   Invert the changeset before applying it. This is equivalent to inverting+**   a changeset using sqlite3changeset_invert() before applying it. It is+**   an error to specify this flag with a patchset. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001+#define SQLITE_CHANGESETAPPLY_INVERT        0x0002  /*  ** CAPI3REF: Constants Passed To The Conflict Handler@@ -10953,6 +11026,12 @@   int (*xInput)(void *pIn, void *pData, int *pnData),   void *pIn );+SQLITE_API int sqlite3changeset_start_v2_strm(+  sqlite3_changeset_iter **pp,+  int (*xInput)(void *pIn, void *pData, int *pnData),+  void *pIn,+  int flags+); SQLITE_API int sqlite3session_changeset_strm(   sqlite3_session *pSession,   int (*xOutput)(void *pOut, const void *pData, int nData),@@ -10979,6 +11058,45 @@   void *pOut ); +/*+** CAPI3REF: Configure global parameters+**+** The sqlite3session_config() interface is used to make global configuration+** changes to the sessions module in order to tune it to the specific needs +** of the application.+**+** The sqlite3session_config() interface is not threadsafe. If it is invoked+** while any other thread is inside any other sessions method then the+** results are undefined. Furthermore, if it is invoked after any sessions+** related objects have been created, the results are also undefined. +**+** The first argument to the sqlite3session_config() function must be one+** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and+** the effect of calling this function depends on the value of the first+** parameter.+**+** <dl>+** <dt>SQLITE_SESSION_CONFIG_STRMSIZE<dd>+**    By default, the sessions module streaming interfaces attempt to input+**    and output data in approximately 1 KiB chunks. This operand may be used+**    to set and query the value of this configuration setting. The pointer+**    passed as the second argument must point to a value of type (int).+**    If this value is greater than 0, it is used as the new streaming data+**    chunk size for both input and output. Before returning, the (int) value+**    pointed to by pArg is set to the final value of the streaming interface+**    chunk size.+** </dl>+**+** This function returns SQLITE_OK if successful, or an SQLite error code+** otherwise.+*/+SQLITE_API int sqlite3session_config(int op, void *pArg);++/*+** CAPI3REF: Values for sqlite3session_config().+*/+#define SQLITE_SESSION_CONFIG_STRMSIZE 1  /* ** Make sure we can call this stuff from C++.
persistent-sqlite.cabal view
@@ -1,5 +1,5 @@ name:            persistent-sqlite-version:         2.9.0+version:         2.9.1 license:         MIT license-file:    LICENSE author:          Michael Snoyman <michael@snoyman.com>