Start · Sprachen · PHP · Referenz · pg_lo_tell

pg_lo_tell

Funktion

Gibt die aktuelle Lese-/Schreibposition (Datei-Cursor-Position) innerhalb eines PostgreSQL Large Objects zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_lo_tell(PgSql\Lob $lob): int

Beschreibung

pg_lo_tell() gibt die aktuelle Position des internen Zeigers eines geöffneten PostgreSQL Large Objects zurück. Die Position entspricht der Anzahl der Bytes, die seit dem Anfang des Large Objects übersprungen wurden – ähnlich wie ftell() für reguläre Dateien.

Large Objects (LO) in PostgreSQL ermöglichen die Speicherung von Binärdaten, die größer als eine normale Tabellenzelle sein können (z. B. Bilder, Videos oder Dokumente). Nachdem ein Large Object mit pg_lo_open() geöffnet wurde, kann mit pg_lo_read(), pg_lo_write() oder pg_lo_seek() gearbeitet werden. Mit pg_lo_tell() lässt sich jederzeit die aktuelle Cursor-Position abfragen.

Diese Funktion ist nützlich, um den Fortschritt beim Lesen oder Schreiben zu überwachen, oder um nach einem pg_lo_seek() zu prüfen, ob sich die Position korrekt verändert hat. Der Aufruf muss innerhalb einer Transaktion erfolgen, da PostgreSQL Large Objects transaktional sind.

Ab PHP 8.1 ist der Parameter vom Typ PgSql\Lob (Objekt) statt einer Resource.

Parameter

Name Typ Default Beschreibung
$lob Pflicht PgSql\Lob Ein Large-Object-Handle, das zuvor mit pg_lo_open() geöffnet wurde.

Rückgabewert

Typ
int
Beschreibung
Gibt die aktuelle Byte-Position des Cursors innerhalb des Large Objects zurück. Bei Fehler wird -1 zurückgegeben.

Beispiele

Aktuelle Position nach dem Lesen ermitteln

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');

pg_query($conn, 'BEGIN');

// Large Object öffnen (OID muss bekannt sein)
$oid = 123456;
$lob = pg_lo_open($conn, $oid, 'r');

if ($lob === false) {
    die('Large Object konnte nicht geöffnet werden.');
}

// 100 Bytes lesen
$data = pg_lo_read($lob, 100);

// Aktuelle Position abfragen
$pos = pg_lo_tell($lob);
echo "Aktuelle Position: " . $pos . " Bytes\n"; // Ausgabe: 100

pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
Aktuelle Position: 100 Bytes

Position nach pg_lo_seek überprüfen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');

pg_query($conn, 'BEGIN');

$oid = 123456;
$lob = pg_lo_open($conn, $oid, 'rw');

if ($lob === false) {
    die('Fehler beim Öffnen des Large Objects.');
}

// Cursor auf Position 512 setzen
pg_lo_seek($lob, 512, PGSQL_SEEK_SET);

// Aktuelle Position prüfen
$pos = pg_lo_tell($lob);
echo "Position nach Seek: " . $pos . " Bytes\n"; // Ausgabe: 512

// Weitere 256 Bytes lesen
$chunk = pg_lo_read($lob, 256);
$pos = pg_lo_tell($lob);
echo "Position nach Read: " . $pos . " Bytes\n"; // Ausgabe: 768

pg_lo_close($lob);
pg_query($conn, 'COMMIT');
pg_close($conn);
Position nach Seek: 512 Bytes Position nach Read: 768 Bytes

// Wichtig · Fallstricke

Transaktion erforderlich: Alle Operationen mit PostgreSQL Large Objects müssen innerhalb einer Transaktion stattfinden. Vergisst man BEGIN vor dem Öffnen, schlägt pg_lo_open() fehl oder verhält sich undefiniert.

PHP 8.1+: Ab PHP 8.1 wurde die Resource durch die Klasse PgSql\Lob ersetzt. Code, der auf den alten Resource-Typ prüft, muss angepasst werden.

Rückgabewert -1: Ein Rückgabewert von -1 deutet auf einen Fehler hin – z. B. wenn das Large Object nicht korrekt geöffnet wurde oder bereits geschlossen ist.