From bf57b17f99724cd19100d1fb3375123137b50908 Mon Sep 17 00:00:00 2001 From: LPOCHOLLE <> Date: Mon, 11 Oct 2021 17:02:11 +0200 Subject: [PATCH] Update bdd / Recover crypt_id for files already added --- Backup.py | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/Backup.py b/Backup.py index 252de9b..034c8b5 100644 --- a/Backup.py +++ b/Backup.py @@ -25,11 +25,11 @@ class Backup: size = os.path.getsize(uri) print(f + " : ", human_size(size)) if size > tarball_size: + crypt_name = self.bdd.add([{'name': f, 'path': path, 'size': size}], compress_mode="gz") enc = crypt(compress(uri), self.key) - crypt_name = self.bdd.add([{'name': f, 'path': uri, 'size': size}], compress_mode="gz") save(enc, os.path.join(self.save_location, crypt_name)) else: - files.append({'name': f, 'path': uri, 'size': size}) + files.append({'name': f, 'path': path, 'size': size}) elif os.path.isdir(uri): self.recurse(uri) if len(files) > 0: @@ -143,18 +143,45 @@ class DataBase: self.conn.commit() + def get_crypt_id(self, list_file): + cursor = self.conn.cursor() + crypt_id_list = [] + for file in list_file: + cursor.execute("""SELECT crypt_id FROM files WHERE name=? AND path=?""", + (file['name'], file['path'])) + try: + crypt_id_list.append(cursor.fetchone()[0]) + except TypeError: + pass + if len(crypt_id_list) > 0: + return most_frequent(crypt_id_list) + else: + return None + + def exist(self, file): + cursor = self.conn.cursor() + cursor.execute("""SELECT EXISTS (SELECT 1 FROM files WHERE name=? AND path=?)""", + (file['name'], file['path'])) + return cursor.fetchone()[0] + def add(self, list_file, compress_mode=None): cursor = self.conn.cursor() - cursor.execute("""SELECT IFNULL(max(id) + 1, 0) FROM crypt""") - crypt_id = cursor.fetchone()[0] + crypt_id = self.get_crypt_id(list_file) + if crypt_id is None: + cursor.execute("""SELECT IFNULL(max(id) + 1, 0) FROM crypt""") + crypt_id = cursor.fetchone()[0] cursor.execute("""SELECT IFNULL(max(id) + 1, 0) FROM files""") files_id = cursor.fetchone()[0] for file in list_file: - cursor.execute("""INSERT INTO files VALUES(?, ?, ?, ?, ?)""", - (files_id, file['name'], file['path'], file['size'], crypt_id)) - files_id += 1 + if self.exist(file): + cursor.execute("""UPDATE files SET size=?, crypt_id=? WHERE name=? AND path=?""", + (file['size'], crypt_id, file['name'], file['path'])) + else: + cursor.execute("""INSERT INTO files VALUES(?, ?, ?, ?, ?)""", + (files_id, file['name'], file['path'], file['size'], crypt_id)) + files_id += 1 - cursor.execute("""INSERT INTO crypt VALUES(?, ?)""", (crypt_id, compress_mode)) + cursor.execute("""INSERT OR IGNORE INTO crypt VALUES(?, ?)""", (crypt_id, compress_mode)) self.conn.commit() return str(crypt_id) @@ -173,3 +200,7 @@ def parse_size(size): size = size + 'K' number, unit = re.match(r"([0-9]+)([BKMGT])", size, re.I).groups() return int(float(number)*units[unit]) + + +def most_frequent(list): + return max(set(list), key = list.count)