diff --git a/d2warehouse/db.py b/d2warehouse/db.py index 9708622..0db15bc 100644 --- a/d2warehouse/db.py +++ b/d2warehouse/db.py @@ -32,6 +32,13 @@ def close_db() -> None: _db = None +def init_db() -> None: + db = get_db() + count = db.execute("SELECT count(*) FROM sqlite_master").fetchone()[0] + if count == 0: + create_db() + + def create_db() -> None: db = get_db() with open(_schema_path, encoding="utf-8") as f: diff --git a/d2warehouse/item.py b/d2warehouse/item.py index 2a175d5..7861076 100644 --- a/d2warehouse/item.py +++ b/d2warehouse/item.py @@ -122,6 +122,62 @@ class Item: quantity: int | None = None stats: list[Stat] | None = None + @property + def basename(self) -> str: + return lookup_basetype(self.code)["name"] + + @property + def name(self) -> str: + match self.quality: + case Quality.LOW: + return f"{self.low_quality} {self.basename}" + case Quality.NORMAL | None: + return self.basename + case Quality.HIGH: + return f"Superior {self.basename}" + case Quality.MAGIC: + return f" {self.basename} " + case Quality.SET: + assert self.set_id is not None + return lookup_set_item(self.set_id)["name"] + case Quality.RARE: + # FIXME + return " " + case Quality.UNIQUE: + assert self.unique_id is not None + return lookup_unique(self.unique_id)["name"] + case Quality.CRAFTED: + # FIXME + return " " + case _: + # TODO: In 3.11 replace this with assert_never + assert False, "Should be unreachable" + + @property + def color(self) -> str: + if self.is_runeword: + return "runeword" + match self.quality: + case Quality.LOW: + return "low" + case Quality.NORMAL | None: + return "normal" + case Quality.HIGH: + return "normal" + case Quality.MAGIC: + return "magic" + case Quality.SET: + return "set" + case Quality.RARE: + return "rare" + case Quality.UNIQUE: + return "unique" + case Quality.CRAFTED: + return "crafted" + case _: + # TODO: In 3.11 replace this with assert_never + assert False, "Should be unreachable" + def print(self, indent=5, with_raw=False): properties = [] base_name = lookup_basetype(self.code)["name"] @@ -235,7 +291,9 @@ class Item: reqs["lvl"] = max(reqs["lvl"], socket_reqs["lvl"]) return reqs - def write_to_db(self, socketed_into=None, commit=True) -> int: + def write_to_db(self, socketed_into=None, commit=True, db=None) -> int: + if db is None: + db = get_db() name = lookup_basetype(self.code)["name"] # FIXME: handle magic & rare names if self.is_runeword: @@ -250,7 +308,6 @@ class Item: ) req = self.requirements() - db = get_db() cur = db.cursor() cur.execute( """INSERT INTO item (itembase_name, socketed_into, raw_data, raw_version, @@ -343,8 +400,9 @@ class Item: return item_id - def load_from_db(id: int) -> "Item": - db = get_db() + def load_from_db(id: int, db=None) -> "Item": + if db is None: + db = get_db() row = db.execute( """SELECT raw_data, raw_version, is_identified, is_socketed, is_beginner, is_simple, is_ethereal, is_personalized, is_runeword, code, diff --git a/d2warehouse/schema.sql b/d2warehouse/schema.sql index 1b39447..5f3400b 100644 --- a/d2warehouse/schema.sql +++ b/d2warehouse/schema.sql @@ -1,7 +1,7 @@ -DROP TABLE IF EXISTS item_stat; -DROP TABLE IF EXISTS item_affix; -DROP TABLE IF EXISTS item_extra; -DROP TABLE IF EXISTS item; +--DROP TABLE IF EXISTS item_stat; +--DROP TABLE IF EXISTS item_affix; +--DROP TABLE IF EXISTS item_extra; +--DROP TABLE IF EXISTS item; CREATE TABLE item ( id INTEGER PRIMARY KEY,