1 module gdaDemo.TestGda;
2
3 import gdac.gdatypes;
4 import gda.Gda;
5 import gda.Client;
6 import gda.Config;
7 import gda.Connection;
8 import gda.Command;
9 import gda.DataModel;
10 import gda.DataSourceInfo;
11 import gda.ProviderInfo;
12 import gda.Value;
13 import gda.ErrorGda;
14 import glib.ListG;
15
16 version(Tango)
17 {
18 import tango.io.Stdout;
19 import tango.text.Util : substitute;
20 import tango.stdc.stdlib : exit;
21
22 void writef( string frm, ... ){
23 string frm2 = substitute( frm, "%s", "{}" );
24 Stdout( Stdout.layout.convert( _arguments, _argptr, frm2 ))();
25 }
26
27 void writefln( string frm, ... ){
28 string frm2 = substitute( frm, "%s", "{}" );
29 Stdout( Stdout.layout.convert( _arguments, _argptr, frm2 )).newline;
30 }
31 }
32 else
33 {
34 import std.stdio;
35 import std.c.process;
36 }
37
38 void main (string[] args)
39 {
40 Gda.init("TestGDA", "0.1", args);
41 save_ds();
42 do_stuff();
43 }
44
45 void save_ds ()
46 {
47 Config.saveDataSource("calvaris", "MySQL", "DATABASE=calvaris", "cosa de calvaris", null, null);
48 }
49
50 void do_stuff ()
51 {
52 list_providers ();
53 list_datasources ();
54
55 Client client = new Client();
56 Connection connection = client.openConnection("calvaris", null, null, GdaConnectionOptions.READ_ONLY);
57 if (!connection) {
58 writefln("Connection failed!");
59 exit(1);
60 }
61 if (!connection.isOpen()) {
62 writefln("no connection?");
63 get_errors(connection);
64 exit(1);
65 }
66 writefln("about to do some queries");
67 execute_some_queries (connection);
68
69 //process_accounts(connection);
70 client.closeAllConnections();
71
72 //gda_main_quit();
73 }
74
75 void execute_some_queries (Connection connection)
76 {
77 execute_sql_non_query (connection, "DELETE FROM cliente");
78 execute_sql_non_query (connection,
79 "INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
80 "VALUES ('1', '1234', 'Xabier',"
81 "'Rua Unha calquera', '123')"
82 "; INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
83 "VALUES ('2', '2345', 'Rodriguez',"
84 "'Rua Outra calquera', '234')");
85 execute_sql_non_query (connection,
86 "INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
87 "VALUES ('1', '1234', 'Xabier',"
88 "'Rua Unha calquera', '123')"
89 "; INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
90 "VALUES ('2', '2345', 'Rodriguez',"
91 "'Rua Outra calquera', '234')");
92 execute_sql_command (connection, "SELECT * FROM cliente");
93
94
95 execute_sql_non_query (connection,
96 "DELETE FROM accounts;"
97 "INSERT INTO accounts"
98 "(client_code, account_code, balance)"
99 "VALUES (123, 456, 1000);"
100 "INSERT INTO accounts"
101 "(client_code, account_code, balance)"
102 "VALUES (789, 012, 5000);");
103
104 execute_sql_command (connection, "SELECT * FROM Client");
105 }
106
107 void list_datasources ()
108 {
109 ListG ds_list = Config.getDataSourceList();
110
111 writef("\n");
112
113 for (int n=0;n<ds_list.length();n++)
114 {
115 ListG node = ds_list.nth(n);
116
117 DataSourceInfo info = new DataSourceInfo(node);
118
119 writefln("NAME: %s PROVIDER: %s CNC: %s DESC: %s USER: %s PASSWORD: %s\n",
120 info.name, info.provider, info.cncString, info.description,
121 info.username, info.password);
122 }
123
124 //gda_config_free_data_source_list (ds_list);
125 }
126
127 void list_providers ()
128 {
129 ListG prov_list = Config.getProviderList();
130
131 for (int n =0; n < prov_list.length(); n++)
132 {
133 ListG node = prov_list.nth(n);
134
135 ProviderInfo info = new ProviderInfo(node);
136
137 writefln("ID: %s", info.id);
138 }
139
140 //gda_config_free_provider_list (prov_list);
141 }
142
143 int execute_sql_non_query (Connection connection, string buffer)
144 {
145 writefln("execute_sql_non_query %s", buffer);
146 int number;
147 auto command = new Command(buffer, GdaCommandType.TYPE_SQL, GdaCommandOptions.STOP_ON_ERRORS);
148
149 number = connection.executeNonQuery(command, null);
150
151 return number;
152 }
153
154 bool execute_sql_command (Connection connection, string buffer)
155 {
156 writefln("execute_sql_command %s", buffer);
157 bool errors=false;
158
159 auto command = new Command(buffer, GdaCommandType.TYPE_SQL, GdaCommandOptions.STOP_ON_ERRORS);
160 ListG list = connection.executeCommand(command, null);
161
162 if (list is null)
163 {
164 writefln("no data");
165 return true;
166 }
167
168 writefln("got %d datamodels", list.length());
169 get_errors(connection);
170 for (int n=0; n<list.length();n++)
171 {
172 // one for the wrapper?
173
174 DataModel dm= new DataModel( list.nth(n));
175
176 if (dm is null)
177 {
178 errors=true;
179 continue;
180 }
181
182 show_table (dm);
183 //g_object_unref(dm);
184 }
185
186 //gda_command_free (command);
187
188 return errors;
189 }
190
191 void show_table (DataModel dm)
192 {
193 int row_id;
194 int column_id;
195
196 for (column_id = 0; column_id < dm.getNColumns(); column_id++)
197 {
198 writef("%s\t", dm.getColumnTitle(column_id));
199 }
200
201 writef("\n");
202
203 for (row_id = 0; row_id < dm.getNRows(); row_id++)
204 {
205 for (column_id = 0; column_id < dm.getNColumns(); column_id++)
206 {
207 Value value = dm.getValueAt(column_id, row_id);
208 writefln("%s\t", value.stringify());
209 }
210 writef("\n");
211 }
212 }
213
214 bool get_errors (Connection connection)
215 {
216 ListG list = connection.getErrors();
217 bool ret=false;
218
219 for (int n = 0; n<list.length(); n++)
220 {
221 ListG node = list.nth(n);
222
223 ErrorGda error = new ErrorGda(node);
224
225 writefln("Error no: %d\tdesc: %s\t source: %s\tsqlstate: %s ",
226 error.getNumber(),
227 error.getDescription(),
228 error.getSource(),
229 error.getSqlstate());
230 }
231
232 ret = true;
233
234 return ret;
235 }