Use 64 bit integers for object ID values
authorTom Hughes <tom@compton.nu>
Thu, 14 Feb 2013 11:34:22 +0000 (11:34 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 14 Feb 2013 11:42:57 +0000 (11:42 +0000)
Makefile
output_osm.c
output_osm.h
planet06_pg.cpp

index 4426508..b5eaba7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,4 +26,4 @@ planet06_pg: planet06_pg.o users.o keyvals.o output_osm.o
        $(CXX) -o $@ $^ $(PGSQL_LDFLAGS)
 
 %.o: %.cpp
        $(CXX) -o $@ $^ $(PGSQL_LDFLAGS)
 
 %.o: %.cpp
-       $(CXX) $(PGSQL_CFLAGS) -o $@ -c $<
+       $(CXX) $(PGSQL_CFLAGS) -std=c++11 -o $@ -c $<
index 5a7ed24..bf7fc6d 100644 (file)
@@ -1,10 +1,13 @@
-#include "output_osm.h"
 #include <string.h>
 #include <assert.h>
 #include <string.h>
 #include <assert.h>
+#include <inttypes.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 
+#include "output_osm.h"
+
 #define INDENT "  "
 
 #ifdef USE_ICONV
 #define INDENT "  "
 
 #ifdef USE_ICONV
@@ -99,11 +102,11 @@ void osm_tags(struct keyval *tags)
    resetList(tags);
 }
 
    resetList(tags);
 }
 
-void osm_changeset(int id, const char *user, const char *created_at, const char *closed_at, 
+void osm_changeset(int64_t id, const char *user, const char *created_at, const char *closed_at, 
            int num_changes, int has_bbox, 
                   long double min_lat, long double max_lat, long double min_lon, long double max_lon, 
                   int open, struct keyval *tags) {
            int num_changes, int has_bbox, 
                   long double min_lat, long double max_lat, long double min_lon, long double max_lon, 
                   int open, struct keyval *tags) {
-  printf(INDENT "<changeset id=\"%d\" created_at=\"%s\" num_changes=\"%d\" ", id, created_at, num_changes);
+  printf(INDENT "<changeset id=\""PRId64"\" created_at=\"%s\" num_changes=\"%d\" ", id, created_at, num_changes);
   if (open) {
     printf("open=\"true\" ");
   } else {
   if (open) {
     printf("open=\"true\" ");
   } else {
@@ -123,10 +126,10 @@ void osm_changeset(int id, const char *user, const char *created_at, const char
   }
 }
 
   }
 }
 
-void osm_node(int id, long double lat, long double lon, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
+void osm_node(int64_t id, long double lat, long double lon, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
 {
   if (listHasData(tags)) {
 {
   if (listHasData(tags)) {
-    printf(INDENT "<node id=\"%d\" lat=\"%.7Lf\" lon=\"%.7Lf\" "
+    printf(INDENT "<node id=\""PRId64"\" lat=\"%.7Lf\" lon=\"%.7Lf\" "
           "timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", 
           id, lat, lon, ts, version, changeset, user);
     osm_tags(tags);
           "timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", 
           id, lat, lon, ts, version, changeset, user);
     osm_tags(tags);
@@ -138,12 +141,12 @@ void osm_node(int id, long double lat, long double lon, struct keyval *tags, con
   }
 }
 
   }
 }
 
-void osm_way(int id, struct keyval *nodes, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
+void osm_way(int64_t id, struct keyval *nodes, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
 {
   struct keyval *p;
   
   if (listHasData(tags) || listHasData(nodes)) {
 {
   struct keyval *p;
   
   if (listHasData(tags) || listHasData(nodes)) {
-    printf(INDENT "<way id=\"%d\" timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", id, ts, version, changeset, user);
+    printf(INDENT "<way id=\""PRId64"\" timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", id, ts, version, changeset, user);
     while ((p = popItem(nodes)) != NULL) {
       printf(INDENT INDENT "<nd ref=\"%s\" />\n", p->value);
       freeItem(p);
     while ((p = popItem(nodes)) != NULL) {
       printf(INDENT INDENT "<nd ref=\"%s\" />\n", p->value);
       freeItem(p);
@@ -155,12 +158,12 @@ void osm_way(int id, struct keyval *nodes, struct keyval *tags, const char *ts,
   }
 }
 
   }
 }
 
-void osm_relation(int id, struct keyval *members, struct keyval *roles, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
+void osm_relation(int64_t id, struct keyval *members, struct keyval *roles, struct keyval *tags, const char *ts, const char *user, int version, int changeset)
 {
   struct keyval *p, *q;
   
   if (listHasData(tags) || listHasData(members)) {
 {
   struct keyval *p, *q;
   
   if (listHasData(tags) || listHasData(members)) {
-    printf(INDENT "<relation id=\"%d\" timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", id, ts, version, changeset, user);
+    printf(INDENT "<relation id=\""PRId64"\" timestamp=\"%s\" version=\"%d\" changeset=\"%d\"%s>\n", id, ts, version, changeset, user);
     while (((p = popItem(members)) != NULL) && ((q = popItem(roles)) != NULL)) {
       char *m_type = p->key;
       char *i; 
     while (((p = popItem(members)) != NULL) && ((q = popItem(roles)) != NULL)) {
       char *m_type = p->key;
       char *i; 
index 35103f4..9382e00 100644 (file)
@@ -9,19 +9,19 @@
  */
 const char *xmlescape(const char *in);
 
  */
 const char *xmlescape(const char *in);
 
-void osm_changeset(int id, const char *user, const char *created_at, const char *closed_at, 
+void osm_changeset(int64_t id, const char *user, const char *created_at, const char *closed_at, 
            int num_changes, int has_bbox, 
                   long double min_lat, long double max_lat, long double min_lon, long double max_lon, 
                   int open, struct keyval *tags);
 
            int num_changes, int has_bbox, 
                   long double min_lat, long double max_lat, long double min_lon, long double max_lon, 
                   int open, struct keyval *tags);
 
-void osm_node(int id, 
+void osm_node(int64_t id, 
              long double lat, long double lon, 
              struct keyval *tags, const char *ts, 
              const char *user, int version, int changeset);
 
 /* nodes are "tags" of "" -> node id.
  */
              long double lat, long double lon, 
              struct keyval *tags, const char *ts, 
              const char *user, int version, int changeset);
 
 /* nodes are "tags" of "" -> node id.
  */
-void osm_way(int id, 
+void osm_way(int64_t id, 
             struct keyval *nodes, 
             struct keyval *tags, const char *ts, 
             const char *user, int version, int changeset);
             struct keyval *nodes, 
             struct keyval *tags, const char *ts, 
             const char *user, int version, int changeset);
@@ -29,7 +29,7 @@ void osm_way(int id,
 /* members are "tags" of type -> id, roles are "tags" of "" -> role
  * in the same order as members.
  */
 /* members are "tags" of type -> id, roles are "tags" of "" -> role
  * in the same order as members.
  */
-void osm_relation(int id, 
+void osm_relation(int64_t id, 
                  struct keyval *members, struct keyval *roles, 
                  struct keyval *tags, const char *ts, 
                  const char *user, int version, int changeset);
                  struct keyval *members, struct keyval *roles, 
                  struct keyval *tags, const char *ts, 
                  const char *user, int version, int changeset);
index 099eac2..775c63b 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdarg.h>
 #include <assert.h>
 #include <cstdlib>
 #include <stdarg.h>
 #include <assert.h>
 #include <cstdlib>
+#include <cstdint>
 
 #include "users.hpp"
 extern "C" {
 
 #include "users.hpp"
 extern "C" {
@@ -144,13 +145,13 @@ protected:
  * tags out of the table.
  */
 struct tag_stream 
  * tags out of the table.
  */
 struct tag_stream 
-  : public table_stream<int> {
+  : public table_stream<int64_t> {
 
    tag_stream(pqxx::work &x, const char *table, const char *type) 
 
    tag_stream(pqxx::work &x, const char *table, const char *type) 
-      : table_stream<int>(x, query(table, type), "fetch_tags") {
+      : table_stream<int64_t>(x, query(table, type), "fetch_tags") {
   }
 
   }
 
-  bool get(int id, struct keyval *kv) {
+  bool get(int64_t id, struct keyval *kv) {
     bool has_tags = find_id(id);
     resetList(kv);
     if (has_tags) {
     bool has_tags = find_id(id);
     resetList(kv);
     if (has_tags) {
@@ -176,14 +177,14 @@ private:
  * keyval struct that the output functions are expecting.
  */
 struct way_node_stream 
  * keyval struct that the output functions are expecting.
  */
 struct way_node_stream 
-  : public table_stream<int> {
+  : public table_stream<int64_t> {
 
   way_node_stream(pqxx::work &x) 
 
   way_node_stream(pqxx::work &x) 
-    : table_stream<int>(x, "select way_id, node_id from current_way_nodes "
-                       "ORDER BY way_id, sequence_id", "fetch_way_nodes") {
+    : table_stream<int64_t>(x, "select way_id, node_id from current_way_nodes "
+                           "ORDER BY way_id, sequence_id", "fetch_way_nodes") {
   }
 
   }
 
-  bool get(int id, struct keyval *kv) {
+  bool get(int64_t id, struct keyval *kv) {
     bool has_nodes = find_id(id);
     resetList(kv);
     if (has_nodes) {
     bool has_nodes = find_id(id);
     resetList(kv);
     if (has_nodes) {
@@ -201,15 +202,15 @@ struct way_node_stream
  * pair of keyval structs that the output functions are expecting.
  */
 struct relation_member_stream 
  * pair of keyval structs that the output functions are expecting.
  */
 struct relation_member_stream 
-  : public table_stream<int> {
+  : public table_stream<int64_t> {
 
   relation_member_stream(pqxx::work &x) 
 
   relation_member_stream(pqxx::work &x) 
-    : table_stream<int>(x, "select relation_id, member_id, member_type, "
-                       "member_role from current_relation_members "
-                       "ORDER BY relation_id, sequence_id", "fetch_relation_members") {
+    : table_stream<int64_t>(x, "select relation_id, member_id, member_type, "
+                           "member_role from current_relation_members "
+                           "ORDER BY relation_id, sequence_id", "fetch_relation_members") {
   }
 
   }
 
-  bool get(int id, struct keyval *members, struct keyval *roles) {
+  bool get(int64_t id, struct keyval *members, struct keyval *roles) {
     bool has_members = find_id(id);
     resetList(members);
     resetList(roles);
     bool has_members = find_id(id);
     resetList(members);
     resetList(roles);
@@ -244,7 +245,7 @@ void changesets(pqxx::work &xaction) {
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
       const pqxx::result::tuple &row = *itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
       const pqxx::result::tuple &row = *itr;
-      const int id = row[0].as<int>();
+      const int64_t id = row[0].as<int64_t>();
       const int num_changes = row[4].as<int>();
       const bool null_bbox = row[5].is_null() || row[6].is_null() || row[7].is_null() || row[8].is_null();
 
       const int num_changes = row[4].as<int>();
       const bool null_bbox = row[5].is_null() || row[6].is_null() || row[7].is_null() || row[8].is_null();
 
@@ -291,9 +292,10 @@ void nodes(pqxx::work &xaction) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
-      int id, version, latitude, longitude, changeset;
+      int64_t id;
+      int version, latitude, longitude, changeset;
 
 
-      if (!(*itr)[0].to<int>(id)) {
+      if (!(*itr)[0].to<int64_t>(id)) {
        throw std::runtime_error("Node ID is not numeric.");
       }
       if (!(*itr)[1].to<int>(latitude)) {
        throw std::runtime_error("Node ID is not numeric.");
       }
       if (!(*itr)[1].to<int>(latitude)) {
@@ -342,9 +344,10 @@ void ways(pqxx::work &xaction) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
-      int id, version, changeset;
+      int64_t id;
+      int version, changeset;
 
 
-      if (!(*itr)[0].to<int>(id)) {
+      if (!(*itr)[0].to<int64_t>(id)) {
        throw std::runtime_error("Node ID is not numeric.");
       }
       if (!(*itr)[3].to<int>(version)) {
        throw std::runtime_error("Node ID is not numeric.");
       }
       if (!(*itr)[3].to<int>(version)) {
@@ -388,9 +391,10 @@ void relations(pqxx::work &xaction) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
     const pqxx::result &res = *ic_itr;
     for (pqxx::result::const_iterator itr = res.begin();
         itr != res.end(); ++itr) {
-      int id, version, changeset;
+      int64_t id;
+      int version, changeset;
 
 
-      if (!(*itr)[0].to<int>(id)) {
+      if (!(*itr)[0].to<int64_t>(id)) {
        throw std::runtime_error("Relation ID is not numeric.");
       }
       if (!(*itr)[3].to<int>(version)) {
        throw std::runtime_error("Relation ID is not numeric.");
       }
       if (!(*itr)[3].to<int>(version)) {