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