static void delete_unused_classes(char osm_type, osmid_t osm_id, struct keyval *places) { int i,sz, slen; PGresult *res; char tmp[16]; char tmp2[2]; char *cls, *clslist = 0; char const *paramValues[2]; tmp2[0] = osm_type; tmp2[1] = '\0'; paramValues[0] = tmp2; snprintf(tmp, sizeof(tmp), "%" PRIdOSMID, osm_id); paramValues[1] = tmp; res = pgsql_execPrepared(ConnectionDelete, "get_classes", 2, paramValues, PGRES_TUPLES_OK); sz = PQntuples(res); if (sz > 0 && !places) { PQclear(res); /* uncondtional delete of all places */ stop_copy(); pgsql_exec(Connection, PGRES_COMMAND_OK, "DELETE FROM place WHERE osm_type = '%c' AND osm_id = %" PRIdOSMID, osm_type, osm_id); } else { for (i = 0; i < sz; i++) { cls = PQgetvalue(res, i, 0); if (!getItem(places, cls)) { if (!clslist) { clslist = malloc(strlen(cls)+3); sprintf(clslist, "'%s'", cls); } else { slen = strlen(clslist); clslist = realloc(clslist, slen + 4 + strlen(cls)); sprintf(&(clslist[slen]), ",'%s'", cls); } } } PQclear(res); if (clslist) { /* Stop any active copy */ stop_copy(); /* Delete all places for this object */ pgsql_exec(Connection, PGRES_COMMAND_OK, "DELETE FROM place WHERE osm_type = '%c' AND osm_id = %" PRIdOSMID " and class = any(ARRAY[%s])", osm_type, osm_id, clslist); free(clslist); } } }
void output_gazetteer_t::delete_place(char osm_type, osmid_t osm_id) { /* Stop any active copy */ stop_copy(); /* Delete all places for this object */ pgsql_exec(Connection, PGRES_COMMAND_OK, "DELETE FROM place WHERE osm_type = '%c' AND osm_id = %" PRIdOSMID, osm_type, osm_id); return; }
void output_gazetteer_t::stop() { /* Stop any active copy */ stop_copy(); /* Commit transaction */ pgsql_exec(Connection, PGRES_COMMAND_OK, "COMMIT"); PQfinish(Connection); if (ConnectionDelete) PQfinish(ConnectionDelete); if (ConnectionError) PQfinish(ConnectionError); return; }
void output_gazetteer_t::delete_unused_classes(char osm_type, osmid_t osm_id) { char tmp2[2]; tmp2[0] = osm_type; tmp2[1] = '\0'; char const *paramValues[2]; paramValues[0] = tmp2; paramValues[1] = (single_fmt % osm_id).str().c_str(); PGresult *res = pgsql_execPrepared(ConnectionDelete, "get_classes", 2, paramValues, PGRES_TUPLES_OK); int sz = PQntuples(res); if (sz > 0 && !places.has_data()) { PQclear(res); /* unconditional delete of all places */ delete_place(osm_type, osm_id); } else { std::string clslist; for (int i = 0; i < sz; i++) { std::string cls(PQgetvalue(res, i, 0)); if (!places.has_place(cls)) { clslist.reserve(clslist.length() + cls.length() + 3); if (!clslist.empty()) clslist += ','; clslist += '\''; clslist += cls; clslist += '\''; } } PQclear(res); if (!clslist.empty()) { /* Stop any active copy */ stop_copy(); /* Delete all places for this object */ pgsql_exec(Connection, PGRES_COMMAND_OK, "DELETE FROM place WHERE osm_type = '%c' AND osm_id = %" PRIdOSMID " and class = any(ARRAY[%s])", osm_type, osm_id, clslist.c_str()); } } }