| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 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.
|