1 # Written by Boxun Zhang, Boudewijn Schoon
2 # see LICENSE.txt for license information
7 from BaseLib.Core.BitTornado.BT1.MessageID import CRAWLER_SEEDINGSTATS_QUERY
8 from BaseLib.Core.CacheDB.SqliteSeedingStatsCacheDB import *
12 class SeedingStatsCrawler:
16 def get_instance(cls, *args, **kargs):
18 cls.__single = cls(*args, **kargs)
22 self._sqlite_cache_db = SQLiteSeedingStatsCacheDB.getInstance()
24 def query_initiator(self, permid, selversion, request_callback):
26 Established a new connection. Send a CRAWLER_DATABASE_QUERY request.
27 @param permid The Tribler peer permid
28 @param selversion The oberlay protocol version
29 @param request_callback Call this function one or more times to send the requests: request_callback(message_id, payload)
32 print >>sys.stderr, "crawler: SeedingStatsDB_update_settings_initiator"
33 read_query = "SELECT * FROM SeedingStats WHERE crawled = 0"
34 write_query = "UPDATE SeedingStats SET crawled = 1 WHERE crawled = 0"
35 return request_callback(CRAWLER_SEEDINGSTATS_QUERY, cPickle.dumps([("read", read_query), ("write", write_query)], 2))
37 def update_settings_initiator(self, permid, selversion, request_callback):
39 Established a new connection. Send a CRAWLER_DATABASE_QUERY request.
40 @param permid The Tribler peer permid
41 @param selversion The oberlay protocol version
42 @param request_callback Call this function one or more times to send the requests: request_callback(message_id, payload)
45 print >>sys.stderr, "crawler: SeedingStatsDB_update_settings_initiator"
48 sql_update = "UPDATE SeedingStatsSettings SET crawling_interval=%s WHERE crawling_enabled=%s"%(1800, 1)
52 return request_callback(CRAWLER_SEEDINGSTATS_QUERY, cPickle.dumps(sql_update, 2))
55 def handle_crawler_request(self, permid, selversion, channel_id, message, reply_callback):
57 Received a CRAWLER_DATABASE_QUERY request.
58 @param permid The Crawler permid
59 @param selversion The overlay protocol version
60 @param channel_id Identifies a CRAWLER_REQUEST/CRAWLER_REPLY pair
61 @param message The message payload
62 @param reply_callback Call this function once to send the reply: reply_callback(payload [, error=123])
64 MESSAGE contains a cPickled list. Each list element is a
65 tuple. Each tuple consists of a string (either 'read' or
66 'write') and a string (the query)
69 print >> sys.stderr, "crawler: handle_crawler_request", len(message)
73 items = cPickle.loads(message)
75 print >> sys.stderr, "crawler: handle_crawler_request", items
77 for action, query in items:
79 cursor = self._sqlite_cache_db.execute_read(query)
80 elif action == "write":
81 cursor = self._sqlite_cache_db.execute_write(query)
83 raise Exception("invalid payload")
86 results.append(list(cursor))
91 print >> sys.stderr, "crawler: handle_crawler_request", e
92 results.append(str(e))
93 reply_callback(cPickle.dumps(results, 2), 1)
95 reply_callback(cPickle.dumps(results, 2))
100 def handle_crawler_reply(self, permid, selversion, channel_id, channel_data, error, message, reply_callback):
102 Received a CRAWLER_DATABASE_QUERY request.
103 @param permid The Crawler permid
104 @param selversion The overlay protocol version
105 @param channel_id Identifies a CRAWLER_REQUEST/CRAWLER_REPLY pair
106 @param error The error value. 0 indicates success.
107 @param message The message payload
108 @param request_callback Call this function one or more times to send the requests: request_callback(message_id, payload)
112 print >> sys.stderr, "seedingstatscrawler: handle_crawler_reply"
113 print >> sys.stderr, "seedingstatscrawler: error", error
117 results = cPickle.loads(message)
120 print >> sys.stderr, "seedingstatscrawler: handle_crawler_reply"
121 print >> sys.stderr, "seedingstatscrawler:", results
123 # the first item in the list contains the results from the select query
125 values = map(tuple, results[0])
126 self._sqlite_cache_db.insertMany("SeedingStats", values)
129 # 04/11/08 boudewijn: cPickle.loads(...) sometimes
130 # results in EOFError. This may be caused by message
131 # being interpreted as non-binary.
132 f = open("seedingstats-EOFError.data", "ab")
133 f.write("--\n%s\n--\n" % message)
142 def handle_crawler_update_settings_request(self, permid, selversion, channel_id, message, reply_callback):
144 Received a CRAWLER_DATABASE_QUERY request.
145 @param permid The Crawler permid
146 @param selversion The overlay protocol version
147 @param channel_id Identifies a CRAWLER_REQUEST/CRAWLER_REPLY pair
148 @param message The message payload
149 @param reply_callback Call this function once to send the reply: reply_callback(payload [, error=123])
152 print >> sys.stderr, "crawler: handle_crawler_SeedingStats_request", message
155 sql_update = cPickle.loads(message)
158 self._sqlite_cache_db.execute_write(sql_update)
160 reply_callback(str(e), 1)
162 reply_callback(cPickle.dumps('Update succeeded.', 2))
166 def handle_crawler_update_setings_reply(self, permid, selversion, channel_id, message, reply_callback):
168 Received a CRAWLER_DATABASE_QUERY request.
169 @param permid The Crawler permid
170 @param selversion The overlay protocol version
171 @param channel_id Identifies a CRAWLER_REQUEST/CRAWLER_REPLY pair
172 @param message The message payload
173 @param request_callback Call this function one or more times to send the requests: request_callback(message_id, payload)
176 print >> sys.stderr, "olapps: handle_crawler_SeedingStats_reply"