#include #include #include #include "assets.h" #include "../lib/md4c/src/entity.h" #include "../lib/md4c/src/entity.c" #include "../lib/md4c/src/md4c.h" #include "../lib/md4c/src/md4c.c" #include "../lib/md4c/src/md4c-html.h" #include "../lib/md4c/src/md4c-html.c" int init(int); int page(struct http_request *); /* Called when our module is loaded (see config) */ int init(int state) { /* Register our database. */ int err = kore_pgsql_register( "db", "host=127.0.0.1 port=5432 user=postgres password=p0stgres dbname=clog sslmode=disable" ); return (err); } static void process_md_output(const MD_CHAR* html, MD_SIZE size, void *buf) { kore_buf_append((struct kore_buf *) buf, (const void *) html, (size_t) size); } static int render_md(char *in, struct kore_buf *out) { static unsigned parser_flags = 0; static unsigned renderer_flags = MD_HTML_FLAG_DEBUG; int ret = md_html(in, (MD_SIZE) strlen(in), process_md_output, (void*) out, parser_flags, renderer_flags); if(ret != 0) { fprintf(stderr, "Parsing failed.\n"); return -1; } return 1; } int page(struct http_request *req) { struct kore_buf *buf; buf = kore_buf_alloc(4096); kore_buf_append(buf, asset_index_begin_html, asset_len_index_begin_html); // SQL vars struct kore_pgsql sql; int row, rows; // Results char *id; char *title, *body; /* req->status = HTTP_STATUS_INTERNAL_ERROR; */ kore_pgsql_init(&sql); /* * Initialise our kore_pgsql data structure with the database name * we want to connect to (note that we registered this earlier with * kore_pgsql_register()). We also say we will perform a synchronous * query (KORE_PGSQL_SYNC). */ int err = kore_pgsql_setup(&sql, "db", KORE_PGSQL_SYNC); kore_log(LOG_ERR, "kore_pgsql_setup: %d", err); if (!err) { kore_pgsql_logerror(&sql); goto out; } /* * Now we can fire off the query, once it returns we either have * a result on which we can operate or an error occurred. */ if (!kore_pgsql_query(&sql, "SELECT id, title, body FROM entries")) { kore_pgsql_logerror(&sql); goto out; } // Iterate over the result and dump it to somewhere. rows = kore_pgsql_ntuples(&sql); for (row = 0; row < rows; row++) { id = kore_pgsql_getvalue(&sql, row, 0); title = kore_pgsql_getvalue(&sql, row, 1); body = kore_pgsql_getvalue(&sql, row, 2); kore_log(LOG_NOTICE, "id: '%s'", id); kore_log(LOG_NOTICE, "title: '%s'", title); kore_log(LOG_NOTICE, "body: '%s'", body); struct kore_buf *html = kore_buf_alloc(4096); if (!render_md(body, html)) { kore_log(LOG_NOTICE, "Error rendering markdown."); kore_buf_free(html); continue; } kore_log(LOG_NOTICE, "html: '%s'", kore_buf_stringify(html, NULL)); kore_buf_appendf(buf, "\t%s%s%s\n", id, title, kore_buf_stringify(html, NULL)); kore_buf_free(html); } out: ; kore_buf_append(buf, asset_index_end_html, asset_len_index_end_html); http_response_header(req, "content-type", "text/html; charset=utf-8"); http_response(req, HTTP_STATUS_OK, buf->data, buf->offset); // http_response_stream ??? kore_buf_free(buf); // Cleanup the kore_pgsql data structure. kore_pgsql_cleanup(&sql); return (KORE_RESULT_OK); }