SQLiteErrors.mod 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. MODULE SQLiteErrors;
  2. (* Error codes, errmsg/errstr, extended codes and sqlite3_free. *)
  3. FROM SYSTEM IMPORT ADDRESS;
  4. FROM CStr IMPORT CString, Copy;
  5. FROM SQLite IMPORT
  6. SQLiteOk, SQLiteConstraint, SQLiteConstraintPrimaryKey,
  7. sqlite3_open, sqlite3_exec, sqlite3_close,
  8. sqlite3_errcode, sqlite3_extended_errcode,
  9. sqlite3_extended_result_codes, sqlite3_errmsg, sqlite3_errstr,
  10. sqlite3_free;
  11. VAR
  12. ExitCode : INTEGER;
  13. db : ADDRESS;
  14. errmsg : ADDRESS;
  15. svalue : CString;
  16. buf : ARRAY [0..127] OF CHAR;
  17. rc : INTEGER;
  18. ok : BOOLEAN;
  19. BEGIN
  20. ExitCode := 1;
  21. db := NIL; errmsg := NIL; ok := FALSE;
  22. IF sqlite3_open(":memory:", db) = SQLiteOk THEN
  23. IF (sqlite3_extended_result_codes(db, 1) = SQLiteOk)
  24. AND (sqlite3_exec(db, "CREATE TABLE u(x INTEGER PRIMARY KEY);",
  25. NIL, NIL, errmsg) = SQLiteOk) THEN
  26. IF sqlite3_exec(db, "INSERT INTO u VALUES (1);",
  27. NIL, NIL, errmsg) = SQLiteOk THEN
  28. errmsg := NIL;
  29. rc := sqlite3_exec(db, "INSERT INTO u VALUES (1);",
  30. NIL, NIL, errmsg);
  31. IF (rc = SQLiteConstraintPrimaryKey)
  32. AND (sqlite3_errcode(db) = SQLiteConstraintPrimaryKey)
  33. AND (sqlite3_extended_errcode(db) = SQLiteConstraintPrimaryKey) THEN
  34. svalue := sqlite3_errmsg(db);
  35. IF (svalue # NIL) AND (Copy(svalue, buf) > 0) AND (buf[0] # CHR(0)) THEN
  36. svalue := sqlite3_errstr(SQLiteConstraint);
  37. IF (svalue # NIL) AND (Copy(svalue, buf) > 0)
  38. AND (buf[0] # CHR(0)) THEN
  39. ok := TRUE
  40. END
  41. END
  42. END;
  43. IF errmsg # NIL THEN
  44. svalue := errmsg;
  45. IF (Copy(svalue, buf) = 0) OR (buf[0] = CHR(0)) THEN
  46. ok := FALSE
  47. END;
  48. sqlite3_free(errmsg);
  49. errmsg := NIL
  50. ELSE
  51. ok := FALSE
  52. END
  53. END
  54. END
  55. END;
  56. IF db # NIL THEN
  57. IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END
  58. END;
  59. IF ok THEN ExitCode := 42 END
  60. END SQLiteErrors.