Deutsch English
Blog
Home
Über tdbengine
Newsletter
Download
Helpware
Chat
Dokumentation
Installation
Konfiguration
Erste Schritte
Variablentypen
Laufzeitschalter
Textdateien
Systemfunktionen
Tabellenfunktionen
Indexfunktionen
Volltext-Indizierung
Memos und Blobs
Semaphoren-Konzept
Fehlermeldungen
Tipps für PHP Programmierer
Locking daemon
Einführungskurs
Befehlsreferenz
HOWTO - Wie kann ich...?
Projekte
Links
Benchmarks
Bug Reporting
Supportanfrage
 
Home    Überblick    Suche    Impressum    Kontakt    Mitglieder
Memo- und Blob-Funktionen
Sowohl Memos als auch Blobs werden in eigenen physikalischen Dateien gespeichert. In der zugehörigen Tabelle werden nur Zeiger auf den entsprechenden Eintrag in der jeweiligen Memo- oder Blob-Datei hinterlegt. Ein Memo-Feld speichert einen beliebig großen Text, ein Blob-Feld (BLOB = Binary Large OBject) irgendwelche Binärdaten.

Memos einlesen
Memofelder werden gefüllt, indem ein Text (extern oder intern) eingelesen wird.

ReadMemo(db,'Memofeld',pfad_zur_textdatei)

Mit einem zusätzlichen Parameter kann festgelegt werden, ob durch den Aufruf der Funktion ein bereits bestehendes Memo durch die Textdatei ersetzt oder ergänzt wird:
ReadMemo(db,'Memofeld',pfad_zur_textdatei,0) Text wird an bestehendes Memo angehängt
ReadMemo(db,'Memofeld',pfad_zur_textdatei,1) Text ersetzt bestehendes Memo

Der Vorgabewert (also wenn nichts angegegeben wird) ist 0.

Ein weiterer Parameter legt fest, ob der externe Text im ANSI- oder in ASCII-Zeichensatz vorliegt:

0 (Vorgabe) ANSI-Zeichensatz
1 ASCII-Zeichensatz

Beispiel:
ReadMemo(db,'Memofeld',pfad_zur_textdatei,1,1) die externe Textdatei liegt im ASCII-Zeichensatz vor und ersetzt das bisherige Memo
ReadMemo(db,'Memofeld',pfad_zur_textdatei,0,1) die externe Textdatei liegt im ASCII-Zeichensatz vor und wird an das bisherige Memo angehängt

Wichtig:

ReadMemo arbeitet immer mit dem aktuellen (also zuletzt gelesenen oder geschriebenen) Datensatz. Es wird immer eine komplette Transaktion durchgeführt, also inklusive dem Zurückschreiben des aktuellen Datensatzes. Deshalb ist ein abschließendes WriteRec() nicht nötig.

Beispiel:

ReadRec(db,10000)
ReadMemo(db,'Bemerkung','texte/neuertext.txt',1)
// kein writerec!

Der Rückgabewert von ReadMemo() ist 0, wenn alles in Ordnung ist, ansonsten wird der Fehlercode geliefert.

Memogröße bestimmen
Die aktuelle Größe (in Bytes) eines Memos liefert die Funktion MemoLen()

MemoLen(dn,'Memofeld') -> Anzahl aller Zeichen des zugehörigen Textes.

Memos aus HTML-Formularen einlesen
In HTML-Formularen werden Memos normalerweise über ein TEXTAREA-Tag eingelesen. Die Textarea sollte einen Namen haben, der mit "text:" beginnt:

<textarea name="text:Bemerkung" ...

Das Formular mit der Textarea muss die Methode "POST" verwenden. Dann wird beim Ausführen des entsprechenden Programms automatisch ein Ramtext angelegt, das den Inhalt der Textarea im ASCII-Zeichensatz enthält. Wenn Sie also die Textarea in ein Memo einlesen wollen, genügt folgender Aufruf:

ReadMemo(db,'Memofeld','ramtext:text:Bemerkung',1,1)

Memo auslesen
Das Gegenstück von ReadMemo() steht mit der Funktion CopyMemo() zur Verfügung, mit der der Inhalt eines Memofeldes in eine (interne oder externe) Textdatei übertragen wird.

CopyMemo(db,'Memofeld',pfad_zur_textdatei)

Auch hier gibt es einen weiteren Parameter, der den Zeichensatz der Textdatei festlegt:

0 (Vorgabe) -> ANSI-Zeichensatz
1 -> ASCII-Zeichensatz

Wie ReadMemo() arbeitet auch CopyMemo() mit dem aktuellen Datensatz.

Memos in Templates
Die Funktion Subst() bietet eine sehr bequeme Möglichkeit, Memos in Templates einzufügen:

Subst(target,db,'Memofeld',1)

fügt an die Stelle des Targets den Inhalt des Memofeldes ein, wobei bereits eine korrekte Zeichenkonvertierung nach HTML vorgenommen wird. Diese Methode wird eingesetzt, wenn das Target den Inhalt eines Textareas definiert, das Memo also editiert werden soll.

Ausserhalb eines Textareas wird man

Subst(target,db,'Memofeld',5)

wählen, denn hierbei werden harte Zeilenumbrüche innerhalb des Memos durch '<br>' ersetzt.

Tipp: Wenn Sie in Memos bestimmte Auszeichnungstags (Beispiel <b>..</b>) einsetzen, können Sie diese auch noch nach der HTML-Konvertierung wirksam werden lassen:

WHILE Subst('<b>','<b>') DO END
WHILE Subst('</b>','<b>') DO END

Suche in Memos
Über eine sequentielle Suche kann in Memos mit den Operatoren has bzw. like wie in Stringfeldern gesucht werden.
Memofelder können auch in einen Volltextindex aufgenommen werden, was zu einer sehr schnellen Suche führt.

BLOBs einlesen
Wie Memos werden auch BLOBs in einer eigenen Datei abgelegt. In der Tabelle selbst wird nur ein Zeiger auf den Anfang angelegt. Bei BLOBs werden jedoch zwei Arten der Einbindung unterschieden:

  • Eine externe Datei wird komplett in die BLOB-Datei kopiert (embedded)
  • Es wird nur eine Referenz auf die externe Datei gespeichert (link)
Für jeden Fall gibt es eine eigene Funktion:
EmbedBlob(db,'Blobfeld',pfad_zur_datei) speichert die gesamte Datei in das BLB-File
LinkBlob(db,'Blobfeld',pfad_zur_datei) speicher nur den pfad_zur_datei in das BLB-File

In beiden Fällen kann ein Typkennzeichen für die externe Datei als zusätzlicher Parameter übergeben werden. Folgende Typkennzeichen sind vordefiniert und sollten nicht für andere Dateitypen verwendet werden:

1 : BMP oder DIB
2 : PXC
3 : WAV
4 : WMF
5 : GIF
6 : JPG oder JPEG

Beispiel:

EmbedBLOB(db,'Bild','/pics/maria.jpg',6)

Das Funktionsergebnis beider Funktionen ist 0, wenn die Operation erfolgreich war, ansonsten wird der Fehlercode zurückgeliefert.

Wenn LinkBlob() ohne Dateinamen aufgerufen wird, liefert die Funktion den aktuell gespeicherten Pfad (Referenz).

Gelinkte BLOBs sind im Zusammenhang mit der tdbengine relativ langweilig, weil für eine Referenz zu einer einer externen Datei ein normales STRING-Feld ausreicht und der Aufwand für eine zusätzliche Datei zu groß ist. Zudem merkt die Datenbank nichts davon, wenn eine Referenz ins Leere zeigt, weil die zugehörige Datei gelöscht, umbenannt oder in ein anderes Verzeichnis verschoben wurde.

Anders liegt der Fall bei eingebetteten BLOBs, denn hierbei liegt eine komplette Kopie vor, die Ursprungsdatei wird demnach nicht weiter benötigt.

BLOBs auslesen
Das Gegenstück zu EmbedBlob() liefert die Funktion CopyBlob():

CopyBlob(db,'BlobFeld',pfad_zur_datei) kopiert den Inhalt des Blobfeldes in eine externe Datei

Eine Sonderform dieser Form liegt vor, wenn das BLOB auf die Datei 'con' kopiert wird:

CopyBLOB(db,'BlobFeld','con')

In diesem Fall wird das BLOB an die Standardausgabe ausgegeben (also direkt and CGI-Klienten).

Zwei Funktionen geben Aufschluss über Größe und Typkennzeichen des Blobs:
BlobSize(db,'Blobfeld) Größe des gespeicherten Blobs in Bytes
BlobType(db,'Blobfeld') Typkennzeichen des Blobs

Beispiel:

VAR t : INTEGER
  ...
  IF t:=BLOBType(db,'Bild')=5
  THEN CGIWriteLn('content-type: image/gif')
  ELSIF t=6
  THEN CGIWriteLn('content-type: image/jpeg')
  ELSE
    // Fehlerbehandlung
  END
  CGIWriteLn('')
  CGICloseBuffer
  CopyBLOB(db,'Bild','con')

Tipps - Tipps - Tipps
Sie sollten weder Memos noch Blobs mit SetField() eine Wert zuweisen.

Sie können mit SetField(db,'BlobFeld','') ein Blobfeld löschen. Allerdings bleibt dabei die eingebundene Datei in der BLOB-Datei enthalten, es wird nur der Verweis gelöscht.

Sorgen Sie dafür, dass ausser dieser 0-Zuweisung keine weiteren direkten Zuweisungen an Memo- oder Blob-Felder erfolgen. Andernfalls kann die gesamte Verwaltung so durcheinander kommen, dass die Tabelle nicht mehr brauchbar ist.

Eine Falle im obigen Sinne besteht in folgenden Programmfragment:

ReadRec(db,x); WriteRec(db,FileSize(x)+1)

Hier wird eine Kopie des Datensatzes angelegt, dabei werden auch die Memo- und Blob-Refernzen kopiert (was schnell zur Katastrophe führt).

Richtig wäre:

ReadRec(db,x); SetRecord(db,db); WriteRec(db,FileSize(x)+1)

Leider funktioniert das erst ab Version 6.2.5 der tdbengine

Haben Sie das Gefühl, dass bei Memos oder Blobs irgendetwas nicht stimmt (weil beispielsweise die Änderungen in einem Memofeld plötzlich auch in einem anderen auftauchen), so restrukturieren Sie die Tabelle mit dem ddk. Dabei werden immer neue konstistente Memo- und Blob-Dateien angelegt.

Siehe auch:





tdbengine Anwendungen im Web:

Open-Source Web CMS


Open-Source Bug-Tracking


Free wiki hosting

Open-Source Wiki-System

Kostenloses Foren-Hosting

Diät mit tdbengine 8-)

tdbengine chat
irc.tdbengine.org
#tdbengine

   Copyright © 2003-2004 tdb Software Service GmbH
   Alle rechte vorbehalten. / All rights reserved
   Letzte Änderung: 04.05.2004


ranking-charts.de

Programmers Heaven - Where programmers go!