From 65e6e5bf86b8474d7178beb870901e2a8e9e0d17 Mon Sep 17 00:00:00 2001 From: Chip Black Date: Thu, 30 Dec 2010 02:23:41 -0600 Subject: [PATCH] Actually implement /tag in cgi_blerg. Also /create --- cgi/cgi_blerg.c | 64 +++++++++++++++++++++++++++++++++++++++++++---- database/tags.c | 2 +- database/tags.h | 2 +- http/http_blerg.c | 13 ++++------ 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/cgi/cgi_blerg.c b/cgi/cgi_blerg.c index 7eb875e..5319442 100644 --- a/cgi/cgi_blerg.c +++ b/cgi/cgi_blerg.c @@ -42,7 +42,6 @@ void respond_JSON_Success() { void respond_for_range(struct blerg *b, uint64_t from, uint64_t to) { const unsigned char *ybuf; - char number[21]; unsigned int len; uint64_t i; yajl_gen g; @@ -71,6 +70,38 @@ void respond_for_range(struct blerg *b, uint64_t from, uint64_t to) { yajl_gen_free(g); } +void respond_taglist(struct tag *results, int i) { + const unsigned char *ybuf; + unsigned int len; + struct blerg *b; + yajl_gen g; + + i--; + + printf("Content-type: application/json\r\n\r\n"); + g = yajl_gen_alloc(&yajl_c, NULL); + + yajl_gen_array_open(g); + + while (i >= 0) { + b = blerg_open(results[i].author); + if (b != NULL) { + json_generate_one_record(g, results[i].author, b, results[i].record); + blerg_close(b); + } + yajl_gen_get_buf(g, &ybuf, &len); + write(0, ybuf, len); + yajl_gen_clear(g); + + i--; + } + + yajl_gen_array_close(g); + yajl_gen_get_buf(g, &ybuf, &len); + write(0, ybuf, len); + yajl_gen_free(g); +} + int main(int argc, char *argv[]) { char *path; char *request_method; @@ -135,7 +166,7 @@ int main(int argc, char *argv[]) { } blerg_close(b); - } else if (strncmp(path, "/tag", 4) == 0 && strlen(url) > 4) { + } else if (strncmp(path, "/tag", 4) == 0 && strlen(path) > 4) { if (strcmp(request_method, "GET") != 0) { respond_405(); exit(0); @@ -157,7 +188,7 @@ int main(int argc, char *argv[]) { exit(0); } - uint64_t recs = 50; + int recs = 50; struct tag *taglist = tag_list(info.author, 0, &recs, -1); if (recs == 0) { @@ -165,7 +196,7 @@ int main(int argc, char *argv[]) { } else { respond_taglist(taglist, recs); } - } else if (strncmp(url, "/put", 4) == 0) { + } else if (strncmp(path, "/put", 4) == 0) { } else if (strncmp(path, "/info", 5) == 0) { if (strcmp(request_method, "GET") != 0) { respond_405(); @@ -208,7 +239,30 @@ int main(int argc, char *argv[]) { write(0, ybuf, len); yajl_gen_free(g); - } else if (strncmp(url, "/create", 8) == 0) { + } else if (strncmp(path, "/create", 8) == 0) { + if (strcmp(request_method, "POST") != 0) { + respond_405(); + exit(0); + } + + const char *username = cgi_getentrystr("username"); + const char *password = cgi_getentrystr("password"); + if (username == NULL || username[0] == 0 || + password == NULL || password[0] == 0) { + respond_JSON_Failure(); + exit(0); + } + + if (blerg_exists(username)) { + respond_JSON_Failure(); + exit(0); + } + + struct blerg *b = blerg_open(username); + blerg_close(b); + auth_set_password(username, password); + + respond_JSON_Success(); } else { respond_404(); exit(0); diff --git a/database/tags.c b/database/tags.c index 1911ac8..dc51c4f 100644 --- a/database/tags.c +++ b/database/tags.c @@ -92,7 +92,7 @@ int tag_add(const char *author, const char *tag, uint64_t record) { return 1; } -struct tag * tag_list(const char *tag, uint64_t offset, uint64_t *count, int direction) { +struct tag * tag_list(const char *tag, uint64_t offset, int *count, int direction) { char filename[512]; struct stat st; struct tag *taglist; diff --git a/database/tags.h b/database/tags.h index 18e7587..05b6a89 100644 --- a/database/tags.h +++ b/database/tags.h @@ -10,7 +10,7 @@ struct tag { int tag_scan(const char *, const char *, int, uint64_t); int tag_add(const char *, const char *, uint64_t); -struct tag * tag_list(const char *, uint64_t, uint64_t *, int); +struct tag * tag_list(const char *, uint64_t, int *count, int direction); int tag_exists(const char *tag); #endif //_TAGS_H diff --git a/http/http_blerg.c b/http/http_blerg.c index b790183..1d272eb 100644 --- a/http/http_blerg.c +++ b/http/http_blerg.c @@ -131,14 +131,11 @@ ssize_t GET_generate_taglist(void *cls, uint64_t pos, char *buf, size_t max) { /* Snarf one record */ b = blerg_open(ts->results[ts->i].author); - if (b == NULL) - goto skip_bad_blerg; - - json_generate_one_record(ts->g, ts->results[ts->i].author, b, ts->results[ts->i].record); - - blerg_close(b); + if (b != NULL) { + json_generate_one_record(ts->g, ts->results[ts->i].author, b, ts->results[ts->i].record); + blerg_close(b); + } -skip_bad_blerg: if (ts->i == 0) { yajl_gen_array_close(ts->g); ts->done = 1; @@ -318,7 +315,7 @@ ahc_derp (void *cls, struct MHD_Connection *connection, const char *url, const c if (!tag_exists(info.author)) return respond_404(connection); - uint64_t recs = 50; + int recs = 50; struct tag *taglist = tag_list(info.author, 0, &recs, -1); if (recs == 0) { -- 2.25.1