diff -ru gdivelog-0.5.1/src/callbacks.c gdivelog-0.5.1.patched/src/callbacks.c --- gdivelog-0.5.1/src/callbacks.c 2005-09-05 17:08:45.000000000 -0700 +++ gdivelog-0.5.1.patched/src/callbacks.c 2008-05-26 12:24:07.000000000 -0700 @@ -127,7 +127,8 @@ gdk_pixbuf_unref(about_dialog_logo_pixbuf); } gtk_window_set_transient_for(GTK_WINDOW(about_dialog),GTK_WINDOW(main_window)); - gtk_widget_show(GTK_WIDGET(about_dialog)); + gtk_dialog_run(GTK_DIALOG(about_dialog)); + gtk_widget_destroy(GTK_WIDGET(about_dialog)); } void on_toolbar_open_clicked (GtkToolButton * toolbutton, gpointer user_data) diff -ru gdivelog-0.5.1/src/db_main.c gdivelog-0.5.1.patched/src/db_main.c --- gdivelog-0.5.1/src/db_main.c 2005-09-19 15:51:45.000000000 -0700 +++ gdivelog-0.5.1.patched/src/db_main.c 2008-05-28 09:45:18.000000000 -0700 @@ -56,6 +56,67 @@ return db_saved_value; } +gint db_get_schema_version(sqlite3 *db) { + gchar *sqlErrMsg=NULL; + gint schema_version=0; + gint rc=sqlite3_exec(db,"SELECT gdivelog_schema_version FROM Preferences LIMIT 1",(gpointer)db_generic_callback_long,&schema_version,&sqlErrMsg); + if(rc!=SQLITE_OK) { + g_log(G_LOG_DOMAIN,G_LOG_LEVEL_ERROR,"Error in db_needs_upgrade()\nCode=%d\nError Message='%s'\n",rc,sqlErrMsg); + sqlite3_free(sqlErrMsg); + schema_version = 0; + } + + return schema_version; +} + +gboolean db_set_schema_version(sqlite3 *db,gint version) { + gchar *sqlErrMsg = NULL; + char *sqlcmd=sqlite3_mprintf("UPDATE Preferences SET gdivelog_schema_version = '%d';", version); + if(sqlcmd==NULL) { + return FALSE; + } + gint rc=sqlite3_exec(db,sqlcmd,NULL,0,&sqlErrMsg); + if(rc!=SQLITE_OK) { + g_log(G_LOG_DOMAIN,G_LOG_LEVEL_CRITICAL,"Error in db_set_schema_version()\nCode=%d\nQuery='%s'\nError message='%s'\n",rc,sqlcmd,sqlErrMsg); + sqlite3_free(sqlErrMsg); + sqlite3_free(sqlcmd); + return FALSE; + } + sqlite3_free(sqlcmd); + return TRUE; +} + +gboolean db_needs_upgrade(sqlite3 *db) { + gint schema_version = db_get_schema_version(db); + return (schema_version!=0) && (schema_version 0) > 1 THEN (SELECT MIN(dive_number)-1 FROM Dive WHERE dive_number > 1) ELSE 1 END) ELSE (SELECT MAX(dive_number)+1 FROM Dive WHERE dive_datetime <= NEW.dive_datetime AND dive_number > 0 ORDER BY dive_datetime DESC LIMIT 1) END) WHERE dive_id=NEW.dive_id;UPDATE Dive SET dive_number=dive_number+1 WHERE dive_datetime > NEW.dive_datetime AND (SELECT CASE WHEN (SELECT dive_number FROM Dive WHERE dive_datetime < NEW.dive_datetime ORDER BY dive_datetime DESC LIMIT 1) IS NULL THEN (SELECT CASE WHEN (SELECT MIN(dive_number) FROM Dive WHERE dive_number > 0) > 1 THEN dive_number < 0 ELSE dive_number > 0 END) ELSE dive_number > 0 END); END;" + "DROP TRIGGER Dive_Update;" + "CREATE TRIGGER Dive_Update AFTER UPDATE OF dive_datetime ON Dive BEGIN UPDATE Dive SET dive_number=(SELECT CASE WHEN dive_id = NEW.dive_id THEN 1+(SELECT COUNT(*) FROM Dive WHERE dive_datetime < NEW.dive_datetime) WHEN NEW.dive_datetime > OLD.dive_datetime AND dive_datetime <= NEW.dive_datetime AND dive_datetime >= OLD.dive_datetime THEN (SELECT CASE WHEN dive_number-1 < OLD.dive_number THEN dive_number ELSE dive_number-1 END) WHEN NEW.dive_datetime < OLD.dive_datetime AND dive_datetime <= OLD.dive_datetime AND dive_datetime >= NEW.dive_datetime THEN (SELECT CASE WHEN dive_number+1 > OLD.dive_number THEN dive_number ELSE dive_number+1 END) ELSE dive_number END) WHERE (SELECT CASE WHEN NEW.dive_datetime > OLD.dive_datetime THEN dive_datetime >= OLD.dive_datetime AND dive_datetime <= NEW.dive_datetime WHEN NEW.dive_datetime < OLD.dive_datetime THEN dive_datetime <= OLD.dive_datetime AND dive_datetime >= NEW.dive_datetime END); END;" + ; + if(!db_run_upgrade_command(db,sqlcmd) || !db_set_schema_version(db,2)) { + return FALSE; + } + } + return TRUE; +} + gboolean db_create_schema(sqlite3 *db) { gint rc; @@ -198,6 +259,14 @@ rval=FALSE; } else { + if(db_needs_upgrade(logbook_db)) { + if(!db_upgrade(logbook_db)) { + g_log (G_LOG_DOMAIN,G_LOG_LEVEL_CRITICAL,"Cannot upgrade database schema\n"); + sqlite3_close(logbook_db); + logbook_db=NULL; + rval=FALSE; + } + } db_cache_sites (); preferences_load_template_dive_number(); } diff -ru gdivelog-0.5.1/src/defines.h gdivelog-0.5.1.patched/src/defines.h --- gdivelog-0.5.1/src/defines.h 2005-09-20 08:15:28.000000000 -0700 +++ gdivelog-0.5.1.patched/src/defines.h 2008-05-26 17:07:16.000000000 -0700 @@ -30,7 +30,7 @@ #define LOGBOOK_APP_DATA_PREFERENCES "/.gdivelog/preferences" #define LOGBOOK_APP_DATA_DIR "/.gdivelog" -#define GDIVELOG_SCHEMA_VERSION "1.0" +#define GDIVELOG_SCHEMA_VERSION "2" typedef struct { diff -ru gdivelog-0.5.1/src/dive_db.c gdivelog-0.5.1.patched/src/dive_db.c --- gdivelog-0.5.1/src/dive_db.c 2005-09-20 08:15:28.000000000 -0700 +++ gdivelog-0.5.1.patched/src/dive_db.c 2008-05-26 13:23:36.000000000 -0700 @@ -131,9 +131,9 @@ gint new_dive_id=0; sqlcmd=sqlite3_mprintf( - "INSERT INTO Dive (dive_datetime,dive_duration,dive_maxdepth,dive_mintemp,dive_maxtemp,dive_notes,site_id,dive_visibility,dive_weight) VALUES ('%s',%lu,%f,%f,%f,'%q',%d,%f,%f)", - dive_datetime, dive_duration,dive_maxdepth,dive_mintemp, - dive_maxtemp,dive_notes,site_id,dive_visibility,dive_weight + "INSERT INTO Dive (dive_datetime,dive_duration,dive_maxdepth,dive_mintemp,dive_maxtemp,dive_notes,site_id,dive_visibility,dive_weight) VALUES ('%s',%lu,%f,%f,%f,'%q',%d,%f,%f)", + dive_datetime, dive_duration,dive_maxdepth,dive_mintemp, + dive_maxtemp,dive_notes,site_id,dive_visibility,dive_weight ); if(handle_transactions) db_begin_transaction(); rc=sqlite3_exec (logbook_db, sqlcmd, NULL, 0, &sqlErrMsg); diff -ru gdivelog-0.5.1/src/profile_gui.c gdivelog-0.5.1.patched/src/profile_gui.c --- gdivelog-0.5.1/src/profile_gui.c 2005-09-20 08:15:28.000000000 -0700 +++ gdivelog-0.5.1.patched/src/profile_gui.c 2008-05-27 22:18:52.000000000 -0700 @@ -96,7 +96,6 @@ timestr=format_field_duration(time); if(depth>preferences.split_dive_limit || !time || time==profile_data.duration) gtk_widget_set_sensitive(GTK_WIDGET(widget_split_dive_btn),FALSE); else gtk_widget_set_sensitive(GTK_WIDGET(widget_split_dive_btn),TRUE); - if(preferences.depth_unit != 'm') depth=convert_meters_to_feet(depth); depthstr=format_field_depth(depth); if(preferences.temperature_unit!='c') temperature=convert_celsius_to_farenheit(temperature); temperaturestr=format_field_temperature(temperature); diff -ru gdivelog-0.5.1/src/renumber_db.c gdivelog-0.5.1.patched/src/renumber_db.c --- gdivelog-0.5.1/src/renumber_db.c 2005-09-05 04:11:01.000000000 -0700 +++ gdivelog-0.5.1.patched/src/renumber_db.c 2008-05-28 09:46:58.000000000 -0700 @@ -28,29 +28,48 @@ extern sqlite3 *logbook_db; +static gint renumber_callback(GList **list,gint argc,gchar **argv, gchar **azColName) +{ + (*list) = g_list_prepend(*list,GINT_TO_POINTER(atoi(argv[0]))); + return 0; +} + +gboolean renumber_db_dive(gint dive, gint number) +{ + gint rc; + gboolean rval=TRUE; + gchar *sqlErrMsg=NULL,*sqlcmd=sqlite3_mprintf("UPDATE Dive SET dive_number=%d WHERE dive_id=%d",number,dive); + + rc=sqlite3_exec(logbook_db,sqlcmd,NULL,0,&sqlErrMsg); + if(rc!=SQLITE_OK) { + g_log(G_LOG_DOMAIN,G_LOG_LEVEL_ERROR,"Error in renumber_db_renumber_dives()\nCode=%d\nError Message='%s'\n",rc,sqlErrMsg); + sqlite3_free(sqlErrMsg); + rval=FALSE; + } + else db_not_saved(); + sqlite3_free(sqlcmd); + return rval; +} + gboolean renumber_db_renumber_dives(gint initial_dive_number) { gint rc; glong min_dive_number; gchar *sqlErrMsg=NULL,*sqlcmd=NULL; gboolean rval=TRUE; + GList *list = g_list_alloc(); - rc=sqlite3_exec(logbook_db,"SELECT MIN(dive_number) FROM Dive",(gpointer)db_generic_callback_long,&min_dive_number,&sqlErrMsg); + rc=sqlite3_exec(logbook_db,"SELECT dive_id FROM Dive ORDER BY dive_datetime DESC;",(gpointer)renumber_callback,&list,&sqlErrMsg); if(rc!=SQLITE_OK) { g_log(G_LOG_DOMAIN,G_LOG_LEVEL_ERROR,"Error in renumber_db_renumber_dives()\nCode=%d\nError Message='%s'\n",rc,sqlErrMsg); sqlite3_free(sqlErrMsg); rval=FALSE; } else { - if(min_dive_number!=initial_dive_number) { - sqlcmd=sqlite3_mprintf("UPDATE Dive SET dive_number=dive_number+%d",initial_dive_number-min_dive_number); - sqlite3_exec(logbook_db,sqlcmd,NULL,0,&sqlErrMsg); - if(rc!=SQLITE_OK) { - g_log(G_LOG_DOMAIN,G_LOG_LEVEL_ERROR,"Error in renumber_db_renumber_dives()\nCode=%d\nError Message='%s'\n",rc,sqlErrMsg); - sqlite3_free(sqlErrMsg); - rval=FALSE; - } - else db_not_saved(); + GList *it=g_list_first(list); + while(it){ + if(!renumber_db_dive(GPOINTER_TO_INT(it->data),initial_dive_number++)) rval=FALSE; + it=g_list_next(it); } } return rval; diff -ru gdivelog-0.5.1/src/site_gui.c gdivelog-0.5.1.patched/src/site_gui.c --- gdivelog-0.5.1/src/site_gui.c 2005-09-12 05:25:17.000000000 -0700 +++ gdivelog-0.5.1.patched/src/site_gui.c 2008-05-28 09:39:12.000000000 -0700 @@ -495,14 +495,15 @@ gint site_parent_id; GtkTreeModel *model; GtkTreeIter iter; - + model=gtk_combo_box_get_model(combobox); - gtk_combo_box_get_active_iter(combobox,&iter); - gtk_tree_model_get(model,&iter, - SITEPARENT_COL_SITE_ID, - &site_parent_id, - -1 - ); - if((site_parent_id==current_site_id)||site_db_isancestor(site_parent_id,current_site_id)) - site_set_save_sensitive(FALSE); + if(gtk_combo_box_get_active_iter(combobox,&iter)) { + gtk_tree_model_get(model,&iter, + SITEPARENT_COL_SITE_ID, + &site_parent_id, + -1 + ); + if((site_parent_id==current_site_id)||site_db_isancestor(site_parent_id,current_site_id)) + site_set_save_sensitive(FALSE); + } }