OSDN Git Service

Merge remote-tracking branch 'origin/develop' into develop
[amulettoolsmh4/main.git] / model / db_generator.py
index f50bdcf..a0973b4 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 # databaseの生成用スクリプト
+# 2013/12/04 written by kei9 
 
 import sqlite3
 import csv
@@ -14,14 +15,15 @@ import cStringIO
 import db_supports
 
 class DataBaseGenerator(object):
-    u""" this is access class to database """
-    def __init__(self, dbName=None):
+    u""" this is generate class of database """
+    def __init__(self, db_name=None):
         if dbName is None:
             self._db_name = ":memory:"
         else :
-            self._db_name = dbName
+            self._db_name = db_name
         self._tmp_db = None
         self._dict_skill_id = {}
+        self._dict_amulet_id = {}
 
     def generate_db(self, over_write=True):
         u""" DBを作成する関数。over_writeがTrueで既存のDBがある場合は上書きする """
@@ -41,6 +43,7 @@ class DataBaseGenerator(object):
 
         # db generation
         self._create_skill_table()
+        self._create_amulet_table()
         self._create_second_skill_table()
         self._create_min_max_table()
         self._create_sufficient_value_table()
@@ -87,6 +90,24 @@ class DataBaseGenerator(object):
                 self._dict_skill_id[skill_name] = skill_ids[0]
                 return skill_ids[0]
 
+    def _get_amulet_id(self, amulet_name):
+        u""" 与えられたお守り名からお守りのIDを得る関数。スキルが存在しなければNoneを返す """
+        amulet_name = unicode(amulet_name, 'utf-8')
+
+        if amulet_name in self._dict_amulet_id:
+            return self._dict_amulet_id[amulet_name]
+        else:
+            sql = db_supports.AMULET_TABLE_AMULET2ID_SQL.format(amulet_name=amulet_name)
+            self._cursor.execute(sql)
+            amulet_ids = []
+            for val in self._cursor.fetchall():
+                amulet_ids.append(val[0])
+            if len(amulet_ids) < 1:
+                return None
+            else:
+                self._dict_amulet_id[amulet_name] = amulet_ids[0]
+                return amulet_ids[0]
+
     def _create_skill_table(self):
         u"""スキルとIDの組み合わせテーブルを作成する"""
         print "create skill table"
@@ -103,8 +124,25 @@ class DataBaseGenerator(object):
             except sqlite3.IntegrityError, e:
                 print "not unique:", row[0].decode("utf-8")
                 raise e
+        self._connect.commit()
+        f.close()
 
+    def _create_amulet_table(self):
+        u"""お守り名とIDの組み合わせテーブルを作成する"""
+        print "create amulet table"
+        self._cursor.execute(db_supports.AMULET_TABLE_CREATE_SQL)
 
+        # read from zip file with StringIO wrapper
+        f = cStringIO.StringIO(self._zipfile.read(db_supports.AMULET_FILE_NAME, "r"))
+        reader = csv.reader(f)  # (amuleteName)
+
+        reader.next()   # skip header row
+        for row in reader:
+            try:
+                self._cursor.execute(db_supports.AMULET_TABLE_INSERT_SQL, (row[0].strip(),))
+            except sqlite3.IntegrityError, e:
+                print "not unique:", row[0].decode("utf-8")
+                raise e
         self._connect.commit()
         f.close()
 
@@ -124,8 +162,10 @@ class DataBaseGenerator(object):
         for row in reader:
             table_name = db_supports.MIN_MAX_TABLE_NAME.format(id=cnt)
             insert_sql = db_supports.MIN_MAX_MASTER_TABLE_INSERT_SQL
-            oma_name = row[0].strip()
-            self._cursor.execute(insert_sql, (oma_name, table_name))
+            amu_id = self._get_amulet_id(row[0].strip())
+            if amu_id is None:
+                print "amulet name:", row[0].decode("utf-8")
+            self._cursor.execute(insert_sql, (amu_id, table_name))
 
             create_sql = db_supports.MIN_MAX_TABLE_CREATE_SQL.format(table_name=table_name)
             self._cursor.execute(create_sql) # create minmax table for each omamori
@@ -208,8 +248,10 @@ class DataBaseGenerator(object):
             table_name = db_supports.SECOND_TABLE_NAME.format(id=cnt)
             create_sql = db_supports.SECOND_TABLE_CREATE_SQL.format(table_name=table_name)
             insert_sql = db_supports.SECOND_MASTER_TABLE_INSERT_SQL
-            oma_name = row[0].strip()
-            self._cursor.execute(insert_sql, (oma_name, table_name))
+            amu_id = self._get_amulet_id(row[0].strip())
+            if amu_id is None:
+                print "amulet name:", row[0].decode("utf-8")
+            self._cursor.execute(insert_sql, (amu_id, table_name))
             self._cursor.execute(create_sql) # create skill table for each omamori
 
             fname_skill = row[1].strip()
@@ -268,8 +310,10 @@ class DataBaseGenerator(object):
             table_name = db_supports.SUFFICIENT_TABLE_NAME.format(id=cnt)
             create_sql = db_supports.SUFFICIENT_TABLE_CREATE_SQL.format(table_name=table_name)
             insert_sql = db_supports.SUFFICIENT_MASTER_TABLE_INSERT_SQL
-            oma_name = row[0].strip()
-            self._cursor.execute(insert_sql, (oma_name, table_name))
+            amu_id = self._get_amulet_id(row[0].strip())
+            if amu_id is None:
+                print "amulet name:", row[0].decode("utf-8")
+            self._cursor.execute(insert_sql, (amu_id, table_name))
             self._cursor.execute(create_sql) # create skill table for each omamori
 
             fname_threshold = row[1].strip()
@@ -292,7 +336,7 @@ class DataBaseGenerator(object):
         self._connect.commit()
 
 if __name__ == "__main__":
-    #db = DataBaseGenerator(OutputDBFileName)
+    #db = DataBaseGenerator(DB_FILE_NAME)
     db = DataBaseGenerator("test.sqlite3")
     #db = DataBaseGenerator()    # for memory
     db.generate_db()