diff --git a/lib/db.vala b/lib/db.vala index f871a1c..7071579 100644 --- a/lib/db.vala +++ b/lib/db.vala @@ -39,7 +39,11 @@ namespace LibSernatur { /** * Invalid value */ - INVALID_VALUE + INVALID_VALUE, + /** + * Could not be modified or deleted because of a constraint + */ + FOREIGN_KEY_CONSTAINT } /** diff --git a/lib/db/tour.vala b/lib/db/tour.vala index 9f1aa5f..720bb70 100644 --- a/lib/db/tour.vala +++ b/lib/db/tour.vala @@ -129,6 +129,29 @@ namespace LibSernatur { #endif } } + + /** + * Delete a tour in the database + * @param conn The database connection + * @param tour The tour to update + * @throws DBError Thrown if the data in the object is invalid + */ + public static void delete_tour (Database conn, Tour tour) throws DBError { + if (tour.id_tour == 0) { + throw new DBError.INVALID_VALUE (dgettext (null, "The id of the tour is invalid!")); + } + var res = conn.exec (Query.get_query (Query.Type.DELETE_TOUR, tour)); + if (res.get_status () != ExecStatus.COMMAND_OK) { + if (res.get_error_field (FieldCode.SQLSTATE) == "23503") { + throw new DBError.FOREIGN_KEY_CONSTAINT (res.get_error_field (FieldCode.MESSAGE_PRIMARY)); + } + #if DEBUG + error (conn.get_error_message ()); + #else + warning (conn.get_error_message ()); + #endif + } + } } } } diff --git a/lib/queries.vala b/lib/queries.vala index 7905795..11b69c9 100644 --- a/lib/queries.vala +++ b/lib/queries.vala @@ -21,30 +21,37 @@ namespace LibSernatur { public enum Type { SELECT_ALL_TOURS, INSERT_TOUR, - UPDATE_TOUR + UPDATE_TOUR, + DELETE_TOUR } public static string get_query (Type type, T? t) { - if (type == Type.SELECT_ALL_TOURS) { - return " + switch (type) { + case SELECT_ALL_TOURS: + return " SELECT T.id_tour, T.nombre_tour, T.costo_indiv, T.costo_grupal, T.minima_personas, C.id_ciudad, C.nombre_ciudad, R.id_region, R.nombre_region FROM tour T JOIN ciudad C ON (T.id_ciudad = C.id_ciudad) JOIN region R ON (C.id_region = R.id_region)"; - } - else if (type == Type.UPDATE_TOUR) { - Tour tour = (Tour) t; - return " + case UPDATE_TOUR: + Tour tour = (Tour) t; + return " UPDATE tour SET nombre_tour = '" + tour.nombre_tour + "', costo_indiv = " + tour.costo_indiv.to_string () + ", costo_grupal = " + tour.costo_grupal.to_string () + ", minima_personas = " + tour.minima_personas.to_string () + " WHERE id_tour = " + tour.id_tour.to_string (); + case DELETE_TOUR: + Tour tour = (Tour) t; + return " +DELETE FROM tour +WHERE id_tour = " + tour.id_tour.to_string (); + default: + return ""; } - return ""; } } } diff --git a/src/tour_list.vala b/src/tour_list.vala index 5991282..ea1bed4 100644 --- a/src/tour_list.vala +++ b/src/tour_list.vala @@ -174,7 +174,51 @@ namespace Sernatur { } } else if (button == delete_tour) { - print ("Delete tour clicked\n"); + var msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.YES_NO, + dgettext(null, "Are you sure you wish to delete this tour?")); + msg.response.connect ((response_id) => { + switch (response_id) { + case Gtk.ResponseType.YES: + try { + Gtk.TreeModel model; + Gtk.TreeIter iter; + Tour tour; + if (selection.get_selected (out model, out iter)) { + model.get (iter, + Column.TOUR, out tour); + Tour.delete_tour (conn.db, tour); + } + } + catch (DBError e) { + if (e.code == 1) { + var msg2 = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + dgettext(null, "Error: Could not delete tour because there are still associated arrival and departure dates and times!")); + msg2.response.connect ((response_id) => { + msg2.destroy (); + }); + msg2.set_title (dgettext (null, "Error")); + msg2.show (); + } + else { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + break; + } + msg.destroy (); + }); + msg.set_title (dgettext (null, "Error")); + msg.show (); } else if (button == close_tour) { this.close ();