Deterministischer Abgleich zwischen DMS file_revisions und Objekt-Storage-Verzeichnis, existenz-only (keine Inhaltspruefung, saubere Abgrenzung zu BAK-08). Report sortiert nach storage_key fuer stabile Weiterverarbeitung durch BAK-08. Systemd-Timer taeglich, real auf 192.168.1.131 verdrahtet und ausgeloest.
66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
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
|
|
}
|