]> git.mxchange.org Git - quix0rs-apt-p2p.git/blobdiff - khashmir.py
oops, another buglet
[quix0rs-apt-p2p.git] / khashmir.py
index 19bd3d8537af3cb2d884a487ad6f1de82a6558c0..36ff79f8abf02894802285f8c980af4464f8c373 100644 (file)
@@ -4,8 +4,6 @@ from const import reactor
 import const
 
 import time
-from bencode import bdecode as loads
-from bencode import bencode as dumps
 
 from sha import sha
 
@@ -23,7 +21,7 @@ from twisted.web import server
 threadable.init()
 
 import sqlite  ## find this at http://pysqlite.sourceforge.net/
-
+import pysqlite_exceptions
 
 KhashmirDBExcept = "KhashmirDBExcept"
 
@@ -51,21 +49,23 @@ class Khashmir(xmlrpc.XMLRPC):
     def loadDB(self, db):
        try:
            self.store = sqlite.connect(db=db)
+            self.store.autocommit = 1
        except:
            import traceback
            raise KhashmirDBExcept, "Couldn't open DB", traceback.exc_traceback
            
     def createNewDB(self, db):
        self.store = sqlite.connect(db=db)
+        self.store.autocommit = 1
        s = """
-           create table kv (hkv text primary key, key text, value text, time timestamp);
+           create table kv (key text, value text, time timestamp, primary key (key, value));
            create index kv_key on kv(key);
+           create index kv_timestamp on kv(time);
            
            create table nodes (id text primary key, host text, port number);
            """
        c = self.store.cursor()
        c.execute(s)
-       self.store.commit()
                
     def render(self, request):
        """
@@ -200,15 +200,13 @@ class Khashmir(xmlrpc.XMLRPC):
        df.addCallbacks(_pongHandler,_defaultPong)
 
 
-    def findCloseNodes(self):
+    def findCloseNodes(self, callback=lambda a: None):
        """
            This does a findNode on the ID one away from our own.  
            This will allow us to populate our table with nodes on our network closest to our own.
            This is called as soon as we start up with an empty table
        """
        id = self.node.id[:-1] + chr((ord(self.node.id[-1]) + 1) % 256)
-       def callback(nodes):
-           pass
        self.findNode(id, callback)
 
     def refreshTable(self):
@@ -259,17 +257,15 @@ class Khashmir(xmlrpc.XMLRPC):
        return nodes, self.node.senderDict()
            
     def xmlrpc_store_value(self, key, value, sender):
-       h1 = sha(key+value).digest().encode('base64')
-       t = `time.time()`
-       s = "insert into kv values ('%s', '%s', '%s', '%s')" % (h1, key, value, t)
+       t = "%0.6f" % time.time()
+       s = "insert into kv values ('%s', '%s', '%s');" % (key, value, t)
        c = self.store.cursor()
        try:
            c.execute(s)
-       except:
+       except pysqlite_exceptions.IntegrityError, reason:
            # update last insert time
-           s = "update kv set time = '%s' where hkv = '%s'" % (t, h1)
+           s = "update kv set time = '%s' where key = '%s' and value = '%s';" % (t, key, value)
            c.execute(s)
-       self.store.commit()
        ip = self.crequest.getClientIP()
        sender['host'] = ip
        n = Node().initWithDict(sender)
@@ -299,6 +295,7 @@ class Khashmir(xmlrpc.XMLRPC):
 
 def test_build_net(quiet=0, peers=24, host='localhost',  pause=1):
     from whrandom import randrange
+    import threading
     import thread
     port = 2001
     l = []
@@ -315,7 +312,7 @@ def test_build_net(quiet=0, peers=24, host='localhost',  pause=1):
     time.sleep(1)
     for peer in l[1:]:
        peer.app.run()
-       #time.sleep(.25)
+    time.sleep(10)
 
     print "adding contacts...."
 
@@ -327,17 +324,18 @@ def test_build_net(quiet=0, peers=24, host='localhost',  pause=1):
        n = l[randrange(0, len(l))].node
        peer.addContact(host, n.port)
        if pause:
-           time.sleep(.5)
-           
-    time.sleep(1)
+           time.sleep(.33)
+       
+    time.sleep(10)
     print "finding close nodes...."
 
     for peer in l:
-       peer.findCloseNodes()
-       if pause:
-           time.sleep(.5)
-    if pause:
-           time.sleep(1)
+       flag = threading.Event()
+       def cb(nodes, f=flag):
+           f.set()
+       peer.findCloseNodes(cb)
+       flag.wait()
+
 #    for peer in l:
 #      peer.refreshTable()
     return l