changeset 18:5731d2ecaec4

Store arogue5 results in the database. The ARogueGame class is functional enough to put game results into the database, though it still can't get them back out.
author John "Elwin" Edwards <elwin@sdf.org>
date Mon, 17 Sep 2012 09:14:26 -0700
parents 7f7b3da664d6
children 78580bffc13d
files py/rlgalldb.py
diffstat 1 files changed, 67 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/py/rlgalldb.py	Sun Sep 16 20:44:22 2012 -0700
+++ b/py/rlgalldb.py	Mon Sep 17 09:14:26 2012 -0700
@@ -198,6 +198,47 @@
     cur.close()
     conn.close()
     return updatenames
+  def postprocess(self, gamelist):
+    "Default postprocessing function: adds start time and ttyrec list"
+    names = set([ e["name"] for e in gamelist ])
+    conn = getconn()
+    if conn == None:
+      return []
+    cur = conn.cursor()
+    for nameF in names:
+      # Get all this player's games ordered by time
+      itsEntries = [ entry for entry in gamelist if entry["name"] == nameF ]
+      itsEntries.sort(key=lambda e: e["endt"])
+      # Find the end time of the latest game already in the db
+      tquery = "SELECT endt FROM {0} WHERE name = %s ORDER BY endt DESC LIMIT 1;".format(self.uname)
+      cur.execute(tquery, [nameF])
+      result = cur.fetchone()
+      if result:
+        prev = result[0]
+      else:
+        prev = datetime.fromtimestamp(0, utc);
+      ttyrecdir = "/var/dgl/dgldir/ttyrec/{0}/{1}/".format(nameF, self.uname)
+      allfilekeys = [ (recnameToTS(f), f) for f in os.listdir(ttyrecdir) ]
+      vfilekeys = [ e for e in allfilekeys if e[0] > prev ]
+      vfilekeys.sort(key=lambda e: e[0])
+      # Now determine startt and ttyrecs for each game
+      for i in range(0, len(itsEntries)):
+        if i == 0:
+          lowlim = prev
+        else:
+          lowlim = itsEntries[i-1]["endt"]
+        hilim = itsEntries[i]["endt"]
+        recs = [ k[1] for k in vfilekeys if lowlim <= k[0] < hilim ]
+        itsEntries[i]["startt"] = recnameToTS(recs[0])
+        itsEntries[i]["ttyrecs"] = recs
+    cur.close()
+    conn.close()
+  def putIntoDB(self, dictlist, conn):
+    cur = conn.cursor()
+    cur.executemany(self.insertq, [ d for d in dictlist if d["game"] == self ])
+    conn.commit()
+    cur.close()
+    return
 # End Game class definition
 
 class RogueGame(Game):
@@ -210,6 +251,19 @@
             "name": "varchar(20)", "xl": "int", "fate": "text",
             "ttyrecs": "text ARRAY", "startt": "timestamptz"}
     self.logdelim = " "
+    colspec = "("
+    valspec = "("
+    for i, col in enumerate(self.sqltypes.keys()):
+      colspec += col
+      valspec += "%({0})s".format(col)
+      if i == len(self.sqltypes) - 1:
+        colspec += ")"
+        valspec += ")"
+      else:
+        colspec += ", "
+        valspec += ", "
+    self.insertq = "INSERT INTO {0} {1} VALUES {2};".format(self.uname, 
+                    colspec, valspec)
   # Class variables, used by some methods
   fields = ["name", "score", "xl", "fate", "endt"]
   rankfields = ["rank", "score", "name", "xl", "fate", "endt"]
@@ -311,40 +365,6 @@
     conn.commit()
     cur.close()
     return
-  def postprocess(self, gamelist):
-    names = set([ e["name"] for e in gamelist ])
-    conn = getconn()
-    if conn == None:
-      return []
-    cur = conn.cursor()
-    for nameF in names:
-      # Get all this player's games ordered by time
-      itsEntries = [ entry for entry in gamelist if entry["name"] == nameF ]
-      itsEntries.sort(key=lambda e: e["endt"])
-      # Find the end time of the latest game already in the db
-      tquery = "SELECT endt FROM {0} WHERE name = %s ORDER BY endt DESC LIMIT 1;".format(self.uname)
-      cur.execute(tquery, [nameF])
-      result = cur.fetchone()
-      if result:
-        prev = result[0]
-      else:
-        prev = datetime.fromtimestamp(0, utc);
-      ttyrecdir = "/var/dgl/dgldir/ttyrec/{0}/{1}/".format(nameF, self.uname)
-      allfilekeys = [ (recnameToTS(f), f) for f in os.listdir(ttyrecdir) ]
-      vfilekeys = [ e for e in allfilekeys if e[0] > prev ]
-      vfilekeys.sort(key=lambda e: e[0])
-      # Now determine startt and ttyrecs for each game
-      for i in range(0, len(itsEntries)):
-        if i == 0:
-          lowlim = prev
-        else:
-          lowlim = itsEntries[i-1]["endt"]
-        hilim = itsEntries[i]["endt"]
-        recs = [ k[1] for k in vfilekeys if lowlim <= k[0] < hilim ]
-        itsEntries[i]["startt"] = recnameToTS(recs[0])
-        itsEntries[i]["ttyrecs"] = recs
-    cur.close()
-    conn.close()
 # End RogueGame class definition
 
 class ARogueGame(Game):
@@ -359,17 +379,23 @@
             "maxdepth": "int", "quest": "int", "hadquest": "bool",
             "fate": "text", "ttyrecs": "text ARRAY", "startt": "timestamptz"}
     self.logdelim = " "
+    colspec = "("
+    valspec = "("
+    for i, col in enumerate(self.sqltypes.keys()):
+      colspec += col
+      valspec += "%({0})s".format(col)
+      if i == len(self.sqltypes) - 1:
+        colspec += ")"
+        valspec += ")"
+      else:
+        colspec += ", "
+        valspec += ", "
+    self.insertq = "INSERT INTO {0} {1} VALUES {2};".format(self.uname, 
+                    colspec, valspec)
   # Class variables
   fields = ["name", "score", "class", "xl", "fate", "endt"]
   rankfields = ["rank", "score", "name", "class", "xl", "fate", "endt"]
   pfields = ["score", "class", "xl", "fate", "endt"]
-  def postprocess(self, gamelist):
-    "Not Implemented"
-    return
-  def putIntoDB(self, dictlist, conn):
-    "Not Implemented"
-    conn.commit()
-    return
   def getHigh(self, n=10, offset=0):
     return []
   def getRecent(self, n=20):