/** * midgard_connection_reopen: * @self: #MidgardConnection instance * * This is MySQL optimized workaround for lost connection event. * * Returns: %TRUE on success, %FALSE otherwise */ gboolean midgard_connection_reopen(MidgardConnection *self) { g_assert(self != NULL); const gchar *query = "SELECT id FROM person LIMIT 1"; GdaDataModel *model = midgard_core_query_get_model(self, query); if (model) { g_object_unref(model); return TRUE; } guint dbtype = self->priv->config->priv->dbtype; const GList *events; glong errcode = 0; events = gda_connection_get_events (self->priv->connection); if (!events) { g_warning("Can not get connection events. Error code is unknown."); return FALSE; } GList *l; for (l = (GList *) events; l != NULL; l = l->next) { GdaConnectionEvent *event; event = GDA_CONNECTION_EVENT (l->data); if (gda_connection_event_get_event_type (event) == GDA_CONNECTION_EVENT_ERROR) { errcode = gda_connection_event_get_code(event); switch (dbtype) { case MIDGARD_DB_TYPE_MYSQL: if (errcode == 2006) { /* CR_SERVER_GONE_ERROR , we can not use it */ g_debug("MySQL server has gone away. Reconnect."); return __mysql_reconnect(self); } break; default: /* do nothing */ break; } } } return FALSE; }
static const gchar * sql_get_last_error (GdaConnection *connection) { GList *list; GdaConnectionEvent *error; const gchar *error_txt; g_return_val_if_fail (GDA_IS_CONNECTION (connection), _("Can't connect to database server")); list = (GList *) gda_connection_get_events (connection); if (list == NULL) { return _("No errors reported."); } error = (GdaConnectionEvent *) g_list_last (list)->data; /* FIXME: Poor user, she won't get localized messages */ error_txt = gda_connection_event_get_description (error); return error_txt; }