Implement repo stats

- create cache table
- link cache to archive
This commit is contained in:
George Lacey 2021-05-05 04:52:33 +01:00
parent 0b5f18474a
commit 732fdd12ef
7 changed files with 84 additions and 10 deletions

View File

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from borgmanager.database.object import Repo, Archive, Error from borgmanager.database.object import Repo, Archive, Error, Cache
import json import json
@ -17,8 +17,9 @@ class OutputHandler(object):
def get_borg_info(self): def get_borg_info(self):
repo = Repo.from_json(self.borg_json['repository']) repo = Repo.from_json(self.borg_json['repository'])
archive = Archive.from_json(self.borg_json['archive']) archive = Archive.from_json(self.borg_json['archive'])
cache = Cache.from_json(self.borg_json['cache']['stats'])
return repo, archive return repo, archive, cache
def get_borg_error(self): def get_borg_error(self):
return Error(self.borg_output, datetime.now()) return Error(self.borg_output, datetime.now())

View File

@ -1,4 +1,4 @@
from .connection import RepoConn, ArchiveConn, ErrorConn, LabelConn from .connection import RepoConn, ArchiveConn, ErrorConn, LabelConn, CacheConn
from .object.label import Label from .object.label import Label
from pathlib import Path from pathlib import Path
@ -7,12 +7,12 @@ class BorgDatabase(object):
def __init__(self, db_path: Path): def __init__(self, db_path: Path):
self.repo_name = "repo" self.repo_name = "repo"
self.archive_name = "archive" self.archive_name = "archive"
self.stats_name = "stats" self.cache_name = "cache"
self.error_name = "error" self.error_name = "error"
self.label_name = "label" self.label_name = "label"
self.repo_conn = RepoConn(db_path, table_name=self.repo_name) self.repo_conn = RepoConn(db_path, table_name=self.repo_name)
self.archive_conn = ArchiveConn(db_path, self.repo_name, self.archive_conn = ArchiveConn(db_path, repo_table=self.repo_name,
table_name=self.archive_name) table_name=self.archive_name)
self.error_conn = ErrorConn(db_path, self.error_conn = ErrorConn(db_path,
label_table=self.label_name, label_table=self.label_name,
@ -20,13 +20,17 @@ class BorgDatabase(object):
self.label_conn = LabelConn(db_path, self.label_conn = LabelConn(db_path,
repo_table=self.repo_name, repo_table=self.repo_name,
table_name=self.label_name) table_name=self.label_name)
self.cache_conn = CacheConn(db_path,
archive_table=self.archive_name,
table_name=self.cache_name)
# region INSERT # region INSERT
def insert_record(self, repo, archive, label): def insert_record(self, repo, archive, cache, label):
repo_id = self.repo_conn.insert(repo) repo_id = self.repo_conn.insert(repo)
label_id = self.insert_label(label, repo_id=repo_id) self.insert_label(label, repo_id=repo_id)
archive_id = self.archive_conn.insert(archive, repo_id=repo_id) archive_id = self.archive_conn.insert(archive, repo_id=repo_id)
self.cache_conn.insert(cache, archive_id=archive_id)
def insert_error(self, borg_error, label): def insert_error(self, borg_error, label):
label_id = self.insert_label(label) label_id = self.insert_label(label)

View File

@ -3,3 +3,4 @@ from .repoconn import RepoConn
from .archiveconn import ArchiveConn from .archiveconn import ArchiveConn
from .errorconn import ErrorConn from .errorconn import ErrorConn
from .labelconn import LabelConn from .labelconn import LabelConn
from .cacheconn import CacheConn

View File

@ -2,9 +2,9 @@ from .databaseconnection import DatabaseConnection
class ArchiveConn(DatabaseConnection): class ArchiveConn(DatabaseConnection):
def __init__(self, db_path, repo_table_name: str, def __init__(self, db_path, repo_table: str,
table_name: str = "archive"): table_name: str = "archive"):
self.repo_table_name = repo_table_name self.repo_table = repo_table
super().__init__(db_path, table_name) super().__init__(db_path, table_name)
def _create_table(self): def _create_table(self):
@ -20,7 +20,7 @@ class ArchiveConn(DatabaseConnection):
f"compressed_size INTEGER NOT NULL," \ f"compressed_size INTEGER NOT NULL," \
f"deduplicated_size INTEGER NOT NULL," \ f"deduplicated_size INTEGER NOT NULL," \
f"FOREIGN KEY (repo_id) REFERENCES" \ f"FOREIGN KEY (repo_id) REFERENCES" \
f" {self.repo_table_name} (id));" f" {self.repo_table} (id));"
self.sql_execute(create_statement) self.sql_execute(create_statement)
def _exists(self, record, repo_id=None, archive_id=None, label_id=None): def _exists(self, record, repo_id=None, archive_id=None, label_id=None):

View File

@ -0,0 +1,40 @@
from .databaseconnection import DatabaseConnection
class CacheConn(DatabaseConnection):
def __init__(self, db_path, archive_table: str, table_name: str = "cache"):
self.archive_table = archive_table
super().__init__(db_path, table_name)
def _create_table(self):
create_statement = f"create table if not exists {self._sql_table}(" \
f"id INTEGER PRIMARY KEY," \
f"archive_id INT NOT NULL," \
f"total_chunks INT NOT NULL," \
f"total_csize INT NOT NULL," \
f"total_size INT NOT NULL," \
f"total_unique_chunks INT NOT NULL," \
f"unique_csize INT NOT NULL," \
f"unique_size INT NOT NULL," \
f"FOREIGN KEY (archive_id) REFERENCES" \
f" {self.archive_table} (id));"
self.sql_execute(create_statement)
def _exists(self, record, repo_id=None, archive_id=None, label_id=None):
return None, None
def _insert(self, record, repo_id=None, archive_id=None, label_id=None) -> int:
if archive_id is None:
raise Exception("Archive ID not supplied")
else:
with self.sql_lock:
cursor = self.sql_cursor
statement = f"INSERT INTO {self._sql_table}"\
f" ('archive_id', 'total_chunks', 'total_csize', 'total_size'," \
f"'total_unique_chunks', 'unique_csize', 'unique_size')"\
f" VALUES (?, ?, ?, ?, ?, ?, ?);"
args = (archive_id, record.total_chunks, record.total_csize, record.total_size,
record.total_unique_chunks, record.unique_csize, record.unique_size)
cursor.execute(statement, args)
self.sql_commit()
return cursor.lastrowid

View File

@ -3,3 +3,4 @@ from .repo import Repo
from .archive import Archive from .archive import Archive
from .error import Error from .error import Error
from .label import Label from .label import Label
from .cache import Cache

View File

@ -0,0 +1,27 @@
from . import DBObject
class Cache(DBObject):
def __init__(self, total_chunks: int, total_csize: int, total_size: int, total_unique_chunks: int,
unique_csize: int, unique_size: int, primary_key=None):
super(Cache, self).__init__(primary_key)
self.total_chunks = total_chunks
self.total_csize = total_csize
self.total_size = total_size
self.total_unique_chunks = total_unique_chunks
self.unique_csize = unique_csize
self.unique_size = unique_size
@classmethod
def from_json(cls, json: dict):
total_chunks = json['total_chunks']
total_csize = json['total_csize']
total_size = json['total_size']
total_unique_chunks = json['total_unique_chunks']
unique_csize = json['unique_csize']
unique_size = json['unique_size']
return cls(total_chunks, total_csize, total_size, total_unique_chunks, unique_csize, unique_size)
@classmethod
def from_sql(cls, sql: list):
pass