]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/import.c
replace nominatim C program
[nominatim.git] / nominatim / import.c
diff --git a/nominatim/import.c b/nominatim/import.c
deleted file mode 100644 (file)
index 419ab6a..0000000
+++ /dev/null
@@ -1,856 +0,0 @@
-/*
-*/
-#include <stdlib.h>
-#include <string.h>
-
-#include <libpq-fe.h>
-
-#include <libxml/xmlstring.h>
-#include <libxml/xmlreader.h>
-#include <libxml/hash.h>
-
-#include "nominatim.h"
-#include "import.h"
-#include "input.h"
-
-typedef enum { FILETYPE_NONE, FILETYPE_STRUCTUREDV0P1 } filetypes_t;
-typedef enum { FILEMODE_NONE, FILEMODE_ADD, FILEMODE_UPDATE, FILEMODE_DELETE } filemodes_t;
-
-#define MAX_FEATUREADDRESS 5000
-#define MAX_FEATURENAMES 10000
-#define MAX_FEATUREEXTRATAGS 10000
-#define MAX_FEATURENAMESTRING 1000000
-#define MAX_FEATUREEXTRATAGSTRING 500000
-
-struct feature_address
-{
-    int                        place_id;
-    int                        rankAddress;
-    char                       isAddress[2];
-    xmlChar *  type;
-    xmlChar *  id;
-    xmlChar *  key;
-    xmlChar *  value;
-    xmlChar *  distance;
-};
-
-struct feature_tag
-{
-    xmlChar *  type;
-    xmlChar *  value;
-};
-
-struct feature
-{
-    xmlChar *   placeID;
-    xmlChar *  type;
-    xmlChar *  id;
-    xmlChar *  key;
-    xmlChar *  value;
-    xmlChar *  rankAddress;
-    xmlChar *  rankSearch;
-    xmlChar *  countryCode;
-    xmlChar *  parentPlaceID;
-    xmlChar *  parentType;
-    xmlChar *  parentID;
-    xmlChar *  adminLevel;
-    xmlChar *  houseNumber;
-    xmlChar *  geometry;
-} feature;
-
-int                                    fileType = FILETYPE_NONE;
-int                                    fileMode = FILEMODE_ADD;
-PGconn *                               conn;
-struct feature_address         featureAddress[MAX_FEATUREADDRESS];
-struct feature_tag             featureName[MAX_FEATURENAMES];
-struct feature_tag             featureExtraTag[MAX_FEATUREEXTRATAGS];
-struct feature                         feature;
-int                                    featureAddressLines = 0;
-int                                    featureNameLines = 0;
-int                                    featureExtraTagLines = 0;
-int                                    featureCount = 0;
-xmlHashTablePtr                partionTableTagsHash;
-xmlHashTablePtr                partionTableTagsHashDelete;
-char                                   featureNameString[MAX_FEATURENAMESTRING];
-char                                   featureExtraTagString[MAX_FEATUREEXTRATAGSTRING];
-
-extern int verbose;
-
-void StartElement(xmlTextReaderPtr reader, const xmlChar *name)
-{
-    char * value;
-    float version;
-    int isAddressLine;
-
-    if (fileType == FILETYPE_NONE)
-    {
-        // Potential to handle other file types in the future / versions
-        if (xmlStrEqual(name, BAD_CAST "osmStructured"))
-        {
-            value = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "version");
-            version = strtof(value, NULL);
-            xmlFree(value);
-
-            if (version == (float)0.1)
-            {
-                fileType = FILETYPE_STRUCTUREDV0P1;
-                fileMode = FILEMODE_ADD;
-            }
-            else
-            {
-                fprintf( stderr, "Unknown osmStructured version %f (%s)\n", version, value );
-                exit_nicely();
-            }
-        }
-        else
-        {
-            fprintf( stderr, "Unknown XML document type: %s\n", name );
-            exit_nicely();
-        }
-        return;
-    }
-
-    if (xmlStrEqual(name, BAD_CAST "add"))
-    {
-        fileMode = FILEMODE_ADD;
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "update"))
-    {
-        fileMode = FILEMODE_UPDATE;
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "delete"))
-    {
-        fileMode = FILEMODE_DELETE;
-        return;
-    }
-    if (fileMode == FILEMODE_NONE)
-    {
-        fprintf( stderr, "Unknown import mode in: %s\n", name );
-        exit_nicely();
-    }
-
-    if (xmlStrEqual(name, BAD_CAST "feature"))
-    {
-        feature.placeID = xmlTextReaderGetAttribute(reader, BAD_CAST "place_id");
-        feature.type = xmlTextReaderGetAttribute(reader, BAD_CAST "type");
-        feature.id = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
-        feature.key = xmlTextReaderGetAttribute(reader, BAD_CAST "key");
-        feature.value = xmlTextReaderGetAttribute(reader, BAD_CAST "value");
-        feature.rankAddress = xmlTextReaderGetAttribute(reader, BAD_CAST "rank");
-        feature.rankSearch = xmlTextReaderGetAttribute(reader, BAD_CAST "importance");
-
-        feature.parentPlaceID = xmlTextReaderGetAttribute(reader, BAD_CAST "parent_place_id");
-/*
-       if (strlen(feature.parentPlaceID) == 0)
-       {
-               xmlFree(feature.parentPlaceID);
-               feature.parentPlaceID = NULL;
-       }
-*/
-        feature.parentType = xmlTextReaderGetAttribute(reader, BAD_CAST "parent_type");
-        feature.parentID = xmlTextReaderGetAttribute(reader, BAD_CAST "parent_id");
-
-        feature.countryCode = NULL;
-        feature.adminLevel = NULL;
-        feature.houseNumber = NULL;
-        feature.geometry = NULL;
-        featureAddressLines = 0;
-        featureNameLines = 0;
-        featureExtraTagLines = 0;
-
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "names")) return;
-    if (xmlStrEqual(name, BAD_CAST "name"))
-    {
-        if (featureNameLines < MAX_FEATURENAMES)
-        {
-               featureName[featureNameLines].type = xmlTextReaderGetAttribute(reader, BAD_CAST "type");
-           featureName[featureNameLines].value = xmlTextReaderReadString(reader);
-               featureNameLines++;
-               }
-               else
-               {
-            fprintf( stderr, "Too many name elements (%s%s)\n", feature.type, feature.id);
-//            exit_nicely();
-        }
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "tags")) return;
-    if (xmlStrEqual(name, BAD_CAST "tag"))
-    {
-        if (featureExtraTagLines < MAX_FEATUREEXTRATAGS)
-               {
-               featureExtraTag[featureExtraTagLines].type = xmlTextReaderGetAttribute(reader, BAD_CAST "type");
-           featureExtraTag[featureExtraTagLines].value = xmlTextReaderReadString(reader);
-               featureExtraTagLines++;
-               }
-               else
-        {
-            fprintf( stderr, "Too many extra tag elements (%s%s)\n", feature.type, feature.id);
-//            exit_nicely();
-        }
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "osmGeometry"))
-    {
-        feature.geometry = xmlTextReaderReadString(reader);
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "adminLevel"))
-    {
-        feature.adminLevel = xmlTextReaderReadString(reader);
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "countryCode"))
-    {
-        feature.countryCode = xmlTextReaderReadString(reader);
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "houseNumber"))
-    {
-        feature.houseNumber = xmlTextReaderReadString(reader);
-        return;
-    }
-    if (xmlStrEqual(name, BAD_CAST "address"))
-    {
-        featureAddressLines = 0;
-        return;
-    }
-    isAddressLine = 0;
-    if (xmlStrEqual(name, BAD_CAST "continent"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "sea"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "country"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "state"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "county"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "city"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "town"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "village"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "unknown"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "suburb"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "postcode"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "neighborhood"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "street"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "access"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "building"))
-    {
-        isAddressLine = 1;
-    }
-    else if (xmlStrEqual(name, BAD_CAST "other"))
-    {
-        isAddressLine = 1;
-    }
-    if (isAddressLine)
-    {
-        if (featureAddressLines < MAX_FEATUREADDRESS)
-               {
-               value = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "rank");
-           if (!value)
-               {
-               fprintf( stderr, "Address element missing rank\n");
-                   exit_nicely();
-               }
-           featureAddress[featureAddressLines].rankAddress =  atoi(value);
-               xmlFree(value);
-
-               value = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "isaddress");
-           if (!value)
-               {
-                   fprintf( stderr, "Address element missing rank\n");
-               exit_nicely();
-               }
-               if (*value == 't') strcpy(featureAddress[featureAddressLines].isAddress, "t");
-           else strcpy(featureAddress[featureAddressLines].isAddress, "f");
-               xmlFree(value);
-
-               featureAddress[featureAddressLines].type = xmlTextReaderGetAttribute(reader, BAD_CAST "type");
-           featureAddress[featureAddressLines].id = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
-               featureAddress[featureAddressLines].key = xmlTextReaderGetAttribute(reader, BAD_CAST "key");
-               featureAddress[featureAddressLines].value = xmlTextReaderGetAttribute(reader, BAD_CAST "value");
-           featureAddress[featureAddressLines].distance = xmlTextReaderGetAttribute(reader, BAD_CAST "distance");
-       
-           featureAddressLines++;
-               }
-               else
-        {
-            fprintf( stderr, "Too many address elements (%s%s)\n", feature.type, feature.id);
-//            exit_nicely();
-        }
-
-        return;
-    }
-    fprintf(stderr, "%s: Unknown element name: %s\n", __FUNCTION__, name);
-}
-
-void EndElement(xmlTextReaderPtr reader, const xmlChar *name)
-{
-    PGresult *                 res;
-    const char *       paramValues[14];
-    char *                     place_id;
-    char *                     partionQueryName;
-    int i, namePos, lineTypeLen, lineValueLen;
-
-    if (xmlStrEqual(name, BAD_CAST "feature"))
-    {
-        featureCount++;
-        if (featureCount % 1000 == 0) printf("feature %i(k)\n", featureCount/1000);
-/*
-        if (fileMode == FILEMODE_ADD)
-        {
-            resPlaceID = PQexecPrepared(conn, "get_new_place_id", 0, NULL, NULL, NULL, 0);
-            if (PQresultStatus(resPlaceID) != PGRES_TUPLES_OK)
-            {
-                fprintf(stderr, "get_place_id: INSERT failed: %s", PQerrorMessage(conn));
-                PQclear(resPlaceID);
-                exit(EXIT_FAILURE);
-            }
-        }
-        else
-        {
-            paramValues[0] = (const char *)feature.type;
-            paramValues[1] = (const char *)feature.id;
-            paramValues[2] = (const char *)feature.key;
-            paramValues[3] = (const char *)feature.value;
-            resPlaceID = PQexecPrepared(conn, "get_new_place_id", 4, paramValues, NULL, NULL, 0);
-            if (PQresultStatus(resPlaceID) != PGRES_TUPLES_OK)
-            {
-                fprintf(stderr, "index_placex: INSERT failed: %s", PQerrorMessage(conn));
-                PQclear(resPlaceID);
-                exit(EXIT_FAILURE);
-            }
-        }
-*/
-        place_id = (char *)feature.placeID;
-
-        if (fileMode == FILEMODE_UPDATE || fileMode == FILEMODE_DELETE || fileMode == FILEMODE_ADD)
-        {
-            paramValues[0] = (const char *)place_id;
-            if (verbose) fprintf(stderr, "placex_delete: %s\n", paramValues[0]);
-            res = PQexecPrepared(conn, "placex_delete", 1, paramValues, NULL, NULL, 0);
-            if (PQresultStatus(res) != PGRES_COMMAND_OK)
-            {
-                fprintf(stderr, "placex_delete: DELETE failed: %s", PQerrorMessage(conn));
-                PQclear(res);
-                exit(EXIT_FAILURE);
-            }
-            PQclear(res);
-
-            if (verbose) fprintf(stderr, "search_name_delete: %s\n", paramValues[0]);
-            res = PQexecPrepared(conn, "search_name_delete", 1, paramValues, NULL, NULL, 0);
-            if (PQresultStatus(res) != PGRES_COMMAND_OK)
-            {
-                fprintf(stderr, "search_name_delete: DELETE failed: %s", PQerrorMessage(conn));
-                PQclear(res);
-                exit(EXIT_FAILURE);
-            }
-            PQclear(res);
-
-            if (verbose) fprintf(stderr, "place_addressline_delete: %s\n", paramValues[0]);
-            res = PQexecPrepared(conn, "place_addressline_delete", 1, paramValues, NULL, NULL, 0);
-            if (PQresultStatus(res) != PGRES_COMMAND_OK)
-            {
-                fprintf(stderr, "place_addressline_delete: DELETE failed: %s", PQerrorMessage(conn));
-                PQclear(res);
-                exit(EXIT_FAILURE);
-            }
-            PQclear(res);
-
-            partionQueryName = xmlHashLookup2(partionTableTagsHashDelete, feature.key, feature.value);
-            if (partionQueryName)
-            {
-                res = PQexecPrepared(conn, partionQueryName, 1, paramValues, NULL, NULL, 0);
-                if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                {
-                    fprintf(stderr, "%s: DELETE failed: %s", partionQueryName, PQerrorMessage(conn));
-                    PQclear(res);
-                    exit(EXIT_FAILURE);
-                }
-                PQclear(res);
-            }
-        }
-
-        if (fileMode == FILEMODE_UPDATE || fileMode == FILEMODE_ADD)
-        {
-            // Insert into placex
-            paramValues[0] = (const char *)place_id;
-            paramValues[1] = (const char *)feature.type;
-            paramValues[2] = (const char *)feature.id;
-            paramValues[3] = (const char *)feature.key;
-            paramValues[4] = (const char *)feature.value;
-
-            featureNameString[0] = 0;
-            if (featureNameLines)
-            {
-                namePos = 0;
-                lineTypeLen = 0;
-                lineValueLen = 0;
-                for (i = 0; i < featureNameLines; i++)
-                {
-                    lineTypeLen = (int)strlen((char *) featureName[i].type);
-                    lineValueLen = (int)strlen((char *) featureName[i].value);
-                    if (namePos+lineTypeLen+lineValueLen+7 > MAX_FEATURENAMESTRING)
-                    {
-                        fprintf(stderr, "feature name too long: %s", (const char *)featureName[i].value);
-                        break;
-                    }
-                    if (namePos) strcpy(featureNameString+(namePos++), ",");
-                    strcpy(featureNameString+(namePos++), "\"");
-                    strcpy(featureNameString+namePos, (char*) featureName[i].type);
-                    namePos += lineTypeLen;
-                    strcpy(featureNameString+namePos, "\"=>\"");
-                    namePos += 4;
-                    strcpy(featureNameString+namePos, (char *) featureName[i].value);
-                    namePos += lineValueLen;
-                    strcpy(featureNameString+(namePos++), "\"");
-
-                    xmlFree(featureName[i].type);
-                    xmlFree(featureName[i].value);
-                }
-            }
-            paramValues[5] = (const char *)featureNameString;
-
-            paramValues[6] = (const char *)feature.countryCode;
-
-            featureExtraTagString[0] = 0;
-            if (featureExtraTagLines)
-            {
-                namePos = 0;
-                lineTypeLen = 0;
-                lineValueLen = 0;
-                for (i = 0; i < featureExtraTagLines; i++)
-                {
-                    lineTypeLen = strlen((char *) featureExtraTag[i].type);
-                    lineValueLen = strlen((char *) featureExtraTag[i].value);
-                    if (namePos+lineTypeLen+lineValueLen+7 > MAX_FEATUREEXTRATAGSTRING)
-                    {
-                        fprintf(stderr, "feature extra tag too long: %s", (const char *)featureExtraTag[i].value);
-                        break;
-                    }
-                    if (namePos) strcpy(featureExtraTagString+(namePos++),",");
-                    strcpy(featureExtraTagString+(namePos++), "\"");
-                    strcpy(featureExtraTagString+namePos, (char *) featureExtraTag[i].type);
-                    namePos += lineTypeLen;
-                    strcpy(featureExtraTagString+namePos, "\"=>\"");
-                    namePos += 4;
-                    strcpy(featureExtraTagString+namePos, (char *) featureExtraTag[i].value);
-                    namePos += lineValueLen;
-                    strcpy(featureExtraTagString+(namePos++), "\"");
-
-                    xmlFree(featureExtraTag[i].type);
-                    xmlFree(featureExtraTag[i].value);
-                }
-            }
-            paramValues[7] = (const char *)featureExtraTagString;
-
-            if (xmlStrlen(feature.parentPlaceID) == 0)
-                paramValues[8] = "0";
-            else
-                paramValues[8] = (const char *)feature.parentPlaceID;
-
-            paramValues[9] = (const char *)feature.adminLevel;
-            paramValues[10] = (const char *)feature.houseNumber;
-            paramValues[11] = (const char *)feature.rankAddress;
-            paramValues[12] = (const char *)feature.rankSearch;
-            paramValues[13] = (const char *)feature.geometry;
-            if (strlen(paramValues[3]) && strlen(paramValues[13]))
-            {
-                if (verbose) fprintf(stderr, "placex_insert: %s\n", paramValues[0]);
-                res = PQexecPrepared(conn, "placex_insert", 14, paramValues, NULL, NULL, 0);
-                if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                {
-                    fprintf(stderr, "index_placex: INSERT failed: %s", PQerrorMessage(conn));
-                    fprintf(stderr, "index_placex: INSERT failed: %s %s %s", paramValues[0], paramValues[1], paramValues[2]);
-                    PQclear(res);
-                    exit(EXIT_FAILURE);
-               }
-               PQclear(res);
-            }
-
-            for (i = 0; i < featureAddressLines; i++)
-            {
-                // insert into place_address
-                paramValues[0] = (const char *)place_id;
-                paramValues[1] = (const char *)featureAddress[i].distance;
-                if (paramValues[1] == NULL || strlen(paramValues[1]) == 0) paramValues[1] = "0";
-                paramValues[2] = (const char *)featureAddress[i].type;
-                paramValues[3] = (const char *)featureAddress[i].id;
-                paramValues[4] = (const char *)featureAddress[i].key;
-                paramValues[5] = (const char *)featureAddress[i].value;
-                paramValues[6] = (const char *)featureAddress[i].isAddress;
-                if (verbose) fprintf(stderr, "placex_insert: %s %s\n", paramValues[2], paramValues[3]);
-                res = PQexecPrepared(conn, "place_addressline_insert", 7, paramValues, NULL, NULL, 0);
-                if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                {
-                    fprintf(stderr, "place_addressline_insert: INSERT failed: %s", PQerrorMessage(conn));
-                    fprintf(stderr, "(%s,%s,%s,%s,%s,%s,%s)",paramValues[0],paramValues[1],paramValues[2],paramValues[3],paramValues[4],paramValues[5],paramValues[6]);
-                    PQclear(res);
-                    exit(EXIT_FAILURE);
-                }
-                PQclear(res);
-
-                xmlFree(featureAddress[i].type);
-                xmlFree(featureAddress[i].id);
-                xmlFree(featureAddress[i].key);
-                xmlFree(featureAddress[i].value);
-                xmlFree(featureAddress[i].distance);
-            }
-
-            if (featureNameLines)
-            {
-                if (xmlStrlen(feature.parentPlaceID) > 0 && featureAddressLines == 0)
-               {
-                    paramValues[0] = (const char *)place_id;
-                    paramValues[1] = (const char *)feature.parentPlaceID;
-                    if (verbose) fprintf(stderr, "search_name_from_parent_insert: INSERT %s %s\n", paramValues[0], paramValues[1]);
-                    res = PQexecPrepared(conn, "search_name_from_parent_insert", 2, paramValues, NULL, NULL, 0);
-                    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                    {
-                        fprintf(stderr, "search_name_from_parent_insert: INSERT failed: %s", PQerrorMessage(conn));
-                        PQclear(res);
-                        exit(EXIT_FAILURE);
-                    }
-                    PQclear(res);
-               }
-               else
-               {
-                    paramValues[0] = (const char *)place_id;
-                    if (verbose) fprintf(stderr, "search_name_insert: INSERT %s\n", paramValues[0]);
-                    res = PQexecPrepared(conn, "search_name_insert", 1, paramValues, NULL, NULL, 0);
-                    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                    {
-                        fprintf(stderr, "search_name_insert: INSERT failed: %s", PQerrorMessage(conn));
-                        PQclear(res);
-                        exit(EXIT_FAILURE);
-                    }
-                    PQclear(res);
-                }
-            }
-
-            partionQueryName = xmlHashLookup2(partionTableTagsHash, feature.key, feature.value);
-            if (partionQueryName)
-            {
-                // insert into partition table
-                paramValues[0] = (const char *)place_id;
-                paramValues[1] = (const char *)feature.geometry;
-                res = PQexecPrepared(conn, partionQueryName, 2, paramValues, NULL, NULL, 0);
-                if (PQresultStatus(res) != PGRES_COMMAND_OK)
-                {
-                    fprintf(stderr, "%s: INSERT failed: %s", partionQueryName, PQerrorMessage(conn));
-                    PQclear(res);
-                    exit(EXIT_FAILURE);
-                }
-                PQclear(res);
-            }
-
-        }
-        else
-        {
-            for (i = 0; i < featureAddressLines; i++)
-            {
-                xmlFree(featureAddress[i].type);
-                xmlFree(featureAddress[i].id);
-                xmlFree(featureAddress[i].key);
-                xmlFree(featureAddress[i].value);
-                xmlFree(featureAddress[i].distance);
-            }
-        }
-
-        xmlFree(feature.placeID);
-        xmlFree(feature.type);
-        xmlFree(feature.id);
-        xmlFree(feature.key);
-        xmlFree(feature.value);
-        xmlFree(feature.rankAddress);
-        xmlFree(feature.rankSearch);
-        if (feature.countryCode) xmlFree(feature.countryCode);
-       if (feature.parentPlaceID) xmlFree(feature.parentPlaceID);
-       if (feature.parentType) xmlFree(feature.parentType);
-       if (feature.parentID) xmlFree(feature.parentID);
-//             if (feature.name) xmlFree(feature.name);
-        if (feature.adminLevel) xmlFree(feature.adminLevel);
-        if (feature.houseNumber) xmlFree(feature.houseNumber);
-        if (feature.geometry) xmlFree(feature.geometry);
-
-//        PQclear(resPlaceID);
-    }
-}
-
-static void processNode(xmlTextReaderPtr reader)
-{
-    xmlChar *name;
-    name = xmlTextReaderName(reader);
-    if (name == NULL)
-    {
-        name = xmlStrdup(BAD_CAST "--");
-    }
-
-    switch (xmlTextReaderNodeType(reader))
-    {
-    case XML_READER_TYPE_ELEMENT:
-        StartElement(reader, name);
-        if (xmlTextReaderIsEmptyElement(reader))
-            EndElement(reader, name); /* No end_element for self closing tags! */
-        break;
-    case XML_READER_TYPE_END_ELEMENT:
-        EndElement(reader, name);
-        break;
-    case XML_READER_TYPE_TEXT:
-    case XML_READER_TYPE_CDATA:
-    case XML_READER_TYPE_SIGNIFICANT_WHITESPACE:
-        /* Ignore */
-        break;
-    default:
-        fprintf(stderr, "Unknown node type %d\n", xmlTextReaderNodeType(reader));
-        break;
-    }
-
-    xmlFree(name);
-}
-
-int nominatim_import(const char *conninfo, const char *partionTagsFilename, const char *filename)
-{
-    xmlTextReaderPtr   reader;
-    int                                ret = 0;
-    PGresult *                         res;
-    FILE *                             partionTagsFile;
-    char *                             partionQueryName;
-    char                               partionQuerySQL[1024];
-
-    conn = PQconnectdb(conninfo);
-    if (PQstatus(conn) != CONNECTION_OK)
-    {
-        fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    partionTableTagsHash = xmlHashCreate(200);
-    partionTableTagsHashDelete = xmlHashCreate(200);
-
-    partionTagsFile = fopen(partionTagsFilename, "rt");
-    if (!partionTagsFile)
-    {
-        fprintf(stderr, "Unable to read partition tags file: %s\n", partionTagsFilename);
-        exit(EXIT_FAILURE);
-    }
-
-    char buffer[1024], osmkey[256], osmvalue[256];
-    int fields;
-    while (fgets(buffer, sizeof(buffer), partionTagsFile) != NULL)
-    {
-        fields = sscanf( buffer, "%23s %63s", osmkey, osmvalue );
-
-        if ( fields <= 0 ) continue;
-
-        if ( fields != 2  )
-        {
-            fprintf( stderr, "Error partition file\n");
-            exit_nicely();
-        }
-        partionQueryName = malloc(strlen("partition_insert_")+strlen(osmkey)+strlen(osmvalue)+2);
-        strcpy(partionQueryName, "partition_insert_");
-        strcat(partionQueryName, osmkey);
-        strcat(partionQueryName, "_");
-        strcat(partionQueryName, osmvalue);
-
-        strcpy(partionQuerySQL, "insert into place_classtype_");
-        strcat(partionQuerySQL, osmkey);
-        strcat(partionQuerySQL, "_");
-        strcat(partionQuerySQL, osmvalue);
-        strcat(partionQuerySQL, " (place_id, centroid) values ($1, ST_Centroid(st_setsrid($2, 4326)))");
-
-        res = PQprepare(conn, partionQueryName, partionQuerySQL, 2, NULL);
-        if (PQresultStatus(res) != PGRES_COMMAND_OK)
-        {
-            fprintf(stderr, "Failed to prepare %s: %s\n", partionQueryName, PQerrorMessage(conn));
-            exit(EXIT_FAILURE);
-        }
-
-        xmlHashAddEntry2(partionTableTagsHash, BAD_CAST osmkey, BAD_CAST osmvalue, BAD_CAST partionQueryName);
-
-        partionQueryName = malloc(strlen("partition_delete_")+strlen(osmkey)+strlen(osmvalue)+2);
-        strcpy(partionQueryName, "partition_delete_");
-        strcat(partionQueryName, osmkey);
-        strcat(partionQueryName, "_");
-        strcat(partionQueryName, osmvalue);
-
-        strcpy(partionQuerySQL, "delete from place_classtype_");
-        strcat(partionQuerySQL, osmkey);
-        strcat(partionQuerySQL, "_");
-        strcat(partionQuerySQL, osmvalue);
-        strcat(partionQuerySQL, " where place_id = $1::integer");
-
-        res = PQprepare(conn, partionQueryName, partionQuerySQL, 1, NULL);
-        if (PQresultStatus(res) != PGRES_COMMAND_OK)
-        {
-            fprintf(stderr, "Failed to prepare %s: %s\n", partionQueryName, PQerrorMessage(conn));
-            exit(EXIT_FAILURE);
-        }
-
-        xmlHashAddEntry2(partionTableTagsHashDelete, BAD_CAST osmkey, BAD_CAST osmvalue, BAD_CAST partionQueryName);
-    }
-
-    res = PQprepare(conn, "get_new_place_id",
-                    "select nextval('seq_place')",
-                    0, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare get_new_place_id: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "get_place_id",
-                    "select place_id from placex where osm_type = $1 and osm_id = $2 and class = $3 and type = $4",
-                    4, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare get_place_id: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "placex_insert",
-                    "insert into placex (place_id,osm_type,osm_id,class,type,name,country_code,extratags,parent_place_id,admin_level,housenumber,rank_address,rank_search,geometry) "
-                    "values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, st_setsrid($14, 4326))",
-                    12, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare placex_insert: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "search_name_insert",
-                    "insert into search_name (place_id, search_rank, address_rank, country_code, name_vector, nameaddress_vector, centroid) "
-                    "select place_id, rank_search, rank_address, country_code, make_keywords(name), "
-                    "(select uniq(sort(array_agg(parent_search_name.name_vector))) from search_name as parent_search_name where place_id in "
-                     "(select distinct address_place_id from place_addressline where place_addressline.place_id = $1 limit 1000)"
-                    "), st_centroid(geometry) from placex "
-                    "where place_id = $1",
-                    1, NULL);
-
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare search_name_insert: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "search_name_from_parent_insert",
-                    "insert into search_name (place_id, search_rank, address_rank, country_code, name_vector, nameaddress_vector, centroid) "
-                    "select place_id, rank_search, rank_address, country_code, make_keywords(name), "
-                    "(select uniq(sort(name_vector+nameaddress_vector)) from search_name as parent_search_name "
-                    "where parent_search_name.place_id = $2 ), st_centroid(geometry) from placex "
-                    "where place_id = $1",
-                    2, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare search_name_insert: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "place_addressline_insert",
-                    "insert into place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address) "
-                    "select $1, place_id, false, $7, $2, rank_address from placex where osm_type = $3 and osm_id = $4 and class = $5 and type = $6",
-                    7, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare place_addressline_insert: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "placex_delete",
-                    "delete from placex where place_id = $1",
-                    1, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare placex_delete: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "search_name_delete",
-                    "delete from search_name where place_id = $1",
-                    1, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare search_name_delete: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    res = PQprepare(conn, "place_addressline_delete",
-                    "delete from place_addressline where place_id = $1",
-                    1, NULL);
-    if (PQresultStatus(res) != PGRES_COMMAND_OK)
-    {
-        fprintf(stderr, "Failed to prepare place_addressline_delete: %s\n", PQerrorMessage(conn));
-        exit(EXIT_FAILURE);
-    }
-
-    featureCount = 0;
-
-    reader = inputUTF8(filename);
-
-    if (reader == NULL)
-    {
-        fprintf(stderr, "Unable to open %s\n", filename);
-        return 1;
-    }
-
-    ret = xmlTextReaderRead(reader);
-    while (ret == 1)
-    {
-        processNode(reader);
-        ret = xmlTextReaderRead(reader);
-    }
-    if (ret != 0)
-    {
-        fprintf(stderr, "%s : failed to parse\n", filename);
-        return ret;
-    }
-
-    xmlFreeTextReader(reader);
-    xmlHashFree(partionTableTagsHash, NULL);
-    xmlHashFree(partionTableTagsHashDelete, NULL);
-
-    return 0;
-}