diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 96aaf9a8a1..ca0ab31b9f 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -2219,18 +2219,20 @@ processAgentMsgRcvFile _corrId aFileId msg = where process :: User -> m () process user = do - _rcvFile <- withStore (\db -> getAgentRcvFileXFTP db user $ AgentRcvFileId aFileId) - -- >>= updateConnStatus - -- load file transfer meta (add chat item status to type and also contact/group) + fileId <- withStore (`getAgentRcvFileIdXFTP` AgentRcvFileId aFileId) case msg of RFPROG _sent _total -> do -- update chat item status -- send status to view pure () RFDONE _filePath -> do - -- update chat item status - -- send status to view - pure () + ci <- withStore $ \db -> do + liftIO $ do + updateRcvFileStatus' db fileId FSComplete + updateCIFileStatus db user fileId CIFSRcvComplete + getChatItemByFileId db user fileId + -- ack to agent + toView $ CRRcvFileComplete user ci RFERR _e -> do -- update chat item status -- send status to view @@ -2907,17 +2909,13 @@ processAgentMessageConn user@User {userId} corrId agentConnId agentMessage = do processFDMessage :: FileTransferId -> FileDescr -> m () processFDMessage fileId fileDescr = do - (rfd, _aci) <- withStore $ \db -> do - rfd <- appendRcvFD db userId fileId fileDescr - aci <- getChatItemByFileId db user fileId - -- ? re-create file item if it does not exist - pure (rfd, aci) + rfd <- withStore $ \db -> appendRcvFD db userId fileId fileDescr let RcvFileDescr {fileDescrText, fileDescrComplete} = rfd when fileDescrComplete $ do rd <- parseRcvFileDescription fileDescrText tmp <- readTVarIO =<< asks tempDirectory aFileId <- withAgent $ \a -> xftpReceiveFile a (aUserId user) rd tmp - withStore' $ \db -> updateRcvFileAgentId db fileId aFileId + withStore' $ \db -> updateRcvFileAgentId db fileId (AgentRcvFileId aFileId) cancelMessageFile :: Contact -> SharedMsgId -> MsgMeta -> m () cancelMessageFile ct _sharedMsgId msgMeta = do diff --git a/src/Simplex/Chat/Migrations/M20230304_file_description.hs b/src/Simplex/Chat/Migrations/M20230304_file_description.hs index 40e7d0f0a1..54bf3b8ffe 100644 --- a/src/Simplex/Chat/Migrations/M20230304_file_description.hs +++ b/src/Simplex/Chat/Migrations/M20230304_file_description.hs @@ -28,8 +28,12 @@ ALTER TABLE files ADD COLUMN private_snd_file_descr TEXT NULL; ALTER TABLE snd_files ADD COLUMN file_descr_id INTEGER NULL REFERENCES xftp_file_descriptions ON DELETE SET NULL; +CREATE INDEX idx_snd_files_file_descr_id ON snd_files(file_descr_id); + ALTER TABLE rcv_files ADD COLUMN file_descr_id INTEGER NULL REFERENCES xftp_file_descriptions ON DELETE SET NULL; +CREATE INDEX idx_rcv_files_file_descr_id ON rcv_files(file_descr_id); + ALTER TABLE rcv_files ADD COLUMN agent_rcv_file_id BLOB NULL; |] diff --git a/src/Simplex/Chat/Migrations/chat_schema.sql b/src/Simplex/Chat/Migrations/chat_schema.sql index 5c27585083..1e36360b4c 100644 --- a/src/Simplex/Chat/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Migrations/chat_schema.sql @@ -567,3 +567,5 @@ CREATE TABLE xftp_file_descriptions( created_at TEXT NOT NULL DEFAULT(datetime('now')), updated_at TEXT NOT NULL DEFAULT(datetime('now')) ); +CREATE INDEX idx_snd_files_file_descr_id ON snd_files(file_descr_id); +CREATE INDEX idx_rcv_files_file_descr_id ON rcv_files(file_descr_id); diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 1eea4df69d..44be7f2f7b 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -160,7 +160,7 @@ module Simplex.Chat.Store updateSndFTDescrXFTP, updateSndFTDeliveryXFTP, getAgentSndFileIdXFTP, - getAgentRcvFileXFTP, + getAgentRcvFileIdXFTP, updateFileCancelled, updateCIFileStatus, getSharedMsgIdByFileId, @@ -184,6 +184,7 @@ module Simplex.Chat.Store acceptRcvInlineFT, startRcvInlineFT, updateRcvFileStatus, + updateRcvFileStatus', createRcvFileChunk, updatedRcvFileChunkStored, deleteRcvFileChunks, @@ -360,7 +361,7 @@ import Simplex.Chat.Migrations.M20230304_file_description import Simplex.Chat.Protocol import Simplex.Chat.Types import Simplex.Chat.Util (week) -import Simplex.Messaging.Agent.Protocol (ACorrId, AgentMsgId, ConnId, InvitationId, MsgMeta (..), RcvFileId, UserId) +import Simplex.Messaging.Agent.Protocol (ACorrId, AgentMsgId, ConnId, InvitationId, MsgMeta (..), UserId) import Simplex.Messaging.Agent.Store.SQLite (SQLiteStore (..), createSQLiteStore, firstRow, firstRow', maybeFirstRow, withTransaction) import Simplex.Messaging.Agent.Store.SQLite.Migrations (Migration (..)) import qualified Simplex.Messaging.Crypto as C @@ -2783,8 +2784,10 @@ getAgentSndFileIdXFTP db User {userId} aSndFileId = ExceptT . firstRow fromOnly (SESndFileNotFoundXFTP aSndFileId) $ DB.query db "SELECT file_id FROM files WHERE user_id = ? AND agent_snd_file_id = ?" (userId, aSndFileId) -getAgentRcvFileXFTP :: DB.Connection -> User -> AgentRcvFileId -> ExceptT StoreError IO FileTransferMeta -getAgentRcvFileXFTP _db _user _aFileId = undefined +getAgentRcvFileIdXFTP :: DB.Connection -> AgentRcvFileId -> ExceptT StoreError IO FileTransferId +getAgentRcvFileIdXFTP db aRcvFileId = + ExceptT . firstRow fromOnly (SERcvFileNotFoundXFTP aRcvFileId) $ + DB.query db "SELECT file_id FROM rcv_files WHERE agent_rcv_file_id = ?" (Only aRcvFileId) updateFileCancelled :: MsgDirectionI d => DB.Connection -> User -> Int64 -> CIFileStatus d -> IO () updateFileCancelled db User {userId} fileId ciFileStatus = do @@ -3019,7 +3022,7 @@ getRcvFileDescrByFileId_ db fileId = toRcvFileDescr (fileDescrId, fileDescrText, fileDescrPartNo, fileDescrComplete) = RcvFileDescr {fileDescrId, fileDescrText, fileDescrPartNo, fileDescrComplete} -updateRcvFileAgentId :: DB.Connection -> FileTransferId -> RcvFileId -> IO () +updateRcvFileAgentId :: DB.Connection -> FileTransferId -> AgentRcvFileId -> IO () updateRcvFileAgentId db fileId aFileId = do currentTs <- getCurrentTime DB.execute db "UPDATE rcv_files SET agent_rcv_file_id = ?, updated_at = ? WHERE file_id = ?" (aFileId, currentTs, fileId) @@ -3115,7 +3118,10 @@ acceptRcvFT_ db User {userId} fileId filePath rcvFileInline currentTs = do (rcvFileInline, FSAccepted, currentTs, fileId) updateRcvFileStatus :: DB.Connection -> RcvFileTransfer -> FileStatus -> IO () -updateRcvFileStatus db RcvFileTransfer {fileId} status = do +updateRcvFileStatus db RcvFileTransfer {fileId} = updateRcvFileStatus' db fileId + +updateRcvFileStatus' :: DB.Connection -> FileTransferId -> FileStatus -> IO () +updateRcvFileStatus' db fileId status = do currentTs <- getCurrentTime DB.execute db "UPDATE rcv_files SET file_status = ?, updated_at = ? WHERE file_id = ?" (status, currentTs, fileId) @@ -5136,7 +5142,8 @@ data StoreError | SERcvFileInvalidDescrPart | SESharedMsgIdNotFoundByFileId {fileId :: FileTransferId} | SEFileIdNotFoundBySharedMsgId {sharedMsgId :: SharedMsgId} - | SESndFileNotFoundXFTP {agentFileId :: AgentSndFileId} + | SESndFileNotFoundXFTP {agentSndFileId :: AgentSndFileId} + | SERcvFileNotFoundXFTP {agentRcvFileId :: AgentRcvFileId} | SEConnectionNotFound {agentConnId :: AgentConnId} | SEConnectionNotFoundById {connId :: Int64} | SEPendingConnectionNotFound {connId :: Int64}