libs.functions.tools.vacuum

libs/functions/tools/vacuum.py

 1"""
 2libs/functions/tools/vacuum.py
 3"""
 4
 5import logging
 6import os
 7from contextlib import closing
 8from typing import TYPE_CHECKING
 9
10import libs.global_value as g
11from libs.domain import modify
12from libs.utils import dbutil
13
14if TYPE_CHECKING:
15    from sqlite3 import Connection
16
17
18def main() -> None:
19    """vacuum実行"""
20    g.cfg.initialization()
21
22    modify.db_backup()
23    before_size = os.path.getsize(g.cfg.setting.database_file)
24
25    with closing(dbutil.connection(g.cfg.setting.database_file)) as cur:
26        before_page = db_info(cur, "page_count")
27        before_freelist = db_info(cur, "freelist_count")
28        cur.execute("vacuum;")
29        after_page = db_info(cur, "page_count")
30        after_freelist = db_info(cur, "freelist_count")
31
32    after_size = os.path.getsize(g.cfg.setting.database_file)
33
34    logging.info("file size: %s -> %s", before_size, after_size)
35    logging.info("page_count: %s -> %s", before_page, after_page)
36    logging.info("freelist_count: %s -> %s", before_freelist, after_freelist)
37
38
39def db_info(cur: "Connection", kind: str) -> int:
40    """
41    page_countを取得
42
43    Args:
44        cur (Connection): Connectionオブジェクト
45        kind (str): 取得する内容
46
47    Returns:
48        int: page_count / freelist_count
49
50    """
51    match kind:
52        case "page_count":
53            count = int(cur.execute("pragma page_count;").fetchone()[0])
54        case "freelist_count":
55            count = int(cur.execute("pragma freelist_count;").fetchone()[0])
56        case _:
57            count = 0
58
59    return count
def main() -> None:
19def main() -> None:
20    """vacuum実行"""
21    g.cfg.initialization()
22
23    modify.db_backup()
24    before_size = os.path.getsize(g.cfg.setting.database_file)
25
26    with closing(dbutil.connection(g.cfg.setting.database_file)) as cur:
27        before_page = db_info(cur, "page_count")
28        before_freelist = db_info(cur, "freelist_count")
29        cur.execute("vacuum;")
30        after_page = db_info(cur, "page_count")
31        after_freelist = db_info(cur, "freelist_count")
32
33    after_size = os.path.getsize(g.cfg.setting.database_file)
34
35    logging.info("file size: %s -> %s", before_size, after_size)
36    logging.info("page_count: %s -> %s", before_page, after_page)
37    logging.info("freelist_count: %s -> %s", before_freelist, after_freelist)

vacuum実行

def db_info(cur: sqlite3.Connection, kind: str) -> int:
40def db_info(cur: "Connection", kind: str) -> int:
41    """
42    page_countを取得
43
44    Args:
45        cur (Connection): Connectionオブジェクト
46        kind (str): 取得する内容
47
48    Returns:
49        int: page_count / freelist_count
50
51    """
52    match kind:
53        case "page_count":
54            count = int(cur.execute("pragma page_count;").fetchone()[0])
55        case "freelist_count":
56            count = int(cur.execute("pragma freelist_count;").fetchone()[0])
57        case _:
58            count = 0
59
60    return count

page_countを取得

Arguments:
  • cur (Connection): Connectionオブジェクト
  • kind (str): 取得する内容
Returns:

int: page_count / freelist_count