MODULE SQLitePrepareTail; (* sqlite3_prepare_v3: prepare one statement and reuse its tail. *) FROM SYSTEM IMPORT ADDRESS; FROM CStr IMPORT Copy; FROM SQLite IMPORT DbHandle, StmtHandle, SQLiteOk, SQLiteRow, SQLiteDone, SQLiteOpenReadWrite, SQLiteOpenCreate, SQLiteOpenMemory, SQLitePreparePersistent, sqlite3_open_v2, sqlite3_close, sqlite3_prepare_v3, sqlite3_step, sqlite3_column_int, sqlite3_finalize; VAR ExitCode : INTEGER; db : DbHandle; stmt : StmtHandle; tail, tail2 : ADDRESS; rc : INTEGER; ok : BOOLEAN; buf : ARRAY [0..127] OF CHAR; PROCEDURE SameText (a, b : ARRAY OF CHAR) : BOOLEAN; VAR i : INTEGER; BEGIN i := 0; WHILE (a[i] # CHR(0)) AND (a[i] = b[i]) DO i := i + 1 END; RETURN (a[i] = CHR(0)) AND (b[i] = CHR(0)) END SameText; BEGIN ExitCode := 1; db := NIL; stmt := NIL; tail := NIL; tail2 := NIL; ok := FALSE; IF (sqlite3_open_v2(":memory:", db, SQLiteOpenReadWrite + SQLiteOpenCreate + SQLiteOpenMemory, NIL) = SQLiteOk) AND (db # NIL) THEN rc := sqlite3_prepare_v3(db, "SELECT 1; SELECT 2;", -1, SQLitePreparePersistent, stmt, tail); ok := (rc = SQLiteOk) AND (stmt # NIL) AND (tail # NIL); IF ok THEN IF Copy(tail, buf) = 0 THEN ok := FALSE ELSIF NOT SameText(buf, " SELECT 2;") THEN ok := FALSE END END; IF ok THEN ok := sqlite3_step(stmt) = SQLiteRow END; IF ok THEN ok := sqlite3_column_int(stmt, 0) = 1 END; IF ok THEN ok := sqlite3_step(stmt) = SQLiteDone END; IF stmt # NIL THEN IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END; stmt := NIL END; IF ok THEN rc := sqlite3_prepare_v3(db, buf, -1, 0, stmt, tail2); ok := (rc = SQLiteOk) AND (stmt # NIL); IF ok THEN ok := sqlite3_step(stmt) = SQLiteRow END; IF ok THEN ok := sqlite3_column_int(stmt, 0) = 2 END; IF ok THEN ok := sqlite3_step(stmt) = SQLiteDone END; IF stmt # NIL THEN IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END; stmt := NIL END END END; IF stmt # NIL THEN IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END END; IF db # NIL THEN IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END END; IF ok THEN ExitCode := 42 END END SQLitePrepareTail.