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