libs.data.initialization

lib/data/initialization.py

  1"""
  2lib/data/initialization.py
  3"""
  4
  5import json
  6import logging
  7import os
  8from configparser import ConfigParser
  9from importlib.resources import files
 10from typing import cast
 11
 12import libs.global_value as g
 13from cls.types import GradeTableDict
 14from libs.data import loader
 15from libs.utils import dbutil
 16
 17
 18def initialization_resultdb():
 19    """DB初期化"""
 20    resultdb = dbutil.get_connection()
 21    resultdb.execute(loader.load_query("table/member.sql"))  # メンバー登録テーブル
 22    resultdb.execute(loader.load_query("table/alias.sql"))  # 別名定義テーブル
 23    resultdb.execute(loader.load_query("table/team.sql"))  # チーム定義テーブル
 24    resultdb.execute(loader.load_query("table/result.sql"))  # データ取り込みテーブル
 25    resultdb.execute(loader.load_query("table/remarks.sql"))  # メモ格納テーブル
 26    resultdb.execute(loader.load_query("table/words.sql"))  # レギュレーションワード登録テーブル
 27
 28    # wordsテーブル情報読み込み(regulations)
 29    if cast(ConfigParser, getattr(g.cfg, "_parser")).has_section("regulations"):
 30        resultdb.execute("delete from words;")
 31        for k, v in cast(ConfigParser, getattr(g.cfg, "_parser")).items("regulations"):
 32            match k:
 33                case "undefined":
 34                    continue
 35                case "type0" | "yakuman":
 36                    words_list = {x.strip() for x in v.split(",")}
 37                    for word in words_list:
 38                        resultdb.execute(
 39                            "insert into words(word, type, ex_point) values (?, 0, NULL);",
 40                            (word,)
 41                        )
 42                    logging.info("regulations table(type0): %s", words_list)
 43                case "type2":
 44                    words_list = {x.strip() for x in v.split(",")}
 45                    for word in words_list:
 46                        resultdb.execute(
 47                            "insert into words(word, type, ex_point) values (?, 2, NULL);",
 48                            (word,)
 49                        )
 50                    logging.info("regulations table(type2): %s", words_list)
 51                case _:
 52                    word = k.strip()
 53                    ex_point = int(v)
 54                    resultdb.execute(
 55                        "insert into words(word, type, ex_point) values (?, 1, ?);",
 56                        (word, ex_point,)
 57                    )
 58                    logging.info("regulations table(type1): %s, %s", word, ex_point)
 59
 60    resultdb.executescript(loader.load_query("view/individual_results.sql"))
 61    resultdb.executescript(loader.load_query("view/team_results.sql"))
 62    resultdb.executescript(loader.load_query("view/game_results.sql"))
 63    resultdb.executescript(loader.load_query("view/game_info.sql"))
 64
 65    # メモ
 66    match g.cfg.undefined_word:
 67        case 0:
 68            grandslam_where = "words.type is null or words.type == 0"
 69            regulation_where = "words.type in (1, 2)"
 70        case 1:
 71            grandslam_where = "words.type == 0"
 72            regulation_where = "words.type is null or words.type == 1"
 73        case 2:
 74            grandslam_where = "words.type == 0"
 75            regulation_where = "words.type is null or words.type == 2"
 76        case _:
 77            grandslam_where = "words.type == 0"
 78            regulation_where = "words.type in (1, 2)"
 79
 80    resultdb.executescript(loader.load_query("view/grandslam.sql").format(grandslam_where=grandslam_where))
 81    resultdb.executescript(loader.load_query("view/regulations.sql").format(regulation_where=regulation_where))
 82
 83    # ゲスト設定チェック
 84    ret = resultdb.execute("select * from member where id=0;")
 85    data = ret.fetchall()
 86
 87    if len(data) == 0:
 88        logging.notice("ゲスト設定: %s", g.cfg.member.guest_name)  # type: ignore
 89        sql = "insert into member (id, name) values (0, ?);"
 90        resultdb.execute(sql, (g.cfg.member.guest_name,))
 91    elif data[0][1] != g.cfg.member.guest_name:
 92        logging.notice("ゲスト修正: %s -> %s", data[0][1], g.cfg.member.guest_name)  # type: ignore
 93        sql = "update member set name=? where id=0;"
 94        resultdb.execute(sql, (g.cfg.member.guest_name,))
 95
 96    resultdb.commit()
 97    resultdb.close()
 98
 99
100def read_grade_table():
101    """段位テーブル読み込み"""
102
103    # テーブル選択
104    match table_name := g.cfg.badge.grade.table_name:
105        case "":
106            return
107        case "mahjongsoul" | "雀魂":
108            tbl_file = str(files("files.gradetable").joinpath("mahjongsoul.json"))
109        case "tenho" | "天鳳":
110            tbl_file = str(files("files.gradetable").joinpath("tenho.json"))
111        case _:
112            tbl_file = os.path.join(g.cfg.config_dir, table_name)
113            if not os.path.isfile(tbl_file):
114                return
115
116    with open(tbl_file, encoding="utf-8") as f:
117        try:
118            tbl_data: GradeTableDict = json.load(f)
119        except json.JSONDecodeError as err:
120            logging.error(err)
121            return
122
123    if not isinstance(tbl_list := tbl_data.get("table"), list):
124        logging.error("undefined key [table]")
125        return
126
127    for x in tbl_list:
128        if isinstance(x, dict):
129            x["demote"] = x.get("demote", True)
130            if {"grade", "point", "acquisition", "demote"} == set(x.keys()):
131                if not isinstance(x.get("grade"), str):
132                    tbl_data = {}
133                    break
134                point = x.get("point")
135                if not isinstance(point, list) or len(point) != 2:
136                    logging.error("point is not match")
137                    tbl_data = {}
138                    break
139                acquisition = x.get("acquisition")
140                if not isinstance(acquisition, list) or len(acquisition) != 4:
141                    logging.error("acquisition is not match")
142                    tbl_data = {}
143                    break
144            else:
145                logging.error("undefined key [grade, point, acquisition]")
146                tbl_data = {}
147                break
148        else:
149            tbl_data = {}
150            break
151
152    g.cfg.badge.grade.table = tbl_data
def initialization_resultdb():
19def initialization_resultdb():
20    """DB初期化"""
21    resultdb = dbutil.get_connection()
22    resultdb.execute(loader.load_query("table/member.sql"))  # メンバー登録テーブル
23    resultdb.execute(loader.load_query("table/alias.sql"))  # 別名定義テーブル
24    resultdb.execute(loader.load_query("table/team.sql"))  # チーム定義テーブル
25    resultdb.execute(loader.load_query("table/result.sql"))  # データ取り込みテーブル
26    resultdb.execute(loader.load_query("table/remarks.sql"))  # メモ格納テーブル
27    resultdb.execute(loader.load_query("table/words.sql"))  # レギュレーションワード登録テーブル
28
29    # wordsテーブル情報読み込み(regulations)
30    if cast(ConfigParser, getattr(g.cfg, "_parser")).has_section("regulations"):
31        resultdb.execute("delete from words;")
32        for k, v in cast(ConfigParser, getattr(g.cfg, "_parser")).items("regulations"):
33            match k:
34                case "undefined":
35                    continue
36                case "type0" | "yakuman":
37                    words_list = {x.strip() for x in v.split(",")}
38                    for word in words_list:
39                        resultdb.execute(
40                            "insert into words(word, type, ex_point) values (?, 0, NULL);",
41                            (word,)
42                        )
43                    logging.info("regulations table(type0): %s", words_list)
44                case "type2":
45                    words_list = {x.strip() for x in v.split(",")}
46                    for word in words_list:
47                        resultdb.execute(
48                            "insert into words(word, type, ex_point) values (?, 2, NULL);",
49                            (word,)
50                        )
51                    logging.info("regulations table(type2): %s", words_list)
52                case _:
53                    word = k.strip()
54                    ex_point = int(v)
55                    resultdb.execute(
56                        "insert into words(word, type, ex_point) values (?, 1, ?);",
57                        (word, ex_point,)
58                    )
59                    logging.info("regulations table(type1): %s, %s", word, ex_point)
60
61    resultdb.executescript(loader.load_query("view/individual_results.sql"))
62    resultdb.executescript(loader.load_query("view/team_results.sql"))
63    resultdb.executescript(loader.load_query("view/game_results.sql"))
64    resultdb.executescript(loader.load_query("view/game_info.sql"))
65
66    # メモ
67    match g.cfg.undefined_word:
68        case 0:
69            grandslam_where = "words.type is null or words.type == 0"
70            regulation_where = "words.type in (1, 2)"
71        case 1:
72            grandslam_where = "words.type == 0"
73            regulation_where = "words.type is null or words.type == 1"
74        case 2:
75            grandslam_where = "words.type == 0"
76            regulation_where = "words.type is null or words.type == 2"
77        case _:
78            grandslam_where = "words.type == 0"
79            regulation_where = "words.type in (1, 2)"
80
81    resultdb.executescript(loader.load_query("view/grandslam.sql").format(grandslam_where=grandslam_where))
82    resultdb.executescript(loader.load_query("view/regulations.sql").format(regulation_where=regulation_where))
83
84    # ゲスト設定チェック
85    ret = resultdb.execute("select * from member where id=0;")
86    data = ret.fetchall()
87
88    if len(data) == 0:
89        logging.notice("ゲスト設定: %s", g.cfg.member.guest_name)  # type: ignore
90        sql = "insert into member (id, name) values (0, ?);"
91        resultdb.execute(sql, (g.cfg.member.guest_name,))
92    elif data[0][1] != g.cfg.member.guest_name:
93        logging.notice("ゲスト修正: %s -> %s", data[0][1], g.cfg.member.guest_name)  # type: ignore
94        sql = "update member set name=? where id=0;"
95        resultdb.execute(sql, (g.cfg.member.guest_name,))
96
97    resultdb.commit()
98    resultdb.close()

DB初期化

def read_grade_table():
101def read_grade_table():
102    """段位テーブル読み込み"""
103
104    # テーブル選択
105    match table_name := g.cfg.badge.grade.table_name:
106        case "":
107            return
108        case "mahjongsoul" | "雀魂":
109            tbl_file = str(files("files.gradetable").joinpath("mahjongsoul.json"))
110        case "tenho" | "天鳳":
111            tbl_file = str(files("files.gradetable").joinpath("tenho.json"))
112        case _:
113            tbl_file = os.path.join(g.cfg.config_dir, table_name)
114            if not os.path.isfile(tbl_file):
115                return
116
117    with open(tbl_file, encoding="utf-8") as f:
118        try:
119            tbl_data: GradeTableDict = json.load(f)
120        except json.JSONDecodeError as err:
121            logging.error(err)
122            return
123
124    if not isinstance(tbl_list := tbl_data.get("table"), list):
125        logging.error("undefined key [table]")
126        return
127
128    for x in tbl_list:
129        if isinstance(x, dict):
130            x["demote"] = x.get("demote", True)
131            if {"grade", "point", "acquisition", "demote"} == set(x.keys()):
132                if not isinstance(x.get("grade"), str):
133                    tbl_data = {}
134                    break
135                point = x.get("point")
136                if not isinstance(point, list) or len(point) != 2:
137                    logging.error("point is not match")
138                    tbl_data = {}
139                    break
140                acquisition = x.get("acquisition")
141                if not isinstance(acquisition, list) or len(acquisition) != 4:
142                    logging.error("acquisition is not match")
143                    tbl_data = {}
144                    break
145            else:
146                logging.error("undefined key [grade, point, acquisition]")
147                tbl_data = {}
148                break
149        else:
150            tbl_data = {}
151            break
152
153    g.cfg.badge.grade.table = tbl_data

段位テーブル読み込み