diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-02-13 01:14:33 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-02-13 14:27:34 -0800 |
commit | d2baa3631270f8b9bcd612f971d269f5d06fca79 (patch) | |
tree | 549b90763d0a21110f51b32ef9e344d7592f4a20 | |
parent | 8c3efd2a22959f684b7604a405d66abc0831a9e1 (diff) | |
download | subsurface-d2baa3631270f8b9bcd612f971d269f5d06fca79.tar.gz |
Improve dive site creation from v2 git storage
Fix broken helper function, move helper functions into the .c file (there
really wasn't a good reason for these to be inline), fix the logic that
decides if we want to create a new dive site or use an existing one.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | divesite.c | 44 | ||||
-rw-r--r-- | divesite.h | 33 | ||||
-rw-r--r-- | load-git.c | 35 |
3 files changed, 60 insertions, 52 deletions
diff --git a/divesite.c b/divesite.c index bccbe37e2..4339a658a 100644 --- a/divesite.c +++ b/divesite.c @@ -4,6 +4,36 @@ struct dive_site_table dive_site_table; +/* there could be multiple sites of the same name - return the first one */ +uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp) +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds) { + if (same_string(ds->name, name)) { + if (dsp) + *dsp = ds; + return ds->uuid; + } + } + return 0; +} + +/* there could be multiple sites at the same GPS fix - return the first one */ +uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp) +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds) { + if (ds->latitude.udeg == latitude.udeg && ds->longitude.udeg == longitude.udeg) { + if (dsp) + *dsp = ds; + return ds->uuid; + } + } + return 0; +} + /* try to create a uniqe ID - fingers crossed */ static uint32_t dive_site_getUniqId() { @@ -57,17 +87,3 @@ uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees return ds->uuid; } - -/* if the uuid is valid, just get the site, otherwise create it first; - * so you can call this with dive->dive_site_uuid and you'll either get the existing - * dive site or it will create a new one - so make sure you assign the uuid back to - * dive->dive_site_uuid when using this function! */ -struct dive_site *get_or_create_dive_site_by_uuid(uint32_t uuid) -{ - struct dive_site *ds = get_dive_site_by_uuid(uuid); - - if (!ds) - ds = alloc_dive_site(); - - return ds; -} diff --git a/divesite.h b/divesite.h index 5b1d1959d..4dca3ee9d 100644 --- a/divesite.h +++ b/divesite.h @@ -45,40 +45,11 @@ static inline struct dive_site *get_dive_site_by_uuid(uint32_t uuid) return NULL; } -/* there could be multiple sites of the same name - return the first one */ -static inline uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp) -{ - int i; - struct dive_site *ds; - for_each_dive_site (i, ds) { - if (ds->name == name) { - if (dsp) - *dsp = ds; - return ds->uuid; - } - } - return 0; -} - -/* there could be multiple sites at the same GPS fix - return the first one */ -static inline uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp) -{ - int i; - struct dive_site *ds; - for_each_dive_site (i, ds) { - if (ds->latitude.udeg == latitude.udeg && ds->longitude.udeg == longitude.udeg) { - if (dsp) - *dsp = ds; - return ds->uuid; - } - } - return 0; -} - struct dive_site *alloc_dive_site(); uint32_t create_dive_site(const char *name); uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees_t longitude); -struct dive_site *get_or_create_dive_site_by_uuid(uint32_t uuid); +uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp); +uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp); #ifdef __cplusplus } diff --git a/load-git.c b/load-git.c index 4fcf1f600..7cebb038a 100644 --- a/load-git.c +++ b/load-git.c @@ -140,19 +140,40 @@ static int get_hex(const char *line) static void parse_dive_gps(char *line, struct membuffer *str, void *_dive) { + uint32_t uuid; + degrees_t latitude = parse_degrees(line, &line); + degrees_t longitude = parse_degrees(line, &line); struct dive *dive = _dive; - struct dive_site *ds = get_or_create_dive_site_by_uuid(dive->dive_site_uuid); - dive->dive_site_uuid = ds->uuid; - ds->latitude = parse_degrees(line, &line); - ds->longitude = parse_degrees(line, &line); + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds) { + uuid = get_dive_site_uuid_by_gps(latitude, longitude, NULL); + if (!uuid) + uuid = create_dive_site_with_gps("", latitude, longitude); + dive->dive_site_uuid = uuid; + } else { + ds->latitude = latitude; + ds->longitude = longitude; + } + } static void parse_dive_location(char *line, struct membuffer *str, void *_dive) { + uint32_t uuid; + char *name = get_utf8(str); struct dive *dive = _dive; - struct dive_site *ds = get_or_create_dive_site_by_uuid(dive->dive_site_uuid); - dive->dive_site_uuid = ds->uuid; - ds->name = get_utf8(str); + struct dive_site *ds = get_dive_site_for_dive(dive); + fprintf(stderr, "looking for a site named {%s} ", name); + if (!ds) { + uuid = get_dive_site_uuid_by_name(name, NULL); + if (!uuid) { fprintf(stderr, "found none, creating\n"); + uuid = create_dive_site(name); + } else { fprintf(stderr, "found one with uuid %8x\n", uuid); } + dive->dive_site_uuid = uuid; + } else { + fprintf(stderr, "dive had site with uuid %8x and name {%s}\n", ds->uuid, ds->name); + ds->name = name; + } } static void parse_dive_divemaster(char *line, struct membuffer *str, void *_dive) |