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 });
}
}