1 /*
2  * Copyright (C) 2009 - 2012 Vivien Malerba <malerba@gnome-db.org>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18 
19 #ifndef __BROWSER_CONNECTION_H_
20 #define __BROWSER_CONNECTION_H_
21 
22 #include <libgda/libgda.h>
23 #include "../tools-favorites.h"
24 #include "decl.h"
25 #include "support.h"
26 #ifdef HAVE_LDAP
27 #include <libgda/sqlite/virtual/gda-ldap-connection.h>
28 #endif
29 
30 G_BEGIN_DECLS
31 
32 #define BROWSER_TYPE_CONNECTION          (browser_connection_get_type())
33 #define BROWSER_CONNECTION(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, browser_connection_get_type(), BrowserConnection)
34 #define BROWSER_CONNECTION_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, browser_connection_get_type (), BrowserConnectionClass)
35 #define BROWSER_IS_CONNECTION(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, browser_connection_get_type ())
36 
37 typedef struct _BrowserConnectionClass BrowserConnectionClass;
38 typedef struct _BrowserConnectionPrivate BrowserConnectionPrivate;
39 
40 /* struct for the object's data */
41 struct _BrowserConnection
42 {
43 	GObject                   object;
44 	BrowserConnectionPrivate *priv;
45 };
46 
47 /* struct for the object's class */
48 struct _BrowserConnectionClass
49 {
50 	GObjectClass              parent_class;
51 
52 	/* signals */
53 	void                    (*busy) (BrowserConnection *bcnc, gboolean is_busy, const gchar *reason);
54 	void                    (*meta_changed) (BrowserConnection *bcnc, GdaMetaStruct *mstruct);
55 	void                    (*favorites_changed) (BrowserConnection *bcnc);
56 	void                    (*transaction_status_changed) (BrowserConnection *bcnc);
57 	void                    (*table_column_pref_changed) (BrowserConnection *bcnc, GdaMetaTable *table,
58 							      GdaMetaTableColumn *column,
59 							      const gchar *attr_name, const gchar *value);
60 };
61 
62 /**
63  * SECTION:browser-connection
64  * @short_description: An opened connection
65  * @title: BrowserConnection
66  * @stability: Stable
67  * @see_also:
68  *
69  * The #BrowserConnection object wraps a #GdaConnection with some
70  * additionnal features. The wrapped #GdaConnection is only accessible from within
71  * the #BrowserConnection object, so to use a connection, you have to use the
72  * #BrowserConnection's methods.
73  */
74 
75 GType               browser_connection_get_type               (void) G_GNUC_CONST;
76 
77 BrowserConnection  *browser_connection_new                    (GdaConnection *cnc);
78 const gchar        *browser_connection_get_name               (BrowserConnection *bcnc);
79 gchar              *browser_connection_get_long_name          (BrowserConnection *bcnc);
80 const GdaDsnInfo   *browser_connection_get_information        (BrowserConnection *bcnc);
81 
82 gboolean            browser_connection_is_busy                (BrowserConnection *bcnc, gchar **out_reason);
83 gboolean            browser_connection_is_virtual             (BrowserConnection *bcnc);
84 void                browser_connection_update_meta_data       (BrowserConnection *bcnc);
85 void                browser_connection_meta_data_changed      (BrowserConnection *bcnc);
86 GdaMetaStruct      *browser_connection_get_meta_struct        (BrowserConnection *bcnc);
87 GdaMetaStore       *browser_connection_get_meta_store         (BrowserConnection *bcnc);
88 const gchar        *browser_connection_get_dictionary_file    (BrowserConnection *bcnc);
89 
90 ToolsFavorites   *browser_connection_get_favorites          (BrowserConnection *bcnc);
91 
92 gchar             **browser_connection_get_completions        (BrowserConnection *bcnc, const gchar *sql,
93 							       gint start, gint end);
94 
95 /**
96  * BrowserConnectionJobCallback:
97  * @bcnc: the #BrowserConnection
98  * @out_result: the execution result
99  * @data: a pointer passed when calling the execution function such as browser_connection_ldap_describe_entry()
100  * @error: the error returned, if any
101  *
102  * Callback function called when a job (not a statement execution job) is finished.
103  * the out_result is not used by the BrowserConnection anymore after this function has been
104  * called, so you need to keep it or free it.
105  *
106  * @error should not be modified.
107  */
108 typedef void (*BrowserConnectionJobCallback) (BrowserConnection *bcnc,
109 					      gpointer out_result, gpointer data, GError *error);
110 #define BROWSER_CONNECTION_JOB_CALLBACK(x) ((BrowserConnectionJobCallback)(x))
111 void                browser_connection_job_cancel             (BrowserConnection *bcnc, guint job_id);
112 
113 /*
114  * statements's manipulations
115  */
116 GdaSqlParser       *browser_connection_create_parser          (BrowserConnection *bcnc);
117 gchar              *browser_connection_render_pretty_sql      (BrowserConnection *bcnc,
118 							       GdaStatement *stmt);
119 guint               browser_connection_execute_statement      (BrowserConnection *bcnc,
120 							       GdaStatement *stmt,
121 							       GdaSet *params,
122 							       GdaStatementModelUsage model_usage,
123 							       gboolean need_last_insert_row,
124 							       GError **error);
125 guint               browser_connection_rerun_select           (BrowserConnection *bcnc,
126 							       GdaDataModel *model,
127 							       GError **error);
128 GObject            *browser_connection_execution_get_result   (BrowserConnection *bcnc,
129 							       guint exec_id,
130 							       GdaSet **last_insert_row, GError **error);
131 gboolean            browser_connection_normalize_sql_statement(BrowserConnection *bcnc,
132 							       GdaSqlStatement *sqlst, GError **error);
133 gboolean            browser_connection_check_sql_statement_validify (BrowserConnection *bcnc,
134 								     GdaSqlStatement *sqlst, GError **error);
135 /**
136  * BrowserConnectionExecuteCallback
137  *
138  * Callback function called by browser_connection_execute_statement_cb(). If you need to keep
139  * some of the arguments for a later usage, you need to ref/copy them.
140  *
141  * None of the passed arguments must not be modified
142  */
143 typedef void (*BrowserConnectionExecuteCallback) (BrowserConnection *bcnc,
144 						  guint exec_id,
145 						  GObject *out_result,
146 						  GdaSet *out_last_inserted_row, GError *error,
147 						  gpointer data);
148 
149 guint               browser_connection_execute_statement_cb   (BrowserConnection *bcnc,
150 							       GdaStatement *stmt,
151 							       GdaSet *params,
152 							       GdaStatementModelUsage model_usage,
153 							       gboolean need_last_insert_row,
154 							       BrowserConnectionExecuteCallback callback,
155 							       gpointer data,
156 							       GError **error);
157 guint               browser_connection_rerun_select_cb        (BrowserConnection *bcnc,
158 							       GdaDataModel *model,
159 							       BrowserConnectionExecuteCallback callback,
160 							       gpointer data,
161 							       GError **error);
162 
163 
164 /*
165  * transactions
166  */
167 GdaTransactionStatus *browser_connection_get_transaction_status (BrowserConnection *bcnc);
168 gboolean              browser_connection_begin (BrowserConnection *bcnc, GError **error);
169 gboolean              browser_connection_commit (BrowserConnection *bcnc, GError **error);
170 gboolean              browser_connection_rollback (BrowserConnection *bcnc, GError **error);
171 
172 /*
173  * preferences
174  */
175 #define BROWSER_CONNECTION_COLUMN_PLUGIN "PLUGIN"
176 gboolean             browser_connection_set_table_column_attribute (BrowserConnection *bcnc,
177 								    GdaMetaTable *table,
178 								    GdaMetaTableColumn *column,
179 								    const gchar *attr_name,
180 								    const gchar *value, GError **error);
181 gchar               *browser_connection_get_table_column_attribute (BrowserConnection *bcnc,
182 								    GdaMetaTable *table,
183 								    GdaMetaTableColumn *column,
184 								    const gchar *attr_name,
185 								    GError **error);
186 
187 void                 browser_connection_define_ui_plugins_for_batch(BrowserConnection *bcnc,
188 								    GdaBatch *batch, GdaSet *params);
189 void                 browser_connection_define_ui_plugins_for_stmt (BrowserConnection *bcnc,
190 								    GdaStatement *stmt, GdaSet *params);
191 
192 /*
193  * Variables used at various places and for which a copy of the last recent value
194  * is stored in the BrowserConnection object
195  */
196 void                 browser_connection_keep_variables (BrowserConnection *bcnc, GdaSet *set);
197 void                 browser_connection_load_variables (BrowserConnection *bcnc, GdaSet *set);
198 
199 /*
200  * LDAP
201  */
202 gboolean             browser_connection_is_ldap        (BrowserConnection *bcnc);
203 #ifdef HAVE_LDAP
204 const         gchar *browser_connection_ldap_get_base_dn (BrowserConnection *bcnc);
205 guint                browser_connection_ldap_search (BrowserConnection *bcnc,
206 						     const gchar *base_dn, const gchar *filter,
207 						     const gchar *attributes, GdaLdapSearchScope scope,
208 						     BrowserConnectionJobCallback callback,
209 						     gpointer cb_data, GError **error);
210 guint                browser_connection_ldap_describe_entry (BrowserConnection *bcnc, const gchar *dn,
211 							     BrowserConnectionJobCallback callback,
212 							     gpointer cb_data, GError **error);
213 guint                browser_connection_ldap_get_entry_children (BrowserConnection *bcnc, const gchar *dn,
214 								 gchar **attributes,
215 								 BrowserConnectionJobCallback callback,
216 								 gpointer cb_data, GError **error);
217 guint                browser_connection_ldap_icon_for_dn (BrowserConnection *bcnc, const gchar *dn,
218 							  BrowserConnectionJobCallback callback,
219 							  gpointer cb_data, GError **error);
220 GdkPixbuf           *browser_connection_ldap_icon_for_class (GdaLdapAttribute *objectclass);
221 gboolean             browser_connection_describe_table  (BrowserConnection *bcnc, const gchar *table_name,
222 							 const gchar **out_base_dn, const gchar **out_filter,
223 							 const gchar **out_attributes,
224 							 GdaLdapSearchScope *out_scope, GError **error);
225 
226 GdaLdapClass        *browser_connection_get_class_info (BrowserConnection *bcnc, const gchar *classname);
227 const GSList        *browser_connection_get_top_classes (BrowserConnection *bcnc);
228 
229 gboolean             browser_connection_declare_table   (BrowserConnection *bcnc,
230                                                          const gchar *table_name,
231                                                          const gchar *base_dn,
232                                                          const gchar *filter,
233                                                          const gchar *attributes,
234                                                          GdaLdapSearchScope scope,
235                                                          GError **error);
236 gboolean             browser_connection_undeclare_table   (BrowserConnection *bcnc,
237 							   const gchar *table_name,
238 							   GError **error);
239 
240 #endif
241 
242 G_END_DECLS
243 
244 #endif
245