-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.py
More file actions
145 lines (124 loc) · 5.97 KB
/
database.py
File metadata and controls
145 lines (124 loc) · 5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import sqlite3
import logging
from typing import Optional, List, Tuple, Any
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def create_connection(db_file: str) -> Optional[sqlite3.Connection]:
"""
Создает соединение с базой данных SQLite.
:param db_file: Путь к файлу базы данных
:return: Объект соединения или None в случае ошибки
"""
try:
return sqlite3.connect(db_file)
except Exception as e:
logging.error(f"Ошибка подключения к базе данных: {e}")
return None
def create_table(conn: sqlite3.Connection) -> None:
"""
Создает таблицу в базе данных.
:param conn: Объект соединения с базой данных
"""
with conn:
try:
c = conn.cursor()
# Таблица для данных о файлах
c.execute('''
CREATE TABLE IF NOT EXISTS file_data (
path TEXT,
size INTEGER,
last_modified REAL,
hash TEXT,
backup_path TEXT
)
''')
# Таблица для исключенных директорий
c.execute('''
CREATE TABLE IF NOT EXISTS excluded_directories (
path TEXT UNIQUE
)
''')
logging.info("Таблицы созданы успешно")
except Exception as e:
logging.error(f"Ошибка при создании таблиц: {e}")
def add_excluded_directory(conn: sqlite3.Connection, directory_path: str) -> None:
try:
c = conn.cursor()
c.execute('''
INSERT INTO excluded_directories (path) VALUES (?)
''', (directory_path,))
conn.commit()
logging.info(f"Директория {directory_path} добавлена в список исключений")
except Exception as e:
logging.error(f"Ошибка при добавлении исключенной директории: {e}")
def get_excluded_directories(conn: sqlite3.Connection) -> List[str]:
try:
c = conn.cursor()
c.execute("SELECT path FROM excluded_directories")
rows = c.fetchall()
return [row[0] for row in rows] # Возвращаем список путей
except Exception as e:
logging.error(f"Ошибка при получении списка исключенных директорий: {e}")
return []
def remove_excluded_directory(conn: sqlite3.Connection, directory_path: str) -> None:
try:
c = conn.cursor()
c.execute('''
DELETE FROM excluded_directories WHERE path=?
''', (directory_path,))
conn.commit()
logging.info(f"Директория {directory_path} удалена из списка исключений")
except Exception as e:
logging.error(f"Ошибка при удалении исключенной директории: {e}")
def insert_file_data(conn: sqlite3.Connection, orig_path: str, size: int,
last_modified: float, file_hash: str, backup_path: str) -> None:
"""
Вставляет или обновляет данные о файле в базе данных.
:param conn: Объект соединения с базой данных
:param orig_path: Оригинальный путь к файлу
:param size: Размер файла
:param last_modified: Время последнего изменения файла
:param file_hash: Хеш файла
:param backup_path: Путь к резервной копии файла
"""
try:
c = conn.cursor()
c.execute("SELECT path, hash FROM file_data WHERE path=? AND hash=?", (orig_path, file_hash))
existing_record = c.fetchone()
if existing_record:
c.execute('''
UPDATE file_data
SET size = ?, last_modified = ?, backup_path = ?
WHERE path = ? AND hash = ?
''', (size, last_modified, backup_path, orig_path, file_hash))
else:
c.execute('''
INSERT INTO file_data (path, size, last_modified, hash, backup_path)
VALUES (?, ?, ?, ?, ?)
''', (orig_path, size, last_modified, file_hash, backup_path))
conn.commit()
except Exception as e:
logging.error(f"Ошибка при вставке или обновлении данных: {e}")
def get_file_data(conn: sqlite3.Connection, file_hash: Optional[str] = None,
size: Optional[int] = None, last_modified: Optional[float] = None) -> Optional[Tuple[Any, ...]]:
"""
Получает данные о файле из базы данных.
:param conn: Объект соединения с базой данных
:param file_hash: Хеш файла (для поиска)
:param size: Размер файла (для поиска)
:param last_modified: Время последнего изменения файла (для поиска)
:return: Кортеж с данными о файле или None, если данные не найдены
"""
try:
c = conn.cursor()
if file_hash:
c.execute("SELECT path, size, last_modified, backup_path FROM file_data WHERE hash=?", (file_hash,))
elif size is not None and last_modified is not None:
c.execute("SELECT path, hash, backup_path FROM file_data WHERE size=? AND last_modified=?",
(size, last_modified))
else:
logging.warning("Нет параметров для поиска данных")
return None
return c.fetchone()
except Exception as e:
logging.error(f"Ошибка при получении данных: {e}")
return None