|
@@ -12,11 +12,13 @@ MODULE showcase_all ;
|
|
|
6. all column kinds, metadata, busy/reset/rebind, transactions
|
|
6. all column kinds, metadata, busy/reset/rebind, transactions
|
|
|
7. expanded sql, zeroblob, static destructor, close_v2
|
|
7. expanded sql, zeroblob, static destructor, close_v2
|
|
|
8. custom functions: scalar tax plus aggregate total
|
|
8. custom functions: scalar tax plus aggregate total
|
|
|
- 9. close
|
|
|
|
|
|
|
+ 9. blob read/write plus file backup
|
|
|
|
|
+ 10. close
|
|
|
*)
|
|
*)
|
|
|
|
|
|
|
|
FROM SYSTEM IMPORT ADDRESS, ADR;
|
|
FROM SYSTEM IMPORT ADDRESS, ADR;
|
|
|
FROM SQLite IMPORT DbHandle, StmtHandle, ContextHandle, ValueHandle,
|
|
FROM SQLite IMPORT DbHandle, StmtHandle, ContextHandle, ValueHandle,
|
|
|
|
|
+ BlobHandle,
|
|
|
SQLiteOk, SQLiteRow, SQLiteDone,
|
|
SQLiteOk, SQLiteRow, SQLiteDone,
|
|
|
SQLiteInteger, SQLiteFloat, SQLiteText, SQLiteBlob, SQLiteNull,
|
|
SQLiteInteger, SQLiteFloat, SQLiteText, SQLiteBlob, SQLiteNull,
|
|
|
SQLiteOpenReadWrite, SQLiteOpenCreate,
|
|
SQLiteOpenReadWrite, SQLiteOpenCreate,
|
|
@@ -47,19 +49,22 @@ FROM SQLite IMPORT DbHandle, StmtHandle, ContextHandle, ValueHandle,
|
|
|
sqlite3_create_function,
|
|
sqlite3_create_function,
|
|
|
sqlite3_value_int64, sqlite3_value_double,
|
|
sqlite3_value_int64, sqlite3_value_double,
|
|
|
sqlite3_result_double, sqlite3_result_int64,
|
|
sqlite3_result_double, sqlite3_result_int64,
|
|
|
- sqlite3_aggregate_context;
|
|
|
|
|
|
|
+ sqlite3_aggregate_context,
|
|
|
|
|
+ sqlite3_blob_open, sqlite3_blob_close,
|
|
|
|
|
+ sqlite3_blob_bytes, sqlite3_blob_read, sqlite3_blob_write;
|
|
|
FROM SQLiteUtils IMPORT CStrToM2, ErrMsg, ErrStr, LibVersionStr,
|
|
FROM SQLiteUtils IMPORT CStrToM2, ErrMsg, ErrStr, LibVersionStr,
|
|
|
StaticDestr, TransientDestr,
|
|
StaticDestr, TransientDestr,
|
|
|
- BindTextCopy, BindBlobCopy, ExecSimple, ExecWithErr;
|
|
|
|
|
-FROM libc IMPORT printf, strncpy;
|
|
|
|
|
|
|
+ BindTextCopy, BindBlobCopy, ExecSimple, ExecWithErr, BackupToFile;
|
|
|
|
|
+FROM libc IMPORT printf, strncpy, unlink;
|
|
|
|
|
|
|
|
TYPE
|
|
TYPE
|
|
|
ArgVec = POINTER TO ARRAY [0..255] OF ADDRESS;
|
|
ArgVec = POINTER TO ARRAY [0..255] OF ADDRESS;
|
|
|
TotalPtr = POINTER TO LONGINT;
|
|
TotalPtr = POINTER TO LONGINT;
|
|
|
|
|
|
|
|
VAR
|
|
VAR
|
|
|
- db, db2: DbHandle;
|
|
|
|
|
|
|
+ db, db2, db3: DbHandle;
|
|
|
stmt: StmtHandle;
|
|
stmt: StmtHandle;
|
|
|
|
|
+ bh: BlobHandle;
|
|
|
rc, i, ncols, ndata, busy, ro: INTEGER;
|
|
rc, i, ncols, ndata, busy, ro: INTEGER;
|
|
|
li: LONGINT;
|
|
li: LONGINT;
|
|
|
d: REAL;
|
|
d: REAL;
|
|
@@ -69,8 +74,24 @@ VAR
|
|
|
blobIn: ARRAY [0..3] OF CHAR;
|
|
blobIn: ARRAY [0..3] OF CHAR;
|
|
|
staticBlob: ARRAY [0..3] OF CHAR;
|
|
staticBlob: ARRAY [0..3] OF CHAR;
|
|
|
out: ARRAY [0..15] OF CHAR;
|
|
out: ARRAY [0..15] OF CHAR;
|
|
|
|
|
+ wpat: ARRAY [0..15] OF CHAR;
|
|
|
|
|
+ rback: ARRAY [0..63] OF CHAR;
|
|
|
showInt, showFloat, showText, showBlob, showNull: INTEGER;
|
|
showInt, showFloat, showText, showBlob, showNull: INTEGER;
|
|
|
|
|
|
|
|
|
|
+PROCEDURE RemoveFile (path: ARRAY OF CHAR);
|
|
|
|
|
+VAR fbuf: ARRAY [0..255] OF CHAR; n: INTEGER; urc: INTEGER;
|
|
|
|
|
+BEGIN
|
|
|
|
|
+ n := 0;
|
|
|
|
|
+ WHILE (VAL(CARDINAL, n) <= HIGH(fbuf))
|
|
|
|
|
+ AND (VAL(CARDINAL, n) <= HIGH(path))
|
|
|
|
|
+ AND (path[n] # 0C) DO
|
|
|
|
|
+ fbuf[n] := path[n];
|
|
|
|
|
+ INC(n)
|
|
|
|
|
+ END;
|
|
|
|
|
+ IF VAL(CARDINAL, n) <= HIGH(fbuf) THEN fbuf[n] := 0C END;
|
|
|
|
|
+ urc := unlink(ADR(fbuf))
|
|
|
|
|
+END RemoveFile;
|
|
|
|
|
+
|
|
|
PROCEDURE fail (what: ARRAY OF CHAR);
|
|
PROCEDURE fail (what: ARRAY OF CHAR);
|
|
|
VAR e: ARRAY [0..255] OF CHAR;
|
|
VAR e: ARRAY [0..255] OF CHAR;
|
|
|
BEGIN
|
|
BEGIN
|
|
@@ -340,8 +361,41 @@ BEGIN
|
|
|
IF li # 60 THEN fail("fx total") END;
|
|
IF li # 60 THEN fail("fx total") END;
|
|
|
check(sqlite3_finalize(stmt), "fin fx");
|
|
check(sqlite3_finalize(stmt), "fin fx");
|
|
|
|
|
|
|
|
- (* 9. close paths *)
|
|
|
|
|
- section(9, "close");
|
|
|
|
|
|
|
+ (* 10. blob I/O and backup *)
|
|
|
|
|
+ section(10, "blob and backup");
|
|
|
|
|
+ check(ExecSimple(db, "CREATE TABLE raw(data BLOB);"), "raw create");
|
|
|
|
|
+ check(ExecSimple(db, "INSERT INTO raw VALUES(zeroblob(64));"),
|
|
|
|
|
+ "raw seed");
|
|
|
|
|
+ check(sqlite3_blob_open(db, "main", "raw", "data",
|
|
|
|
|
+ sqlite3_last_insert_rowid(db), 1, bh),
|
|
|
|
|
+ "raw open");
|
|
|
|
|
+ printf("blob size %d\n", sqlite3_blob_bytes(bh));
|
|
|
|
|
+ IF sqlite3_blob_bytes(bh) # 64 THEN fail("raw size") END;
|
|
|
|
|
+ FOR i := 0 TO 15 DO
|
|
|
|
|
+ wpat[i] := CHR(ORD('0') + VAL(CARDINAL, i MOD 10))
|
|
|
|
|
+ END;
|
|
|
|
|
+ check(sqlite3_blob_write(bh, ADR(wpat), 16, 0), "raw write");
|
|
|
|
|
+ check(sqlite3_blob_read(bh, ADR(rback), 16, 0), "raw read");
|
|
|
|
|
+ FOR i := 0 TO 15 DO
|
|
|
|
|
+ IF rback[i] # wpat[i] THEN fail("raw roundtrip") END
|
|
|
|
|
+ END;
|
|
|
|
|
+ printf("blob ok\n");
|
|
|
|
|
+ check(sqlite3_blob_close(bh), "raw close");
|
|
|
|
|
+ check(BackupToFile(db, "/tmp/m2sqlite_showcase_backup.db"),
|
|
|
|
|
+ "show backup");
|
|
|
|
|
+ check(sqlite3_open("/tmp/m2sqlite_showcase_backup.db", db3),
|
|
|
|
|
+ "open backup");
|
|
|
|
|
+ check(sqlite3_prepare_v2(db3, "SELECT COUNT(*) FROM raw;",
|
|
|
|
|
+ -1, stmt, NIL), "prep backup");
|
|
|
|
|
+ IF sqlite3_step(stmt) # SQLiteRow THEN fail("step backup") END;
|
|
|
|
|
+ printf("backup rows %d\n", sqlite3_column_int(stmt, 0));
|
|
|
|
|
+ IF sqlite3_column_int(stmt, 0) # 1 THEN fail("backup count") END;
|
|
|
|
|
+ check(sqlite3_finalize(stmt), "fin backup");
|
|
|
|
|
+ check(sqlite3_close(db3), "close backup");
|
|
|
|
|
+ RemoveFile("/tmp/m2sqlite_showcase_backup.db");
|
|
|
|
|
+
|
|
|
|
|
+ (* 11. close paths *)
|
|
|
|
|
+ section(11, "close");
|
|
|
check(sqlite3_close_v2(db2), "close_v2");
|
|
check(sqlite3_close_v2(db2), "close_v2");
|
|
|
check(sqlite3_close(db), "close");
|
|
check(sqlite3_close(db), "close");
|
|
|
printf("PASS showcase_all\n")
|
|
printf("PASS showcase_all\n")
|