Signatur
Beschreibung
cubrid_lob2_seek64() positioniert den internen Cursor eines LOB-Objekts (Large Object, also BLOB oder CLOB) auf eine bestimmte Position. Im Unterschied zur Funktion cubrid_lob2_seek() wird der Offset als String übergeben, um 64-Bit-große Dateipositionen auch auf 32-Bit-Systemen korrekt abbilden zu können, da PHP auf solchen Plattformen keine nativen 64-Bit-Integer unterstützt.
Der Ursprung der Bewegung wird über den Parameter origin gesteuert. Mögliche Werte sind CUBRID_CURSOR_FIRST (Anfang des LOB), CUBRID_CURSOR_CURRENT (aktuelle Position) und CUBRID_CURSOR_LAST (Ende des LOB). Dies ermöglicht wahlfreien Zugriff auf beliebige Teile sehr großer Binär- oder Textdaten.
Die Funktion ist besonders nützlich, wenn LOB-Objekte größer als 2 GB sind und Teilbereiche gezielt gelesen oder geschrieben werden sollen, ohne den gesamten Inhalt in den Speicher laden zu müssen.
Nach dem Positionieren des Cursors kann mit cubrid_lob2_read() ab der neuen Position gelesen werden. Das LOB-Objekt muss zuvor über cubrid_lob2_new() oder eine entsprechende Abfrage erzeugt worden sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $lob_identifier Pflicht | resource | Ein LOB-Identifikator, der durch cubrid_lob2_new() oder aus einem Abfrageergebnis stammt. |
|
| $offset Pflicht | string | Die Anzahl der Bytes (bei BLOB) bzw. Zeichen (bei CLOB), um die der Cursor verschoben werden soll. Als String übergeben, um 64-Bit-Werte auch auf 32-Bit-Systemen korrekt darzustellen. | |
| $origin | int | CUBRID_CURSOR_CURRENT | Gibt den Bezugspunkt für die Cursorbewegung an. Erlaubte Werte: CUBRID_CURSOR_FIRST (Anfang), CUBRID_CURSOR_CURRENT (aktuelle Position), CUBRID_CURSOR_LAST (Ende). |
Rückgabewert
true bei Erfolg zurück. Im Fehlerfall (z. B. ungültiger Offset oder ungültiges LOB-Objekt) wird false zurückgegeben.Beispiele
Cursor eines großen BLOB-Objekts auf eine bestimmte Position setzen
<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
// LOB-Objekt aus einer Abfrage holen
$req = cubrid_execute($conn, "SELECT blobcol FROM bigtable WHERE id = 1");
$row = cubrid_fetch($req, CUBRID_NUM);
$lob = $row[0];
// Cursor auf Byte 3.000.000.000 vom Anfang setzen (64-Bit-Offset als String)
$result = cubrid_lob2_seek64($lob, '3000000000', CUBRID_CURSOR_FIRST);
if ($result) {
// Ab dieser Position 1024 Bytes lesen
$data = cubrid_lob2_read($lob, 1024);
echo "Gelesene Bytes: " . strlen($data) . PHP_EOL;
} else {
echo "Cursor konnte nicht positioniert werden." . PHP_EOL;
}
cubrid_lob2_close($lob);
cubrid_close($conn);
?>
Cursor relativ zur aktuellen Position verschieben
<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
$req = cubrid_execute($conn, "SELECT blobcol FROM bigtable WHERE id = 2");
$row = cubrid_fetch($req, CUBRID_NUM);
$lob = $row[0];
// Zunächst zum Anfang springen
cubrid_lob2_seek64($lob, '0', CUBRID_CURSOR_FIRST);
// Dann 5.000.000.000 Bytes vorwärts vom aktuellen Cursor
$moved = cubrid_lob2_seek64($lob, '5000000000', CUBRID_CURSOR_CURRENT);
if ($moved) {
echo "Cursor erfolgreich verschoben." . PHP_EOL;
$chunk = cubrid_lob2_read($lob, 512);
echo "Chunk-Länge: " . strlen($chunk) . PHP_EOL;
} else {
echo "Fehler beim Verschieben des Cursors." . PHP_EOL;
}
cubrid_lob2_close($lob);
cubrid_close($conn);
?>
// Wichtig · Fallstricke
Hinweis zu 32-Bit-Systemen: Der Offset wird bewusst als string statt als int übergeben, da PHP auf 32-Bit-Plattformen keine Integer größer als ca. 2,1 Milliarden darstellen kann. Als String können beliebig große Zahlen übergeben werden, die intern als 64-Bit-Wert verarbeitet werden.
Auf 64-Bit-Systemen kann alternativ cubrid_lob2_seek() mit einem nativen PHP-Integer verwendet werden, sofern der Offset im darstellbaren Bereich liegt.
Stellen Sie sicher, dass das LOB-Objekt geöffnet und gültig ist, bevor Sie diese Funktion aufrufen. Ein ungültiger Ressource-Handle führt zu einem Fehler.