/* * Reopens a connection after the server has closed it (possibly because of a timeout) */ gboolean gda_ldap_rebind (GdaLdapConnection *cnc, GError **error) { g_return_val_if_fail (GDA_IS_LDAP_CONNECTION (cnc), FALSE); gda_lockable_lock ((GdaLockable*) cnc); /* CNC LOCK */ LdapConnectionData *cdata; cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) { gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ g_warning ("cdata != NULL failed"); return FALSE; } GdaServerProviderConnectionData *pcdata; pcdata = gda_connection_internal_get_provider_data_error ((GdaConnection*) cnc, NULL); GdaWorker *worker; worker = gda_worker_ref (gda_connection_internal_get_worker (pcdata)); GMainContext *context; context = gda_server_provider_get_real_main_context ((GdaConnection *) cnc); gpointer retval; gda_worker_do_job (worker, context, 0, &retval, NULL, (GdaWorkerFunc) worker_gda_ldap_rebind, (gpointer) cdata, NULL, NULL, error); if (context) g_main_context_unref (context); gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ gda_worker_unref (worker); return retval ? TRUE : FALSE; }
/* * Unbinds the connection if possible (i.e. if cdata->keep_bound_count is 0) * This allows to avoid keeping the connection to the LDAP server if unused */ void gda_ldap_may_unbind (GdaLdapConnection *cnc) { gda_lockable_lock ((GdaLockable*) cnc); /* CNC LOCK */ LdapConnectionData *cdata; cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata || (cdata->keep_bound_count > 0)) { gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ return; } GdaServerProviderConnectionData *pcdata; pcdata = gda_connection_internal_get_provider_data_error ((GdaConnection*) cnc, NULL); GdaWorker *worker; worker = gda_worker_ref (gda_connection_internal_get_worker (pcdata)); GMainContext *context; context = gda_server_provider_get_real_main_context ((GdaConnection *) cnc); gpointer retval; gda_worker_do_job (worker, context, 0, &retval, NULL, (GdaWorkerFunc) worker_gda_ldap_may_unbind, (gpointer) cdata, NULL, NULL, NULL); if (context) g_main_context_unref (context); gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ gda_worker_unref (worker); }
/* * Makes sure the connection is opened */ gboolean gda_ldap_ensure_bound (GdaLdapConnection *cnc, GError **error) { LdapConnectionData *cdata; cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) return FALSE; else if (cdata->handle) return TRUE; return gda_ldap_rebind (cnc, error); }
/* * _gda_ldap_get_top_classes */ const GSList * gdaprov_ldap_get_top_classes (GdaLdapConnection *cnc) { LdapConnectionData *cdata; g_return_val_if_fail (GDA_IS_LDAP_CONNECTION (cnc), NULL); cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) return NULL; if (! cdata->classes_hash) { /* force classes init */ gdaprov_ldap_get_class_info (cnc, "top"); } return cdata->top_classes; }
/** * gdaprov_ldap_get_class_info: * @cnc: a #GdaLdapConnection (not %NULL) * @classname: the class name (not %NULL) * * Returns: the #GdaLdapClass for @classname, or %NULL */ GdaLdapClass * gdaprov_ldap_get_class_info (GdaLdapConnection *cnc, const gchar *classname) { g_return_val_if_fail (GDA_IS_LDAP_CONNECTION (cnc), NULL); g_return_val_if_fail (classname, NULL); gda_lockable_lock ((GdaLockable*) cnc); /* CNC LOCK */ LdapConnectionData *cdata; cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) { gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ return NULL; } if (cdata->classes_hash) { gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ return g_hash_table_lookup (cdata->classes_hash, classname); } GdaServerProviderConnectionData *pcdata; pcdata = gda_connection_internal_get_provider_data_error ((GdaConnection*) cnc, NULL); GdaWorker *worker; worker = gda_worker_ref (gda_connection_internal_get_worker (pcdata)); GMainContext *context; context = gda_server_provider_get_real_main_context ((GdaConnection *) cnc); WorkerLdapClassInfoData data; data.cnc = cnc; data.cdata = cdata; data.classname = classname; gda_connection_increase_usage ((GdaConnection*) cnc); /* USAGE ++ */ gpointer retval; gda_worker_do_job (worker, context, 0, &retval, NULL, (GdaWorkerFunc) worker_gdaprov_ldap_get_class_info, (gpointer) &data, NULL, NULL, NULL); if (context) g_main_context_unref (context); gda_connection_decrease_usage ((GdaConnection*) cnc); /* USAGE -- */ gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ gda_worker_unref (worker); return (GdaLdapClass*) retval; }
/* * Server version request */ static const gchar * gda_ldap_provider_get_server_version (GdaServerProvider *provider, GdaConnection *cnc) { LdapConnectionData *cdata; g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL); g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, NULL); cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) return FALSE; if (! cdata->server_version) { /* FIXME: don't know how to get information about the LDAP server! */ } return cdata->server_version; }
GdaLdapEntry * gdaprov_ldap_describe_entry (GdaLdapConnection *cnc, const gchar *dn, GError **error) { g_return_val_if_fail (GDA_IS_LDAP_CONNECTION (cnc), NULL); g_return_val_if_fail (!dn || (dn && *dn), NULL); gda_lockable_lock ((GdaLockable*) cnc); /* CNC LOCK */ LdapConnectionData *cdata; cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) { gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ return NULL; } GdaServerProviderConnectionData *pcdata; pcdata = gda_connection_internal_get_provider_data_error ((GdaConnection*) cnc, NULL); GdaWorker *worker; worker = gda_worker_ref (gda_connection_internal_get_worker (pcdata)); GMainContext *context; context = gda_server_provider_get_real_main_context ((GdaConnection *) cnc); WorkerLdapDescrEntryData data; data.cnc = cnc; data.cdata = cdata; data.dn = dn; gda_connection_increase_usage ((GdaConnection*) cnc); /* USAGE ++ */ gpointer retval; gda_worker_do_job (worker, context, 0, &retval, NULL, (GdaWorkerFunc) worker_gdaprov_ldap_describe_entry, (gpointer) &data, NULL, NULL, error); if (context) g_main_context_unref (context); gda_connection_decrease_usage ((GdaConnection*) cnc); /* USAGE -- */ gda_lockable_unlock ((GdaLockable*) cnc); /* CNC UNLOCK */ gda_worker_unref (worker); return (GdaLdapEntry*) retval; }
/* * Close connection request * * In this function, the following _must_ be done: * - Actually close the connection to the database using @cnc's associated LdapConnectionData structure * - Free the LdapConnectionData structure and its contents * * Returns: TRUE if no error occurred, or FALSE otherwise (and an ERROR connection event must be added to @cnc) */ static gboolean gda_ldap_provider_close_connection (GdaServerProvider *provider, GdaConnection *cnc) { LdapConnectionData *cdata; g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE); /* Close the connection using the C API */ cdata = (LdapConnectionData*) gda_virtual_connection_internal_get_provider_data (GDA_VIRTUAL_CONNECTION (cnc)); if (!cdata) return FALSE; if (cdata->handle) { ldap_unbind_ext (cdata->handle, NULL, NULL); cdata->handle = NULL; } GdaServerProviderBase *fset; fset = gda_server_provider_get_impl_functions_for_class (parent_class, GDA_SERVER_PROVIDER_FUNCTIONS_BASE); return fset->close_connection (provider, cnc); }