/* ================================================================= */ bool GncSqlSchedXactionBackend::commit (GncSqlBackend* sql_be, QofInstance* inst) { SchedXaction* pSx; const GncGUID* guid; E_DB_OPERATION op; gboolean is_infant; gboolean is_ok; g_return_val_if_fail (sql_be != NULL, FALSE); g_return_val_if_fail (inst != NULL, FALSE); g_return_val_if_fail (GNC_IS_SX (inst), FALSE); pSx = GNC_SX (inst); is_infant = qof_instance_get_infant (inst); if (qof_instance_get_destroying (inst)) { op = OP_DB_DELETE; } else if (sql_be->pristine() || is_infant) { op = OP_DB_INSERT; } else { op = OP_DB_UPDATE; } is_ok = sql_be->do_db_operation(op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx, col_table); guid = qof_instance_get_guid (inst); if (op == OP_DB_INSERT || op == OP_DB_UPDATE) { gnc_sql_recurrence_save_list (sql_be, guid, gnc_sx_get_schedule (pSx)); } else { gnc_sql_recurrence_delete (sql_be, guid); } if (is_ok) { // Now, commit any slots if (op == OP_DB_INSERT || op == OP_DB_UPDATE) { is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst); } else { is_ok = gnc_sql_slots_delete (sql_be, guid); } } return is_ok; }
static void _gnc_sx_instance_event_handler(QofInstance *ent, QofEventId event_type, gpointer user_data, gpointer evt_data) { GncSxInstanceModel *instances = GNC_SX_INSTANCE_MODEL(user_data); /* selection rules { // (gnc_collection_get_schedxaction_list(book), GNC_EVENT_ITEM_ADDED) // (gnc_collection_get_schedxaction_list(book), GNC_EVENT_ITEM_REMOVED) // (GNC_IS_SX(ent), QOF_EVENT_MODIFIED) // } */ if (!(GNC_IS_SX(ent) || GNC_IS_SXES(ent))) return; if (GNC_IS_SX(ent)) { SchedXaction *sx; gboolean sx_is_in_model = FALSE; sx = GNC_SX(ent); // only send `updated` if it's actually in the model sx_is_in_model = (g_list_find_custom(instances->sx_instance_list, sx, (GCompareFunc)_gnc_sx_instance_find_by_sx) != NULL); if (event_type & QOF_EVENT_MODIFY) { if (sx_is_in_model) { if (instances->include_disabled || xaccSchedXactionGetEnabled(sx)) { g_signal_emit_by_name(instances, "updated", (gpointer)sx); } else { /* the sx was enabled but is now disabled */ g_signal_emit_by_name(instances, "removing", (gpointer)sx); } } else { /* determine if this is a legitimate SX or just a "one-off" / being created */ GList *all_sxes = gnc_book_get_schedxactions(gnc_get_current_book())->sx_list; if (g_list_find(all_sxes, sx) && (!instances->include_disabled && xaccSchedXactionGetEnabled(sx))) { /* it's moved from disabled to enabled, add the instances */ instances->sx_instance_list = g_list_append(instances->sx_instance_list, _gnc_sx_gen_instances((gpointer)sx, (gpointer) & instances->range_end)); g_signal_emit_by_name(instances, "added", (gpointer)sx); } } } /* else { unsupported event type; ignore } */ } else if (GNC_IS_SXES(ent)) { SchedXactions *sxes = GNC_SXES(ent); SchedXaction *sx = GNC_SX(evt_data); sxes = NULL; if (event_type & GNC_EVENT_ITEM_REMOVED) { GList *instances_link; instances_link = g_list_find_custom(instances->sx_instance_list, sx, (GCompareFunc)_gnc_sx_instance_find_by_sx); if (instances_link != NULL) { g_signal_emit_by_name(instances, "removing", (gpointer)sx); } else if (instances->include_disabled) { g_warning("could not remove instances that do not exist in the model"); } } else if (event_type & GNC_EVENT_ITEM_ADDED) { if (instances->include_disabled || xaccSchedXactionGetEnabled(sx)) { /* generate instances, add to instance list, emit update. */ instances->sx_instance_list = g_list_append(instances->sx_instance_list, _gnc_sx_gen_instances((gpointer)sx, (gpointer) & instances->range_end)); g_signal_emit_by_name(instances, "added", (gpointer)sx); } } /* else { g_critical("unsupported event type [%d]\n", event_type); } */ } }