[PATCH 1/3] Refactoring sqlite import support

Miika Turkia miika.turkia at gmail.com
Fri Feb 14 22:36:49 UTC 2014


Move the opening of DB connection to occur before DC dependent code.
This way we can try to detect log software before calling the DC
dependent import function. This prepares for adding support for
Shearwater sqlite database.

Signed-off-by: Miika Turkia <miika.turkia at gmail.com>
---
 dive.h      |  3 ++-
 file.c      | 15 ++++++++++++++-
 parse-xml.c | 13 +------------
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/dive.h b/dive.h
index e121b61..953c08e 100644
--- a/dive.h
+++ b/dive.h
@@ -6,6 +6,7 @@
 #include <time.h>
 #include <math.h>
 #include <zip.h>
+#include <sqlite3.h>
 
 /* Windows has no MIN/MAX macros - so let's just roll our own */
 #define MIN(x, y) ({                \
@@ -643,7 +644,7 @@ extern void parse_xml_buffer(const char *url, const char *buf, int size, struct
 extern void parse_xml_exit(void);
 extern void set_filename(const char *filename, bool force);
 
-extern int parse_dm4_buffer(const char *url, const char *buf, int size, struct dive_table *table, char **error);
+extern int parse_dm4_buffer(const sqlite3 *handle, const char *url, const char *buf, int size, struct dive_table *table, char **error);
 
 extern void parse_file(const char *filename, char **error);
 extern void parse_csv_file(const char *filename, int time, int depth, int temp, int po2f, int cnsf, int stopdepthf, int sepidx, const char *csvtemplate, int units, char **error);
diff --git a/file.c b/file.c
index 2c6e505..b5bdede 100644
--- a/file.c
+++ b/file.c
@@ -153,7 +153,20 @@ static int try_to_xslt_open_csv(const char *filename, struct memblock *mem, char
 
 static int try_to_open_db(const char *filename, struct memblock *mem, char **error)
 {
-	return parse_dm4_buffer(filename, mem->buffer, mem->size, &dive_table, error);
+	sqlite3 *handle;
+	int retval;
+
+	retval = sqlite3_open(filename, &handle);
+
+	if (retval) {
+		fprintf(stderr, translate("gettextFromC","Database connection failed '%s'.\n"), filename);
+		return 1;
+	}
+
+	retval = parse_dm4_buffer(handle, filename, mem->buffer, mem->size, &dive_table, error);
+	sqlite3_close(handle);
+
+	return retval;
 }
 
 timestamp_t parse_date(const char *date)
diff --git a/parse-xml.c b/parse-xml.c
index 2a98d39..60a13c3 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -14,8 +14,6 @@
 
 #include "gettext.h"
 
-#include<sqlite3.h>
-
 #include "dive.h"
 #include "device.h"
 
@@ -1863,25 +1861,17 @@ extern int dm4_dive(void *param, int columns, char **data, char **column)
 	return SQLITE_OK;
 }
 
-int parse_dm4_buffer(const char *url, const char *buffer, int size,
+int parse_dm4_buffer(const sqlite3 *handle, const char *url, const char *buffer, int size,
 			struct dive_table *table, char **error)
 {
 	int retval;
 	char *err = NULL;
-	sqlite3 *handle;
 	target_table = table;
 
 	/* StartTime is converted from Suunto's nano seconds to standard
 	 * time. We also need epoch, not seconds since year 1. */
 	char get_dives[] = "select D.DiveId,StartTime/10000000-62135596800,Note,Duration,SourceSerialNumber,Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,D.StartPressure,D.EndPressure,Size,CylinderWorkPressure,SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,Oxygen,Helium,MIX.StartPressure,MIX.EndPressure FROM Dive AS D JOIN DiveMixture AS MIX ON D.DiveId=MIX.DiveId";
 
-	retval = sqlite3_open(url, &handle);
-
-	if (retval) {
-		fprintf(stderr, translate("gettextFromC","Database connection failed '%s'.\n"), url);
-		return 1;
-	}
-
 	retval = sqlite3_exec(handle, get_dives, &dm4_dive, handle, &err);
 
 	if (retval != SQLITE_OK) {
@@ -1889,7 +1879,6 @@ int parse_dm4_buffer(const char *url, const char *buffer, int size,
 		return 1;
 	}
 
-	sqlite3_close(handle);
 	return 0;
 }
 
-- 
1.8.3.2



More information about the subsurface mailing list