]> git.openstreetmap.org Git - rails.git/blobdiff - db/migrate/013_populate_node_tags_and_remove_helper.c
api06: Fix tag parsing in the node-tags-normalization helper, as suggested by
[rails.git] / db / migrate / 013_populate_node_tags_and_remove_helper.c
index b1868ef245c82e79eb7a8fdb21b35a08726fd80f..5a0fbb6cd97094ead01e67c96770c6b426b4c518 100644 (file)
@@ -45,15 +45,16 @@ static void write_csv_col(FILE *f, const char *str, char end) {
 }
 
 static void unescape(char *str) {
-  char *i = str, *o = str;
+  char *i = str, *o = str, tmp;
 
   while (*i) {
     if (*i == '\\') {
       i++;
-      switch (*i++) {
+      switch (tmp = *i++) {
        case 's': *o++ = ';'; break;
        case 'e': *o++ = '='; break;
        case '\\': *o++ = '\\'; break;
+       default: *o++ = tmp; break;
       }
     } else {
       *o++ = *i++;
@@ -85,7 +86,7 @@ static int read_node_tags(char **tags, char **k, char **v) {
 struct data {
   MYSQL *mysql;
   size_t version_size;
-  uint32_t *version;
+  uint16_t *version;
 };
 
 static void proc_nodes(struct data *d, const char *tbl, FILE *out, FILE *out_tags, int hist) {
@@ -105,7 +106,7 @@ static void proc_nodes(struct data *d, const char *tbl, FILE *out, FILE *out_tag
     unsigned long id = strtoul(row[0], NULL, 10);
     uint32_t version;
 
-    if (id > d->version_size) {
+    if (id >= d->version_size) {
       fprintf(stderr, "preallocated nodes size exceeded");
       abort();
     }
@@ -198,10 +199,16 @@ int main(int argc, char **argv) {
   d->mysql = connect_to_mysql(argv);
 
   d->version_size = 1 + select_size(d->mysql, "SELECT max(id) FROM current_nodes");
-  d->version = malloc(sizeof(uint32_t) * d->version_size);
+  d->version = (uint16_t *) malloc(sizeof(uint16_t) * d->version_size);
+  if (!d->version) {
+    perror("malloc");
+    abort();
+    exit(EXIT_FAILURE);
+  }
+  memset(d->version, 0, sizeof(uint16_t) * d->version_size);
 
   prefix_len = strlen(argv[7]);
-  tempfn = (char *) malloc(prefix_len + 16);
+  tempfn = (char *) malloc(prefix_len + 32);
   strcpy(tempfn, argv[7]);
 
   strcpy(tempfn + prefix_len, "current_nodes");