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