aboutsummaryrefslogtreecommitdiff
path: root/db.c
blob: 3b7a61b833ac3f5b5e6965fc335c31490942a8f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <string.h>
#include <sqlite3.h>
#include "db.h"
#include "schema.sql.h"


#define SQLITE(func,...) do{if(sqlite3_##func(__VA_ARGS__)!=SQLITE_OK){die_sqlite("sqlite3_" #func);}}while(0)


sqlite3 *database;

__attribute__((noreturn))
static void die_sqlite(const char *func){
	die("%s: %s",func,sqlite3_errmsg(database));
}


void db_init(void){
	SQLITE(open_v2,"db.db",&database,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,NULL);
	char *str=malloc(schema_sql_len+1,char);
	memcpy(str,schema_sql,schema_sql_len);
	str[schema_sql_len]='\0';
	sqlite3_exec(database,str,NULL,NULL,NULL);
	free(str);
}

void db_close(void){
	sqlite3_close(database);
}


i64 db_create_user(const char *name,const char *pass){
	sqlite3_stmt *stmt;
	SQLITE(prepare_v2,database,"insert into Users (username, pass) values (?, ?)",-1,&stmt,NULL);
	SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC);
	SQLITE(bind_text,stmt,2,pass,-1,SQLITE_STATIC);
	if(sqlite3_step(stmt)!=SQLITE_DONE)die_sqlite("sqlite3_step");
	SQLITE(finalize,stmt);

	i64 userid=sqlite3_last_insert_rowid(database);

	SQLITE(prepare_v2,database,"insert into UserNames (name, user) values (?, ?)",-1,&stmt,NULL);
	SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC);
	SQLITE(bind_int64,stmt,2,userid);
	if(sqlite3_step(stmt)!=SQLITE_DONE)die_sqlite("sqlite3_step");
	SQLITE(finalize,stmt);

	return userid;
}

i64 db_find_user(const char *name){
	sqlite3_stmt *stmt;
	SQLITE(prepare_v2,database,"select user from UserNames where name = ?",-1,&stmt,NULL);
	SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC);
	i64 userid=-1;
	if(sqlite3_step(stmt)==SQLITE_ROW){
		userid=sqlite3_column_int64(stmt,1);
	}
	SQLITE(finalize,stmt);
	return userid;
}