# -*- coding: utf-8 -*-
# databaseの生成用スクリプト
+# 2013/12/04 written by kei9
import sqlite3
import csv
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がある場合は上書きする """
# 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()
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"
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()
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
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()
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()
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()