[Allegro] Vb.245: V32.0 ist da

Bernhard Eversberg ev at biblio.tu-bs.de
Mi Jan 25 08:17:45 CET 2012


Verlautbarung 245 der Entw.Abt.                              2012-01-25
-------------------------------

               Die üblichen Dateien sind per ftp und svn bereitgestellt.


V32.0  Hauptthema: update.job mit neuen Faehigkeiten
=====

upd.exe : NEU
=============
Kurz und gut: Der Aufruf ist genau wie frueher und es kommt dasselbe
raus, die Sache laeuft nur intern etwas anders.
Alt: update.exe und upd.exe  werden jetzt zu  upd16.exe
NEU: update.exe und upd.exe (identisch) sind 32bit-Programme.

HINWEIS: Unter Win'64 kann man nicht update.exe verwenden, sondern
nur das identische upd.exe.

Das neue Programm upd.exe ersetzt nicht etwa, wie man denken
koennte, komplett das alte 16bit-Programm! Gibt man den Befehl

    upd -fm41 -ddemo2 -bcat -uneudat.alg

so wird dieser umgewandelt in einen Aufruf von acon:

    acon -jupdate -fm41 -ddemo2 -bcat -uneudat.alg

Die Arbeit, die frueher das Programm update.exe machte, wird also
nun von acon gemacht, indem es den Job  update.job  ausfuehrt und
ihm die Optionen  -fm41 usw. uebergibt.

Der  update.job  ist recht komplex. Es gab schon eine Vorversion
(ab V28.5, s. Vb.207), die noch unvollkommen war. Die neue wurde
zunaechst von Thomas Berger geschrieben, in lockerer Anlehnung an
unsere alte. Wir haben dann die neue nochmals ueberarbeitet, weiter
vervollstaendigt, gestrafft, Variablen u.a. z.T. kuerzer und plausibler
benannt, die Kommentare aber ausfuehrlicher gemacht. Einige auch von
Berger bemerkte Schwaechen der FLEX-Sprache wurden nebenher ausgemerzt,
siehe unten.

Zu  update.job  gehoert eine Datei  optsget.inc, in der die
uebergebenen Optionen, also z.B.  -uneudat.alg, ausgewertet und
in $-Variablen kopiert werden, z.B. -u  in  $OP_u. Mit diesen
Variablen arbeitet dann der eigentliche update.job.

Im Ergebnis hat man einen vollwertigen Ersatz des alten 16bit-
Programms update.exe (jetzt upd16.exe). Darueber hinaus:

o Auch Dateien im Externformat (.ADT) sind jetzt moeglich, und sie
   duerfen auch im Windows-Code oder UTF-8 sein (s.u.)
   Diese sind leichter mit ganz normalen Texteditoren zu erstellen als
   die traditionellen Grunddateien (.ALD), in denen die Steuerzeichen
   00 bis 06 vorkommen.
   Hierbei gehen auch Feldloeschungen (mit _ als einzigem Feldinhalt)
   und Einfuegen von zusaetzlichen Mehrfachfeldern, mit ~ hinter der
   Feldnummer, z.B.  insert #32~

o Der  update.job  ist beliebig erweiterbar sowie in allen Punkten
   variabel. Er ist ausfuehrlich kommentiert, an den fuer Erweiterungen
   interessanten Stellen mit dem Wort ERWEITERUNG. Dadurch kann der
   Job auch als Muster fuer eigene Projekte zur Verarbeitung von
   Grund- und Externdateien dienen.

o Die Fehlerpruefungen und -meldungen sind zahl- und hilfreicher
   als beim alten Programm.
   Mit den Optionen -T1 und -T2 bekommt man mehr bzw. noch mehr Test-
   und Ablaufmeldungen.

o Mit der neuen Testoption --asif kann man "so tun, als ob", d.h. es
   passiert alles, was passieren soll, nur ohne Speichern. Das ist also
   vollkommen ungefaehrlich, aber eben nur zum Testen.

o Weitere praktische Optionen:
   --ANSI   : Daten sind im ANSI-Code, Datenbank aber intern ASCII
   --UNICODE: Daten sind in UTF-8 (Wandlung per "xcode u")
   --check  : gleichwertig -T2 (viele Meldungen)
   --verbose: gleichwertig -T1 (nicht so viele Meldungen)
   --quiet  : nur sehr wenige Meldungen (geringfuegig schneller)
   --help   : Anzeige der unverzichtbaren Optionen

o Die Include-Datei  optsget.inc  laesst sich auch in andere, eigene
   Jobs einbinden, in denen man etliche Aufrufoptionen auswerten
   muss. Diese werden dann durch  "perform OPGET" bequem in Variablen
   $OP_x  (aus -x...) umgewandelt.

ABER:
Anders als beim alten  update.exe  muss man dem  update.job  alle
noetigen Angaben im Aufruf uebergeben! Er ist kein interaktives
Programm, das fehlende Angaben vom Nutzer abfragt, sondern ein sog.
Konsolprogramm, das seine Arbeit vollautomatisch tut oder mit einem
Hinweis beendet. Auch das alte Programm wurde aber normalerweise mit
kompletten Aufrufen in Batchdateien fest eingebaut und tat seine
Arbeit, ohne dass der Nutzer davon viel hatte wissen muessen. Fuer
alle solchen Anwendungen braucht nun die betr. Batchdatei gar nicht
geaendert zu werden! Das neue upd.exe an der Stelle des alten upd.exe
(noch aelter: update.exe) startet in Wirklichkeit acon mit dem
Job  update.job, das ist alles.

Auch das Verfahren zum Einspeisen einer Backup-Kopie (Option -fp)
funktioniert jetzt, bei den Vorversionen ging es noch nicht. Dazu war
eine Verbesserung der Standardprozedur _backup.bat noetig, damit das
Verfahren ueber das ORG-Menue klappt (in der Funktion "Datenbank-Kopie"
startet _backup.flx ein Skript _backup.bat, und dieses erstellt die
Batchdatei _catrest.bat. Die muss gestartet werden, wenn es denn zum
Fall der Faelle kommt und eine Restaurierung aus der Sicherungskopie
heraus noetig ist. Kurz zu den genannten Dateien:

_backup.flx  :  Vorbereitungen des Aufrufs von _backup.bat
                 (Aufruf erfolgt z.B. ueber "h org : Datenbank-Kopie")

_backup.bat  :  (gestartet aus _backup.flx) Ausfuehren der Kopie und
                 Erstellen einer Batchdatei fuer das
                 Restaurieren (catrest.bat im Fall der DemoBank)

catrest.bat  :  (im allgemeinen Fall:  <dbName>rest.bat)
                 Fuehrt das Zurueckholen der Sicherungskopie aus und
                 danach das Einspeisen der LOG-Datei mittels acon.

Schon die Version V32.0 liefert das neue upd.exe mit statt des alten,
das als upd16.exe auch noch dabei ist. Die ganze Umruestung passiert
deshalb automatisch. Man wird normalerweise nur an den veraenderten
Meldungen merken, das sich was getan hat, aber die Ergebnisse von
alten Batchprozessen mit "update" oder "upd"  sollten gleich sein.

Aber koennte ein echter 32bit-Ersatz fuer das alte update.exe
nicht schneller sein als acon + update.job?
Anders als srch hat update sehr viele schreibende Zugriffe auf die
Indexdatei zu leisten. Diese sind relativ zeitaufwendig, sie sind aber
enthalten in der Klassenbibliothek, nicht direkt in FLEX (also in
update.job) realisiert; da steht nur der Befehl "put", der erledigt
alles intern. Daher wuerde der Gewinn, anders als im Fall srch, kaum
der Rede und der Muehe wert sein. Nach bisherigen Feststellungen ist
das neue Verfahren in etwa so schnell wie das alte, mit Option
--quiet etwas schneller.


acon : Eingabe von mehreren Feldern gleichzeitig
------------------------------------------------

Befehlstrenner ';'
... wird zum Problem, wenn er am Ende einer FLEX-Zeile auftritt, z.B.

insert #27;

um ein Feld  #27;  zu schaffen. Das Zeichen ; ist ja als Wiederholungs-
zeichen hinter der Kategorienummer nicht verboten. Aber so klappte
das nicht. Nun aber doch.
Die Sequenz ;# ist bei acon (nicht bei a99) ein Trenner zwischen zwei
Datenfeldern (nicht #u-Variablen). Wenn man also schreibt
var "#18 abc;#19 def"
insert
erhaelt man zwei Felder #18 und #19 im aktuellen Satz.
Fuer a99 muesste man dagegen schreiben
var "#18 abc" n "#19 def"
insert
Dies wurde so geregelt, um die Praktik des "Code injection" bei acon
zu verhindern, die sonst bei Web-Katalogen zum Sicherheitsproblem
werden koennte. Die Sequenz 13 10 (gleichwertig mit newline) wird
in acon zu einem Leerzeichen.


Neue Sperr-/Freigabebefehle  (FLEX-Doku ist aktualisiert)
---------------------------

set lock #N
set unlock #N
    Damit kann man einen anderen als den aktuellen Satz
    sperren bzw. entsperren.
    Fehlt N, wird die Satznummer aus der iV entnommen.

if Lock ...
if not Lock ...
    Aktuellen Satz auf "gesperrt" bzw. "frei" pruefen

index p name
index t name
    Zum Laden einer anderen Indexparameterdatei bzw. -tabelle
    (bei a99 ging das schon lange)
    Fehlt der name, wird der iV-Inhalt genommen.

get edit ...
    Bei diesen Befehlen stand der Kommentar:
    "Freigabe erfolgt beim Speichern oder Laden des naechsten Satzes"
    Dies ist durchaus nicht immer erwuenscht! Es wurde deshalb abge-
    schafft; d.h. man muss selber entsperren mit "set unlock", falls
    man nicht mit "put" den Satz wieder speichert, dann wird er
    automatisch freigegeben. Diese Freigabe in Ausnahmefaellen ver-
    hindern kann man aber mit

put lock
    Unter "put" stand der Hinweis, man solle VOR einer Aenderung eines
    Satzes immer "set lock" geben, nur dann wuerden die Schluessel beim
    Speichern mit "put" richtig korrigiert. Dies entfaellt nun!
    Man konnte es ja allzu leicht vergessen, und bei a99 war's nie so.
    Jetzt hat das ein Ende.


a99 und acon: Zeitstempel geaendert
-----------------------------------
Bis jetzt sahen Zeitstempel in den Feldern #99n und #99e ($a.cfg)
immer so aus:  JJJJMMDD/hh:mm:ss$Opcode
wobei "Opcode" der Nutzercode aus der Option -O des Aufrufs ist.
Nun wurde dies etwas erweitert, vor allem um manche Speichervorgaenge
sicherer zu machen:
   JJJJMMDD/hh:mm:ss-N/L$oOpcode.
Dabei ist
N die interne Satznummer des Satzes (zum Zeitpunkt des Speicherns),
L eine laufende Nummer, z.B. 57 waere der 57. Speichervorgang der
aktuellen Sitzung (bei a99) bzw. des aktuellen Jobs (bei acon). So
koennen keine ganz identischen Zeitstempel entstehen (obwohl auch
dies nur in extrem seltenen Faellen mal problematisch haette
werden koennen). Und vor dem Opcode steht noch ein o, wodurch
nun diese Angabe ein echtes Unterfeld wird.
Der Befehl D in der CFG hat nun keine Wirkung mehr auf die Laenge
des Zeitstempels. Vorher war ohnehin D17 Default und Maximum, und
wie koennte ein verkuerzter Zeitstempel sinnvoll sein?
Die alten, in zahllosen Saetzen vorhandenen Zeitstempeln kann man
so lassen.




Mehr Informationen über die Mailingliste Allegro