merged
This commit is contained in:
commit
5fb08efe00
|
@ -2027,6 +2027,34 @@ class MyForm(QtGui.QMainWindow):
|
||||||
if float(self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) >= 1 or float(self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0:
|
if float(self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) >= 1 or float(self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0:
|
||||||
shared.config.set('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', str(int(float(
|
shared.config.set('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', str(int(float(
|
||||||
self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) * shared.networkDefaultPayloadLengthExtraBytes)))
|
self.settingsDialogInstance.ui.lineEditMaxAcceptableSmallMessageDifficulty.text()) * shared.networkDefaultPayloadLengthExtraBytes)))
|
||||||
|
#my implementation starts here,it was a line here.AQWA
|
||||||
|
if ((self.settingsDialogInstance.ui.lineEditHours.text()=='') and (self.settingsDialogInstance.ui.lineEditDays.text()=='') and (self.settingsDialogInstance.ui.lineEditMonths.text()=='')):
|
||||||
|
if (((shared.config.get('bitmessagesettings', 'hours')) != str(self.settingsDialogInstance.ui.lineEditHours.text())) or #if we update the time period from one time period(f.e 1/0/0) to default -/-/,inform the user that restart is needed in order his changes to take effect.AQWA
|
||||||
|
((shared.config.get('bitmessagesettings', 'days')) != str(self.settingsDialogInstance.ui.lineEditDays.text())) or
|
||||||
|
((shared.config.get('bitmessagesettings', 'months')) != str(self.settingsDialogInstance.ui.lineEditMonths.text()))) :
|
||||||
|
QMessageBox.about(self, _translate("MainWindow", "Restart"), _translate(
|
||||||
|
"MainWindow", "You must restart Bitmessage for the time period change to take effect."))
|
||||||
|
|
||||||
|
shared.config.set('bitmessagesettings', 'hours', '')#give default values to fields..this default situation is special and thats why its needs special treatment ;).AQWA
|
||||||
|
shared.config.set('bitmessagesettings', 'days', '')#these commands update each field in the keys.dat file.AQWA
|
||||||
|
shared.config.set('bitmessagesettings', 'months', '')
|
||||||
|
shared.config.set('bitmessagesettings', 'timeperiod', '-1')
|
||||||
|
else:#So,if all time period fields(hours,months,days) have valid values(valid values---> 0/0/0, 0/3/2, -/-/-, no valid--> -/0/5, 5/-/-), you can calculate the time period
|
||||||
|
shared.config.set('bitmessagesettings', 'timeperiod', str(int(str(self.settingsDialogInstance.ui.lineEditHours.text())) * 60 * 60 + int(str(self.settingsDialogInstance.ui.lineEditDays.text())) * 24 * 60 * 60 +
|
||||||
|
int(str(self.settingsDialogInstance.ui.lineEditMonths.text())) * (60 * 60 * 24 *365)/12))
|
||||||
|
|
||||||
|
if (((shared.config.get('bitmessagesettings', 'hours')) != str(self.settingsDialogInstance.ui.lineEditHours.text())) or#inform user tha he needs to restart bitmessage in order his changes to take effect.AQWA
|
||||||
|
((shared.config.get('bitmessagesettings', 'days')) != str(self.settingsDialogInstance.ui.lineEditDays.text())) or
|
||||||
|
((shared.config.get('bitmessagesettings', 'months')) != str(self.settingsDialogInstance.ui.lineEditMonths.text()))) :
|
||||||
|
QMessageBox.about(self, _translate("MainWindow", "Restart"), _translate(
|
||||||
|
"MainWindow", "You must restart Bitmessage for the time period change to take effect."))
|
||||||
|
shared.config.set('bitmessagesettings', 'hours', str(#this three commands update the fields of this new setting in keys.dat file.AQWA
|
||||||
|
self.settingsDialogInstance.ui.lineEditHours.text()))
|
||||||
|
shared.config.set('bitmessagesettings', 'days', str(
|
||||||
|
self.settingsDialogInstance.ui.lineEditDays.text()))
|
||||||
|
shared.config.set('bitmessagesettings', 'months', str(
|
||||||
|
self.settingsDialogInstance.ui.lineEditMonths.text()))
|
||||||
|
#my implementation stops here, there is a line.AQWA
|
||||||
|
|
||||||
# if str(self.settingsDialogInstance.ui.comboBoxMaxCores.currentText()) == 'All':
|
# if str(self.settingsDialogInstance.ui.comboBoxMaxCores.currentText()) == 'All':
|
||||||
# shared.config.set('bitmessagesettings', 'maxcores', '99999')
|
# shared.config.set('bitmessagesettings', 'maxcores', '99999')
|
||||||
|
@ -2964,6 +2992,15 @@ class settingsDialog(QtGui.QDialog):
|
||||||
QtCore.QObject.connect(self.ui.pushButtonNamecoinTest, QtCore.SIGNAL(
|
QtCore.QObject.connect(self.ui.pushButtonNamecoinTest, QtCore.SIGNAL(
|
||||||
"clicked()"), self.click_pushButtonNamecoinTest)
|
"clicked()"), self.click_pushButtonNamecoinTest)
|
||||||
|
|
||||||
|
#Adjusting time period for resending messages tab.AQWA
|
||||||
|
self.ui.lineEditHours.setText(str(#Giving values to edit boxes in the UI.AQWA
|
||||||
|
shared.config.get('bitmessagesettings', 'hours')))
|
||||||
|
self.ui.lineEditDays.setText(str(
|
||||||
|
shared.config.get('bitmessagesettings', 'days')))
|
||||||
|
self.ui.lineEditMonths.setText(str(
|
||||||
|
shared.config.get('bitmessagesettings', 'months')))#AQWA.
|
||||||
|
|
||||||
|
|
||||||
#'System' tab removed for now.
|
#'System' tab removed for now.
|
||||||
"""try:
|
"""try:
|
||||||
maxCores = shared.config.getint('bitmessagesettings', 'maxcores')
|
maxCores = shared.config.getint('bitmessagesettings', 'maxcores')
|
||||||
|
|
|
@ -318,7 +318,49 @@ class Ui_settingsDialog(object):
|
||||||
self.gridLayout_8.addLayout(self.horizontalLayout, 1, 0, 1, 3)
|
self.gridLayout_8.addLayout(self.horizontalLayout, 1, 0, 1, 3)
|
||||||
self.tabWidgetSettings.addTab(self.tabNamecoin, _fromUtf8(""))
|
self.tabWidgetSettings.addTab(self.tabNamecoin, _fromUtf8(""))
|
||||||
self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1)
|
self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1)
|
||||||
|
#this line existed before
|
||||||
|
#my new implementation starts here
|
||||||
|
self.tabResendingMessagesAdjustment=QtGui.QWidget()#all these lines are for the UI implementation, I dont think that you need special explanation about them.AQWA
|
||||||
|
self.tabResendingMessagesAdjustment.setObjectName(_fromUtf8("tabResendingMessagesAdjustment"))#Please note that approximately 58 line codes added to setting.ui also responsible for the UI.AQWA
|
||||||
|
self.gridLayout_9 = QtGui.QGridLayout(self.tabResendingMessagesAdjustment)
|
||||||
|
self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
|
||||||
|
self.label_19 = QtGui.QLabel(self.tabResendingMessagesAdjustment)
|
||||||
|
self.label_19.setWordWrap(True)
|
||||||
|
self.label_19.setObjectName(_fromUtf8("label_19"))
|
||||||
|
self.gridLayout_9.addWidget(self.label_19, 0, 0, 1, 0)
|
||||||
|
spacerItem13 = QtGui.QSpacerItem(102, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||||
|
self.gridLayout_9.addItem(spacerItem13, 1, 0, 1, 1)
|
||||||
|
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||||
|
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
|
||||||
|
self.label_20 = QtGui.QLabel(self.tabResendingMessagesAdjustment)
|
||||||
|
self.label_20.setLayoutDirection(QtCore.Qt.LeftToRight)
|
||||||
|
self.label_20.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||||
|
self.label_20.setObjectName(_fromUtf8("label_20"))#This are Qt code..I just add a label to my tab.AQWA
|
||||||
|
self.gridLayout_9.addWidget(self.label_20, 2, 0, 1, 1)
|
||||||
|
self.lineEditHours = QtGui.QLineEdit(self.tabResendingMessagesAdjustment)
|
||||||
|
self.lineEditHours.setMaximumSize(QtCore.QSize(33, 16777))
|
||||||
|
self.lineEditHours.setObjectName(_fromUtf8("lineEditHours"))##This are Qt code..I just add a edit box to my tab.AQWA
|
||||||
|
self.gridLayout_9.addWidget(self.lineEditHours, 2, 1, 1, 1)
|
||||||
|
self.label_22 = QtGui.QLabel(self.tabResendingMessagesAdjustment)
|
||||||
|
self.label_22.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||||
|
self.label_22.setObjectName(_fromUtf8("label_22"))
|
||||||
|
self.gridLayout_9.addWidget(self.label_22, 2, 2, 1, 1)
|
||||||
|
self.lineEditDays = QtGui.QLineEdit(self.tabResendingMessagesAdjustment)
|
||||||
|
self.lineEditDays.setMaximumSize(QtCore.QSize(33, 16777))
|
||||||
|
self.lineEditDays.setObjectName(_fromUtf8("lineEditDays"))
|
||||||
|
self.gridLayout_9.addWidget(self.lineEditDays, 2, 3, 1, 1)
|
||||||
|
self.label_23 = QtGui.QLabel(self.tabResendingMessagesAdjustment)
|
||||||
|
self.label_23.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||||
|
self.label_23.setObjectName(_fromUtf8("label_23"))
|
||||||
|
self.gridLayout_9.addWidget(self.label_23, 2, 4, 1, 1)
|
||||||
|
self.lineEditMonths = QtGui.QLineEdit(self.tabResendingMessagesAdjustment)
|
||||||
|
self.lineEditMonths.setMaximumSize(QtCore.QSize(33, 16777))
|
||||||
|
self.lineEditMonths.setObjectName(_fromUtf8("lineEditMonths"))
|
||||||
|
self.gridLayout_9.addWidget(self.lineEditMonths, 2, 5, 1, 1)
|
||||||
|
spacerItem15 = QtGui.QSpacerItem(20, 147, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||||
|
self.gridLayout_9.addItem(spacerItem15, 3, 1, 1, 1)
|
||||||
|
self.tabWidgetSettings.addTab(self.tabResendingMessagesAdjustment, _fromUtf8(""))
|
||||||
|
#my new implementation stops here, it wasn't line here
|
||||||
self.retranslateUi(settingsDialog)
|
self.retranslateUi(settingsDialog)
|
||||||
self.tabWidgetSettings.setCurrentIndex(0)
|
self.tabWidgetSettings.setCurrentIndex(0)
|
||||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), settingsDialog.accept)
|
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), settingsDialog.accept)
|
||||||
|
@ -382,6 +424,13 @@ class Ui_settingsDialog(object):
|
||||||
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab), _translate("settingsDialog", "Demanded difficulty", None))
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab), _translate("settingsDialog", "Demanded difficulty", None))
|
||||||
self.label_15.setText(_translate("settingsDialog", "Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable.", None))
|
self.label_15.setText(_translate("settingsDialog", "Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable.", None))
|
||||||
self.label_13.setText(_translate("settingsDialog", "Maximum acceptable total difficulty:", None))
|
self.label_13.setText(_translate("settingsDialog", "Maximum acceptable total difficulty:", None))
|
||||||
|
#my new implementation starts here,it wasn't line here.Too simple to explain :D..AQWA
|
||||||
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabResendingMessagesAdjustment), _translate("settingsDialog", "Adjusting time period for resending messages", None))
|
||||||
|
self.label_19.setText(_translate("settingsDialog", "<html><head/><body><p>If you send a message to someone and he is offline for more than two days, Bitmessage will send the message again after an additional two days. This will be continued with exponential backoff forever. Messages will continue to be sent after 4, 8,16 days and so on until the receiver get them. </p><p> Here you can adjust Bitmessage to stop trying to send messages after X hours/days/months.</p></body></html>", None))
|
||||||
|
self.label_20.setText(_translate("settingsDialog", "Time in hours/days/months:", None))
|
||||||
|
self.label_22.setText(_translate("settingsDialog", "/", None))
|
||||||
|
self.label_23.setText(_translate("settingsDialog", "/", None))
|
||||||
|
#my new implementation stops here, it wasn't line here
|
||||||
self.label_14.setText(_translate("settingsDialog", "Maximum acceptable small message difficulty:", None))
|
self.label_14.setText(_translate("settingsDialog", "Maximum acceptable small message difficulty:", None))
|
||||||
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab_2), _translate("settingsDialog", "Max acceptable difficulty", None))
|
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab_2), _translate("settingsDialog", "Max acceptable difficulty", None))
|
||||||
self.label_16.setText(_translate("settingsDialog", "<html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=\" font-style:italic;\">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html>", None))
|
self.label_16.setText(_translate("settingsDialog", "<html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=\" font-style:italic;\">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html>", None))
|
||||||
|
|
|
@ -756,6 +756,73 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabResendingMessagesAdjustment">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Adjusting time period for resending messages</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_9">
|
||||||
|
<item row="0" column="0" colspan="5">
|
||||||
|
<widget class="QLabel" name="label_19">
|
||||||
|
<property name="text">
|
||||||
|
<string> If you send a message to someone and he is offline for more than two days, Bitmessage will send the message again after an additional two days. This will be continued with exponential backoff forever. Μessages will continue to be sent after 4, 8,16 days etc. until the receiver get them. Here you can adjust Bitmessage to stop trying to send messages after X hours/days/months. This time period needs to be longer than 5 days./p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_20">
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::LeftToRight</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Time in hours/days/months:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEditHours">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>33</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label_22">
|
||||||
|
<property name="text">
|
||||||
|
<string>/</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLineEdit" name="lineEditDays"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QLabel" name="label_23">
|
||||||
|
<property name="text">
|
||||||
|
<string>/</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<widget class="QLineEdit" name="lineEditMonths"/>
|
||||||
|
</item>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>33</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>tabWidgetSettings</tabstop>
|
<tabstop>tabWidgetSettings</tabstop>
|
||||||
<tabstop>checkBoxStartOnLogon</tabstop>
|
<tabstop>checkBoxStartOnLogon</tabstop>
|
||||||
|
|
|
@ -10,16 +10,16 @@ from debug import logger
|
||||||
|
|
||||||
'''The singleCleaner class is a timer-driven thread that cleans data structures to free memory, resends messages when a remote node doesn't respond, and sends pong messages to keep connections alive if the network isn't busy.
|
'''The singleCleaner class is a timer-driven thread that cleans data structures to free memory, resends messages when a remote node doesn't respond, and sends pong messages to keep connections alive if the network isn't busy.
|
||||||
It cleans these data structures in memory:
|
It cleans these data structures in memory:
|
||||||
inventory (moves data to the on-disk sql database)
|
inventory (moves data to the on-disk sql database)
|
||||||
inventorySets (clears then reloads data out of sql database)
|
inventorySets (clears then reloads data out of sql database)
|
||||||
|
|
||||||
It cleans these tables on the disk:
|
It cleans these tables on the disk:
|
||||||
inventory (clears data more than 2 days and 12 hours old)
|
inventory (clears data more than 2 days and 12 hours old)
|
||||||
pubkeys (clears pubkeys older than 4 weeks old which we have not used personally)
|
pubkeys (clears pubkeys older than 4 weeks old which we have not used personally)
|
||||||
|
|
||||||
It resends messages when there has been no response:
|
It resends messages when there has been no response:
|
||||||
resends getpubkey messages in 4 days (then 8 days, then 16 days, etc...)
|
resends getpubkey messages in 4 days (then 8 days, then 16 days, etc...)
|
||||||
resends msg messages in 4 days (then 8 days, then 16 days, etc...)
|
resends msg messages in 4 days (then 8 days, then 16 days, etc...)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
@ -86,35 +86,20 @@ class singleCleaner(threading.Thread):
|
||||||
break
|
break
|
||||||
toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber = row
|
toaddress, toripe, fromaddress, subject, message, ackdata, lastactiontime, status, pubkeyretrynumber, msgretrynumber = row
|
||||||
if status == 'awaitingpubkey':
|
if status == 'awaitingpubkey':
|
||||||
|
if int(shared.config.get('bitmessagesettings', 'timeperiod'))> -1:#My implemenentation starts here.This if statement would become very big with my new code,so I created two function(see at the end of this file) to reduce code.I did.The default value of timeperiod is -1.This means that bitmessage resends messages every 5 days(they say 4 but actually is 5)for ever. If user changes the time period, timeperiod variable will have a specific value so the next if will be executed.AQWA
|
||||||
|
if (int(time.time()) - lastactiontime) > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (pubkeyretrynumber))) and ((int(time.time()) - lastactiontime) < int(shared.config.get('bitmessagesettings', 'timeperiod'))):#This line does the magic.This if checks if the time that the public key was sent is longer than 5 days. Then it sends the it again. But with this extra AND it will not send it if this time is shorter than timeperiod.AQWA
|
||||||
|
resendPubkey(pubkeyretrynumber,toripe)
|
||||||
|
else:#first it wasn't an else statement here, I put it for this setting. I just copy-paste the code again. If someone has any suggestion how we can do this without this if-else just say it.AQWA
|
||||||
if int(time.time()) - lastactiontime > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (pubkeyretrynumber))):
|
if int(time.time()) - lastactiontime > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (pubkeyretrynumber))):
|
||||||
print 'It has been a long time and we haven\'t heard a response to our getpubkey request. Sending again.'
|
resendPubkey(pubkeyretrynumber,toripe)
|
||||||
try:
|
|
||||||
del shared.neededPubkeys[
|
|
||||||
toripe] # We need to take this entry out of the shared.neededPubkeys structure because the shared.workerQueue checks to see whether the entry is already present and will not do the POW and send the message because it assumes that it has already done it recently.
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
shared.UISignalQueue.put((
|
|
||||||
'updateStatusBar', 'Doing work necessary to again attempt to request a public key...'))
|
|
||||||
t = ()
|
|
||||||
sqlExecute(
|
|
||||||
'''UPDATE sent SET lastactiontime=?, pubkeyretrynumber=?, status='msgqueued' WHERE toripe=?''',
|
|
||||||
int(time.time()),
|
|
||||||
pubkeyretrynumber + 1,
|
|
||||||
toripe)
|
|
||||||
shared.workerQueue.put(('sendmessage', ''))
|
|
||||||
else: # status == msgsent
|
else: # status == msgsent
|
||||||
|
if int(shared.config.get('bitmessagesettings', 'timeperiod'))> -1:#same thing here but for the message.Actually this is the most important thing in the whole feature!.AQWA
|
||||||
|
if (int(time.time()) - lastactiontime) > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (msgretrynumber))) and ((int(time.time()) - lastactiontime) < int(shared.config.get('bitmessagesettings', 'timeperiod'))):#same thing here.My implementation in this file stops here.AQWA
|
||||||
|
resendMsg(msgretrynumber,ackdata)
|
||||||
|
else:
|
||||||
if int(time.time()) - lastactiontime > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (msgretrynumber))):
|
if int(time.time()) - lastactiontime > (shared.maximumAgeOfAnObjectThatIAmWillingToAccept * (2 ** (msgretrynumber))):
|
||||||
print 'It has been a long time and we haven\'t heard an acknowledgement to our msg. Sending again.'
|
resendMsg(msgretrynumber,ackdata)
|
||||||
sqlExecute(
|
|
||||||
'''UPDATE sent SET lastactiontime=?, msgretrynumber=?, status=? WHERE ackdata=?''',
|
|
||||||
int(time.time()),
|
|
||||||
msgretrynumber + 1,
|
|
||||||
'msgqueued',
|
|
||||||
ackdata)
|
|
||||||
shared.workerQueue.put(('sendmessage', ''))
|
|
||||||
shared.UISignalQueue.put((
|
|
||||||
'updateStatusBar', 'Doing work necessary to again attempt to deliver a message...'))
|
|
||||||
|
|
||||||
# Let's also clear and reload shared.inventorySets to keep it from
|
# Let's also clear and reload shared.inventorySets to keep it from
|
||||||
# taking up an unnecessary amount of memory.
|
# taking up an unnecessary amount of memory.
|
||||||
|
@ -145,3 +130,36 @@ class singleCleaner(threading.Thread):
|
||||||
shared.knownNodesLock.release()
|
shared.knownNodesLock.release()
|
||||||
shared.needToWriteKnownNodesToDisk = False
|
shared.needToWriteKnownNodesToDisk = False
|
||||||
time.sleep(300)
|
time.sleep(300)
|
||||||
|
|
||||||
|
def resendPubkey(pubkeyretrynumber,toripe):#I just structured the code with these two functions. The code inside existed.It is not mine.AQWA
|
||||||
|
print 'It has been a long time and we haven\'t heard a response to our getpubkey request. Sending again.'
|
||||||
|
try:
|
||||||
|
del shared.neededPubkeys[
|
||||||
|
toripe] # We need to take this entry out of the shared.neededPubkeys structure because the shared.workerQueue checks to see whether the entry is already present and will not do the POW and send the message because it assumes that it has already done it recently.
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
shared.UISignalQueue.put((
|
||||||
|
'updateStatusBar', 'Doing work necessary to again attempt to request a public key...'))
|
||||||
|
t = ()
|
||||||
|
sqlExecute(
|
||||||
|
'''UPDATE sent SET lastactiontime=?, pubkeyretrynumber=?, status='msgqueued' WHERE toripe=?''',
|
||||||
|
int(time.time()),
|
||||||
|
pubkeyretrynumber + 1,
|
||||||
|
toripe)
|
||||||
|
shared.workerQueue.put(('sendmessage', ''))
|
||||||
|
|
||||||
|
def resendMsg(msgretrynumber,ackdata):
|
||||||
|
print 'It has been a long time and we haven\'t heard an acknowledgement to our msg. Sending again.'
|
||||||
|
sqlExecute(
|
||||||
|
'''UPDATE sent SET lastactiontime=?, msgretrynumber=?, status=? WHERE ackdata=?''',
|
||||||
|
int(time.time()),
|
||||||
|
msgretrynumber + 1,
|
||||||
|
'msgqueued',
|
||||||
|
ackdata)
|
||||||
|
shared.workerQueue.put(('sendmessage', ''))
|
||||||
|
shared.UISignalQueue.put((
|
||||||
|
'updateStatusBar', 'Doing work necessary to again attempt to deliver a message...'))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -272,6 +272,21 @@ class sqlThread(threading.Thread):
|
||||||
# Are you hoping to add a new option to the keys.dat file of existing
|
# Are you hoping to add a new option to the keys.dat file of existing
|
||||||
# Bitmessage users? Add it right above this line!
|
# Bitmessage users? Add it right above this line!
|
||||||
|
|
||||||
|
#my new implementation starts here, the most of these comment will be deleted, they are just for documentation
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 7:#this is the version that all we have,if you see your keys.dat file this is your version.AQWA
|
||||||
|
shared.config.set(#in order to not have to change your keys.dat file I update it with the new lines. I add to your keys.dat three new default fields.AQWA
|
||||||
|
'bitmessagesettings', 'hours', '')# hours, days, months have no value.This means that bitmessage works as before. It re-sends mails every 4,8,16 days..forever.AQWA
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'days', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'months', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'timeperiod', '-1')#time period has default value -1. This is used for checking in class_singleCleaner. If you leave default the time period or after you change it(f.i 1/0/0), again you set it with its default value(-/-/-) this variable will be -1.AQWA
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '8') #We update the version.If I leave it 7 every time that Bitmessage starts your setting will be lost.The default values(-/-/-) will be loaded all the time ;).That was juicy.AQWA
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
#my new implementation in this file stops here
|
||||||
|
|
||||||
try:
|
try:
|
||||||
testpayload = '\x00\x00'
|
testpayload = '\x00\x00'
|
||||||
t = ('1234', 1, testpayload, '12345678', 'no')
|
t = ('1234', 1, testpayload, '12345678', 'no')
|
||||||
|
|
436
src/class_sqlThread.py.orig
Normal file
436
src/class_sqlThread.py.orig
Normal file
|
@ -0,0 +1,436 @@
|
||||||
|
import threading
|
||||||
|
import shared
|
||||||
|
import sqlite3
|
||||||
|
import time
|
||||||
|
import shutil # used for moving the messages.dat file
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from debug import logger
|
||||||
|
from namecoin import ensureNamecoinOptions
|
||||||
|
import tr#anslate
|
||||||
|
|
||||||
|
# This thread exists because SQLITE3 is so un-threadsafe that we must
|
||||||
|
# submit queries to it and it puts results back in a different queue. They
|
||||||
|
# won't let us just use locks.
|
||||||
|
|
||||||
|
|
||||||
|
class sqlThread(threading.Thread):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.conn = sqlite3.connect(shared.appdata + 'messages.dat')
|
||||||
|
self.conn.text_factory = str
|
||||||
|
self.cur = self.conn.cursor()
|
||||||
|
try:
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE inbox (msgid blob, toaddress text, fromaddress text, subject text, received text, message text, folder text, encodingtype int, read bool, UNIQUE(msgid) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE sent (msgid blob, toaddress text, toripe blob, fromaddress text, subject text, message text, ackdata blob, lastactiontime integer, status text, pubkeyretrynumber integer, msgretrynumber integer, folder text, encodingtype int)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE subscriptions (label text, address text, enabled bool)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE addressbook (label text, address text)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE blacklist (label text, address text, enabled bool)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE whitelist (label text, address text, enabled bool)''' )
|
||||||
|
# Explanation of what is in the pubkeys table:
|
||||||
|
# The hash is the RIPEMD160 hash that is encoded in the Bitmessage address.
|
||||||
|
# transmitdata is literally the data that was included in the Bitmessage pubkey message when it arrived, except for the 24 byte protocol header- ie, it starts with the POW nonce.
|
||||||
|
# time is the time that the pubkey was broadcast on the network same as with every other type of Bitmessage object.
|
||||||
|
# usedpersonally is set to "yes" if we have used the key
|
||||||
|
# personally. This keeps us from deleting it because we may want to
|
||||||
|
# reply to a message in the future. This field is not a bool
|
||||||
|
# because we may need more flexability in the future and it doesn't
|
||||||
|
# take up much more space anyway.
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE pubkeys (hash blob, addressversion int, transmitdata blob, time int, usedpersonally text, UNIQUE(hash, addressversion) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE inventory (hash blob, objecttype text, streamnumber int, payload blob, receivedtime integer, tag blob, UNIQUE(hash) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE knownnodes (timelastseen int, stream int, services blob, host blob, port blob, UNIQUE(host, stream, port) ON CONFLICT REPLACE)''' )
|
||||||
|
# This table isn't used in the program yet but I
|
||||||
|
# have a feeling that we'll need it.
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO subscriptions VALUES('Bitmessage new releases/announcements','BM-GtovgYdgs7qXPkoYaRgrLFuFKz1SFpsw',1)''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE settings (key blob, value blob, UNIQUE(key) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute( '''INSERT INTO settings VALUES('version','5')''')
|
||||||
|
self.cur.execute( '''INSERT INTO settings VALUES('lastvacuumtime',?)''', (
|
||||||
|
int(time.time()),))
|
||||||
|
self.conn.commit()
|
||||||
|
logger.info('Created messages database file')
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'table inbox already exists':
|
||||||
|
logger.debug('Database file already exists.')
|
||||||
|
|
||||||
|
else:
|
||||||
|
sys.stderr.write(
|
||||||
|
'ERROR trying to create database file (message.dat). Error message: %s\n' % str(err))
|
||||||
|
os._exit(0)
|
||||||
|
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 1:
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '2')
|
||||||
|
# If the settings version is equal to 2 or 3 then the
|
||||||
|
# sqlThread will modify the pubkeys table and change
|
||||||
|
# the settings version to 4.
|
||||||
|
shared.config.set('bitmessagesettings', 'socksproxytype', 'none')
|
||||||
|
shared.config.set('bitmessagesettings', 'sockshostname', 'localhost')
|
||||||
|
shared.config.set('bitmessagesettings', 'socksport', '9050')
|
||||||
|
shared.config.set('bitmessagesettings', 'socksauthentication', 'false')
|
||||||
|
shared.config.set('bitmessagesettings', 'socksusername', '')
|
||||||
|
shared.config.set('bitmessagesettings', 'sockspassword', '')
|
||||||
|
shared.config.set('bitmessagesettings', 'sockslisten', 'false')
|
||||||
|
shared.config.set('bitmessagesettings', 'keysencrypted', 'false')
|
||||||
|
shared.config.set('bitmessagesettings', 'messagesencrypted', 'false')
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
|
||||||
|
# People running earlier versions of PyBitmessage do not have the
|
||||||
|
# usedpersonally field in their pubkeys table. Let's add it.
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 2:
|
||||||
|
item = '''ALTER TABLE pubkeys ADD usedpersonally text DEFAULT 'no' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
self.conn.commit()
|
||||||
|
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '3')
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
|
||||||
|
# People running earlier versions of PyBitmessage do not have the
|
||||||
|
# encodingtype field in their inbox and sent tables or the read field
|
||||||
|
# in the inbox table. Let's add them.
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 3:
|
||||||
|
item = '''ALTER TABLE inbox ADD encodingtype int DEFAULT '2' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
item = '''ALTER TABLE inbox ADD read bool DEFAULT '1' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
item = '''ALTER TABLE sent ADD encodingtype int DEFAULT '2' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
self.conn.commit()
|
||||||
|
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '4')
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 4:
|
||||||
|
shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte', str(
|
||||||
|
shared.networkDefaultProofOfWorkNonceTrialsPerByte))
|
||||||
|
shared.config.set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str(
|
||||||
|
shared.networkDefaultPayloadLengthExtraBytes))
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '5')
|
||||||
|
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 5:
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0')
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '6')
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
|
||||||
|
# From now on, let us keep a 'version' embedded in the messages.dat
|
||||||
|
# file so that when we make changes to the database, the database
|
||||||
|
# version we are on can stay embedded in the messages.dat file. Let us
|
||||||
|
# check to see if the settings table exists yet.
|
||||||
|
item = '''SELECT name FROM sqlite_master WHERE type='table' AND name='settings';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
if self.cur.fetchall() == []:
|
||||||
|
# The settings table doesn't exist. We need to make it.
|
||||||
|
logger.debug('In messages.dat database, creating new \'settings\' table.')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE settings (key text, value blob, UNIQUE(key) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute( '''INSERT INTO settings VALUES('version','1')''')
|
||||||
|
self.cur.execute( '''INSERT INTO settings VALUES('lastvacuumtime',?)''', (
|
||||||
|
int(time.time()),))
|
||||||
|
logger.debug('In messages.dat database, removing an obsolete field from the pubkeys table.')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TEMPORARY TABLE pubkeys_backup(hash blob, transmitdata blob, time int, usedpersonally text, UNIQUE(hash) ON CONFLICT REPLACE);''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO pubkeys_backup SELECT hash, transmitdata, time, usedpersonally FROM pubkeys;''')
|
||||||
|
self.cur.execute( '''DROP TABLE pubkeys''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE pubkeys (hash blob, transmitdata blob, time int, usedpersonally text, UNIQUE(hash) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO pubkeys SELECT hash, transmitdata, time, usedpersonally FROM pubkeys_backup;''')
|
||||||
|
self.cur.execute( '''DROP TABLE pubkeys_backup;''')
|
||||||
|
logger.debug('Deleting all pubkeys from inventory. They will be redownloaded and then saved with the correct times.')
|
||||||
|
self.cur.execute(
|
||||||
|
'''delete from inventory where objecttype = 'pubkey';''')
|
||||||
|
logger.debug('replacing Bitmessage announcements mailing list with a new one.')
|
||||||
|
self.cur.execute(
|
||||||
|
'''delete from subscriptions where address='BM-BbkPSZbzPwpVcYZpU4yHwf9ZPEapN5Zx' ''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO subscriptions VALUES('Bitmessage new releases/announcements','BM-GtovgYdgs7qXPkoYaRgrLFuFKz1SFpsw',1)''')
|
||||||
|
logger.debug('Commiting.')
|
||||||
|
self.conn.commit()
|
||||||
|
logger.debug('Vacuuming message.dat. You might notice that the file size gets much smaller.')
|
||||||
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
|
||||||
|
# After code refactoring, the possible status values for sent messages
|
||||||
|
# have changed.
|
||||||
|
self.cur.execute(
|
||||||
|
'''update sent set status='doingmsgpow' where status='doingpow' ''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''update sent set status='msgsent' where status='sentmessage' ''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''update sent set status='doingpubkeypow' where status='findingpubkey' ''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''update sent set status='broadcastqueued' where status='broadcastpending' ''')
|
||||||
|
self.conn.commit()
|
||||||
|
|
||||||
|
if not shared.config.has_option('bitmessagesettings', 'sockslisten'):
|
||||||
|
shared.config.set('bitmessagesettings', 'sockslisten', 'false')
|
||||||
|
|
||||||
|
ensureNamecoinOptions()
|
||||||
|
|
||||||
|
"""# Add a new column to the inventory table to store the first 20 bytes of encrypted messages to support Android app
|
||||||
|
item = '''SELECT value FROM settings WHERE key='version';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
if int(self.cur.fetchall()[0][0]) == 1:
|
||||||
|
print 'upgrading database'
|
||||||
|
item = '''ALTER TABLE inventory ADD first20bytesofencryptedmessage blob DEFAULT '' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
item = '''update settings set value=? WHERE key='version';'''
|
||||||
|
parameters = (2,)
|
||||||
|
self.cur.execute(item, parameters)"""
|
||||||
|
|
||||||
|
# Let's get rid of the first20bytesofencryptedmessage field in the inventory table.
|
||||||
|
item = '''SELECT value FROM settings WHERE key='version';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
if int(self.cur.fetchall()[0][0]) == 2:
|
||||||
|
logger.debug('In messages.dat database, removing an obsolete field from the inventory table.')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TEMPORARY TABLE inventory_backup(hash blob, objecttype text, streamnumber int, payload blob, receivedtime integer, UNIQUE(hash) ON CONFLICT REPLACE);''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO inventory_backup SELECT hash, objecttype, streamnumber, payload, receivedtime FROM inventory;''')
|
||||||
|
self.cur.execute( '''DROP TABLE inventory''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE inventory (hash blob, objecttype text, streamnumber int, payload blob, receivedtime integer, UNIQUE(hash) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''INSERT INTO inventory SELECT hash, objecttype, streamnumber, payload, receivedtime FROM inventory_backup;''')
|
||||||
|
self.cur.execute( '''DROP TABLE inventory_backup;''')
|
||||||
|
item = '''update settings set value=? WHERE key='version';'''
|
||||||
|
parameters = (3,)
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
# Add a new column to the inventory table to store tags.
|
||||||
|
item = '''SELECT value FROM settings WHERE key='version';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
currentVersion = int(self.cur.fetchall()[0][0])
|
||||||
|
if currentVersion == 1 or currentVersion == 3:
|
||||||
|
logger.debug('In messages.dat database, adding tag field to the inventory table.')
|
||||||
|
item = '''ALTER TABLE inventory ADD tag blob DEFAULT '' '''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
item = '''update settings set value=? WHERE key='version';'''
|
||||||
|
parameters = (4,)
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
if not shared.config.has_option('bitmessagesettings', 'userlocale'):
|
||||||
|
shared.config.set('bitmessagesettings', 'userlocale', 'system')
|
||||||
|
if not shared.config.has_option('bitmessagesettings', 'sendoutgoingconnections'):
|
||||||
|
shared.config.set('bitmessagesettings', 'sendoutgoingconnections', 'True')
|
||||||
|
|
||||||
|
# Raise the default required difficulty from 1 to 2
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 6:
|
||||||
|
if int(shared.config.get('bitmessagesettings','defaultnoncetrialsperbyte')) == shared.networkDefaultProofOfWorkNonceTrialsPerByte:
|
||||||
|
shared.config.set('bitmessagesettings','defaultnoncetrialsperbyte', str(shared.networkDefaultProofOfWorkNonceTrialsPerByte * 2))
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '7')
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
|
# Add a new column to the pubkeys table to store the address version.
|
||||||
|
# We're going to trash all of our pubkeys and let them be redownloaded.
|
||||||
|
item = '''SELECT value FROM settings WHERE key='version';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
currentVersion = int(self.cur.fetchall()[0][0])
|
||||||
|
if currentVersion == 4:
|
||||||
|
self.cur.execute( '''DROP TABLE pubkeys''')
|
||||||
|
self.cur.execute(
|
||||||
|
'''CREATE TABLE pubkeys (hash blob, addressversion int, transmitdata blob, time int, usedpersonally text, UNIQUE(hash, addressversion) ON CONFLICT REPLACE)''' )
|
||||||
|
self.cur.execute(
|
||||||
|
'''delete from inventory where objecttype = 'pubkey';''')
|
||||||
|
item = '''update settings set value=? WHERE key='version';'''
|
||||||
|
parameters = (5,)
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
=======
|
||||||
|
|
||||||
|
>>>>>>> c16d9787d289b1f6ae05358e55ad46cd4b8d2a30
|
||||||
|
# Are you hoping to add a new option to the keys.dat file of existing
|
||||||
|
# Bitmessage users? Add it right above this line!
|
||||||
|
|
||||||
|
#my new implementation starts here, the most of these comment will be deleted, they are just for documentation
|
||||||
|
if shared.config.getint('bitmessagesettings', 'settingsversion') == 7:#this is the version that all we have,if you see your keys.dat file this is your version.AQWA
|
||||||
|
shared.config.set(#in order to not have to change your keys.dat file I update it with the new lines. I add to your keys.dat three new default fields.AQWA
|
||||||
|
'bitmessagesettings', 'hours', '')# hours, days, months have no value.This means that bitmessage works as before. It re-sends mails every 4,8,16 days..forever.AQWA
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'days', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'months', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'timeperiod', '-1')#time period has default value -1. This is used for checking in class_singleCleaner. If you leave default the time period or after you change it(f.i 1/0/0), again you set it with its default value(-/-/-) this variable will be -1.AQWA
|
||||||
|
shared.config.set('bitmessagesettings', 'settingsversion', '8') #We update the version.If I leave it 7 every time that Bitmessage starts your setting will be lost.The default values(-/-/-) will be loaded all the time ;).That was juicy.AQWA
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
#my new implementation in this file stops here
|
||||||
|
|
||||||
|
try:
|
||||||
|
testpayload = '\x00\x00'
|
||||||
|
t = ('1234', 1, testpayload, '12345678', 'no')
|
||||||
|
self.cur.execute( '''INSERT INTO pubkeys VALUES(?,?,?,?,?)''', t)
|
||||||
|
self.conn.commit()
|
||||||
|
self.cur.execute(
|
||||||
|
'''SELECT transmitdata FROM pubkeys WHERE hash='1234' ''')
|
||||||
|
queryreturn = self.cur.fetchall()
|
||||||
|
for row in queryreturn:
|
||||||
|
transmitdata, = row
|
||||||
|
self.cur.execute('''DELETE FROM pubkeys WHERE hash='1234' ''')
|
||||||
|
self.conn.commit()
|
||||||
|
if transmitdata == '':
|
||||||
|
logger.fatal('Problem: The version of SQLite you have cannot store Null values. Please download and install the latest revision of your version of Python (for example, the latest Python 2.7 revision) and try again.\n')
|
||||||
|
logger.fatal('PyBitmessage will now exit very abruptly. You may now see threading errors related to this abrupt exit but the problem you need to solve is related to SQLite.\n\n')
|
||||||
|
os._exit(0)
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(While null value test) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
logger.error(err)
|
||||||
|
|
||||||
|
# Let us check to see the last time we vaccumed the messages.dat file.
|
||||||
|
# If it has been more than a month let's do it now.
|
||||||
|
item = '''SELECT value FROM settings WHERE key='lastvacuumtime';'''
|
||||||
|
parameters = ''
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
queryreturn = self.cur.fetchall()
|
||||||
|
for row in queryreturn:
|
||||||
|
value, = row
|
||||||
|
if int(value) < int(time.time()) - 2592000:
|
||||||
|
logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...')
|
||||||
|
try:
|
||||||
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(While VACUUM) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
item = '''update settings set value=? WHERE key='lastvacuumtime';'''
|
||||||
|
parameters = (int(time.time()),)
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
item = shared.sqlSubmitQueue.get()
|
||||||
|
if item == 'commit':
|
||||||
|
try:
|
||||||
|
self.conn.commit()
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(While committing) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
elif item == 'exit':
|
||||||
|
self.conn.close()
|
||||||
|
logger.info('sqlThread exiting gracefully.')
|
||||||
|
|
||||||
|
return
|
||||||
|
elif item == 'movemessagstoprog':
|
||||||
|
logger.debug('the sqlThread is moving the messages.dat file to the local program directory.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.conn.commit()
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(while movemessagstoprog) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
self.conn.close()
|
||||||
|
shutil.move(
|
||||||
|
shared.lookupAppdataFolder() + 'messages.dat', 'messages.dat')
|
||||||
|
self.conn = sqlite3.connect('messages.dat')
|
||||||
|
self.conn.text_factory = str
|
||||||
|
self.cur = self.conn.cursor()
|
||||||
|
elif item == 'movemessagstoappdata':
|
||||||
|
logger.debug('the sqlThread is moving the messages.dat file to the Appdata folder.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.conn.commit()
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(while movemessagstoappdata) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
self.conn.close()
|
||||||
|
shutil.move(
|
||||||
|
'messages.dat', shared.lookupAppdataFolder() + 'messages.dat')
|
||||||
|
self.conn = sqlite3.connect(shared.appdata + 'messages.dat')
|
||||||
|
self.conn.text_factory = str
|
||||||
|
self.cur = self.conn.cursor()
|
||||||
|
elif item == 'deleteandvacuume':
|
||||||
|
self.cur.execute('''delete from inbox where folder='trash' ''')
|
||||||
|
self.cur.execute('''delete from sent where folder='trash' ''')
|
||||||
|
self.conn.commit()
|
||||||
|
try:
|
||||||
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(while deleteandvacuume) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
parameters = shared.sqlSubmitQueue.get()
|
||||||
|
# print 'item', item
|
||||||
|
# print 'parameters', parameters
|
||||||
|
try:
|
||||||
|
self.cur.execute(item, parameters)
|
||||||
|
except Exception as err:
|
||||||
|
if str(err) == 'database or disk is full':
|
||||||
|
logger.fatal('(while cur.execute) Alert: Your disk or data storage volume is full. sqlThread will now exit.')
|
||||||
|
shared.UISignalQueue.put(('alert', (tr.translateText("MainWindow", "Disk full"), tr.translateText("MainWindow", 'Alert: Your disk or data storage volume is full. Bitmessage will now exit.'), True)))
|
||||||
|
if shared.daemon:
|
||||||
|
os._exit(0)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
logger.fatal('Major error occurred when trying to execute a SQL statement within the sqlThread. Please tell Atheros about this error message or post it in the forum! Error occurred while trying to execute statement: "%s" Here are the parameters; you might want to censor this data with asterisks (***) as it can contain private information: %s. Here is the actual error message thrown by the sqlThread: %s', str(item), str(repr(parameters)), str(err))
|
||||||
|
logger.fatal('This program shall now abruptly exit!')
|
||||||
|
|
||||||
|
os._exit(0)
|
||||||
|
|
||||||
|
shared.sqlReturnQueue.put(self.cur.fetchall())
|
||||||
|
# shared.sqlSubmitQueue.task_done()
|
|
@ -25,7 +25,7 @@ def knownNodes():
|
||||||
shared.knownNodes[stream][peer] = time
|
shared.knownNodes[stream][peer] = time
|
||||||
except:
|
except:
|
||||||
shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata)
|
shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata)
|
||||||
if shared.config.getint('bitmessagesettings', 'settingsversion') > 7:
|
if shared.config.getint('bitmessagesettings', 'settingsversion') > 8:
|
||||||
print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.'
|
print 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.'
|
||||||
raise SystemExit
|
raise SystemExit
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,17 @@ def loadConfig():
|
||||||
# existing users. To do that, search the class_sqlThread.py file for the
|
# existing users. To do that, search the class_sqlThread.py file for the
|
||||||
# text: "right above this line!"
|
# text: "right above this line!"
|
||||||
|
|
||||||
|
#my implementation starts here. AQWA
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'hours', '')#here I am adding the new default settings. The first time that the program is going to run these values will be loaded(UI and keys.dat also :) ).AQWA
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'days', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'months', '')
|
||||||
|
shared.config.set(
|
||||||
|
'bitmessagesettings', 'timeperiod', '-1')
|
||||||
|
#my implementation in this file stops here.AQWA
|
||||||
|
|
||||||
ensureNamecoinOptions()
|
ensureNamecoinOptions()
|
||||||
|
|
||||||
if storeConfigFilesInSameDirectoryAsProgramByDefault:
|
if storeConfigFilesInSameDirectoryAsProgramByDefault:
|
||||||
|
|
Reference in New Issue
Block a user