ppf/new: Full implementation of add_* for MySQL.
authorMariana Mărășoiu <mariana.marasoiu@gmail.com>
Wed, 24 Aug 2011 11:42:10 +0000 (14:42 +0300)
committerMariana Mărășoiu <mariana.marasoiu@gmail.com>
Wed, 24 Aug 2011 11:42:10 +0000 (14:42 +0300)
ppf/new/storage.py

index cb47b5f..d75aec8 100644 (file)
@@ -4,6 +4,7 @@ Storage class for P2P logging information.
 Built on previous work by Adriana Draghici and Razvan Deaconescu.
 
 2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro
+2011, Mariana Marasoiu, mariana.marasoiu@gmail.com
 """
 
 import os
@@ -11,6 +12,7 @@ import os.path
 import re
 import logging
 import sqlite3
+import MySQLdb
 import datetime
 
 #
@@ -559,26 +561,139 @@ class SQLiteDatabaseAccess(DatabaseAccess):
         self.conn.commit()
 
 class MySQLDatabaseAccess(DatabaseAccess):
-    def __init___(self, database):
-        super(SQLiteDatabaseAccess, self).__init__(database)
+    def __init___(self, database, user, password):
+        super(MySQLDatabaseAccess, self).__init__(database)
 
     def connect(self):
-        pass
+        # TODO Add support for reading connection information from config_file
+        self.conn = MySQLdb.Connection(db=self.database, user="root",
+                                       passwd="p2p4th3m45535")
+        self.cursor = self.conn.cursor()
+        self.conn.commit()
+
+    def reset_query(self):
+        self.columns = ""
+        self.values = ""
+
+    def append_to_insert_query(self, data_name, data_value):
+        if data_value is not None:
+            self.columns = self.columns + data_name + ", "
+            self.values = self.values + "'" + str(data_value) + "'" + ", "
 
     def add_swarm(self, swarm):
-        pass
+        self.reset_query()
+        self.append_to_insert_query("torrent_filename", swarm.torrent_filename)
+        self.append_to_insert_query("data_size", swarm.data_size)
+        self.append_to_insert_query("description", swarm.description)
+
+        self.columns = re.sub(',\s*$', '', self.columns)
+        self.values = re.sub(',\s*$', '', self.values)
+        insert_query = "INSERT INTO swarms(" + self.columns +")" + \
+                " VALUES(" + self.values + ")"
+        self.cursor.execute(insert_query)
+        self.conn.commit()
 
     def add_client_session(self, session):
-        pass
+        self.reset_query()
+        self.append_to_insert_query("swarm_id", session.swarm_id)
+        # TODO: search database for client ID
+        self.append_to_insert_query("btclient_id",
+                bittorrent_clients[session.btclient]['id'])
+        self.append_to_insert_query("system_os", session.system_os)
+        self.append_to_insert_query("system_os_version", session.system_os_version)
+        self.append_to_insert_query("system_ram", session.system_ram)
+        self.append_to_insert_query("system_cpu", session.system_cpu)
+        self.append_to_insert_query("public_ip", session.public_ip)
+        self.append_to_insert_query("public_port", session.public_port)
+        self.append_to_insert_query("ds_limit", session.ds_limit)
+        self.append_to_insert_query("us_limit", session.us_limit)
+        self.append_to_insert_query("start_time", session.start_time)
+        self.append_to_insert_query("dht_enabled", session.dht_enabled)
+        self.append_to_insert_query("pxe_enabled", session.pxe_enabled)
+        self.append_to_insert_query("streaming_enabled", session.streaming_enabled)
+        self.append_to_insert_query("features", session.features)
+        self.append_to_insert_query("description", session.description)
+
+        self.columns = re.sub(',\s*$', '', self.columns)
+        self.values = re.sub(',\s*$', '', self.values)
+        insert_query = "INSERT INTO client_sessions(" + self.columns +")" + \
+                " VALUES(" + self.values + ")"
+        self.cursor.execute(insert_query)
+        self.conn.commit()
+
+    def get_string_timestamp(self, ts):
+        # Timestamp is Python Datatime. Convert it to string format.
+        return "%s-%s-%s %s:%s:%s" \
+                %(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second)
 
     def add_peer_status_message(self, msg):
-        pass
+        self.reset_query()
+        self.append_to_insert_query("client_session_id", msg.client_session_id)
+
+        # TODO: Check msg.timestamp is not None. Raise exception.
+        timestamp_string = self.get_string_timestamp(msg.timestamp)
+
+        self.append_to_insert_query("timestamp", timestamp_string)
+        self.append_to_insert_query("peer_ip", msg.peer_ip)
+        self.append_to_insert_query("peer_port", msg.peer_port)
+        self.append_to_insert_query("download_speed", msg.download_speed)
+        self.append_to_insert_query("upload_speed", msg.upload_speed)
+
+        self.columns = re.sub(',\s*$', '', self.columns)
+        self.values = re.sub(',\s*$', '', self.values)
+        insert_query = "INSERT INTO peer_status_messages(" + \
+                self.columns +")" + " VALUES(" + self.values + ")"
+        self.cursor.execute(insert_query)
+        self.conn.commit()
 
     def add_status_message(self, msg):
-        pass
+        self.reset_query()
+        self.append_to_insert_query("client_session_id", msg.client_session_id)
+
+        # TODO: Check msg.timestamp is not None. Raise exception.
+        timestamp_string = self.get_string_timestamp(msg.timestamp)
+
+        self.append_to_insert_query("timestamp", timestamp_string)
+        self.append_to_insert_query("num_peers", msg.num_peers)
+        self.append_to_insert_query("num_dht_peers", msg.num_dht_peers)
+        self.append_to_insert_query("download_speed", msg.download_speed)
+        self.append_to_insert_query("upload_speed", msg.upload_speed)
+        self.append_to_insert_query("download_size", msg.download_size)
+        self.append_to_insert_query("upload_size", msg.upload_size)
+        self.append_to_insert_query("eta", msg.eta)
+
+        self.columns = re.sub(',\s*$', '', self.columns)
+        self.values = re.sub(',\s*$', '', self.values)
+        insert_query = "INSERT INTO status_messages(" + self.columns +")" + \
+                " VALUES(" + self.values + ")"
+        self.cursor.execute(insert_query)
+        self.conn.commit()
 
     def add_verbose_message(self, msg):
-        pass
+        self.reset_query()
+        self.append_to_insert_query("client_session_id", msg.client_session_id)
+
+        # TODO: Check msg.timestamp is not None. Raise exception.
+        timestamp_string = self.get_string_timestamp(msg.timestamp)
+
+        self.append_to_insert_query("timestamp", timestamp_string)
+        self.append_to_insert_query("transfer_direction_id",
+                transfer_directions[msg.transfer_direction])
+        self.append_to_insert_query("peer_ip", msg.peer_ip)
+        self.append_to_insert_query("peer_port", msg.peer_port)
+        self.append_to_insert_query("message_type_id",
+                message_types[msg.message_type]['id'])
+        self.append_to_insert_query("index", msg.index)
+        self.append_to_insert_query("begin", msg.begin)
+        self.append_to_insert_query("length", msg.length)
+        self.append_to_insert_query("listen_port", msg.listen_port)
+
+        self.columns = re.sub(',\s*$', '', self.columns)
+        self.values = re.sub(',\s*$', '', self.values)
+        insert_query = "INSERT INTO verbose_messages(" + self.columns +")" + \
+                " VALUES(" + self.values + ")"
+        self.cursor.execute(insert_query)
+        self.conn.commit()
 
 class SwarmWriter(object):
     """