mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
8c3efd2a22
commit
d2baa36312
3 changed files with 60 additions and 52 deletions
44
divesite.c
44
divesite.c
|
@ -4,6 +4,36 @@
|
||||||
|
|
||||||
struct dive_site_table dive_site_table;
|
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 */
|
/* try to create a uniqe ID - fingers crossed */
|
||||||
static uint32_t dive_site_getUniqId()
|
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;
|
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;
|
|
||||||
}
|
|
||||||
|
|
33
divesite.h
33
divesite.h
|
@ -45,40 +45,11 @@ static inline struct dive_site *get_dive_site_by_uuid(uint32_t uuid)
|
||||||
return NULL;
|
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();
|
struct dive_site *alloc_dive_site();
|
||||||
uint32_t create_dive_site(const char *name);
|
uint32_t create_dive_site(const char *name);
|
||||||
uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees_t longitude);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
35
load-git.c
35
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)
|
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 *dive = _dive;
|
||||||
struct dive_site *ds = get_or_create_dive_site_by_uuid(dive->dive_site_uuid);
|
struct dive_site *ds = get_dive_site_for_dive(dive);
|
||||||
dive->dive_site_uuid = ds->uuid;
|
if (!ds) {
|
||||||
ds->latitude = parse_degrees(line, &line);
|
uuid = get_dive_site_uuid_by_gps(latitude, longitude, NULL);
|
||||||
ds->longitude = parse_degrees(line, &line);
|
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)
|
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 *dive = _dive;
|
||||||
struct dive_site *ds = get_or_create_dive_site_by_uuid(dive->dive_site_uuid);
|
struct dive_site *ds = get_dive_site_for_dive(dive);
|
||||||
dive->dive_site_uuid = ds->uuid;
|
fprintf(stderr, "looking for a site named {%s} ", name);
|
||||||
ds->name = get_utf8(str);
|
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)
|
static void parse_dive_divemaster(char *line, struct membuffer *str, void *_dive)
|
||||||
|
|
Loading…
Add table
Reference in a new issue