summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-02-13 01:14:33 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-02-13 14:27:34 -0800
commitd2baa3631270f8b9bcd612f971d269f5d06fca79 (patch)
tree549b90763d0a21110f51b32ef9e344d7592f4a20
parent8c3efd2a22959f684b7604a405d66abc0831a9e1 (diff)
downloadsubsurface-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.c44
-rw-r--r--divesite.h33
-rw-r--r--load-git.c35
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)