From 135afd30cb79f481a5d5033bafea43c3e01facb1 Mon Sep 17 00:00:00 2001 From: Stefan de Konink Date: Sun, 14 Dec 2008 05:06:42 +0100 Subject: [PATCH] We have splitted up the create/update code in two distinct part as prepartion for the root update functions. --- handler_osm_put.c | 349 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 182 insertions(+), 167 deletions(-) diff --git a/handler_osm_put.c b/handler_osm_put.c index 6258e8b..36d4b12 100644 --- a/handler_osm_put.c +++ b/handler_osm_put.c @@ -204,13 +204,185 @@ static void do_tags(cherokee_handler_osm_t *hdl, axlNode *node, unsigned long in } } +static ret_t +create_node(cherokee_handler_osm_t *hdl, axlNode * node) { + cherokee_connection_t *conn = HANDLER_CONN(hdl); + cherokee_buffer_t *buf; + buf = &hdl->buffer; + + if (NODE_CMP_NAME (node, "node")) { + if (axl_node_has_attribute(node, "lat") && + axl_node_has_attribute(node, "lon")) { + double lat, lon; + lat = strtod(axl_node_get_attribute_value(node, "lat"), NULL); + if (errno == ERANGE) { + conn->error_code = http_bad_request; + return ret_error; + } + + lon = strtod(axl_node_get_attribute_value(node, "lon"), NULL); + if (errno == ERANGE) { + conn->error_code = http_bad_request; + return ret_error; + } else { + /* TODO: more error checking */ + long testid = 0; + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + + cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE, lon, lat, 0); + run_sql(hdl, &sql1, buf, result_node_last_id); + cherokee_buffer_mrproper(&sql1); + + testid = strtol(buf->buf, (char **) NULL, 10); + if (errno != ERANGE && testid > 0) { + do_tags(hdl, node, testid, 0, SQL_NODE_CREATE_NODE_TAG, SQL_NODE_UPDATE_NODE_TAG, SQL_NODE_DELETE_NODE_TAG); + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } else { + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } + } + } + } else if (NODE_CMP_NAME (node, "way")) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + + cherokee_buffer_add_va (&sql1, SQL_WAY_CREATE, 0); + run_sql(hdl, &sql1, buf, result_node_last_id); + cherokee_buffer_mrproper(&sql1); + + long testid = 0; + testid = strtol(buf->buf, (char **) NULL, 10); + if (errno != ERANGE && testid > 0) { + do_tags(hdl, node, testid, 0, SQL_WAY_CREATE_NODE_TAG, SQL_WAY_UPDATE_NODE_TAG, SQL_WAY_DELETE_NODE_TAG); + do_nds(hdl, node, testid, 0); /* this sequence otherwise we screw up type= */ + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } else { + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } + } else if (NODE_CMP_NAME (node, "relation")) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + + cherokee_buffer_add_va (&sql1, SQL_RELATION_CREATE, 0); + run_sql(hdl, &sql1, buf, result_node_last_id); + cherokee_buffer_mrproper(&sql1); + + long testid = 0; + testid = strtol(buf->buf, (char **) NULL, 10); + if (errno != ERANGE && testid > 0) { + do_members(hdl, node, testid, 0); + do_tags(hdl, node, testid, 0, SQL_RELATION_CREATE_NODE_TAG, SQL_RELATION_UPDATE_NODE_TAG, SQL_RELATION_DELETE_NODE_TAG); + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } else { + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } + } + return ret_ok; +} + +static ret_t +update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodeid) { + cherokee_connection_t *conn = HANDLER_CONN(hdl); + cherokee_buffer_t *buf; + buf = &hdl->buffer; + + if (NODE_CMP_NAME (node, "node")) { + if (axl_node_has_attribute(node, "lat") && + axl_node_has_attribute(node, "lon")) { + double lat, lon; + lat = strtod(axl_node_get_attribute_value(node, "lat"), NULL); + if (errno == ERANGE) { + conn->error_code = http_bad_request; + return ret_error; + } + + lon = strtod(axl_node_get_attribute_value(node, "lon"), NULL); + if (errno == ERANGE) { + conn->error_code = http_bad_request; + return ret_error; + } else { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, NULL, NULL); + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_add_va (&sql1, SQL_NODE_UPDATE_BY_ID, lon, lat, 0, nodeid); + run_sql(hdl, &sql1, NULL, NULL); + cherokee_buffer_mrproper(&sql1); + + do_tags(hdl, node, nodeid, 1, SQL_NODE_CREATE_NODE_TAG, SQL_NODE_UPDATE_NODE_TAG, SQL_NODE_DELETE_NODE_TAG); + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } + } + } else if (NODE_CMP_NAME (node, "way")) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + + cherokee_buffer_add_va (&sql1, SQL_RELATION_UPDATE, 0, nodeid); + run_sql(hdl, &sql1, NULL, NULL); + cherokee_buffer_mrproper(&sql1); + + do_tags(hdl, node, nodeid, 1, SQL_WAY_CREATE_NODE_TAG, SQL_WAY_UPDATE_NODE_TAG, SQL_WAY_DELETE_NODE_TAG); + do_nds(hdl, node, nodeid, 1); /* this sequence otherwise we screw up type = */ + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } else if (NODE_CMP_NAME (node, "relation")) { + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + + cherokee_buffer_add_va (&sql1, SQL_RELATION_UPDATE, 0, nodeid); + run_sql(hdl, &sql1, NULL, NULL); + cherokee_buffer_mrproper(&sql1); + + do_members(hdl, node, nodeid, 1); + do_tags(hdl, node, nodeid, 1, SQL_RELATION_CREATE_NODE_TAG, SQL_RELATION_UPDATE_NODE_TAG, SQL_RELATION_DELETE_NODE_TAG); + + cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); + run_sql(hdl, &sql1, buf, NULL); + cherokee_buffer_mrproper(&sql1); + } + return ret_ok; +} + + + ret_t cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) { off_t postl; ret_t ret = ret_ok; cherokee_buffer_t post = CHEROKEE_BUF_INIT; - cherokee_buffer_t *buf; cherokee_connection_t *conn = HANDLER_CONN(hdl); axlDoc * doc; axlError * error; @@ -223,7 +395,6 @@ cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) return ret_error; } - buf = &hdl->buffer; /* Process line per line */ @@ -237,7 +408,6 @@ cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) printf ("Error found: %s\n", axl_error_get (error)); axl_error_free (error); ret = ret_error; - goto post_error; } else { axlNode * node = axl_doc_get_root (doc); node = axl_node_get_first_child (node); @@ -249,179 +419,24 @@ cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) TRACE("osm", "%lu\n", nodeid); } + /* het mooiste zou zijn om het onderstaande in twee functies te zetten + * update vs create. + * Als dat gebeurd is kan hier (of in de 'update' code gechecked worden + * op 'root' of op normale user en aan de hand daarvan weer switchen op + * empty == create of full == update) + */ + if (nodeid != 0) { /* UPDATE */ - if (NODE_CMP_NAME (node, "node")) { - if (axl_node_has_attribute(node, "lat") && - axl_node_has_attribute(node, "lon")) { - double lat, lon; - lat = strtod(axl_node_get_attribute_value(node, "lat"), NULL); - if (errno == ERANGE) { - conn->error_code = http_bad_request; - ret = ret_error; - goto xml_error; - } - - lon = strtod(axl_node_get_attribute_value(node, "lon"), NULL); - if (errno == ERANGE) { - conn->error_code = http_bad_request; - ret = ret_error; - goto xml_error; - } else { - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, NULL, NULL); - cherokee_buffer_mrproper(&sql1); - cherokee_buffer_add_va (&sql1, SQL_NODE_UPDATE_BY_ID, lon, lat, 0, nodeid); - run_sql(hdl, &sql1, NULL, NULL); - cherokee_buffer_mrproper(&sql1); - - do_tags(hdl, node, nodeid, 1, SQL_NODE_CREATE_NODE_TAG, SQL_NODE_UPDATE_NODE_TAG, SQL_NODE_DELETE_NODE_TAG); - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } - } - } else if (NODE_CMP_NAME (node, "way")) { - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - - cherokee_buffer_add_va (&sql1, SQL_RELATION_UPDATE, 0, nodeid); - run_sql(hdl, &sql1, NULL, NULL); - cherokee_buffer_mrproper(&sql1); - - do_tags(hdl, node, nodeid, 1, SQL_WAY_CREATE_NODE_TAG, SQL_WAY_UPDATE_NODE_TAG, SQL_WAY_DELETE_NODE_TAG); - do_nds(hdl, node, nodeid, 1); /* this sequence otherwise we screw up type = */ - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } else if (NODE_CMP_NAME (node, "relation")) { - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - - cherokee_buffer_add_va (&sql1, SQL_RELATION_UPDATE, 0, nodeid); - run_sql(hdl, &sql1, NULL, NULL); - cherokee_buffer_mrproper(&sql1); - - do_members(hdl, node, nodeid, 1); - do_tags(hdl, node, nodeid, 1, SQL_RELATION_CREATE_NODE_TAG, SQL_RELATION_UPDATE_NODE_TAG, SQL_RELATION_DELETE_NODE_TAG); - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } + ret = update_node(hdl, node, nodeid); } else { /* CREATE */ - if (NODE_CMP_NAME (node, "node")) { - if (axl_node_has_attribute(node, "lat") && - axl_node_has_attribute(node, "lon")) { - double lat, lon; - lat = strtod(axl_node_get_attribute_value(node, "lat"), NULL); - if (errno == ERANGE) { - conn->error_code = http_bad_request; - ret = ret_error; - goto xml_error; - } - - lon = strtod(axl_node_get_attribute_value(node, "lon"), NULL); - if (errno == ERANGE) { - conn->error_code = http_bad_request; - ret = ret_error; - goto xml_error; - } else { - /* TODO: more error checking */ - long testid = 0; - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - - cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE, lon, lat, 0); - run_sql(hdl, &sql1, buf, result_node_last_id); - cherokee_buffer_mrproper(&sql1); - - testid = strtol(buf->buf, (char **) NULL, 10); - if (errno != ERANGE && testid > 0) { - nodeid = testid; - - do_tags(hdl, node, nodeid, 0, SQL_NODE_CREATE_NODE_TAG, SQL_NODE_UPDATE_NODE_TAG, SQL_NODE_DELETE_NODE_TAG); - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } else { - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } - } - } - } else if (NODE_CMP_NAME (node, "way")) { - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - - cherokee_buffer_add_va (&sql1, SQL_WAY_CREATE, 0); - run_sql(hdl, &sql1, buf, result_node_last_id); - cherokee_buffer_mrproper(&sql1); - - long testid = 0; - testid = strtol(buf->buf, (char **) NULL, 10); - if (errno != ERANGE && testid > 0) { - nodeid = testid; - - do_tags(hdl, node, nodeid, 0, SQL_WAY_CREATE_NODE_TAG, SQL_WAY_UPDATE_NODE_TAG, SQL_WAY_DELETE_NODE_TAG); - do_nds(hdl, node, nodeid, 0); /* this sequence otherwise we screw up type= */ - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } else { - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } - } else if (NODE_CMP_NAME (node, "relation")) { - cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_START); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - - cherokee_buffer_add_va (&sql1, SQL_RELATION_CREATE, 0); - run_sql(hdl, &sql1, buf, result_node_last_id); - cherokee_buffer_mrproper(&sql1); - - long testid = 0; - testid = strtol(buf->buf, (char **) NULL, 10); - if (errno != ERANGE && testid > 0) { - nodeid = testid; - do_members(hdl, node, nodeid, 0); - do_tags(hdl, node, nodeid, 0, SQL_RELATION_CREATE_NODE_TAG, SQL_RELATION_UPDATE_NODE_TAG, SQL_RELATION_DELETE_NODE_TAG); - - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_COMMIT); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } else { - cherokee_buffer_add_str (&sql1, SQL_TRANSACTION_ROLLBACK); - run_sql(hdl, &sql1, buf, NULL); - cherokee_buffer_mrproper(&sql1); - } - } + ret = create_node(hdl, node); } -xml_error: axl_doc_free (doc); } -post_error: cherokee_buffer_mrproper (&post); return ret; } -- 2.11.4.GIT