using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading.Tasks; namespace DataConnection.Interfaces; /// /// Interfaccia per la gestione di database preesistenti tramite EF Core /// public interface IDatabaseManager : IDisposable { /// /// Verifica la connessione al database /// Task TestConnectionAsync(); /// /// Ottiene entità dal database in base ai criteri specificati /// /// Tipo di entità /// Espressione di filtro /// Espressione di ordinamento /// Proprietà di navigazione da includere /// Numero di elementi da saltare /// Numero di elementi da prendere Task> GetAsync( Expression>? filter = null, Func, IOrderedQueryable>? orderBy = null, string includeProperties = "", int? skip = null, int? take = null) where T : class; /// /// Ottiene un'entità singola in base alla chiave primaria /// Task GetByIdAsync(object id) where T : class; /// /// Esegue una query SQL raw /// Task> ExecuteQueryAsync(string sql, params object[] parameters) where T : class; /// /// Esegue una query SQL raw e restituisce i risultati come dictionary /// Task>> ExecuteRawQueryAsync(string sql, string databaseName = "", params object[] parameters); /// /// Esegue un comando SQL che non restituisce risultati /// Task ExecuteCommandAsync(string sql, params object[] parameters); /// /// Ottiene l'elenco dei database disponibili sul server /// Task> GetAvailableDatabasesAsync(); /// /// Cambia il database corrente per la connessione /// Task ChangeDatabaseAsync(string databaseName); /// /// Ottiene i metadati delle tabelle nel database /// Task>> GetDatabaseSchemaAsync(); /// /// Ottiene solo la lista dei nomi delle tabelle disponibili (senza dettagli delle colonne) /// Task> GetTableNamesAsync(); /// /// Ottiene i dettagli delle colonne per una specifica tabella /// /// Nome della tabella (con schema se necessario) Task> GetTableSchemaAsync(string tableName); /// /// Ottiene tutti i record da una tabella specifica come dizionari chiave-valore /// Task>> GetAllRecordsAsync(string tableName); /// /// Ottiene il nome del campo Primary Key di una tabella specifica /// Task GetPrimaryKeyFieldAsync(string tableName); /// /// Esegue un upsert (INSERT o UPDATE) di un singolo record nella tabella specificata. /// Se un record con lo stesso valore del campo chiave esiste già, viene aggiornato; /// altrimenti viene inserito un nuovo record. /// /// Nome della tabella di destinazione /// Campo chiave per determinare se il record esiste /// Valore del campo chiave del record /// Campi e valori da inserire/aggiornare /// True se l'operazione è riuscita, false altrimenti Task UpsertRecordAsync(string tableName, string keyField, object? keyValue, Dictionary record); } /// /// Informazioni su una colonna del database /// public class DbColumnInfo { public string Name { get; set; } = string.Empty; public string DataType { get; set; } = string.Empty; public bool IsNullable { get; set; } public bool IsPrimaryKey { get; set; } public bool IsForeignKey { get; set; } public string? ReferencedTable { get; set; } public string? ReferencedColumn { get; set; } }