1 # -*- coding: utf-8 -*-
4 # 2013/12/09 written by kei9
16 import mh4constnumbers
19 import skillminmaxtable
20 import seed2skill2table
21 import seed2tablenumbertable
22 import seed2thresholdtable
23 import seed2inishietable
24 import sufficienttable
25 import seed1tenuntable
27 class DataBaseGenerator(object):
28 u""" this is generate class of database """
29 def __init__(self, db_name=None):
31 self._db_name = ":memory:"
33 self._db_name = db_name
35 self._dict_skill_id = {}
36 self._dict_amulet_id = {}
38 def generate_db(self, over_write=True):
39 u""" DBを作成する関数。over_writeがTrueで既存のDBがある場合は上書きする """
40 if self._db_name == ":memory:":
43 elif os.path.exists(self._db_name) and os.path.isfile(self._db_name):
44 if over_write is False:
46 with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
47 self._tmp_db = tmp_file.name
51 # read data from zip file
52 self._zipfile = zipfile.ZipFile(db_supports.ZIP_FILE, "r")
55 self._create_skill_table()
56 self._create_amulet_table()
57 self._create_min_max_table()
58 self._create_seed2_skill2_table()
59 self._create_seed2_threshold_table()
60 self._create_seed2_inishie_table()
61 self._create_sufficient_value_table()
62 self._create_seed1_tenun_table()
67 # rename operation of tmp file
68 if self._tmp_db is not None:
69 with tempfile.NamedTemporaryFile(delete=True) as tmp_file:
70 tmp_name = tmp_file.name
71 os.rename(self._db_name, tmp_name)
72 os.rename(self._tmp_db, self._db_name)
76 if self._tmp_db is None:
77 self._connect = sqlite3.connect(self._db_name)
79 self._connect = sqlite3.connect(self._tmp_db)
80 self._connect.text_factory = str # for usage of utf-8
81 self._cursor = self._connect.cursor()
84 self._connect.commit()
88 def _get_skill_id(self, skill_name):
89 u""" 与えられたスキル名からスキルのIDを得る関数。スキルが存在しなければNoneを返す """
90 skill_name = unicode(skill_name, 'utf-8')
92 if skill_name in self._dict_skill_id:
93 return self._dict_skill_id[skill_name]
95 sql = db_supports.SKILL_TABLE_SKILL2ID_SQL.format(skill_name=skill_name)
96 self._cursor.execute(sql)
98 for val in self._cursor.fetchall():
99 skill_ids.append(val[0])
100 if len(skill_ids) < 1:
103 self._dict_skill_id[skill_name] = skill_ids[0]
106 def _get_amulet_id(self, amulet_name):
107 u""" 与えられたお守り名からお守りのIDを得る関数。スキルが存在しなければNoneを返す """
108 amulet_name = unicode(amulet_name, 'utf-8')
110 if amulet_name in self._dict_amulet_id:
111 return self._dict_amulet_id[amulet_name]
113 sql = db_supports.AMULET_TABLE_AMULET2ID_SQL.format(amulet_name=amulet_name)
114 self._cursor.execute(sql)
116 for val in self._cursor.fetchall():
117 amulet_ids.append(val[0])
118 if len(amulet_ids) < 1:
121 self._dict_amulet_id[amulet_name] = amulet_ids[0]
124 def _create_skill_table(self):
125 u"""スキルとIDの組み合わせテーブルを作成する"""
126 print "create skill table"
127 generator = skilltable.SkillTableGenerator()
129 # read from zip file with StringIO wrapper
130 f = cStringIO.StringIO(self._zipfile.read(db_supports.SKILL_FILE_NAME, "r"))
131 reader = csv.reader(f) # (id, skillName)
132 generator.insert_data(self._cursor, reader)
134 self._connect.commit()
137 def _create_amulet_table(self):
138 u"""お守り名とIDの組み合わせテーブルを作成する"""
139 print "create amulet table"
140 generator = amulettable.AmuletTableGenerator()
141 # read from zip file with StringIO wrapper
142 f = cStringIO.StringIO(self._zipfile.read(db_supports.AMULET_FILE_NAME, "r"))
143 reader = csv.reader(f) # (amuleteName)
144 generator.insert_data(self._cursor, reader)
146 self._connect.commit()
149 def _create_min_max_table(self):
150 u"""お守り名と対応するスキルの最大最小値の記載されたcsvファイルから
151 お守りごとのスキルの最大最小値を記載したテーブルを作成する
153 print "load min & max of skill"
154 # create master table of skill min max
155 generator = skillminmaxtable.SkillMinMaxTableGenerator()
156 # read from zip file with StringIO wrapper
157 f = cStringIO.StringIO(self._zipfile.read(db_supports.MIN_MAX_FILE_NAME, "r"))
158 reader = csv.reader(f) # (name, filename of minmax1, filename of minmax2)
160 generator.insert_master_data(self._cursor, reader)
161 filenames_dict = generator.get_skill_filenames()
162 reader_dict, filelist = {}, []
163 for key, value in filenames_dict.items():
164 fname1, fname2 = value
165 if fname1 in self._zipfile.namelist():
166 file_minmax1 = cStringIO.StringIO(self._zipfile.read(fname1, "r"))
167 reader1 = csv.reader(file_minmax1) # (name of skill, min1, max1)
168 filelist.append(file_minmax1)
172 if fname2 in self._zipfile.namelist():
173 file_minmax2 = cStringIO.StringIO(self._zipfile.read(fname2, "r"))
174 reader2 = csv.reader(file_minmax2) # (name of skill, min1, max1)
175 filelist.append(file_minmax2)
178 reader_dict[key] = (reader1, reader2)
179 generator.insert_data(self._cursor, reader_dict)
181 for _file in filelist:
184 self._connect.commit()
187 def _create_seed2_skill2_table(self):
188 u"""csvファイルからSEED2から第2スキルへの表を生成する
190 print "load Second skill"
191 # create master table of seed2 to skill2
192 generator = seed2skill2table.Seed2Skill2TableGenerator()
193 # read from zip file with StringIO wrapper
194 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED2_SKILL2_FILE_NAME, "r"))
195 reader = csv.reader(f) # (omamori_name, filename of Second_skill)
197 generator.insert_master_data(self._cursor, reader)
198 filenames_dict = generator.get_skill_filenames()
199 reader_dict, filelist = {}, []
200 for key, fname in filenames_dict.items():
201 if fname in self._zipfile.namelist():
202 file_skill2 = cStringIO.StringIO(self._zipfile.read(fname, "r"))
203 reader = csv.reader(file_skill2) # (seed2, skillname1,..., skillname7)
204 filelist.append(file_skill2)
205 reader_dict[key] = reader
206 generator.insert_data(self._cursor, reader_dict)
208 for _file in filelist:
211 self._connect.commit()
214 self._create_seed2_table_no_table()
215 self._connect.commit()
217 def _create_seed2_table_no_table(self):
218 u""" Seed2に対応するテーブル値を格納するテーブルを作成する """
219 generator = seed2tablenumbertable.Seed2TableNumberTableGenerator()
221 # read from zip file with StringIO wrapper
222 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED2_TABLE_NO_FILE_NAME, "r"))
223 reader = csv.reader(f) # (seed2, table_no, no)
224 generator.insert_data(self._cursor, reader)
225 self._connect.commit()
228 def _create_seed2_inishie_table(self):
229 u""" いにしえの錬金の第2Seed対応テーブルを作成する """
230 generator = seed2inishietable.Seed2InishieTableGenerator()
232 # read from zip file with StringIO wrapper
233 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED2_INISHIE_FILE_NAME, "r"))
234 reader = csv.reader(f) # (seed2, skill_name, threshold1, threshold2)
235 generator.insert_data(self._cursor, reader)
236 self._connect.commit()
239 def _create_seed2_threshold_table(self):
240 u""" csvファイルよりSEED2から判定値1,2へのテーブルを作成する
242 print "load Threshold1,2"
243 generator = seed2thresholdtable.Seed2ThresholdTableGenerator()
245 # for threshold1 table
246 # read from zip file with StringIO wrapper
247 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED2_THRESHOLD1_FILE_NAME, "r"))
248 reader = csv.reader(f) # (seed2, threshold1_1, threshold1_2, ..., threshold1_7)
249 generator.insert_data(self._cursor, reader, 1)
252 # for threshold2 table
253 # read from zip file with StringIO wrapper
254 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED2_THRESHOLD2_FILE_NAME, "r"))
255 reader = csv.reader(f) # (seed2, threshold2_1, threshold2_2, ..., threshold2_7)
256 generator.insert_data(self._cursor, reader, 2)
259 self._connect.commit()
261 def _create_sufficient_value_table(self):
262 u"""csvファイルから充足値の表を生成する
264 print "load Sufficient Value"
265 # create master table of sufficient value
266 generator = sufficienttable.SufficientTableGenerator()
267 # read from zip file with StringIO wrapper
268 f = cStringIO.StringIO(self._zipfile.read(db_supports.SUFFICIENT_FILE_NAME, "r"))
269 reader = csv.reader(f) # (omamori_name, filename of sufficient values)
271 generator.insert_master_data(self._cursor, reader)
272 filenames_dict = generator.get_skill_filenames()
273 reader_dict, filelist = {}, []
274 for key, fname in filenames_dict.items():
275 if fname in self._zipfile.namelist():
276 file_suff = cStringIO.StringIO(self._zipfile.read(fname, "r"))
277 reader = csv.reader(file_suff) # (seed2, skillname1,..., skillname7)
278 filelist.append(file_suff)
279 reader_dict[key] = reader
280 generator.insert_data(self._cursor, reader_dict)
282 for _file in filelist:
285 self._connect.commit()
288 def _create_seed1_tenun_table(self):
289 u""" csvファイルより天運の錬金結果からSEED1へのテーブルを作成する
294 generator = seed1tenuntable.Seed1TenunTableGenerator()
295 # read from zip file with StringIO wrapper
296 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED1_TENUN555_FILE_NAME, "r"))
297 reader = csv.reader(f)
298 generator.insert_data(self._cursor, reader, mh4constnumbers.KEY_TENUN555)
302 # read from zip file with StringIO wrapper
303 f = cStringIO.StringIO(self._zipfile.read(db_supports.SEED1_TENUN888_FILE_NAME, "r"))
304 reader = csv.reader(f)
305 generator.insert_data(self._cursor, reader, mh4constnumbers.KEY_TENUN888)
307 self._connect.commit()
310 if __name__ == "__main__":
311 #db = DataBaseGenerator(DB_FILE_NAME)
312 db = DataBaseGenerator("test.sqlite3")
313 #db = DataBaseGenerator() # for memory