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
段位テーブル読み込み