sqlitei-tests.pwn 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <a_samp>
  2. #define DB_DEBUG false
  3. #include "sqlitei"
  4. stock const
  5. gc_DbFile[] = "sqlitei-tests.db"
  6. ;
  7. main() {
  8. new DB:db, buf[512], value, Float:float_value, DBResult:result;
  9. fremove(gc_DbFile);
  10. if ((db = db_open(gc_DbFile))) {
  11. if (!db_exec(db, !"CREATE TABLE `test` (a, b, c, d, e)"))
  12. print(!"Failed to run query: \"CREATE TABLE `test` (a, b, c, d, e)\".");
  13. if ((value = db_query_int(db, !"SELECT 0")) != 0) printf("db_query_int: %d != %d", value, 0);
  14. if ((value = db_query_int(db, !"SELECT 1")) != 1) printf("db_query_int: %d != %d", value, 1);
  15. if ((value = db_query_int(db, !"SELECT 2147483647")) != 2147483647) printf("db_query_int: %d != %d", value, 2147483647);
  16. if ((value = db_query_int(db, !"SELECT 2147483648")) != 2147483648) printf("db_query_int: %d != 2147483648", value);
  17. if ((float_value = db_query_float(db, !"SELECT 5231.572331")) != 5231.572331) printf("db_query_float: %f != %f", float_value, 5231.572331);
  18. if ((float_value = db_query_float(db, !"SELECT -5231.572331")) != -5231.572331) printf("db_query_float: %f != %f", float_value, -5231.572331);
  19. result = db_query(db, !"SELECT 10");
  20. if (db_is_result_freed(result)) print(!"db_is_result_freed should be false");
  21. db_free_result(result);
  22. if (!db_is_result_freed(result)) print(!"db_is_result_freed should be true");
  23. result = db_query(db, !"SELECT NULL, 0, NULL, 1, NULL, 2, NULL");
  24. if (!db_field_is_null(result, 0)) print(!"db_field_is_null(x, 0): should be true");
  25. if ( db_field_is_null(result, 1)) print(!"db_field_is_null(x, 1): should be false");
  26. if (!db_field_is_null(result, 2)) print(!"db_field_is_null(x, 2): should be true");
  27. if ( db_field_is_null(result, 3)) print(!"db_field_is_null(x, 3): should be false");
  28. if (!db_field_is_null(result, 4)) print(!"db_field_is_null(x, 4): should be true");
  29. if ( db_field_is_null(result, 5)) print(!"db_field_is_null(x, 5): should be false");
  30. if (!db_field_is_null(result, 6)) print(!"db_field_is_null(x, 6): should be true");
  31. db_free_result(result);
  32. {
  33. new str[] = "ö\'döå2ål0FKNVALIHƒßå˚∫œ∆†¥∫©¡";
  34. for (new i = 0; i < 2; i++) {
  35. if (i == 1)
  36. strpack(str, str);
  37. result = db_query(db, !"SELECT ?", STRING:str);
  38. db_get_field(result, 0, buf, sizeof(buf));
  39. if (strlen(buf) != strlen(str) || strcmp(buf, str))
  40. print(!"buf != str");
  41. for (new j = 0; str{j}; j++) {
  42. if (buf[j] != str{j})
  43. printf("buf[%d]:%04x%04x != str{%d}:%04x%04x", j, buf[j] >>> 16, buf[j] & 0xFFFF, j, str{j} >>> 16, str{j} & 0xFFFF);
  44. }
  45. db_free_result(result);
  46. result = db_query(db, !"SELECT ? as `test`", STRING:str);
  47. db_get_field_assoc(result, !"test", buf, sizeof(buf));
  48. if (strlen(buf) != strlen(str) || strcmp(buf, str))
  49. print(!"buf != str");
  50. for (new j = 0; str{j}; j++) {
  51. if (buf[j] != str{j})
  52. printf("buf[%d]:%04x%04x != str{%d}:%04x%04x", j, buf[j] >>> 16, buf[j] & 0xFFFF, j, str{j} >>> 16, str{j} & 0xFFFF);
  53. }
  54. }
  55. }
  56. {
  57. new
  58. DBStatement:stmt = db_prepare(db, !"SELECT ?, ?, ?, ?"),
  59. array[128]
  60. ;
  61. for (new j = 0; j < sizeof(array); j++)
  62. array[j] = random(256) << 24 | random(256) << 16 | random(256) << 8 | random(256);
  63. value = cellmin;
  64. float_value = 19634.56729164;
  65. for (new i = 0; i < sizeof(buf) - 1; i++)
  66. buf[i] = 1 + (i % 255);
  67. stmt_bind_value(stmt, 0, DB::TYPE_INT, value);
  68. stmt_bind_value(stmt, 1, DB::TYPE_FLOAT, float_value);
  69. stmt_bind_value(stmt, 2, DB::TYPE_ARRAY, array, sizeof(array));
  70. stmt_bind_value(stmt, 3, DB::TYPE_STRING, buf);
  71. new
  72. r_value,
  73. Float:r_float_value,
  74. r_array[sizeof(array)],
  75. r_buf[sizeof(buf)]
  76. ;
  77. stmt_bind_result_field(stmt, 0, DB::TYPE_INT , r_value);
  78. stmt_bind_result_field(stmt, 1, DB::TYPE_FLOAT , r_float_value);
  79. stmt_bind_result_field(stmt, 2, DB::TYPE_ARRAY , r_array, sizeof(r_array));
  80. stmt_bind_result_field(stmt, 3, DB::TYPE_STRING, r_buf, sizeof(r_buf));
  81. if (stmt_execute(stmt)) {
  82. if (stmt_fetch_row(stmt)) {
  83. if (value != r_value)
  84. printf("value:%d != r_value:%d", value, r_value);
  85. if (float_value != r_float_value)
  86. printf("float_value:%04x%04x != r_float_value:%04x%04x", _:float_value >>> 16, _:float_value & 0xFFFF, _:r_float_value >>> 16, _:r_float_value & 0xFFFF);
  87. for (new j = 0; j < sizeof(array); j++) {
  88. if (array[j] != r_array[j])
  89. printf("array[%d]:%04x%04x != r_array[%d]:%04x%04x", j, array[j] >>> 24, array[j] & 0xFFFF, j, r_array[j] >>> 24, r_array[j] & 0xFFFF);
  90. }
  91. if (strlen(buf) != strlen(r_buf) || strcmp(buf, r_buf))
  92. print(!"buf != r_buf");
  93. for (new j = 0; j < sizeof(buf); j++) {
  94. if (buf[j] != r_buf[j])
  95. printf("buf[%d]:%04x%04x != r_buf[%d]:%04x%04x", j, buf[j] >>> 16, buf[j] & 0xFFFF, j, r_buf[j] >>> 16, r_buf[j] & 0xFFFF);
  96. }
  97. } else {
  98. print("stmt has no rows.");
  99. }
  100. } else {
  101. print(!"Failed to execute stmt.");
  102. }
  103. }
  104. for (new i = 1; i <= 10; i++) {
  105. new rowid;
  106. if (!(rowid = db_insert(db, !"INSERT INTO `test` VALUES (1, 'two', 3.4, 'five', 6.7)"))) {
  107. print(!"Failed to run query: \"INSERT INTO `test` VALUES (1, 'two', 3.4, 'five', 6.7)\".");
  108. } else {
  109. if (rowid != i)
  110. printf("rowid: %d != %d", rowid, i);
  111. else if ((rowid = db_query_int(db, !"SELECT last_insert_rowid()"))) {
  112. if (rowid != i)
  113. printf("last_insert_rowid(): %d != %d", rowid, i);
  114. } else {
  115. print(!"Failed to run query: \"SELECT last_insert_rowid()\".");
  116. }
  117. }
  118. }
  119. db_close(db);
  120. } else {
  121. printf("Failed to open database (\"%s\").", gc_DbFile);
  122. }
  123. print(!"Done.");
  124. }