OSDN Git Service

Merge branch 'hotfix/singleton_with_db_accessor_generator_problem'
[amulettoolsmh4/main.git] / model / amulettable.py
1 # -*- coding: utf-8 -*-
2
3 u"""
4 IDとお守り名の組み合わせテーブルの作成・アクセスをするモジュール
5 2013/12/19 written by kei9
6 """
7
8 import sqlite3
9 import csv
10
11 #import singleton
12
13 # for amulet table
14 NAME = u"amulet_table"
15 COL_AMULET_NAME = u"amulet_name"
16 CREATE_SQL = u"""create table if not exists {table} 
17     (id integer primary key, {amulet_name} varchar unique);""".format(
18         table=NAME, 
19         amulet_name=COL_AMULET_NAME)
20 INSERT_SQL = u"""insert into {table}
21     ({amulet_col}) values(?);""".format(
22         table=NAME,
23         amulet_col=COL_AMULET_NAME)
24 SELECT_ID2NAME_SQL = u"""select {amulet_col} from {table} where id='{{id}}'""".format(
25         amulet_col=COL_AMULET_NAME,
26         table=NAME)
27 SELECT_NAME2ID_SQL = u"""select id from {table} where {amulet_col}='{{amulet_name}}'""".format(
28         amulet_col=COL_AMULET_NAME,
29         table=NAME)
30 SELECT_ALL_SQL = u"""select id, {amulet_col} from {table}""".format(
31         amulet_col=COL_AMULET_NAME,
32         table=NAME)
33
34 class AmuletTableGenerator(object):
35     u""" IDとお守り名の組み合わせテーブルを作成するクラス """
36     def __init__(self):
37         u""" コンストラクタ """
38         pass
39
40     def insert_data(self, db_cursor, csv_reader):
41         u""" csv_readerからデータを読み込み、 db_cursorへデータを挿入する。"""
42         db_cursor.execute(CREATE_SQL)
43
44         csv_reader.next()   # skip header row
45         for row in csv_reader:  # (name)
46             amulet_name = row[0].strip()
47             try:
48                 db_cursor.execute(INSERT_SQL, (amulet_name,))
49             except sqlite3.IntegrityError, e:
50                 print "not unique:", amulet_name.decode("utf-8")
51                 raise e
52
53
54 class AmuletTableAccessor(object):
55     u""" お守りIDとお守り名の組み合わせテーブルへのアクセス用クラス """
56     #__metaclass__ = singleton.Singleton
57     def __init__(self, db_cursor):
58         u""" db_cursor: cursor of sqlite3 database """
59         self._cursor = db_cursor
60         self._id2name_dict, self._name2id_dict = self._get_dict()
61
62     def _get_dict(self, unicodeing=False):
63         u""" お守りIDからお守り名への変換辞書を得る。
64         return (id2name_dict, name2id_dict)"""
65         self._cursor.execute(SELECT_ALL_SQL)
66         id2name_dict, name2id_dict = {}, {}
67         for row in self._cursor.fetchall(): #(id, name)
68             amulet_id, amulet_name = row[0], row[1]
69             #if not isinstance(amulet_name, unicode):
70             #    amulet_name = unicode(amulet_name, u"utf-8")
71             id2name_dict[amulet_id] = amulet_name
72             name2id_dict[amulet_name] = amulet_id
73
74         return (id2name_dict, name2id_dict)
75
76     def get_dict(self, copied=False):
77         u""" お守りIDからお守り名への変換辞書を得る。
78         return (id2name_dict, name2id_dict)"""
79         if copied is True:
80             return (self._id2name_dict.copy(), self._name2id_dict.copy())
81         else:
82             return (self._id2name_dict, self._name2id_dict)
83
84     def get_id_sorted_names(self, is_desc=False):
85         u""" Id順でソートされたお守り名のタプルを返す
86         is_desc=Trueで降順にする。"""
87         ls = []
88         for amu_id, name in sorted(self._id2name_dict.items(), key = lambda x: x[0], reverse=is_desc):
89             ls.append(name)
90         return tuple(ls)
91
92     def get_amulet_name(self, skill_id):
93         u""" お守りIDからお守り名を得る 
94         存在しない場合はNoneを返す"""
95         if skill_id in self._id2name_dict[skill_id]:
96             return self._id2name_dict[skill_id]
97         else:
98             None
99
100     def get_amulet_id(self, skill_name):
101         u""" お守り名からお守りIdを得る 
102         存在しない場合はNoneを返す"""
103         if skill_name in self._name2id_dict[skill_name]:
104             return self._name2id_dict[skill_name]
105         else:
106             None
107
108