Daten aus uralten ADABAS-dateien auslesen

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Daten aus uralten ADABAS-dateien auslesen

Beitrag von r4pt0r » 22.09.2015 16:51:42

Hallo,

Ich habe hier eine größere Menge ADABAS-Daten die zu einer Prähistorischen Win95-Anwendung gehörten. Daraus sollen jetzt - entweder einmalig oder "live" wenns ne triviale Lösung gibt - Umschlüsselungen ausgelesen werden.

Ausser unmengen an Marketing-Brechmittel auf den Seiten der Software AG findet man zu adabas praktisch nichts brauchbares (ausser haufenweise adabas d 13.1xxx downloads von sehr seriösen Windows-Downloadportalen :roll: ). Angeblich kann LibreOffice Base damit umgehen - allerdings existiert keine der in der Wiki beschriebenen Auswahlmöglichkeiten... Dafür dass adabas bereits seit anfang der 70er im Einsatz ist findet man praktisch nichts technisch relevantes - proprietäre Horroranwendung par excellence... :roll:
Soweit ich herausfinden konnte baut wohl der Teilekatalog von Volkswagen noch immer auf ADABAS D / Natural auf - ausser zu gecracten Teilekatalogen auf Warezseiten hat mich die erkentniss aber auch nicht weiter gebracht :(


Hat sich jemand schon intensiver mit ADABAS D beschäftigt? Gibt es eine Möglichkeit die Dateien auszulesen/umzuwandeln? Evtl sogar per Perl DBI (dafür gibt es ein adabas-Modul, das setzt aber natürlich nen adabas-server voraus...)
Mir würde ein einmaliges auslesen der benötigten Daten ausreichen, die kann ich dann auch in eine relationale Datenbank füttern...

Bin dankbar für jeden Hinweis - aktuell bin ich kurz davor die Dateien einzeln als hexdump zu parsen - der verwertbare ascii-anteil scheint halbwegs strukturiert zu sein...

uname
Beiträge: 12426
Registriert: 03.06.2008 09:33:02

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von uname » 22.09.2015 17:09:27

Du könntest vielleicht StarOffice 7 mit der ADABAS-Erweiterung versuchen. Nicht selbst probiert ;-)

http://www.staroffice.com/get.php

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von r4pt0r » 22.09.2015 18:10:11

Iiih, noch so ne Oracle-Leiche :wink: Danke, werd ich morgen mal ausprobieren!

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von r4pt0r » 25.09.2015 09:44:38

Habe mir Staroffice in ner Win7-VM installiert - die linux-binaries brauchen ne uralte libc. Unter Win wird java 1.4 installiert :lol:

Leider funktioniert es mit dem zusammengestutzten adabas von Staroffice aber nicht. Man kann scheinbar keine existierenden Datensätze importieren (nur mit einer existierenden DB-instanz verbinden), also hab ich einfach eine neue DB erstellt und die Daten ersetzt - adabas speichert ja scheinbar alles innerhalb der Dateistruktur einer DB, also werden auch Einstellungen etc kopiert. Aber: das Adabas-Modul von Staroffice ist auf 100MB DB-Größe begrenzt und ich habe knapp 900MB :?

Werd zwar noch probieren ob ich nicht irgendwas brauchbares damit auslesen kann, bin aber für jeden alternativen Vorschlag dankbar. Ansonsten wird nächste woche awk auf die binärdaten losgelassen...

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von r4pt0r » 14.10.2015 18:08:20

Nachdem ich mich aus diversen Gründen länger nicht damit befassen konnte, hab ich heute mir das heute nochmal angeschaut. Da ich mir keine Hoffnungen mehr mache die Daten direkt per Datenbank auszulesen wurden direkt die Eingeweide der Binärdateien seziert...

Nach etwas Vorfiltern mit strings und sed konnte ich den Aufbau recht schnell rauslesen:

Code: Alles auswählen

Katalognr ("Bild-/Positionsnr")
  Modellnr
    Teilenr
      (Modellvariante von Modellnr zu der diese Teilenr passt)
      (Modellvariante)
    (Teilenr)
      (Modellvariante)
...
Dabei können mehrere Teilenummern unterhalb der Modellnr gelistet sein die jeweils wieder mehrere (oder keine) Modellvarianten untergeordnet haben. Eingeleitet wird aber immer mit einer Katalognr und Modellnr.
Problematisch sind nur einige Katalognr-Einträge (ca 2-3%) auf die direkt und nur eine Teilenr folgt und sonst kein anderer Bestandteil. Diese verwerfe ich aktuell - lieber ein paar "fehlende" Einträge als falsche. Zudem scheinen diese Katalognr/Teilenr-Beziehungen redundant zu sein und tauchen an Anderer stelle mit allen Daten nochmal auf.

Nach einigem Kopfzerbrechen wie ich das Variable auftreten der Teilenummern und Modellvarianten am besten behandle war irgendwann auch ein relativ simpler Algorithmus in AWK geschrieben mit dem auch die Patterns für die verschiedenen Nummern an mehreren Dateien getestet werden konnten.

Nachdem 10 Testdateien (von knapp 100...) damit erfolgreich in eine Normalform dargestellt werden konnten habe ich heute Nachmittag fix einen gruseligen Prototypen/POC/Wasauchimmer in Perl zusammengeschustert der die Dateien direkt parst, Werte in Variablen ablegt und daraus UPDATE/INSERT operationen zusammensetzt die per DBD:Cassandra in 3 Tabellen mit unterschiedlicher Struktur gepumpt werden (per "do" weil ganz faul und noch nie wirklich mit Perl:DBI gearbeitet :roll: )
Die 3 Tabellen werden den typischen Abfragemustern bzw Gliederungen der Daten gerecht.

Das ganze funktioniert soweit, ist nur noch hoffnungslos "Langsam": Eine Datei erzeugt ca 30000-35000 UPDATE/INSERTS, die knapp 11000 Datenbankzeilen (3500-4000 je Tabelle) erzeugen und das Script benötigt dafür ~1:30 min mit consistency "LOCAL_QUORUM".
Allein schon das preparen der Datenbankqueries anstatt alles sofort per "do" auszuführen wird das ganze erheblich beschleunigen, weil die tatsächliche Anzahl an DB-Operationen mindestens halbiert wird. Wenn ich zudem nicht seriell parse sondern zuerst (ggf batchweise - die ADABAS-Daten sind grob nach Modellcode sortiert) zusammengehörendes in ein entsprechendes array/hash-gebilde pumpe, kann ich auch hier die writes an der DB verringern, einfach weil sonst viele Zeilen mehrfach geschrieben werden müssten.

Unterm Strich war das ganze bisher aber deutlich schmerzfreier als die Suche nach Informationen und (freier) Software für adabas :wink:

Ich würde ja zu gerne mal das (fertige) Script auch auf die MSSQL-DB loslassen. Ich befürchte nur dass ich dann erstmal keine Ruhe mehr habe wenn der Server abraucht :lol:

uname
Beiträge: 12426
Registriert: 03.06.2008 09:33:02

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von uname » 15.10.2015 14:42:54

Ich kenne mich mit Datenbanken nicht aus. Aber vielleicht wäre es schneller nicht direkt die Datenbankbefehle auszuführen, sondern mit Perl erst mal eine Art Datenbank-Dump zum anschließenden Import zu erzeugen. Leider kenne ich die Struktur deiner Zieldatenbanken nicht. Aber du könntest ja mal einen Test-Dump erzeugen.

Vielleicht hilft dir z.B. [1] . Gibt vielleicht auch was für MSSQL.

[1] https://github.com/gianlucaborello/cassandradump

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Daten aus uralten ADABAS-dateien auslesen

Beitrag von r4pt0r » 15.10.2015 15:10:43

Ich werde das ganze dateiweise in 3 verschachtelte strukturen aus hashes und arrays schreiben die praktisch der struktur in den cassandra-tabellen entsprechen (partitions- und cluster-keys). Darüber wird dann in 3 parallel bzw nichtblockierenden prozessen iteriert und die db-calls clusterweise vorbereitet (prepare). Jeder Prozess hält seine db-handles offen und pumpt die db-calls nach draussen. Das reduziert den overhead der einzelnen calls um 60% und die Anzahl der calls locker um ca 50%+
Zudem werde ich nicht DBI/DBD::Cassandra nutzen sondern werde mir Net::Async::Cassandra anschauen.

Es arbeitet also je 1 Prozess für eine Struktur (=Tabelle im Keyspace) und ich variiere die Anzahl der parallelen DB-Verbindungen. Da sollte sich recht schnell ein sweet-spot zeigen an dem die Performance am besten ist - oder der nächste Flaschenhals ;)

Da ein dump der generierten DB-Calls vom Prototypen in eine Datei nur ca 3-4sec dauert, denke ich nicht dass das parsen der Binärdaten ein Problem darstellt - die regexp-engine von Perl ist ja schon verflucht schnell...


edit:
Ahja: die Cassandra-DB ist nicht der flaschenhals. Es kamen im peak ~250 writes/sec am cluster an, last blieb unverändert niedrig und die write-latenz ging sogar nach unten (da im cache). Es liegt also am Script das aktuell nicht mehr calls/sec rausfeuern kann ;)

Antworten