| /* | |
| * Copyright 2011 The Emscripten Authors. All rights reserved. | |
| * Emscripten is available under two separate licenses, the MIT license and the | |
| * University of Illinois/NCSA Open Source License. Both these licenses can be | |
| * found in the LICENSE file. | |
| */ | |
| #include <time.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <sqlite3.h> | |
| #include <emscripten.h> | |
| int print = 1; | |
| static int callback(void *NotUsed, int argc, char **argv, char **azColName){ | |
| int i; | |
| if (!print) return 0; | |
| for(i=0; i<argc; i++){ | |
| printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); | |
| } | |
| printf("\n"); | |
| return 0; | |
| } | |
| int test(){ | |
| sqlite3 *db; | |
| char *zErrMsg = 0; | |
| int rc; | |
| int i; | |
| const char *commands[] = { | |
| "CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));", | |
| "INSERT INTO t2 VALUES(1,13153,'thirteen thousand one hundred fifty three');", | |
| "INSERT INTO t2 VALUES(1,987,'some other number');", | |
| "SELECT count(*) FROM t2;", | |
| "SELECT datetime('2012-04-16 12:35:57', '+1 days');", | |
| "SELECT a, b, c FROM t2;", | |
| NULL | |
| }; | |
| rc = sqlite3_open(":memory:", &db); | |
| if( rc ){ | |
| fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); | |
| sqlite3_close(db); | |
| exit(1); | |
| } | |
| for (i = 0; commands[i]; i++) { | |
| rc = sqlite3_exec(db, commands[i], callback, 0, &zErrMsg); | |
| if( rc!=SQLITE_OK ){ | |
| fprintf(stderr, "SQL error on %d: %s\n", i, zErrMsg); | |
| sqlite3_free(zErrMsg); | |
| exit(1); | |
| } | |
| } | |
| sqlite3_close(db); | |
| return 0; | |
| } | |
| int main(int argc, char **argv){ | |
| sqlite3 *db; | |
| char *zErrMsg = 0; | |
| int rc, i; | |
| double t; | |
| int n, m; | |
| n = argc > 1 ? atoi(argv[1]) : 5000; | |
| m = argc > 2 ? atoi(argv[2]) : 1; | |
| rc = sqlite3_open(":memory:", &db); | |
| if( rc ){ | |
| fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); | |
| sqlite3_close(db); | |
| exit(1); | |
| } | |
| #define RUN(cmd) \ | |
| { \ | |
| rc = sqlite3_exec(db, cmd, callback, 0, &zErrMsg); \ | |
| if( rc!=SQLITE_OK ){ \ | |
| fprintf(stderr, "SQL error on %d: %s\n", i, zErrMsg); \ | |
| sqlite3_free(zErrMsg); \ | |
| exit(1); \ | |
| } \ | |
| } | |
| #define TIME(msg) \ | |
| { \ | |
| double now = emscripten_get_now(); \ | |
| printf(msg " : took %f ms\n", now - t); \ | |
| t = now; \ | |
| } | |
| t = emscripten_get_now(); | |
| TIME("'startup' - IGNORE THIS VALUE, it is an artifact"); | |
| RUN("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));"); | |
| TIME("create table"); | |
| RUN("BEGIN;"); | |
| // n*5 INSERTs in a transaction | |
| for (i = 0; i < n; i++) { | |
| RUN("INSERT INTO t1 VALUES(1,12345,'one 1 one 1 one 1');"); | |
| RUN("INSERT INTO t1 VALUES(2,23422,'two two two two');"); | |
| RUN("INSERT INTO t1 VALUES(3,31233,'three three 33333333333 three');"); | |
| RUN("INSERT INTO t1 VALUES(4,41414,'FOUR four 4 phor FOUR 44444');"); | |
| RUN("INSERT INTO t1 VALUES(5,52555,'five 5 FIVE Five phayve 55 5 5 5 5 55 5');"); | |
| } | |
| TIME("25,000 inserts"); | |
| RUN("COMMIT;"); | |
| TIME("commit"); | |
| // Counts | |
| for (i = 0; i < m; i++) { | |
| print = i == 0; | |
| RUN("SELECT count(*) FROM t1;"); | |
| RUN("SELECT count(*) FROM t1 WHERE a == 4"); | |
| RUN("SELECT count(*) FROM t1 WHERE b > 20000 AND b < 50000;"); | |
| RUN("SELECT count(*) FROM t1 WHERE c like '%three%';"); | |
| } | |
| TIME("selects"); | |
| // Index | |
| RUN("CREATE INDEX iiaa ON t1(a);"); | |
| RUN("CREATE INDEX iibb ON t1(b);"); | |
| TIME("create indexes"); | |
| for (i = 0; i < m; i++) { | |
| print = i == 0; | |
| RUN("SELECT count(*) FROM t1 WHERE a == 4"); | |
| RUN("SELECT count(*) FROM t1 WHERE b > 20000 AND b < 50000;"); | |
| } | |
| TIME("selects with indexes"); | |
| sqlite3_close(db); | |
| return test(); | |
| } | |