mirror of
https://github.com/ldericher/fftcgtool
synced 2025-01-15 15:02:59 +00:00
carddb sqlite
This commit is contained in:
parent
97e52b2d83
commit
8eaf891a08
2 changed files with 91 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import sqlite3
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from .code import Code
|
from .code import Code
|
||||||
|
@ -102,6 +103,59 @@ class Card:
|
||||||
content=content,
|
content=content,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def sqlite_schema(cls, cursor: sqlite3.Cursor) -> None:
|
||||||
|
cursor.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS `cards_indices` (
|
||||||
|
`code` TEXT,
|
||||||
|
`index` INTEGER,
|
||||||
|
PRIMARY KEY(`code`)
|
||||||
|
) WITHOUT ROWID;
|
||||||
|
""")
|
||||||
|
|
||||||
|
cursor.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS `cards_elements` (
|
||||||
|
`code` TEXT,
|
||||||
|
`element` TEXT,
|
||||||
|
PRIMARY KEY(`code`,`element`),
|
||||||
|
FOREIGN KEY(`code`) REFERENCES `cards_indices`(`code`)
|
||||||
|
) WITHOUT ROWID;
|
||||||
|
""")
|
||||||
|
|
||||||
|
cursor.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS `cards_content` (
|
||||||
|
`code` TEXT,
|
||||||
|
`language` TEXT,
|
||||||
|
`name` TEXT,
|
||||||
|
`text` TEXT,
|
||||||
|
`face` TEXT,
|
||||||
|
PRIMARY KEY(`code`,`language`),
|
||||||
|
FOREIGN KEY(`code`) REFERENCES `cards_indices`(`code`)
|
||||||
|
) WITHOUT ROWID;
|
||||||
|
""")
|
||||||
|
|
||||||
|
def sqlite_save(self, cursor: sqlite3.Cursor) -> None:
|
||||||
|
cursor.execute("""
|
||||||
|
UPDATE INTO `cards_indices` (`code`, `index`)
|
||||||
|
VALUES (?, ?)
|
||||||
|
""", (self.code.short, self.index))
|
||||||
|
|
||||||
|
cursor.executemany("""
|
||||||
|
UPDATE INTO `cards_content` (`code`, `language`, `name`, `text`, `face`)
|
||||||
|
VALUES(?, ?, ?, ?, ?)
|
||||||
|
""", (
|
||||||
|
(self.code.short, language.short, content.name, content.text, content.face)
|
||||||
|
for language, content in self.__content.items()
|
||||||
|
))
|
||||||
|
|
||||||
|
cursor.executemany("""
|
||||||
|
UPDATE INTO `cards_elements` (`code`, `element`)
|
||||||
|
VALUES (?, ?)
|
||||||
|
""", (
|
||||||
|
(self.code.short, element)
|
||||||
|
for element in self.__elements
|
||||||
|
))
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"Card(code={self.code!r}, content={self.__content!r})"
|
return f"Card(code={self.code!r}, content={self.__content!r})"
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ from __future__ import annotations
|
||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
import pickle
|
import pickle
|
||||||
|
import sqlite3
|
||||||
import zipfile
|
import zipfile
|
||||||
from os import PathLike
|
from os import PathLike
|
||||||
from typing import IO
|
from typing import IO
|
||||||
|
@ -96,6 +97,26 @@ class RWCardDB(CardDB):
|
||||||
self.__db_path = db_path
|
self.__db_path = db_path
|
||||||
self._load(self.__db_path)
|
self._load(self.__db_path)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def sqlite_schema(cls, cursor: sqlite3.Cursor) -> None:
|
||||||
|
cursor.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS `faces_urls` (
|
||||||
|
`face` TEXT,
|
||||||
|
`url` TEXT,
|
||||||
|
PRIMARY KEY(`face`),
|
||||||
|
FOREIGN KEY(`face`) REFERENCES `cards_content`(`face`)
|
||||||
|
) WITHOUT ROWID;
|
||||||
|
""")
|
||||||
|
|
||||||
|
cursor.execute("""
|
||||||
|
CREATE VIEW IF NOT EXISTS `cards` AS
|
||||||
|
SELECT `code`, `index`, `element`, `language`, `name`, `text`, `url`
|
||||||
|
FROM `cards_indices`
|
||||||
|
JOIN `cards_elements` USING(`code`)
|
||||||
|
JOIN `cards_content` USING(`code`)
|
||||||
|
JOIN `faces_urls` USING(`face`);
|
||||||
|
""")
|
||||||
|
|
||||||
def save(self) -> None:
|
def save(self) -> None:
|
||||||
with zipfile.ZipFile(self.__db_path, "w", compression=zipfile.ZIP_LZMA) as zip_file:
|
with zipfile.ZipFile(self.__db_path, "w", compression=zipfile.ZIP_LZMA) as zip_file:
|
||||||
# cards db
|
# cards db
|
||||||
|
@ -106,6 +127,22 @@ class RWCardDB(CardDB):
|
||||||
with zip_file.open(CardDB._MAPPING_FILE_NAME, "w") as file:
|
with zip_file.open(CardDB._MAPPING_FILE_NAME, "w") as file:
|
||||||
file.write(json.dumps(self._face_to_url, indent=2).encode("utf-8"))
|
file.write(json.dumps(self._face_to_url, indent=2).encode("utf-8"))
|
||||||
|
|
||||||
|
with sqlite3.connect(self.__db_path + ".db") as connection:
|
||||||
|
cursor = connection.cursor()
|
||||||
|
cursor.execute("PRAGMA auto_vacuum=FULL;")
|
||||||
|
Card.sqlite_schema(cursor)
|
||||||
|
self.sqlite_schema(cursor)
|
||||||
|
|
||||||
|
for card in self._cards.values():
|
||||||
|
card.sqlite_save(cursor)
|
||||||
|
|
||||||
|
cursor.executemany("""
|
||||||
|
UPDATE INTO `faces_urls` (`face`, `url`)
|
||||||
|
VALUES(?, ?)
|
||||||
|
""", self._face_to_url.items())
|
||||||
|
|
||||||
|
connection.commit()
|
||||||
|
|
||||||
def update(self, cards: Cards) -> None:
|
def update(self, cards: Cards) -> None:
|
||||||
for card in cards:
|
for card in cards:
|
||||||
self._cards[card.code] = card
|
self._cards[card.code] = card
|
||||||
|
|
Loading…
Reference in a new issue