aboutsummaryrefslogtreecommitdiff
path: root/cd.c
diff options
context:
space:
mode:
Diffstat (limited to 'cd.c')
-rw-r--r--cd.c98
1 files changed, 93 insertions, 5 deletions
diff --git a/cd.c b/cd.c
index 14a9105..7d0cb0b 100644
--- a/cd.c
+++ b/cd.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
+#include <time.h>
#include <unistd.h>
#include <getopt.h>
#include <sqlite3.h>
@@ -11,9 +12,10 @@ int main(int argc, char* argv[]) {
char *file = "cards";
bool verbose = false;
+ /* Proccess args */
static struct option long_options[] = {
- {"file", required_argument, 0, 'f'},
- {"verbose", no_argument, 0, 'v'}
+ {"file", required_argument, NULL, 'f'},
+ {"verbose", no_argument, NULL, 'v'}
};
while (1) {
int option_index = 0;
@@ -26,17 +28,103 @@ int main(int argc, char* argv[]) {
}
}
- printf("%s", file);
+ /* Seed the RNG */
+ srand(time(0));
+ /* Connect to db */
sqlite3 *db;
int rc = sqlite3_open(file, &db);
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
abort();
}
- fprintf(stderr, "Opened database successfully\n");
- //int N = sqlite3_exec(db, "SELECT COUNT(*) FROM cards", callback)
+ /* Get number of cards */
+ sqlite3_stmt *stmt;
+ rc = sqlite3_prepare_v3(db, "SELECT COUNT(*) FROM cards", -1, 0, &stmt, NULL);
+ if (rc != SQLITE_OK) {
+ fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+ sqlite3_step(stmt);
+ int N = sqlite3_column_int(stmt, 0);
+ sqlite3_finalize(stmt);
+
+ /* Get card weights */
+ rc = sqlite3_prepare_v3(db, "SELECT weight FROM cards", -1, 0, &stmt, NULL);
+ if (rc != SQLITE_OK) {
+ fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+ seg = malloc(4 * N * sizeof(int));
+ build(stmt, 0, N - 1, 1);
+ sqlite3_finalize(stmt);
+
+ if (verbose) {
+ for (int i = 0; i < N; i++) {
+ printf("%d ", seg[i]);
+ }
+ printf("\n");
+ }
+
+ /* Disable input buffering */
+ system("stty -F /dev/tty cbreak min 1");
+ system("stty -F /dev/tty -echo");
+
+ while (true) {
+ int x = (long long)rand() * rand() % seg[1];
+ int res[2];
+ query(res, x, 0, N-1, 1);
+ int w = res[0], i = res[1];
+
+ if (verbose) {
+ printf("%d %d %d %d\n", seg[1], x, w, i);
+ }
+
+ /* Get card contents from database */
+ rc = sqlite3_prepare_v3(db, "SELECT key, val FROM cards WHERE idx=?", -1, 0, &stmt, NULL);
+ if (rc != SQLITE_OK) {
+ fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+ sqlite3_bind_int(stmt, 1, i);
+ sqlite3_step(stmt);
+ char *key, *val;
+ key = strdup(sqlite3_column_text(stmt, 0));
+ val = strdup(sqlite3_column_text(stmt, 1));
+ sqlite3_finalize(stmt);
+
+ printf("> %s\n", key);
+
+ /* Wait for confirmation */
+ char b = getchar();
+ printf("%s\n", val);
+
+ /* Read user input */
+ b = getchar();
+ if (b == 'y') {
+ w >>= 1;
+ }
+ else if (b == 'n') {
+ w <<= 3;
+ }
+ else {
+ break;
+ }
+
+ /* Update segment tree and database */
+ update(i, w, 0, N - 1, 1);
+ rc = sqlite3_prepare_v3(db, "UPDATE cards SET weight=? WHERE idx=?", -1, 0, &stmt, NULL);
+ if (rc != SQLITE_OK) {
+ fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+ sqlite3_bind_int(stmt, 1, w);
+ sqlite3_bind_int(stmt, 2, i);
+ sqlite3_finalize(stmt);
+ }
+ /* Cleanup */
+ system("stty -F /dev/tty echo");
sqlite3_close(db);
}