From 97a4a8748ae0fd85d9cec7503bf9d0e3be4e61ce Mon Sep 17 00:00:00 2001 From: Stefan de Konink Date: Sun, 21 Dec 2008 06:17:06 +0100 Subject: [PATCH] big update; need sleep; and needs testing --- handler_osm_put.c | 108 ++++++++++++++++++++++++++++++++++++++++++++---------- handler_osm_sql.h | 7 +++- 2 files changed, 95 insertions(+), 20 deletions(-) diff --git a/handler_osm_put.c b/handler_osm_put.c index 18569dc..04fb1dc 100644 --- a/handler_osm_put.c +++ b/handler_osm_put.c @@ -205,12 +205,47 @@ static void do_tags(cherokee_handler_osm_t *hdl, axlNode *node, unsigned long in } } +static int +node_exists(cherokee_handler_osm_t *hdl, osm_state_delete_t type, unsigned long int nodeid) { + int result = 0; + cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; + cherokee_buffer_t tmp = CHEROKEE_BUF_INIT; + + switch (type) { + case OSM_DELETE_NODE_COMMAND: + cherokee_buffer_add_va (&sql1, SQL_NODE_EXIST, nodeid); + break; + + case OSM_DELETE_WAY_COMMAND: + cherokee_buffer_add_va (&sql1, SQL_WAY_EXIST, nodeid); + break; + + case OSM_DELETE_RELATION_COMMAND: + cherokee_buffer_add_va (&sql1, SQL_RELATION_EXIST, nodeid); + break; + + default: + SHOULDNT_HAPPEN; + return result; + } + + run_sql(hdl, &sql1, &tmp, NULL); + if (tmp.len > 0) + result = 1; + + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&tmp); + + return result; +} + static ret_t -create_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int userid) { +create_node(cherokee_handler_osm_t *hdl, axlNode * node, osm_state_delete_t type, unsigned long int nodeid, unsigned long int userid, short int timestamp) { cherokee_connection_t *conn = HANDLER_CONN(hdl); cherokee_buffer_t *buf = &hdl->buffer; - if (NODE_CMP_NAME (node, "node")) { + switch (type) { + case OSM_DELETE_NODE_COMMAND: { if (axl_node_has_attribute(node, "lat") && axl_node_has_attribute(node, "lon")) { double lat, lon; @@ -229,7 +264,19 @@ create_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int useri long testid = 0; cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; - cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE, lon, lat, userid); + if (nodeid == 0) { + if (timestamp == 1 && axl_node_has_attribute(node, "timestamp")) { + cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE, lon, lat, userid, "'", axl_node_get_attribute_value(node, "timestamp"), "'"); + } else { + cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE, lon, lat, userid, SQL_NOW); + } + } else { + if (timestamp == 1 && axl_node_has_attribute(node, "timestamp")) { + cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE_BY_ID, lon, lat, userid, "'", axl_node_get_attribute_value(node, "timestamp"), "'", nodeid); + } else { + cherokee_buffer_add_va (&sql1, SQL_NODE_CREATE_BY_ID, lon, lat, userid, SQL_NOW, nodeid); + } + } run_sql(hdl, &sql1, buf, result_node_last_id); cherokee_buffer_mrproper(&sql1); @@ -242,7 +289,9 @@ create_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int useri } } } - } else if (NODE_CMP_NAME (node, "way")) { + } + break; + case OSM_DELETE_WAY_COMMAND: { cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; cherokee_buffer_add_va (&sql1, SQL_WAY_CREATE, userid); run_sql(hdl, &sql1, buf, result_node_last_id); @@ -258,7 +307,9 @@ create_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int useri } else { return ret_error; } - } else if (NODE_CMP_NAME (node, "relation")) { + } + break; + case OSM_DELETE_RELATION_COMMAND: { cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; cherokee_buffer_add_va (&sql1, SQL_RELATION_CREATE, userid); run_sql(hdl, &sql1, buf, result_node_last_id); @@ -275,12 +326,16 @@ create_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int useri return ret_error; } } + break; + default: + SHOULDNT_HAPPEN; + } SHOULDNT_HAPPEN; return ret_error; } static ret_t -update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodeid, unsigned long int userid, short int timestamp) { +update_node(cherokee_handler_osm_t *hdl, axlNode * node, osm_state_delete_t type, unsigned long int nodeid, unsigned long int userid, short int timestamp) { cherokee_connection_t *conn = HANDLER_CONN(hdl); if (axl_node_has_attribute_value(node, "visible", "false")) { @@ -288,15 +343,10 @@ update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodei * but we will not update. Instead we do what the user request: * deletion. */ - if (NODE_CMP_NAME (node, "node")) { - return delete_object_by_id(hdl, nodeid, OSM_DELETE_NODE_COMMAND); - } else if (NODE_CMP_NAME (node, "way")) { - return delete_object_by_id(hdl, nodeid, OSM_DELETE_WAY_COMMAND); - } else if (NODE_CMP_NAME (node, "relation")) { - return delete_object_by_id(hdl, nodeid, OSM_DELETE_RELATION_COMMAND); - } + return delete_object_by_id(hdl, nodeid, type); } else { - if (NODE_CMP_NAME (node, "node")) { + switch (type) { + case OSM_DELETE_NODE_COMMAND: { if (axl_node_has_attribute(node, "lat") && axl_node_has_attribute(node, "lon")) { double lat, lon; @@ -326,7 +376,9 @@ update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodei return ret_ok; } } - } else if (NODE_CMP_NAME (node, "way")) { + } + break; + case OSM_DELETE_WAY_COMMAND: { cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; if (timestamp == 1 && axl_node_has_attribute(node, "timestamp")) { cherokee_buffer_add_va (&sql1, SQL_WAY_UPDATE, userid, @@ -341,7 +393,9 @@ update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodei do_nds(hdl, node, nodeid, 1); /* this sequence otherwise we screw up type = */ return ret_ok; - } else if (NODE_CMP_NAME (node, "relation")) { + } + break; + case OSM_DELETE_RELATION_COMMAND: { cherokee_buffer_t sql1 = CHEROKEE_BUF_INIT; if (timestamp == 1 && axl_node_has_attribute(node, "timestamp")) { cherokee_buffer_add_va (&sql1, SQL_RELATION_UPDATE, userid, @@ -356,6 +410,10 @@ update_node(cherokee_handler_osm_t *hdl, axlNode * node, unsigned long int nodei do_tags(hdl, node, nodeid, 1, SQL_RELATION_CREATE_NODE_TAG, SQL_RELATION_UPDATE_NODE_TAG, SQL_RELATION_DELETE_NODE_TAG); return ret_ok; + } + break; + default: + SHOULDNT_HAPPEN; } } @@ -428,6 +486,7 @@ cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) while (node != NULL && ret == ret_ok) { unsigned long int nodeid = 0; + osm_state_delete_t type; if (axl_node_has_attribute(node, "id")) { const char *id = axl_node_get_attribute_value(node, "id"); @@ -445,13 +504,24 @@ cherokee_handler_osm_init_put (cherokee_handler_osm_t *hdl) cherokee_buffer_mrproper(&tmp); } } + + if (NODE_CMP_NAME (node, "node")) { + type = OSM_DELETE_NODE_COMMAND; + } else if (NODE_CMP_NAME (node, "way")) { + type = OSM_DELETE_WAY_COMMAND; + } else if (NODE_CMP_NAME (node, "relation")) { + type = OSM_DELETE_RELATION_COMMAND; + } else { + ret = ret_error; + break; + } - if (nodeid > 0) { + if (nodeid > 0 && node_exists(hdl, type, nodeid)) { /* UPDATE */ - ret = update_node(hdl, node, nodeid, activeuserid, (userid == 0)); + ret = update_node(hdl, node, type, nodeid, activeuserid, (userid == 0)); } else { /* CREATE */ - ret = create_node(hdl, node, activeuserid); + ret = create_node(hdl, node, type, nodeid, activeuserid, (userid == 0)); } node = axl_node_get_next(node); diff --git a/handler_osm_sql.h b/handler_osm_sql.h index f515d25..9b1129c 100644 --- a/handler_osm_sql.h +++ b/handler_osm_sql.h @@ -74,7 +74,8 @@ #endif // #define SQL_NODE_CREATE_GET_ID "SELECT id FROM " SQL_NODES " ORDER BY id DESC LIMIT 1;" // #define SQL_NODE_CREATE "INSERT INTO " SQL_NODES " (long, lat, username, timestamp) VALUES (%f, %f, %d, %s)" - #define SQL_NODE_CREATE "INSERT INTO " SQL_NODES " (long, lat, username) VALUES (%f, %f, %d)" + #define SQL_NODE_CREATE "INSERT INTO " SQL_NODES " (long, lat, username, timestamp) VALUES (%f, %f, %d, %s%s%s)" + #define SQL_NODE_CREATE_BY_ID "INSERT INTO " SQL_NODES " (long, lat, username, timestamp, id) VALUES (%f, %f, %d, %s%s%s, %d)" #define SQL_NODE_CREATE_NODE_TAG "INSERT INTO node_tags (node, k, v) VALUES (%d, '%s', '%s')" #define SQL_NODE_UPDATE_BY_ID "UPDATE " SQL_NODES " SET long = %f, lat = %f, username = %d, timestamp = %s%s%s WHERE id = %d" #define SQL_NODE_UPDATE_NODE_TAG "UPDATE node_tags SET v = '%s' WHERE node = %d AND k = '%s'" @@ -223,3 +224,7 @@ // #define SQL_WAY_TAGS_BY_BBOX SQL_RELATION_TAGS_BY_BBOX1 " AND k<>'type' AND v<>'way' " SQL_ORDER_BY_RELATION #define SQL_USERID_BY_NAME "SELECT '0';" + + #define SQL_NODE_EXIST "SELECT id FROM " SQL_NODES " WHERE id = %d;" + #define SQL_WAY_EXIST "SELECT id FROM ways WHERE id = %d;" + #define SQL_RELATION_EXIST "SELECT id FROM relations WHERE id = %d;" -- 2.11.4.GIT