using DataConnection.DB.FoxPro; using DataConnection.Interfaces; namespace DataConnection.EF.SchemaProviders; /// /// Provider di schema per database Visual FoxPro / dBase, completamente managed /// (legge i file .dbf/.fpt/.dbc senza provider OLE DB/ODBC). /// La "connection string" รจ il percorso al .dbc o alla cartella di tabelle libere. /// public class FoxProSchemaProvider : IDatabaseSchemaProvider { public Task>> GetDatabaseSchemaAsync(string connectionString) { var info = FoxProReader.Resolve(connectionString); var result = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var table in FoxProReader.GetTableNames(info)) { try { var columns = FoxProReader.GetTableColumns(info, table); if (columns.Count > 0) result[table] = columns; } catch (Exception ex) { // Una tabella corrotta/illeggibile non deve bloccare l'intera discovery. Console.WriteLine($"[FoxPro] Impossibile leggere lo schema della tabella {table}: {ex.Message}"); } } return Task.FromResult>>(result); } public Task> GetTableNamesAsync(string connectionString) { var info = FoxProReader.Resolve(connectionString); return Task.FromResult>(FoxProReader.GetTableNames(info)); } public Task> GetTableSchemaAsync(string connectionString, string tableName) { var info = FoxProReader.Resolve(connectionString); return Task.FromResult>(FoxProReader.GetTableColumns(info, tableName)); } public Task> GetAvailableDatabasesAsync(string connectionString) { // Sorgente file-based: un solo "database" (il container o la cartella). var info = FoxProReader.Resolve(connectionString); return Task.FromResult>(new[] { info.DisplayName }); } }