From 9f9d80c5a5359f40d82af1a2a4e3b51443a94494 Mon Sep 17 00:00:00 2001 From: Stefan de Konink Date: Fri, 10 Oct 2008 08:36:00 +0200 Subject: [PATCH] Big update I guess ;) --- Makefile | 16 +- handler_osm.c | 2 +- handler_osm_db.c | 44 ++++ handler_osm_db.h | 1 + handler_osm_get.c | 700 ++++++++++++++++++++++++++++++++++++++++++++++++++---- handler_osm_get.h | 39 ++- 6 files changed, 743 insertions(+), 59 deletions(-) rewrite Makefile (79%) rewrite handler_osm_get.h (63%) diff --git a/Makefile b/Makefile dissimilarity index 79% index 206921b..394b626 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ -all: - gcc -O2 -D_GNU_SOURCE -Wall -o osmparser osmparser.c - gcc -Wall -Dpooling -DHAVE_PWD_H -DHAVE_GRP_H -DTRACE_ENABLED -D_GNU_SOURCE -g -fPIC -shared -I/opt/cherokee/include/MonetDB/mapilib -I/opt/cherokee/include -I/opt/cherokee/include/axl -L/opt/cherokee/lib -lMapi -laxl handler_osm.c handler_osm_db.c handler_osm_get.c handler_osm_put.c handler_osm_delete.c handler_osm_gpx.c handler_osm_user.c -o libplugin_osm.so - -install: - cp *.so /opt/cherokee/lib/cherokee/. - cp Module*.py /opt/cherokee/share/cherokee/admin/. +all: + gcc -O2 -I/opt/cherokee/include/MonetDB/mapilib -L/opt/cherokee/lib -D_GNU_SOURCE -Wall -lMapi -o osmparser osmparser.c +# gcc -O2 -I/opt/cherokee/include/MonetDB/mapilib -L/opt/cherokee/lib -D_GNU_SOURCE -Wall -lMapi -o osmparser2 osmparser2.c + gcc -Wall -Dpooling -DHAVE_STDINT_H -DHAVE_SYS_UIO_H -DHAVE_PWD_H -DHAVE_GRP_H -DTRACE_ENABLED -D_GNU_SOURCE -g -fPIC -shared -I/opt/cherokee/include/MonetDB/mapilib -I/opt/cherokee/include -I/opt/cherokee/include/axl -L/opt/cherokee/lib -lMapi -laxl handler_osm.c handler_osm_db.c handler_osm_get.c handler_osm_put.c handler_osm_delete.c handler_osm_gpx.c handler_osm_user.c -o libplugin_osm.so + +install: + cp osmparser /opt/cherokee/bin/. + cp *.so /opt/cherokee/lib/cherokee/. + cp Module*.py /opt/cherokee/share/cherokee/admin/. diff --git a/handler_osm.c b/handler_osm.c index 8d42678..558ed66 100644 --- a/handler_osm.c +++ b/handler_osm.c @@ -290,6 +290,6 @@ cherokee_handler_osm_add_headers (cherokee_handler_osm_t *hdl, cherokee_buffer_t { cherokee_buffer_add_str (buffer, "Content-Type: text/xml; charset=utf-8"CRLF); // cherokee_buffer_add_str (buffer, "Content-Disposition: attachment; filename=\"map.osm\""CRLF); - cherokee_buffer_add_va (buffer, "Content-Length: %d"CRLF, hdl->buffer.len); +// cherokee_buffer_add_va (buffer, "Content-Length: %d"CRLF, hdl->buffer.len); return ret_ok; } diff --git a/handler_osm_db.c b/handler_osm_db.c index 2110b13..93a6a01 100644 --- a/handler_osm_db.c +++ b/handler_osm_db.c @@ -139,3 +139,47 @@ run_sql4(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t return ret; } +ret_t +run_sql5(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t *sql2, cherokee_buffer_t *sql3, cherokee_buffer_t *sql4, cherokee_buffer_t *sql5, cherokee_buffer_t *buf, ret_t (*callback)()) { + ret_t ret = ret_error; + MapiHdl mapi_hdl1 = NULL; + MapiHdl mapi_hdl2 = NULL; + MapiHdl mapi_hdl3 = NULL; + MapiHdl mapi_hdl4 = NULL; + MapiHdl mapi_hdl5 = NULL; + + TRACE("sql", "%s\n", sql1->buf); + if ((mapi_hdl1 = mapi_query(hdl->dbh, sql1->buf)) != NULL && mapi_error(hdl->dbh) == MOK) { + TRACE("sql", "%s\n", sql2->buf); + if ((mapi_hdl2 = mapi_query(hdl->dbh, sql2->buf)) != NULL && mapi_error(hdl->dbh) == MOK) { + TRACE("sql", "%s\n", sql3->buf); + if ((mapi_hdl3 = mapi_query(hdl->dbh, sql3->buf)) != NULL && mapi_error(hdl->dbh) == MOK) { + TRACE("sql", "%s\n", sql4->buf); + if ((mapi_hdl4 = mapi_query(hdl->dbh, sql4->buf)) != NULL && mapi_error(hdl->dbh) == MOK) { + TRACE("sql", "%s\n", sql5->buf); + if ((mapi_hdl5 = mapi_query(hdl->dbh, sql5->buf)) != NULL && mapi_error(hdl->dbh) == MOK) { + TRACE("sql", "DONE\n"); + if (callback != NULL) + ret = callback(hdl, &mapi_hdl1, &mapi_hdl2, &mapi_hdl3, &mapi_hdl4, &mapi_hdl5, buf); + else + ret = ret_ok; +// mapi_cache_freeup(mapi_hdl5, 100); + mapi_close_handle(mapi_hdl5); + } else + mapi_explain(hdl->dbh, stderr); + mapi_close_handle(mapi_hdl4); + } else + mapi_explain(hdl->dbh, stderr); + mapi_close_handle(mapi_hdl3); + } else + mapi_explain(hdl->dbh, stderr); + mapi_close_handle(mapi_hdl2); + } else + mapi_explain(hdl->dbh, stderr); + mapi_close_handle(mapi_hdl1); + } else + mapi_explain(hdl->dbh, stderr); + + return ret; +} + diff --git a/handler_osm_db.h b/handler_osm_db.h index 068c318..7b73e93 100644 --- a/handler_osm_db.h +++ b/handler_osm_db.h @@ -10,3 +10,4 @@ ret_t run_sql(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql, cherokee_buff ret_t run_sql2(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t *sql2, cherokee_buffer_t *buf, ret_t (*callback)()); ret_t run_sql3(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t *sql2, cherokee_buffer_t *sql3, cherokee_buffer_t *buf, ret_t (*callback)()); ret_t run_sql4(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t *sql2, cherokee_buffer_t *sql3, cherokee_buffer_t *sql4, cherokee_buffer_t *buf, ret_t (*callback)()); +ret_t run_sql5(cherokee_handler_osm_t *hdl, cherokee_buffer_t *sql1, cherokee_buffer_t *sql2, cherokee_buffer_t *sql3, cherokee_buffer_t *sql4, cherokee_buffer_t *sql5, cherokee_buffer_t *buf, ret_t (*callback)()); diff --git a/handler_osm_get.c b/handler_osm_get.c index c78399b..c500832 100644 --- a/handler_osm_get.c +++ b/handler_osm_get.c @@ -40,19 +40,28 @@ #define SQL_PARSE_MAP_MEMBERSN_BBOX "SELECT relation, to_node, role FROM members_node WHERE relation IN (SELECT relation FROM members_node WHERE to_node IN (SELECT id FROM " SQL_NODES " WHERE visible = TRUE AND " SQL_BY_BBOX ")) ORDER BY relation, idx", BBOX_VA_ARGS -#define SQL_GET_OBJECT_BY_ID "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id = %lu ORDER BY id", id -#define SQL_GET_OBJTAG_BY_ID "SELECT node, k, v FROM node_tags WHERE node = %lu ORDER BY node", id +#define SQL_GET_OBJECT_BY_ID "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id = %lu", id +#define SQL_GET_OBJECT_BY_IDS "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id IN (%s) ORDER BY id" +#define SQL_GET_OBJTAG_BY_ID "SELECT node, k, v FROM node_tags WHERE node = %lu", id +#define SQL_GET_OBJTAG_BY_IDS "SELECT node, k, v FROM node_tags WHERE node IN (%s) ORDER BY node" +static ret_t result_way_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiHdl *way_tags, MapiHdl *way_nds, cherokee_buffer_t *buf); static ret_t result_nodenew_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *nodes, MapiHdl *node_tags, cherokee_buffer_t *buf) { if (mapi_get_row_count(*nodes) != 0) { unsigned long int current_tag = 0; - /* Each row should be a different node with a different id */ while (mapi_fetch_row(*nodes)) { - cherokee_buffer_t tag = CHEROKEE_BUF_INIT; - short int touched = 0; unsigned long int current_node = strtoul(mapi_fetch_field(*nodes, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add_va (buf, XML(NODE, " "), mapi_fetch_field(*nodes, 0), + mapi_fetch_field(*nodes, 1), + mapi_fetch_field(*nodes, 2), + mapi_fetch_field(*nodes, 3), + mapi_fetch_field(*nodes, 4)); + + len = buf->len; while (current_tag < current_node) { if (mapi_fetch_row(*node_tags) != 0) @@ -64,30 +73,533 @@ static ret_t result_nodenew_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *nodes, while (current_tag == current_node) { const char * key = mapi_fetch_field(*node_tags, 1); const char * value = mapi_fetch_field(*node_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); - cherokee_buffer_add_va (&tag, XML(TAG, " ") XMLCLOSESHORT, key, value); - touched = 1; + if (mapi_fetch_row(*node_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*node_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(NODE, " ")); + else + cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + } + + return ret_ok; +} + +#define SQL_GET_WAY_BY_ND "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id +#define SQL_GET_WAY_TAGS_BY_ND "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id +#define SQL_GET_WAY_NDS_BY_ND "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id + +#define SQL_GET_WAY_BY_NDS "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" +#define SQL_GET_WAY_TAGS_BY_NDS "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" +#define SQL_GET_WAY_NDS_BY_NDS "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" +/* +static ret_t result_nodenew_ways_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *nodes, MapiHdl *node_tags, cherokee_buffer_t *buf) { + if (mapi_get_row_count(*nodes) != 0) { + unsigned long int current_tag = 0; + cherokee_buffer_t nds = CHEROKEE_BUF_INIT; + + while (mapi_fetch_row(*nodes)) { + const char* id = mapi_fetch_field(*nodes, 0); + unsigned long int current_node = strtoul(mapi_fetch_field(*nodes, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add(&nds, id, strlen(id)); + cherokee_buffer_add_str(&nds, ", "); + + cherokee_buffer_add_va (buf, XML(NODE, " "), id, + mapi_fetch_field(*nodes, 1), + mapi_fetch_field(*nodes, 2), + mapi_fetch_field(*nodes, 3), + mapi_fetch_field(*nodes, 4)); + + len = buf->len; + + while (current_tag < current_node) { if (mapi_fetch_row(*node_tags) != 0) current_tag = strtoul(mapi_fetch_field(*node_tags, 0), (char **) NULL, 10); else current_tag = ULONG_MAX; } - cherokee_buffer_add_va (buf, XML(NODE, " "), mapi_fetch_field(*nodes, 0), - mapi_fetch_field(*nodes, 1), - mapi_fetch_field(*nodes, 2), - mapi_fetch_field(*nodes, 3), - mapi_fetch_field(*nodes, 4)); - if (touched == 1) { - cherokee_buffer_add_str (buf, ">"); - cherokee_buffer_add_buffer (buf, &tag); - cherokee_buffer_add_va (buf, "%s", XMLCLOSE(NODE, " ")); - } else { + while (current_tag == current_node) { + const char * key = mapi_fetch_field(*node_tags, 1); + const char * value = mapi_fetch_field(*node_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); + + if (mapi_fetch_row(*node_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*node_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(NODE, " ")); + else + cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + + if (nds.len > 0) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql3 = CHEROKEE_BUF_INIT; + cherokee_buffer_drop_ending(&nds, 2); + cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_NDS, nds.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_NDS, nds.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_NDS, nds.buf); + run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + cherokee_buffer_mrproper(&sql3); + } + + cherokee_buffer_mrproper(&nds); + } + + return ret_ok; +} +*/ + +#define SQL_GET_WAY_BY_ID "SELECT id, username, timestamp FROM ways WHERE id = %lu", id +#define SQL_GET_WAY_BY_IDS "SELECT id, username, timestamp FROM ways WHERE id IN (%s) ORDER BY id" +#define SQL_GET_WAY_TAGS_BY_ID "SELECT way, k, v FROM way_tags WHERE way = %lu", id +#define SQL_GET_WAY_TAGS_BY_IDS "SELECT way, k, v FROM way_tags WHERE way IN (%s) ORDER BY way" +#define SQL_GET_WAY_NDS_BY_ID "SELECT way, to_node FROM way_nds WHERE way = %lu ORDER BY idx", id +#define SQL_GET_WAY_NDS_BY_IDS "SELECT way, to_node FROM way_nds WHERE way IN (%s) ORDER BY way, idx" + +static ret_t result_way_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiHdl *way_tags, + MapiHdl *way_nds, cherokee_buffer_t *buf) { + + if (mapi_get_row_count(*ways) != 0) { + unsigned long int current_tag = 0, current_member_node = 0; + + while (mapi_fetch_row(*ways)) { + unsigned long int current_way = strtoul(mapi_fetch_field(*ways, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add_va (buf, XML(WAY, " "), mapi_fetch_field(*ways, 0), + mapi_fetch_field(*ways, 1), + mapi_fetch_field(*ways, 2)); + + len = buf->len; + + while (current_tag < current_way) { + if (mapi_fetch_row(*way_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*way_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_tag == current_way) { + const char * key = mapi_fetch_field(*way_tags, 1); + const char * value = mapi_fetch_field(*way_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); + + if (mapi_fetch_row(*way_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*way_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_member_node < current_way) { + if (mapi_fetch_row(*way_nds) != 0) + current_member_node = strtoul(mapi_fetch_field(*way_nds, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_node == current_way) { + const char * ref = mapi_fetch_field(*way_nds, 1); + cherokee_buffer_add_va (buf, ">" CRLF XML(ND, " ") "/", ref); + + if (mapi_fetch_row(*way_nds) != 0) + current_member_node = strtoul(mapi_fetch_field(*way_nds, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(WAY, " ")); + else + cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + } + + return ret_ok; +} + +static ret_t result_way_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiHdl *way_tags, + MapiHdl *way_nds, cherokee_buffer_t *buf) { + + if (mapi_get_row_count(*ways) != 0) { + unsigned long int current_tag = 0, current_member_node = 0; + cherokee_buffer_t nds = CHEROKEE_BUF_INIT; + + while (mapi_fetch_row(*ways)) { + unsigned long int current_way = strtoul(mapi_fetch_field(*ways, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add_va (buf, XML(WAY, " "), mapi_fetch_field(*ways, 0), + mapi_fetch_field(*ways, 1), + mapi_fetch_field(*ways, 2)); + + len = buf->len; + + while (current_tag < current_way) { + if (mapi_fetch_row(*way_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*way_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_tag == current_way) { + const char * key = mapi_fetch_field(*way_tags, 1); + const char * value = mapi_fetch_field(*way_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); + + if (mapi_fetch_row(*way_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*way_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_member_node < current_way) { + if (mapi_fetch_row(*way_nds) != 0) + current_member_node = strtoul(mapi_fetch_field(*way_nds, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_node == current_way) { + const char * ref = mapi_fetch_field(*way_nds, 1); + cherokee_buffer_add_va (buf, ">" CRLF XML(ND, " ") "/", ref); + cherokee_buffer_add (&nds, ref, strlen(ref)); + cherokee_buffer_add_str (&nds, ", "); + + if (mapi_fetch_row(*way_nds) != 0) + current_member_node = strtoul(mapi_fetch_field(*way_nds, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(WAY, " ")); + else + cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + + if (nds.len > 0) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; + cherokee_buffer_drop_ending(&nds, 2); + cherokee_buffer_add_va (&sql1, SQL_GET_OBJECT_BY_IDS, nds.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_OBJTAG_BY_IDS, nds.buf); + run_sql2(hdl, &sql1, &sql2, buf, result_nodenew_to_xml); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + } + + cherokee_buffer_mrproper(&nds); + } + + return ret_ok; +} + + +/* RELATION */ + +#define SQL_GET_RELATION_BY_ND "SELECT DISTINCT relation FROM relation_members_node WHERE to_node = %lu", id +#define SQL_GET_RELATION_BY_WAY "SELECT DISTINCT relation FROM relation_members_way WHERE to_way = %lu", id +#define SQL_GET_RELATION_BY_REL "SELECT DISTINCT relation FROM relation_members_relation WHERE to_relation = %lu", id + +static ret_t result_id_to_list(cherokee_handler_osm_t *hdl, MapiHdl *thingie, cherokee_buffer_t *buf) { + unsigned long int len = buf->len; + if (mapi_get_row_count(*thingie) != 0) { + while (mapi_fetch_row(*thingie)) { + const char *id = mapi_fetch_field(*thingie, 0); + cherokee_buffer_add (buf, id, strlen(id)); + cherokee_buffer_add_str (buf, ", "); + } + } + if (buf->len > len) { + cherokee_buffer_drop_ending(buf, 2); + } + + return ret_ok; +} + + +#define SQL_GET_RELATION_BY_ID "SELECT id, username, timestamp FROM relations WHERE id = %lu", id +#define SQL_GET_RELATION_BY_IDS "SELECT id, username, timestamp FROM relations WHERE id IN (%s) ORDER BY id" +#define SQL_GET_RELATION_TAGS_BY_ID "SELECT relation, k, v FROM relation_tags WHERE relation = %lu", id +#define SQL_GET_RELATION_TAGS_BY_IDS "SELECT relation, k, v FROM relation_tags WHERE relation IN (%s) ORDER BY relation" +#define SQL_GET_RELATION_MEMBER_NODE_BY_ID "SELECT relation, to_node, role FROM relation_members_node WHERE relation = %lu ORDER BY idx", id +#define SQL_GET_RELATION_MEMBER_NODE_BY_IDS "SELECT relation, to_node, role FROM relation_members_node WHERE relation IN (%s) ORDER BY relation, idx" +#define SQL_GET_RELATION_MEMBER_RELATION_BY_ID "SELECT relation, to_relation, role FROM relation_members_relation WHERE relation = %lu ORDER BY idx", id +#define SQL_GET_RELATION_MEMBER_RELATION_BY_IDS "SELECT relation, to_relation, role FROM relation_members_relation WHERE relation IN (%s) ORDER BY relation, idx" +#define SQL_GET_RELATION_MEMBER_WAY_BY_ID "SELECT relation, to_way, role FROM relation_members_way WHERE relation = %lu ORDER BY idx", id +#define SQL_GET_RELATION_MEMBER_WAY_BY_IDS "SELECT relation, to_way, role FROM relation_members_way WHERE relation IN (%s) ORDER BY relation, idx" + +static ret_t result_relation_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relations, MapiHdl *relation_tags, + MapiHdl *relation_mn, MapiHdl *relation_mw, MapiHdl *relation_mr, cherokee_buffer_t *buf) { + + if (mapi_get_row_count(*relations) != 0) { + unsigned long int current_tag = 0, current_member_node = 0, current_member_relation = 0, current_member_way = 0; + + while (mapi_fetch_row(*relations)) { + unsigned long int current_relation = strtoul(mapi_fetch_field(*relations, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add_va (buf, XML(RELATION, " "), mapi_fetch_field(*relations, 0), + mapi_fetch_field(*relations, 1), + mapi_fetch_field(*relations, 2)); + + len = buf->len; + + while (current_tag < current_relation) { + if (mapi_fetch_row(*relation_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*relation_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_tag == current_relation) { + const char * key = mapi_fetch_field(*relation_tags, 1); + const char * value = mapi_fetch_field(*relation_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); + + if (mapi_fetch_row(*relation_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*relation_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_member_node < current_relation) { + if (mapi_fetch_row(*relation_mn) != 0) + current_member_node = strtoul(mapi_fetch_field(*relation_mn, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_node == current_relation) { + const char *to_node = mapi_fetch_field(*relation_mn, 1); + const char *role = mapi_fetch_field(*relation_mn, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_NODE, (to_node ? to_node : ""), (role ? role : "")); + + if (mapi_fetch_row(*relation_mn) != 0) + current_member_node = strtoul(mapi_fetch_field(*relation_mn, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_relation < current_relation) { + if (mapi_fetch_row(*relation_mr) != 0) + current_member_relation = strtoul(mapi_fetch_field(*relation_mr, 0), (char **) NULL, 10); + else + current_member_relation = ULONG_MAX; + } + + while (current_member_relation == current_relation) { + const char *to_relation = mapi_fetch_field(*relation_mr, 1); + const char *role = mapi_fetch_field(*relation_mr, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_RELATION, (to_relation ? to_relation : ""), (role ? role : "")); + + if (mapi_fetch_row(*relation_mr) != 0) + current_member_relation = strtoul(mapi_fetch_field(*relation_mr, 0), (char **) NULL, 10); + else + current_member_relation = ULONG_MAX; + } + + while (current_member_way < current_relation) { + if (mapi_fetch_row(*relation_mw) != 0) + current_member_way = strtoul(mapi_fetch_field(*relation_mw, 0), (char **) NULL, 10); + else + current_member_way = ULONG_MAX; + } + + while (current_member_way == current_relation) { + const char *to_way = mapi_fetch_field(*relation_mw, 1); + const char *role = mapi_fetch_field(*relation_mw, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_WAY, (to_way ? to_way : ""), (role ? role : "")); + + if (mapi_fetch_row(*relation_mw) != 0) + current_member_way = strtoul(mapi_fetch_field(*relation_mw, 0), (char **) NULL, 10); + else + current_member_way = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(RELATION, " ")); + else cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + } + + return ret_ok; +} + + +static ret_t result_relation_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relations, MapiHdl *relation_tags, + MapiHdl *relation_mn, MapiHdl *relation_mr, MapiHdl *relation_mw, cherokee_buffer_t *buf) { + + if (mapi_get_row_count(*relations) != 0) { + unsigned long int current_tag = 0, current_member_node = 0, current_member_relation = 0, current_member_way = 0; + cherokee_buffer_t nds = CHEROKEE_BUF_INIT; + cherokee_buffer_t wys = CHEROKEE_BUF_INIT; + cherokee_buffer_t rls = CHEROKEE_BUF_INIT; + + while (mapi_fetch_row(*relations)) { + unsigned long int current_relation = strtoul(mapi_fetch_field(*relations, 0), (char **) NULL, 10); + unsigned long len; + + cherokee_buffer_add_va (buf, XML(RELATION, " "), mapi_fetch_field(*relations, 0), + mapi_fetch_field(*relations, 1), + mapi_fetch_field(*relations, 2)); + + len = buf->len; + + while (current_tag < current_relation) { + if (mapi_fetch_row(*relation_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*relation_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; } - cherokee_buffer_mrproper(&tag); + + while (current_tag == current_relation) { + const char * key = mapi_fetch_field(*relation_tags, 1); + const char * value = mapi_fetch_field(*relation_tags, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(TAG, " ") "/", key, (value == NULL ? "" : value)); + + if (mapi_fetch_row(*relation_tags) != 0) + current_tag = strtoul(mapi_fetch_field(*relation_tags, 0), (char **) NULL, 10); + else + current_tag = ULONG_MAX; + } + + while (current_member_node < current_relation) { + if (mapi_fetch_row(*relation_mn) != 0) + current_member_node = strtoul(mapi_fetch_field(*relation_mn, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_node == current_relation) { + const char *to_node = mapi_fetch_field(*relation_mn, 1); + const char *role = mapi_fetch_field(*relation_mn, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_NODE, (to_node ? to_node : ""), (role ? role : "")); + + cherokee_buffer_add (&nds, to_node, strlen(to_node)); + cherokee_buffer_add_str (&nds, ", "); + + if (mapi_fetch_row(*relation_mn) != 0) + current_member_node = strtoul(mapi_fetch_field(*relation_mn, 0), (char **) NULL, 10); + else + current_member_node = ULONG_MAX; + } + + while (current_member_relation < current_relation) { + if (mapi_fetch_row(*relation_mr) != 0) + current_member_relation = strtoul(mapi_fetch_field(*relation_mr, 0), (char **) NULL, 10); + else + current_member_relation = ULONG_MAX; + } + + while (current_member_relation == current_relation) { + const char *to_relation = mapi_fetch_field(*relation_mr, 1); + const char *role = mapi_fetch_field(*relation_mr, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_RELATION, (to_relation ? to_relation : ""), (role ? role : "")); + + cherokee_buffer_add (&rls, to_relation, strlen(to_relation)); + cherokee_buffer_add_str (&rls, ", "); + + if (mapi_fetch_row(*relation_mr) != 0) + current_member_relation = strtoul(mapi_fetch_field(*relation_mr, 0), (char **) NULL, 10); + else + current_member_relation = ULONG_MAX; + } + + while (current_member_way < current_relation) { + if (mapi_fetch_row(*relation_mw) != 0) + current_member_way = strtoul(mapi_fetch_field(*relation_mw, 0), (char **) NULL, 10); + else + current_member_way = ULONG_MAX; + } + + while (current_member_way == current_relation) { + const char *to_way = mapi_fetch_field(*relation_mw, 1); + const char *role = mapi_fetch_field(*relation_mw, 2); + cherokee_buffer_add_va (buf, ">" CRLF XML(MEMBER, " ") "/", MEMBER_TYPE_WAY, (to_way ? to_way : ""), (role ? role : "")); + + cherokee_buffer_add (&wys, to_way, strlen(to_way)); + cherokee_buffer_add_str (&wys, ", "); + + if (mapi_fetch_row(*relation_mw) != 0) + current_member_way = strtoul(mapi_fetch_field(*relation_mw, 0), (char **) NULL, 10); + else + current_member_way = ULONG_MAX; + } + + if (buf->len > len) + cherokee_buffer_add_str (buf, ">" CRLF XMLCLOSE(RELATION, " ")); + else + cherokee_buffer_add_str (buf, XMLCLOSESHORT); + } + + if (nds.len > 0) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; + cherokee_buffer_drop_ending(&nds, 2); + cherokee_buffer_add_va (&sql1, SQL_GET_OBJECT_BY_IDS, nds.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_OBJTAG_BY_IDS, nds.buf); + run_sql2(hdl, &sql1, &sql2, buf, result_nodenew_to_xml); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); } + + if (rls.len > 0) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql3 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql4 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql5 = CHEROKEE_BUF_INIT; + cherokee_buffer_drop_ending(&rls, 2); + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_IDS, rls.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_IDS, rls.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_IDS, rls.buf); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_IDS, rls.buf); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_IDS, rls.buf); + run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + cherokee_buffer_mrproper(&sql3); + cherokee_buffer_mrproper(&sql4); + cherokee_buffer_mrproper(&sql5); + } + + if (wys.len > 0) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql3 = CHEROKEE_BUF_INIT; + cherokee_buffer_drop_ending(&wys, 2); + cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_IDS, wys.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_IDS, wys.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_IDS, wys.buf); + run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + cherokee_buffer_mrproper(&sql3); + } + + cherokee_buffer_mrproper(&nds); + cherokee_buffer_mrproper(&rls); + cherokee_buffer_mrproper(&wys); + } return ret_ok; @@ -226,23 +738,113 @@ get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buf cherokee_buffer_t sql2 = CHEROKEE_BUF_INIT; cherokee_buffer_t sql3 = CHEROKEE_BUF_INIT; cherokee_buffer_t sql4 = CHEROKEE_BUF_INIT; + cherokee_buffer_t sql5 = CHEROKEE_BUF_INIT; + switch (state) { case OSM_NODE_COMMAND: cherokee_buffer_add_va (&sql1, SQL_GET_OBJECT_BY_ID); cherokee_buffer_add_va (&sql2, SQL_GET_OBJTAG_BY_ID); ret = run_sql2(hdl, &sql1, &sql2, buf, result_nodenew_to_xml); break; + case OSM_NODE_COMMAND_WAYS: + cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_ND); + cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_ND); + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_ND); + ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); + break; + case OSM_NODE_COMMAND_RELATIONS: { + fprintf(stderr, "DEBUG2\n"); + cherokee_buffer_t relations = CHEROKEE_BUF_INIT; + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_ND); + run_sql(hdl, &sql1, &relations, result_id_to_list); + cherokee_buffer_mrproper(&sql1); + + if (relations.len > 0) { + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_IDS, relations.buf); + cherokee_buffer_mrproper(&relations); + + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + } else { + ret = ret_ok; + } + break; + } case OSM_WAY_COMMAND: + cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_ID); + cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_ID); + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_ID); + ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); + break; + case OSM_WAY_COMMAND_FULL: + cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_ID); + cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_ID); + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_ID); + ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_full_to_xml); + break; + case OSM_WAY_COMMAND_RELATIONS: { + cherokee_buffer_t relations = CHEROKEE_BUF_INIT; + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_WAY); + run_sql(hdl, &sql1, &relations, result_id_to_list); + cherokee_buffer_mrproper(&sql1); + + if (relations.len > 0) { + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_IDS, relations.buf); + cherokee_buffer_mrproper(&relations); + + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + } else { + ret = ret_ok; + } + break; + } case OSM_RELATION_COMMAND: - cherokee_buffer_add_va (&sql1, SQL_RELATION_BY_ID, id); - cherokee_buffer_add_va (&sql2, SQL_RELATION_TAGS_BY_ID, id); - cherokee_buffer_add_va (&sql3, SQL_RELATION_MEMBER_RELATION_BY_ID, id); - cherokee_buffer_add_va (&sql4, SQL_RELATION_MEMBER_NODE_BY_ID, id); - ret = run_sql4(hdl, &sql1, &sql2, &sql3, &sql4, buf, result_relationway_to_xml); + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_ID); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_ID); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_ID); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_ID); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_ID); + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + break; + case OSM_RELATION_COMMAND_FULL: + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_ID); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_ID); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_ID); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_ID); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_ID); + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_full_to_xml); break; + case OSM_RELATION_COMMAND_RELATIONS: { + cherokee_buffer_t relations = CHEROKEE_BUF_INIT; + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_REL); + run_sql(hdl, &sql1, &relations, result_id_to_list); + cherokee_buffer_mrproper(&sql1); + + if (relations.len > 0) { + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_IDS, relations.buf); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_IDS, relations.buf); + cherokee_buffer_mrproper(&relations); + + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + } else { + ret = ret_ok; + } + break; + } default: ret = ret_error; } + cherokee_buffer_mrproper(&sql5); cherokee_buffer_mrproper(&sql4); cherokee_buffer_mrproper(&sql3); cherokee_buffer_mrproper(&sql2); @@ -383,29 +985,11 @@ parse_changes(cherokee_avl_t *arguments, cherokee_buffer_t *buf) { } static void -node_ways(cherokee_buffer_t *buf, unsigned long int id) -{ - printf("%s\n", __func__); -} - - static void -objtype_full(cherokee_buffer_t *buf, unsigned long int id, osm_state_get_t state) -{ - printf("%s\n", __func__); -} - - static void objtype_history(cherokee_buffer_t *buf, unsigned long int id, osm_state_get_t state) { printf("%s\n", __func__); } - static void -objtype_relations(cherokee_buffer_t *buf, unsigned long int id, osm_state_get_t state) -{ - printf("%s\n", __func__); -} - static ret_t osm_build_page (cherokee_handler_osm_t *hdl) @@ -503,7 +1087,6 @@ osm_build_page (cherokee_handler_osm_t *hdl) id = strtoul(token, (char **) NULL, 10); if (errno != ERANGE) { state++; - ret = get_object_by_id(hdl, id, &content, state); } else state = OSM_DONE; break; @@ -530,20 +1113,28 @@ osm_build_page (cherokee_handler_osm_t *hdl) switch (token[0]) { case 'w': /* GET /api/0.5/node//ways */ - node_ways(&content, id); + state++; + break; + case 'r': + /* GET /api/0.5/?//relations */ + state += 2; break; } + break; case OSM_WAY_COMMAND: case OSM_RELATION_COMMAND: switch (token[0]) { case 'f': - objtype_full(&content, id, state); + /* GET /api/0.5/?//full */ + state++; break; case 'h': + /* GET /api/0.5/?//history */ objtype_history(&content, id, state); break; case 'r': - objtype_relations(&content, id, state); + /* GET /api/0.5/?//relations */ + state += 2; break; } break; @@ -591,6 +1182,25 @@ osm_build_page (cherokee_handler_osm_t *hdl) } } + switch (state) { + case OSM_GPX_ID: + case OSM_NODE_ID: + case OSM_WAY_ID: + case OSM_RELATION_ID: + case OSM_NODE_COMMAND: + case OSM_WAY_COMMAND: + case OSM_RELATION_COMMAND: + case OSM_NODE_COMMAND_WAYS: + case OSM_WAY_COMMAND_FULL: + case OSM_RELATION_COMMAND_FULL: + case OSM_NODE_COMMAND_RELATIONS: + case OSM_WAY_COMMAND_RELATIONS: + case OSM_RELATION_COMMAND_RELATIONS: + ret = get_object_by_id(hdl, id, &content, state); + default: + break; + } + if (state == OSM_NODE_XAPI_PARSE || state == OSM_WAY_XAPI_PARSE || state == OSM_RELATION_XAPI_PARSE) { diff --git a/handler_osm_get.h b/handler_osm_get.h dissimilarity index 63% index 3da23a9..cf95378 100644 --- a/handler_osm_get.h +++ b/handler_osm_get.h @@ -1,6 +1,33 @@ -#include - -typedef enum { OSM_FIND_FIRST = 0, OSM_GPX_ID, OSM_GPX_COMMAND, OSM_NODE_ID, OSM_NODE_COMMAND, OSM_NODES, OSM_NODES_PRE_PARSE, OSM_WAY_ID, OSM_WAY_COMMAND, OSM_WAYS_PRE_PARSE, OSM_WAYS_SEARCH, OSM_RELATION_ID, OSM_RELATION_COMMAND, OSM_RELATIONS_PRE_PARSE, OSM_RELATIONS_SEARCH, OSM_NODE_XAPI_PARSE, OSM_WAY_XAPI_PARSE, OSM_RELATION_XAPI_PARSE, OSM_ALL_XAPI_PARSE, OSM_DONE} osm_state_get_t; - -ret_t get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buffer_t *buf, osm_state_get_t state); -ret_t cherokee_handler_osm_init_get (cherokee_handler_osm_t *hdl); +#include + +typedef enum { + OSM_FIND_FIRST = 0, + OSM_GPX_ID, + OSM_GPX_COMMAND, + OSM_NODE_ID, + OSM_NODE_COMMAND, + OSM_NODE_COMMAND_WAYS, + OSM_NODE_COMMAND_RELATIONS, + OSM_NODES, + OSM_NODES_PRE_PARSE, + OSM_WAY_ID, + OSM_WAY_COMMAND, + OSM_WAY_COMMAND_FULL, + OSM_WAY_COMMAND_RELATIONS, + OSM_WAYS_PRE_PARSE, + OSM_WAYS_SEARCH, + OSM_RELATION_ID, + OSM_RELATION_COMMAND, + OSM_RELATION_COMMAND_FULL, + OSM_RELATION_COMMAND_RELATIONS, + OSM_RELATIONS_PRE_PARSE, + OSM_RELATIONS_SEARCH, + OSM_NODE_XAPI_PARSE, + OSM_WAY_XAPI_PARSE, + OSM_RELATION_XAPI_PARSE, + OSM_ALL_XAPI_PARSE, + OSM_DONE +} osm_state_get_t; + +ret_t get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buffer_t *buf, osm_state_get_t state); +ret_t cherokee_handler_osm_init_get (cherokee_handler_osm_t *hdl); -- 2.11.4.GIT