#include #include #include #include #include #include "db.h" static char * textdup(const unsigned char *); sqlite3_stmt * byid(char *table, int id) { char sql[100]; sqlite3_stmt *stmt; snprintf(sql, 100, "SELECT oid, * FROM %s WHERE oid = ?", table); if(sqlite3_prepare(db, sql, -1, &stmt, 0) != SQLITE_OK) return NULL; if(sqlite3_bind_int(stmt, 1, id) != SQLITE_OK) return NULL; return stmt; } struct attachment * getattachment(sqlite3_stmt *stmt, int final) { struct attachment *attachment; if(!stmt) goto err; if(sqlite3_step(stmt) != SQLITE_ROW) goto err; if(!(attachment = malloc(sizeof(struct attachment)))) err(1, "malloc"); attachment->id = sqlite3_column_int(stmt, 0); attachment->post = sqlite3_column_int(stmt, 1); attachment->name = textdup(sqlite3_column_text(stmt, 2)); attachment->description = textdup(sqlite3_column_text(stmt, 3)); attachment->mime = textdup(sqlite3_column_text(stmt, 4)); attachment->bytes = sqlite3_column_bytes(stmt, 5); if(!(attachment->data = malloc(attachment->bytes))) err(1, "malloc"); memcpy(attachment->data, sqlite3_column_blob(stmt, 5), attachment->bytes); if(final) sqlite3_finalize(stmt); return attachment; err: if(final) sqlite3_finalize(stmt); return NULL; } struct post * getpost(sqlite3_stmt *stmt, int final) { struct post *post; if(!stmt) goto err; if(sqlite3_step(stmt) != SQLITE_ROW) goto err; if(!(post = malloc(sizeof(struct post)))) err(1, "malloc"); post->id = sqlite3_column_int(stmt, 0); post->parent = sqlite3_column_int(stmt, 1); post->user = sqlite3_column_int(stmt, 2); post->created = sqlite3_column_int(stmt, 3); post->edited = sqlite3_column_int(stmt, 4); post->subject = textdup(sqlite3_column_text(stmt, 5)); post->text = textdup(sqlite3_column_text(stmt, 6)); if(final) sqlite3_finalize(stmt); return post; err: if(final) sqlite3_finalize(stmt); return NULL; } struct user * getuser(sqlite3_stmt *stmt, int final) { struct user *user; if(!stmt) goto err; if(sqlite3_step(stmt) != SQLITE_ROW) goto err; if(!(user = malloc(sizeof(struct user)))) err(1, "malloc"); user->id = sqlite3_column_int(stmt, 0); user->name = textdup(sqlite3_column_text(stmt, 1)); user->full = textdup(sqlite3_column_text(stmt, 2)); user->hash = textdup(sqlite3_column_text(stmt, 3)); if(final) sqlite3_finalize(stmt); return user; err: if(final) sqlite3_finalize(stmt); return NULL; } char * textdup(const unsigned char *s) { return s? strdup((char *)s): NULL; }