cannam@125
|
1 /*
|
cannam@125
|
2 ** Copyright (C) 2005-2011 Erik de Castro Lopo
|
cannam@125
|
3 **
|
cannam@125
|
4 ** This program is free software; you can redistribute it and/or modify
|
cannam@125
|
5 ** it under the terms of the GNU General Public License as published by
|
cannam@125
|
6 ** the Free Software Foundation; either version 2 of the License, or
|
cannam@125
|
7 ** (at your option) any later version.
|
cannam@125
|
8 **
|
cannam@125
|
9 ** This program is distributed in the hope that it will be useful,
|
cannam@125
|
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
cannam@125
|
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
cannam@125
|
12 ** GNU General Public License for more details.
|
cannam@125
|
13 **
|
cannam@125
|
14 ** You should have received a copy of the GNU General Public License
|
cannam@125
|
15 ** along with this program; if not, write to the Free Software
|
cannam@125
|
16 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
cannam@125
|
17 */
|
cannam@125
|
18
|
cannam@125
|
19 #include "config.h"
|
cannam@125
|
20
|
cannam@125
|
21 #include <stdio.h>
|
cannam@125
|
22 #include <stdlib.h>
|
cannam@125
|
23 #include <unistd.h>
|
cannam@125
|
24 #include <string.h>
|
cannam@125
|
25 #include <fcntl.h>
|
cannam@125
|
26 #include <sys/stat.h>
|
cannam@125
|
27
|
cannam@125
|
28 #include <sndfile.h>
|
cannam@125
|
29
|
cannam@125
|
30 #include "regtest.h"
|
cannam@125
|
31
|
cannam@125
|
32 #if HAVE_SQLITE3
|
cannam@125
|
33
|
cannam@125
|
34 #include <sqlite3.h>
|
cannam@125
|
35
|
cannam@125
|
36 typedef struct
|
cannam@125
|
37 { sqlite3 *sql ;
|
cannam@125
|
38
|
cannam@125
|
39 int count ;
|
cannam@125
|
40 int ekey_max ;
|
cannam@125
|
41
|
cannam@125
|
42 /* Filename and pathname for file. */
|
cannam@125
|
43 char filename [256] ;
|
cannam@125
|
44 char pathname [512] ;
|
cannam@125
|
45
|
cannam@125
|
46 /* Storage for createding SQL commands. Must be larger than logbuf below. */
|
cannam@125
|
47 char cmdbuf [1 << 15] ;
|
cannam@125
|
48
|
cannam@125
|
49 /* Storage for log buffer retrieved from SNDFILE* .*/
|
cannam@125
|
50 char logbuf [1 << 14] ;
|
cannam@125
|
51
|
cannam@125
|
52 } REGTEST_DB ;
|
cannam@125
|
53
|
cannam@125
|
54 /* In checksum.c */
|
cannam@125
|
55 int calc_checksum (SNDFILE * file, const SF_INFO * info) ;
|
cannam@125
|
56
|
cannam@125
|
57 static void get_filename_pathname (REGTEST_DB * db, const char *filepath) ;
|
cannam@125
|
58 static void single_quote_replace (char * buf) ;
|
cannam@125
|
59
|
cannam@125
|
60 static int get_ekey_from_filename (REGTEST_DB * db, const char *filepath) ;
|
cannam@125
|
61 static int get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) ;
|
cannam@125
|
62 static int check_file_by_ekey (REGTEST_DB * db, int ekey) ;
|
cannam@125
|
63
|
cannam@125
|
64 static int count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ;
|
cannam@125
|
65 static int ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ;
|
cannam@125
|
66 static int callback (void *unused, int argc, char **argv, char **colname) ;
|
cannam@125
|
67
|
cannam@125
|
68 REG_DB *
|
cannam@125
|
69 db_open (const char * db_name)
|
cannam@125
|
70 { REGTEST_DB * db ;
|
cannam@125
|
71 int err ;
|
cannam@125
|
72
|
cannam@125
|
73 if ((db = malloc (sizeof (REGTEST_DB))) == NULL)
|
cannam@125
|
74 { perror ("malloc") ;
|
cannam@125
|
75 exit (1) ;
|
cannam@125
|
76 } ;
|
cannam@125
|
77
|
cannam@125
|
78 if ((err = sqlite3_open (db_name, &(db->sql))) != 0)
|
cannam@125
|
79 { printf ("Can't open database: %s\n", sqlite3_errmsg (db->sql)) ;
|
cannam@125
|
80 sqlite3_close (db->sql) ;
|
cannam@125
|
81 free (db) ;
|
cannam@125
|
82 exit (1) ;
|
cannam@125
|
83 } ;
|
cannam@125
|
84
|
cannam@125
|
85 return (REG_DB *) db ;
|
cannam@125
|
86 } /* db_open */
|
cannam@125
|
87
|
cannam@125
|
88 int
|
cannam@125
|
89 db_create (const char * db_name)
|
cannam@125
|
90 { REGTEST_DB * db ;
|
cannam@125
|
91 const char *cmd ;
|
cannam@125
|
92 char * errmsg = NULL ;
|
cannam@125
|
93 int err ;
|
cannam@125
|
94
|
cannam@125
|
95 db = (REGTEST_DB *) db_open (db_name) ;
|
cannam@125
|
96
|
cannam@125
|
97 cmd = "create table sndfile (ekey INTEGER PRIMARY KEY,"
|
cannam@125
|
98 "fname VARCHAR(1),"
|
cannam@125
|
99 "fpath VARCHAR(1),"
|
cannam@125
|
100 "srate INTEGER,"
|
cannam@125
|
101 "frames VARCHAR(1),"
|
cannam@125
|
102 "channels INTEGER,"
|
cannam@125
|
103 "format VARCHAR(1),"
|
cannam@125
|
104 "checksum VARCHAR(1),"
|
cannam@125
|
105 "logbuf VARCHAR(1)"
|
cannam@125
|
106 ");" ;
|
cannam@125
|
107
|
cannam@125
|
108 err = sqlite3_exec (db->sql, cmd, callback, 0, &errmsg) ;
|
cannam@125
|
109 if (err != SQLITE_OK)
|
cannam@125
|
110 printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
111
|
cannam@125
|
112 sqlite3_close (db->sql) ;
|
cannam@125
|
113 free (db) ;
|
cannam@125
|
114
|
cannam@125
|
115 return 0 ;
|
cannam@125
|
116 } /* db_create */
|
cannam@125
|
117
|
cannam@125
|
118 int
|
cannam@125
|
119 db_close (REG_DB * db_handle)
|
cannam@125
|
120 { REGTEST_DB * db ;
|
cannam@125
|
121
|
cannam@125
|
122 db = (REGTEST_DB *) db_handle ;
|
cannam@125
|
123
|
cannam@125
|
124 sqlite3_close (db->sql) ;
|
cannam@125
|
125 free (db) ;
|
cannam@125
|
126
|
cannam@125
|
127 return 0 ;
|
cannam@125
|
128 } /* db_close */
|
cannam@125
|
129
|
cannam@125
|
130 /*==============================================================================
|
cannam@125
|
131 */
|
cannam@125
|
132
|
cannam@125
|
133 int
|
cannam@125
|
134 db_file_exists (REG_DB * db_handle, const char * filename)
|
cannam@125
|
135 { REGTEST_DB * db ;
|
cannam@125
|
136 const char * cptr ;
|
cannam@125
|
137 char * errmsg ;
|
cannam@125
|
138 int err ;
|
cannam@125
|
139
|
cannam@125
|
140 db = (REGTEST_DB *) db_handle ;
|
cannam@125
|
141
|
cannam@125
|
142 if ((cptr = strrchr (filename, '/')) != NULL)
|
cannam@125
|
143 filename = cptr + 1 ;
|
cannam@125
|
144
|
cannam@125
|
145 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname from sndfile where fname='%s'", filename) ;
|
cannam@125
|
146
|
cannam@125
|
147 db->count = 0 ;
|
cannam@125
|
148 err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) count_callback, db, &errmsg) ;
|
cannam@125
|
149 if (err == 0 && db->count == 1)
|
cannam@125
|
150 return 1 ;
|
cannam@125
|
151
|
cannam@125
|
152 return 0 ;
|
cannam@125
|
153 } /* db_file_exists */
|
cannam@125
|
154
|
cannam@125
|
155 int
|
cannam@125
|
156 db_add_file (REG_DB * db_handle, const char * filepath)
|
cannam@125
|
157 { REGTEST_DB * db ;
|
cannam@125
|
158 SNDFILE * sndfile ;
|
cannam@125
|
159 SF_INFO info ;
|
cannam@125
|
160 char * errmsg ;
|
cannam@125
|
161 int err, checksum ;
|
cannam@125
|
162
|
cannam@125
|
163 db = (REGTEST_DB *) db_handle ;
|
cannam@125
|
164
|
cannam@125
|
165 get_filename_pathname (db, filepath) ;
|
cannam@125
|
166
|
cannam@125
|
167 if (db_file_exists (db_handle, filepath))
|
cannam@125
|
168 { printf (" %s : already in database\n", db->filename) ;
|
cannam@125
|
169 return 0 ;
|
cannam@125
|
170 } ;
|
cannam@125
|
171
|
cannam@125
|
172 memset (&info, 0, sizeof (info)) ;
|
cannam@125
|
173 sndfile = sf_open (db->pathname, SFM_READ, &info) ;
|
cannam@125
|
174 sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ;
|
cannam@125
|
175 checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ;
|
cannam@125
|
176 sf_close (sndfile) ;
|
cannam@125
|
177
|
cannam@125
|
178 if (sndfile == NULL)
|
cannam@125
|
179 { printf (" %s : could not open : %s\n", db->filename, sf_strerror (NULL)) ;
|
cannam@125
|
180 puts (db->logbuf) ;
|
cannam@125
|
181 return 1 ;
|
cannam@125
|
182 } ;
|
cannam@125
|
183
|
cannam@125
|
184 single_quote_replace (db->logbuf) ;
|
cannam@125
|
185
|
cannam@125
|
186 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "insert into sndfile "
|
cannam@125
|
187 "(fname, fpath, srate, frames, channels, format, checksum, logbuf) values"
|
cannam@125
|
188 "('%s','%s',%d,'%ld', %d, '0x%08x', '0x%08x', '%s');",
|
cannam@125
|
189 db->filename, db->pathname, info.samplerate, (long) info.frames, info.channels, info.format, checksum, db->logbuf) ;
|
cannam@125
|
190
|
cannam@125
|
191 if (strlen (db->cmdbuf) >= sizeof (db->cmdbuf) - 1)
|
cannam@125
|
192 { printf ("strlen (db->cmdbuf) too long.\n") ;
|
cannam@125
|
193 exit (1) ;
|
cannam@125
|
194 } ;
|
cannam@125
|
195
|
cannam@125
|
196 err = sqlite3_exec (db->sql, db->cmdbuf, callback, 0, &errmsg) ;
|
cannam@125
|
197 if (err != SQLITE_OK)
|
cannam@125
|
198 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
199 puts (db->cmdbuf) ;
|
cannam@125
|
200 } ;
|
cannam@125
|
201
|
cannam@125
|
202 return 0 ;
|
cannam@125
|
203 } /* db_add_file */
|
cannam@125
|
204
|
cannam@125
|
205 int
|
cannam@125
|
206 db_check_file (REG_DB * db_handle, const char * filepath)
|
cannam@125
|
207 { REGTEST_DB * db ;
|
cannam@125
|
208 int ekey ;
|
cannam@125
|
209
|
cannam@125
|
210 if (db_file_exists (db_handle, filepath) == 0)
|
cannam@125
|
211 { printf ("\nFile not in database.\n\n") ;
|
cannam@125
|
212 exit (0) ;
|
cannam@125
|
213 } ;
|
cannam@125
|
214
|
cannam@125
|
215 db = (REGTEST_DB *) db_handle ;
|
cannam@125
|
216
|
cannam@125
|
217 ekey = get_ekey_from_filename (db, filepath) ;
|
cannam@125
|
218
|
cannam@125
|
219 return check_file_by_ekey (db, ekey) ;
|
cannam@125
|
220 } /* db_check_file */
|
cannam@125
|
221
|
cannam@125
|
222 /*==============================================================================
|
cannam@125
|
223 */
|
cannam@125
|
224
|
cannam@125
|
225 int
|
cannam@125
|
226 db_check_all (REG_DB * db_handle)
|
cannam@125
|
227 { REGTEST_DB * db ;
|
cannam@125
|
228 char * errmsg ;
|
cannam@125
|
229 int err, ekey ;
|
cannam@125
|
230
|
cannam@125
|
231 db = (REGTEST_DB *) db_handle ;
|
cannam@125
|
232
|
cannam@125
|
233 db->ekey_max = 0 ;
|
cannam@125
|
234
|
cannam@125
|
235 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile") ;
|
cannam@125
|
236
|
cannam@125
|
237 err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) ekey_max_callback, db, &errmsg) ;
|
cannam@125
|
238 if (err != SQLITE_OK)
|
cannam@125
|
239 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
240 puts (db->cmdbuf) ;
|
cannam@125
|
241 } ;
|
cannam@125
|
242
|
cannam@125
|
243 for (ekey = 1 ; ekey <= db->ekey_max ; ekey++)
|
cannam@125
|
244 if (get_filename_pathname_by_ekey (db, ekey) != 0)
|
cannam@125
|
245 check_file_by_ekey (db, ekey) ;
|
cannam@125
|
246
|
cannam@125
|
247 return 0 ;
|
cannam@125
|
248 } /* db_check_all */
|
cannam@125
|
249
|
cannam@125
|
250
|
cannam@125
|
251 int
|
cannam@125
|
252 db_list_all (REG_DB * db_handle)
|
cannam@125
|
253 {
|
cannam@125
|
254 printf ("%s : %p\n", __func__, db_handle) ;
|
cannam@125
|
255 return 0 ;
|
cannam@125
|
256 } /* db_list_all */
|
cannam@125
|
257
|
cannam@125
|
258 int
|
cannam@125
|
259 db_del_entry (REG_DB * db_handle, const char * entry)
|
cannam@125
|
260 {
|
cannam@125
|
261 printf ("%s : %p %s\n", __func__, db_handle, entry) ;
|
cannam@125
|
262 return 0 ;
|
cannam@125
|
263 } /* db_del_entry */
|
cannam@125
|
264
|
cannam@125
|
265 /*==============================================================================
|
cannam@125
|
266 */
|
cannam@125
|
267
|
cannam@125
|
268 static int
|
cannam@125
|
269 get_ekey_from_filename (REGTEST_DB * db, const char *filepath)
|
cannam@125
|
270 { char * errmsg, **result ;
|
cannam@125
|
271 int err, ekey = 0, rows, cols ;
|
cannam@125
|
272
|
cannam@125
|
273 get_filename_pathname (db, filepath) ;
|
cannam@125
|
274
|
cannam@125
|
275 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile where fname='%s'", db->filename) ;
|
cannam@125
|
276
|
cannam@125
|
277 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
|
cannam@125
|
278 if (err != SQLITE_OK)
|
cannam@125
|
279 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
280 puts (db->cmdbuf) ;
|
cannam@125
|
281 } ;
|
cannam@125
|
282
|
cannam@125
|
283 if (cols != 1 || rows != 1)
|
cannam@125
|
284 { printf ("Bad juju!! rows = %d cols = %d\n", rows, cols) ;
|
cannam@125
|
285 exit (1) ;
|
cannam@125
|
286 } ;
|
cannam@125
|
287
|
cannam@125
|
288 ekey = strtol (result [1], NULL, 10) ;
|
cannam@125
|
289
|
cannam@125
|
290 sqlite3_free_table (result) ;
|
cannam@125
|
291
|
cannam@125
|
292 return ekey ;
|
cannam@125
|
293 } /* get_ekey_from_filename */
|
cannam@125
|
294
|
cannam@125
|
295 static int
|
cannam@125
|
296 get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey)
|
cannam@125
|
297 { char *errmsg, **result ;
|
cannam@125
|
298 int err, rows, cols ;
|
cannam@125
|
299
|
cannam@125
|
300 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,fpath from sndfile where ekey='%d'", ekey) ;
|
cannam@125
|
301
|
cannam@125
|
302 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
|
cannam@125
|
303 if (err != SQLITE_OK)
|
cannam@125
|
304 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
305 puts (db->cmdbuf) ;
|
cannam@125
|
306 return 0 ;
|
cannam@125
|
307 } ;
|
cannam@125
|
308
|
cannam@125
|
309 if (cols != 2 || rows != 1)
|
cannam@125
|
310 { printf ("\nError (%s %d) : rows = %d cols = %d\n", __func__, __LINE__, rows, cols) ;
|
cannam@125
|
311 exit (1) ;
|
cannam@125
|
312 } ;
|
cannam@125
|
313
|
cannam@125
|
314 snprintf (db->filename, sizeof (db->filename), "%s", result [2]) ;
|
cannam@125
|
315 snprintf (db->pathname, sizeof (db->pathname), "%s", result [3]) ;
|
cannam@125
|
316
|
cannam@125
|
317 sqlite3_free_table (result) ;
|
cannam@125
|
318
|
cannam@125
|
319 return 1 ;
|
cannam@125
|
320 } /* get_filename_pathname_by_ekey */
|
cannam@125
|
321
|
cannam@125
|
322 static int
|
cannam@125
|
323 check_file_by_ekey (REGTEST_DB * db, int ekey)
|
cannam@125
|
324 { SNDFILE * sndfile ;
|
cannam@125
|
325 SF_INFO info ;
|
cannam@125
|
326 char * errmsg, **result ;
|
cannam@125
|
327 int err, k, rows, cols, checksum ;
|
cannam@125
|
328
|
cannam@125
|
329 printf (" %s : ", db->filename) ;
|
cannam@125
|
330 fflush (stdout) ;
|
cannam@125
|
331
|
cannam@125
|
332 memset (&info, 0, sizeof (info)) ;
|
cannam@125
|
333 sndfile = sf_open (db->pathname, SFM_READ, &info) ;
|
cannam@125
|
334 sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ;
|
cannam@125
|
335 checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ;
|
cannam@125
|
336 sf_close (sndfile) ;
|
cannam@125
|
337
|
cannam@125
|
338 if (sndfile == NULL)
|
cannam@125
|
339 { printf ("\n\nError : Could not open '%s' : %s\n", db->pathname, sf_strerror (NULL)) ;
|
cannam@125
|
340 puts (db->logbuf) ;
|
cannam@125
|
341 exit (1) ;
|
cannam@125
|
342 } ;
|
cannam@125
|
343
|
cannam@125
|
344 single_quote_replace (db->logbuf) ;
|
cannam@125
|
345
|
cannam@125
|
346 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,srate,frames,channels,format,"
|
cannam@125
|
347 "checksum,logbuf from sndfile where ekey='%d'", ekey) ;
|
cannam@125
|
348
|
cannam@125
|
349 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
|
cannam@125
|
350 if (err != SQLITE_OK)
|
cannam@125
|
351 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
|
cannam@125
|
352 puts (db->cmdbuf) ;
|
cannam@125
|
353 } ;
|
cannam@125
|
354
|
cannam@125
|
355 for (k = 0 ; k < cols ; k++)
|
cannam@125
|
356 { if (strcmp (result [k], "fname") == 0)
|
cannam@125
|
357 { if (strcmp (result [k + cols], db->filename) == 0)
|
cannam@125
|
358 continue ;
|
cannam@125
|
359 printf ("\n\nError : fname doesn't match : %s != %s\n", result [k + cols], db->filename) ;
|
cannam@125
|
360 } ;
|
cannam@125
|
361
|
cannam@125
|
362 if (strcmp (result [k], "srate") == 0)
|
cannam@125
|
363 { if (strtol (result [k + cols], NULL, 10) == info.samplerate)
|
cannam@125
|
364 continue ;
|
cannam@125
|
365 printf ("\n\nError : srate doesn't match : %s == %d\n", result [k + cols], info.samplerate) ;
|
cannam@125
|
366 } ;
|
cannam@125
|
367
|
cannam@125
|
368 if (strcmp (result [k], "frames") == 0)
|
cannam@125
|
369 { if (strtoll (result [k + cols], NULL, 10) == info.frames)
|
cannam@125
|
370 continue ;
|
cannam@125
|
371 printf ("\n\nError : frames doesn't match : %s == %ld\n", result [k + cols], (long) info.frames) ;
|
cannam@125
|
372 } ;
|
cannam@125
|
373
|
cannam@125
|
374 if (strcmp (result [k], "channels") == 0)
|
cannam@125
|
375 { if (strtol (result [k + cols], NULL, 10) == info.channels)
|
cannam@125
|
376 continue ;
|
cannam@125
|
377 printf ("\n\nError : channels doesn't match : %s == %d\n", result [k + cols], info.channels) ;
|
cannam@125
|
378 } ;
|
cannam@125
|
379
|
cannam@125
|
380 if (strcmp (result [k], "format") == 0)
|
cannam@125
|
381 { if (strtol (result [k + cols], NULL, 16) == info.format)
|
cannam@125
|
382 continue ;
|
cannam@125
|
383 printf ("\n\nError : format doesn't match : %s == 0x%08x\n", result [k + cols], info.format) ;
|
cannam@125
|
384 } ;
|
cannam@125
|
385
|
cannam@125
|
386 if (strcmp (result [k], "checksum") == 0)
|
cannam@125
|
387 { int db_val = (int) strtoll (result [k + cols], NULL, 16) ;
|
cannam@125
|
388
|
cannam@125
|
389 if (db_val == checksum)
|
cannam@125
|
390 continue ;
|
cannam@125
|
391 printf ("\n\nError : checksum doesn't match : 0x%08x == 0x%08x\n", db_val, checksum) ;
|
cannam@125
|
392 } ;
|
cannam@125
|
393
|
cannam@125
|
394 if (strcmp (result [k], "logbuf") == 0)
|
cannam@125
|
395 continue ;
|
cannam@125
|
396
|
cannam@125
|
397 printf ("\nHere is the old logubuffer :\n\n%s\n\nand the new :\n\n%s\n\n", result [2 * cols - 1], db->logbuf) ;
|
cannam@125
|
398 exit (1) ;
|
cannam@125
|
399 } ;
|
cannam@125
|
400
|
cannam@125
|
401 sqlite3_free_table (result) ;
|
cannam@125
|
402
|
cannam@125
|
403 puts ("ok") ;
|
cannam@125
|
404
|
cannam@125
|
405 return 0 ;
|
cannam@125
|
406 } /* check_file_by_ekey */
|
cannam@125
|
407
|
cannam@125
|
408 /*==============================================================================
|
cannam@125
|
409 */
|
cannam@125
|
410
|
cannam@125
|
411 static void
|
cannam@125
|
412 get_filename_pathname (REGTEST_DB * db, const char *filepath)
|
cannam@125
|
413 { const char * cptr ;
|
cannam@125
|
414 int slen ;
|
cannam@125
|
415
|
cannam@125
|
416 if (filepath [0] != '/')
|
cannam@125
|
417 { memset (db->pathname, 0, sizeof (db->pathname)) ;
|
cannam@125
|
418 if (getcwd (db->pathname, sizeof (db->pathname)) == NULL)
|
cannam@125
|
419 { perror ("\ngetcwd failed") ;
|
cannam@125
|
420 exit (1) ;
|
cannam@125
|
421 } ;
|
cannam@125
|
422
|
cannam@125
|
423 slen = strlen (db->pathname) ;
|
cannam@125
|
424 db->pathname [slen ++] = '/' ;
|
cannam@125
|
425 snprintf (db->pathname + slen, sizeof (db->pathname) - slen, "%s", filepath) ;
|
cannam@125
|
426 }
|
cannam@125
|
427 else
|
cannam@125
|
428 snprintf (db->pathname, sizeof (db->pathname), "%s", filepath) ;
|
cannam@125
|
429
|
cannam@125
|
430 if ((cptr = strrchr (db->pathname, '/')) == NULL)
|
cannam@125
|
431 { printf ("\nError : bad pathname %s\n", filepath) ;
|
cannam@125
|
432 exit (1) ;
|
cannam@125
|
433 } ;
|
cannam@125
|
434
|
cannam@125
|
435 snprintf (db->filename, sizeof (db->filename), "%s", cptr + 1) ;
|
cannam@125
|
436 } /* get filename_pathname */
|
cannam@125
|
437
|
cannam@125
|
438 static void
|
cannam@125
|
439 single_quote_replace (char * buf)
|
cannam@125
|
440 { while ((buf = strchr (buf, '\'')) != 0)
|
cannam@125
|
441 buf [0] = '"' ;
|
cannam@125
|
442 } /* single_quote_replace */
|
cannam@125
|
443
|
cannam@125
|
444 static int
|
cannam@125
|
445 count_callback (REGTEST_DB * db, int argc, char **argv, char **colname)
|
cannam@125
|
446 { db->count ++ ;
|
cannam@125
|
447
|
cannam@125
|
448 (void) argc ;
|
cannam@125
|
449 (void) argv ;
|
cannam@125
|
450 (void) colname ;
|
cannam@125
|
451 return 0 ;
|
cannam@125
|
452 } /* count_callback */
|
cannam@125
|
453
|
cannam@125
|
454 static int
|
cannam@125
|
455 ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **unused)
|
cannam@125
|
456 { int ekey ;
|
cannam@125
|
457
|
cannam@125
|
458 (void) argc ;
|
cannam@125
|
459 (void) unused ;
|
cannam@125
|
460
|
cannam@125
|
461 ekey = strtol (argv [0], NULL, 10) ;
|
cannam@125
|
462 if (ekey > db->ekey_max)
|
cannam@125
|
463 db->ekey_max = ekey ;
|
cannam@125
|
464
|
cannam@125
|
465 return 0 ;
|
cannam@125
|
466 } /* ekey_max_callback */
|
cannam@125
|
467
|
cannam@125
|
468 static int
|
cannam@125
|
469 callback (void *unused, int argc, char **argv, char **colname)
|
cannam@125
|
470 { int k ;
|
cannam@125
|
471
|
cannam@125
|
472 (void) unused ;
|
cannam@125
|
473
|
cannam@125
|
474 for (k = 0 ; k < argc ; k++)
|
cannam@125
|
475 printf ("%s = %s\n", colname [k], argv [k] ? argv [k] : "NULL") ;
|
cannam@125
|
476
|
cannam@125
|
477 printf ("\n") ;
|
cannam@125
|
478
|
cannam@125
|
479 return 0 ;
|
cannam@125
|
480 } /* callback */
|
cannam@125
|
481
|
cannam@125
|
482 #else
|
cannam@125
|
483
|
cannam@125
|
484 int dummy (void) ;
|
cannam@125
|
485
|
cannam@125
|
486 int
|
cannam@125
|
487 dummy (void)
|
cannam@125
|
488 { /*
|
cannam@125
|
489 ** Empty dummy fnction so tha compiler doesn't winge about an
|
cannam@125
|
490 ** empty file.
|
cannam@125
|
491 */
|
cannam@125
|
492 return 0 ;
|
cannam@125
|
493 } /* dummy */
|
cannam@125
|
494
|
cannam@125
|
495 #endif
|