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; }
static void copy_error_data(const char *sql) { unsigned int sqlLen = strlen(sql); if (hLog) fprintf(hLog, "%s", sql); /* Make sure we have an active copy */ if (!CopyErrorActive) { pgsql_exec(ConnectionError, PGRES_COPY_IN, "COPY import_polygon_error (osm_type, osm_id, class, type, name, country_code, updated, errormessage, prevgeometry, newgeometry) FROM stdin;"); CopyErrorActive = 1; } /* If the combination of old and new data is too big, flush old data */ if (BufferErrorLen + sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("import_polygon_error", ConnectionError, BufferError); BufferErrorLen = 0; } /* * If new data by itself is too big, output it immediately, * otherwise just add it to the buffer. */ if (sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("import_polygon_error", ConnectionError, sql); sqlLen = 0; } else if (sqlLen > 0) { strcpy(BufferError + BufferErrorLen, sql); BufferErrorLen += sqlLen; sqlLen = 0; } /* If we have completed a line, output it */ if (BufferErrorLen > 0 && BufferError[BufferErrorLen-1] == '\n') { pgsql_CopyData("place", ConnectionError, BufferError); BufferErrorLen = 0; } return; }
static void copy_data(const char *sql) { unsigned int sqlLen = strlen(sql); /* Make sure we have an active copy */ if (!CopyActive) { pgsql_exec(Connection, PGRES_COPY_IN, "COPY place FROM STDIN"); CopyActive = 1; } /* If the combination of old and new data is too big, flush old data */ if (BufferLen + sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("place", Connection, Buffer); BufferLen = 0; } /* * If new data by itself is too big, output it immediately, * otherwise just add it to the buffer. */ if (sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("Place", Connection, sql); sqlLen = 0; } else if (sqlLen > 0) { strcpy(Buffer + BufferLen, sql); BufferLen += sqlLen; sqlLen = 0; } /* If we have completed a line, output it */ if (BufferLen > 0 && Buffer[BufferLen-1] == '\n') { pgsql_CopyData("place", Connection, Buffer); BufferLen = 0; } return; }
void output_gazetteer_t::copy_data(const char *sql) { unsigned int sqlLen = strlen(sql); /* Make sure we have an active copy */ if (!CopyActive) { pgsql_exec(Connection, PGRES_COPY_IN, "COPY place (osm_type, osm_id, class, type, name, admin_level, housenumber, street, addr_place, isin, postcode, country_code, extratags, geometry) FROM STDIN"); CopyActive = 1; } /* If the combination of old and new data is too big, flush old data */ if (BufferLen + sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("place", Connection, Buffer); BufferLen = 0; } /* * If new data by itself is too big, output it immediately, * otherwise just add it to the buffer. */ if (sqlLen > BUFFER_SIZE - 10) { pgsql_CopyData("Place", Connection, sql); sqlLen = 0; } else if (sqlLen > 0) { strcpy(Buffer + BufferLen, sql); BufferLen += sqlLen; sqlLen = 0; } /* If we have completed a line, output it */ if (BufferLen > 0 && Buffer[BufferLen-1] == '\n') { pgsql_CopyData("place", Connection, Buffer); BufferLen = 0; } 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()); } } }
int output_gazetteer_t::start() { int srid = m_options.projection->target_srs(); builder.set_exclude_broken_polygon(m_options.excludepoly); places.srid_str = (boost::format("SRID=%1%;") % srid).str(); if(connect()) util::exit_nicely(); /* Start a transaction */ pgsql_exec(Connection, PGRES_COMMAND_OK, "BEGIN"); /* (Re)create the table unless we are appending */ if (!m_options.append) { /* Drop any existing table */ pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TABLE IF EXISTS place"); /* Create the new table */ if (m_options.tblsmain_data) { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_TABLE, "TABLESPACE", m_options.tblsmain_data->c_str()); } else { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_TABLE, "", ""); } if (m_options.tblsmain_index) { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_ID_INDEX, "TABLESPACE", m_options.tblsmain_index->c_str()); } else { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_ID_INDEX, "", ""); } pgsql_exec(Connection, PGRES_TUPLES_OK, "SELECT AddGeometryColumn('place', 'geometry', %d, 'GEOMETRY', 2)", srid); pgsql_exec(Connection, PGRES_COMMAND_OK, "ALTER TABLE place ALTER COLUMN geometry SET NOT NULL"); } return 0; }
int output_gazetteer_t::connect() { /* Connection to the database */ Connection = PQconnectdb(m_options.database_options.conninfo().c_str()); /* Check to see that the backend connection was successfully made */ if (PQstatus(Connection) != CONNECTION_OK) { std::cerr << "Connection to database failed: " << PQerrorMessage(Connection) << "\n"; return 1; } if (m_options.append) { ConnectionDelete = PQconnectdb(m_options.database_options.conninfo().c_str()); if (PQstatus(ConnectionDelete) != CONNECTION_OK) { std::cerr << "Connection to database failed: " << PQerrorMessage(Connection) << "\n"; return 1; } pgsql_exec(ConnectionDelete, PGRES_COMMAND_OK, "PREPARE get_classes (CHAR(1), " POSTGRES_OSMID_TYPE ") AS SELECT class FROM place WHERE osm_type = $1 and osm_id = $2"); } return 0; }
int output_gazetteer_t::start() { reproj = m_options.projection; builder.set_exclude_broken_polygon(m_options.excludepoly); if(connect()) util::exit_nicely(); /* Start a transaction */ pgsql_exec(Connection, PGRES_COMMAND_OK, "BEGIN"); /* (Re)create the table unless we are appending */ if (!m_options.append) { /* Drop any existing table */ pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TABLE IF EXISTS place"); pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TYPE if exists keyvalue cascade"); pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TYPE if exists wordscore cascade"); pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TYPE if exists stringlanguagetype cascade"); pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP TYPE if exists keyvaluetype cascade"); pgsql_exec(Connection, PGRES_COMMAND_OK, "DROP FUNCTION IF EXISTS get_connected_ways(integer[])"); /* Create types and functions */ pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_KEYVALUETYPE_TYPE); pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_WORDSCORE_TYPE); /* Create the new table */ if (m_options.tblsmain_data) { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_TABLE, "TABLESPACE", m_options.tblsmain_data->c_str()); } else { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_TABLE, "", ""); } if (m_options.tblsmain_index) { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_ID_INDEX, "TABLESPACE", m_options.tblsmain_index->c_str()); } else { pgsql_exec(Connection, PGRES_COMMAND_OK, CREATE_PLACE_ID_INDEX, "", ""); } pgsql_exec(Connection, PGRES_TUPLES_OK, "SELECT AddGeometryColumn('place', 'geometry', %d, 'GEOMETRY', 2)", SRID); pgsql_exec(Connection, PGRES_COMMAND_OK, "ALTER TABLE place ALTER COLUMN geometry SET NOT NULL"); } return 0; }