1/* 2** 2010 February 23 3** 4** The author disclaims copyright to this source code. In place of 5** a legal notice, here is a blessing: 6** 7** May you do good and not evil. 8** May you find forgiveness for yourself and forgive others. 9** May you share freely, never taking more than you give. 10** 11************************************************************************* 12** 13** This file implements routines used to report what compile-time options 14** SQLite was built with. 15*/ 16 17#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS 18 19#include "sqliteInt.h" 20 21/* 22** An array of names of all compile-time options. This array should 23** be sorted A-Z. 24** 25** This array looks large, but in a typical installation actually uses 26** only a handful of compile-time options, so most times this array is usually 27** rather short and uses little memory space. 28*/ 29static const char * const azCompileOpt[] = { 30 31/* These macros are provided to "stringify" the value of the define 32** for those options in which the value is meaningful. */ 33#define CTIMEOPT_VAL_(opt) #opt 34#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 35 36#ifdef SQLITE_32BIT_ROWID 37 "32BIT_ROWID", 38#endif 39#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC 40 "4_BYTE_ALIGNED_MALLOC", 41#endif 42#ifdef SQLITE_CASE_SENSITIVE_LIKE 43 "CASE_SENSITIVE_LIKE", 44#endif 45#ifdef SQLITE_CHECK_PAGES 46 "CHECK_PAGES", 47#endif 48#ifdef SQLITE_COVERAGE_TEST 49 "COVERAGE_TEST", 50#endif 51#ifdef SQLITE_DEBUG 52 "DEBUG", 53#endif 54#ifdef SQLITE_DEFAULT_LOCKING_MODE 55 "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), 56#endif 57#ifdef SQLITE_DISABLE_DIRSYNC 58 "DISABLE_DIRSYNC", 59#endif 60#ifdef SQLITE_DISABLE_LFS 61 "DISABLE_LFS", 62#endif 63#ifdef SQLITE_ENABLE_ATOMIC_WRITE 64 "ENABLE_ATOMIC_WRITE", 65#endif 66#ifdef SQLITE_ENABLE_CEROD 67 "ENABLE_CEROD", 68#endif 69#ifdef SQLITE_ENABLE_COLUMN_METADATA 70 "ENABLE_COLUMN_METADATA", 71#endif 72#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT 73 "ENABLE_EXPENSIVE_ASSERT", 74#endif 75#ifdef SQLITE_ENABLE_FTS1 76 "ENABLE_FTS1", 77#endif 78#ifdef SQLITE_ENABLE_FTS2 79 "ENABLE_FTS2", 80#endif 81#ifdef SQLITE_ENABLE_FTS3 82 "ENABLE_FTS3", 83#endif 84#ifdef SQLITE_ENABLE_FTS3_PARENTHESIS 85 "ENABLE_FTS3_PARENTHESIS", 86#endif 87#ifdef SQLITE_ENABLE_FTS4 88 "ENABLE_FTS4", 89#endif 90#ifdef SQLITE_ENABLE_ICU 91 "ENABLE_ICU", 92#endif 93#ifdef SQLITE_ENABLE_IOTRACE 94 "ENABLE_IOTRACE", 95#endif 96#ifdef SQLITE_ENABLE_LOAD_EXTENSION 97 "ENABLE_LOAD_EXTENSION", 98#endif 99#ifdef SQLITE_ENABLE_LOCKING_STYLE 100 "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), 101#endif 102#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT 103 "ENABLE_MEMORY_MANAGEMENT", 104#endif 105#ifdef SQLITE_ENABLE_MEMSYS3 106 "ENABLE_MEMSYS3", 107#endif 108#ifdef SQLITE_ENABLE_MEMSYS5 109 "ENABLE_MEMSYS5", 110#endif 111#ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK 112 "ENABLE_OVERSIZE_CELL_CHECK", 113#endif 114#ifdef SQLITE_ENABLE_RTREE 115 "ENABLE_RTREE", 116#endif 117#ifdef SQLITE_ENABLE_STAT2 118 "ENABLE_STAT2", 119#endif 120#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 121 "ENABLE_UNLOCK_NOTIFY", 122#endif 123#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 124 "ENABLE_UPDATE_DELETE_LIMIT", 125#endif 126#ifdef SQLITE_HAS_CODEC 127 "HAS_CODEC", 128#endif 129#ifdef SQLITE_HAVE_ISNAN 130 "HAVE_ISNAN", 131#endif 132#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX 133 "HOMEGROWN_RECURSIVE_MUTEX", 134#endif 135#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS 136 "IGNORE_AFP_LOCK_ERRORS", 137#endif 138#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS 139 "IGNORE_FLOCK_LOCK_ERRORS", 140#endif 141#ifdef SQLITE_INT64_TYPE 142 "INT64_TYPE", 143#endif 144#ifdef SQLITE_LOCK_TRACE 145 "LOCK_TRACE", 146#endif 147#ifdef SQLITE_MEMDEBUG 148 "MEMDEBUG", 149#endif 150#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT 151 "MIXED_ENDIAN_64BIT_FLOAT", 152#endif 153#ifdef SQLITE_NO_SYNC 154 "NO_SYNC", 155#endif 156#ifdef SQLITE_OMIT_ALTERTABLE 157 "OMIT_ALTERTABLE", 158#endif 159#ifdef SQLITE_OMIT_ANALYZE 160 "OMIT_ANALYZE", 161#endif 162#ifdef SQLITE_OMIT_ATTACH 163 "OMIT_ATTACH", 164#endif 165#ifdef SQLITE_OMIT_AUTHORIZATION 166 "OMIT_AUTHORIZATION", 167#endif 168#ifdef SQLITE_OMIT_AUTOINCREMENT 169 "OMIT_AUTOINCREMENT", 170#endif 171#ifdef SQLITE_OMIT_AUTOINIT 172 "OMIT_AUTOINIT", 173#endif 174#ifdef SQLITE_OMIT_AUTOMATIC_INDEX 175 "OMIT_AUTOMATIC_INDEX", 176#endif 177#ifdef SQLITE_OMIT_AUTORESET 178 "OMIT_AUTORESET", 179#endif 180#ifdef SQLITE_OMIT_AUTOVACUUM 181 "OMIT_AUTOVACUUM", 182#endif 183#ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION 184 "OMIT_BETWEEN_OPTIMIZATION", 185#endif 186#ifdef SQLITE_OMIT_BLOB_LITERAL 187 "OMIT_BLOB_LITERAL", 188#endif 189#ifdef SQLITE_OMIT_BTREECOUNT 190 "OMIT_BTREECOUNT", 191#endif 192#ifdef SQLITE_OMIT_BUILTIN_TEST 193 "OMIT_BUILTIN_TEST", 194#endif 195#ifdef SQLITE_OMIT_CAST 196 "OMIT_CAST", 197#endif 198#ifdef SQLITE_OMIT_CHECK 199 "OMIT_CHECK", 200#endif 201/* // redundant 202** #ifdef SQLITE_OMIT_COMPILEOPTION_DIAGS 203** "OMIT_COMPILEOPTION_DIAGS", 204** #endif 205*/ 206#ifdef SQLITE_OMIT_COMPLETE 207 "OMIT_COMPLETE", 208#endif 209#ifdef SQLITE_OMIT_COMPOUND_SELECT 210 "OMIT_COMPOUND_SELECT", 211#endif 212#ifdef SQLITE_OMIT_DATETIME_FUNCS 213 "OMIT_DATETIME_FUNCS", 214#endif 215#ifdef SQLITE_OMIT_DECLTYPE 216 "OMIT_DECLTYPE", 217#endif 218#ifdef SQLITE_OMIT_DEPRECATED 219 "OMIT_DEPRECATED", 220#endif 221#ifdef SQLITE_OMIT_DISKIO 222 "OMIT_DISKIO", 223#endif 224#ifdef SQLITE_OMIT_EXPLAIN 225 "OMIT_EXPLAIN", 226#endif 227#ifdef SQLITE_OMIT_FLAG_PRAGMAS 228 "OMIT_FLAG_PRAGMAS", 229#endif 230#ifdef SQLITE_OMIT_FLOATING_POINT 231 "OMIT_FLOATING_POINT", 232#endif 233#ifdef SQLITE_OMIT_FOREIGN_KEY 234 "OMIT_FOREIGN_KEY", 235#endif 236#ifdef SQLITE_OMIT_GET_TABLE 237 "OMIT_GET_TABLE", 238#endif 239#ifdef SQLITE_OMIT_INCRBLOB 240 "OMIT_INCRBLOB", 241#endif 242#ifdef SQLITE_OMIT_INTEGRITY_CHECK 243 "OMIT_INTEGRITY_CHECK", 244#endif 245#ifdef SQLITE_OMIT_LIKE_OPTIMIZATION 246 "OMIT_LIKE_OPTIMIZATION", 247#endif 248#ifdef SQLITE_OMIT_LOAD_EXTENSION 249 "OMIT_LOAD_EXTENSION", 250#endif 251#ifdef SQLITE_OMIT_LOCALTIME 252 "OMIT_LOCALTIME", 253#endif 254#ifdef SQLITE_OMIT_LOOKASIDE 255 "OMIT_LOOKASIDE", 256#endif 257#ifdef SQLITE_OMIT_MEMORYDB 258 "OMIT_MEMORYDB", 259#endif 260#ifdef SQLITE_OMIT_OR_OPTIMIZATION 261 "OMIT_OR_OPTIMIZATION", 262#endif 263#ifdef SQLITE_OMIT_PAGER_PRAGMAS 264 "OMIT_PAGER_PRAGMAS", 265#endif 266#ifdef SQLITE_OMIT_PRAGMA 267 "OMIT_PRAGMA", 268#endif 269#ifdef SQLITE_OMIT_PROGRESS_CALLBACK 270 "OMIT_PROGRESS_CALLBACK", 271#endif 272#ifdef SQLITE_OMIT_QUICKBALANCE 273 "OMIT_QUICKBALANCE", 274#endif 275#ifdef SQLITE_OMIT_REINDEX 276 "OMIT_REINDEX", 277#endif 278#ifdef SQLITE_OMIT_SCHEMA_PRAGMAS 279 "OMIT_SCHEMA_PRAGMAS", 280#endif 281#ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS 282 "OMIT_SCHEMA_VERSION_PRAGMAS", 283#endif 284#ifdef SQLITE_OMIT_SHARED_CACHE 285 "OMIT_SHARED_CACHE", 286#endif 287#ifdef SQLITE_OMIT_SUBQUERY 288 "OMIT_SUBQUERY", 289#endif 290#ifdef SQLITE_OMIT_TCL_VARIABLE 291 "OMIT_TCL_VARIABLE", 292#endif 293#ifdef SQLITE_OMIT_TEMPDB 294 "OMIT_TEMPDB", 295#endif 296#ifdef SQLITE_OMIT_TRACE 297 "OMIT_TRACE", 298#endif 299#ifdef SQLITE_OMIT_TRIGGER 300 "OMIT_TRIGGER", 301#endif 302#ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION 303 "OMIT_TRUNCATE_OPTIMIZATION", 304#endif 305#ifdef SQLITE_OMIT_UTF16 306 "OMIT_UTF16", 307#endif 308#ifdef SQLITE_OMIT_VACUUM 309 "OMIT_VACUUM", 310#endif 311#ifdef SQLITE_OMIT_VIEW 312 "OMIT_VIEW", 313#endif 314#ifdef SQLITE_OMIT_VIRTUALTABLE 315 "OMIT_VIRTUALTABLE", 316#endif 317#ifdef SQLITE_OMIT_WAL 318 "OMIT_WAL", 319#endif 320#ifdef SQLITE_OMIT_WSD 321 "OMIT_WSD", 322#endif 323#ifdef SQLITE_OMIT_XFER_OPT 324 "OMIT_XFER_OPT", 325#endif 326#ifdef SQLITE_PERFORMANCE_TRACE 327 "PERFORMANCE_TRACE", 328#endif 329#ifdef SQLITE_PROXY_DEBUG 330 "PROXY_DEBUG", 331#endif 332#ifdef SQLITE_SECURE_DELETE 333 "SECURE_DELETE", 334#endif 335#ifdef SQLITE_SMALL_STACK 336 "SMALL_STACK", 337#endif 338#ifdef SQLITE_SOUNDEX 339 "SOUNDEX", 340#endif 341#ifdef SQLITE_TCL 342 "TCL", 343#endif 344#ifdef SQLITE_TEMP_STORE 345 "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), 346#endif 347#ifdef SQLITE_TEST 348 "TEST", 349#endif 350#ifdef SQLITE_THREADSAFE 351 "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), 352#endif 353#ifdef SQLITE_USE_ALLOCA 354 "USE_ALLOCA", 355#endif 356#ifdef SQLITE_ZERO_MALLOC 357 "ZERO_MALLOC" 358#endif 359}; 360 361/* 362** Given the name of a compile-time option, return true if that option 363** was used and false if not. 364** 365** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix 366** is not required for a match. 367*/ 368int sqlite3_compileoption_used(const char *zOptName){ 369 int i, n; 370 if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; 371 n = sqlite3Strlen30(zOptName); 372 373 /* Since ArraySize(azCompileOpt) is normally in single digits, a 374 ** linear search is adequate. No need for a binary search. */ 375 for(i=0; i<ArraySize(azCompileOpt); i++){ 376 if( (sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0) 377 && ( (azCompileOpt[i][n]==0) || (azCompileOpt[i][n]=='=') ) ) return 1; 378 } 379 return 0; 380} 381 382/* 383** Return the N-th compile-time option string. If N is out of range, 384** return a NULL pointer. 385*/ 386const char *sqlite3_compileoption_get(int N){ 387 if( N>=0 && N<ArraySize(azCompileOpt) ){ 388 return azCompileOpt[N]; 389 } 390 return 0; 391} 392 393#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ 394