Skip to content

Commit

Permalink
parser: add device_table to parser state
Browse files Browse the repository at this point in the history
If we want to avoid the parsers to directly modify global data,
we have to provide a device_table to parse into. This adds such
a state and the corresponding function parameters. However,
for now this is unused.

Adding new parameters is very painful and this commit shows that
we urgently need a "struct divelog" collecting all those tables!

Signed-off-by: Berthold Stoeger <[email protected]>
  • Loading branch information
bstoeger authored and dirkhh committed Oct 24, 2020
1 parent 4197543 commit a261466
Show file tree
Hide file tree
Showing 25 changed files with 242 additions and 139 deletions.
45 changes: 24 additions & 21 deletions core/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ int readfile(const char *filename, struct memblock *mem)


static void zip_read(struct zip_file *file, const char *filename, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct filter_preset_table *filter_presets)
struct dive_site_table *sites, struct device_table *devices, struct filter_preset_table *filter_presets)
{
int size = 1024, n, read = 0;
char *mem = malloc(size);
Expand All @@ -88,12 +88,12 @@ static void zip_read(struct zip_file *file, const char *filename, struct dive_ta
mem = realloc(mem, size);
}
mem[read] = 0;
(void) parse_xml_buffer(filename, mem, read, table, trips, sites, filter_presets, NULL);
(void) parse_xml_buffer(filename, mem, read, table, trips, sites, devices, filter_presets, NULL);
free(mem);
}

int try_to_open_zip(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct filter_preset_table *filter_presets)
struct device_table *devices, struct filter_preset_table *filter_presets)
{
int success = 0;
/* Grr. libzip needs to re-open the file, it can't take a buffer */
Expand All @@ -108,7 +108,7 @@ int try_to_open_zip(const char *filename, struct dive_table *table, struct trip_
/* skip parsing the divelogs.de pictures */
if (strstr(zip_get_name(zip, index, 0), "pictures/"))
continue;
zip_read(file, filename, table, trips, sites, filter_presets);
zip_read(file, filename, table, trips, sites, devices, filter_presets);
zip_fclose(file);
success++;
}
Expand All @@ -128,7 +128,8 @@ static int db_test_func(void *param, int columns, char **data, char **column)
return *data[0] == '0';
}

static int try_to_open_db(const char *filename, struct memblock *mem, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites)
static int try_to_open_db(const char *filename, struct memblock *mem, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct device_table *devices)
{
sqlite3 *handle;
char dm4_test[] = "select count(*) from sqlite_master where type='table' and name='Dive' and sql like '%ProfileBlob%'";
Expand All @@ -150,55 +151,55 @@ static int try_to_open_db(const char *filename, struct memblock *mem, struct div
/* Testing if DB schema resembles Suunto DM5 database format */
retval = sqlite3_exec(handle, dm5_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_dm5_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_dm5_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Suunto DM4 database format */
retval = sqlite3_exec(handle, dm4_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_dm4_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_dm4_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Shearwater database format */
retval = sqlite3_exec(handle, shearwater_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_shearwater_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_shearwater_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Shearwater cloud database format */
retval = sqlite3_exec(handle, shearwater_cloud_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_shearwater_cloud_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_shearwater_cloud_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Atomic Cobalt database format */
retval = sqlite3_exec(handle, cobalt_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_cobalt_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_cobalt_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Divinglog database format */
retval = sqlite3_exec(handle, divinglog_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_divinglog_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_divinglog_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}

/* Testing if DB schema resembles Seac database format */
retval = sqlite3_exec(handle, seacsync_test, &db_test_func, 0, NULL);
if (!retval) {
retval = parse_seac_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites);
retval = parse_seac_buffer(handle, filename, mem->buffer, mem->size, table, trips, sites, devices);
sqlite3_close(handle);
return retval;
}
Expand Down Expand Up @@ -227,7 +228,7 @@ static int try_to_open_db(const char *filename, struct memblock *mem, struct div
*/
static int open_by_filename(const char *filename, const char *fmt, struct memblock *mem,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct filter_preset_table *filter_presets)
struct device_table *devices, struct filter_preset_table *filter_presets)
{
// hack to be able to provide a comment for the translated string
static char *csv_warning = QT_TRANSLATE_NOOP3("gettextFromC",
Expand All @@ -236,7 +237,7 @@ static int open_by_filename(const char *filename, const char *fmt, struct memblo

/* Suunto Dive Manager files: SDE, ZIP; divelogs.de files: DLD */
if (!strcasecmp(fmt, "SDE") || !strcasecmp(fmt, "ZIP") || !strcasecmp(fmt, "DLD"))
return try_to_open_zip(filename, table, trips, sites, filter_presets);
return try_to_open_zip(filename, table, trips, sites, devices, filter_presets);

/* CSV files */
if (!strcasecmp(fmt, "CSV"))
Expand All @@ -258,17 +259,18 @@ static int open_by_filename(const char *filename, const char *fmt, struct memblo
}

static int parse_file_buffer(const char *filename, struct memblock *mem, struct dive_table *table,
struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets)
struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets)
{
int ret;
char *fmt = strrchr(filename, '.');
if (fmt && (ret = open_by_filename(filename, fmt + 1, mem, table, trips, sites, filter_presets)) != 0)
if (fmt && (ret = open_by_filename(filename, fmt + 1, mem, table, trips, sites, devices, filter_presets)) != 0)
return ret;

if (!mem->size || !mem->buffer)
return report_error("Out of memory parsing file %s\n", filename);

return parse_xml_buffer(filename, mem->buffer, mem->size, table, trips, sites, filter_presets, NULL);
return parse_xml_buffer(filename, mem->buffer, mem->size, table, trips, sites, devices, filter_presets, NULL);
}

int check_git_sha(const char *filename, struct git_repository **git_p, const char **branch_p)
Expand Down Expand Up @@ -305,7 +307,8 @@ int check_git_sha(const char *filename, struct git_repository **git_p, const cha
return 1;
}

int parse_file(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets)
int parse_file(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets)
{
struct git_repository *git;
const char *branch = NULL;
Expand Down Expand Up @@ -336,15 +339,15 @@ int parse_file(const char *filename, struct dive_table *table, struct trip_table

fmt = strrchr(filename, '.');
if (fmt && (!strcasecmp(fmt + 1, "DB") || !strcasecmp(fmt + 1, "BAK") || !strcasecmp(fmt + 1, "SQL"))) {
if (!try_to_open_db(filename, &mem, table, trips, sites)) {
if (!try_to_open_db(filename, &mem, table, trips, sites, devices)) {
free(mem.buffer);
return 0;
}
}

/* Divesoft Freedom */
if (fmt && (!strcasecmp(fmt + 1, "DLF"))) {
ret = parse_dlf_buffer(mem.buffer, mem.size, table, trips, sites);
ret = parse_dlf_buffer(mem.buffer, mem.size, table, trips, sites, devices);
free(mem.buffer);
return ret;
}
Expand Down Expand Up @@ -375,7 +378,7 @@ int parse_file(const char *filename, struct dive_table *table, struct trip_table
return 0;
}

ret = parse_file_buffer(filename, &mem, table, trips, sites, filter_presets);
ret = parse_file_buffer(filename, &mem, table, trips, sites, devices, filter_presets);
free(mem.buffer);
return ret;
}
7 changes: 5 additions & 2 deletions core/file.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct memblock {
};

struct trip_table;
struct device_table;
struct dive_site_table;
struct dive_table;
struct zip;
Expand All @@ -26,8 +27,10 @@ extern int datatrak_import(struct memblock *mem, struct memblock *wl_mem, struct
extern void ostctools_import(const char *file, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites);

extern int readfile(const char *filename, struct memblock *mem);
extern int parse_file(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets);
extern int try_to_open_zip(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets);
extern int parse_file(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets);
extern int try_to_open_zip(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets);

// Platform specific functions
extern int subsurface_rename(const char *path, const char *newpath);
Expand Down
4 changes: 3 additions & 1 deletion core/import-cobalt.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ static int cobalt_dive(void *param, int columns, char **data, char **column)


int parse_cobalt_buffer(sqlite3 *handle, const char *url, const char *buffer, int size,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites)
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices)
{
UNUSED(buffer);
UNUSED(size);
Expand All @@ -229,6 +230,7 @@ int parse_cobalt_buffer(sqlite3 *handle, const char *url, const char *buffer, in
state.target_table = table;
state.trips = trips;
state.sites = sites;
state.devices = devices;
state.sql_handle = handle;

char get_dives[] = "select Id,strftime('%s',DiveStartTime),LocationId,'buddy','notes',Units,(MaxDepthPressure*10000/SurfacePressure)-10000,DiveMinutes,SurfacePressure,SerialNumber,'model' from Dive where IsViewDeleted = 0";
Expand Down
31 changes: 17 additions & 14 deletions core/import-csv.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static char *parse_dan_new_line(char *buf, const char *NL)

static int try_to_xslt_open_csv(const char *filename, struct memblock *mem, const char *tag);
static int parse_dan_format(const char *filename, struct xml_params *params, struct dive_table *table,
struct trip_table *trips, struct dive_site_table *sites,
struct trip_table *trips, struct dive_site_table *sites, struct device_table *devices,
struct filter_preset_table *filter_presets)
{
int ret = 0, i;
Expand Down Expand Up @@ -210,7 +210,7 @@ static int parse_dan_format(const char *filename, struct xml_params *params, str
xml_params_add(params, "waterTemp", tmpbuf);
}
}
ret |= parse_xml_buffer(filename, "<csv></csv>", 11, table, trips, sites, filter_presets, params);
ret |= parse_xml_buffer(filename, "<csv></csv>", 11, table, trips, sites, devices, filter_presets, params);
continue;
}

Expand Down Expand Up @@ -265,7 +265,7 @@ static int parse_dan_format(const char *filename, struct xml_params *params, str
if (try_to_xslt_open_csv(filename, &mem_csv, "csv"))
return -1;

ret |= parse_xml_buffer(filename, mem_csv.buffer, mem_csv.size, table, trips, sites, filter_presets, params);
ret |= parse_xml_buffer(filename, mem_csv.buffer, mem_csv.size, table, trips, sites, devices, filter_presets, params);
end_ptr += ptr - (char *)mem_csv.buffer;
free(mem_csv.buffer);
}
Expand All @@ -277,7 +277,7 @@ static int parse_dan_format(const char *filename, struct xml_params *params, str

int parse_csv_file(const char *filename, struct xml_params *params, const char *csvtemplate,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct filter_preset_table *filter_presets)
struct device_table *devices, struct filter_preset_table *filter_presets)
{
int ret, i;
struct memblock mem;
Expand All @@ -297,7 +297,7 @@ int parse_csv_file(const char *filename, struct xml_params *params, const char *

mem.size = 0;
if (!strcmp("DL7", csvtemplate)) {
return parse_dan_format(filename, params, table, trips, sites, filter_presets);
return parse_dan_format(filename, params, table, trips, sites, devices, filter_presets);
} else if (strcmp(xml_params_get_key(params, 0), "date")) {
time(&now);
timep = localtime(&now);
Expand Down Expand Up @@ -329,7 +329,7 @@ int parse_csv_file(const char *filename, struct xml_params *params, const char *
fprintf(stderr, "%s/xslt/%s -\n", SUBSURFACE_SOURCE, csvtemplate);
}
#endif
ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, filter_presets, params);
ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, devices, filter_presets, params);

free(mem.buffer);

Expand Down Expand Up @@ -499,7 +499,8 @@ static char *next_mkvi_key(const char *haystack)
return ret;
}

int parse_txt_file(const char *filename, const char *csv, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites)
int parse_txt_file(const char *filename, const char *csv, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct device_table *devices)
{
UNUSED(sites);
struct memblock memtxt, memcsv;
Expand Down Expand Up @@ -794,14 +795,16 @@ int parse_txt_file(const char *filename, const char *csv, struct dive_table *tab

#define SBPARAMS 40
static int parse_seabear_csv_file(const char *filename, struct xml_params *params, const char *csvtemplate,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets);
int parse_seabear_log(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets)
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets);
int parse_seabear_log(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices, struct filter_preset_table *filter_presets)
{
struct xml_params *params = alloc_xml_params();
int ret;

parse_seabear_header(filename, params);
ret = parse_seabear_csv_file(filename, params, "csv", table, trips, sites, filter_presets) < 0 ? -1 : 0;
ret = parse_seabear_csv_file(filename, params, "csv", table, trips, sites, devices, filter_presets) < 0 ? -1 : 0;

free_xml_params(params);

Expand All @@ -811,7 +814,7 @@ int parse_seabear_log(const char *filename, struct dive_table *table, struct tri

static int parse_seabear_csv_file(const char *filename, struct xml_params *params, const char *csvtemplate,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct filter_preset_table *filter_presets)
struct device_table *devices, struct filter_preset_table *filter_presets)
{
int ret, i;
struct memblock mem;
Expand Down Expand Up @@ -929,14 +932,14 @@ static int parse_seabear_csv_file(const char *filename, struct xml_params *param
fprintf(stderr, "xslt/csv2xml.xslt\n");
}

ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, filter_presets, params);
ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, devices, filter_presets, params);
free(mem.buffer);

return ret;
}

int parse_manual_file(const char *filename, struct xml_params *params, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct filter_preset_table *filter_presets)
struct dive_site_table *sites, struct device_table *devices, struct filter_preset_table *filter_presets)
{
struct memblock mem;
time_t now;
Expand Down Expand Up @@ -972,7 +975,7 @@ int parse_manual_file(const char *filename, struct xml_params *params, struct di
fprintf(stderr, "%s/xslt/manualcsv2xml.xslt -\n", SUBSURFACE_SOURCE);
}
#endif
ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, filter_presets, params);
ret = parse_xml_buffer(filename, mem.buffer, mem.size, table, trips, sites, devices, filter_presets, params);

free(mem.buffer);
return ret;
Expand Down
10 changes: 6 additions & 4 deletions core/import-csv.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,16 @@ extern "C" {
#endif

int parse_csv_file(const char *filename, struct xml_params *params, const char *csvtemplate, struct dive_table *table,
struct trip_table *trips, struct dive_site_table *sites, struct filter_preset_table *filter_presets);
struct trip_table *trips, struct dive_site_table *sites, struct device_table *devices,
struct filter_preset_table *filter_presets);
int try_to_open_csv(struct memblock *mem, enum csv_format type, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites);
int parse_txt_file(const char *filename, const char *csv, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites);
int parse_txt_file(const char *filename, const char *csv, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct device_table *devices);

int parse_seabear_log(const char *filename, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct filter_preset_table *filter_presets);
struct device_table *devices, struct filter_preset_table *filter_presets);
int parse_manual_file(const char *filename, struct xml_params *params, struct dive_table *table, struct trip_table *trips,
struct dive_site_table *sites, struct filter_preset_table *filter_presets);
struct dive_site_table *sites, struct device_table *devices, struct filter_preset_table *filter_presets);

#ifdef __cplusplus
}
Expand Down
4 changes: 3 additions & 1 deletion core/import-divinglog.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,8 @@ static int divinglog_dive(void *param, int columns, char **data, char **column)


int parse_divinglog_buffer(sqlite3 *handle, const char *url, const char *buffer, int size,
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites)
struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites,
struct device_table *devices)
{
UNUSED(buffer);
UNUSED(size);
Expand All @@ -401,6 +402,7 @@ int parse_divinglog_buffer(sqlite3 *handle, const char *url, const char *buffer,
state.target_table = table;
state.trips = trips;
state.sites = sites;
state.devices = devices;
state.sql_handle = handle;

char get_dives[] = "select Number,strftime('%s',Divedate || ' ' || ifnull(Entrytime,'00:00')),Country || ' - ' || City || ' - ' || Place,Buddy,Comments,Depth,Divetime,Divemaster,Airtemp,Watertemp,Weight,Divesuit,Computer,ID,Visibility,SupplyType from Logbook where UUID not in (select UUID from DeletedRecords)";
Expand Down
Loading

0 comments on commit a261466

Please sign in to comment.