X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=model%2Fdb_generator.py;h=a0973b41a1747b949664cb307dc24a14c7a351a8;hb=932f259dcede6dce5ed72426b53456cc07c3bcfe;hp=f50bdcf2e95bc85be29a0435890e7612021b45c4;hpb=691881cf0633e634bf75ad845e99cc49c97cccd9;p=amulettoolsmh4%2Fmain.git diff --git a/model/db_generator.py b/model/db_generator.py index f50bdcf..a0973b4 100644 --- a/model/db_generator.py +++ b/model/db_generator.py @@ -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()