67
67
import time
68
68
from binascii import hexlify , unhexlify
69
69
from struct import pack , unpack
70
+ import sqlite3
70
71
71
72
import six
72
73
from six .moves import configparser , http_client , xmlrpc_server
@@ -953,20 +954,32 @@ def HandleGetInboxMessageById(self, hid, readStatus=None):
953
954
23 , 'Bool expected in readStatus, saw %s instead.'
954
955
% type (readStatus ))
955
956
queryreturn = sqlQuery (
956
- "SELECT read FROM inbox WHERE msgid=?" , msgid )
957
+ "SELECT read FROM inbox WHERE msgid=?" , sqlite3 .Binary (msgid ))
958
+ if len (queryreturn ) < 1 :
959
+ queryreturn = sqlQuery (
960
+ "SELECT read FROM inbox WHERE msgid=CAST(? AS TEXT)" , msgid )
957
961
# UPDATE is slow, only update if status is different
958
962
try :
959
963
if (queryreturn [0 ][0 ] == 1 ) != readStatus :
960
- sqlExecute (
964
+ rowcount = sqlExecute (
961
965
"UPDATE inbox set read = ? WHERE msgid=?" ,
962
- readStatus , msgid )
966
+ readStatus , sqlite3 .Binary (msgid ))
967
+ if rowcount < 1 :
968
+ rowcount = sqlExecute (
969
+ "UPDATE inbox set read = ? WHERE msgid=CAST(? AS TEXT)" ,
970
+ readStatus , msgid )
963
971
queues .UISignalQueue .put (('changedInboxUnread' , None ))
964
972
except IndexError :
965
973
pass
966
974
queryreturn = sqlQuery (
967
975
"SELECT msgid, toaddress, fromaddress, subject, received, message,"
968
- " encodingtype, read FROM inbox WHERE msgid=?" , msgid
976
+ " encodingtype, read FROM inbox WHERE msgid=?" , sqlite3 . Binary ( msgid )
969
977
)
978
+ if len (queryreturn ) < 1 :
979
+ queryreturn = sqlQuery (
980
+ "SELECT msgid, toaddress, fromaddress, subject, received, message,"
981
+ " encodingtype, read FROM inbox WHERE msgid=CAST(? AS TEXT)" , msgid
982
+ )
970
983
try :
971
984
return {"inboxMessage" : [
972
985
self ._dump_inbox_message (* queryreturn [0 ])]}
@@ -1035,8 +1048,14 @@ def HandleGetSentMessageById(self, hid):
1035
1048
queryreturn = sqlQuery (
1036
1049
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1037
1050
" message, encodingtype, status, ackdata FROM sent WHERE msgid=?" ,
1038
- msgid
1051
+ sqlite3 . Binary ( msgid )
1039
1052
)
1053
+ if len (queryreturn ) < 1 :
1054
+ queryreturn = sqlQuery (
1055
+ "SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1056
+ " message, encodingtype, status, ackdata FROM sent WHERE msgid=CAST(? AS TEXT)" ,
1057
+ msgid
1058
+ )
1040
1059
try :
1041
1060
return {"sentMessage" : [
1042
1061
self ._dump_sent_message (* queryreturn [0 ])
@@ -1072,8 +1091,14 @@ def HandleGetSentMessagesByAckData(self, ackData):
1072
1091
queryreturn = sqlQuery (
1073
1092
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1074
1093
" message, encodingtype, status, ackdata FROM sent"
1075
- " WHERE ackdata=?" , ackData
1094
+ " WHERE ackdata=?" , sqlite3 . Binary ( ackData )
1076
1095
)
1096
+ if len (queryreturn ) < 1 :
1097
+ queryreturn = sqlQuery (
1098
+ "SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1099
+ " message, encodingtype, status, ackdata FROM sent"
1100
+ " WHERE ackdata=CAST(? AS TEXT)" , ackData
1101
+ )
1077
1102
1078
1103
try :
1079
1104
return {"sentMessage" : [
@@ -1093,7 +1118,9 @@ def HandleTrashMessage(self, msgid):
1093
1118
# Trash if in inbox table
1094
1119
helper_inbox .trash (msgid )
1095
1120
# Trash if in sent table
1096
- sqlExecute ("UPDATE sent SET folder='trash' WHERE msgid=?" , msgid )
1121
+ rowcount = sqlExecute ("UPDATE sent SET folder='trash' WHERE msgid=?" , sqlite3 .Binary (msgid ))
1122
+ if rowcount < 1 :
1123
+ sqlExecute ("UPDATE sent SET folder='trash' WHERE msgid=CAST(? AS TEXT)" , msgid )
1097
1124
return 'Trashed message (assuming message existed).'
1098
1125
1099
1126
@command ('trashInboxMessage' )
@@ -1107,7 +1134,9 @@ def HandleTrashInboxMessage(self, msgid):
1107
1134
def HandleTrashSentMessage (self , msgid ):
1108
1135
"""Trash sent message by msgid (encoded in hex)."""
1109
1136
msgid = self ._decode (msgid , "hex" )
1110
- sqlExecute ('''UPDATE sent SET folder='trash' WHERE msgid=?''' , msgid )
1137
+ rowcount = sqlExecute ('''UPDATE sent SET folder='trash' WHERE msgid=?''' , sqlite3 .Binary (msgid ))
1138
+ if rowcount < 1 :
1139
+ sqlExecute ('''UPDATE sent SET folder='trash' WHERE msgid=CAST(? AS TEXT)''' , msgid )
1111
1140
return 'Trashed sent message (assuming message existed).'
1112
1141
1113
1142
@command ('sendMessage' )
@@ -1217,7 +1246,10 @@ def HandleGetStatus(self, ackdata):
1217
1246
raise APIError (15 , 'Invalid ackData object size.' )
1218
1247
ackdata = self ._decode (ackdata , "hex" )
1219
1248
queryreturn = sqlQuery (
1220
- "SELECT status FROM sent where ackdata=?" , ackdata )
1249
+ "SELECT status FROM sent where ackdata=?" , sqlite3 .Binary (ackdata ))
1250
+ if len (queryreturn ) < 1 :
1251
+ queryreturn = sqlQuery (
1252
+ "SELECT status FROM sent where ackdata=CAST(? AS TEXT)" , ackdata )
1221
1253
try :
1222
1254
return queryreturn [0 ][0 ]
1223
1255
except IndexError :
@@ -1354,7 +1386,9 @@ def HandleTrashSentMessageByAckDAta(self, ackdata):
1354
1386
"""Trash a sent message by ackdata (hex encoded)"""
1355
1387
# This API method should only be used when msgid is not available
1356
1388
ackdata = self ._decode (ackdata , "hex" )
1357
- sqlExecute ("UPDATE sent SET folder='trash' WHERE ackdata=?" , ackdata )
1389
+ rowcount = sqlExecute ("UPDATE sent SET folder='trash' WHERE ackdata=?" , sqlite3 .Binary (ackdata ))
1390
+ if rowcount < 1 :
1391
+ sqlExecute ("UPDATE sent SET folder='trash' WHERE ackdata=CAST(? AS TEXT)" , ackdata )
1358
1392
return 'Trashed sent message (assuming message existed).'
1359
1393
1360
1394
@command ('disseminatePubkey' )
@@ -1421,19 +1455,29 @@ def HandleGetMessageDataByDestinationHash(self, requestedHash):
1421
1455
# use it we'll need to fill out a field in our inventory database
1422
1456
# which is blank by default (first20bytesofencryptedmessage).
1423
1457
queryreturn = sqlQuery (
1424
- "SELECT hash, payload FROM inventory WHERE tag = ''"
1425
- " and objecttype = 2" )
1458
+ "SELECT hash, payload FROM inventory WHERE tag = ?"
1459
+ " and objecttype = 2" , sqlite3 .Binary (b"" ))
1460
+ if len (queryreturn ) < 1 :
1461
+ queryreturn = sqlQuery (
1462
+ "SELECT hash, payload FROM inventory WHERE tag = CAST(? AS TEXT)"
1463
+ " and objecttype = 2" , b"" )
1426
1464
with SqlBulkExecute () as sql :
1427
1465
for hash01 , payload in queryreturn :
1428
1466
readPosition = 16 # Nonce length + time length
1429
1467
# Stream Number length
1430
1468
readPosition += decodeVarint (
1431
1469
payload [readPosition :readPosition + 10 ])[1 ]
1432
- t = (payload [readPosition :readPosition + 32 ], hash01 )
1433
- sql .execute ("UPDATE inventory SET tag=? WHERE hash=?" , * t )
1470
+ t = (payload [readPosition :readPosition + 32 ], sqlite3 .Binary (hash01 ))
1471
+ _ , rowcount = sql .execute ("UPDATE inventory SET tag=? WHERE hash=?" , * t )
1472
+ if rowcount < 1 :
1473
+ t = (payload [readPosition :readPosition + 32 ], hash01 )
1474
+ sql .execute ("UPDATE inventory SET tag=? WHERE hash=CAST(? AS TEXT)" , * t )
1434
1475
1435
1476
queryreturn = sqlQuery (
1436
- "SELECT payload FROM inventory WHERE tag = ?" , requestedHash )
1477
+ "SELECT payload FROM inventory WHERE tag = ?" , sqlite3 .Binary (requestedHash ))
1478
+ if len (queryreturn ) < 1 :
1479
+ queryreturn = sqlQuery (
1480
+ "SELECT payload FROM inventory WHERE tag = CAST(? AS TEXT)" , requestedHash )
1437
1481
return {"receivedMessageDatas" : [
1438
1482
{'data' : hexlify (payload )} for payload , in queryreturn
1439
1483
]}
0 commit comments