@@ -38,7 +38,6 @@ module Simplex.Messaging.Agent.Store.AgentStore
3838 -- * Client services
3939 createClientService ,
4040 getClientServiceCredentials ,
41- getSubscriptionServices ,
4241 getSubscriptionService ,
4342 getClientServiceServers ,
4443 setClientServiceId ,
@@ -345,7 +344,7 @@ handleSQLError err e = case constraintViolation e of
345344handleSQLError :: StoreError -> SQLError -> StoreError
346345handleSQLError err e
347346 | SQL. sqlError e == SQL. ErrorConstraint = err
348- | otherwise = SEInternal $ bshow e
347+ | otherwise = SEInternal $ encodeUtf8 $ tshow e <> " : " <> SQL. sqlErrorDetails e <> " , " <> SQL. sqlErrorContext e
349348#endif
350349
351350createUserRecord :: DB. Connection -> IO UserId
@@ -409,6 +408,7 @@ deleteUsersWithoutConns db = do
409408createClientService :: DB. Connection -> UserId -> SMPServer -> (C. KeyHash , TLS. Credential ) -> IO ()
410409createClientService db userId srv (kh, (cert, pk)) = do
411410 serverKeyHash_ <- createServer_ db srv
411+ print " createClientService"
412412 DB. execute
413413 db
414414 [sql |
@@ -440,44 +440,44 @@ getClientServiceCredentials db userId srv =
440440 where
441441 toService (kh, cert, pk, serviceId_) = ((kh, (cert, pk)), serviceId_)
442442
443- getSubscriptionServices :: DB. Connection -> IO [(UserId , (SMPServer , ServiceSub ))]
444- getSubscriptionServices db = map toUserService <$> DB. query_ db clientServiceQuery
445- where
446- toUserService (Only userId :. serviceRow) = (userId, toServerService serviceRow)
447-
448443getSubscriptionService :: DB. Connection -> UserId -> SMPServer -> IO (Maybe ServiceSub )
449- getSubscriptionService db userId (SMPServer h p kh) =
450- maybeFirstRow toService $
444+ getSubscriptionService db userId (SMPServer h p kh) = do
445+ print " 1111 before getSubscriptionService"
446+ r <- maybeFirstRow toService $
451447 DB. query
452448 db
453449 [sql |
454450 SELECT c.service_id, c.service_queue_count, c.service_queue_ids_hash
455451 FROM client_services c
456452 JOIN servers s ON s.host = c.host AND s.port = c.port
457- WHERE c.user_id = ? AND c.host = ? AND c.port = ? AND COALESCE(c.server_key_hash, s.key_hash) = ?
453+ WHERE c.user_id = ? AND c.host = ? AND c.port = ? AND COALESCE(c.server_key_hash, s.key_hash) = ? AND service_id IS NOT NULL
458454 |]
459455 (userId, h, p, kh)
456+ print " 2222 after getSubscriptionService"
457+ pure r
460458 where
461459 toService (serviceId, qCnt, idsHash) = ServiceSub serviceId qCnt idsHash
462460
463461getClientServiceServers :: DB. Connection -> UserId -> IO [(SMPServer , ServiceSub )]
464462getClientServiceServers db userId =
465- map toServerService <$> DB. query db (clientServiceQuery <> " WHERE c.user_id = ?" ) (Only userId)
466-
467- clientServiceQuery :: Query
468- clientServiceQuery =
469- [sql |
470- SELECT c.host, c.port, COALESCE(c.server_key_hash, s.key_hash), c.service_id, c.service_queue_count, c.service_queue_ids_hash
471- FROM client_services c
472- JOIN servers s ON s.host = c.host AND s.port = c.port
473- |]
463+ map toServerService <$>
464+ DB. query
465+ db
466+ [sql |
467+ SELECT c.host, c.port, COALESCE(c.server_key_hash, s.key_hash), c.service_id, c.service_queue_count, c.service_queue_ids_hash
468+ FROM client_services c
469+ JOIN servers s ON s.host = c.host AND s.port = c.port
470+ WHERE c.user_id = ? AND service_id IS NOT NULL
471+ |]
472+ (Only userId)
474473
475474toServerService :: (NonEmpty TransportHost , ServiceName , C. KeyHash , ServiceId , Int64 , Binary ByteString ) -> (ProtocolServer 'PSMP, ServiceSub )
476475toServerService (host, port, kh, serviceId, n, Binary idsHash) =
477476 (SMPServer host port kh, ServiceSub serviceId n (IdsHash idsHash))
478477
479478setClientServiceId :: DB. Connection -> UserId -> SMPServer -> ServiceId -> IO ()
480- setClientServiceId db userId srv serviceId =
479+ setClientServiceId db userId srv serviceId = do
480+ print " setClientServiceId"
481481 DB. execute
482482 db
483483 [sql |
@@ -488,14 +488,20 @@ setClientServiceId db userId srv serviceId =
488488 (serviceId, userId, host srv, port srv)
489489
490490deleteClientService :: DB. Connection -> UserId -> SMPServer -> IO ()
491- deleteClientService db userId srv =
491+ deleteClientService db userId ( SMPServer h p kh) =
492492 DB. execute
493493 db
494494 [sql |
495495 DELETE FROM client_services
496496 WHERE user_id = ? AND host = ? AND port = ?
497+ AND EXISTS (
498+ SELECT 1 FROM servers s
499+ WHERE s.host = client_services.host
500+ AND s.port = client_services.port
501+ AND COALESCE(client_services.server_key_hash, s.key_hash) = ?
502+ );
497503 |]
498- (userId, host srv, port srv )
504+ (userId, h, p, Just kh )
499505
500506deleteClientServices :: DB. Connection -> UserId -> IO ()
501507deleteClientServices db userId = do
@@ -2280,7 +2286,8 @@ getUserServerRcvQueueSubs db userId (SMPServer h p kh) onlyNeeded hasService =
22802286 | otherwise = " "
22812287
22822288unassocUserServerRcvQueueSubs :: DB. Connection -> UserId -> SMPServer -> IO [RcvQueueSub ]
2283- unassocUserServerRcvQueueSubs db userId (SMPServer h p kh) =
2289+ unassocUserServerRcvQueueSubs db userId srv@ (SMPServer h p kh) = do
2290+ deleteClientService db userId srv
22842291 map toRcvQueueSub
22852292 <$> DB. query
22862293 db
@@ -2295,7 +2302,11 @@ unassocUserServerRcvQueueSubs db userId (SMPServer h p kh) =
22952302 |]
22962303
22972304unassocUserServerRcvQueueSubs' :: DB. Connection -> UserId -> SMPServer -> IO ()
2298- unassocUserServerRcvQueueSubs' db userId (SMPServer h p kh) = DB. execute db removeRcvAssocsQuery (h, p, userId, kh)
2305+ unassocUserServerRcvQueueSubs' db userId srv@ (SMPServer h p kh) = do
2306+ print " 111 before deleteClientService"
2307+ deleteClientService db userId srv
2308+ print " 222 after deleteClientService"
2309+ DB. execute db removeRcvAssocsQuery (h, p, userId, kh)
22992310
23002311unsetQueuesToSubscribe :: DB. Connection -> IO ()
23012312unsetQueuesToSubscribe db = DB. execute_ db " UPDATE rcv_queues SET to_subscribe = 0 WHERE to_subscribe = 1"
0 commit comments