import os import mysql.connector from mysql.connector import Error from datetime import datetime class FileSystemToMySQL: def __init__(self, host, port,user, password, database): self.host = host self.port=port self.user = user self.password = password self.database = database self.connection = None def connect(self): try: self.connection = mysql.connector.connect( host=self.host, port=self.port, user=self.user, password=self.password, database=self.database ) if self.connection.is_connected(): print("Connected to MySQL database") self._initialize_database() except Error as e: print(f"Error connecting to MySQL: {e}") def _initialize_database(self): cursor = self.connection.cursor() # Create tables if they don't exist cursor.execute(""" CREATE TABLE IF NOT EXISTS folders ( id INT AUTO_INCREMENT PRIMARY KEY, path VARCHAR(767) NOT NULL, name VARCHAR(255) NOT NULL, parent_id INT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, FOREIGN KEY (parent_id) REFERENCES folders(id) ON DELETE CASCADE, UNIQUE (path) ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS files ( id INT AUTO_INCREMENT PRIMARY KEY, folder_id INT NOT NULL, name VARCHAR(255) NOT NULL, size INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, FOREIGN KEY (folder_id) REFERENCES folders(id) ON DELETE CASCADE, UNIQUE (folder_id, name) ) """) self.connection.commit() cursor.close() def _get_folder_id(self, folder_path): cursor = self.connection.cursor() cursor.execute("SELECT id FROM folders WHERE path = %s", (folder_path,)) result = cursor.fetchone() cursor.close() return result[0] if result else None def _insert_folder(self, folder_path, parent_id=None): folder_name = os.path.basename(folder_path) now = datetime.now() cursor = self.connection.cursor() cursor.execute(""" INSERT INTO folders (path, name, parent_id, created_at, updated_at) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE updated_at = %s """, (folder_path, folder_name, parent_id, now, now, now)) folder_id = cursor.lastrowid if folder_id == 0: # If it was an update folder_id = self._get_folder_id(folder_path) self.connection.commit() cursor.close() return folder_id def store_file(self, file_path, folder_path): try: # First ensure the folder exists folder_id = self._insert_folder(folder_path) # Read file content with open(file_path, 'rb') as file: file_content = file.read() file_name = os.path.basename(file_path) file_size = os.path.getsize(file_path) now = datetime.now() cursor = self.connection.cursor() cursor.execute(""" INSERT INTO files (folder_id, name, size, created_at, updated_at) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE size = VALUES(size), updated_at = VALUES(updated_at) """, (folder_id, file_name, file_size, now, now)) self.connection.commit() cursor.close() print(f"Stored/updated file: {file_name} in folder: {folder_path}") except Error as e: print(f"Error storing file {file_path}: {e}") def store_directory(self, directory_path, parent_folder_path=None): try: # Ensure the parent folder exists parent_id = None if parent_folder_path: parent_id = self._insert_folder(parent_folder_path) # Store the current directory dir_id = self._insert_folder(directory_path, parent_id) # Store all files in the directory for item in os.listdir(directory_path): full_path = os.path.join(directory_path, item) if os.path.isfile(full_path): self.store_file(full_path, directory_path) elif os.path.isdir(full_path): self.store_directory(full_path, directory_path) print(f"Stored directory: {directory_path}") except Error as e: print(f"Error storing directory {directory_path}: {e}") def close(self): if self.connection and self.connection.is_connected(): self.connection.close() print("MySQL connection closed") # Example usage if __name__ == "__main__": # Database configuration db_config = { 'host': '192.168.1.76', 'port': '3307', 'user': 'root', 'password': 'Vlado9674+', 'database': 'file_storage_db' } # Initialize the file system storage fs_storage = FileSystemToMySQL(**db_config) fs_storage.connect() # Store a single file # fs_storage.store_file('/path/to/your/file.txt', '/path/to/your') # Store an entire directory fs_storage.store_directory(r'u:\Dropbox\!!!Days\Downloads Z230') # Close the connection fs_storage.close()