package reconcile import ( "context" "fmt" "os" "path/filepath" "github.com/jackc/pgx/v5/pgxpool" ) // ListDBStorageKeys liest alle storage_key-Werte aus file_revisions // (DMS FDN-02) — Archive liest direkt aus derselben physischen // Tenant-Datenbank (Modell C, Core TEN-01), OHNE DMS-Go-Pakete zu // importieren (Archive ist ein eigenes Go-Modul) — reiner SQL-Zugriff // gegen das dokumentierte Schema, sortiert nach storage_key für // deterministische Reconcile-Ergebnisse. func ListDBStorageKeys(ctx context.Context, pool *pgxpool.Pool) ([]DBEntry, error) { rows, err := pool.Query(ctx, ` SELECT storage_key, document_id, id FROM file_revisions ORDER BY storage_key `) if err != nil { return nil, fmt.Errorf("reconcile: file_revisions abfragen: %w", err) } defer rows.Close() var entries []DBEntry for rows.Next() { var e DBEntry if err := rows.Scan(&e.StorageKey, &e.DocumentID, &e.RevisionID); err != nil { return nil, fmt.Errorf("reconcile: file_revisions-zeile lesen: %w", err) } entries = append(entries, e) } return entries, rows.Err() } // ListStorageObjects durchläuft den lokalen FDN-03-LocalDriver- // Basisordner und liefert alle vorhandenen Objektschlüssel (Pfad relativ // zu baseDir, mit "/" als Trenner — dasselbe Format wie // storage.ObjectKey aus FDN-03), sortiert. func ListStorageObjects(baseDir string) ([]string, error) { var keys []string err := filepath.WalkDir(baseDir, func(path string, d os.DirEntry, err error) error { if err != nil { return err } if d.IsDir() { return nil } rel, err := filepath.Rel(baseDir, path) if err != nil { return err } keys = append(keys, filepath.ToSlash(rel)) return nil }) if err != nil { if os.IsNotExist(err) { return nil, nil } return nil, fmt.Errorf("reconcile: objekt-storage durchlaufen: %w", err) } return keys, nil }