@@ -42,6 +42,9 @@ module Simplex.Messaging.Agent.Store.SQLite
4242 )
4343where
4444
45+ import Control.Concurrent.MVar
46+ import Control.Concurrent.STM
47+ import Control.Exception (bracketOnError , onException , throwIO )
4548import Control.Monad
4649import Data.Bits (xor )
4750import Data.ByteArray (ScrubbedBytes )
@@ -55,21 +58,21 @@ import Data.Text (Text)
5558import qualified Data.Text as T
5659import Database.SQLite.Simple (Query (.. ))
5760import qualified Database.SQLite.Simple as SQL
58- import Database.SQLite.Simple.Function
5961import Database.SQLite.Simple.QQ (sql )
6062import qualified Database.SQLite3 as SQLite3
63+ import Database.SQLite3.Bindings
64+ import Foreign.C.Types
65+ import Foreign.Ptr
6166import Simplex.Messaging.Agent.Store.Migrations (DBMigrate (.. ), sharedMigrateSchema )
6267import qualified Simplex.Messaging.Agent.Store.SQLite.Migrations as Migrations
6368import Simplex.Messaging.Agent.Store.SQLite.Common
6469import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
6570import Simplex.Messaging.Agent.Store.Shared (Migration (.. ), MigrationConfig (.. ), MigrationError (.. ))
71+ import Simplex.Messaging.Agent.Store.SQLite.Util (SQLiteFunc , createStaticFunction , mkSQLiteFunc )
6672import qualified Simplex.Messaging.Crypto as C
6773import Simplex.Messaging.Util (ifM , safeDecodeUtf8 )
6874import System.Directory (copyFile , createDirectoryIfMissing , doesFileExist )
6975import System.FilePath (takeDirectory , takeFileName , (</>) )
70- import UnliftIO.Exception (bracketOnError , onException , throwIO )
71- import UnliftIO.MVar
72- import UnliftIO.STM
7376
7477-- * SQLite Store implementation
7578
@@ -114,19 +117,29 @@ connectDB path key track = do
114117 pure db
115118 where
116119 prepare db = do
117- let exec = SQLite3. exec $ SQL. connectionHandle $ DB. conn db
118- unless (BA. null key) . exec $ " PRAGMA key = " <> keyString key <> " ;"
119- exec . fromQuery $
120+ let db' = SQL. connectionHandle $ DB. conn db
121+ unless (BA. null key) . SQLite3. exec db' $ " PRAGMA key = " <> keyString key <> " ;"
122+ SQLite3. exec db' . fromQuery $
120123 [sql |
121124 PRAGMA busy_timeout = 100;
122125 PRAGMA foreign_keys = ON;
123126 -- PRAGMA trusted_schema = OFF;
124127 PRAGMA secure_delete = ON;
125128 PRAGMA auto_vacuum = FULL;
126129 |]
127- createFunction ( DB. conn db) " simplex_xor_md5_combine" xorMd5Combine
130+ createStaticFunction db' " simplex_xor_md5_combine" 2 True sqliteXorMd5CombinePtr
128131 >>= either (throwIO . userError . show ) pure
129132
133+ foreign export ccall " simplex_xor_md5_combine" sqliteXorMd5Combine :: SQLiteFunc
134+
135+ foreign import ccall " &simplex_xor_md5_combine" sqliteXorMd5CombinePtr :: FunPtr SQLiteFunc
136+
137+ sqliteXorMd5Combine :: SQLiteFunc
138+ sqliteXorMd5Combine = mkSQLiteFunc $ \ cxt args -> do
139+ idsHash <- SQLite3. funcArgBlob args 0
140+ rId <- SQLite3. funcArgBlob args 1
141+ SQLite3. funcResultBlob cxt $ xorMd5Combine idsHash rId
142+
130143xorMd5Combine :: ByteString -> ByteString -> ByteString
131144xorMd5Combine idsHash rId = B. packZipWith xor idsHash $ C. md5Hash rId
132145
0 commit comments