From e36d23a85ebff914d74bb541558c2b6082b78edb Mon Sep 17 00:00:00 2001 From: dan miller Date: Sat, 20 Oct 2007 02:49:29 +0000 Subject: [PATCH] sqlite source (unix build) added to libraries --- .../sqlite/unix/build/.libs/libsqlite3.a | Bin 0 -> 2007556 bytes .../sqlite/unix/build/.libs/libsqlite3.lai | 35 + .../sqlite/unix/build/.libs/libsqlite3.so | 1 + .../sqlite/unix/build/.libs/libsqlite3.so.0 | 1 + .../unix/build/.libs/libsqlite3.so.0.8.6 | Bin 0 -> 1441404 bytes libraries/sqlite/unix/build/.libs/sqlite3 | Bin 0 -> 63903 bytes libraries/sqlite/unix/build/Makefile | 775 + libraries/sqlite/unix/opensim_build_notes.txt | 6 + .../sqlite/unix/sqlite-3.5.1/Makefile.in | 775 + .../unix/sqlite-3.5.1/Makefile.linux-gcc | 124 + libraries/sqlite/unix/sqlite-3.5.1/README | 35 + libraries/sqlite/unix/sqlite-3.5.1/VERSION | 1 + libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 | 6470 +++++ .../sqlite/unix/sqlite-3.5.1/addopcodes.awk | 32 + .../unix/sqlite-3.5.1/art/2005osaward.gif | Bin 0 -> 3750 bytes .../sqlite/unix/sqlite-3.5.1/art/SQLite.eps | Bin 0 -> 24155 bytes .../sqlite/unix/sqlite-3.5.1/art/SQLite.gif | Bin 0 -> 3062 bytes .../unix/sqlite-3.5.1/art/SQLiteLogo3.tiff | Bin 0 -> 85156 bytes .../unix/sqlite-3.5.1/art/SQLite_big.gif | Bin 0 -> 7428 bytes .../sqlite/unix/sqlite-3.5.1/art/nocopy.gif | Bin 0 -> 3449 bytes .../sqlite-3.5.1/art/powered_by_sqlite.gif | Bin 0 -> 3391 bytes .../sqlite/unix/sqlite-3.5.1/config.guess | 1532 + libraries/sqlite/unix/sqlite-3.5.1/config.sub | 1640 ++ libraries/sqlite/unix/sqlite-3.5.1/configure | 21144 ++++++++++++++ .../sqlite/unix/sqlite-3.5.1/configure.ac | 582 + .../unix/sqlite-3.5.1/contrib/sqlitecon.tcl | 679 + .../sqlite/unix/sqlite-3.5.1/doc/lemon.html | 892 + .../sqlite/unix/sqlite-3.5.1/doc/report1.txt | 121 + .../sqlite/unix/sqlite-3.5.1/ext/README.txt | 2 + .../unix/sqlite-3.5.1/ext/fts1/README.txt | 2 + .../sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c | 3344 +++ .../sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h | 11 + .../unix/sqlite-3.5.1/ext/fts1/fts1_hash.c | 369 + .../unix/sqlite-3.5.1/ext/fts1/fts1_hash.h | 112 + .../unix/sqlite-3.5.1/ext/fts1/fts1_porter.c | 643 + .../sqlite-3.5.1/ext/fts1/fts1_tokenizer.h | 90 + .../sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c | 221 + .../sqlite-3.5.1/ext/fts2/README.tokenizers | 134 + .../unix/sqlite-3.5.1/ext/fts2/README.txt | 4 + .../sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c | 5936 ++++ .../sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h | 26 + .../unix/sqlite-3.5.1/ext/fts2/fts2_hash.c | 369 + .../unix/sqlite-3.5.1/ext/fts2/fts2_hash.h | 112 + .../unix/sqlite-3.5.1/ext/fts2/fts2_icu.c | 257 + .../unix/sqlite-3.5.1/ext/fts2/fts2_porter.c | 642 + .../sqlite-3.5.1/ext/fts2/fts2_tokenizer.c | 371 + .../sqlite-3.5.1/ext/fts2/fts2_tokenizer.h | 145 + .../sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c | 229 + .../unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl | 116 + .../sqlite-3.5.1/ext/fts3/README.tokenizers | 134 + .../unix/sqlite-3.5.1/ext/fts3/README.txt | 4 + .../sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c | 5971 ++++ .../sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h | 26 + .../unix/sqlite-3.5.1/ext/fts3/fts3_hash.c | 373 + .../unix/sqlite-3.5.1/ext/fts3/fts3_hash.h | 110 + .../unix/sqlite-3.5.1/ext/fts3/fts3_icu.c | 257 + .../unix/sqlite-3.5.1/ext/fts3/fts3_porter.c | 642 + .../sqlite-3.5.1/ext/fts3/fts3_tokenizer.c | 371 + .../sqlite-3.5.1/ext/fts3/fts3_tokenizer.h | 145 + .../sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c | 229 + .../unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl | 116 + .../unix/sqlite-3.5.1/ext/icu/README.txt | 170 + .../sqlite/unix/sqlite-3.5.1/ext/icu/icu.c | 499 + libraries/sqlite/unix/sqlite-3.5.1/install-sh | 251 + libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh | 6971 +++++ libraries/sqlite/unix/sqlite-3.5.1/main.mk | 552 + libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh | 45 + libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh | 13 + libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh | 22 + .../sqlite/unix/sqlite-3.5.1/mkopcodec.awk | 31 + .../sqlite/unix/sqlite-3.5.1/mkopcodeh.awk | 127 + libraries/sqlite/unix/sqlite-3.5.1/mkso.sh | 29 + libraries/sqlite/unix/sqlite-3.5.1/publish.sh | 129 + .../sqlite/unix/sqlite-3.5.1/spec.template | 62 + .../sqlite/unix/sqlite-3.5.1/sqlite.pc.in | 12 + libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 | 229 + .../sqlite/unix/sqlite-3.5.1/sqlite3.pc.in | 12 + .../sqlite/unix/sqlite-3.5.1/src/alter.c | 622 + .../sqlite/unix/sqlite-3.5.1/src/analyze.c | 418 + .../sqlite/unix/sqlite-3.5.1/src/attach.c | 521 + libraries/sqlite/unix/sqlite-3.5.1/src/auth.c | 234 + .../sqlite/unix/sqlite-3.5.1/src/btmutex.c | 315 + .../sqlite/unix/sqlite-3.5.1/src/btree.c | 6890 +++++ .../sqlite/unix/sqlite-3.5.1/src/btree.h | 204 + .../sqlite/unix/sqlite-3.5.1/src/btreeInt.h | 648 + .../sqlite/unix/sqlite-3.5.1/src/build.c | 3409 +++ .../sqlite/unix/sqlite-3.5.1/src/callback.c | 378 + .../sqlite/unix/sqlite-3.5.1/src/complete.c | 271 + libraries/sqlite/unix/sqlite-3.5.1/src/date.c | 1045 + .../sqlite/unix/sqlite-3.5.1/src/delete.c | 467 + .../sqlite/unix/sqlite-3.5.1/src/dump.txt | 2267 ++ libraries/sqlite/unix/sqlite-3.5.1/src/expr.c | 2617 ++ libraries/sqlite/unix/sqlite-3.5.1/src/func.c | 1509 + libraries/sqlite/unix/sqlite-3.5.1/src/hash.c | 418 + libraries/sqlite/unix/sqlite-3.5.1/src/hash.h | 110 + .../sqlite/unix/sqlite-3.5.1/src/insert.c | 1605 ++ .../sqlite/unix/sqlite-3.5.1/src/journal.c | 238 + .../sqlite/unix/sqlite-3.5.1/src/legacy.c | 134 + .../sqlite/unix/sqlite-3.5.1/src/loadext.c | 516 + libraries/sqlite/unix/sqlite-3.5.1/src/main.c | 1485 + .../sqlite/unix/sqlite-3.5.1/src/malloc.c | 240 + libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c | 229 + libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c | 546 + .../sqlite/unix/sqlite-3.5.1/src/mutex.c | 126 + .../sqlite/unix/sqlite-3.5.1/src/mutex.h | 82 + .../sqlite/unix/sqlite-3.5.1/src/mutex_os2.c | 236 + .../sqlite/unix/sqlite-3.5.1/src/mutex_unix.c | 223 + .../sqlite/unix/sqlite-3.5.1/src/mutex_w32.c | 208 + libraries/sqlite/unix/sqlite-3.5.1/src/os.c | 282 + libraries/sqlite/unix/sqlite-3.5.1/src/os.h | 284 + .../sqlite/unix/sqlite-3.5.1/src/os_common.h | 127 + .../sqlite/unix/sqlite-3.5.1/src/os_os2.c | 1032 + .../sqlite/unix/sqlite-3.5.1/src/os_unix.c | 2749 ++ .../sqlite/unix/sqlite-3.5.1/src/os_win.c | 1545 + .../sqlite/unix/sqlite-3.5.1/src/pager.c | 5104 ++++ .../sqlite/unix/sqlite-3.5.1/src/pager.h | 125 + .../sqlite/unix/sqlite-3.5.1/src/parse.y | 1114 + .../sqlite/unix/sqlite-3.5.1/src/pragma.c | 1186 + .../sqlite/unix/sqlite-3.5.1/src/prepare.c | 742 + .../sqlite/unix/sqlite-3.5.1/src/printf.c | 907 + .../sqlite/unix/sqlite-3.5.1/src/random.c | 103 + .../sqlite/unix/sqlite-3.5.1/src/select.c | 3539 +++ .../sqlite/unix/sqlite-3.5.1/src/shell.c | 2019 ++ .../sqlite/unix/sqlite-3.5.1/src/sqlite.h.in | 3552 +++ .../sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h | 350 + .../sqlite/unix/sqlite-3.5.1/src/sqliteInt.h | 1972 ++ .../unix/sqlite-3.5.1/src/sqliteLimit.h | 169 + .../sqlite/unix/sqlite-3.5.1/src/table.c | 206 + .../sqlite/unix/sqlite-3.5.1/src/tclsqlite.c | 2551 ++ .../sqlite/unix/sqlite-3.5.1/src/test1.c | 4478 +++ .../sqlite/unix/sqlite-3.5.1/src/test2.c | 619 + .../sqlite/unix/sqlite-3.5.1/src/test3.c | 1670 ++ .../sqlite/unix/sqlite-3.5.1/src/test4.c | 716 + .../sqlite/unix/sqlite-3.5.1/src/test5.c | 217 + .../sqlite/unix/sqlite-3.5.1/src/test6.c | 872 + .../sqlite/unix/sqlite-3.5.1/src/test7.c | 724 + .../sqlite/unix/sqlite-3.5.1/src/test8.c | 1215 + .../sqlite/unix/sqlite-3.5.1/src/test9.c | 207 + .../sqlite/unix/sqlite-3.5.1/src/test_async.c | 1541 + .../unix/sqlite-3.5.1/src/test_autoext.c | 164 + .../sqlite/unix/sqlite-3.5.1/src/test_btree.c | 247 + .../unix/sqlite-3.5.1/src/test_config.c | 460 + .../sqlite/unix/sqlite-3.5.1/src/test_hexio.c | 336 + .../unix/sqlite-3.5.1/src/test_loadext.c | 57 + .../unix/sqlite-3.5.1/src/test_malloc.c | 411 + .../sqlite/unix/sqlite-3.5.1/src/test_md5.c | 388 + .../unix/sqlite-3.5.1/src/test_onefile.c | 825 + .../unix/sqlite-3.5.1/src/test_schema.c | 358 + .../unix/sqlite-3.5.1/src/test_server.c | 491 + .../unix/sqlite-3.5.1/src/test_tclvar.c | 327 + .../unix/sqlite-3.5.1/src/test_thread.c | 333 + .../sqlite/unix/sqlite-3.5.1/src/tokenize.c | 508 + .../sqlite/unix/sqlite-3.5.1/src/trigger.c | 839 + .../sqlite/unix/sqlite-3.5.1/src/update.c | 630 + libraries/sqlite/unix/sqlite-3.5.1/src/utf.c | 545 + libraries/sqlite/unix/sqlite-3.5.1/src/util.c | 706 + .../sqlite/unix/sqlite-3.5.1/src/vacuum.c | 262 + libraries/sqlite/unix/sqlite-3.5.1/src/vdbe.c | 5279 ++++ libraries/sqlite/unix/sqlite-3.5.1/src/vdbe.h | 151 + .../sqlite/unix/sqlite-3.5.1/src/vdbeInt.h | 427 + .../sqlite/unix/sqlite-3.5.1/src/vdbeapi.c | 1066 + .../sqlite/unix/sqlite-3.5.1/src/vdbeaux.c | 2243 ++ .../unix/sqlite-3.5.1/src/vdbeaux.c.new1 | 2244 ++ .../sqlite/unix/sqlite-3.5.1/src/vdbeblob.c | 340 + .../sqlite/unix/sqlite-3.5.1/src/vdbefifo.c | 114 + .../sqlite/unix/sqlite-3.5.1/src/vdbemem.c | 1017 + libraries/sqlite/unix/sqlite-3.5.1/src/vtab.c | 797 + .../sqlite/unix/sqlite-3.5.1/src/where.c | 2773 ++ .../sqlite/unix/sqlite-3.5.1/tclinstaller.tcl | 32 + .../unix/sqlite-3.5.1/test/aggerror.test | 78 + .../sqlite/unix/sqlite-3.5.1/test/all.test | 149 + .../sqlite/unix/sqlite-3.5.1/test/alter.test | 756 + .../sqlite/unix/sqlite-3.5.1/test/alter2.test | 440 + .../sqlite/unix/sqlite-3.5.1/test/alter3.test | 396 + .../unix/sqlite-3.5.1/test/altermalloc.test | 68 + .../unix/sqlite-3.5.1/test/analyze.test | 257 + .../sqlite/unix/sqlite-3.5.1/test/async.test | 78 + .../sqlite/unix/sqlite-3.5.1/test/async2.test | 127 + .../sqlite/unix/sqlite-3.5.1/test/async3.test | 73 + .../sqlite/unix/sqlite-3.5.1/test/attach.test | 750 + .../unix/sqlite-3.5.1/test/attach2.test | 389 + .../unix/sqlite-3.5.1/test/attach3.test | 344 + .../unix/sqlite-3.5.1/test/attachmalloc.test | 48 + .../sqlite/unix/sqlite-3.5.1/test/auth.test | 2306 ++ .../sqlite/unix/sqlite-3.5.1/test/auth2.test | 75 + .../unix/sqlite-3.5.1/test/autoinc.test | 536 + .../unix/sqlite-3.5.1/test/autovacuum.test | 646 + .../sqlite-3.5.1/test/autovacuum_crash.test | 58 + .../sqlite-3.5.1/test/autovacuum_ioerr.test | 58 + .../sqlite-3.5.1/test/autovacuum_ioerr2.test | 133 + .../unix/sqlite-3.5.1/test/avtrans.test | 921 + .../sqlite/unix/sqlite-3.5.1/test/badutf.test | 143 + .../unix/sqlite-3.5.1/test/between.test | 113 + .../unix/sqlite-3.5.1/test/bigfile.test | 193 + .../sqlite/unix/sqlite-3.5.1/test/bigrow.test | 223 + .../sqlite/unix/sqlite-3.5.1/test/bind.test | 577 + .../unix/sqlite-3.5.1/test/bindxfer.test | 84 + .../sqlite/unix/sqlite-3.5.1/test/blob.test | 124 + .../sqlite/unix/sqlite-3.5.1/test/btree.test | 1072 + .../sqlite/unix/sqlite-3.5.1/test/btree2.test | 502 + .../sqlite/unix/sqlite-3.5.1/test/btree4.test | 101 + .../sqlite/unix/sqlite-3.5.1/test/btree5.test | 292 + .../sqlite/unix/sqlite-3.5.1/test/btree6.test | 128 + .../sqlite/unix/sqlite-3.5.1/test/btree7.test | 50 + .../sqlite/unix/sqlite-3.5.1/test/btree8.test | 43 + .../sqlite/unix/sqlite-3.5.1/test/btree9.test | 49 + .../sqlite/unix/sqlite-3.5.1/test/busy.test | 44 + .../sqlite/unix/sqlite-3.5.1/test/cache.test | 63 + .../sqlite/unix/sqlite-3.5.1/test/capi2.test | 793 + .../sqlite/unix/sqlite-3.5.1/test/capi3.test | 1071 + .../sqlite/unix/sqlite-3.5.1/test/capi3b.test | 145 + .../sqlite/unix/sqlite-3.5.1/test/capi3c.test | 1245 + .../sqlite/unix/sqlite-3.5.1/test/cast.test | 290 + .../sqlite/unix/sqlite-3.5.1/test/check.test | 372 + .../unix/sqlite-3.5.1/test/collate1.test | 307 + .../unix/sqlite-3.5.1/test/collate2.test | 664 + .../unix/sqlite-3.5.1/test/collate3.test | 429 + .../unix/sqlite-3.5.1/test/collate4.test | 700 + .../unix/sqlite-3.5.1/test/collate5.test | 270 + .../unix/sqlite-3.5.1/test/collate6.test | 153 + .../unix/sqlite-3.5.1/test/collate7.test | 73 + .../unix/sqlite-3.5.1/test/collate8.test | 52 + .../unix/sqlite-3.5.1/test/colmeta.test | 103 + .../unix/sqlite-3.5.1/test/conflict.test | 763 + .../unix/sqlite-3.5.1/test/corrupt.test | 169 + .../unix/sqlite-3.5.1/test/corrupt2.test | 135 + .../unix/sqlite-3.5.1/test/corrupt3.test | 109 + .../unix/sqlite-3.5.1/test/corrupt4.test | 74 + .../sqlite/unix/sqlite-3.5.1/test/crash.test | 403 + .../sqlite/unix/sqlite-3.5.1/test/crash2.test | 132 + .../sqlite/unix/sqlite-3.5.1/test/crash3.test | 191 + .../unix/sqlite-3.5.1/test/createtab.test | 146 + .../sqlite/unix/sqlite-3.5.1/test/date.test | 354 + .../unix/sqlite-3.5.1/test/default.test | 52 + .../sqlite/unix/sqlite-3.5.1/test/delete.test | 313 + .../unix/sqlite-3.5.1/test/delete2.test | 99 + .../unix/sqlite-3.5.1/test/delete3.test | 57 + .../unix/sqlite-3.5.1/test/descidx1.test | 337 + .../unix/sqlite-3.5.1/test/descidx2.test | 184 + .../unix/sqlite-3.5.1/test/descidx3.test | 155 + .../unix/sqlite-3.5.1/test/diskfull.test | 115 + .../unix/sqlite-3.5.1/test/distinctagg.test | 57 + .../sqlite/unix/sqlite-3.5.1/test/enc.test | 172 + .../sqlite/unix/sqlite-3.5.1/test/enc2.test | 554 + .../sqlite/unix/sqlite-3.5.1/test/enc3.test | 81 + .../unix/sqlite-3.5.1/test/exclusive.test | 449 + .../unix/sqlite-3.5.1/test/exclusive2.test | 297 + .../unix/sqlite-3.5.1/test/exclusive3.test | 59 + .../sqlite/unix/sqlite-3.5.1/test/expr.test | 699 + .../unix/sqlite-3.5.1/test/filefmt.test | 115 + .../sqlite/unix/sqlite-3.5.1/test/fkey1.test | 77 + .../unix/sqlite-3.5.1/test/format4.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts1a.test | 186 + .../sqlite/unix/sqlite-3.5.1/test/fts1b.test | 147 + .../sqlite/unix/sqlite-3.5.1/test/fts1c.test | 1213 + .../sqlite/unix/sqlite-3.5.1/test/fts1d.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts1e.test | 85 + .../sqlite/unix/sqlite-3.5.1/test/fts1f.test | 90 + .../sqlite/unix/sqlite-3.5.1/test/fts1i.test | 88 + .../sqlite/unix/sqlite-3.5.1/test/fts1j.test | 89 + .../sqlite/unix/sqlite-3.5.1/test/fts1k.test | 69 + .../sqlite/unix/sqlite-3.5.1/test/fts1l.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts1m.test | 50 + .../sqlite/unix/sqlite-3.5.1/test/fts1n.test | 45 + .../sqlite/unix/sqlite-3.5.1/test/fts1o.test | 138 + .../unix/sqlite-3.5.1/test/fts1porter.test | 23590 ++++++++++++++++ .../sqlite/unix/sqlite-3.5.1/test/fts2a.test | 202 + .../sqlite/unix/sqlite-3.5.1/test/fts2b.test | 147 + .../sqlite/unix/sqlite-3.5.1/test/fts2c.test | 1213 + .../sqlite/unix/sqlite-3.5.1/test/fts2d.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts2e.test | 85 + .../sqlite/unix/sqlite-3.5.1/test/fts2f.test | 90 + .../sqlite/unix/sqlite-3.5.1/test/fts2g.test | 87 + .../sqlite/unix/sqlite-3.5.1/test/fts2h.test | 76 + .../sqlite/unix/sqlite-3.5.1/test/fts2i.test | 87 + .../sqlite/unix/sqlite-3.5.1/test/fts2j.test | 89 + .../sqlite/unix/sqlite-3.5.1/test/fts2k.test | 105 + .../sqlite/unix/sqlite-3.5.1/test/fts2l.test | 69 + .../sqlite/unix/sqlite-3.5.1/test/fts2m.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts2n.test | 196 + .../sqlite/unix/sqlite-3.5.1/test/fts2o.test | 169 + .../unix/sqlite-3.5.1/test/fts2token.test | 174 + .../sqlite/unix/sqlite-3.5.1/test/fts3aa.test | 202 + .../sqlite/unix/sqlite-3.5.1/test/fts3ab.test | 147 + .../sqlite/unix/sqlite-3.5.1/test/fts3ac.test | 1213 + .../sqlite/unix/sqlite-3.5.1/test/fts3ad.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts3ae.test | 85 + .../sqlite/unix/sqlite-3.5.1/test/fts3af.test | 90 + .../sqlite/unix/sqlite-3.5.1/test/fts3ag.test | 87 + .../sqlite/unix/sqlite-3.5.1/test/fts3ah.test | 76 + .../sqlite/unix/sqlite-3.5.1/test/fts3ai.test | 87 + .../sqlite/unix/sqlite-3.5.1/test/fts3aj.test | 89 + .../sqlite/unix/sqlite-3.5.1/test/fts3ak.test | 105 + .../sqlite/unix/sqlite-3.5.1/test/fts3al.test | 69 + .../sqlite/unix/sqlite-3.5.1/test/fts3am.test | 65 + .../sqlite/unix/sqlite-3.5.1/test/fts3an.test | 196 + .../sqlite/unix/sqlite-3.5.1/test/fts3ao.test | 169 + .../unix/sqlite-3.5.1/test/fts3atoken.test | 174 + .../sqlite/unix/sqlite-3.5.1/test/fts3b.test | 218 + .../sqlite/unix/sqlite-3.5.1/test/func.test | 886 + .../sqlite/unix/sqlite-3.5.1/test/fuzz.test | 251 + .../sqlite/unix/sqlite-3.5.1/test/fuzz2.test | 102 + .../unix/sqlite-3.5.1/test/fuzz_common.tcl | 392 + .../unix/sqlite-3.5.1/test/fuzz_malloc.test | 93 + .../sqlite/unix/sqlite-3.5.1/test/hook.test | 297 + .../sqlite/unix/sqlite-3.5.1/test/icu.test | 118 + .../sqlite/unix/sqlite-3.5.1/test/in.test | 367 + .../sqlite/unix/sqlite-3.5.1/test/in2.test | 68 + .../unix/sqlite-3.5.1/test/incrblob.test | 597 + .../unix/sqlite-3.5.1/test/incrblob_err.test | 102 + .../unix/sqlite-3.5.1/test/incrvacuum.test | 699 + .../unix/sqlite-3.5.1/test/incrvacuum2.test | 125 + .../sqlite-3.5.1/test/incrvacuum_ioerr.test | 89 + .../sqlite/unix/sqlite-3.5.1/test/index.test | 711 + .../sqlite/unix/sqlite-3.5.1/test/index2.test | 74 + .../sqlite/unix/sqlite-3.5.1/test/index3.test | 58 + .../sqlite/unix/sqlite-3.5.1/test/insert.test | 391 + .../unix/sqlite-3.5.1/test/insert2.test | 278 + .../unix/sqlite-3.5.1/test/insert3.test | 171 + .../unix/sqlite-3.5.1/test/insert4.test | 272 + .../unix/sqlite-3.5.1/test/interrupt.test | 198 + .../unix/sqlite-3.5.1/test/intpkey.test | 605 + .../sqlite/unix/sqlite-3.5.1/test/io.test | 549 + .../sqlite/unix/sqlite-3.5.1/test/ioerr.test | 290 + .../sqlite/unix/sqlite-3.5.1/test/ioerr2.test | 115 + .../sqlite/unix/sqlite-3.5.1/test/join.test | 461 + .../sqlite/unix/sqlite-3.5.1/test/join2.test | 75 + .../sqlite/unix/sqlite-3.5.1/test/join3.test | 62 + .../sqlite/unix/sqlite-3.5.1/test/join4.test | 98 + .../sqlite/unix/sqlite-3.5.1/test/join5.test | 110 + .../unix/sqlite-3.5.1/test/journal1.test | 67 + .../unix/sqlite-3.5.1/test/lastinsert.test | 366 + .../sqlite-3.5.1/test/laststmtchanges.test | 281 + .../sqlite/unix/sqlite-3.5.1/test/like.test | 400 + .../sqlite/unix/sqlite-3.5.1/test/limit.test | 448 + .../unix/sqlite-3.5.1/test/loadext.test | 218 + .../unix/sqlite-3.5.1/test/loadext2.test | 143 + .../sqlite/unix/sqlite-3.5.1/test/lock.test | 354 + .../sqlite/unix/sqlite-3.5.1/test/lock2.test | 169 + .../sqlite/unix/sqlite-3.5.1/test/lock3.test | 78 + .../sqlite/unix/sqlite-3.5.1/test/lock4.test | 99 + .../sqlite/unix/sqlite-3.5.1/test/main.test | 360 + .../sqlite/unix/sqlite-3.5.1/test/malloc.test | 571 + .../unix/sqlite-3.5.1/test/malloc2.test | 366 + .../unix/sqlite-3.5.1/test/malloc3.test | 657 + .../unix/sqlite-3.5.1/test/malloc4.test | 193 + .../unix/sqlite-3.5.1/test/malloc5.test | 396 + .../unix/sqlite-3.5.1/test/malloc6.test | 55 + .../unix/sqlite-3.5.1/test/malloc7.test | 48 + .../unix/sqlite-3.5.1/test/malloc8.test | 95 + .../unix/sqlite-3.5.1/test/malloc9.test | 51 + .../unix/sqlite-3.5.1/test/mallocA.test | 69 + .../unix/sqlite-3.5.1/test/mallocB.test | 47 + .../unix/sqlite-3.5.1/test/mallocC.test | 134 + .../unix/sqlite-3.5.1/test/mallocD.test | 61 + .../unix/sqlite-3.5.1/test/malloc_common.tcl | 156 + .../sqlite/unix/sqlite-3.5.1/test/manydb.test | 91 + .../sqlite/unix/sqlite-3.5.1/test/memdb.test | 417 + .../unix/sqlite-3.5.1/test/memleak.test | 98 + .../sqlite/unix/sqlite-3.5.1/test/minmax.test | 384 + .../unix/sqlite-3.5.1/test/minmax2.test | 387 + .../sqlite/unix/sqlite-3.5.1/test/misc1.test | 585 + .../sqlite/unix/sqlite-3.5.1/test/misc2.test | 435 + .../sqlite/unix/sqlite-3.5.1/test/misc3.test | 317 + .../sqlite/unix/sqlite-3.5.1/test/misc4.test | 197 + .../sqlite/unix/sqlite-3.5.1/test/misc5.test | 620 + .../sqlite/unix/sqlite-3.5.1/test/misc6.test | 48 + .../sqlite/unix/sqlite-3.5.1/test/misc7.test | 439 + .../sqlite/unix/sqlite-3.5.1/test/misuse.test | 207 + .../unix/sqlite-3.5.1/test/notnull.test | 505 + .../sqlite/unix/sqlite-3.5.1/test/null.test | 252 + .../unix/sqlite-3.5.1/test/onefile.test | 61 + .../sqlite/unix/sqlite-3.5.1/test/openv2.test | 41 + .../sqlite/unix/sqlite-3.5.1/test/pager.test | 571 + .../sqlite/unix/sqlite-3.5.1/test/pager2.test | 408 + .../sqlite/unix/sqlite-3.5.1/test/pager3.test | 73 + .../unix/sqlite-3.5.1/test/pageropt.test | 201 + .../unix/sqlite-3.5.1/test/pagesize.test | 182 + .../sqlite/unix/sqlite-3.5.1/test/pragma.test | 1037 + .../unix/sqlite-3.5.1/test/pragma2.test | 117 + .../sqlite/unix/sqlite-3.5.1/test/printf.test | 324 + .../unix/sqlite-3.5.1/test/progress.test | 177 + .../unix/sqlite-3.5.1/test/ptrchng.test | 222 + .../sqlite/unix/sqlite-3.5.1/test/quick.test | 109 + .../sqlite/unix/sqlite-3.5.1/test/quote.test | 89 + .../sqlite/unix/sqlite-3.5.1/test/rdonly.test | 65 + .../unix/sqlite-3.5.1/test/reindex.test | 172 + .../unix/sqlite-3.5.1/test/rollback.test | 82 + .../sqlite/unix/sqlite-3.5.1/test/rowid.test | 674 + .../sqlite/unix/sqlite-3.5.1/test/safety.test | 68 + .../sqlite/unix/sqlite-3.5.1/test/schema.test | 365 + .../unix/sqlite-3.5.1/test/schema2.test | 338 + .../unix/sqlite-3.5.1/test/select1.test | 913 + .../unix/sqlite-3.5.1/test/select2.test | 185 + .../unix/sqlite-3.5.1/test/select3.test | 264 + .../unix/sqlite-3.5.1/test/select4.test | 617 + .../unix/sqlite-3.5.1/test/select5.test | 192 + .../unix/sqlite-3.5.1/test/select6.test | 507 + .../unix/sqlite-3.5.1/test/select7.test | 159 + .../unix/sqlite-3.5.1/test/server1.test | 171 + .../sqlite/unix/sqlite-3.5.1/test/shared.test | 911 + .../unix/sqlite-3.5.1/test/shared2.test | 131 + .../unix/sqlite-3.5.1/test/shared3.test | 47 + .../unix/sqlite-3.5.1/test/shared_err.test | 463 + .../unix/sqlite-3.5.1/test/shortread1.test | 52 + .../sqlite/unix/sqlite-3.5.1/test/soak.test | 90 + .../unix/sqlite-3.5.1/test/softheap1.test | 47 + .../sqlite/unix/sqlite-3.5.1/test/sort.test | 467 + .../sqlite/unix/sqlite-3.5.1/test/speed1.test | 289 + .../sqlite/unix/sqlite-3.5.1/test/speed2.test | 339 + .../sqlite/unix/sqlite-3.5.1/test/speed3.test | 186 + .../unix/sqlite-3.5.1/test/sqllimits1.test | 576 + .../unix/sqlite-3.5.1/test/subquery.test | 494 + .../unix/sqlite-3.5.1/test/subselect.test | 202 + .../sqlite/unix/sqlite-3.5.1/test/substr.test | 108 + .../sqlite/unix/sqlite-3.5.1/test/sync.test | 97 + .../sqlite/unix/sqlite-3.5.1/test/table.test | 674 + .../unix/sqlite-3.5.1/test/tableapi.test | 219 + .../unix/sqlite-3.5.1/test/tclsqlite.test | 496 + .../unix/sqlite-3.5.1/test/temptable.test | 414 + .../sqlite/unix/sqlite-3.5.1/test/tester.tcl | 554 + .../unix/sqlite-3.5.1/test/thread001.test | 139 + .../unix/sqlite-3.5.1/test/thread002.test | 105 + .../unix/sqlite-3.5.1/test/thread1.test | 172 + .../unix/sqlite-3.5.1/test/thread2.test | 246 + .../unix/sqlite-3.5.1/test/thread_common.tcl | 88 + .../unix/sqlite-3.5.1/test/threadtest1.c | 289 + .../unix/sqlite-3.5.1/test/threadtest2.c | 133 + .../unix/sqlite-3.5.1/test/tkt1435.test | 111 + .../unix/sqlite-3.5.1/test/tkt1443.test | 180 + .../unix/sqlite-3.5.1/test/tkt1444.test | 56 + .../unix/sqlite-3.5.1/test/tkt1449.test | 262 + .../unix/sqlite-3.5.1/test/tkt1473.test | 728 + .../unix/sqlite-3.5.1/test/tkt1501.test | 36 + .../unix/sqlite-3.5.1/test/tkt1512.test | 54 + .../unix/sqlite-3.5.1/test/tkt1514.test | 27 + .../unix/sqlite-3.5.1/test/tkt1536.test | 38 + .../unix/sqlite-3.5.1/test/tkt1537.test | 122 + .../unix/sqlite-3.5.1/test/tkt1567.test | 51 + .../unix/sqlite-3.5.1/test/tkt1644.test | 111 + .../unix/sqlite-3.5.1/test/tkt1667.test | 85 + .../unix/sqlite-3.5.1/test/tkt1873.test | 67 + .../unix/sqlite-3.5.1/test/tkt2141.test | 61 + .../unix/sqlite-3.5.1/test/tkt2192.test | 140 + .../unix/sqlite-3.5.1/test/tkt2213.test | 30 + .../unix/sqlite-3.5.1/test/tkt2251.test | 108 + .../unix/sqlite-3.5.1/test/tkt2285.test | 57 + .../unix/sqlite-3.5.1/test/tkt2332.test | 67 + .../unix/sqlite-3.5.1/test/tkt2339.test | 100 + .../unix/sqlite-3.5.1/test/tkt2391.test | 49 + .../unix/sqlite-3.5.1/test/tkt2409.test | 218 + .../unix/sqlite-3.5.1/test/tkt2450.test | 48 + .../unix/sqlite-3.5.1/test/tkt2640.test | 119 + .../unix/sqlite-3.5.1/test/tkt2643.test | 39 + .../sqlite/unix/sqlite-3.5.1/test/tkt2686.tcl | 46 + .../sqlite/unix/sqlite-3.5.1/test/trace.test | 148 + .../sqlite/unix/sqlite-3.5.1/test/trans.test | 919 + .../unix/sqlite-3.5.1/test/trigger1.test | 631 + .../unix/sqlite-3.5.1/test/trigger2.test | 742 + .../unix/sqlite-3.5.1/test/trigger3.test | 176 + .../unix/sqlite-3.5.1/test/trigger4.test | 200 + .../unix/sqlite-3.5.1/test/trigger5.test | 43 + .../unix/sqlite-3.5.1/test/trigger6.test | 82 + .../unix/sqlite-3.5.1/test/trigger7.test | 121 + .../unix/sqlite-3.5.1/test/trigger8.test | 42 + .../sqlite/unix/sqlite-3.5.1/test/types.test | 324 + .../sqlite/unix/sqlite-3.5.1/test/types2.test | 340 + .../sqlite/unix/sqlite-3.5.1/test/types3.test | 98 + .../sqlite/unix/sqlite-3.5.1/test/unique.test | 253 + .../sqlite/unix/sqlite-3.5.1/test/update.test | 596 + .../sqlite/unix/sqlite-3.5.1/test/utf16.test | 75 + .../unix/sqlite-3.5.1/test/utf16align.test | 84 + .../sqlite/unix/sqlite-3.5.1/test/vacuum.test | 359 + .../unix/sqlite-3.5.1/test/vacuum2.test | 60 + .../sqlite/unix/sqlite-3.5.1/test/varint.test | 32 + .../sqlite/unix/sqlite-3.5.1/test/view.test | 501 + .../sqlite/unix/sqlite-3.5.1/test/vtab1.test | 946 + .../sqlite/unix/sqlite-3.5.1/test/vtab2.test | 90 + .../sqlite/unix/sqlite-3.5.1/test/vtab3.test | 142 + .../sqlite/unix/sqlite-3.5.1/test/vtab4.test | 194 + .../sqlite/unix/sqlite-3.5.1/test/vtab5.test | 153 + .../sqlite/unix/sqlite-3.5.1/test/vtab6.test | 457 + .../sqlite/unix/sqlite-3.5.1/test/vtab7.test | 199 + .../sqlite/unix/sqlite-3.5.1/test/vtab8.test | 78 + .../sqlite/unix/sqlite-3.5.1/test/vtab9.test | 70 + .../sqlite/unix/sqlite-3.5.1/test/vtabA.test | 135 + .../unix/sqlite-3.5.1/test/vtab_alter.test | 103 + .../unix/sqlite-3.5.1/test/vtab_err.test | 71 + .../unix/sqlite-3.5.1/test/vtab_shared.test | 62 + .../sqlite/unix/sqlite-3.5.1/test/vx.txt | 43 + .../sqlite/unix/sqlite-3.5.1/test/where.test | 1156 + .../sqlite/unix/sqlite-3.5.1/test/where2.test | 614 + .../sqlite/unix/sqlite-3.5.1/test/where3.test | 162 + .../sqlite/unix/sqlite-3.5.1/test/where4.test | 270 + .../sqlite/unix/sqlite-3.5.1/test/where5.test | 288 + .../unix/sqlite-3.5.1/test/zeroblob.test | 213 + .../sqlite/unix/sqlite-3.5.1/tool/diffdb.c | 44 + .../sqlite/unix/sqlite-3.5.1/tool/fragck.tcl | 149 + .../sqlite/unix/sqlite-3.5.1/tool/lemon.c | 4781 ++++ .../sqlite/unix/sqlite-3.5.1/tool/lempar.c | 778 + .../sqlite/unix/sqlite-3.5.1/tool/memleak.awk | 29 + .../unix/sqlite-3.5.1/tool/memleak2.awk | 29 + .../unix/sqlite-3.5.1/tool/memleak3.tcl | 233 + .../unix/sqlite-3.5.1/tool/mkkeywordhash.c | 559 + .../sqlite/unix/sqlite-3.5.1/tool/mkopts.tcl | 51 + .../unix/sqlite-3.5.1/tool/mksqlite3c.tcl | 266 + .../sqlite-3.5.1/tool/mksqlite3internalh.tcl | 145 + .../unix/sqlite-3.5.1/tool/omittest.tcl | 176 + .../unix/sqlite-3.5.1/tool/opcodeDoc.awk | 23 + .../sqlite/unix/sqlite-3.5.1/tool/report1.txt | 66 + .../sqlite/unix/sqlite-3.5.1/tool/showdb.c | 86 + .../unix/sqlite-3.5.1/tool/showjournal.c | 76 + .../sqlite/unix/sqlite-3.5.1/tool/soak1.tcl | 103 + .../unix/sqlite-3.5.1/tool/space_used.tcl | 111 + .../unix/sqlite-3.5.1/tool/spaceanal.tcl | 859 + .../unix/sqlite-3.5.1/tool/speedtest.tcl | 275 + .../unix/sqlite-3.5.1/tool/speedtest2.tcl | 207 + .../sqlite/unix/sqlite-3.5.1/www/34to35.tcl | 1006 + .../sqlite/unix/sqlite-3.5.1/www/arch.fig | 64 + .../sqlite/unix/sqlite-3.5.1/www/arch.gif | Bin 0 -> 6487 bytes .../sqlite/unix/sqlite-3.5.1/www/arch.png | Bin 0 -> 4447 bytes .../sqlite/unix/sqlite-3.5.1/www/arch.tcl | 221 + .../sqlite/unix/sqlite-3.5.1/www/arch2.fig | 123 + .../sqlite/unix/sqlite-3.5.1/www/arch2.gif | Bin 0 -> 6501 bytes .../sqlite/unix/sqlite-3.5.1/www/arch2b.fig | 125 + .../sqlite/unix/sqlite-3.5.1/www/audit.tcl | 214 + .../sqlite/unix/sqlite-3.5.1/www/autoinc.tcl | 109 + .../unix/sqlite-3.5.1/www/c_interface.tcl | 1116 + .../sqlite/unix/sqlite-3.5.1/www/capi3.tcl | 516 + .../sqlite/unix/sqlite-3.5.1/www/changes.tcl | 1866 ++ .../sqlite/unix/sqlite-3.5.1/www/common.tcl | 90 + .../sqlite/unix/sqlite-3.5.1/www/compile.tcl | 278 + .../sqlite/unix/sqlite-3.5.1/www/conflict.tcl | 91 + .../sqlite-3.5.1/www/copyright-release.html | 109 + .../sqlite-3.5.1/www/copyright-release.pdf | Bin 0 -> 2848 bytes .../unix/sqlite-3.5.1/www/copyright.tcl | 126 + .../unix/sqlite-3.5.1/www/datatype3.tcl | 440 + .../unix/sqlite-3.5.1/www/datatypes.tcl | 243 + .../unix/sqlite-3.5.1/www/different.tcl | 224 + .../sqlite/unix/sqlite-3.5.1/www/direct1b.gif | Bin 0 -> 11439 bytes .../sqlite/unix/sqlite-3.5.1/www/docs.tcl | 159 + .../sqlite/unix/sqlite-3.5.1/www/download.tcl | 236 + .../sqlite/unix/sqlite-3.5.1/www/dynload.tcl | 70 + .../sqlite/unix/sqlite-3.5.1/www/faq.tcl | 463 + .../unix/sqlite-3.5.1/www/fileformat.tcl | 785 + .../unix/sqlite-3.5.1/www/formatchng.tcl | 285 + .../unix/sqlite-3.5.1/www/fullscanb.gif | Bin 0 -> 11946 bytes .../unix/sqlite-3.5.1/www/index-ex1-x-b.gif | Bin 0 -> 23173 bytes .../sqlite/unix/sqlite-3.5.1/www/index.tcl | 126 + .../unix/sqlite-3.5.1/www/indirect1b1.gif | Bin 0 -> 18098 bytes .../sqlite/unix/sqlite-3.5.1/www/lang.tcl | 2203 ++ .../sqlite/unix/sqlite-3.5.1/www/limits.tcl | 318 + .../unix/sqlite-3.5.1/www/lockingv3.tcl | 570 + .../sqlite/unix/sqlite-3.5.1/www/mingw.tcl | 160 + .../sqlite/unix/sqlite-3.5.1/www/mkapidoc.tcl | 176 + .../sqlite/unix/sqlite-3.5.1/www/nulls.tcl | 329 + .../sqlite/unix/sqlite-3.5.1/www/oldnews.tcl | 485 + .../sqlite/unix/sqlite-3.5.1/www/omitted.tcl | 85 + .../sqlite/unix/sqlite-3.5.1/www/opcode.tcl | 243 + .../unix/sqlite-3.5.1/www/optimizer.tcl | 265 + .../unix/sqlite-3.5.1/www/optimizing.tcl | 15 + .../unix/sqlite-3.5.1/www/optoverview.tcl | 516 + .../sqlite/unix/sqlite-3.5.1/www/pragma.tcl | 635 + .../unix/sqlite-3.5.1/www/quickstart.tcl | 110 + .../sqlite/unix/sqlite-3.5.1/www/shared.gif | Bin 0 -> 5787 bytes .../unix/sqlite-3.5.1/www/sharedcache.tcl | 221 + .../sqlite/unix/sqlite-3.5.1/www/speed.tcl | 495 + .../sqlite/unix/sqlite-3.5.1/www/sqlite.tcl | 582 + .../sqlite/unix/sqlite-3.5.1/www/support.tcl | 79 + .../unix/sqlite-3.5.1/www/table-ex1b2.gif | Bin 0 -> 10888 bytes .../unix/sqlite-3.5.1/www/tclsqlite.tcl | 666 + .../sqlite/unix/sqlite-3.5.1/www/vdbe.tcl | 1988 ++ .../sqlite/unix/sqlite-3.5.1/www/version3.tcl | 293 + .../unix/sqlite-3.5.1/www/whentouse.tcl | 254 + 574 files changed, 296634 insertions(+) create mode 100644 libraries/sqlite/unix/build/.libs/libsqlite3.a create mode 100644 libraries/sqlite/unix/build/.libs/libsqlite3.lai create mode 120000 libraries/sqlite/unix/build/.libs/libsqlite3.so create mode 120000 libraries/sqlite/unix/build/.libs/libsqlite3.so.0 create mode 100755 libraries/sqlite/unix/build/.libs/libsqlite3.so.0.8.6 create mode 100755 libraries/sqlite/unix/build/.libs/sqlite3 create mode 100644 libraries/sqlite/unix/build/Makefile create mode 100644 libraries/sqlite/unix/opensim_build_notes.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/Makefile.in create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/README create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/VERSION create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/nocopy.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/config.guess create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/config.sub create mode 100755 libraries/sqlite/unix/sqlite-3.5.1/configure create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/configure.ac create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c create mode 100755 libraries/sqlite/unix/sqlite-3.5.1/install-sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/main.mk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/mkso.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/publish.sh create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/spec.template create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/alter.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/attach.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/auth.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/btree.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/btree.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/build.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/callback.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/complete.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/date.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/delete.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/expr.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/func.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/hash.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/hash.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/insert.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/journal.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/main.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/pager.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/pager.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/parse.y create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/printf.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/random.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/select.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/shell.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/sqlite.h.in create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/sqliteLimit.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/table.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/tclsqlite.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test3.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test4.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test5.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test6.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test7.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test8.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test9.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_async.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_autoext.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_btree.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_config.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_hexio.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_loadext.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_malloc.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_md5.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_onefile.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_schema.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_server.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_tclvar.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/test_thread.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/tokenize.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/trigger.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/update.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/utf.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/util.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vacuum.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbe.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbe.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbeInt.h create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbeapi.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbeaux.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbeaux.c.new1 create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbeblob.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbefifo.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vdbemem.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/vtab.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/src/where.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tclinstaller.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/aggerror.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/all.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/alter.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/alter2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/alter3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/altermalloc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/analyze.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/async.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/async2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/async3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/attach.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/attach2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/attach3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/attachmalloc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/auth.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/auth2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/autoinc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/autovacuum.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/autovacuum_crash.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/autovacuum_ioerr.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/autovacuum_ioerr2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/avtrans.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/badutf.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/between.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/bigfile.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/bind.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/bindxfer.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/blob.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree8.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/btree9.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/busy.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/cache.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/capi2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/capi3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/capi3b.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/capi3c.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/cast.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/check.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/collate8.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/colmeta.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/conflict.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/corrupt.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/corrupt2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/corrupt3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/corrupt4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/crash.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/crash2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/crash3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/createtab.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/date.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/default.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/delete.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/delete2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/delete3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/descidx1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/descidx2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/descidx3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/diskfull.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/distinctagg.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/enc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/enc3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/exclusive.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/exclusive2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/exclusive3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/expr.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/filefmt.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fkey1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/format4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1a.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1b.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1c.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1d.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1e.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1f.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1i.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1j.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1k.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1l.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1m.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1n.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1o.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts1porter.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2a.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2b.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2c.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2d.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2e.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2f.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2g.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2h.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2i.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2j.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2k.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2l.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2m.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2n.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2o.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts2token.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3aa.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ab.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ac.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ad.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ae.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3af.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ag.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ah.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ai.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3aj.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ak.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3al.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3am.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3an.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3ao.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3atoken.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fts3b.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/func.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fuzz.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fuzz2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fuzz_common.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/fuzz_malloc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/hook.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/icu.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/in.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/in2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/incrblob.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/incrblob_err.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/incrvacuum.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/incrvacuum2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/incrvacuum_ioerr.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/index.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/index2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/index3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/insert.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/insert2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/insert3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/insert4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/interrupt.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/intpkey.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/io.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/ioerr.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/ioerr2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/join.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/join2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/join3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/join4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/join5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/journal1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/lastinsert.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/laststmtchanges.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/like.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/limit.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/loadext.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/loadext2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/lock.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/lock2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/lock3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/lock4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/main.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc8.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc9.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/mallocA.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/mallocB.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/mallocC.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/mallocD.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/malloc_common.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/manydb.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/memdb.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/memleak.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/minmax.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/minmax2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misc7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/misuse.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/notnull.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/null.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/onefile.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/openv2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pager.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pager2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pager3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pageropt.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pagesize.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pragma.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/pragma2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/printf.test create mode 100755 libraries/sqlite/unix/sqlite-3.5.1/test/progress.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/ptrchng.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/quick.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/quote.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/rdonly.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/reindex.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/rollback.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/rowid.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/safety.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/schema.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/schema2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/select7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/server1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/shared.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/shared2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/shared3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/shared_err.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/shortread1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/soak.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/softheap1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/sort.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/speed1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/speed2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/speed3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/subquery.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/subselect.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/substr.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/sync.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/table.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tableapi.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tclsqlite.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/temptable.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tester.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread002.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread_common.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/threadtest1.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/threadtest2.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1435.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1443.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1444.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1449.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1473.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1501.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1512.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1514.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1536.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1537.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1567.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1644.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1667.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt1873.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2141.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2192.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2213.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2251.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2285.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2332.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2339.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2391.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2409.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2450.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2640.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2643.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/tkt2686.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trace.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trans.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/trigger8.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/types.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/types2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/types3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/unique.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/update.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/utf16.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/utf16align.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vacuum.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vacuum2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/varint.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/view.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab1.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab6.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab7.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab8.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab9.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtabA.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab_alter.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab_err.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vtab_shared.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/vx.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/where.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/where2.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/where3.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/where4.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/where5.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/zeroblob.test create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/diffdb.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/fragck.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/lemon.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/lempar.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/memleak.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/memleak2.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/memleak3.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/mkkeywordhash.c create mode 100755 libraries/sqlite/unix/sqlite-3.5.1/tool/mkopts.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/mksqlite3c.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/mksqlite3internalh.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/omittest.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/opcodeDoc.awk create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/report1.txt create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/showdb.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/showjournal.c create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/soak1.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/space_used.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/spaceanal.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/speedtest.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/tool/speedtest2.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/34to35.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch.fig create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch.png create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch2.fig create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch2.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/arch2b.fig create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/audit.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/autoinc.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/c_interface.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/capi3.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/changes.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/common.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/compile.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/conflict.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/copyright-release.html create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/copyright-release.pdf create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/copyright.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/datatype3.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/datatypes.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/different.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/direct1b.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/docs.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/download.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/dynload.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/faq.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/fileformat.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/formatchng.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/fullscanb.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/index-ex1-x-b.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/index.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/indirect1b1.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/lang.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/limits.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/lockingv3.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/mingw.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/mkapidoc.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/nulls.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/oldnews.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/omitted.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/opcode.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/optimizer.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/optimizing.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/optoverview.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/pragma.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/quickstart.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/shared.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/sharedcache.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/speed.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/sqlite.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/support.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/table-ex1b2.gif create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/tclsqlite.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/vdbe.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/version3.tcl create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/www/whentouse.tcl diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.a b/libraries/sqlite/unix/build/.libs/libsqlite3.a new file mode 100644 index 0000000000000000000000000000000000000000..47e9121815b1ec4ec485235f016f6360e2febfa3 GIT binary patch literal 2007556 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
TqwwzOv4+kg9Pm&MIR6X;bv-fqqt5NI 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

|15uCHq0ykIH^dwrSQN|DVeKPX6ui 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 w%e%68ZNz%@ULOO8@Y4| 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


9X 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 >iP> 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 z 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 z zaGc;&!Fhs<1y>0ELhyHj>jYmAd{giv!7l`rtzXuoK$l-2c&gypg7XDqg0~3XE%>0| zQ-WIr|19`{V6$LG4_#hY!9u|yg69ifDmYW{I>Dua^@6_^TqU?(@I}Fo1iugroubP> zLGTp8GX%>8D+T8Zx`ICwd|dDu!GXPWzUK&z5?mta3jR#+0l_tbO@glrDqFM|pU=ci zT@Lw32f;i+Wpft(e1if^QJ97u+NG zHzL|`K-^!6JENbDcRUf{-HFJjhhT3BKTB{Z5%DU-eSx^Ai2E9GFCZeHg@Sbwo{;c+ z#QmV)BjW#*xYvt&i@0AD_YT2##s3q*X7T@uh;nH=iJVKMEVN_#}JWjf`m^N_cemc#lK#VXF5y|aT}kv(Ju?pJy6_(h;WY+_e62mht@Vk<1P`Zin7OtaS7Up*_Et%C;+ICCIhTl^L_TPOEG-=@4S(DLNdXoLU%`2_i&MQN;U1BgwdC=^<;lQ@o25WigNw7P5 zt$`@!_cr4<0B6l9v@vI9lM!oW2^N_K zYW77|mvy6oO_+gI206>3zBS9lhMJdXNtK=8TaShHRv4WBG=s&rE9SqnyMCE^k7 ziPn8tRnx2P%PBQok>YqHL{maDR@Aij%T2E4FvXsYB9F+EmATEE0yQ0G#HQwcru`)R z-EhrEk<}ZO$xtz=yLV?R8=x=%8d-f|c4Ynd@b|ohC`qSGKEwRAjZj#tP3G3q4ePZ| zBQ4h!4{~01tsHb!BDh zDi`lt8#G`=H8kC&M#ON&zhAW74LOOsUN#W#-nRl85uxy8}Q>f%e6 zCmw-cO}?|=t$ly`>1Qx?BvEpvVJv=@d1|^*{pFVRTD&A=1Ag16g^}8bVE~xThA`?P0G5e z@7$#FE9vF>eX8>HuA#MA-Mjxd1T(oy*_-_H)*wWuaxbyml0j~Cg*(8hpGdR1&5?Kn zRcI{DHQZJ7iL8DzS+)bL#+^_c`AMK|Q6Bnkd>LA~iX+!t(KY0(ilbJM#A_97JD-#F z1qg#N-l(gxMI*^h4Ywr6Y25gAH>ak6bQ^L@qHMPtNHuwb(-=tvNQp_7-U#i8u1D-p zTeqUPv7#F&ViNOe56-tB$(T za#tyO8Xk(j8L8hCTQu2pHb!pE!&HcGkHm9;v^5<`w5QM3HRx!g)?U*Vpn5~m_ImpI z9R>`;sVq@L?~0e#)97Qy3OyT~>V+ziw+q$K#OH*4`^1sNup)Mbs@T#s$OGMQ_$Q=w zr%}^?OTR=CIfx7*NUT8f^$cQlyf(~vc(}36>3-x__Q1^Xa0@Al(H}QwACAPkoR2ia zX$$&r({R7qdfe;TUw&iU;Z|%@xoYw7u%m*~EidcNj;yXHTUkE3oA(o>6_eHyiuu~{ANhLqb=82f>lHbxjSsXSWnE+;YbZa;+te#kpo9=*aWfQ;N-?nQmn$X%)NUHd)|b zaoV^Bb)~m8cF+dF$8GdBh%WvRV#E%HBJq4xQN?suaLCF2{)SnsIbPiju={PV$Dy`y zEHk7U`P*hWe0S}PdQG~8^`<^aU5TR`5_3r|VaS!}Pr z)?l)OG0)=I=&aJZQy1u%&KS%4=u5-^;VXUv+E3;_$2#dw2wssgb}sWy^S$Ar*alPe zZds~Z!JHH$PV^jrjEHj{}R-KOK?OD#2dG=&@tVmVY2BlmQxaPD<(T7VYgzMQi*)Sc^2n1Daw)pca1yU$XfwA(p4_k!Yu;J}N8&?JK(h+KviE#3 zo37IBDd$S4ONbJZdnfU`Ldg-O6gF~62N!{ zuTr_hA4C1Ygmm&qf*aoEXG1mXd@eC##oph$*ICZ~jR(6qn~Of{y*csbq7r9^rtky0 zj;LXCd1$g(J5V)9YEGsXHH)_H&5Ar(IvK0kO0%|OY@<2&`Pz@&n?td`o6b544qynk z{uz8xkCXGpp6`Ep_^|gJIi;FL$uVo4`nTBTC&%Qv4SaI8&B#*iEomMOGurWcKy#5N zHx+Gfu%#tngj133nAUr??hLJV&=8kmh2D zZ)#K{iJ#CHl&B;)sSDNzoMQkB1?nG{xhv3Mqcb|)r)4JcgoT;wFDzXxdZ%X8$jwD8x zVvMuu9?*;GD6SVLLEo5EF*x_o;=>biQv5_#8OCewsU@U3X075s1%c-E&g)+K*Dmnaoa0 z!F}+Ul7hXi3`hx94N5pD8I+t~?kMKshOwknVC`{BM!91~J7wi$>y;y7+YP5=lrv_u z_X1gz%AlxOWV4|w+-`|CYsN~4_?3p{Zh)Hs!cwH zQ)s^h%2`=0yi3TRL{PWf2}ky4?BH}Rbw!MoPD?C0N(OkCeNpc1 z`wVf^#ELvQ0-W`g=1o|cUWae&-Rz>~jb8>cUwOI;1USP%@aiNb**(kt?k7s0jT1{i zIch4-h*jmj=lzmALv=Z4ywgBVj8!0UJu+XJ9f>a+N=l>ejM(JdPrNEtMO7CZDtBeO zNaAAnq?X1~1`7+ooJ|a1prtnrUXLRJJEaGP7^sMC@n*FfnFJ{fa=em}EJdbjw)we% zKL5(80wF{#rF!D#t_WT+&SxvSB7Oqxaz|T(DwPQQ_O6rC6rIIBGW`Ob9l?@fzYxyk>CiIjI_V-oa-lj5PVkE2)C$U-qo2lW$5K_N z>Dg!<#k2gV?!_S?x5QRb(|a3mvG#7N>HZ1&vwQTOs3XH_-Q`DJT$K<~|N zg84c-!PJ|I)f|OX53*nxm{h4bk4_I!1{zfm7WT|O+{fNurMBtKk>xdKaqw75Qf=KO zZzNGe#@&LDGg(9=@jIqgY6-4E=NBV&`s^OCAI;Pg^69Cd0X@un_U=V0HC&Xu95o+T zhA~~RSgZtJIfJ!8K6?JAmVNI%&S_A*?)2+IPW>phQEDXKT1}Lb8jhyKXhcHc2ISI> zyMsYUkE1Q8ejI%3&RY_R*Y;OS&#hCrQtKRd%967k6-7fgN8&v})!dD`38o`IpMc7s zQ=r)hyDBsGy1y9*B}1ZS!FpdBQaz3h{g>#q_?|ORnX;3c%F0r>kwT=A>d}CjO z>8ycl!adIzQe4n)-pc*XrrJ)i-EFYDjl^A4Hg*t#%o04T&q6ld$%wA>&w8zwC1uHe zglX*>m2Gz{z6EZsAd6K%`e?;Jrex?n2yQ1c1ASdVMOM)Ur+yL|;~vNL??L9MC#)87 zsHQ%y_B5eix1RixbJ^#MWDA#KtER_XkGHFMZE6{XN{a=g)+flItyEf2Z*!?WLZvkp zHFlFsShOLwjznxUmUJ_)ace43GeM~mPlK)zqAwKS;dJV(I~0$^SNsh*sJ2l0MxPIA zS<-44rk1p#4Rwc>f%1@Xvb;FpUKC13$D%@^RQ)Zt{FM|-^QF*ot%lK4lJlI zQz`Z8n>QZn=9H8>myYn-s*;pq!tZjobevPal6_A3CUHNXG~E}kbrSc|SyAXD9#Z~v zCN?Z8bL;t})K*tF@NunDurB9#KmccCi0(m^4<|_Z@4td%zi00U(8{i2tlAw%Z}~6B z)e}t*jZ52N2ZlMIN>yb+j6$Yv1M5ek2g6CNTe`a3{y`r)4s?9DGOy@O%1LZ#qPek- z*%^`e&ml(~tu%WNx*^Cgt;S3@P|LZoO@Tc>K+V0k$QG`&sG{6R&Z4;bkShj8l8?~| z3byV_-~7R+$+`6GQ@n61}W(WuRcjmQn{ zx;#WF#-Fj?>CF8S>nSD4sz&dr`%rNd2(jb9*0p}?Br{ojvQt{zSej=x;sT3z=p&?S zEzm*s%t~yH#BahfoFclYrij#}p}q|ci%sKVhp`}$D&E6xSE8j-%2kG)vXC#Y=KAs~ z=II?}om<4dY_9of9HOxds<=Zf3#ZD^spy3j)TvnLD)o$0v4Go-rE$~&tPy7^T}S}V zex*4>?Lw+{KF_WvDfoOs^maKU2fe1>xG;fr@(`wu*2T`*gBmIM3;Pcxf~BpS(E^sF zT1$@eS$op$O6D)CHGPw~$kuuU-HteNkwy3L*imYsJ3@z>+OecEuRu1UCLj&(+4CL< zv69o6dp%Vsn#ztz(|UL(dx&re<%-`YeH%tRGQd+uTq0_T1`b88+R!dAA=K2$>u za4g2Qn_g%7s2Otgb=KOT7PBT641W8%Y;QgI52ohewo%|^u39jije5Q-l~3Vh^@V@xFiuXa98iwqZG^J)rvbYdcRdVV{=v0hUm`8scIZh0Y z96JCrNv0oVsFAGU@KD{2d0^Bdz_+@4uW|Nhk-pU``UD$mxH)cF0XRT>24`NY%@p}U zEiN?c`PjHbuX0J1P8Kd`#E)3EaE^m~S+PibF|-#lA5xW!Bu-|QDi#YkleJ4@rd|(v zr0FPAn+ojhG8v|c6HQT~vYW1E&RtP=Bh|{0Tof^cJhBLyJD;}oWIql|jfxdNm8?Ng zhbR+&_CB(|*m5rkVNF@S1!A{e_ERJkN|q{}7`5`1p>)N(XcT;Hxv%vQZMBkVpl7*k zgjd1&h32VK8^sF14AXQBUME&U)k^IR{Ehod@4!2?#def1xe_O0yg{t>C-I(C7!SAD zt0z!lncl0vdri97WR@mteQCyp&v92=1WH94+2qt=w~R;+a=Y;a0? zIb#azZtQB*^pemC8-`Ry5xVe%o9!WG+4Hiw?nsl={y~Z@%{6Psn@hTeY65Nt@-z=pKxe<*$@WGwar&B*yP`E0zJ=?x${qbm zNli|8;$I&Rsy<3y6JGxf=Ya1j0#HPO7HWA*j=_g2fmD>zA(A}@yoGB~Ta&N4CNxCR z0~8L-O)oMr4pyqsN@!*lotcHN>cV<4A>^o-`mi?Y8agXnm*R1TA5l^5dS0yXbMziy zQCb`tF)nQ!l9pO#C@0Ivm>d0d9?M_=5<{x2k(_#h>+I(AaKZCCpz`Z zLFL#G#xLYTDudf{D6=3BeGd+zmN$mL=#efRmCn`;^tDdpmg${GQYf2bE zw!SG5mM5qFD@1Qh45YhmLC~nlbcY{w5`*AATJY(OomWy9(7>9xswN-?T@vRa<t53rk*X4)2&6Xv)*h4u9S5n<)rQVT-7{Wm%*9JVP|-_ zsJU*Ps&jJPKBR~w4r1B$SLLAvWW#%qbqkTTT9_AtsC_Q6fQ;-CODgfjpTMHWflptJ z6AR6{Kr*3nbXsy?PI6eClD{P_cPzNNcOn|1v=p~Kfw|F?cmf5pm-i0xlcHl%v#7aj zXP_n{SyAAWZHuY6rd!V>gQ14Hm9LjNZzr!PSG%EST3Ala<9dNe{#3EwzbozTN+ffC zuGsIJk;LOW*q6K(qE;a_E7Q)-aZ(eBccQSRMTUBHfh5Tr9?6Mm3KD3rMwdGyMtB## zf!r~fu&;$2F#_^P(i)o#KgYJkzBJcEt!YH!aV$h4b=QZHmyn)fKTaYPR-VDZwt{6C`zV zp@36gLoS3);a6vTN{a0c;_NSy7|y-;D#oZ=)CFck>K1iHH$BL0O+~glA)3C6r=Sj< zK|2I4UdLkacXMRf$EfkVcCmFFp|5dv%t1>s$HtPb(9)@aQ(6G%d)0AawlgN$Qf4H+ znYC4YSJYherd!hA9W$_1xhjt=)v`$ZMhq=(%0zCP$1zS6>H)HFHPk#4dQ-ow zuMn^f9aJ4$MMAD3Cua*TMImOAL4G}&F$k`YuftSr<#~^I^52}_QT))fVV!1j=)~xm5qPNNJekhlhjGv0^g>@O8k;=z!T&t zIA)yFaK8%NEnczG9Nd-N0as({|V4;4S9d)_lNUWw|c``JvaZ#08_YlXhHssu<)n>?X6( zK9tOK%O-(1UUf>4XA>r5WObk^VWI0e31SCtb`rf% ztH`oGCnMukOhmzX3Ab0P7-GI1Y+!U}mBHVJuMopk?V-H#44RI)xMA-}ZUakhvSMsG zmh~a4SUqQdBz`yIxb;juxSpx!zvk96=Z(7qZjy=I2DZ(KV#Q!M?)t0_JndI67+F>Y z*~Sf;D$r+3rmFVdpO9>Eo$=-{NY(2W`vNaR@TCZFtVg!-7-SZ2#U+YSxW2iw%}EY~ zL(3~p{UEl<7v;75} z?xSkC@nB%qhEMkI-yc~YH5tUL_7uO2sy$i3n^J8-l8DWIqUO)7ZnjKTR&hV?d zUTLrxnx^kK3|{2Bb+emd7Ai>E@Sgj z_k2Htx^=vfV)9;h{D-Pl-r4OyFX`*ZE$hf$8! z77qtGrpeGsn{c?YzovSQn!Z2Hq2Y@;vYS(aOcF=FYNRy1Xeq}TGXh7!-f^$8FITcJ zODC~(en+in``#?Kn6FR7LpB7!1?n}S+I@9vl%D#!_ZBZ$fXPt@32*P8)d+Dgd?p-J z3T(wWo)jrQ?UrNeV7aAl;wNJ^s28QY=`B?TzzdKjQ>@*COQrk8=Dm&T;pdz8u5(`9xVPKh)yiGJdGEvW+MUlS(wal! zDR>Qx?#g|#-u&l_tGkM;J};*H6sLQxTAiRFfFC;CQ1ZT$*h21F{{ntpwV-M5bVXu4 z*Ew?&7RUPCjJyr2Azr`xGk6R%rh4TZy!j@m1{lnpL=&!p9PZ}UbH#L%Tru4SmSBF` z;R`2OpnP??d3f%fpdMZz0DD%GjqF_Yi{jVJ#@z3-QL|Ae zp8uTNP>c|accPH$0VNgLuxdBsTJTy*WQ8vaBBSCH4in;ubz^nCX;8W19++!=8nbPra?- z&-wJr@4TX#9neHU*-A56?biB{8H-2e8dShyxcO3pzHF(v4z_LBuTnlFp?c2wDf%q_3V!;s1!qUe0$CwTdU+RvkLdSLpa@kgsIj=4>HPuRrT**h17K*;x+ zD5qS^1HkwX$RSnqBQ|v254Nao7xt@YM7=MveDp-`HSjVV%*8K694@`5>7{qZib#C8 zS~TNa$BL;HT7D)y)PhajKHj6rK_Yd!6OZ8X8Z{=BL(?@6-e;JhqR2^UliUg%MTVly z#h2me;dQjtyXSAZ4n5HVTmicon)&(-Ma>Q_MY8l@PRD9oXXPW#?@`AOl$=DjljBtT zBActa4d+jWXGmi@s#~m#s4ri8S0Rqi0GK@~0q=av;5&(J%(MPA{Bo(dAQJx(*3ihZ z=fYSp&c_LHYUc5tnaE#>Wn6kyO?ks0?e&lCDnONyR?qhuQJwsHzEl!>7d@ZDu2aeD z4qfbyUh9t7fMd=D7SsfY;w0a~ZzRso21J&9h90UrbWtRJEBE(@GCzyN??ZBDfA@o+ zqNcm#rKRRXx&9}|r6MjWk?R;O ztx4S{)jf(ge@jQ+P`d8e6vyjle4nne3C>HsD}kVfNy6d*J$dE7bGWCwd*^HE=?m?-vW!-c(c}xEeuU8LHZt)J`b{QEwzs}%yb0g$Z5ywjw zA~0b?0fiT}QSkgtXn9$#;q3wgD{5{z)bwV3!ur0C((3Setw{W>wrEX7e|N$NydDK# z*4t6)B)4LqyyxuHA7t$kq#^Hd5J*}Rcj92Q?oek)dtd@7K`}K>{?-_Tj{aRGS?YQCU5YJMHv^{jIXvHRqq=^L+pwQ7;K2LheX zg}kTHM^`5Xp;~Kkj+Ufs=JPDKo-Qn0S_>gGcWf1fR^1+!0Z43!8koqk%aqST!p(NYQ#j29$rb@vTR4O^sXT}ubgXk?zTg4hQMYp{2oX(4+k~JMPQ<|}O za_-@;d4N2*HUEOj;U@4NYoD%q$Z- zUH=OhrIyQ=oorl?Z!F6*ymqXN+N(E}ECjh2-j(aoZK8kkE+89FtD)Zpf7_4GMEq=1 z=C-=?W=B@QNO0Zt~z@$wW5*OOsFQ7tLK(5uaf$TV_h1< zc;RB*XQ+q%Y`}I*KIh6XjzX!|@wQ-D_>U_1XR@qTx8%HO=y_?=5|D*7uU%|a)4cn{~ zARW=4c!3k*-=Ehh$yC1v>1~Az$D=K?v$B_?Zr*v*)k%Yrr2P4HF-~sik=Tlh9j;NE zS$AIBNc_j-z544G>eUy>_ARf@U?9_P6CL^0i{G>?y6OWPDqm+zm~Sd8qQ?ZfqolL9 zY;DUl*Awhv$eYqpiU7Uo?@%zNW|W*-zi@aWo{nA+yluN$a`R49L>fi2yt8=UOXXHK zFH+})vAXFuMDo!~>&rNC=3#VOhE4U3E`AJ|j6b9L!XaOVh^*i5Cf)+CaXxi+?m3ks zqDA1H&Zm32!0CO0HDBM?S_MAj^~T}2vtMnf)JDpm3qWfS=-V&dyA^$s9=HefbGEc3 zOhufIh;Bm-#+Vn#yn$$CdOCinW^dzxR}Q@4_2ZFVD^7qW?P{2b>Z{pF3H{=o8+NI$ z3Pj?&zz-tJ9-yQS`S>m@`n%rPxpn8d40LAX$pqnvFka@i@UZh?{=T#BAgZzRVFp3Y z!LwUWA9b!7FGCK_w(eUXS4ZO6n1_;RXn{__i(#NH{T9~P(eD%%#GVc9+D!#z{0hh} zyLL$5swU`>)Z3T)$hnm75&MOODuClinGXAyHBX~9>H-=&EG5K5ae*0~hB~2&r~*fW z&n++3V8NT2MjTvEymLW8Lr3BJLF}RnSLpW|abJ^rp2)+Wz4~?Y#=J0@!@+ZA=zq(~V5|s5XYUY}qjXgEAzXS160q;o$ z=zB{I_oKCXy=^L1%a1d00r#9CBl7bN&`rd4ueFz>FZJs+PH8W1!;?q>&7)eglBHb8 zT)etl-fE5W4l518wDe(0$(sHLba;E~87POnE5R>Xjz+y#F!N-@8}aBb_1=0!6Bf!P zWzWdRk@htx0A00Fb=5{Sb4TW<5CC8Iregi`d#M#Onw%EkT|*|PWC*_)c^^jY>%EuQ zRo}db9?u0xM#Afkd|T~W9(WA(yIu|6UFe9Ei1hE4(bI4bHZ~L^u(Sz%E&5OIVu)PF zT*=LUS;t)^p?@{$->f$j15lGb!Dpx~H-p|Ma0>6-%1Qi}cXsdE`SWWtFwJ7GV}GWu z#JmMrWkRJNN1sF_W}vZ=A5O-vj_ZxbBifD6m}v=OmEy{);-EV3)DOvs)r-yQMQ40I z?KkK#t$>>myC^qXEAze4RPH3XFDYtn#CJ%%Fa!cja!g!IawV2o6YvOe3@a05N5z~| z17o5W>u%&$q#idi(&n&#FGk|> z6RXgeL!%?{*?57X?$DS>!eSqPnfYlX{y$&hN$Wmpai&QP2QHErby-T~QQJnXKSk)v z9SFf^8%UJC1_W>Pq>gygG$7s=;3#~>6Dp|XWqJ5&#B#ip&<~YJb?<#pA_>3qg%Qou z`h%bAQz7qqEV>8O_qDuxG3s+yiLtSkao{pb1k(qx_rsv3vi}pxa(^(*Et%=8 z+K;i-mlwQWf67u-LzF6~_x{dbrmJqeVpQBs>TM^lRB#97&+(QGr+3rah*mP${lRR# zn|9Rg25$zuoo)Dt#w#D8+3JaJWuWmjZB=)~C!tCBVn#gw3F)ACXFPes;LY_VwK}EP z9u}dyFjbNIAXZS4L)vU0wP1xi8?DkWq2tI-k#ewlTxwBi?_PnA4moce*tQt)4&R)K zH}2Z;*h1aOs>5f{BZ+?^W5&TcjkB{MinJFVe>3jKQf+i?tM{n%?pt3)ax$C=mN%cf z5haea)W79kxt8v3ic5k$u0NAyspS9sdmGv=l#98x>e$>*~O!uHJk)q z@_9z|cTuTZI=8BoNr|-lXc0C!dgtf$!ZwtOtkeqVY=q1mi9bjFt0@mxfpDivy)0;v zD`@6ZIS{^$R={xeQ+WVAKKgT{QeU1+6Bkr%ypG^TektiI2nI5_p8Z5tqvjOmGrC=E z46PpkQ+p#-u(yuWMXm!N@v?P(gXM}J`4)8GAW&X8JnFL@dcBkyJkJ+w8xze(>ZtJU z%4H)WiB7096$;7Uqk_m2XO&v@$8JFGxURt0#Vb-ON^dG+CKE$JPkvjyTyT_KJG{F* z=E0em;@^4`uBGa`c)?xWjnRv8u%72LdmjHSX2ERrDu)tTd=-u2*6C+Fl;m2DkGwui z;z!opQE0~RUDZKH9S?bT|CNi*J^x^Gl8f4wsVdgwY5DkA%cho-k0E!~L?w~Xmmg7O ztv+`Y+BGpmZj2Q=(c{sye#?PF9|-uPoj%3AClu$?GLf(K^{b|*);A`e{98ipMxGCxQe{F<2tp-tlGeg z);)_~ZzTeGG$yCV4lV;v=;iJD9i(xrYGr1KFhJ!*wXdAE;J3mSL*+iD+mG18ZR;dQ2yiC{kaj^wvMz;)E#kBAscg-AR~w znuKs9m8$7Ci3xuLD@+%DyYJ|(h2I&NO#WWx*Kfc2p4!Wdfv59!(VN}~K0u{~{MDuj zsAeZH^>QM)d74HGx++{Z!uK5@?t7PV#ZOlScVjEmwci%$szsgPCKatV@Q&}1%NI=r z;$v8`SMljpH78UoZ}+RrkfVrKMJr~Lw|XAuW@W1z?mCO0KAwhPOvvL5g~c3*K64zfxB~N zL3U*InC@H}@EmqCG?!3)B>X|s@H42nTdyX@G%O0ccAy#Q^*N2r*s=3t?*>SqjTK!? zuiJK{P@1;o6LWP{{TakheI)jg+v_VzddXgOKWZx1Z%TTpYnaXt7WCS&o;p#SNBG*& zk_Rxle5J)}gVDtc#~Ydw@1u|5V|c&EQb1#6hWF7!B$j=oIO#xd&C85sb}+Luj>B({ z_8qf=?Ylrh22+v2_E}lyLW>tX9*<{d4apjbvt6sBX?8@2O%J?(*iMJpBRdX)LL&pt z5JJS+2APC(CZULth4`5S=F?U(MNGrUl1#Ih6ecH6G3eW_6N>5?=3{$X`9yHH*2wON zB8OsbcF^H4QKOQhAf3FUR08F&PEo0%I6I}4g$f;?mKM$v{I=qQ=q8G1;hnpq@O}t9 z5rJ%-YCsops0QS=v^y)ST~;`Y1$R9G8TgetNot{@cVnS`NM0%$is;@_cf&ZjrRIi_ z-xq20IP?s6Fpo2fA!HWVsi6tL*<)ZU=P3x4`ZBa<7Do6u@RnZ8>b$VZ%w`As+4Yv} zP{{xqaH?dd>fEPwB0ou?lp#q@ORr^1#(j}fT21<;B|^peODOYzvnb7pS`28Z1uJ!W zniG)+wiN=Tz2Gx^2h6r*p^f7a;jEV23}aB1Nx#7i)O~Sw7Ay_3Q-(;s7~J#1BroHu zQcMFNh#ujFamwZVh2;WV95Poz^>-HzN&;Uas+kcSih$sqXW`fS3D#peN14Gp?Mom7 zTbs;(qEuL8&6ra@#jrM;&ml@6-^!?>^I7xRd^$t+i-=`CC!t|`7t=P1Guz$={%tjh zGipzQJZNnZXO7*OX}6lAS*QG5I}CPU{ZX7Q!@_ z%DLP=4ZUXVFt1Y15%xQbyi+2NvtPjQT5p)wp*Dg1iFOd3Z@p>0t|CveA7Y)~lE{iL`YerP$ z1-6GdZ@nj>3vC+av)(tqhjs?@>rA_r_4um_4(7*AdkM$k1M>`|4(2a6?SC@256ub6 zeT!)y&sOa*uT$<7roERm;z{~DOnVzHv|1mT&w!4C`FEN28Wz9Td<`uL=HFx5@8QAP zC+>UAjM^f@+Hc;6b_etCH|3kEJjucEsG-~@160nUhE{v84P3zlyO9#ZYO zD_~#9_GJc0*TMWP0V6mS{S|!hmxv#@7;OvL!8IV5;BOzNPa_^fZGv3Ef)8^dwwX1j z2Kj}oOp865Y4t$;+w#M~!FA>b@W~3IK)Nk>*aOh{!Dr0Z;D_mIWbvUAEgT3>o2Gk% z*{Z4twC@8S2zChkL&df1CQQKKae))DfN?JKI&rXLph7vr_6A0d2C9@Z+dcpcb_!5J z3FJrZo6wNp@qq^A%(2g8Rwqbku3bQ9jyUt|Ce%9ES;{T2-$sLiCkEE3w7u+8*cn|U zw9sD0YUGNuKidBWsvBmT+x;CsYTVlMi9xD^-eDM9(Gu34)2cm(sQuIULDWNxbYAO7 zbhe5#3?7k8D-Y0)4NuEZvKhr7c0yVZi$MujG3d_LL3ARBi8HMwjKEeOkycd};lDyq z+ow>^;E=$}c+TcCENXKeKNR>2e6q-u=^gKj}Y7^FgT?1Lnu)q#o1nQK4F0ee!M z;KiI+YXS>YXn`F>J%djL8kDn_{WjA+9ay8Bh4!7Kj6VckQ_lYOy>zY(e6E}W?Tf(m zg6jfVfI$8r`y)=F^^)^Yn|%^|CUA-hEw+2GMH>Q46UZ+||NRN!nN}w93im)awHtsZ z-PLS$d$v^(jvjJ`B02{z(`pY#JGSr0_%gQVGMp_;3s=;|DT?%0Fq}c(M_R;4 z>07z0;HNTS4vELuttrd9whdeFM;eT_$N62JbJKjD3|>C236u z__ix)9YiNm4F?1|BPsb$AslTV=kR_%V=|tP`vgB1PQS(|heyX+Bd{>@RCd16ah?&l zNhQq>b(}WE2rT*<^aaA|c!LqRnSBJF(Q%FusACNR`8iPv4uQpIV}P;tM<;_w0!y?c za8k$VbEX=Bn09rGzJ!G_5a(hR$j^(GFhwF$r7JMnzDoL;pFwqL7NgKT5gySlVA_H0 zYYUjlh@J(C4ZQl0s;t##}ZySJrC$&>e<{{XJHzDm)Q0l6;pIqJvYyy6u))FN0IV zx?4g<+alC8xISwWvzdXYbQi+IzLpezyreVi?VJv|;R=?)xl`xaKFdw7%z z4cq6k%%0(~%9(9Pfx%u9IcjIn*;}fRW1ojn37#sUx%OKa|6m_+=Gjl8V!^_&9$$3& zKh-?UnuijyZo?1VR`8iDdmjUS5bgwuL9>mvFQWs48?x?Z#6N)`=pGFZ&AGN@=?*dM zi`W6rXLV8OEc*#2dr6!j`{!)u%UP6g1NmV)%3j!(HC8#Z?dfdEE8-N+wLR;46`G@0 zyjQbsQ_ftw1IOi0S-klQVzSHFWv@$Uf&D{x2mdV2UiK$+?#SA!A{W{;uN>T&g$*Op z_P3|8R&QkWQO<#O1tY&H)fl8#%eTZi)LsNC3+@tUvCY*h__jF9?OWOVf62N@Wi+RA33%=Q#(+P{PxK%j-{w=I0ay$G zM+zgn-S}ffQgvfMd&>1F>2g4(RfXRU^fB9~D$`zSPnMf$6(O)4hb^sG;n6YpW_^gC zX%J?^!4tyv%beReGRKUJxz&)6!i<4kmi;3V$cf^#ZCVHqc9FOtBan-EW`?p(1nEBj z5)K7VlKi^)`Po0^w8--_G_uGv-UIcAf(2pwIFe(JR9yCV@RU^COp7xv)B0HbvJk9q z_ziQe2QyKZj81dl?(`Ca;EZN;irQ#SM)w}*FY;RwWyZE126IXVw@Qy)RdeY$Nzj^lHZOJ6TjA{OF8k93Nf6qE6RIj3}*s`z|Xw z3LTd*P>V64XqXwCpb2@iWTPo7W0>sQbPMjh8 zRS-dDM{$PjXXuQIGuvK;8fJD9XVm^P=j-v}%&}LY8JQ=DGuLK)GIPY4XHQ3;Wu7R` z0{dx>co%W@vcKf?$Q5UyvQLwFlG%jHkwZSmw0Y)>$~n+J%sQVeEgEEp$#YH-=TLhq z%k5?UjNOr6Y=6MCh30(aEVmy=e`cO$E>_M8`xREBulcIVdAOa)$OFvxlyihVi|k>D z`H+e{%087nS*~QKK>j$ph|Xc+oM;cCvqGGc?DOaxF3!pJb5&RnDW#)?vW z%v>vT0vWA9x=d?5ip^oGIFUL(2^W1Gc;tMM?%UI7M}bJyOG_p>)P$r`bu&(!b>=|B z`Ukg{C)V<@d8K+heE@daq~;TAi_XL*oBe&_EIxj*T=@<%tS`xw+CGi?TAj@q$T#bk z_@O%t5Bna}#Oh+Mh93#_Q&5+cD;;Rrn~{svReCIBv}3fEdio5V83sqA%k17wc+BRb z30Vdnr|zH!AI)GT+HV(n@aS|LW<8z#?ZW8w=sa8IwGnL(QnAluI3|jbb21+IueuLg zDQhju8j7DbT~CLZ3gGxC=8FMbKHUd69 zhwT#dQXpSinw?R_&;oN+ANodZzHt-iA)z_;9pn!_@#oq#Af!M~lRFZMB@ZyGUZxgG z3+xZk)q&pP>}4a85jfTSgUY$kz6iu0=p&*1?Jnr>K%o>g(7u~FpJr}Ukq6nQf-?mA zO6XAg5oXm-(iYnTFm{3dCWQ%XsO+!V{33}wLTS+g1H?JXUd_m-i*vL+fOQ@yS&g%A zVl~c?(24d+HsMThPO=AqSq9EB3stQq+gG!|K@vLKK9B|HU~yL4SA)O;XPYmo$Tb<& z*c%Lyzy%re;2J8fh4xRuJOk&LBxt4hYQyH9tAdr{iyt=%oF{H5zBaS{#pbKXI+zc| z*BO}Zff5PdZ`$?j+fs2u6SRy2RHiy8n19f;`D%NhT*AN7im<>i#Sc+_z&?ZNE0his zvLOaW4(n9a-Oz;$9Z8hqJ!tiyNA!pR#8z5VsSs8#o4|#Qnp7 z(rgAUl=|Efus3i7FH(BYVE&4L4W&O+P!bMJRUWBhwD~rtME*SiyOiaPk?IU@xP4f`q>oFgk6(bg=RB7|E7Zy?egg@;nUSjz*t z6O0V*cP&RL47s>-Gi?1(oVL9e{fe*4i%etpW_@o7d|klCg>CMRtz1EiIm0j0E(Sxgt_r-SvaxKF9XeA&L-v~(7HgI`!}c;dzb`e)w%-NW zSXYa)gZ)c7X9s$4GUXp<*Rp@-NN7i+3l9uNn7=?>j_ZWiso>0kTi54mksXYT>QX2@ zXPacz?1O)@->*@W%^|!I{L-2u&P@9YEC<$HS!BZY09L+Q>AR`Rx|?0{1M~8HW)(Hs zCRm}7W_J{x^(uboo(2!QCo5j3$eBym_eo=ml^$8iSRBnI;>@ufc34cDh4v3fCvkBW z+Z3;@gwi=v$Y@InTq^aQs0VnNI4{+QCd*B&{J6}n<9It#jY(XCELYZ`$wu49SjqFv zcUb$qc$bgva(HmZU>!)!2sH=?gL)85UBnkbT|~fsfNl9Qs8t!3O2a&LoX4L0uQao=0bHFjv*o%D7?NTnITq(dXE??Cg^yG;Ei%S>1#yWNY@5 z9~`IBM(w_w&IK}zIrdsszK1wF+h?&tr-&08ZaRC4vy0Jo3H#(i^APL%3lvLt9z5(O zj%aCM7`mU7J==z}Or~VO?o1w0F3zB)m0{wv?0ZR$6)Ap0y|Fbspfzb>E$)p7a7)a& zb|FJYiZf~l*xBa?UMgT{j-KNe1hkxgFf|Hs~&fJaqj`{JkSRKW=|Bq$E85t)S~5Cj5* z8Du7;APf$%l2j@MNmWs)f+QlMq19GY0&1geGj!wFL1|lU1Z;8W796f<+klF;11Rk* zpsikq_xr7VcGaOeeeJ&Q|Gw}4zIW@(&RT2F!`f@DJ)Cp;8*P5g{+#W40qtr#7;ls( zodpk(3KyBSWvT?q#dZxmUff|bJeSy{*E^B&u+*--rHZ`NF0!4s9V7eAOQidOmWD{<~dFI)A2vg}<(sNz6GS?T+ zHVo1e;NdM|#~WUyoMqp`15aU8kM~}7wA&`V-k*{*ZL*a&&Kh`ZvbFaTa+B94E$>Q( zwzA0#rIlKH(Mqsl8!yk=JeK#a-Xz<3x0B59Dhb$0SqyFLN@aQ1dlA~!4(;as6UlaV zDED4Kw)ZMImF@kUE$v{FJ-mORZ0KmG?c?o3vXf2r_s(VH&R!)h^Sn>737Q=29YvAX z#oH{E9A>n6nnP9MdL8}OHY?jONaw-B+sNuK_UQR7Q>5A^-JDJJo?9gokI|-rHJInh zM*6lC;-rhuW^!Tf7r}Xz; z!L;w#S><_i$RLMp(KXn+pYrgCO`h*<#X7%dlS91UGwu5}In;Y2hw-RQ4)dPMv>(`H zf%hUd@I#v%?tOvN_9Hj9w5W`@(e3%z%{^4^R?KEWpV+mU;C-IM_NiM<>d8t1eC}2f zV7k%fNiymJ*KaWvZ9l<3(iS{gH5i_so7@C~%s#WCK5Tf_n_SCyTxY`|ITQ44iar}L zFtXDqr7m=R!;F5}-7rY^hliL3`)npNyd@M@FWIEWdyMk^Wv}XfOO4elHv3|Coq6u} zDsA6M&65MknJ|tGJ(!#c*_2+ddDjT5Wh=?|y7x&Tdw2`Tq=#%0=J4ID$3?DtQPZ~U z4ATAK;r*0tZ1URXu=jO#?pmAlNMqI|XZg>m*=|nGa^70<++x?Sop&5-f2&=gPTo9L zcfH-1EHx0fdDTGRFo5OUZj;&GE*zF$Bx^5v?+&}0`e5UL#%qR$)3EKYQ2Ti(s-5Q* zSE~>W+`lBP$XR5`{Wj_GZlFLvpbc5$Cr=}(<@wlk)*bAfPbA)1R7##tU0g|_2%7B~ z9xi_}JWrvH86Iv_bp9AA)xndTWWxIpd^+>Oh{L->4~P_m9YL-flL zvl}f6HdS_JT=1pE)tRP)+F*yzlOQrYwAtHpy_24K>iFKS#%mIvORWqK?TZW#61`Et=g8>S2bA2@?@Ld4jiI$Y;|dPpYed~ZmV-{|Mo%T3=dUQH<}AHqLZ6( zoStppgzs6HRoy(lHI>==VA50+`}lWBD}=lLo`;gE`4TV4hi$T*_W(m5vB^%}cS-)< zHq*0=w$z!6Fljn@{$Q%W$L&DF%kxgpZc~|Q9+lG*$#Mo!&pfHiL2I~@$nY$cma+O7 z9xmnE(h?qr654t4JgS6&9;G7Mp|?KTEE zx21*mELhU=OhNXXZ&U63j8>tFI@t5t>O+c+h}`BfaHwa#hfLj;VkRgeuEyj2HAg9| zQ>)A($;ypo&qZz0Qe(2jUP`o6A}?kyG&*^?+3Kma>zd`ANof?f$*$gc)EWu9Ufo(n zXF&`vwL9fZ?_q{6^Jocp1$9}S=Ot7ft06W5T-c39#~biUat#flZroPnBokjZ;`TwM zaq0qTes;S)9ObU9#Oynzl{WiC)STLisW=2ru#>yBQhLVXUYO@JI}jFFGyC`SR{W;O z>9SSHolf%@IL_UhTe@98>WiIER5mT-}xsm`oIf9f)yXLG()`FgTw z(YU`;6z*+=S!jl<0jb+^qn~s)c*u2BcU$}ZsiC%I^;w>!cE8)(yWj0ly>1w>3=g;a zGd#~ApA66UV1Nt{tJUpY{9|pT+TDzEPw#IS7lC$dz-X&$yM#S>k;S!vnIMAEllN;} z8<}t_gU`JLzTB>M{mwN8^jf$oxE}8_+3$Fma5KnWGeI!X??CkA!Gr4|W_b$BI(Iwr znBEqCuedgW=BpA0!}a*M4gDDJQjooWZ-@2VhR$>CXLdiM|GV0sH`!dTaV&UxjbEQ* z$l2Azs+{H$Ek6bUWpFRU^>wKLUJ-CN8U3WCr^``;aW3Dnz5&9-^_`1vvfmH)J)El3 zH>^`X)S?Hs$6Wu}6J^Cg_TrAK>pO~ywIGf2Rw5VI2ymUNkIVHI(sR$4)mLTrl)J7d zyRYQaOPO;`p8k?gADgs{0SA!J>#WTaE)JxD9Ol9ug6kE9FJ-=k{^${8mp#F*=|x9@ ztH=o;bE4zx@Ua`_PzKWI^YA#t?#`ZnTy@W-%D89y$ER6JhpyI{wQ7Dh~Cf7 zMQvQqNpfCO8N7lcxjgGl$e_VviQkg-2ueAB9ww7(Ro38Z$c6r_@8LJN6kX~HXKfn` z{0N($$aCLgenUfsYpq-v%8QOSTLDk5IP)5=D-bQ9k#TVQ7+hkfM3A#_Y6Q0H_O4MRP&Y&j8X#0 zU<`Q@(RKr2lovBN_<7Vzu6-F)OxH=A@p*=E5OMOk#B_a-$tC7qgyd6)xIWAzD||(o zTYRpMGMP(nsMg-Km?V_eY~nHTE`fLc7woHS}^xK3np!v7j{UUa_U`XZC_ zbZQ ze1qO~Kz%!8dB z?Z}?Q6D>yXu$@Y^Zdpf)l9>oVtn2Pp=%O$D$ zVhO}LyM?-d)FMqC29^I84znpGX2P^L3WlJBGVt{4a7=kqYqs_ygyogvez{HeIES@a zj=0$s2*X4r$4q^Es30Ji0i43M<8XEmWP^x;OW~8sJn*w@I3w zw3mz_w~C`%33g%V{OsQil|X(zmO0>SSczdjf>rClr6ub*D?bWe7lKk07(7 zEaw^*vY0Onau!Sa>kJCq4@7XEYWGFit?frt7i3SnOr#Kk`}3O zMkbp`dv;hiBvQ5LC5di;C)?3mD5dNAh_3q>A>h)HDCrf*%Z`+Thlo1#qak2|wN3j+n^=}dW zxCMEW|1f3T-^G-B1aZ}z{7UHWK<95lB-htMpMf;SkR$kC#gtO@ zDyez_{8UvJNmXk=_jY$T44TJ-e#HO7kL|g4+kg72Gm_{ACPIeW0goa>=}M0%u1)Y#)4(f=>qXGRI<-O^ksBREaZMb- z%@o${O#!?VE-wbr-JYA6mm>mxLrT$MYnV4W?NnK`G&3vItea4;gHqz{v@V=4pOBV) z3q`xe=>a)i9&$39R@nn`Mi&l97Q&4o*P-X`K`Hs%v~xY)nlfTMLS(J9TP*AyLPC*0 zA><1}q7R;wr6M2D&i|Nm?y1(4f#;0}Ewbh5)>PsPNpla-^~cuS_WK!W?gG00B=mOD zvMzW=3V$E8vP1Srai>gBjovF%Ur_mjxH5QFO1l{JpuP|!uIE}S26<@3uwkI{A4Q{F zr&-)ve2j_4unMOO{SoPlnaLRz+k3`D(EN&~>r9JUXewzRj1t#RgsumTt~v--x|Uh@ z0OdL)Ssi3l>GU@&4npfmphFCQQ|K6J?#;UXYEd6wFuLJ z*OTUUlIw3m-$UA@F8x601EjBK_=grpx78HTyb9*}NW#wtO_uyvs0vVnvRS)NEMDI> zn|56>Y`dig^aqKw9+4m)J!4?l=R@nkF^9OQl=qpRh_r<4Ae=E3afh6RxciWeV)q%s z?h_bNFcKlf(7N|i^U9iczN~p`CEZGd9%VXFO;bcQ-GLCLnx=_r`WAF=Tn{%kz~xWD zTEo;e-<1z*B{J(TjZaANv676r z40#8>N8zg!_r|u&_I!!o1BDrFAgoa34f3?6>*9f^u*Qe+L_9Bq(BDXdZa}J`Aw*~v zl3aisK7;Ssvk(Gn?EWsIwh9))zc2jC;qtB|w`H{33A!7jIX(A*9uaJZji(#==!DBP;=$G+Zc>EtpB=d6`Z+Rnx&E_5d;E8~ zNZ>CgC%1MZkqj$~#{vNr zt;%0pr7+1yC5=~vBJe~Uc7d|fU4&TrWH1gDEajQ^E7LIliBGiGgjH??$PzQ_4w_L z!GJl!%8rjp+;5gzBb&^O`4=V{Up3>E>wuc^9Sh7J)`pRVjc1$duduqTTk_L_fr(v5 z2IS_BHjlfkxcS$f^Uci*=f{usGrLrpwUr~x4ghhp{T}l_dgho9EyM#7h3^Izd{eRX z>b=3hMzix&D`cK`%v@M$_NtWsBd3`QtPSQf#ts~9Tk{wDt&0oIiAZPlI`Dz{=|U@K ztGPY%@O%BMemc#(tESR?t;@)rX66QKfqQi3fZWig>S4pDCB~R-4j-_Z2IL0s+PL-B zW$|+nhZIHWH=7?PLnM>m4I~mrNn_x zoo1ai((3*P^UBs%msi~rGk2OFUT&>9QgqyGx53(IW?IeDu04*vJ8tg9*dH$(f!r1~ zn!m|9W{omCTiNcOndY5ttIHU(p>p%Ug3#XMH|6eK6}n>JRt!s%xu2f^Y^4=z^FgPtX+8nxntNFLf_WQ@6@r42NO0TuUs&Ws-;C{LExcT!|JFJZ(a)ajX zGOJ4n4cp||VJ#fhf5E(IJFSIg$75FF8ne?e1a#hWT-@!a?J@UVjz?9j!o~yEUi11D z8_XR6tGO_+)tVUy{-(+N*_l=scdu?k>&=Fo!C=|Zf#BzbBZB4&1_twp`9<975->AH zHr{{ZqOwK1at8#>Xr+0^NOXJQh|qQ5slmZ{2@D{Hsu2nE+BW-< z93waatkt;KpLgpon%1s2Gp@37(G}BPb?0`yU|{u##3*b1otUWSoA+m0mFAZh9(JFX zX^yqJnENy1)|c+FnZn|W0!>p!ZCZDt>A1Pg+EG<9DmKB|d8B_{5VQAp-ed0#uln@| zP3El^A2UDfZcS|*v3KP))`Gq6ky-t7g98#FYvHuV&COBkszOxn9P_L2;i}4b_)y`}}HnTOnKtS#t#D-&ZAKCsg~vUtsrU{h1V+H`PuUdY^eE~~d< zL-}Z2wYL^DTGOWF9>6#pt+%F{e{HaiJz&nXrdIV|yTz*7XtuGk8`0v8)0Xwkx4=`U zm@h51ngbiHpt+nYNvpPIc1?m#y+I?i8X&IuU#*?e8bFM6$_u7EOHf!!OloTw_ zJHE>5z0qnkuZ!q7IG%bIWA8pDHD@Lp5>_o~TO_aoL`YwwAji8{0Mh697# zlTV#CZJD_=$83{h9a!{8)hH`=(3*)CV^~wIQAY*@L%SdicbJE(4sX69uW9F2^S#UQ z?3Gn$9t0DH3PuGB7Ga2v2MW#Rvo@G_EkYoA;GBT@a)&+du@N$j+gjQ5`{S|=R&Jwp z3wn7Pvgm-?#VWzrR_0^o=8h25Ys&EW6{g>YZab_K)oex<74eF( z<(RcORf`5#qni4UDtYi%P1jcWn>KC?CKj!Qr0tandD;G$b?U|=!P>D_k(G;%Fdtuz z-tA}Q{A$IRBO9%dRTx4yTM6^JGw`UJRR|>$d~|KV{PT+Dp<}Ic4+N_M6`|Ul)^q0# z3?8him~KIU1{*gvny=RF_ZM1Y%$}%r7i;9sjb;{PSLbHyz(%Y7g!O>+Ye=0<)oy7q3FURs{o%8_l-XNVD_d*UXF^ z;Nf`FfME5miX&tEqefpa+B~(=dgzVDK(NMahgjgo%mYUPh1N!hiFK}Hqecx|aPU>L zAztlY`~~`>%4}2Ve*v%Anc*^Pnysvj?mk)8xjR=`g{$t%wKBJEHouSUv8I{do^4Hi z!2ENamHpmE5scMM=CuhcXO#Q=uE!fcH~-Q(ZryK98<86_|6XZrIBp(s?>W9|tNF;X z<`IS0M8*b#)-RiOS`g4%gOjTk1rm_8p5_DQ>!(`rs$jX*y>UcgaIbmaVyn_xW}VY$ zy=w02Mkap{ott}8?z2@DO+oXvdP+cuiSNuE=4XpA9~MB89Z#5FcD1gu&aw91lxyDU z*<-%mumO7Dz-5Si&GGx)eKHFN6owu+xbd;$=9@J;mLK2RXx8t)>84uqP{T3vCQNnn zuT}H$lAl2?vn?J#bob75_wDK)oM}C7-FmaN;L+UNn+lt(KVAK*wcwY9)-yjn^lC5| zYbtyXdYZHToWK{Gt*z#5?a|>!RzQR7fQU9vIc$DY>mK8>c79>zHh+LgIxe>n+0$F15Ka#qF>h$syw*HiZ{;*LS`V0i>tJ=+Xs+@=@~&M3hHbP^ zZS%RV&E~#E&5h<=P>>q~xzO!Dvlei!Z8dLL(R`w6L}0;AaOu>I?kT52As~d+Gk14} zMPhER!Bd@Phdt}O`{9TgG9q7YW-8*}9n2)k*J zRhtXV6JV%!Pe*`QK;~C}mzf}VJv z%yM13!{+a8a zXLM}g2=g-!dcs_@7}P1|&pKQCX^WYUU)F4XX&|!)8ZaxS1W>M_)0@ z{J5@pSD+SR3A$}mAlQEtIv8>~ab>Q#dRepi18Wd&Hhb?eAAqH4U1Q#~0(m{*-eW#? zIXdwR7yfO%e2@9)nGlE{uYe_Ez8SRUTbCbjPsl{eK6SGjKe*g#w(`t-x**aTbd0%f z8D$6NrmE%zCu}tT7zHC7G2gtb+3I;0N9FByNWKv-VQMz7yL``qRpvUF zE6<=pch+H^zL{~1rqG9V&F1k|)-kgl98Hg7-sS}Z3NM~G)@-)O|!k*P0Ku1IspA=OoMx8CPvI?<>bD z!Tek6xcMJ$WVsVua_8k>Dt8`P+`O0Oka=kNhjlVV?h-oSwsEKN?WMbq|9mo#VW>-hb7Y8baXB)AAzhXcnTwR|n zVOWvILg8R`B$i!P9VyF>M~!r9SSB#6zLTC8X779czp&-R~`a#<)|g~%s)>iD`NkbO9EQYuuR zB`*ym^HzQJU&h3{1}09QIDSrc*k2RqpB;-t;!%GP7?$_hlZt1}$nM>9N$;GVwb}C~ zPb{98-IG-}=7wt%(P$(V4^(8=L@E;Kyht<<^RwNO@WW$Mc&R zsEZpsaNU`dfExYsJ7GnQ^*AZ^%i5C?k4&%K8JhPW!tT+?< zT5v_cAM0uuUk@^jKLCIG9K%?K4Le?NIMH1}Zp-QO%AX9x)*`}RglmPkJSABKcs<Tju(I|?jbqcG~nru`~Ivew@aH*-@!N%ErZL=Ren79f1BXzwBf30dIyd zE$@MJ>|z+B;rJZgWpMk3VaF2g_i(%6_QLV!avN?p{$n%E4ctI;4ZL^y2N$mXS?xTY zYh5@Wk(lZqj)jb|9ju?aC%2bpVd*;tt{6`I$F=uPYV=->XC{qq@Z)b2+98@#AMBP4o8SoJb*oB87}M#xyk*x*=b4Ro@+D>mo&&hTocJt!$ie0cDaf^`cb{h$BX6lC_G+YKxy(HKrogl&VI#-1bNQM?k z5dMvU8w+rh+v%1?*4GK$uDir0C1A~~~YO*&D%4)a?5 z#=vtdob)sx-wDSNCFBicXYI&sOH?>sFn}FcgL7qZV~d1v$Mt^IM*dE zAN0-W+^2Do{V6;M=p*_TFHoxf`czbZhy!mpuFM6JF!41r0-EEWp#&B z#h0S`dxf@!__-dU>{>ROT-!lsfp&aES0Wz%@Mu zrN;lJub@=2&qL`T0`<;2&^17*-g*rbl$vbVP(i7%b}5uPY~e8REeG%x2>PcH;53|% zBZuFQ#wC|=f-VJkQ=z4hU56%!ZK9dB!7T_y|_PqeC0*4%C0K7U`(8B=tO%pVC zx;nK&gqLUGGAkU=i@+x*;DC0W4NC=T2IyY^HbGhdeE?wT96`Sa@Pkd^yA|NMd4hfo zPzzxX-zx!lkOh=yS!4&GigRGifDs;r1FMsTjw_UWQ4I&*7XjLUH-Hk5wSayOa9q%$ zF96y?i@>)8fNufA6j}&C3j@Ai1Mmhq(6?LTt_B<;yaym}fHg`8zEi#gG=vbhClnCv zA)s3T?iRG@UI1E1@V%~$VXTHjW;X)x&NY0$1E9$S^m;HaEft`>z{4~WfzAh@oe1<0 zfF&$l(jB0Ophdj^X#5~T9AKI9tp_0A!}mo1S{gwA1VFi1%eh$0pKJ;vMXTdybcHStW%Y(1N3R2e}Y4c_W;oPfo~Kb zCTLL{fHo9-S7L_Iv;w*n))Z$M(Axm+5VU9m0PS4(_JEDR>v=%$0(e}Z9|6$Fg)g6m zIIPf*ZL=4?k7JHLA=9hG zcV&VDJ);LKN;ow0Y=8lRmhcJ}?Q}%=7J#NT&{6um%rN09yO-y%m54JkXE(Dmxx%Cy19!IF!~EfYJuO z4+3}w2(6QsR3@q6<-Y{lOkO-84{{e@%6or?-0i`JXL7@jOFpSUP z;5&UXCORCtqzK@7K}#qgDIJ*%;5&szr@#b+gYUfn&nmPBBva*1+Z12 zZvecdPzvgCaERaoSgp`40QV}CR}EfPXayvBB^(-G1@NGtB^2|N@yKDG4^tWr=;Z(u z_dq`Z$QG$za`#*akP`7N08k2`WYjzeXgK6M4!|d9$vS{rl<&_0b}HW!0Mru5H*Y>v zDICz30S+qkJpixhjgm}&0)N8?DzYaeH~n$|wv*irM-w+{WQx*L3=eorI$S*@7UY^E73 zlYTbS{6Z%3Y^J$S#s!?Ieh%G#GdhC$A4A28E|xl#Y(%Dyz`^%Y49=%qpw1#;RnINmumeEg;K2_frBqMN~qp}Qo~P%14=geT%lC!)amf0F5e6X)S=J0 zg*6WjzO=ci$bnLqzoXFWvvGYI4!(B-98oA0IJGx?slflPP+sqT84kYOPAfWB&@zCq zLe~JipwM%ABvt!bpj7WjMh$;Rq15n0;owUx&o?^&rLq5^Lb*O!=XzYOxr@) z>zxX5y;C8sU*1CWr=4X#?JWE0WZ8T++t!~{eroOMOD!#Z_n~5krE)%2j#J68IaQm1 zy)8H>Oq->u3Cye0eONWu<7~}`gTWWj2w-sE3P|P&N@0^m$L(Q zNe9^W|E_wLYqxn7E3?NO&#IqDQEN0VY@{}>2jILw>XXwlE5RV_+isR(-%{k>fX zyK5QM$v0fj!ncK%9(K0$ zu(PFylPzV{=^%y(l=PDAKU=J_>U4~17fKO^{bOr(NyBDSew+n|`OHzdRH1AQ7ftYG zYYO0i@+k5b3f&Fxg+h6lIYt!oY@X$oDU`>#n-$7;XDH1*o2#SQqH$((bwm||d?~Hk zi71^-UBEBt!I!I}*Az+DwL}uQ;8z3jwqQBfoHv!2oKFBD=k;(W`O+) zs>E7!Jw)2H?hG2`FE4z?ba<<-UKFLb;M^+ev)6eB!I65P`21xJ{v4KE0+; zo)K`*6cM<5x<{crnf-%8xsqA{hX_2QU8+zX)vi-0Px_x$D3@CAE0jwueiabOxYQb_ zP%gC|RVW|C=X=2sfvc{ra6q~0;%mTwa@Cc91IojR0}AD;>mxY$@|Lw* zD)d8uuNBI5TO}MK@bbbIg>nh^JRE#ew%}|o;ZB2tFPCsjWZgEKOSsP2;(I;7CWYP& z@Q6aWgv)?KGA`k+Rw%DF{8FKB1H7+LilR?t=Fa8><}ojlak2Ik98fOS2FoO#&1t<| zp}c?5p_fG9V(mPI@)ia+YmtoWwx<=!#o9_Z_;RtjMX0F5!CQ z3t9+}P$-vhM-<8>TrM2q@t#)9U{KG5OIn^x$--r zP+p~&GgKnbM%|)N9#-+8dSpg!M#PJrJil6@ z8qVg@@KNPUwSEW=IZ*fx9wR6hfn5E;H)V>>rWv{s4!+#{-46%!b%4JqluN^N;ov(M zpje??8V-en?~2LbJ~*JMrQvL@1#f_ZFHMW%3QcY5&gL#Iw{Q`G2FDOMpfotD6v{>5 zopA8wBJeSVE-8Y+0S8|$0v}ZyP&2*&f%js7J_o=nGeBPkAa?;Bi(#*X19}C(m4X%%a3c}Ex?1B=xL+zzl#S8q zBO_MCC4Qkobwt+x9~ZhiJ7SFBusD7kfO_YjE>XA*{VO;`(3v{=aFcUQxyiYv+_YRr zcl4oSy_m9Qd=6{Iv2^6ir&P_HOGj4c4yjJEGaS{q!)bEe;WWAKxU7ZhI94_-SI4o) z8Quv~9S)y9rjlJ_hq~ zvq>E`wbUABdI}tdKb2{5D%0XrrvIdkd@Ylb>BW@k+?qpXsZ#&DEx!Y;c}xc6q#PXg zEjEe$Igd=o#V*d`*#w%HKvSGHFV&iPyn&%kq~}qNP~RhNN{-A+?PAR1(!dLc2(LmN zd>|@e9`6mPQ>1xZVRaK;o%dfeU#e$)sk->yPu9hk%HNmD9|ftOV*>n}EaTw%LtWG> znjBJQUnXoeIEV>d)c7o%=E6B*tpWL{@?t-!^+ii{d&_x#^Op1c=B);uzoRLKozV|F zqaSW5`cY@}qt56@TZ;a#bd;kq|K{G=XU@ue=B&(T$;vop?!O}z9Sp)=SGO2^4cYoC zfNvcXwK{h7@$B+@(XYPfeCQK6$H2XSTLmzRy{Qea<@UOV+``46it&zv7JkN;3KpRBn(|&X=l&FIA1?1kqiNf%$jX zAP0HpN&ZDFM%`eMwZ1(8dEaS-*lfNU0CEM2;Nd#WGN7rm^JHDVN2U9!Oj+scrSFPZ z=~a>j|J0AdGs9vw#XFLv7c)mX_|6BoSfM%%8~TrXoP$rrYXRUOWA+1_(oIkfqP=CG zGDDN4JBH$rb0`iuhvHCjC>+uM%~`LaUy6!j8)-{&Ulny_L+lOIe{!@u7%iEtTBCcw zQISnfLuHfGP}!6;R2^n0Aq?{P-ICmFqEzH?}zl!A0Br4^^aT7Uxs zrBtCWAFC2|H6_VQj@mantJCbPPIF7u(Lx7B96(82>;u)E$a?>yMY|G_u9ApFs{pta z04_|e+>29Up_qq`T)-lNGgJHI;76?}?z|`y!S@J?QP;hk8rqrZ|65yN4`T)PKU-k` z|JVZC4&MAirort0*$wN(**^P!cEiq>e)yl=u>V_j!yHQVUol<&n>zi0GhyptwF@oF z<4bj^GpTSLb@*3SK?AVTw$HBaL!MN@$d?P~DjUtW+pD4`_`<*iwVb^dZHZ5|fk zt!1a(_YgF;xoRZ(FQtDmEetDWZ2YNvU$x+U}IM-7zaD0l@N zDz=gh5Y&10&fCMgWXIUY6KXCE(+n)z7IG{|e$+7h3dLNXEjc+1!_+-wA9tD6-Qwif zIXYpRvlF&CJ7HV06CBYWaz=m18U3MTbcdz*qq|rROK}?-@wPPNB%=}Rscv!?^P&`2 zS1sF*jy`i3vOn5=e?*BqCc;4Q1js(SrK$RXn5sU`9#sKfsscW~hfUp^_N6X0`}kaQgVS4-nAOA!2|K56t=U;`=z}cxwXUXZ%4j}_2v^W)-oY1`U$fp({ zAIMwwy}Vz6p?FIjzPzZ;bPfUH7>AZS|1)G-Dw#T0GR$F*zsJf zYb-g6uc2j9P91Bve#1j@Vp zzk+i##nBo63iqCklGJHwvgM9JbTG+}PS#Qwk?KhoU+Mu4-)5YqsYfb&sfQd|8oB=i zceMV^u5if1RAc|i8u=wOme2E`<9W+BySJdJ3#rM@bkyNmC(m5#eVdz>eV zd+PP39a1QqDhWI-rjW3nPmrB#pG;MYs zS~oint@(<4^>b8xjZ?0zamuwdNx8;n6zqo+bPkR1^5n9z$)TPMuNa&|U^&XU*;&rb z&T?)}mg9)tLM!&8ILw#k&<&6H7Gx}G_=pz>54J~k3uIbMDRi1j$3;3MZL3kGgD4&6k z!2vDAnHta591~$8(yWIAZ~X@%9hHd1w}AK5Lyx|$CHm<_A1?%VSL=hB0K6ECWPBn~ zJ%;EDqCUI=?BHF;0DkLi)wj-8eVc5RBl=3Gq*&>c6e}BaiyhJLan8FDEY3jQce(UQIio-1 zjQ&td(YHIJZ+AxD-cs~k&gi?G(RZ~JeYZ3EZfEq}Ek%FY8U1Nz^ru^jzQ-ATk2Ct7 zWb~QC@wB8&jgo}`YZaQBB_*6Cd_KYh1f?MEP8S~_s8RCi|=8++8 z6^58cE>J@cA*z04{C_;?rbTWaXiQ9bkCW@{IAGYNC6wvLCEgVL) zw{UbsX9GnOT#D|5wD|w#u_j0EEog$a;0qMBWjT>y!X&c^{z2mZ7A@f$*q|RNhxZDX z73(Ij*LuNWeD6+1EMi370tt@~SV;?*Vw#7bxFiz#XHO zN7AuJm0Bh`uUo!~{CR^F$+?N4-kRe}z3;)7dILjC9N0n^{zF%hv8v%(;el-rW|FRm zrn%zc3r{qySFW1oYk}NY326F!;CDM{zR2f$I33;>Rupf!Xqt8|-x#53YIeT9N7H)H z$Qg7P|K0TtHaRG>jIBV3B5Y;0TPz=2nJL0<{lUw0uCX!6M`yH`BkzB;|0qrLN-foY z>fK~ouITWN7{>{4nr2)15SXTQH5Ou7MW>hJD}mqOpmjV)b^n#)pU1GcwO`9Z31GiL zgm2^E$3HOpTUf)DqAc`0f8+5$19Gsxd{Mg8U!4e)h7&b`Sg5>|pRX{6VXu`)Z`!=4^-({l*F21Luok zK7b(MzK#Cz0VrPB(QgXT{(KrLnt^o#+Q6Hm`bWQQaQa&=+MiE!@&PICmT@yk|M;X7 zACc0}cWQq=6~)J)^iz}iX-fT+rGEO74|4KR2mNCjKJM7KP(5e3Yk_+7ur(mB&FW_r z_2Y|r*6Jr4^{nRX=WN#xKkDZp^&^rjllubt$1?fMmVRPQKg7np29AM#7Va$wMc(h# zKR#Q)8~^&b_SRESCLH(gdB(*h8plT8;HOZPJnRhkz!#tN($CQAeCfwa?!4B{KF~it z|HYft`hvLj*SD?p^=bW@P#vycC#r7=>x;uW{6pl)3rsp(`}6rNUM1DnM0sik8${J4qh8v1E()Y>U)YjXJZ}o9ZH>! zUuAZt)BgHZrM%FJ`9uGcGlqJ_pzFdBJ=ToPIOHTbOe^o;@Fae8Nosi1Q#$BBs z9cWbPb5|XHH^O+lI2SxdUgHTN=PVBmUx(A@i27(zpEm0Bul|eab$ph^N8R*cp7wtm zemvjQXKVVnO^5T`lP6{R6igqC>9aB&@3eE(drWk^^zere-VXWjjw4jJ;eJKPRC0R=T#ye2I(^&eGH^ehIBrR!^iFP$%*#oYmRxKp^q@M zKcBqgBX@jl6ZI2c>BZ-_^tpqMr(gR^8BLzid-yt>_Z#_S9$yK759 z&oSkaj&q(oL0!)WWH^R;J5JZ<8@oRLZu!jrHn{Zs*fuUQ^(vJMSI$Yj%;fVXTuA62 zm#!bfeQ&4J{`z&&`fY34pHDyXu}8`X&OQC39~U%SnXs?)Vnv7Z`AEJUhq8imj;j$a zLG+JLN>bdiV>_4df-Q@6+|X&L=ho-x7w~0(T$WWpF=- z(?4GO=iH$!M_H$T+J4jao%W}_aR1bQZjWd?MB5)aT`#1$#gR_?M~h;iNX+m@$Hsz2 zU2%Z#em81E4S~|Q5#`I)=R}N#nSo`+f$~VK!Uz}HZ>^sdt<~18Q4v}istA;p)t5E| zVi98;zxXyI5f9Xjjm7-+Mz|Pnk~gC2P4NDbIeag^5vr)0jL*Rt{%XEnzkXs}s1~21 z^C#kwDdBP>JSh<_A6t!A@Ef%aDq$3Fh_6O>`(sAk_((V$D32R{$vGB?Ct_h=oSy{H z_PBZzy-_zQR2@Lx{8(TVMR%xw&X`nO^t}p_zSR^)9Ue<5;%j9kL z20l9n??A9}5Ohv5@^fdw%GyR8`Q3 zvZvXV@=APv6srP!!k~I?Exu0>4Td9ze^#s_5F1x-L?=xP;J;74W1u=CS#l^`5vVK0 zSOj8a_0ouCF?{f^vP3;YI|YCD$xr@6dhk4V9UckG!UOKu}n7_yT|-OQB>}OC`%O9{y0cRJcPpNwot4VogW>Ws58Rs!nz67v!eKbeQ9|j#zycH1L%hk zSRFkTKz?P3+WI-6ngG7uU__A6%`?JwMe4@aM2%4G1e+<0=yZHb0{s=J zm=l=W2DA4CVe5J8Y z>Ir@gS1<>DJprZRD~e#jL=+!aFsdW?=tL-tYBGLwUR5B5K11!$ZI}{Of%3)Zwm@uY zpkg|Ql4DWr3oJ1jCdOhjYJ>QoX#-}lut$wQwm1+oI0GkE2Wkv_Dg$z$hV2j3MXOb3 z#v@Ki1Ph&2Sy>CtrhJ$aS&Tkq?ZApgbYfjJHXYMfKEPpwXUIn&*n_D03^s5M zKdE8F%c^C@i&UA!%tJ*oMsuV1_(ov7-~OscqE@0O!l5OJz<3nhz=06XsSO3g_{;=G zJ2ew)C}^Y~q-B$)OrMCc3Gu@qepMC7rx>IK2uzS-{qYe0gffgoJcO>F1fDMP$E!s4 zMNwOO;w8e)0wYnIgG$LOkr*aS5UE94lvZH%ACHt`c+_}d?8_3BMu;;l5VKh*R1^zT zP6T^|YA1*ARm-puj+EkiA%A6TiI8y4Z9q%+67PB<(q^HL9gDWp)168`8NFngsDwFjU!>JKMnNhK!; zB=<5IFJ=r?BXY9JUkwIhew?`AS_;<*)xP=~gL5{BT9rkD3GiKcjGU8DjKh+kx%?GI zWwk$;R7)5w)ls^YN^-&%A8-MO$4kL!L9hho9E2SN5XF=T&M5l1B9dVDMW<8eJy7>v3!6KWLY0vs=3N>^x2y8W8~EI;{$>m2i7;+R4YwatQ;WPXT5k9`v!U;( zi!^tEwa_E@ASxNK0RqRs*K0VDF|?X1qD&lCs#BE2xOxQDVq*$QhU0H5tthsmWcWl4 zshKPi!+-``s%U&NR{9xHQ0xqhZk^~52w`g634v(53Ue(`88@gxW<@z#E0t1@ua-=22f96VT3f3ikS># e9Pv;0mr+kA!U-_aAfvQ&NdoFRZp5kC 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

    Rp1h*3 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

      }Jli4-Z^gQ4@0Y(GwTqY4Mj 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

      Mp!FekdIWte0A=U`6e!87Q){}&z1 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%0AB5UCOn*8(o)KH8AK@sgHSV)Z2?&(gOcF`W>^)x z%e1w^Fdl0%yvGdN1fjzzX>vQ^tg8>a%?%&M zCqjFSV|o@mc%<{0@G0Yy1yB1dh~5R$jjahTbE)7fF1;04 z=2F3_=5A9@Z`bG(=A(l zK8=A0g1VB|MC!jnTw)4>dR(e@?>50ui0Y0No&zzUYk~c@F?Ip)17`*ILo$946y^Ll zGE6FwC#dD2K88V`32$=SvhdCz7pi+=l!e}Pqa+;c#VHFtc7yjV z{`w?-e}*^$K8ooB5Ueauw1nfnRiW7isrth4&S%0u8(%CV* zAq`phhVz;5=R>Rmt{eR&+f9(M-~=Buwmu4wWs;o?N0_K8*vHtKK*lUcL6=L@;O^5V z2z{THs;@<^wIsaN`0h-2XOIi;3UZ;xXyhR*CH1UAof-8-(Jn;R3o*XjM@e36qPQon zrnv^PlNEzG2u`|0cRte3A(nMsv7@;rav|;d~~%)A(Wy%Jy`V z@lA`3>r06~uEE5=oajl)Uz3P=Dnvorfjf+iN6U1Y-!xII&HXeVfK(gdgU)BdH{a7- z8`(Yu5nQnSc4F&00kTY1Q-)|u(^ksBcE;9ZILXfesJgJ3dnXaL{Y`om0L6$E|pk)%T3mgtL*BuW2iNXLxu+s1ci!mGD;x$p_&`G79?n;;hs!bI@H zAQnF6V!>JyHw<5OvEXk(EPR^BzsgJas__lO{-)y?FIP!84x)2Gmx;T}!kI1>gprkn zk3v`rLg09qRWJ<^#(o8Up4WS<@beJ!uUd)%+hJ_&3&59MI+}rm5{%UVeXNz7Wqhf4 z4~DrfM7V>1L!3Pfm}zY7JHVqZ-IQgwEkyG9g4b&LD1`fH;9O(t8p23Rx2{w#vc&57 zY;(Y>41>rGR;hZ5b(Q^j>#Cl|pGu@qka0hU4|N=;=?{Y(C+|?mc+HadRT96-jKa?< z68z#WF55p?=CvwW&$i5KJ-}VgY8h|s6ZjrrinB^VHKQ^bgbI}uDVf#!w~9g3lR?yz zLBzo)ew|ASzs|(3Gx6)}r)U$C!B0&5CMJFpbH9}g{0F|ubWpEzHrFO4os>kKlti7B zM4goTEhNmX7OLJ(wKRjtmYqaxSJY3SW{I{7FE`Ul(m{LDL3`f8?7~zYUve+Ox17xl zHKUqJ;&*ED!Zu_z^lhNKb1$YZYy+K|#;`zQZ51P|=R5?XQCf-s+ZqDE=KjfW_ao#; zNSnTJl=GSJ`@8t=lcy`&!y%3>K~Trpl6s=4tAe1Okb1kiEm6mXo_lM@PxSG6U-Jp7<ahugZ2+0Vo&cO^Y~^G?PDt+tlwMK?xrgvwrv^)=C7vA5LjP`a zsVV$1&I;58*M(^wAy8)?MylHGr@U}|@mlKoiKp_7ldqsEmHbICUZ(8JPO;V!oXbCUL)PX9uYlxm!QTl&C z6n+ru!4Tuv7MN#jy(PRB(Oe9vBElukXTr;eH&;ZqcR)lET#TB*%>_Q=Y)g2JqyRP}-*7$? zp0I24cw~E^$r^?m(U)X*EX05X!L*zYq=KvsQn$kK&S%2CcWdrewmqhA7;Z#gl3mcp zzNU@f<^e<@-Uc=$d|DGcwl{68$u|)_fQSXs{vx=8C)A!Ne=M?~pQeaG9~a~A3;)i< zKOPEG3jeOeKOWMbMt=>&^1nTp!pbtU+~XlF!~4vzmd8m>ru$($(o$y!1xGob2|JB1 z7K>~rn5<#gSKo#1Jk#@uE^wyvneZ9oi&(N<0I_ZbHyK-73dk}^P=@!KD2_;?>rK=q zSY&KnAb&o)QiO?zq&m6Lv=wPRVny(nOY?bKOY?b1i%$50^O^9(-J2JkY}Z2!LXe?m z(QFBv;A|T7Z8MC6Q1jpJ`(I#lbEwJpC})oaj(0W>Gl1r1CaMTz%<`Mn3XTrE@HmK+ z1R>*Dd4!#i?cwTNRH4}h*--|LcRmw-&-h~2WP1igbiqx=)^7psaW)TnIn66gR1q|c zjboSZOxH?tqq7RL#MwNI3>TWHChd2e&9(Q_d;n7B!Uvttgzw#>d8%alQ;5t3Ls2J- zY%`i$ny4apx3Mu@IsD0erPhwf)5waeLKyv|^lG1g+B4_Uf9&`2|fQOIc9fRnL zrmYv9$0O+#H0w=U5&X^A=-cu>`hqlG;Xvmz;aua3@yd1^h&1zJO7w0MRRzH#ZhBJh zXzDh>X~xzClU*v9=2F2~E)^(LvZD{Bd8&zO^7)jrg<;(1cSdu7X)DJ7pLA9}XE>Xu zK9A-lkVY=N)cH)f%J^dBvc1`44a0B2GrxknP28OcA9Ark5vY@3Bf&}vy24EBf)K1M ze89zm5FwuYZbarORAl)>vy5}Hn&uiv0~0>!d?ws+Pg{lYI#;%@nVxT$g8zmXm|)Xj zDjWhK7AOJ(6Ko_{Nx=q~Xb>JT^Eqbk~r|Ye!nqZ-^@yIkwyQLC8EFz*i9=xOK{O4uo60>RE&SC5RRANmR->*&Q~g8N4USTPAqN_r}}O zem{guu1>t~NArMraJm2=bUqV)Z6Ax2`nDgSWj(&o6WSYm^)gadJ!{j!OHGcNN;3>3cN*2_jh}* zE_Ii$E+zdG_blb}0qpQ83r{CHwHqQ_V0@!243&ttqUHA$_ZuQqI{57<41PlrKi;+b zEANBBUekMa2yBhqqBlfCcth{Uu}~`3$m3ZfH}5IT7xsR#Fkjf4m@kZV{XXXXPg|I) zg9xEPFl~7kn%gj`GTOnlI|BzetGQKy5+6<2Zy*j|Esrp1@;T59>qS5H!aYvq9mS{? z^0t$=y->K)`AoQUUz_rH zaLD%eP;zWZ^iva61uq+0dlPs+&Xns?;96(%wAZ1P1*@s66;JaFY zu%}s|%48tKyb*S>N#kV7{r}9pz8jibO&jZ;bl$1xq4Ul>x#h@KKvoZMrSq9^@CWLCc~cxOqW{$T2=;5B3G>w(q}$fWx%_N6EzIcaL7)>;0Wh4;V+CYE}Ue06hx^7L0z2Dk$uS2)x!a| ztR|M@@&bPi_4nK|7p5=1T(+-6g(SFe~VMEMl&QfGe- zyy$GkNZxDZseBL^ek!=p zeeMODJ0+V)($~1fMPK9OwFaWEac>p} zu=w?V0IrQI=C_C>rcRx^5J!EAKl}iXDSqb=RD526#BW;SH*F^VVT9BAvF%7~JD$My zH{M@|@OKbH7ic(i*P-$3VB@I>LgbEqBDW`z+Z8Q@XwOSRxb}YhW+r|!_bx^~vme_@ ziS4ARg>8HnvL89}?;34g2uC@e340E*A;one+ruG7EC}kj;H92u>Z%~9<68a-vagxC za@dD?tOF4!&-p<#54-jeV2!c0b-=%!-2(d|=2P1rIM~@Sz*uJ&0yi65Sp*zF@~o*g zV7#%FQvfBEthApJTgg!AnF@76;4cP4{;{gcCD?W*ww>=Hq&iF2T4Fmbv7Po!;s)Dk z(?dG=#dVkXbtHZr>k7Y)#4oO@#IHT^Yft)XPyFJl`fD+!j!%$}Y{)0Zok#l;lX05} zywv$jxYqdMYDczrn~Y!o0H1@{UIl$k7a@Dr)U|y6W%4{^*E8S?&S%06#uq)w_BDv* zBlx?qHGwRXMO7G9^L}2(;%{yxaEGYXKSdY-DGT91=QH64jW4p0?e0+0Um=PS_rqeO zdGg2t9OZl_yl%8ryEwj(O@@dlkeV~;^0|5LiZ#vjRYA}%Ytnzg^lgHmzpY7sI|^M* z3745|P4I|`yEEauLzF^I@R7qjL*Xn4vEUbnyI8n6St1tn9Zw#ZL0sPZ9>R@*tRdz; zi1i^j?9d<=GYvv6_)#tw^Anc~l#azY3+8*4S6$Hhksuc{3nGqSJMuJpF}p&@1@&Am z=94ZLXfS3kW)~Y^T@WgId2dU2X@nw-pPQQuckSG13@fC$cCKnRj65(~J6Ft?z46>! zF;76;ffAHIYOJ8u*y_%}ZZ16)5OIAZnBmf!0TEKcGM8$gXF-;j7)=$OXh1U{%S6lt z-gs_qOL%Qc;)88!D!T#`oz+mrTcIne`6bRO=sF8rQQ)nh|$VAop{DP;O8z$Agf9{r;Dgm;&f3C(AQn=qz2y=XY>^Jd! zXzo??7|^I-C2*=&SCdE#sHY-incmpS*cm zG@46($S(Q8CC+EUZI19Ayd}J3yA0y+6$Ev>v^#YSo1(k4w}jX8$o>c=NBn%6*EEY- zXnx8>wR?acIjdOegPP^xc0uzY(^e(`o0_)X8VzH;hanmcX;{J$&S%1}AK5%C*^Y$B zQ4rK|2vQ$x>Z;LZ8wt_5EYe3^(lc+^QF!4P6np7s~9y9uI)9|ON|_6t}xprkem z`kHBLEog?Cwx-aBI(r0gw6kLYb(EB+6Ib;`M5Xqovw0Q@zSu<7dw}0Mt1ND^F!6F^ zIn5Q2iYHv@d?tK~n+FU(UXIB2X^1WbK^?DE3w2fMLGInL9~eyIWn^L6mPCrvAoXjI zu1ka=R3`LLjeMXjze4{yL{c9?y#ylX_$KdJR68K!RJS0gVQ+&~AlN+62%5*5sD3K2 z*x6kBHeo{Ot~*hM0d?j2waA`_R7T+o&S$~_$2ONywttnpr6RcaXtA|V3$RS4Sccn} zwrYTu{cU+~+NtZ?68*Aw=v77;%&=H>fqK)_3imrkz19u-Np&|f<#rk$@4_5DAv7v5H!&7|myWG;4eAfC=fXZR$cvYZ4X8TX4qOBg zfAt(Oq4A70=DFs@IdxW^$jp+)GpWYSu5+_>bACv1*Z8_wJx7d)6_>NbdM3(gyl9PI zyT`gYe}efns~gSQIbuTNskHH&HCmWC3ilphtg`|wD5P4Xnp)zlneoa5fc{Hb8~cD_K5L0sA>*GCKt2B8>{9VLE*#6kaYh>bFTJ_2{tA5AL3o;drLgbv-(wx1$R@<^zkJ z{g*oRV=zDLFcABRaaq>i?J;yZ>_XnWAo$tyi#!pUfTy8d2C&o1ldTt(hG!+SFit7*L*clo5nRg-k_X3t?o z7jLFryqR|KX4=J@X%}y%UA);}7jO0ai_`USe#(3+J;dI!qbiK=t@PsLt+cy4a9*u_5hZL)yg#>*88wiGyH6&w0#IxER{d^JsAtZit=h zvg3Z+P1^QhnEOLqvunrL%GOt#HiX~W`fAgGf2A#|whAk0A%v~Axn5f+IQc7?qM3Is0-4l3(}|y(x?k!RPA>=_(qrPdD@^g`^m9>9NStrJuU0acL)~U zvfg}SutvTly4l%+`E9BBZK-+jsg(nY=u1=crK$PS_;&Qj!hBI`z9=6$MkalrH+QkjAi~q6* zl-Wr++nfTdbXNQ7$+qF}$6rY4oX+EliVMm?ph2oxO!I=>cr)AB6f}mdko|xe~VD zWxYCIg!g94dbMYSO?_E!a;dniSC0srT$F6?V|u8Bv*{b)XF zqIm5g-|w13Wgwak(^hnHy2VaT6F-Tv0TZ8^>t)C!mg)k8vUcrZi$!9L*X)6n1_2=2N%W83{L;6C+f*t<`? z@In2K^>ACS-fD%Jxve*OBXnCj8MoPFALMGVp1l8YrD~K2>zm z`7nMbxNYYGFqEt__qzf8E#5^g(uhK+%Az7vB}t)jRS_z#>58^C0Ty-N;Nm-g zH=Ny@P#?0WwNBtdXVsU85I+W~mZgIMa1uGzlTS#R)ODA44DV;x9I&A_a%VEB} zwBGBSw1p7dCXt3-Lzf$MoAcK%fi2VjFK>vv8m*tk4zZ+T9ZEFq5FQ~ z{s1D$@AisOT}Wt>ilR!0S0|$wvl)pAJ+i6!YY2{tj={aXc}mvEE&h+O)Uo2?Tahn= zV6O#kc2-_q;&>R}g#BIS)0St$xoZ#lKOBP1gHOgN$ zY>zQn!>|g^iWPjq#NC|$bmLKPh8V!`poRswEeS)vaqvmMS)z{%BhiU-Q4)s!;-01cF7SAn(EILg&HJ{kCojK@pL63@Vd#8l z(s`>o|LdnLsiDFF-g&DqBsDZisx?V!Xxh(V7Naplc#Ox}Q8?1$4H1UH?3nvqMNVFv z?y*7hv~*IO#cVs4@*%j!X1$M@#gnf80$TC-gcGFHmo6wLlB+j zsV0FYBpppi^#dp+XIxeEB4=L(R0O2w0RMG%>rh&xd8p(>t)8~FJZhH#S2+7kpv8jL zb_e!$_9MWN&eni4oV@|K(b&pDz!RulM(0;q0<|T;L(Xc-|KqG?ycJ50-(=M7d8*7x zdphcn>%slzs#soFcnqXHM|h<3 zneYkYi_@BHrw*xhES&3NK?qhZ zg2mnbEdp$6mX(RXWM|I;E_U|Yz}?Q?2R!aY-*?nFU;Q z_~J;D?fxcf7@iDI-2~H&tq4S_tngeD*9030R#MQQj~7EpXIY|;+ghS8OaC$JsxAl_ z3=y8^VnOI3UJ@RH>_}5v-e)_T7iJ#KOCS|Sc&YQ5a4WLV5L4T)n!eE@`~^f|1kakd zI}^$+S!dTEdKzL^DztHhv|>ES`r)oFIN142c$4u(|FS*6WDUb<@N^`YZsP7tD7U2l z-DsX|qI#i?{VzhZ7}EHKOPtSyH=olye%by6V%`26c){5&tS*3(>joJ9jmY+e3ZhT&`rSnC0G^W*|Ilw~K8=zv_?Pp(eud9^h&)TEH-o557A%wO@5ks3GpzpuP@Lq%HJaua zNGS`CbUqV)i=!u9m$L0KJwJE&KlDFweMvaV{ma6mjBk{LA#NOs;{MJ3GGXv*P5d(X zwONerR^h3}H!@*}*P54RJ~6%mQG{E8-%mI816V2|(u09(oy~pD$M9zJsmn(plPX<~ zNMfqdxd-94MJ-;axWvrEOWch}@x=?j>L!AaD=W%hN#to~5jl)~n%shIT(HZLt$;LF z!j;Zv!rNzBcX1Dq?Vn8FFzl=UJG%csWPZ037UW9r&2Bl}`Ytn0tL9pzf1;s`pK?;0@LM-fss}YbXO5TO;r7@giAywL|2h z@G?)*8bLD*be1P(H`b|lc_Yy(g{Y>x&`arSKB)6PBw z{KVMGqri(U&AZx5?vRfCWN4j9TJhjdY^S{zy2URZ@QHrnm4$v{5^G}K?{661CfG18 zx$W<4UYO*h`8x~`HEmsa-WXU$p|Ht8x|F5{NFg*vt(oLdyA!`(m~Zv(z#!AM<=G^e zPx=dL<-y1%-3uz1_}q3q?bl7l5B-8~IG+g*Jl|~NwkF%nP1Yz0gFY^F>34U1CJg%4 zw6EY_PW*?Y`rzN1_{Rk=*$1Gco}+1wf$R(l9_f50yw&*P%1XB9nyg{iSARabDIkA?-9jXQJAIsIBFxFGsWjvV8_z>3k;K=7Q!j%Jz4rZy5H~{}EjaK6Ks+NS)-d z8tuO!RzoRjYk3~S5DkZvhj4`RnefZT7xj>Bo5>o6ef4#8T@XF>0#YYSa5T-CCaPZ$ zwe>uYMTizd%0sxs`Aqnw3!Cd9+h3c$VK^K;0~YKaOoehw>To|EJDaFhXk#7zgf=*L zU5wRyh-Kd;4E=Lj^H&?PPe94CT10a(Wa)!ToX>=}U(_dkWG|V%VVKRfJOyQlUNfQG zlJwO>@G1#I)OaktjBHbjR2vTLyomc~|g0j_XqmDqJCIS>_kfw|YO2NXRS++sxE zHf^Owhz^gKPojL)rzYl3Fr*eIA<=jKtkB1E=x+%39}5{zK8ee;CvlmNn())E1w;6F zitQrT^B`4GIMew|xXSoqx03BQP1Z1c6rOPk`kHVTjR`=Ybxh zEDU+Z>n-&W^sR}0Xg*)(;xij!4z2`la&`vUR_To`C{G~SjlNIJe?d&k24K7y)|It- zPbORT%t+7JW3D`UvA3A`Cg~nCGx9 zvX>yr_@|&wD%!;e&$H38n}Rc)&xAiVzBs(@pnV^dxUZ(U#?06k!6%*1guRzHPl#*> zn5<#A5q(K^TR?Or7-nwWW#NG?7MvW!!gE|Km>$GJbKu=|>{q9l%RHa~tVG}|D}yl}kpnXqd?bMa)m*z^rU>A4g33g>TsB?cuK z27`6|8DxpUi%kaQD{X$t!W)h69wNLa$b~n3(NY^Cyw&(dSr}4|Tb(lMaKBdJg~oRe z6&`+-_0uZ+-WM$1P~ilR*D4JC3{CoJRX^V`o9>}P@3Yu4mG_p^g;vGq~(asY%> zaEP(>W9jc?2&uaMxwCJCs7UkDu3{i}c~Fi2Z_d7-D8KWdiZaRFmG~qG_dIXdZy`~- zNl+Pmsad4Jii(wtl}X~Dp{aXjeO|9dBpYkI1QVuv9v6Q8N=7%g7@g{;WRkctJkgSG z`wj3e)5hy}X-_e2buF;LS;1CjSlJyI=WO1!Z~&xrEga~4Ce+mg=gADP*D(GLhh!@p z;e00C$N0i_KiVT*UlNXTJ`>iBZ?+w6vPO%rul_J(8YCAprv!C!4Sgh{lT2GJwDHoh z9nEA&ISZ#ap9#+#&^*3&WM49U!?3UZ8gylR*kiT>q)sl;c_ZBNVH4F30nTt1p}o3j zo(Cxp;f2m;!X?HR^^omnAqIIfu-Mr=(tMh?m?$p#cou&M^~+E)SC7$LZ=&kofqy!?d2mjO*@|coq!9@R zJD&+ZXnavF*$y*V!?3S@M|68Z+OnANVMNhIl&SVY4FT!)$ z6EsZRoeAZZoDC19`2`cz3T>RbMQ9d7>R-6T`AoR|z~;G=?bD`j82;Y)?o9Z%AQuh_ zenOAY$X8E`V*J2uOTy4cIXCzzviIPZ4B!z&+nFe4J&fjXNLdR?eZ%mN@Prb)Y~t=rD7U1C1&E%8*Z`gdWRdIzg{bltnjOuzlCRfc zG>2OjtVD2x^O^AH#uwSi_M;|i7+wcY8iE^5+?@&KmSi`Y=4VV){Tv{RB)dXXxed)K z)5h#p(_90ocETr}&xFTr)?B*^?KYEfi3yH(J`*0Y`8#cUOwUIOz{?;Og5dKe?#_gA zOV-D9MDrmAC+$C+9g2|~#-*x|9=^Lv7@Qu5eFI{~yM%v(SnGI!t@Qpjp$3Vn~y(<3W8}I(xa#!gE%Bs0hgF%Jf;@VY(Q3i@LK0H;m%t% zCnejPAtDKaI*$HcWIN)L6l@sH;TDB$5FFurCcM}9;((Lwbdxmw-_>E=q)bS#IKzA4N0<$-ElC+x3cmJS+)wl z1yLwL$Z}|rrQT}TEAbj4uaHf=e2O|oy{$g=AGV; z<^f1cLinKbnXr>(mF_XJ9c;3O;YRc&*#&)EoQZ!XeI24Kf{#IT)hd)*vaF7#dAx}# zlYujw&GX-$=58($>}70K;A~}o*n>@4`3NxD*&_i3rV{FMlC#qQ5mJFC65q#lAvzCI zsf06~&x9wkX3|p0_8QYS4ExjH>H3oJW#hZc!eLu0R-+^gen|bLxJS4?6L!Db>n7aJ za%g12eLSC5p~uj6Tg3RG_17p1L*GM^zRT)6#2zBN()wwXg(0W7+Se5^M*joe^Y0#g zc@bmuBlxYd7~P|j{6^<-9 z#D-lT4&38x7Drt_9#*rT9E~<&@AX17H=4GhalPrRhO$4D>@gLZZIBKe;dtjW;eU-U zP7Jc`Hd({4KmB#C&xGrY?`{>kZL!cVK(+x&CT%v&&zh+6D)6SWd2OV9)n`U__CaT;DtaLUXz-pRnAPqqHr1P0@_BOVB;wB;6|CqjE*q{Cb=F=z%gPwKjuf#u7 zoGq{+QNh;c*4-+UTay1PSZ-#bTA_`XFZ0k`0x5strOs!<&kt_SU$)mlEJHz1Ps`Jj zdYP%Kf}rk5)mNLkEf-xDJ!9! z(8ozm{If*QVdJl*_-sa>%^;(iFTlgYK69#Y&4fZHre2%&S$~{w{0HBJY+vK zeZz1g`jYH|K91ulWbY#;le8BgbuwS~p#2`iQu+a~r)lejVVt_rXvRQFS$L%LnQ*=F zMd@Wb)npCB{`8-5eMz{^`0ldMZHqT!iWO|L#I`lDjZ^+fY+r?v@m)^yH50{=sE5}f zjYRl{^O^8d+cg(ow%ePmVYn+ir4k$xOod0fSkN~@hHR9nYqFF&NpD-42b!o}Xk(^b zXwHL_sc@$AnQ+v5nlqK{^`>ta4nfa)6bucfLb)Z&R9^SGS4r67re&eKHA=Y~2UlEF zS7UoSq#HGu4z#G%{LuJqh}6IK0knh6p_V(0ra1<(#RVSed?vil_+)X>o@TO!;f?TA zRIu2@-I-8sNukw4@G1#!GId=Lyvl`FJR>nQaPbPybA~)p0!OmyGpBZ0NK(;eY)-e29&teNErMY%5b& z4hZVxO6y-}2b;E9XycmO6wRTgjjO6cvkg*~!tu^$!Z+UAoTY3pG=0OcKmAhImxQ;t ze_8mL@r{x&_{FLIKDJ+X+s;JanOE}WLf@6>W2I-}EB~YpEj!SJG%Vpj=QH7r#urOP zwjVNC!*D!2b1T@0X-O_YA4eje>)kz1ei6;ZkTMZ2aXu67%3J&N@R02)(>Dw^qA$sA z2mHxY5KLnxNvKSw&qEw(g0lD8D%{p0R0SbIJa;D%%8IbFnbrltlyjlK6!kCGL1jzS z3d~##28KGD8$O1SXVNAk#Yvv)?MHJYq*4h-IiCqXuv2rXWP5_?8-{)LXQ0~$pJX4u z8_~}oQWHFGZ0!l)DVOG1K1kCIYckr~!o(w{8<8w1{F--a_rrLk<;obqQO;+=)y5YK zPqrtRj4|}1pNQ<|P%;LESOcjSxkR#^ZZdAMfwO~N_|+g6E(>zu3qdaI zFWz6RzeY)TJ~k9V5JH!QazmUKQ(1TqjZAnS#F}pvdJn}L8rkk-`bJqe(rt$bKMXN* z8b}CN7OsQ{H$wsOOX^NseH>WG$Gqjz=6(Z z!iS76CRVm%P1Z2%Pk)5#OTwcd5q!M1}7Q23k&~3YSENmN1eFWQ~iS4k&w!gSLCbqjJ zwj65ynn=IOlev-UGG}wkWX4vbSp(Uz0zT<{Cj93xt8Kh0mhC1c<9B|*T_8dUMwqxe z6Uwbm55cP>3{m5%TZHUZbEzx^9yhl74Df=p>i~}#&(T8=?FCWxu4zFnz9qb*-w|Rp z>3`hi*!BU;p5@hg-8}?Wh4vOmhk#N%AgJqX}IbDR(+@gSoNV0iH|;x zGXSy!103jlX1Hr}nPq#b=^Kv!TVFCe*T;e;{+aZXA?8D{iJQhlK(b%C`q`jPW^O7X z5l5Y1nz7X{0XMl+u+*i3Z@KhN;BIHX3;ftw#TOAw@LOZ!gev|oO;jrqi4|`p?Ln40 z*R3(_K+3C@PFxB_@Sh=tpc z3Umyc9r=1emrClv;eQzY^I7h@iKO;7SdGm6Z~N%?Up9x#{Xda_%zX7oT z1trvsB?Dxc4687#$}q%=(fd`#$niouG;4o zvD)*|B>Ij|zK=V>5No=lh}GSZ+wPBl1)|PH*7aPQM4I*xR+(otEr~QOw|zgojD>Vh zAiNUy&R-Yqor!yAKek*5>uOFDYQ4)rzak`}6_x4vz$$XE+807{$Id$dl{>cN(bq1vN#liRdPRbR=IiU0l!Kz7O*(|5mT?9Y3xA@qMGXxNMNLZ+(#mhCVVYT*L7-nvEbvll zltWNnqWXW{&$IU4>kP;Fet*CJdA*+bJnOlwXFY4}wf8w^&pw}aHuG&!xIH|z{RE$I z_68X};)YcH*Nr~IbQle{BT#oy2uC=dfcqb8V@tC5*j7xR8aC5Ee-J)t3Ea~C%itcy z>tTw*;8$)EHz9t|=f_~wZyEg_`&&_fxgwRn75v=+CI;F^yBIuOq!I$(3}WzSE(ZP> z#Nav?10jw4Eyh>WH34;oeY#FK46Kn2WMN^kCbn2p&n!l%EO&~co$L583`Od#?-j~s zjjUGI$RcE;mhi>;V)=%YUW_{|{%s;Mf4TnOh55^|dGT);&&lFdkv=E+hhR4=X&Z&v z$+FJZX%u%|{icz58tdwp$e02v!FBZ!@(N{Imlt7{A~RvynC_C{Qjrdoy9H~F%}+;B zC$oD7tCOiBmF~n*d4IEen2BlT*FH}Wx}M!bDMQz@d-_&SYo_b1kTrbf37|XgQ^d>=Y0dvfF!(@Y_YoZH?D^{S%OV*7q5pYt!HQ?nL|tyG&rm;M zxoxV?EPOZFx((@W%IA5A%!gWrl@WpioIO-O{(p2W?DN+ zW})jh>e+0WQ8r!H$il4DPEAyRAyzADmsObq1~ z?H?D&;~7^^&4%#XLe`nd9+T|m58_(;v*2P2ULzphl4gb&y}kBYX+w8ina8b?{ZSN+ z`}?`5EwgG--h*w(x@H#+aXtZGGQRjs3)>HyEH(UG(1Yg$IoQnaK-ZVRPLYNNxLbD_ z{FRG=UyD@PGWfiUfe<)9N0HDZ5!a7kNT>yL+ccj?Y(o-dFvOak6=JMpWT8#=0>LHD zX4)lcl1x<0UNzT?SVZ6k=M!+h5Bti<+_C+)NNXGT+@Y}TX9_Mo%-E6~aEg`?J|#1( z0wLt2IOMxb-3A2p#7zCHWCT?e^94v>V-L4Z#tBeI{XHO$F{Z7dZF6>O8F^y0Ec9d< zlDa~7-Yg7V=WBYXy4l5sRmoi5C$lp|nsq#HcQ(@=udXIoce%qY@(;<7h^LxoFj7g4 zvcc*26^?d30sm@zv1qZKC{pQxpw5qyLS2p2`B(~dTcpk_`e8*}XTjUE!C>}h6Xoe5 zI@v^(F9>>^y-0AKvo{ECcJ^5TIV#;O;{9qq+$ic*bG^vco^XTn30OU%&)SphKO#j0 zf;t}pq23`Et!$uTY(ARp)I7mN`Di-SoGhYm@HFQWaM(v1`^NT4)9YW^`q!7x|6Qad z34HV;7OD*XNF*^3ddRl`dRQuA3jhyvw-)eNXB30!=slO_UO1@s2 z4X!1Z!%ds_A00GXOA|7k6s0#Q>t;LYM|f=D1IAXd{IN?jL-IYuM77@tNH^O3*C>h5 zO-IyCN9KKz^uZgm8$1w}1d9SaUj*uk0_BH8l*V=PTxi}E;$a;HBEjJ{+j@&49N~Nd z9(HWwD!}$i(`yw7pBAZxz-kkBCm?Q7X(O)^UJFE8q(Ja0gWHTTF|bj@Sp(c@tcih; zPI*9hMS+tda4iblLg1RBXuv=S+yd@yfos5FAG7{iz!OBW210-NQj7X4(;s?WxvZ*( zd~C8&XbrbS2Fn`^NKXc>QJOoF=BJbha`3apckc+Ed8Es4|F}-@M>~I#kb7lSq#Z|m zLYJo^_~oC}_0%!W@2%{@2zG3e;Ls?+#~Tt1BiJ!Ac(lP_&UnjWH}F>DyY~gXw{*9x zw`_!}(bM%0spR8DIyftW6P>+Pz+{-oJ2YCR!x|qJ!+cmHn+Uvf+S*)&? zNk(K1GNX3Zpnzf8R_9}i0C=Z z>%yM>)Wt-Rj)-dnAMmsn_P~TOEa;)@uV@{}ePItw7|?}-avl|WQzI8bl>vSQME>t}>RP($l& zHdh<#+iB&5)w8ia0$)EOi?t>9#Wmg(2P)pwovSe~7Dbn*=cqZyMEQjTc|R%AK9#K{v9HVMJX=XM z7S53(NwaN3Y_=kB^q4vf5>E>Bx zi%$7mt%*6=W~8>S4$x1FB)w3OIvc07`FNv9Btta06Yy0JNrnjPmoJI;G{520B*N>!g>6?xC@`JqCGC0Tqx#gc@y2LLx1Tm7v3 zd`hd&$m=hbR23jG*^-;*SIsKWd>5G$r#dH2bxxe>oH*4vajJ8AnoQh1@s@H=yrtYz zj|y;)Z7E@G+*6MVa8JHbjnPQPin!(n$2p&XpFQ3#9Fi;pY^R!DH=e$Y{wmj(z>ghg z{$=nazd653+HjE#PrJrlDZ4 z%`fNnkpD=L_FBT8>g-ms94?A>;JXy`MANpPB%ohi-aadsV216V3elsB-W%i-6776N zmSM1+*;RFrr8NTo8E3`! z*J?!ym8z_kH1w3~7m2%7q}6e|68Wx3f$kJg5=pr zS{2C4T_N5Z7E>yJ4Hp+WC(fVDr~N+y5>Su$e9k+cAs`n?NoNZ!#3&_(5r#Qwus)8) zQPVvMkDrL(vtHYz?+``%_!vbSYfD>uqi~$_2{>OLq{zM48zno_^r>Mp{cAdyG`A(N z!~M&k+eZKKp*X+uSP2+nwPdN1SJ0OueQT@_xwL>^6{#w~e38-~3Z_a!VjyHQG|MKc zVbob`)LFhLBmK}wKP*co>h;*C$-oD$-Oyj?=ZbWUtqPfljkO`?t`}wXSCR7X8YYVn zsVlQRNV3C4(G0d1!HIIIX=}wO)h=EG#j?ABgPgagRBbT6m})f#>};~M1nSdV^;reh zh?HI#Tqlwk2oduAO&@^{(9yz}wW0?+>g=xszjyYp0-T~sh#xReWElzvIiG+M(rvyN zvAxXnso}rHYf6E>reBkchbF~6DcV4bs9FdIIiG+}sxS>bNjAy!sbN3*5_UnKSAukc ze-i2QrH+1>$1j7}C{^J1Chl(S6~5u(e+oXX3}x|40iE?3SLmw+eAArT0UR}~p`d$d zm4=r@|845D6%3|3g1cHZ(pE5xEI%$zk^V7}mOy42T|rEh=4I2ik^hG*Q`UmL)~LDG zV(USQ!WW!RzyVt{&H%QDmyo4~&l=yIfd33~u$kX`Twel%{v1m{e~26ONuSb@Pp!&DsY&IyAu$%Xatd03GWcKSkaPontPgnL7$Hb z|9xCv218d}pz~=NzYEN!yA=#Ex-?vSl_eW3QVnpq$=N3b`kg+c6@llSSLOz37nxxN z`^a#n`*>*A^buuwY5^~i@!jT7{heT=vspr`5T;%eEa5X#_$IbfzEjvv ziEO82wj?i0_7#|lIA?qR?yCO_G-a5oz2Ds`rhnkA2xFB^9i_7+kD{hsE?2I7*VX=JUjgPCTLTul6u>F!@>+@3o3?FVX)Z8reikFl*G=1g zjlg~L+|bS!DTk>y1vR`_d(Bg@R7ADF`OYWcbE9)wtJW?9RQv!(vAl7HKjdGL|8C> zQs6N89FsqDbR#0kwKwKGjSFwWRYc7V~w4sp*r>lwH?A#UmJe6Mbj7(04Y`Pkl*of`5K| zXYn;9C&=BiZ@WP3V8n7{-`AkO*Ys^b(BHe6p0^i~ zLGb}H!ly;*_2K$M@6so%?+%SAWt|vXLSw9$5d7ghIKGg4H`b#-kJew6lwi_48b{q& zkD_j@M^THf_z3i*NSl30A-*LN3*2mMWd~)ryGT-!J;_<%Sfwl}4-E5%hSjERqw|_b zQpQ4uV(%ZUJDNpevqER-YjTdhL;VmL{x0Dk0#8h$AkR{VZxUmC6l47TMU3&;_~kb~ ziZQ-Pj4@G+F~3lZm7d2K@JW#t4G_{B6NMfVg&q@!e##2l{%^snR?T(>+HQ4gXM69cwwf-kkq*_lbCZmW{J8WA`oJa;|3wZdC*nbPY zGQ`*$1b=b%Jvu&yi~39)Noc9{+9C{Vhit+U?6oDhd1{RHJdwG=e8~o1;hArwtzIq? zg!My7Pt&3?YnY|Jf})`eRnj|q{*0*VEF=1=vwJId4x>K#KkfP7+e5#_$TAj5*Rwv;__G2VM2%B z6KP=p!BiFU*Bz4mU9{zZ>ikmM{1RR6v0c#~DgKjDJL@{L&*Bh!h+eMYy>>I8985vnB+jyoyh?b7sQE-i`XtilvolQL zhFf^uawi<&d;%^szPMWE$sISkezQl8d`+J|>b#&U3V&hyirMN3V8XieN*lN+n1Z-P zqlvsqc!j9>Xd-GRRdQ@GT^>z$i$zViuK-l;Le7PSYPOgE_uhd7^r@7;NG+fSK3 z9RQZ4SK2^JFa>doMnez5s|1Fq`Dh}266y2N3{$w_7G85B9N~NdE;K%>x7s(lz636I zJ^^1hzR`A-$3Vt-m!T%HFpvNd~C>SjnpEpEH>;r1@ zDOR+zEmHGF5$6qXvGWPYHv@6WvE9{V`awY9$s$Duf@wa0$TYz;==17E`ZD^77ODmW zQ|+hzicDLgQ27_g9rBqhVg%r6&L`jp`n=o6_G_k3%itc;YXm?r&AYuy>Jg^SCwrut zqeOO&6^?d30UtHKm~3p1H(6>pSG?XJ0@+7spnq7>1}qa%ZIEcu+sP|h_tp6Fr?E0dJbuxgYwCzY`OF+%ujDAg)5y;z~l5`LcCJ2-OpsH z;kcj&-8RjpcL27pSuB0wT*S(k(o>QhBfn@JSJdSD8zurg(fI`Yy)N(KRIt6&^r_(w z#cTZo_nWvo0db2C3%ved>a+xgsCiQ8->?rI(gb`-m$MWLe8YIjg~2Z`;@9Ozce-|% z*R!MExZ_|Athd!W6l?4&23Kojm5O|?>iKO*N)}h;*OZaPf}ZpBwmw8((6hAyhUg1= z)~oRs4Mn~SdcLje{z2Z=f@Xmh_RJ{)E$n$$5olo?Xki?vxP_OD{!66Eo3GJcEz*|v z4Z#+QD(SBjk9?xp?bT($zPhrOXszJGDva1KDo=8a45Q&L>fxiIFx*8wS?M*xMa>3v zThG$M{I;InFjF$Wt(o~9Jx9qrOvoM0ESB`N7n8Zf`VZw^(!*qaR;1`ldKhmAw4_;} zdwNPmpnKwh+|$hb-kxoW%u_IrB4m_5wC*~*w4h> z3CPwZG0;zh5|PkH8>d=X2MOwrn7RstNcoZ3A=zY+okoPGJD-4GG``5YL+!IfTFPAl z)MEA5UNiM~mWW8;#m*<-L&g`8W~#kdBzNFJW7`2N`vhgr)aQ*rh(qu8TCTq3jl?9EiN=6WixRiVo~2wW-NngYo7mnjneyk?xRyKnlHgTmvt$YSeG^rI5a-;@)oqbF zFZ4ZfdBMEfiM`I*%=t%ZK5wEL+CMv+X?xXNFQQD~2Imv-T)QeMhK}vOL>dmTyVRPb zeFfv4Ry(euN9rZlreWDj2Kd;-2` ze33o2{zG3CV67<16YVu7ssh0|pMgT%hWdH4%+ug5l=UJjqHu%r3HZf9$cr?v^)E8@ z3$M}*7by>bOFK-#54#xPx3&<2M2oVHf|Uq1)YNT22v!EUmQ*c)5UgATYs;o;rqr`U zR!rf=&L`mA#uuYlruKub-|RcGH~ZN3_jMNcro`15qxM*n>8?ScU!-Uq|2xP*zvR--xQX`|Yg>$f4Lne!`T^X!gDHqxRMyC=gx3KgjROc?<-#jJ^!F^(ovHX| zMCzdPbz#V>GaKwYb(mVNnm8dBW*Scd@}oWR7_j}R=~KhMiB~qj-%Z?|fSX(l9IWd) zB7jHQHC_$qCvb@lfy9kKB~smI>UOM9N8_P{euqwt+*Vm4wU-5-F`rsdgM3Y- z(vqrrIVDrWXFWbq=({3)e!d`iQjt&Bzl7MpXa4AaBGP*Jj8wN+#(D3N_ry<06}%^A z-c`x``@puV#D2rP^T~?5k3OaFK05PWF4+nZ$04}V`2;*jSG>wonfVLbznDHX{D*kW zBCyHC-3d5IZW04Kgb3gW7Xy6*kCAMwh$O&q&L`kq#urIodzQ&k!+!K7?CK&F7P!RR zy362IE(R6^G5B2<10isJAe|xE1*WbLfZyHHC~>;Y*{n=U)LbfJG~nINC*Vi)Rv|7a zwvUSx3HZCQwKoO)%9ir}fB+}4S^Q_EU1x@Ez-z`WPw_YU;|Fg0r2)X}Yu7 zsOPDfibxy0+W7>mDqLJuY=3C_)Nm*1wFdyhgDHqxv^7LtCA_ycbqxq!<-#kUjSi_N zi^vN+&G`hp&G@36*z$#;PGlwUCXseAAef5t7p7ko@!=A9sYr_i2&OHW=@QA7ifp|J z?{+=`kJ6jaxH8zTGQB>77Ooa41Aw1>!W86pi6k}%5e5odL=pqL1~GV$i-CUnE79MJ z7Ptn4{>tFLTx{Th%k;OM1+D?1zcNTC(ed#6BG|cy1hoc|Uj|nsYZFl)@I>bmaA&>e zj_ZSMw@9T1eraqw@N1U>I7REG@TubSh#A%Z_o)^>`Kl>=+VBZ!bYxTd)8MSsx|WMy zFM`kX!;}F(@x+k85zZ&zcJFB%61G>GUQcWge#`jo1Y8m1;6H*K^cck@BQZX1`m_Xo zQ=|$2AzT^6EhPw5HfEC2U`kNAQYlC zE81tIKFho+ndnY6f6^!#CePs_E3I&Z^9jhWW5ufl+ltBbyguQ{A}vhd6ccwR;1wK{eOdxHh*VYJ zEfaT_LENHUAo5D^`iDsA0l}-K@XFtN4O5We*1rxU;RxpwaEoml^TPH_)9W9;-bO#x z^(F9lkum_PChjhSgpKMpPNHK(8p`K$ZCty{l z`h8qq0)v0PJ`R-Z2-9~@{Y;^snynA?2aB{f&Jo=0>{w;-3A=@&5*rdor;2Y1ZgMu$ z-lZl^N$9c6n)SPUgbuJd3=6nM3i%)U2u)W>% zsbMqyEZ3L7D@2+$;7SvBmqFa3*}Pby@bh5b&9!-c%VhkZ<)NE&g%3HOfTOl+%n#e= zO`jV6#rW<7-5o^`(x81(rp6Enn`I->B;XZZ-p4p1)9pq5JXQ;{YwB=|Jw}4yt4I>E{Vz+=EFHNF&+D-kH<)JFv(UTciBew7!yC;I@>V76Is$UD< zt&YTQEogW4TtP`)O1hxEEG+JcM^t=W#3&%exUUC>G?h?CmZvFbgz9%>y)Q0|$Lv$+ z$7K3fsesLDU{~DTErx(2yxIbsH3BCS zZY}k$TZ9~;@T@T6!DmMwJnQQj5qwr}CUAn!Tr`PU1WjV*BsTLoSN8nan7##In_A** zrj6EOC0dL5DJq(aJ_pF=drtFX@hQlT-;k}D#X})fwX=y$eSE$#O z{Vm}lfxJ@Dy7>Q}z#rB50XD$efdXb$lhXg;^na58rA2EB$Om+k6Q+ph9q zcdGeVqiAy=Q z*vciM_?Y{TblVK4qe`ma-xNi=*_+btVA{4Ta&6wvrd(T{pKJ4Ln^&YIy24#1EzzUM z(O@U=^E%|Fye5zz=I|sFDn4OActw5_mlS>zBfp7}-^3<cn2eGIo^Y^5srtV=WZVLE1p+u^1wZ{Y~%6L6mK#k&V=4>y^f zcF;tBjAU1cqGRw#H7_?&ek2h!71`$x!uif8;Kz2iDNVBMuzkezsbN3*5_Z26=@17# z=%LCWZW3ovAC>w*6SW_nYx6TmMWQwl`GF@opMdRqH0Fox4AZBE{pd^BJuOmofYs*K zT?TQBibmA0n>tOvVA=w{*D^>Ga97W!1@xYa=W-KcnA?`YVA~qm=5I*8CEF)OQHkjG zDi{5_(7q^ksDjDxh|p)`(;?Ah5rqR!b3OsD-m|fA*j{aV-Rl1~`g>eo0$bd_3~q0H zS^_T&a?txoOW8EjM~IPt!L}u`%@7vhwLk}%cmP4Z~TcRw7 zMm^{6-WI5fp%%71Gu2X%=^JYKPl4ZXSR_V)+igA?kN+Fc0K`bGrlMfw#S+*ErF+qbjAU`Wa92Jh+A~N z|Dc+aOjH9tZ)_Wevt0_fPkw!If<$gu#qbI<%ooKHHJ6H*Qt)o)6L8o*jnjnfGp0`s zUlOmy4Dd5TDpdmF7HxNtR|)UcA`J-$US;rKE(Z7=Aq6Xg+gPv)5YowKJqnx<_<4&^ z147`IBAxu~K)-)5%SzUlvLXJ?-c>f+bT?c?Wxx^6C*aSFFJ=?lPl^-?2ea14Y;?9f&GFQ{LN^y2ChHIt-*Z`HZjm4A_({&7XzRFpo>9%%R_4jcu0gb zxT8iQF>rzpstlg#VjzsAoQ<`ljP?*|TPL}XINKpu;Oz7J>GQCWX3#xK9gAdp?tx-$ zAT^R7qLd_kOfbtbtNkO-rdDK7%X+0$bf;bDa>3V~J$Qe8$R?6>vfvD7Zx?*e*$sj> zoZb2W-Tf|-?Rdc_oSh~(&)GKx|8}-ZIg`6=&r#mwE_RjR8E1FWNOrZ+RIkx!7?BKK z61?i{2$g>?n~Cbl0wzWVw+Zfa_I1G~XU|X(m?9ZGBA_N>2dN&3m8SX?fmf;eKFx^F zS+#FzG^Lf>R2S+GPe@|HKcNT|7`}<$geMEX36bA~$ZtXuzln=A6TeBz z3%^N`-=xSdKM7nZ+v`NpuFYx)Ymh}p_F7Ee)W9LJSxm86NU>Qa)3hRPwpCGiOa)pg zih|FOX11@HCvt6G?YdU>Y+v13xNL2zxYG}jij@PO={Xp1i!z8@j-D-ZR+wCl&Rin> zv6mM5V`F_N0LRz+Y*pst%e?hr-#tD1YMHV=t-&gyAlAqZdTTU^yr(=neUZ-+%r>^d zLG0_jmPOORvRF;VsPOmpbO$eMWPaAjJgpID!Qn39eLW8szW4RqsqERfOcVLu*Ax4O zos=zegGf8vTOmla2S)pz*w~$}H63Hd1Sj|`Y51&P_$GeiA1nOE-xCs+?fA%VeCEf_ zIY*>J{z$F5qkZKq){L$3t%T+Ilr7Qfj*7LfNVc*2Y35$JUG_gSp9+S1nqeg~{EIY$ ze8XWU*w%LVJPb=FEGV{Sjvq~Bw*NPu)g?WL1yfDNlAg@i8d69k=sjtd5=<}-*{5_NI&L~#bCdn`GSe;<->uM6WV@nP0 zGhVljOut0!r6$uAr|@p)6Y!>w^r^9A&zW8|?q6R*|G^JiHGm^T)EFdev?$16PgAD} zIMPj9K+hnmv1|{OTvJp;YR|^u0(eH zw2o{$!QhvdHL{&@jK&j6l~3mq$(CCAR94~L&L?2$qkYOM*>6psmcZvl8UheZ%h?G3 z8#B2_OLPs^Cd$`Zi<*P26Wu%^9O8Te-fetwt&HtKCQA*Q=}&Qe37l_ycNtt1UXYekyqOdZYnRB0|ZZN7;dspdixwHFTg)SfKO>87oqy~Ek8EX&k~34D(fj zVMw_0Pw}LpQq@SK83g5)`=sy>>M@P2#rOJ64`o%W<$_;|W z&c>0#n9)9B+V(#P=)cdH!%&XRES1u+uLe{2IB2L(W~wqX2Oc!9Pp|q|Z{yTITM0Kf zpMc|a23FAg?1SwACeu&a3l9l;&~4MK{{h$zcH0s-Mx+dY5H?>^k!gbIK4w}4f@w<@ z78yT%6778zHQPiS72t`^C*aH@8wY^xmrSqU#uh#-Qc}QUChkr^+@eK^*OnG3ErB6w zp8tK)|3ajxdNTKJ&r${lipUS#()k3WvT=dc98eNP!(-@!MYw}QoKL{JjW6a0+e=KA z8aC4(==u_s` zwgIdc4Hj_sHgWb^roRu0Y_k(S4gcZp#vmb3QTDT8e9e?MWil1mOSprS1Zs7HO)1eYS8hI6)*auquebH7*9; z;eF)Ap^r1Ik1Ftmtt?n4_*IdD0XGCO_>hZ%@O;8fkjL%G+Md4WeRO6MKp)esk2WBr zFfmp?hg?euJi^DBfamEDLk|Ai`0fNu)EjccK4tqqit#;>7V@VRf=61bf}a&YlKw>i z1@?7g+usuGY=x=;UbEUpv2VE)sH$(xHsEaSbg_`S0KRN&4d9`|vZYX7oEq?yNh<(_ zh?Wj{-(-1L%F5*cORI8;z-PMxgn!Z_{lB>Z$&RrME1wZu=qzxhvo{Lva<*6u719rR z-z4@C%e(S~;5BC{?O~p5o8T;Gvq?KciBd5w$SEL?zg7u=FuzkW({p6{ut=t-gZ{*i z3P5!cgZ%%VA^;)6=~;v?$@FQDa0d9ANTvW)QiL}(%c8aucf!j^o-2&n!an{?%CAvkV~zzohSQAiPQVL;9PI0NzGS};X-~=0 zI#)qt5M){Q8_Yh4WV6Coi|(6?kg@LyNwiMAY2nP1Z5;s`fCYG-zf zB)d_>xei?Hd;&gae3A7Uwb#171is*W0-mDv7mpCzlF8Bp4Ej93Z6$lZNCiAX@KI-v z6nxy-;{+!-dy>E(PFeYkSVBd0@9)30c!pz~6}DefK-D@v2CE3D_lH?G!*rsRewuTqOoPT6YUb zCK5*p<#WDA5n=ql#fOf^XC3b#*F8m=v15CMXLx~*&GZx@=)1tsZH2xr5y`I$#8-S} zOZkTw`4nGX_UtQQN9zh{=Qb&PAnC+6C>OFn&b%CULewyFBJ)M)Cp2=iHqX2 z5dcz>oo6e_P>9Z~&uQ&@Z9iijxtg|Zpe$3gT-zvqR zuV{;;ju=Z6`CKQ-i!RM_qWFZ;$C&r@kUUkkMpkBPWacx~%`6cMAH3N41iVh~X*BeF zH^g>Vtr8YK*i3($`KJl^xJXM3;GdTiss%hrt`Y-Ny@wXCMq$$4I73%b$T(@ zsZDG7qPB%eFENZe0K}z zw#7%X^CWvn6m9&=)#TrqCL6z5vLlNW*>>(! z*mg#?`H>dcPC8q*VN{b&S6q@*ACsEIop51cJ0Y^2klFIo;I*P?nulpBhud`O;1iB; zJ^?Q@zBr(;?J!wtc)oZY5I{es2`=ZFX$=Ub`CQDDY?jDQ55kL`Pr#$z=L;zt0Jcw> zJ~eEn|EB9pV9@6aD)LW=6ZCm5_$(4>**q^8r|!jOy`x<$Qu#Z7A`IU7w4vvp*;JDk z1>?;-f8!K+cRf;gcV*ElGH(-62k=Da6Y%H87c((a?fIgu2Gr)4x;y8WXgna=5<&a? z68wW^pxeq2&RCL&jmf9VmQfGs;T=8En0rcV4smXpz{(f_t5<$*C@ij-%zW-()^*z`M+__D#Ve zXAAeXU&wWxx!1BThsfwmQ8s_mgJagF<3r?vQz=s~wF))ux0nm#RoAy$5bNBRW)86qtsAeiRM;0DS5Z0hzb>(kUc z(?pd_)T`!t5epC8;Cur9dPl2XekFr#yUFxF+QOd)J?OT@K(O7`ZA)N?l@BD+C+Lq7 zX&^u_%?DDK>@id40~x30Crp$NWVxCvM0T_bS2~}7FYVMg5Nx+GS!#%0*YxWy%&HO@ zlrRhd^6Vphf__htvInjcY00&K&$<{05%NLd#k0J%NdVUv+x`>511?=Ac*>=KhpJ?u zq6@X-rKK|sp!dQ|Z;fm;z0$51*&GWuIG=!z?c7)zZ26}t7ArU*=s~xQ=2*5nx@`i6 zf3}L;T5vm6q~ZV2Yf*8Er#X!g{uNi@l6Js(p?(sgYBE9PYrjLUXuX~3#Op|7gsxQa1euE6UiFrCvZXs zJDF(>2!UI`16>S+z%AfcT?~Z4dDVtWhNs>(j}^>vHXD1Pt)d-g+RBl+VKpOBCUW&L`jv#ur1xwr(>03%u}3k%kCdW8&@v#7*J>;k8K3 z8$}cmTv?9s-pHN*O$P9olii%`BL2c zYG!H71L()Jgv)7WS_6V9v*0xY9-wMe4xo3;u(V{EN3%(t%=`3<&Sw7Cd}IB&mm zag*^y^4K0GQt!YK#A`r!A}J_*f&#ReORP*d_qu1OB$_r+75&vO%UtJSAg?HQ9&^by?1e^L+CMIvPVfq zglJ-ysJT?c#DaG_pMXQ&(KxZ#K5qKd@HgU>G4QmByAyB=xk(HVL7f5p1S=6V=+DjO zB`O@SiRQytB5bvz9CvKk5Ds&m|KLQ**e8frBHQPrymW7i$XJHj|}> z{pd^B1$}<-MgB>o&(k|jKA#dr^U|T_WD)6sr#WxGE3(G;B0X&9m@GBytN*fe{tK%$ zfM0}<7R`6m{8gif0Bc2b4!+>L{r>7F1|csx$M)Z*PYwIgm#{lj{yLBVzv-sC4B{qn zHal<0a(@%mMhUnnAUZa-R1%%^OEt2d;5#55fIiG-QjW4>z_NOLGOW?C2bqfU3yxYjMjA_v4-S$ehUPQOx z2ImuSeyMSSux*h{iwg*9PAB$4J=D}yz;Df|T_$#(N%KvZUqRttcB7@!t>)Jntrn?y zqsR&(T_=b1F6fIY75+)2&krl&C%Rii8*>@F$N276@R1+~ zL)^T&FUW6i$u-jb1bZlLvHa-iS6B9->-?+WwHS9nPl zA)&4Z#D^sEy}C`Z&smh}Lcw>O%>shj)2z&(CK28)KF%|~Sa)g;&}V042?TY%(W2HD zjZ#;Epw9C^?cQyXcPC?L^ZV2oz-7^&D7snBGw9ciSr4# zpGFn0m6?)-YZBm_B5fDI&Bj)MXI(l%zW7J`$xLZpG;OueRwb}k6!DJ|^zj|3P@^oJ z&2Luxyvd7NWBVDAYR&l>wb;;&{cwe!y{m;b&!S7l(?pa5obG%AvW3Uxz;>PKQ^RKZ z%UxdruQtBB4EnDy)PUfYA5l@*gz!P1A5oFM9O?5TC+ceI%Y}b_sTAou? zq$RXgaDh^cR#W8Nb${WVFIDtcnzs$^eDlutubFDj64`1KUhKU6g2YKWdgJn9dxuDK z2ee78JOC`C87&N}7=}1gvI$4M!s4_6LEVw5ACl~N3z%owq2^=}S%RlIpMcY}gTz^4 zd$~yY0O!~SlYdrOXsc+0^Te!g)ZaJfHXx`cWNJ45vn^nr+DtWPSqeH_g%>-YfCu`` zefgUhY`K4tYhrMv@!bjddXR(7{BCxA3H*&nl?OtIGKgEWFm_aP55J`_%l~Cr^_p{j z^o^0lSP`WK$2p&XBXy@*Tv}{9O|RR>`q!5teSRR}f1Ud$;Iqbew}8J?l~k7m4E^Q@ zSmalZ{95sI+q9vNKX|Mb@LfKJpW2vG)cixw7^UonyW#DQz`0|ISu?wTt;^qKERH%NA?dFN}e zSIzYz)*!gS`2?)^7f7m&zp$OAn;|)dK=k^2{plG^3`&u~ss@7@Tl;DQ+jN50DsKVL zF+NSeZ8i7E!QG8d6Y$_52VV(tu;yQuw}2arPZRL!?K}>+=li^0@LJ=$Tfp@}4&I|H z3i<_GZ1iaYhDzkCH>yNA8tC$dfre7GWCjY%1&h6+0IiW;U&j>suY0M7f~V--O8E~1 zml&T81()mKLk_lhVTXdJdtrxxp|C^2P^e+x_q=NyTRqQ3BL-c8)NYZR##4;CWX%56*tTJCA5_?Rjtk|qy#`

    1. d~Xprk>L?c@_gT%?z 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
    2. G?rDLYe31?!J!A-w8-qb)g6UNqp45IM>Ub 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 JSLEE-{V$A@rNRIJ literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/build/Makefile b/libraries/sqlite/unix/build/Makefile new file mode 100644 index 0000000000..e3b6a4509d --- /dev/null +++ b/libraries/sqlite/unix/build/Makefile @@ -0,0 +1,775 @@ +#!/usr/make +# +# Makefile for SQLITE +# +# This makefile is suppose to be configured automatically using the +# autoconf. But if that does not work for you, you can configure +# the makefile manually. Just set the parameters below to values that +# work well for your system. +# +# If the configure script does not work out-of-the-box, you might +# be able to get it to work by giving it some hints. See the comment +# at the beginning of configure.in for additional information. +# + +# The toplevel directory of the source tree. This is the directory +# that contains this "Makefile.in" and the "configure.in" script. +# +TOP = ../sqlite-3.5.1 + +# C Compiler and options for use in building executables that +# will run on the platform that is doing the build. +# +BCC = gcc -g -O2 + +# C Compile and options for use in building executables that +# will run on the target platform. (BCC and TCC are usually the +# same unless your are cross-compiling.) +# +TCC = gcc -g -O2 -I. -I${TOP}/src + +# Define -DNDEBUG to compile without debugging (i.e., for production usage) +# Omitting the define will cause extra debugging code to be inserted and +# includes extra comments when "EXPLAIN stmt" is used. +# +TCC += -DNDEBUG + +# Compiler options needed for programs that use the TCL library. +# +TCC += + +# The library that programs using TCL must link against. +# +LIBTCL = + +# Compiler options needed for programs that use the readline() library. +# +READLINE_FLAGS = -DHAVE_READLINE=0 + +# The library that programs using readline() must link against. +# +LIBREADLINE = + +# Should the database engine be compiled threadsafe +# +TCC += -DSQLITE_THREADSAFE=1 + +# The pthreads library if needed +# +LIBPTHREAD=-lpthread + +# Do threads override each others locks by default (1), or do we test (-1) +# +TCC += -DSQLITE_THREAD_OVERRIDE_LOCK=-1 + +# The fdatasync library +TLIBS = + +# Flags controlling use of the in memory btree implementation +# +# TEMP_STORE is 0 to force temporary tables to be in a file, 1 to +# default to file, 2 to default to memory, and 3 to force temporary +# tables to always be in memory. +# +TEMP_STORE = -DTEMP_STORE=1 + +# Version numbers and release number for the SQLite being compiled. +# +VERSION = 3.5 +VERSION_NUMBER = 3005001 +RELEASE = 3.5.1 + +# Filename extensions +# +BEXE = +TEXE = + +# The following variable is "1" if the configure script was able to locate +# the tclConfig.sh file. It is an empty string otherwise. When this +# variable is "1", the TCL extension library (libtclsqlite3.so) is built +# and installed. +# +HAVE_TCL = + +# The suffix used on shared libraries. Ex: ".dll", ".so", ".dylib" +# +SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ + +# The directory into which to store package information for + +# Some standard variables and programs +# +prefix = /usr/local +exec_prefix = ${prefix} +libdir = ${exec_prefix}/lib +INSTALL = /usr/bin/install -c +LIBTOOL = ./libtool +ALLOWRELEASE = + +# libtool compile/link/install +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(TCC) +LTLINK = $(LIBTOOL) --mode=link $(TCC) +LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) + +# nawk compatible awk. +NAWK = mawk + +# You should not have to change anything below this line +############################################################################### +TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1 + +# Object files for the SQLite library. +# +LIBOBJ = alter.lo analyze.lo attach.lo auth.lo btmutex.lo btree.lo build.lo \ + callback.lo complete.lo date.lo \ + delete.lo expr.lo func.lo hash.lo journal.lo insert.lo loadext.lo \ + main.lo malloc.lo mem1.lo mem2.lo mutex.lo \ + mutex_os2.lo mutex_unix.lo mutex_w32.lo \ + opcodes.lo os.lo os_unix.lo os_win.lo os_os2.lo \ + pager.lo parse.lo pragma.lo prepare.lo printf.lo random.lo \ + select.lo table.lo tokenize.lo trigger.lo update.lo \ + util.lo vacuum.lo \ + vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbefifo.lo vdbemem.lo \ + where.lo utf.lo legacy.lo vtab.lo + +# All of the source code files. +# +SRC = \ + $(TOP)/src/alter.c \ + $(TOP)/src/analyze.c \ + $(TOP)/src/attach.c \ + $(TOP)/src/auth.c \ + $(TOP)/src/btmutex.c \ + $(TOP)/src/btree.c \ + $(TOP)/src/btree.h \ + $(TOP)/src/build.c \ + $(TOP)/src/callback.c \ + $(TOP)/src/complete.c \ + $(TOP)/src/date.c \ + $(TOP)/src/delete.c \ + $(TOP)/src/expr.c \ + $(TOP)/src/func.c \ + $(TOP)/src/hash.c \ + $(TOP)/src/hash.h \ + $(TOP)/src/insert.c \ + $(TOP)/src/journal.c \ + $(TOP)/src/legacy.c \ + $(TOP)/src/loadext.c \ + $(TOP)/src/main.c \ + $(TOP)/src/malloc.c \ + $(TOP)/src/mem1.c \ + $(TOP)/src/mem2.c \ + $(TOP)/src/mutex.c \ + $(TOP)/src/mutex_os2.c \ + $(TOP)/src/mutex_unix.c \ + $(TOP)/src/mutex_w32.c \ + $(TOP)/src/os.c \ + $(TOP)/src/os_unix.c \ + $(TOP)/src/os_win.c \ + $(TOP)/src/os_os2.c \ + $(TOP)/src/pager.c \ + $(TOP)/src/pager.h \ + $(TOP)/src/parse.y \ + $(TOP)/src/pragma.c \ + $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c \ + $(TOP)/src/random.c \ + $(TOP)/src/select.c \ + $(TOP)/src/shell.c \ + $(TOP)/src/sqlite.h.in \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/table.c \ + $(TOP)/src/tclsqlite.c \ + $(TOP)/src/tokenize.c \ + $(TOP)/src/trigger.c \ + $(TOP)/src/utf.c \ + $(TOP)/src/update.c \ + $(TOP)/src/util.c \ + $(TOP)/src/vacuum.c \ + $(TOP)/src/vdbe.c \ + $(TOP)/src/vdbe.h \ + $(TOP)/src/vdbeapi.c \ + $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbeblob.c \ + $(TOP)/src/vdbefifo.c \ + $(TOP)/src/vdbemem.c \ + $(TOP)/src/vdbeInt.h \ + $(TOP)/src/vtab.c \ + $(TOP)/src/where.c + +# Source code for extensions +# +SRC += \ + $(TOP)/ext/fts1/fts1.c \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.c \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_porter.c \ + $(TOP)/ext/fts1/fts1_tokenizer.h \ + $(TOP)/ext/fts1/fts1_tokenizer1.c + + +# Source code to the test files. +# +TESTSRC = \ + $(TOP)/src/attach.c \ + $(TOP)/src/btree.c \ + $(TOP)/src/build.c \ + $(TOP)/src/date.c \ + $(TOP)/src/expr.c \ + $(TOP)/src/func.c \ + $(TOP)/src/insert.c \ + $(TOP)/src/malloc.c \ + $(TOP)/src/os.c \ + $(TOP)/src/os_os2.c \ + $(TOP)/src/os_unix.c \ + $(TOP)/src/os_win.c \ + $(TOP)/src/pager.c \ + $(TOP)/src/pragma.c \ + $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c \ + $(TOP)/src/select.c \ + $(TOP)/src/test1.c \ + $(TOP)/src/test2.c \ + $(TOP)/src/test3.c \ + $(TOP)/src/test4.c \ + $(TOP)/src/test5.c \ + $(TOP)/src/test6.c \ + $(TOP)/src/test7.c \ + $(TOP)/src/test8.c \ + $(TOP)/src/test9.c \ + $(TOP)/src/test_autoext.c \ + $(TOP)/src/test_async.c \ + $(TOP)/src/test_btree.c \ + $(TOP)/src/test_config.c \ + $(TOP)/src/test_hexio.c \ + $(TOP)/src/test_malloc.c \ + $(TOP)/src/test_md5.c \ + $(TOP)/src/test_schema.c \ + $(TOP)/src/test_server.c \ + $(TOP)/src/test_tclvar.c \ + $(TOP)/src/tokenize.c \ + $(TOP)/src/utf.c \ + $(TOP)/src/util.c \ + $(TOP)/src/vdbe.c \ + $(TOP)/src/vdbeapi.c \ + $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbemem.c \ + $(TOP)/src/where.c \ + parse.c + +# Header files used by all library source files. +# +HDR = \ + sqlite3.h \ + $(TOP)/src/btree.h \ + $(TOP)/src/btreeInt.h \ + $(TOP)/src/hash.h \ + $(TOP)/src/sqliteLimit.h \ + $(TOP)/src/mutex.h \ + opcodes.h \ + $(TOP)/src/os.h \ + $(TOP)/src/os_common.h \ + $(TOP)/src/sqlite3ext.h \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/vdbe.h \ + parse.h + +# Header files used by extensions +# +HDR += \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_tokenizer.h + +# Header files used by the VDBE submodule +# +VDBEHDR = \ + $(HDR) \ + $(TOP)/src/vdbeInt.h + +# This is the default Makefile target. The objects listed here +# are what get build when you type just "make" with no arguments. +# +all: sqlite3.h libsqlite3.la sqlite3$(TEXE) $(HAVE_TCL:1=libtclsqlite3.la) + +Makefile: $(TOP)/Makefile.in + ./config.status + +# Generate the file "last_change" which contains the date of change +# of the most recently modified source code file +# +last_change: $(SRC) + cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ + | $(NAWK) '{print $$5,$$6}' >last_change + +libsqlite3.la: $(LIBOBJ) + $(LTLINK) -o libsqlite3.la $(LIBOBJ) $(LIBPTHREAD) \ + ${ALLOWRELEASE} -rpath $(libdir) -version-info "8:6:8" + +libtclsqlite3.la: tclsqlite.lo libsqlite3.la + $(LTLINK) -o libtclsqlite3.la tclsqlite.lo \ + $(LIBOBJ) $(LIBPTHREAD) \ + -rpath $(libdir)/sqlite \ + -version-info "8:6:8" + +sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h + $(LTLINK) $(READLINE_FLAGS) $(LIBPTHREAD) \ + -o $@ $(TOP)/src/shell.c libsqlite3.la \ + $(LIBREADLINE) $(TLIBS) + +# This target creates a directory named "tsrc" and fills it with +# copies of all of the C source code and header files needed to +# build on the target system. Some of the C source code and header +# files are automatically generated. This target takes care of +# all that automatic generation. +# +target_source: $(SRC) parse.c opcodes.c keywordhash.h $(VDBEHDR) + rm -rf tsrc + mkdir -p tsrc + cp $(SRC) $(VDBEHDR) tsrc + rm tsrc/sqlite.h.in tsrc/parse.y + cp parse.c opcodes.c keywordhash.h tsrc + +sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl + tclsh $(TOP)/tool/mksqlite3c.tcl + +# Rules to build the LEMON compiler generator +# +lemon$(BEXE): $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c + $(BCC) -o lemon$(BEXE) $(TOP)/tool/lemon.c + cp $(TOP)/tool/lempar.c . + + +# Rules to build individual files +# +alter.lo: $(TOP)/src/alter.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/alter.c + +analyze.lo: $(TOP)/src/analyze.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/analyze.c + +attach.lo: $(TOP)/src/attach.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/attach.c + +auth.lo: $(TOP)/src/auth.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/auth.c + +btmutex.lo: $(TOP)/src/btmutex.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/btmutex.c + +btree.lo: $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h + $(LTCOMPILE) -c $(TOP)/src/btree.c + +build.lo: $(TOP)/src/build.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/build.c + +callback.lo: $(TOP)/src/callback.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/callback.c + +complete.lo: $(TOP)/src/complete.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/complete.c + +date.lo: $(TOP)/src/date.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/date.c + +delete.lo: $(TOP)/src/delete.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/delete.c + +expr.lo: $(TOP)/src/expr.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/expr.c + +func.lo: $(TOP)/src/func.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/func.c + +hash.lo: $(TOP)/src/hash.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/hash.c + +insert.lo: $(TOP)/src/insert.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/insert.c + +journal.lo: $(TOP)/src/journal.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/journal.c + +legacy.lo: $(TOP)/src/legacy.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/legacy.c + +loadext.lo: $(TOP)/src/loadext.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/loadext.c + +main.lo: $(TOP)/src/main.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/main.c + +malloc.lo: $(TOP)/src/malloc.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/malloc.c + +mem1.lo: $(TOP)/src/mem1.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem1.c + +mem2.lo: $(TOP)/src/mem2.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem2.c + +mutex.lo: $(TOP)/src/mutex.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex.c + +mutex_os2.lo: $(TOP)/src/mutex_os2.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_os2.c + +mutex_unix.lo: $(TOP)/src/mutex_unix.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_unix.c + +mutex_w32.lo: $(TOP)/src/mutex_w32.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_w32.c + +pager.lo: $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h + $(LTCOMPILE) -c $(TOP)/src/pager.c + +opcodes.lo: opcodes.c + $(LTCOMPILE) -c opcodes.c + +opcodes.c: opcodes.h $(TOP)/mkopcodec.awk + sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c + +opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk + cat parse.h $(TOP)/src/vdbe.c | $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h + +os.lo: $(TOP)/src/os.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os.c + +os_unix.lo: $(TOP)/src/os_unix.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_unix.c + +os_win.lo: $(TOP)/src/os_win.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_win.c + +os_os2.lo: $(TOP)/src/os_os2.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_os2.c + +parse.lo: parse.c $(HDR) + $(LTCOMPILE) -c parse.c + +parse.h: parse.c + +parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/addopcodes.awk + cp $(TOP)/src/parse.y . + ./lemon$(BEXE) $(OPTS) parse.y + mv parse.h parse.h.temp + $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h + +pragma.lo: $(TOP)/src/pragma.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/pragma.c + +prepare.lo: $(TOP)/src/prepare.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/prepare.c + +printf.lo: $(TOP)/src/printf.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/printf.c + +random.lo: $(TOP)/src/random.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/random.c + +select.lo: $(TOP)/src/select.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/select.c + +sqlite3.h: $(TOP)/src/sqlite.h.in + sed -e s/--VERS--/$(RELEASE)/ $(TOP)/src/sqlite.h.in | \ + sed -e s/--VERSION-NUMBER--/$(VERSION_NUMBER)/ >sqlite3.h + +table.lo: $(TOP)/src/table.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/table.c + +tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/tclsqlite.c + +tokenize.lo: $(TOP)/src/tokenize.c keywordhash.h $(HDR) + $(LTCOMPILE) -c $(TOP)/src/tokenize.c + +keywordhash.h: $(TOP)/tool/mkkeywordhash.c + $(BCC) -o mkkeywordhash$(BEXE) $(OPTS) $(TOP)/tool/mkkeywordhash.c + ./mkkeywordhash$(BEXE) >keywordhash.h + +trigger.lo: $(TOP)/src/trigger.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/trigger.c + +update.lo: $(TOP)/src/update.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/update.c + +utf.lo: $(TOP)/src/utf.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/utf.c + +util.lo: $(TOP)/src/util.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/util.c + +vacuum.lo: $(TOP)/src/vacuum.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/vacuum.c + +vdbe.lo: $(TOP)/src/vdbe.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbe.c + +vdbeapi.lo: $(TOP)/src/vdbeapi.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeapi.c + +vdbeaux.lo: $(TOP)/src/vdbeaux.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeaux.c + +vdbeblob.lo: $(TOP)/src/vdbeblob.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeblob.c + +vdbefifo.lo: $(TOP)/src/vdbefifo.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbefifo.c + +vdbemem.lo: $(TOP)/src/vdbemem.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbemem.c + +vtab.lo: $(TOP)/src/vtab.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vtab.c + +where.lo: $(TOP)/src/where.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/where.c + +tclsqlite-shell.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -DTCLSH=1 -o $@ -c $(TOP)/src/tclsqlite.c + +tclsqlite-stubs.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -DTCL_USE_STUBS=1 -o $@ -c $(TOP)/src/tclsqlite.c + +tclsqlite3: tclsqlite-shell.lo libsqlite3.la + $(LTLINK) -o tclsqlite3 tclsqlite-shell.lo \ + libsqlite3.la $(LIBTCL) + +testfixture$(TEXE): $(TOP)/src/tclsqlite.c libsqlite3.la $(TESTSRC) + $(LTLINK) -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 \ + -DSQLITE_NO_SYNC=1 $(TEMP_STORE) \ + -o testfixture $(TESTSRC) $(TOP)/src/tclsqlite.c \ + libsqlite3.la $(LIBTCL) + + +fulltest: testfixture$(TEXE) sqlite3$(TEXE) + ./testfixture $(TOP)/test/all.test + +test: testfixture$(TEXE) sqlite3$(TEXE) + ./testfixture $(TOP)/test/quick.test + +sqlite3_analyzer$(TEXE): $(TOP)/src/tclsqlite.c libtclsqlite3.la \ + $(TESTSRC) $(TOP)/tool/spaceanal.tcl + sed \ + -e '/^#/d' \ + -e 's,\\,\\\\,g' \ + -e 's,",\\",g' \ + -e 's,^,",' \ + -e 's,$$,\\n",' \ + $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h + $(LTLINK) -DTCLSH=2 -DSQLITE_TEST=1 $(TEMP_STORE)\ + -o sqlite3_analyzer$(EXE) $(TESTSRC) $(TOP)/src/tclsqlite.c \ + libtclsqlite3.la $(LIBTCL) + +# Rules used to build documentation +# +arch.html: $(TOP)/www/arch.tcl + tclsh $(TOP)/www/arch.tcl >arch.html + +arch2.gif: $(TOP)/www/arch2.gif + cp $(TOP)/www/arch2.gif . + +autoinc.html: $(TOP)/www/autoinc.tcl + tclsh $(TOP)/www/autoinc.tcl >autoinc.html + +c_interface.html: $(TOP)/www/c_interface.tcl + tclsh $(TOP)/www/c_interface.tcl >c_interface.html + +capi3.html: $(TOP)/www/capi3.tcl + tclsh $(TOP)/www/capi3.tcl >capi3.html + +capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h + tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html + +changes.html: $(TOP)/www/changes.tcl + tclsh $(TOP)/www/changes.tcl >changes.html + +compile.html: $(TOP)/www/compile.tcl + tclsh $(TOP)/www/compile.tcl >compile.html + +copyright.html: $(TOP)/www/copyright.tcl + tclsh $(TOP)/www/copyright.tcl >copyright.html + +copyright-release.html: $(TOP)/www/copyright-release.html + cp $(TOP)/www/copyright-release.html . + +copyright-release.pdf: $(TOP)/www/copyright-release.pdf + cp $(TOP)/www/copyright-release.pdf . + +common.tcl: $(TOP)/www/common.tcl + cp $(TOP)/www/common.tcl . + +conflict.html: $(TOP)/www/conflict.tcl + tclsh $(TOP)/www/conflict.tcl >conflict.html + +datatypes.html: $(TOP)/www/datatypes.tcl + tclsh $(TOP)/www/datatypes.tcl >datatypes.html + +datatype3.html: $(TOP)/www/datatype3.tcl + tclsh $(TOP)/www/datatype3.tcl >datatype3.html + +docs.html: $(TOP)/www/docs.tcl + tclsh $(TOP)/www/docs.tcl >docs.html + +download.html: $(TOP)/www/download.tcl + mkdir -p doc + tclsh $(TOP)/www/download.tcl >download.html + +faq.html: $(TOP)/www/faq.tcl + tclsh $(TOP)/www/faq.tcl >faq.html + +fileformat.html: $(TOP)/www/fileformat.tcl + tclsh $(TOP)/www/fileformat.tcl >fileformat.html + +formatchng.html: $(TOP)/www/formatchng.tcl + tclsh $(TOP)/www/formatchng.tcl >formatchng.html + +index.html: $(TOP)/www/index.tcl last_change + tclsh $(TOP)/www/index.tcl >index.html + +limits.html: $(TOP)/www/limits.tcl last_change + tclsh $(TOP)/www/limits.tcl >limits.html + +lang.html: $(TOP)/www/lang.tcl + tclsh $(TOP)/www/lang.tcl >lang.html + +pragma.html: $(TOP)/www/pragma.tcl + tclsh $(TOP)/www/pragma.tcl >pragma.html + +lockingv3.html: $(TOP)/www/lockingv3.tcl + tclsh $(TOP)/www/lockingv3.tcl >lockingv3.html + +oldnews.html: $(TOP)/www/oldnews.tcl + tclsh $(TOP)/www/oldnews.tcl >oldnews.html + +omitted.html: $(TOP)/www/omitted.tcl + tclsh $(TOP)/www/omitted.tcl >omitted.html + +opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c + tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html + +mingw.html: $(TOP)/www/mingw.tcl + tclsh $(TOP)/www/mingw.tcl >mingw.html + +nulls.html: $(TOP)/www/nulls.tcl + tclsh $(TOP)/www/nulls.tcl >nulls.html + +quickstart.html: $(TOP)/www/quickstart.tcl + tclsh $(TOP)/www/quickstart.tcl >quickstart.html + +speed.html: $(TOP)/www/speed.tcl + tclsh $(TOP)/www/speed.tcl >speed.html + +sqlite.gif: $(TOP)/art/SQLite.gif + cp $(TOP)/art/SQLite.gif sqlite.gif + +sqlite.html: $(TOP)/www/sqlite.tcl + tclsh $(TOP)/www/sqlite.tcl >sqlite.html + +support.html: $(TOP)/www/support.tcl + tclsh $(TOP)/www/support.tcl >support.html + +tclsqlite.html: $(TOP)/www/tclsqlite.tcl + tclsh $(TOP)/www/tclsqlite.tcl >tclsqlite.html + +vdbe.html: $(TOP)/www/vdbe.tcl + tclsh $(TOP)/www/vdbe.tcl >vdbe.html + +version3.html: $(TOP)/www/version3.tcl + tclsh $(TOP)/www/version3.tcl >version3.html + + +# Files to be published on the website. +# +DOC = \ + arch.html \ + arch2.gif \ + autoinc.html \ + c_interface.html \ + capi3.html \ + capi3ref.html \ + changes.html \ + compile.html \ + copyright.html \ + copyright-release.html \ + copyright-release.pdf \ + conflict.html \ + datatypes.html \ + datatype3.html \ + docs.html \ + download.html \ + faq.html \ + fileformat.html \ + formatchng.html \ + index.html \ + lang.html \ + limits.html \ + lockingv3.html \ + mingw.html \ + nulls.html \ + oldnews.html \ + omitted.html \ + opcode.html \ + pragma.html \ + quickstart.html \ + speed.html \ + sqlite.gif \ + sqlite.html \ + support.html \ + tclsqlite.html \ + vdbe.html \ + version3.html + +doc: common.tcl $(DOC) + mkdir -p doc + mv $(DOC) doc + +install: sqlite3 libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} + $(INSTALL) -d $(DESTDIR)$(libdir) + $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) + $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin + $(LTINSTALL) sqlite3 $(DESTDIR)$(exec_prefix)/bin + $(INSTALL) -d $(DESTDIR)$(prefix)/include + $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include + $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include + $(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig; + $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(libdir)/pkgconfig; + +tcl_install: libtclsqlite3.la + tclsh $(TOP)/tclinstaller.tcl $(VERSION) + +clean: + rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la + rm -f sqlite3.h opcodes.* + rm -rf .libs .deps + rm -f lemon$(BEXE) lempar.c parse.* sqlite*.tar.gz + rm -f mkkeywordhash$(BEXE) keywordhash.h + rm -f $(PUBLISH) + rm -f *.da *.bb *.bbg gmon.out + rm -f testfixture$(TEXE) test.db + rm -rf doc + rm -f common.tcl + rm -f sqlite3.dll sqlite3.lib sqlite3.def + +distclean: clean + rm -f config.log config.status libtool Makefile config.h sqlite3.pc + +# +# Windows section +# +dll: sqlite3.dll + +REAL_LIBOBJ = $(LIBOBJ:%.lo=.libs/%.o) + +$(REAL_LIBOBJ): $(LIBOBJ) + +sqlite3.def: $(REAL_LIBOBJ) + echo 'EXPORTS' >sqlite3.def + nm $(REAL_LIBOBJ) | grep ' T ' | grep ' _sqlite3_' \ + | sed 's/^.* _//' >>sqlite3.def + +sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def + $(TCC) -shared -o sqlite3.dll sqlite3.def \ + -Wl,"--strip-all" $(REAL_LIBOBJ) diff --git a/libraries/sqlite/unix/opensim_build_notes.txt b/libraries/sqlite/unix/opensim_build_notes.txt new file mode 100644 index 0000000000..370d2bd916 --- /dev/null +++ b/libraries/sqlite/unix/opensim_build_notes.txt @@ -0,0 +1,6 @@ +downloaded tarball from: +http://www.sqlite.org/sqlite-3.5.1.tar.gz + +build: +see README +instead of install, you can copy build/.libs/libsqlite3.so.0.8.6 to bin/libsqlite3.so.0 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in new file mode 100644 index 0000000000..5f7d040105 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in @@ -0,0 +1,775 @@ +#!/usr/make +# +# Makefile for SQLITE +# +# This makefile is suppose to be configured automatically using the +# autoconf. But if that does not work for you, you can configure +# the makefile manually. Just set the parameters below to values that +# work well for your system. +# +# If the configure script does not work out-of-the-box, you might +# be able to get it to work by giving it some hints. See the comment +# at the beginning of configure.in for additional information. +# + +# The toplevel directory of the source tree. This is the directory +# that contains this "Makefile.in" and the "configure.in" script. +# +TOP = @srcdir@ + +# C Compiler and options for use in building executables that +# will run on the platform that is doing the build. +# +BCC = @BUILD_CC@ @BUILD_CFLAGS@ + +# C Compile and options for use in building executables that +# will run on the target platform. (BCC and TCC are usually the +# same unless your are cross-compiling.) +# +TCC = @CC@ @CFLAGS@ -I. -I${TOP}/src + +# Define -DNDEBUG to compile without debugging (i.e., for production usage) +# Omitting the define will cause extra debugging code to be inserted and +# includes extra comments when "EXPLAIN stmt" is used. +# +TCC += @TARGET_DEBUG@ @XTHREADCONNECT@ + +# Compiler options needed for programs that use the TCL library. +# +TCC += @TCL_INCLUDE_SPEC@ + +# The library that programs using TCL must link against. +# +LIBTCL = @TCL_LIB_SPEC@ @TCL_LIBS@ + +# Compiler options needed for programs that use the readline() library. +# +READLINE_FLAGS = -DHAVE_READLINE=@TARGET_HAVE_READLINE@ @TARGET_READLINE_INC@ + +# The library that programs using readline() must link against. +# +LIBREADLINE = @TARGET_READLINE_LIBS@ + +# Should the database engine be compiled threadsafe +# +TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@ + +# The pthreads library if needed +# +LIBPTHREAD=@TARGET_THREAD_LIB@ + +# Do threads override each others locks by default (1), or do we test (-1) +# +TCC += -DSQLITE_THREAD_OVERRIDE_LOCK=@THREADSOVERRIDELOCKS@ + +# The fdatasync library +TLIBS = @LIBS@ + +# Flags controlling use of the in memory btree implementation +# +# TEMP_STORE is 0 to force temporary tables to be in a file, 1 to +# default to file, 2 to default to memory, and 3 to force temporary +# tables to always be in memory. +# +TEMP_STORE = -DTEMP_STORE=@TEMP_STORE@ + +# Version numbers and release number for the SQLite being compiled. +# +VERSION = @VERSION@ +VERSION_NUMBER = @VERSION_NUMBER@ +RELEASE = @RELEASE@ + +# Filename extensions +# +BEXE = @BUILD_EXEEXT@ +TEXE = @TARGET_EXEEXT@ + +# The following variable is "1" if the configure script was able to locate +# the tclConfig.sh file. It is an empty string otherwise. When this +# variable is "1", the TCL extension library (libtclsqlite3.so) is built +# and installed. +# +HAVE_TCL = @HAVE_TCL@ + +# The suffix used on shared libraries. Ex: ".dll", ".so", ".dylib" +# +SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ + +# The directory into which to store package information for + +# Some standard variables and programs +# +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +INSTALL = @INSTALL@ +LIBTOOL = ./libtool +ALLOWRELEASE = @ALLOWRELEASE@ + +# libtool compile/link/install +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(TCC) +LTLINK = $(LIBTOOL) --mode=link $(TCC) @LDFLAGS@ +LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) + +# nawk compatible awk. +NAWK = @AWK@ + +# You should not have to change anything below this line +############################################################################### +TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1 + +# Object files for the SQLite library. +# +LIBOBJ = alter.lo analyze.lo attach.lo auth.lo btmutex.lo btree.lo build.lo \ + callback.lo complete.lo date.lo \ + delete.lo expr.lo func.lo hash.lo journal.lo insert.lo loadext.lo \ + main.lo malloc.lo mem1.lo mem2.lo mutex.lo \ + mutex_os2.lo mutex_unix.lo mutex_w32.lo \ + opcodes.lo os.lo os_unix.lo os_win.lo os_os2.lo \ + pager.lo parse.lo pragma.lo prepare.lo printf.lo random.lo \ + select.lo table.lo tokenize.lo trigger.lo update.lo \ + util.lo vacuum.lo \ + vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbefifo.lo vdbemem.lo \ + where.lo utf.lo legacy.lo vtab.lo + +# All of the source code files. +# +SRC = \ + $(TOP)/src/alter.c \ + $(TOP)/src/analyze.c \ + $(TOP)/src/attach.c \ + $(TOP)/src/auth.c \ + $(TOP)/src/btmutex.c \ + $(TOP)/src/btree.c \ + $(TOP)/src/btree.h \ + $(TOP)/src/build.c \ + $(TOP)/src/callback.c \ + $(TOP)/src/complete.c \ + $(TOP)/src/date.c \ + $(TOP)/src/delete.c \ + $(TOP)/src/expr.c \ + $(TOP)/src/func.c \ + $(TOP)/src/hash.c \ + $(TOP)/src/hash.h \ + $(TOP)/src/insert.c \ + $(TOP)/src/journal.c \ + $(TOP)/src/legacy.c \ + $(TOP)/src/loadext.c \ + $(TOP)/src/main.c \ + $(TOP)/src/malloc.c \ + $(TOP)/src/mem1.c \ + $(TOP)/src/mem2.c \ + $(TOP)/src/mutex.c \ + $(TOP)/src/mutex_os2.c \ + $(TOP)/src/mutex_unix.c \ + $(TOP)/src/mutex_w32.c \ + $(TOP)/src/os.c \ + $(TOP)/src/os_unix.c \ + $(TOP)/src/os_win.c \ + $(TOP)/src/os_os2.c \ + $(TOP)/src/pager.c \ + $(TOP)/src/pager.h \ + $(TOP)/src/parse.y \ + $(TOP)/src/pragma.c \ + $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c \ + $(TOP)/src/random.c \ + $(TOP)/src/select.c \ + $(TOP)/src/shell.c \ + $(TOP)/src/sqlite.h.in \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/table.c \ + $(TOP)/src/tclsqlite.c \ + $(TOP)/src/tokenize.c \ + $(TOP)/src/trigger.c \ + $(TOP)/src/utf.c \ + $(TOP)/src/update.c \ + $(TOP)/src/util.c \ + $(TOP)/src/vacuum.c \ + $(TOP)/src/vdbe.c \ + $(TOP)/src/vdbe.h \ + $(TOP)/src/vdbeapi.c \ + $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbeblob.c \ + $(TOP)/src/vdbefifo.c \ + $(TOP)/src/vdbemem.c \ + $(TOP)/src/vdbeInt.h \ + $(TOP)/src/vtab.c \ + $(TOP)/src/where.c + +# Source code for extensions +# +SRC += \ + $(TOP)/ext/fts1/fts1.c \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.c \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_porter.c \ + $(TOP)/ext/fts1/fts1_tokenizer.h \ + $(TOP)/ext/fts1/fts1_tokenizer1.c + + +# Source code to the test files. +# +TESTSRC = \ + $(TOP)/src/attach.c \ + $(TOP)/src/btree.c \ + $(TOP)/src/build.c \ + $(TOP)/src/date.c \ + $(TOP)/src/expr.c \ + $(TOP)/src/func.c \ + $(TOP)/src/insert.c \ + $(TOP)/src/malloc.c \ + $(TOP)/src/os.c \ + $(TOP)/src/os_os2.c \ + $(TOP)/src/os_unix.c \ + $(TOP)/src/os_win.c \ + $(TOP)/src/pager.c \ + $(TOP)/src/pragma.c \ + $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c \ + $(TOP)/src/select.c \ + $(TOP)/src/test1.c \ + $(TOP)/src/test2.c \ + $(TOP)/src/test3.c \ + $(TOP)/src/test4.c \ + $(TOP)/src/test5.c \ + $(TOP)/src/test6.c \ + $(TOP)/src/test7.c \ + $(TOP)/src/test8.c \ + $(TOP)/src/test9.c \ + $(TOP)/src/test_autoext.c \ + $(TOP)/src/test_async.c \ + $(TOP)/src/test_btree.c \ + $(TOP)/src/test_config.c \ + $(TOP)/src/test_hexio.c \ + $(TOP)/src/test_malloc.c \ + $(TOP)/src/test_md5.c \ + $(TOP)/src/test_schema.c \ + $(TOP)/src/test_server.c \ + $(TOP)/src/test_tclvar.c \ + $(TOP)/src/tokenize.c \ + $(TOP)/src/utf.c \ + $(TOP)/src/util.c \ + $(TOP)/src/vdbe.c \ + $(TOP)/src/vdbeapi.c \ + $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbemem.c \ + $(TOP)/src/where.c \ + parse.c + +# Header files used by all library source files. +# +HDR = \ + sqlite3.h \ + $(TOP)/src/btree.h \ + $(TOP)/src/btreeInt.h \ + $(TOP)/src/hash.h \ + $(TOP)/src/sqliteLimit.h \ + $(TOP)/src/mutex.h \ + opcodes.h \ + $(TOP)/src/os.h \ + $(TOP)/src/os_common.h \ + $(TOP)/src/sqlite3ext.h \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/vdbe.h \ + parse.h + +# Header files used by extensions +# +HDR += \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_tokenizer.h + +# Header files used by the VDBE submodule +# +VDBEHDR = \ + $(HDR) \ + $(TOP)/src/vdbeInt.h + +# This is the default Makefile target. The objects listed here +# are what get build when you type just "make" with no arguments. +# +all: sqlite3.h libsqlite3.la sqlite3$(TEXE) $(HAVE_TCL:1=libtclsqlite3.la) + +Makefile: $(TOP)/Makefile.in + ./config.status + +# Generate the file "last_change" which contains the date of change +# of the most recently modified source code file +# +last_change: $(SRC) + cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ + | $(NAWK) '{print $$5,$$6}' >last_change + +libsqlite3.la: $(LIBOBJ) + $(LTLINK) -o libsqlite3.la $(LIBOBJ) $(LIBPTHREAD) \ + ${ALLOWRELEASE} -rpath $(libdir) -version-info "8:6:8" + +libtclsqlite3.la: tclsqlite.lo libsqlite3.la + $(LTLINK) -o libtclsqlite3.la tclsqlite.lo \ + $(LIBOBJ) @TCL_STUB_LIB_SPEC@ $(LIBPTHREAD) \ + -rpath $(libdir)/sqlite \ + -version-info "8:6:8" + +sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h + $(LTLINK) $(READLINE_FLAGS) $(LIBPTHREAD) \ + -o $@ $(TOP)/src/shell.c libsqlite3.la \ + $(LIBREADLINE) $(TLIBS) + +# This target creates a directory named "tsrc" and fills it with +# copies of all of the C source code and header files needed to +# build on the target system. Some of the C source code and header +# files are automatically generated. This target takes care of +# all that automatic generation. +# +target_source: $(SRC) parse.c opcodes.c keywordhash.h $(VDBEHDR) + rm -rf tsrc + mkdir -p tsrc + cp $(SRC) $(VDBEHDR) tsrc + rm tsrc/sqlite.h.in tsrc/parse.y + cp parse.c opcodes.c keywordhash.h tsrc + +sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl + tclsh $(TOP)/tool/mksqlite3c.tcl + +# Rules to build the LEMON compiler generator +# +lemon$(BEXE): $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c + $(BCC) -o lemon$(BEXE) $(TOP)/tool/lemon.c + cp $(TOP)/tool/lempar.c . + + +# Rules to build individual files +# +alter.lo: $(TOP)/src/alter.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/alter.c + +analyze.lo: $(TOP)/src/analyze.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/analyze.c + +attach.lo: $(TOP)/src/attach.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/attach.c + +auth.lo: $(TOP)/src/auth.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/auth.c + +btmutex.lo: $(TOP)/src/btmutex.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/btmutex.c + +btree.lo: $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h + $(LTCOMPILE) -c $(TOP)/src/btree.c + +build.lo: $(TOP)/src/build.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/build.c + +callback.lo: $(TOP)/src/callback.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/callback.c + +complete.lo: $(TOP)/src/complete.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/complete.c + +date.lo: $(TOP)/src/date.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/date.c + +delete.lo: $(TOP)/src/delete.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/delete.c + +expr.lo: $(TOP)/src/expr.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/expr.c + +func.lo: $(TOP)/src/func.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/func.c + +hash.lo: $(TOP)/src/hash.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/hash.c + +insert.lo: $(TOP)/src/insert.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/insert.c + +journal.lo: $(TOP)/src/journal.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/journal.c + +legacy.lo: $(TOP)/src/legacy.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/legacy.c + +loadext.lo: $(TOP)/src/loadext.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/loadext.c + +main.lo: $(TOP)/src/main.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/main.c + +malloc.lo: $(TOP)/src/malloc.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/malloc.c + +mem1.lo: $(TOP)/src/mem1.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem1.c + +mem2.lo: $(TOP)/src/mem2.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem2.c + +mutex.lo: $(TOP)/src/mutex.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex.c + +mutex_os2.lo: $(TOP)/src/mutex_os2.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_os2.c + +mutex_unix.lo: $(TOP)/src/mutex_unix.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_unix.c + +mutex_w32.lo: $(TOP)/src/mutex_w32.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_w32.c + +pager.lo: $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h + $(LTCOMPILE) -c $(TOP)/src/pager.c + +opcodes.lo: opcodes.c + $(LTCOMPILE) -c opcodes.c + +opcodes.c: opcodes.h $(TOP)/mkopcodec.awk + sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c + +opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk + cat parse.h $(TOP)/src/vdbe.c | $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h + +os.lo: $(TOP)/src/os.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os.c + +os_unix.lo: $(TOP)/src/os_unix.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_unix.c + +os_win.lo: $(TOP)/src/os_win.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_win.c + +os_os2.lo: $(TOP)/src/os_os2.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/os_os2.c + +parse.lo: parse.c $(HDR) + $(LTCOMPILE) -c parse.c + +parse.h: parse.c + +parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/addopcodes.awk + cp $(TOP)/src/parse.y . + ./lemon$(BEXE) $(OPTS) parse.y + mv parse.h parse.h.temp + $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h + +pragma.lo: $(TOP)/src/pragma.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/pragma.c + +prepare.lo: $(TOP)/src/prepare.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/prepare.c + +printf.lo: $(TOP)/src/printf.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/printf.c + +random.lo: $(TOP)/src/random.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/random.c + +select.lo: $(TOP)/src/select.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/select.c + +sqlite3.h: $(TOP)/src/sqlite.h.in + sed -e s/--VERS--/$(RELEASE)/ $(TOP)/src/sqlite.h.in | \ + sed -e s/--VERSION-NUMBER--/$(VERSION_NUMBER)/ >sqlite3.h + +table.lo: $(TOP)/src/table.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/table.c + +tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/tclsqlite.c + +tokenize.lo: $(TOP)/src/tokenize.c keywordhash.h $(HDR) + $(LTCOMPILE) -c $(TOP)/src/tokenize.c + +keywordhash.h: $(TOP)/tool/mkkeywordhash.c + $(BCC) -o mkkeywordhash$(BEXE) $(OPTS) $(TOP)/tool/mkkeywordhash.c + ./mkkeywordhash$(BEXE) >keywordhash.h + +trigger.lo: $(TOP)/src/trigger.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/trigger.c + +update.lo: $(TOP)/src/update.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/update.c + +utf.lo: $(TOP)/src/utf.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/utf.c + +util.lo: $(TOP)/src/util.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/util.c + +vacuum.lo: $(TOP)/src/vacuum.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/vacuum.c + +vdbe.lo: $(TOP)/src/vdbe.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbe.c + +vdbeapi.lo: $(TOP)/src/vdbeapi.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeapi.c + +vdbeaux.lo: $(TOP)/src/vdbeaux.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeaux.c + +vdbeblob.lo: $(TOP)/src/vdbeblob.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbeblob.c + +vdbefifo.lo: $(TOP)/src/vdbefifo.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbefifo.c + +vdbemem.lo: $(TOP)/src/vdbemem.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vdbemem.c + +vtab.lo: $(TOP)/src/vtab.c $(VDBEHDR) + $(LTCOMPILE) -c $(TOP)/src/vtab.c + +where.lo: $(TOP)/src/where.c $(HDR) + $(LTCOMPILE) -c $(TOP)/src/where.c + +tclsqlite-shell.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -DTCLSH=1 -o $@ -c $(TOP)/src/tclsqlite.c + +tclsqlite-stubs.lo: $(TOP)/src/tclsqlite.c $(HDR) + $(LTCOMPILE) -DTCL_USE_STUBS=1 -o $@ -c $(TOP)/src/tclsqlite.c + +tclsqlite3: tclsqlite-shell.lo libsqlite3.la + $(LTLINK) -o tclsqlite3 tclsqlite-shell.lo \ + libsqlite3.la $(LIBTCL) + +testfixture$(TEXE): $(TOP)/src/tclsqlite.c libsqlite3.la $(TESTSRC) + $(LTLINK) -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 \ + -DSQLITE_NO_SYNC=1 $(TEMP_STORE) \ + -o testfixture $(TESTSRC) $(TOP)/src/tclsqlite.c \ + libsqlite3.la $(LIBTCL) + + +fulltest: testfixture$(TEXE) sqlite3$(TEXE) + ./testfixture $(TOP)/test/all.test + +test: testfixture$(TEXE) sqlite3$(TEXE) + ./testfixture $(TOP)/test/quick.test + +sqlite3_analyzer$(TEXE): $(TOP)/src/tclsqlite.c libtclsqlite3.la \ + $(TESTSRC) $(TOP)/tool/spaceanal.tcl + sed \ + -e '/^#/d' \ + -e 's,\\,\\\\,g' \ + -e 's,",\\",g' \ + -e 's,^,",' \ + -e 's,$$,\\n",' \ + $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h + $(LTLINK) -DTCLSH=2 -DSQLITE_TEST=1 $(TEMP_STORE)\ + -o sqlite3_analyzer$(EXE) $(TESTSRC) $(TOP)/src/tclsqlite.c \ + libtclsqlite3.la $(LIBTCL) + +# Rules used to build documentation +# +arch.html: $(TOP)/www/arch.tcl + tclsh $(TOP)/www/arch.tcl >arch.html + +arch2.gif: $(TOP)/www/arch2.gif + cp $(TOP)/www/arch2.gif . + +autoinc.html: $(TOP)/www/autoinc.tcl + tclsh $(TOP)/www/autoinc.tcl >autoinc.html + +c_interface.html: $(TOP)/www/c_interface.tcl + tclsh $(TOP)/www/c_interface.tcl >c_interface.html + +capi3.html: $(TOP)/www/capi3.tcl + tclsh $(TOP)/www/capi3.tcl >capi3.html + +capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h + tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html + +changes.html: $(TOP)/www/changes.tcl + tclsh $(TOP)/www/changes.tcl >changes.html + +compile.html: $(TOP)/www/compile.tcl + tclsh $(TOP)/www/compile.tcl >compile.html + +copyright.html: $(TOP)/www/copyright.tcl + tclsh $(TOP)/www/copyright.tcl >copyright.html + +copyright-release.html: $(TOP)/www/copyright-release.html + cp $(TOP)/www/copyright-release.html . + +copyright-release.pdf: $(TOP)/www/copyright-release.pdf + cp $(TOP)/www/copyright-release.pdf . + +common.tcl: $(TOP)/www/common.tcl + cp $(TOP)/www/common.tcl . + +conflict.html: $(TOP)/www/conflict.tcl + tclsh $(TOP)/www/conflict.tcl >conflict.html + +datatypes.html: $(TOP)/www/datatypes.tcl + tclsh $(TOP)/www/datatypes.tcl >datatypes.html + +datatype3.html: $(TOP)/www/datatype3.tcl + tclsh $(TOP)/www/datatype3.tcl >datatype3.html + +docs.html: $(TOP)/www/docs.tcl + tclsh $(TOP)/www/docs.tcl >docs.html + +download.html: $(TOP)/www/download.tcl + mkdir -p doc + tclsh $(TOP)/www/download.tcl >download.html + +faq.html: $(TOP)/www/faq.tcl + tclsh $(TOP)/www/faq.tcl >faq.html + +fileformat.html: $(TOP)/www/fileformat.tcl + tclsh $(TOP)/www/fileformat.tcl >fileformat.html + +formatchng.html: $(TOP)/www/formatchng.tcl + tclsh $(TOP)/www/formatchng.tcl >formatchng.html + +index.html: $(TOP)/www/index.tcl last_change + tclsh $(TOP)/www/index.tcl >index.html + +limits.html: $(TOP)/www/limits.tcl last_change + tclsh $(TOP)/www/limits.tcl >limits.html + +lang.html: $(TOP)/www/lang.tcl + tclsh $(TOP)/www/lang.tcl >lang.html + +pragma.html: $(TOP)/www/pragma.tcl + tclsh $(TOP)/www/pragma.tcl >pragma.html + +lockingv3.html: $(TOP)/www/lockingv3.tcl + tclsh $(TOP)/www/lockingv3.tcl >lockingv3.html + +oldnews.html: $(TOP)/www/oldnews.tcl + tclsh $(TOP)/www/oldnews.tcl >oldnews.html + +omitted.html: $(TOP)/www/omitted.tcl + tclsh $(TOP)/www/omitted.tcl >omitted.html + +opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c + tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html + +mingw.html: $(TOP)/www/mingw.tcl + tclsh $(TOP)/www/mingw.tcl >mingw.html + +nulls.html: $(TOP)/www/nulls.tcl + tclsh $(TOP)/www/nulls.tcl >nulls.html + +quickstart.html: $(TOP)/www/quickstart.tcl + tclsh $(TOP)/www/quickstart.tcl >quickstart.html + +speed.html: $(TOP)/www/speed.tcl + tclsh $(TOP)/www/speed.tcl >speed.html + +sqlite.gif: $(TOP)/art/SQLite.gif + cp $(TOP)/art/SQLite.gif sqlite.gif + +sqlite.html: $(TOP)/www/sqlite.tcl + tclsh $(TOP)/www/sqlite.tcl >sqlite.html + +support.html: $(TOP)/www/support.tcl + tclsh $(TOP)/www/support.tcl >support.html + +tclsqlite.html: $(TOP)/www/tclsqlite.tcl + tclsh $(TOP)/www/tclsqlite.tcl >tclsqlite.html + +vdbe.html: $(TOP)/www/vdbe.tcl + tclsh $(TOP)/www/vdbe.tcl >vdbe.html + +version3.html: $(TOP)/www/version3.tcl + tclsh $(TOP)/www/version3.tcl >version3.html + + +# Files to be published on the website. +# +DOC = \ + arch.html \ + arch2.gif \ + autoinc.html \ + c_interface.html \ + capi3.html \ + capi3ref.html \ + changes.html \ + compile.html \ + copyright.html \ + copyright-release.html \ + copyright-release.pdf \ + conflict.html \ + datatypes.html \ + datatype3.html \ + docs.html \ + download.html \ + faq.html \ + fileformat.html \ + formatchng.html \ + index.html \ + lang.html \ + limits.html \ + lockingv3.html \ + mingw.html \ + nulls.html \ + oldnews.html \ + omitted.html \ + opcode.html \ + pragma.html \ + quickstart.html \ + speed.html \ + sqlite.gif \ + sqlite.html \ + support.html \ + tclsqlite.html \ + vdbe.html \ + version3.html + +doc: common.tcl $(DOC) + mkdir -p doc + mv $(DOC) doc + +install: sqlite3 libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} + $(INSTALL) -d $(DESTDIR)$(libdir) + $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) + $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin + $(LTINSTALL) sqlite3 $(DESTDIR)$(exec_prefix)/bin + $(INSTALL) -d $(DESTDIR)$(prefix)/include + $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include + $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include + $(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig; + $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(libdir)/pkgconfig; + +tcl_install: libtclsqlite3.la + tclsh $(TOP)/tclinstaller.tcl $(VERSION) + +clean: + rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la + rm -f sqlite3.h opcodes.* + rm -rf .libs .deps + rm -f lemon$(BEXE) lempar.c parse.* sqlite*.tar.gz + rm -f mkkeywordhash$(BEXE) keywordhash.h + rm -f $(PUBLISH) + rm -f *.da *.bb *.bbg gmon.out + rm -f testfixture$(TEXE) test.db + rm -rf doc + rm -f common.tcl + rm -f sqlite3.dll sqlite3.lib sqlite3.def + +distclean: clean + rm -f config.log config.status libtool Makefile config.h sqlite3.pc + +# +# Windows section +# +dll: sqlite3.dll + +REAL_LIBOBJ = $(LIBOBJ:%.lo=.libs/%.o) + +$(REAL_LIBOBJ): $(LIBOBJ) + +sqlite3.def: $(REAL_LIBOBJ) + echo 'EXPORTS' >sqlite3.def + nm $(REAL_LIBOBJ) | grep ' T ' | grep ' _sqlite3_' \ + | sed 's/^.* _//' >>sqlite3.def + +sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def + $(TCC) -shared -o sqlite3.dll sqlite3.def \ + -Wl,"--strip-all" $(REAL_LIBOBJ) diff --git a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc new file mode 100644 index 0000000000..b4d769914e --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc @@ -0,0 +1,124 @@ +#!/usr/make +# +# Makefile for SQLITE +# +# This is a template makefile for SQLite. Most people prefer to +# use the autoconf generated "configure" script to generate the +# makefile automatically. But that does not work for everybody +# and in every situation. If you are having problems with the +# "configure" script, you might want to try this makefile as an +# alternative. Create a copy of this file, edit the parameters +# below and type "make". +# + +#### The toplevel directory of the source tree. This is the directory +# that contains this "Makefile.in" and the "configure.in" script. +# +TOP = ../sqlite + +#### C Compiler and options for use in building executables that +# will run on the platform that is doing the build. +# +BCC = gcc -g -O2 +#BCC = /opt/ancic/bin/c89 -0 + +#### If the target operating system supports the "usleep()" system +# call, then define the HAVE_USLEEP macro for all C modules. +# +#USLEEP = +USLEEP = -DHAVE_USLEEP=1 + +#### If you want the SQLite library to be safe for use within a +# multi-threaded program, then define the following macro +# appropriately: +# +#THREADSAFE = -DTHREADSAFE=1 +THREADSAFE = -DTHREADSAFE=0 + +#### Specify any extra linker options needed to make the library +# thread safe +# +#THREADLIB = -lpthread +THREADLIB = + +#### Specify any extra libraries needed to access required functions. +# +#TLIBS = -lrt # fdatasync on Solaris 8 +TLIBS = + +#### Leave SQLITE_DEBUG undefined for maximum speed. Use SQLITE_DEBUG=1 +# to check for memory leaks. Use SQLITE_DEBUG=2 to print a log of all +# malloc()s and free()s in order to track down memory leaks. +# +# SQLite uses some expensive assert() statements in the inner loop. +# You can make the library go almost twice as fast if you compile +# with -DNDEBUG=1 +# +#OPTS = -DSQLITE_DEBUG=2 +#OPTS = -DSQLITE_DEBUG=1 +#OPTS = +OPTS = -DNDEBUG=1 +OPTS += -DHAVE_FDATASYNC=1 + +#### The suffix to add to executable files. ".exe" for windows. +# Nothing for unix. +# +#EXE = .exe +EXE = + +#### C Compile and options for use in building executables that +# will run on the target platform. This is usually the same +# as BCC, unless you are cross-compiling. +# +TCC = gcc -O6 +#TCC = gcc -g -O0 -Wall +#TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage +#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 +#TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive + +#### Tools used to build a static library. +# +AR = ar cr +#AR = /opt/mingw/bin/i386-mingw32-ar cr +RANLIB = ranlib +#RANLIB = /opt/mingw/bin/i386-mingw32-ranlib + +MKSHLIB = gcc -shared +SO = so +SHPREFIX = lib +# SO = dll +# SHPREFIX = + +#### Extra compiler options needed for programs that use the TCL library. +# +#TCL_FLAGS = +#TCL_FLAGS = -DSTATIC_BUILD=1 +TCL_FLAGS = -I/home/drh/tcltk/8.4linux +#TCL_FLAGS = -I/home/drh/tcltk/8.4win -DSTATIC_BUILD=1 +#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux + +#### Linker options needed to link against the TCL library. +# +#LIBTCL = -ltcl -lm -ldl +LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl +#LIBTCL = /home/drh/tcltk/8.4win/libtcl84s.a -lmsvcrt +#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc + +#### Compiler options needed for programs that use the readline() library. +# +READLINE_FLAGS = +#READLINE_FLAGS = -DHAVE_READLINE=1 -I/usr/include/readline + +#### Linker options needed by programs using readline() must link against. +# +LIBREADLINE = +#LIBREADLINE = -static -lreadline -ltermcap + +#### Which "awk" program provides nawk compatibilty +# +# NAWK = nawk +NAWK = awk + +# You should not have to change anything below this line +############################################################################### +include $(TOP)/main.mk diff --git a/libraries/sqlite/unix/sqlite-3.5.1/README b/libraries/sqlite/unix/sqlite-3.5.1/README new file mode 100644 index 0000000000..6e4f392054 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/README @@ -0,0 +1,35 @@ +This directory contains source code to + + SQLite: An Embeddable SQL Database Engine + +To compile the project, first create a directory in which to place +the build products. It is recommended, but not required, that the +build directory be separate from the source directory. Cd into the +build directory and then from the build directory run the configure +script found at the root of the source tree. Then run "make". + +For example: + + tar xzf sqlite.tar.gz ;# Unpack the source tree into "sqlite" + mkdir bld ;# Build will occur in a sibling directory + cd bld ;# Change to the build directory + ../sqlite/configure ;# Run the configure script + make ;# Run the makefile. + make install ;# (Optional) Install the build products + +The configure script uses autoconf 2.50 and libtool. If the configure +script does not work out for you, there is a generic makefile named +"Makefile.linux-gcc" in the top directory of the source tree that you +can copy and edit to suite your needs. Comments on the generic makefile +show what changes are needed. + +The linux binaries on the website are created using the generic makefile, +not the configure script. The configure script is unmaintained. (You +can volunteer to take over maintenance of the configure script, if you want!) +The windows binaries on the website are created using MinGW32 configured +as a cross-compiler running under Linux. For details, see the ./publish.sh +script at the top-level of the source tree. + +Contacts: + + http://www.sqlite.org/ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/VERSION b/libraries/sqlite/unix/sqlite-3.5.1/VERSION new file mode 100644 index 0000000000..d5c0c99142 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/VERSION @@ -0,0 +1 @@ +3.5.1 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 b/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 new file mode 100644 index 0000000000..27b6c66b39 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 @@ -0,0 +1,6470 @@ +# generated automatically by aclocal 1.10 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 48 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Check if we have a version mismatch between libtool.m4 and ltmain.sh. +# +# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. +# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually +# calls AC_LIBTOOL_CONFIG and creates libtool. +# +_LT_VERSION_CHECK + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_VERSION_CHECK +# ----------------- +AC_DEFUN([_LT_VERSION_CHECK], +[AC_MSG_CHECKING([for correct ltmain.sh version]) +if test "x$ltmain" = "x" ; then + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + +*** @<:@Gentoo@:>@ sanity check failed! *** +*** \$ltmain is not defined, please check the patch for consistency! *** +]) +fi +gentoo_lt_version="1.5.22" +gentoo_ltmain_version=`sed -n '/^[[ ]]*VERSION=/{s/^[[ ]]*VERSION=//;p;q;}' "$ltmain"` +if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + +*** @<:@Gentoo@:>@ sanity check failed! *** +*** libtool.m4 and ltmain.sh have a version mismatch! *** +*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** + +Please run: + + libtoolize --copy --force + +if appropriate, please contact the maintainer of this +package (or your distribution) for help. +]) +else + AC_MSG_RESULT(yes) +fi +])# _LT_VERSION_CHECK + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_LINKER_BOILERPLATE + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + linux*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + $archive_expsym_cmds="$archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk b/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk new file mode 100644 index 0000000000..b806b1d96c --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk @@ -0,0 +1,32 @@ +#!/usr/bin/awk +# +# This script appends additional token codes to the end of the +# parse.h file that lemon generates. These extra token codes are +# not used by the parser. But they are used by the tokenizer and/or +# the code generator. +# +# +BEGIN { + max = 0 +} +/^#define TK_/ { + print $0 + if( max<$3 ) max = $3 +} +END { + printf "#define TK_%-29s %4d\n", "TO_TEXT", max+1 + printf "#define TK_%-29s %4d\n", "TO_BLOB", max+2 + printf "#define TK_%-29s %4d\n", "TO_NUMERIC", max+3 + printf "#define TK_%-29s %4d\n", "TO_INT", max+4 + printf "#define TK_%-29s %4d\n", "TO_REAL", max+5 + printf "#define TK_%-29s %4d\n", "END_OF_FILE", max+6 + printf "#define TK_%-29s %4d\n", "ILLEGAL", max+7 + printf "#define TK_%-29s %4d\n", "SPACE", max+8 + printf "#define TK_%-29s %4d\n", "UNCLOSED_STRING", max+9 + printf "#define TK_%-29s %4d\n", "COMMENT", max+10 + printf "#define TK_%-29s %4d\n", "FUNCTION", max+11 + printf "#define TK_%-29s %4d\n", "COLUMN", max+12 + printf "#define TK_%-29s %4d\n", "AGG_FUNCTION", max+13 + printf "#define TK_%-29s %4d\n", "AGG_COLUMN", max+14 + printf "#define TK_%-29s %4d\n", "CONST_FUNC", max+15 +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa6d7d7c2761f603db7d88b16eb606cc7a29ff89 GIT binary patch literal 3750 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 QI-@jNqc$1?34s6rJAm}olmGw# literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps new file mode 100644 index 0000000000000000000000000000000000000000..1f334ecf7b49ee6e596802d5cf8e208caebb034f GIT binary patch literal 24155 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 DOHLiR literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ec05b0be2aded7c2f7aafd23ff53107d39e4362 GIT binary patch literal 3062 zcmVgd_z;l$O@&)wPR@9lo1n3A%nwadh%z_;`E z_3rcW`1<+w`1k++|NZ^_EC2ui07n5~000F4(8)=wy*TU5yZ>M)j$~<`XsWJk>%MR- zn@>R?Nv}Ja7Zi~k4Q%VaWFWa(C7gnSR}95tajUa5E9X__<2YW7~Hga%}y4Y z zd6}rGswfK!rz#Aj6a)qZtGBqhTmVhBy1&4D4+;SU12|KaM1Zxy&d*skOk)VjLVyQB z(A(TF4-3L(2YVB%5aB>)W`U<2#<`Wy_Bay&i)IYCE4lo@Ln9w2a{ zZJ)!3{+{q4P(ay&cM=hD64H>1?|Cr$+`6A}a%TXLSvUp(a0!Tz4VQAd8ifk^ zUd1d*^K=BdKS7ZEJQ)ES1dvky2z&hpTMHc(a)S;%sP=+1vrRD{2j3Jhp%LbU0U$S9 zjiFu#$JK^Hfde@>g8-h5alnQvpa{kU66aPRD-sb=cxCiJfFZ3| zXabpY+U2MPMTPNW2suLW;RfBE3QT7uN)T$D8|4S4q8xxlotP>F5FP?QxZ(nPj8C^7*6zGVh*DT98TL5JWLyu!OG3Se>v7RxcfX1XqguLR3-#e#eu9BTlfshAZh zjy6}EVss-!o97Hss)$#v;@s8lyFVkPU${kZ3a-4kb;%368a&XW6VHb56d9^wk<_=S z4QIk81Gg&y$_A8u0o+f>T?DZP@GFefY*s+#$5us1uWoKrFkMKWUeQ{$;SDge1zU>| z*9HnjVYlI9=q<$mm1WelfWmy(8V1i2M80!E{!-_g4JKl69MQr=f{Yjm)C28n- z>Bzb@hR8B7pq~_#_Ar3$`NmfW5Ho-`M#KW!HDBuO<<;6TFH;Uw)RzqNHF7M|8Ce)L z>TFlUCjgN65{w7yQnt9G^a22rmI?L+^_A^)gpP+c>E#q)z&qT73ekxnY!?uo7^v2- z#2iL)@gjjFk^wo~xi2IVP{8mqvVy>Y2`?v^kV(Qsfv-(LDrb`j0q~{4a~usY)N7KL z7DxiT*)4u6(*T)B=Ku>f4Ir07gfh?uro?$5DY(fVMi@vlv>0$d+R##a(5EaEaqkx~ zlt`BpXrB`QaM4ttq8$rnQzxszBLP&DK+Bjj58i+&dk!eo0gU)IywS@|r~%&YE|tSe zjE#0Hv0A!JBL+p?iH9cWjxSo+sVfS~eQCr%1FqwerIjua0L+#k$w9x9^bZ3C5Ktis zfCxnt<^g@Q#P?3Ou?R)71Kg2=Mh>}xFYX6gow`=7F33a*Owt{K`;i=V$C3yEsFO&# zk@?_K2Oj7#6^DyLQ*;#t&CR6(xZ~NKdKm(H$pI8*l)^J55KcB`Kug_ON&wu35zR$2 zJq~z4M0B}-~@0q zZ+Zv+1I{x_CHw`a-_YcEu4!L2w{azHcxIdw_)?t+IsyHlbeA-=Wpi*tM+vZPq;Zto zIrmjlmW;!7v*A`8Pg2mBh-OWad*v!{x1rg*)B(I}3f)-g0R23!15;(?x@r+iGCYo& zMVtWMB8p49Jk>FC^Gu|oM8H2ZW_XpN2sg}!kFGwUs1%6aKpGkbY3YZdAIK`9Zu2wG z;4`Nls<-0^0I=iX)LH|PfCyq>IdVu1cHQup7TD6co*}CSW+SbHo|d&M&<`TjCc zQyF$8!>7Kuls;}XcK`?#Z!6G`?!3kiv5d+JNG2?wf@!?2;uAT;a4G}0;7;mgYB-UY;%g2G|GJ z)VND>2h!_L7rjBrjTZooadZZa@yQG(IiA~suoAW;S6%3A4m_BNs*zD?b0U{H>jd$f zykf^sD5C*c49|7#oX!KW*nt;lwG@JzT}Tb3M_7txmNh`0rMQh_93kZbQY)zoTH6T` z^Pyd+FdqiU*wqo11F8cZEQ<9IwHh#AmW8cF6WrJUjk|377n;*R>gg2 zxyz}F6O#waZfjh+6I4Yk+x|MK`P$%JG}VG*iDXaa1_5J=zHPMuA^y|1i;!m4iFmH68IyfY6sHe>A>Dl&CKKi%#}P(fRbdO0@B9>ccrZ?X)4zn5l>E- z30%F)Sk<~>a-GY-3IqXY_%Fx($KEr1r+ybaR47KHa?F>a?MO(@2Xuxg$I0v8uIHf1eH*A4~-c-nyl zUH}Jr)Cl*d4qHVr|Ahd=fHiI00}YHw>^@b~Y2chKGcR35e2IZ?k)axQNf7aoHDw z4aSI)mim2EJqo^2UB4w%gifu58 z{c$kX2aC3t2BQcXS@=}9*o!WZi@G5YLg$Ob$O6DvFTz-i%2)(9^%9Grh|3s_0Rsol z=u6Njjo64F)Cd#bhKbqujo#N!|K)q&SdPrbFcr`v!)T7|2sG&ecI()V^7v{5;f8i0 zh4aXc=twd@myiCq5lt`!0?~c{SdhLW2k~f-?btFWrjQPq0sbN$4>^&_LP}Mbi4gz* EI|CU?v;Y7A literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff new file mode 100644 index 0000000000000000000000000000000000000000..70b88e78057d7aa046d489e025273ba38d774c1b GIT binary patch literal 85156 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%0A2vxehzOjQ>q9f8Q0p_RnbfbgOQW+j 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 literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc9e6a0e6cf97d4a4e601dac533c8166b72c4165 GIT binary patch literal 7428 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 CE;7mzbECnVFfInwp!No1LAV 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 bmSkC$W_gxqnU-p~mTcLUZuyqv5C{M}^9D)q literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfed023ee754825e304cbccadaae6c0f874e555 GIT binary patch literal 3391 zcmbV}`#;kQ1IIV}ZoanRJBCd-TbAg$+?s1+6AH~O7BZLIdm2SII=h?uT&gM6TvACH zr3mND2uZA{bURJzR3~|GJRMH*dS2)G6Q0ix@890Pyg$DFJ83R)L$CnYH`qTzdtmhG z28Ldc5!2Yrmte8m(khTd-b1zyrr3nq+J$e}6uD)~KB_~Eqg#U8j%2!L3WJ&EUsQ7J*FObGSE9dI`V8}baJ%+ zsb+9;eCYZ3@QaDj*OO0Pk3atH<%IUlt9P$nyr25*(}$^#Q`4V6y!+$Rr`egA`LACW z<`xzgzAb%QSy>qw8Tntx{|Dq{01ks?z&8CO|MLkpQE^FWnXJ5` zvg-7iv-0Y5=W8xpyrihDt8cj6c;)J~rt8i1@D^oj+pXK}ckXs{-s|e_X}?kQi@LA> z{=i_Xs&HuJ(dby$aDisxDcoc|(2CxQeb(_r`gVFKFdftSQ@YLjU#BEr=X-SEVINzq z(>E=&{d;bDs~=4n{9bqm2GFo}@!oLnH75IGR8xVl0vsIh>j-{-Ul?JY!6Aht^ztwk z>|+=fj9I?MXr@+(j4#0$Fu5#H%kdLL0H<yGEvN*&cbqiOyoJIxH zeDo}1D#<54w8>^%)bM{Yfz)=St3>J+m=r};$c zZ?+AOzc(eBh`*~~99lN0)XfJaroZ7rhe-}{VXe5=fH7@!l z8zP?J^{752q6qvmxy#t1oRHcLq7IMhOZk`yq>N`i zNrXv^0$IH(qBE~`e{xJ1oiA+-bgBZ<0)qKcBMUCydJFF@R&H#M~U9?;}Eh0%j0Xy;P{fDJGjCnDV*s zXn3^j`L2~8Hs{TmiHYLa1dFPgtZ7h*3XhQ0?%C-y(JnUMOT)toQ*+;26HvS(5+c7b zQ+}FJfaEBW6ORkblOi9B6@>$O1172RZDD~z)HQ8zqOD4;Z${frM>@Tp^J-|pa)UEb zN*HC6K@AsyG1P?e^-iGXRLw)P*?j#CF|tR_TWQqIn5>?7o_U&PsaU35NGQn($gT7v z21%zxI9~$%zS;h;V97>ieDbUV;Rt;8wWtVa~&T;-G@pc?aP=FK|uje`iwnwzb-yBs+nP6K}@SX#TR_MxY0W&PY;ffY8Y7iC9cRoH!2S_ zKX43=G!rSxMFt+Xutm?0?H2eLx@%y4#s~c1z|(bR6-?7ZXUPLkGu-Dz20J;e*|6gg zqkaSySc^cu6wL#JuI}VcQZyHS$S7*E+1}K1h;G0BLFAS$QY5XW9~VdCBR8Q&dIW~C zU_}?6v>twxoOG<5X-Fr$^`E)rwjjm_`IYb75SxMPH`v$@yH8qep(%t|d(}gUSuijq zGz_^K1eyg?dgn}w_mmD3<9Ilfowr3d<4GfH{})$hhq=up)V4V|ev|~-eWHUQbOw2t z<7y3%!FUL{Xo{0;$ne61PzBIMmiR|Z5GEKB;5K~%{=(^C{I6Of?BY zRjcr`O3w)R3A>jg`f<89snCH*Xyb^iMn**D-LKXvA*AgRDbBK}cI^lcNl|Q$^CVc3 zyCHzsOb1;<`_0a15EQ~%Ohk9B-9;|&yf#pGFtixSQNr^r$z`IsXk#%9Y5T4yJq_<| zc&I~I;X&4`+ue^FmE13VS^@=Ar+bT6S-*N`^ya5pFrh52k|Gmekbm;0hyLffIjv!_zbhdrzRaX?Cb4@sL4JcPSWag6Y73VAz9aI)_8lNiSGf^Qf;4Ccc^Z>Xv!p8i!dY6;WoA+vx`b0 zd-QgFNOV83o3kpSz~Be%{nq0JG;rJESpMjye*3YMA-S`|m2wbaWct~)BHRRRcl`pM zvoyiv^ny1W>Yq*WP-kZ|j^p*!#!s#Yh)N#B{^DgM(8ZQ*d57`WBrdnnr4)^pv)fpX z+x1}Vk=2N9bRhF@U?aGkhbv-#rv>QmwPEDe#znm4?^N}YIRMe zct+k_NGdG{H@v3C@ULN4rA>T7>cgpsf=O_Vc`tU4)Y{ZPO|)qu15-q4bk{FutuH>L zTmEVWhYog&vl`c1KnRR4LUyPI5;oN5fD1b_dZ&ADw`Z~U^oT7YV{Khya^kt1!Ryl1 zt;2LQ>uN)MgsT*c$U?&KOk%NCWWA&)ZxXFBbw4v`@9qVfgma8?AyMDvWH>!CmRLj- zeIssfsaOe;D|^Cmq{4=VO_BsC*?rM09@@V9UB8f8(GeX*hivcx{@9+VX|; zS$sWaTVK?tB-gXPevCE>V6js@VIb*UW8G$?iRm@y)-cd!YB2F6K~S0VlA=4&>^-St zln8r6=$Nn11hQ<#_p*uZaK$j7?rBrqBYe_=d%M@Un?n3&rDciwn9V={EP zx$h4*m|W~cml-wVQm)n;2LJ8GteThnyt4Mvj;=qLDciyI>nxo9J*lLvzPxhA^94CA z|BmJBoAM8)BGY2t9YO;gDLa+#YciaEdEm?K!>4rkMJdwF9H&!#0c=CDEWl9|hl%FY zu=7~#=3T^YwDnCJzJ;GPrAs@sw?>4q7FYJJXY>pbr5`Ge2< zoj3htO7Q(KW^lMY!|%u&ty`O=V~FzmpE~Lk{YO^cNL5@58~2mZ;FuFuvatFZeFBEu zdS*l{pn3m&k%ZjZ{SLkrYFDLhk*>#9=H7QdxUPkLbar`_)tdBhp9k&?a6Zqe-9zK1 zHj;MG{!nrInp;VZh4%@vuvwv2@OJ7t;=m>Oyi}_;{)H#1{0u{R!_=qV1avYS=he#f zb%YDlrCG18iu*p?8DmLT%WO8(ye(i!D`L&ru-@$;*y2bc~g9;`cxa1Nei8MTSs|e1DdjSdXBLBcLJF zpAp>2_9V2mOJjl{a&dwrL9=X^V{gJH(kO#=y^xuH+-WS3|{z zA`haa=sg@D`!ZJFhv~~grrgRk1lULMDez-pNk>o_!Q-MVW*ZlXWg(L$s2OzoFsGa* z$9%0rq28pV0Yp#hx_HtPH*x`&M8`7xjxwn58ol`LRmY`oe$|l~6`bNL+Ty__kfn8v zREDM0)2m@6mlY*f9(RB&RzQp?D&lu$PD0V)q?Z4;7mEiyY literal 0 HcmV?d00001 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/config.guess b/libraries/sqlite/unix/sqlite-3.5.1/config.guess new file mode 100644 index 0000000000..6960a397af --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/config.guess @@ -0,0 +1,1532 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-01-15' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +if [ "${UNAME_SYSTEM}" = "Linux" ] ; then + eval $set_cc_for_build + cat << EOF > $dummy.c + #include + #ifdef __UCLIBC__ + # ifdef __UCLIBC_CONFIG_VERSION__ + LIBC=uclibc __UCLIBC_CONFIG_VERSION__ + # else + LIBC=uclibc + # endif + #else + LIBC=gnu + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` +fi + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[3456]*) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-${LIBC} + exit ;; + xtensa:Linux:*:*) + echo xtensa-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" + exit ;; + esac + # This should get integrated into the C code below, but now we hack + if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/config.sub b/libraries/sqlite/unix/sqlite-3.5.1/config.sub new file mode 100644 index 0000000000..2a4932e7f5 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/config.sub @@ -0,0 +1,1640 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-01-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx | dvp \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsEE* | ee | ps2) + basic_machine=mips64r5900el-scei + case $os in + -linux*) + ;; + *) + os=-elf + ;; + esac + ;; + iop) + basic_machine=mipsel-scei + os=-irx + ;; + dvp) + basic_machine=dvp-scei + os=-elf + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/configure b/libraries/sqlite/unix/sqlite-3.5.1/configure new file mode 100755 index 0000000000..c862e3ff51 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/configure @@ -0,0 +1,21144 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="src/sqlite.h.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +GREP +EGREP +LN_S +ECHO +AR +RANLIB +STRIP +CPP +CXX +CXXFLAGS +ac_ct_CXX +CXXCPP +F77 +FFLAGS +ac_ct_F77 +LIBTOOL +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +AWK +program_prefix +VERSION +RELEASE +VERSION_NUMBER +BUILD_CC +BUILD_CFLAGS +SQLITE_THREADSAFE +TARGET_THREAD_LIB +XTHREADCONNECT +THREADSOVERRIDELOCKS +ALLOWRELEASE +TEMP_STORE +BUILD_EXEEXT +OS_UNIX +OS_WIN +OS_OS2 +TARGET_EXEEXT +TCL_VERSION +TCL_BIN_DIR +TCL_SRC_DIR +TCL_LIBS +TCL_INCLUDE_SPEC +TCL_LIB_FILE +TCL_LIB_FLAG +TCL_LIB_SPEC +TCL_STUB_LIB_FILE +TCL_STUB_LIB_FLAG +TCL_STUB_LIB_SPEC +HAVE_TCL +TARGET_READLINE_LIBS +TARGET_READLINE_INC +TARGET_HAVE_READLINE +TARGET_DEBUG +LIBOBJS +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-threadsafe Support threadsafe operation + --enable-cross-thread-connections + Allow connection sharing across threads + --enable-threads-override-locks + Threads can override each others locks + --enable-releasemode Support libtool link to release mode + --enable-tempstore Use an in-ram database for temporary tables + (never,no,yes,always) + --disable-tcl do not build TCL extension + --disable-readline disable readline support [default=detect] + --enable-debug enable debugging & verbose explain + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] + --with-hints=FILE Read configuration options from FILE + --with-tcl=DIR directory containing tcl configuration + (tclConfig.sh) + --with-readline-lib specify readline library + --with-readline-inc specify readline include paths + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# The following RCS revision string applies to configure.in +# $Revision: 1.43 $ + +######### +# Programs needed +# +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED +{ echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6; } + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } +fi + +{ echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 3685 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + + +esac + +need_locks="$enable_libtool_lock" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +fi + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_f77_g=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } +else + { echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6; } +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6; } +else + { echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6; } +fi + +{ echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } +if test "${lt_cv_objdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Check if we have a version mismatch between libtool.m4 and ltmain.sh. +# +# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. +# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually +# calls AC_LIBTOOL_CONFIG and creates libtool. +# +{ echo "$as_me:$LINENO: checking for correct ltmain.sh version" >&5 +echo $ECHO_N "checking for correct ltmain.sh version... $ECHO_C" >&6; } +if test "x$ltmain" = "x" ; then + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + { { echo "$as_me:$LINENO: error: + +*** [Gentoo] sanity check failed! *** +*** \$ltmain is not defined, please check the patch for consistency! *** +" >&5 +echo "$as_me: error: + +*** [Gentoo] sanity check failed! *** +*** \$ltmain is not defined, please check the patch for consistency! *** +" >&2;} + { (exit 1); exit 1; }; } +fi +gentoo_lt_version="1.5.22" +gentoo_ltmain_version=`sed -n '/^[ ]*VERSION=/{s/^[ ]*VERSION=//;p;q;}' "$ltmain"` +if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + { { echo "$as_me:$LINENO: error: + +*** [Gentoo] sanity check failed! *** +*** libtool.m4 and ltmain.sh have a version mismatch! *** +*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** + +Please run: + + libtoolize --copy --force + +if appropriate, please contact the maintainer of this +package (or your distribution) for help. +" >&5 +echo "$as_me: error: + +*** [Gentoo] sanity check failed! *** +*** libtool.m4 and ltmain.sh have a version mismatch! *** +*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** + +Please run: + + libtoolize --copy --force + +if appropriate, please contact the maintainer of this +package (or your distribution) for help. +" >&2;} + { (exit 1); exit 1; }; } +else + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +fi + + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6364: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6368: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6632: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6636: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works=yes + fi + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6736: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:6740: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix3*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + linux*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + $archive_expsym_cmds="$archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which library types will actually be built +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + interix3*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +interix3*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +solaris*) + case $cc_basename in + CC*) + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + postdeps_CXX='-lCstd -lCrun' + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11517: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:11521: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_CXX=yes + fi + else + lt_prog_compiler_static_works_CXX=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11621: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:11625: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + linux*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + $archive_expsym_cmds="$archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13228: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13232: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_F77=yes + fi + else + lt_prog_compiler_static_works_F77=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13332: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13336: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + interix3*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + linux*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + $archive_expsym_cmds="$archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +old_archive_cmds_GCJ=$old_archive_cmds + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15567: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15571: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15835: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15839: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_GCJ=yes + fi + else + lt_prog_compiler_static_works_GCJ=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15939: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15943: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + interix3*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + *) + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + linux*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + $archive_expsym_cmds="$archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AWK" && break +done + + +######### +# Set up an appropriate program prefix +# +if test "$program_prefix" = "NONE"; then + program_prefix="" +fi + + +VERSION=`cat $srcdir/VERSION | sed 's/^\([0-9]*\.*[0-9]*\).*/\1/'` +echo "Version set to $VERSION" + +RELEASE=`cat $srcdir/VERSION` +echo "Release set to $RELEASE" + +VERSION_NUMBER=`cat $srcdir/VERSION \ + | sed 's/[^0-9]/ /g' \ + | awk '{printf "%d%03d%03d",$1,$2,$3}'` +echo "Version number set to $VERSION_NUMBER" + + +######### +# Check to see if the --with-hints=FILE option is used. If there is none, +# then check for a files named "$host.hints" and ../$hosts.hints where +# $host is the hostname of the build system. If still no hints are +# found, try looking in $system.hints and ../$system.hints where +# $system is the result of uname -s. +# + +# Check whether --with-hints was given. +if test "${with_hints+set}" = set; then + withval=$with_hints; hints=$withval +fi + +if test "$hints" = ""; then + host=`hostname | sed 's/\..*//'` + if test -r $host.hints; then + hints=$host.hints + else + if test -r ../$host.hints; then + hints=../$host.hints + fi + fi +fi +if test "$hints" = ""; then + sys=`uname -s` + if test -r $sys.hints; then + hints=$sys.hints + else + if test -r ../$sys.hints; then + hints=../$sys.hints + fi + fi +fi +if test "$hints" != ""; then + { echo "$as_me:$LINENO: result: reading hints from $hints" >&5 +echo "${ECHO_T}reading hints from $hints" >&6; } + . $hints +fi + +######### +# Locate a compiler for the build machine. This compiler should +# generate command-line programs that run on the build machine. +# +if test x"$cross_compiling" = xno; then + BUILD_CC=$CC + BUILD_CFLAGS=$CFLAGS +else + if test "${BUILD_CC+set}" != set; then + for ac_prog in gcc cc cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_BUILD_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + { echo "$as_me:$LINENO: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$BUILD_CC" && break +done + + fi + if test "${BUILD_CFLAGS+set}" != set; then + BUILD_CFLAGS="-g" + fi +fi + + + +########## +# Do we want to support multithreaded use of sqlite +# +# Check whether --enable-threadsafe was given. +if test "${enable_threadsafe+set}" = set; then + enableval=$enable_threadsafe; +else + enable_threadsafe=yes +fi + +{ echo "$as_me:$LINENO: checking whether to support threadsafe operation" >&5 +echo $ECHO_N "checking whether to support threadsafe operation... $ECHO_C" >&6; } +if test "$enable_threadsafe" = "no"; then + SQLITE_THREADSAFE=0 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +else + SQLITE_THREADSAFE=1 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +fi + + +if test "$SQLITE_THREADSAFE" = "1"; then + LIBS="" + +{ echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 +echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6; } +if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_create (); +int +main () +{ +return pthread_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_pthread_pthread_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_pthread_pthread_create=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6; } +if test $ac_cv_lib_pthread_pthread_create = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPTHREAD 1 +_ACEOF + + LIBS="-lpthread $LIBS" + +fi + + TARGET_THREAD_LIB="$LIBS" + LIBS="" +else + TARGET_THREAD_LIB="" +fi + + +########## +# Do we want to allow a connection created in one thread to be used +# in another thread. This does not work on many Linux systems (ex: RedHat 9) +# due to bugs in the threading implementations. This is thus off by default. +# +# Check whether --enable-cross-thread-connections was given. +if test "${enable_cross_thread_connections+set}" = set; then + enableval=$enable_cross_thread_connections; +else + enable_xthreadconnect=no +fi + +{ echo "$as_me:$LINENO: checking whether to allow connections to be shared across threads" >&5 +echo $ECHO_N "checking whether to allow connections to be shared across threads... $ECHO_C" >&6; } +if test "$enable_xthreadconnect" = "no"; then + XTHREADCONNECT='' + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +else + XTHREADCONNECT='-DSQLITE_ALLOW_XTHREAD_CONNECT=1' + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +fi + + +########## +# Do we want to set threadsOverrideEachOthersLocks variable to be 1 (true) by +# default. Normally, a test at runtime is performed to determine the +# appropriate value of this variable. Use this option only if you're sure that +# threads can safely override each others locks in all runtime situations. +# +# Check whether --enable-threads-override-locks was given. +if test "${enable_threads_override_locks+set}" = set; then + enableval=$enable_threads_override_locks; +else + enable_threads_override_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether threads can override each others locks" >&5 +echo $ECHO_N "checking whether threads can override each others locks... $ECHO_C" >&6; } +if test "$enable_threads_override_locks" = "no"; then + THREADSOVERRIDELOCKS='-1' + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +else + THREADSOVERRIDELOCKS='1' + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +fi + + +########## +# Do we want to support release +# +# Check whether --enable-releasemode was given. +if test "${enable_releasemode+set}" = set; then + enableval=$enable_releasemode; +else + enable_releasemode=no +fi + +{ echo "$as_me:$LINENO: checking whether to support shared library linked as release mode or not" >&5 +echo $ECHO_N "checking whether to support shared library linked as release mode or not... $ECHO_C" >&6; } +if test "$enable_releasemode" = "no"; then + ALLOWRELEASE="" + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +else + ALLOWRELEASE="-release `cat VERSION`" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +fi + + +########## +# Do we want temporary databases in memory +# +# Check whether --enable-tempstore was given. +if test "${enable_tempstore+set}" = set; then + enableval=$enable_tempstore; +else + enable_tempstore=no +fi + +{ echo "$as_me:$LINENO: checking whether to use an in-ram database for temporary tables" >&5 +echo $ECHO_N "checking whether to use an in-ram database for temporary tables... $ECHO_C" >&6; } +case "$enable_tempstore" in + never ) + TEMP_STORE=0 + { echo "$as_me:$LINENO: result: never" >&5 +echo "${ECHO_T}never" >&6; } + ;; + no ) + TEMP_STORE=1 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + always ) + TEMP_STORE=3 + { echo "$as_me:$LINENO: result: always" >&5 +echo "${ECHO_T}always" >&6; } + ;; + yes ) + TEMP_STORE=3 + { echo "$as_me:$LINENO: result: always" >&5 +echo "${ECHO_T}always" >&6; } + ;; + * ) + TEMP_STORE=1 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + ;; +esac + + + +########### +# Lots of things are different if we are compiling for Windows using +# the CYGWIN environment. So check for that special case and handle +# things accordingly. +# +{ echo "$as_me:$LINENO: checking if executables have the .exe suffix" >&5 +echo $ECHO_N "checking if executables have the .exe suffix... $ECHO_C" >&6; } +if test "$config_BUILD_EXEEXT" = ".exe"; then + CYGWIN=yes + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: unknown" >&5 +echo "${ECHO_T}unknown" >&6; } +fi +if test "$CYGWIN" != "yes"; then + { echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +case $host_os in + *cygwin* ) CYGWIN=yes;; + * ) CYGWIN=no;; +esac + +fi +if test "$CYGWIN" = "yes"; then + BUILD_EXEEXT=.exe +else + BUILD_EXEEXT=$EXEEXT +fi +if test x"$cross_compiling" = xno; then + TARGET_EXEEXT=$BUILD_EXEEXT +else + TARGET_EXEEXT=$config_TARGET_EXEEXT +fi +if test "$TARGET_EXEEXT" = ".exe"; then + if test $OS2_SHELL ; then + OS_UNIX=0 + OS_WIN=0 + OS_OS2=1 + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_OS2=1" + if test "$ac_compiler_gnu" == "yes" ; then + TARGET_CFLAGS="$TARGET_CFLAGS -Zomf -Zexe -Zmap" + BUILD_CFLAGS="$BUILD_CFLAGS -Zomf -Zexe" + fi + else + OS_UNIX=0 + OS_WIN=1 + OS_OS2=0 + tclsubdir=win + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_WIN=1" + fi +else + OS_UNIX=1 + OS_WIN=0 + OS_OS2=0 + tclsubdir=unix + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_UNIX=1" +fi + + + + + + + +########## +# Figure out all the parameters needed to compile against Tcl. +# +# This code is derived from the SC_PATH_TCLCONFIG and SC_LOAD_TCLCONFIG +# macros in the in the tcl.m4 file of the standard TCL distribution. +# Those macros could not be used directly since we have to make some +# minor changes to accomodate systems that do not have TCL installed. +# +# Check whether --enable-tcl was given. +if test "${enable_tcl+set}" = set; then + enableval=$enable_tcl; use_tcl=$enableval +else + use_tcl=yes +fi + +if test "${use_tcl}" = "yes" ; then + +# Check whether --with-tcl was given. +if test "${with_tcl+set}" = set; then + withval=$with_tcl; with_tclconfig=${withval} +fi + + { echo "$as_me:$LINENO: checking for Tcl configuration" >&5 +echo $ECHO_N "checking for Tcl configuration... $ECHO_C" >&6; } + if test "${ac_cv_c_tclconfig+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + # First check to see if --with-tcl was specified. + if test x"${with_tclconfig}" != x ; then + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` + else + { { echo "$as_me:$LINENO: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&5 +echo "$as_me: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&2;} + { (exit 1); exit 1; }; } + fi + fi + # then check for a private Tcl installation + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ../tcl \ + `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` + do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + `ls -d ${libdir} 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` + do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` + do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + +fi + + + if test x"${ac_cv_c_tclconfig}" = x ; then + use_tcl=no + { echo "$as_me:$LINENO: WARNING: Can't find Tcl configuration definitions" >&5 +echo "$as_me: WARNING: Can't find Tcl configuration definitions" >&2;} + { echo "$as_me:$LINENO: WARNING: *** Without Tcl the regression tests cannot be executed ***" >&5 +echo "$as_me: WARNING: *** Without Tcl the regression tests cannot be executed ***" >&2;} + { echo "$as_me:$LINENO: WARNING: *** Consider using --with-tcl=... to define location of Tcl ***" >&5 +echo "$as_me: WARNING: *** Consider using --with-tcl=... to define location of Tcl ***" >&2;} + else + TCL_BIN_DIR=${ac_cv_c_tclconfig} + { echo "$as_me:$LINENO: result: found $TCL_BIN_DIR/tclConfig.sh" >&5 +echo "${ECHO_T}found $TCL_BIN_DIR/tclConfig.sh" >&6; } + + { echo "$as_me:$LINENO: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5 +echo $ECHO_N "checking for existence of $TCL_BIN_DIR/tclConfig.sh... $ECHO_C" >&6; } + if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then + { echo "$as_me:$LINENO: result: loading" >&5 +echo "${ECHO_T}loading" >&6; } + . $TCL_BIN_DIR/tclConfig.sh + else + { echo "$as_me:$LINENO: result: file not found" >&5 +echo "${ECHO_T}file not found" >&6; } + fi + + # + # If the TCL_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TCL_LIB_SPEC will be set to the value + # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC + # instead of TCL_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + # + + if test -f $TCL_BIN_DIR/Makefile ; then + TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} + TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} + TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} + fi + + # + # eval is required to do the TCL_DBGX substitution + # + + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + + + + + + + + + + + + + + fi +fi +if test "${use_tcl}" = "no" ; then + HAVE_TCL="" +else + HAVE_TCL=1 +fi + + +########## +# Figure out what C libraries are required to compile programs +# that use "readline()" library. +# +TARGET_READLINE_LIBS="" +TARGET_READLINE_INC="" +TARGET_HAVE_READLINE=0 +# Check whether --enable-readline was given. +if test "${enable_readline+set}" = set; then + enableval=$enable_readline; with_readline=$enableval +else + with_readline=auto +fi + + +if test x"$with_readline" != xno; then + found="yes" + + +# Check whether --with-readline-lib was given. +if test "${with_readline_lib+set}" = set; then + withval=$with_readline_lib; with_readline_lib=$withval +else + with_readline_lib="auto" +fi + + if test "x$with_readline_lib" = xauto; then + save_LIBS="$LIBS" + LIBS="" + { echo "$as_me:$LINENO: checking for library containing tgetent" >&5 +echo $ECHO_N "checking for library containing tgetent... $ECHO_C" >&6; } +if test "${ac_cv_search_tgetent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (); +int +main () +{ +return tgetent (); + ; + return 0; +} +_ACEOF +for ac_lib in '' readline ncurses curses termcap; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_search_tgetent=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_tgetent+set}" = set; then + break +fi +done +if test "${ac_cv_search_tgetent+set}" = set; then + : +else + ac_cv_search_tgetent=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_tgetent" >&5 +echo "${ECHO_T}$ac_cv_search_tgetent" >&6; } +ac_res=$ac_cv_search_tgetent +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + term_LIBS="$LIBS" +else + term_LIBS="" +fi + + { echo "$as_me:$LINENO: checking for readline in -lreadline" >&5 +echo $ECHO_N "checking for readline in -lreadline... $ECHO_C" >&6; } +if test "${ac_cv_lib_readline_readline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_readline_readline=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_readline_readline=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 +echo "${ECHO_T}$ac_cv_lib_readline_readline" >&6; } +if test $ac_cv_lib_readline_readline = yes; then + TARGET_READLINE_LIBS="-lreadline" +else + found="no" +fi + + TARGET_READLINE_LIBS="$TARGET_READLINE_LIBS $term_LIBS" + LIBS="$save_LIBS" + else + TARGET_READLINE_LIBS="$with_readline_lib" + fi + + +# Check whether --with-readline-inc was given. +if test "${with_readline_inc+set}" = set; then + withval=$with_readline_inc; with_readline_inc=$withval +else + with_readline_inc="auto" +fi + + if test "x$with_readline_inc" = xauto; then + if test "${ac_cv_header_readline_h+set}" = set; then + { echo "$as_me:$LINENO: checking for readline.h" >&5 +echo $ECHO_N "checking for readline.h... $ECHO_C" >&6; } +if test "${ac_cv_header_readline_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_readline_h" >&5 +echo "${ECHO_T}$ac_cv_header_readline_h" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking readline.h usability" >&5 +echo $ECHO_N "checking readline.h usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking readline.h presence" >&5 +echo $ECHO_N "checking readline.h presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: readline.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: readline.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: readline.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: readline.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: readline.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: readline.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: readline.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: readline.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: readline.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: readline.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: readline.h: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for readline.h" >&5 +echo $ECHO_N "checking for readline.h... $ECHO_C" >&6; } +if test "${ac_cv_header_readline_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_readline_h=$ac_header_preproc +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_readline_h" >&5 +echo "${ECHO_T}$ac_cv_header_readline_h" >&6; } + +fi +if test $ac_cv_header_readline_h = yes; then + found="yes" +else + + found="no" + if test "$cross_compiling" != yes; then + for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do + for subdir in include include/readline; do + as_ac_File=`echo "ac_cv_file_$dir/$subdir/readline.h" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $dir/$subdir/readline.h" >&5 +echo $ECHO_N "checking for $dir/$subdir/readline.h... $ECHO_C" >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$dir/$subdir/readline.h"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval echo '${'$as_ac_File'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_File'}'` = yes; then + found=yes +fi + + if test "$found" = "yes"; then + TARGET_READLINE_INC="-I$dir/$subdir" + break + fi + done + test "$found" = "yes" && break + done + fi + +fi + + + else + TARGET_READLINE_INC="$with_readline_inc" + fi + + if test x"$found" = xno; then + TARGET_READLINE_LIBS="" + TARGET_READLINE_INC="" + TARGET_HAVE_READLINE=0 + else + TARGET_HAVE_READLINE=1 + fi +fi + + + + + +########## +# Figure out what C libraries are required to compile programs +# that use "fdatasync()" function. +# +{ echo "$as_me:$LINENO: checking for library containing fdatasync" >&5 +echo $ECHO_N "checking for library containing fdatasync... $ECHO_C" >&6; } +if test "${ac_cv_search_fdatasync+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fdatasync (); +int +main () +{ +return fdatasync (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_search_fdatasync=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_fdatasync+set}" = set; then + break +fi +done +if test "${ac_cv_search_fdatasync+set}" = set; then + : +else + ac_cv_search_fdatasync=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_fdatasync" >&5 +echo "${ECHO_T}$ac_cv_search_fdatasync" >&6; } +ac_res=$ac_cv_search_fdatasync +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +######### +# check for debug enabled +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then + enableval=$enable_debug; use_debug=$enableval +else + use_debug=no +fi + +if test "${use_debug}" = "yes" ; then + TARGET_DEBUG="-DSQLITE_DEBUG=1" +else + TARGET_DEBUG="-DNDEBUG" +fi + + +######### +# Figure out whether or not we have a "usleep()" function. +# +{ echo "$as_me:$LINENO: checking for usleep" >&5 +echo $ECHO_N "checking for usleep... $ECHO_C" >&6; } +if test "${ac_cv_func_usleep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define usleep to an innocuous variant, in case declares usleep. + For example, HP-UX 11i declares gettimeofday. */ +#define usleep innocuous_usleep + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char usleep (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef usleep + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char usleep (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_usleep || defined __stub___usleep +choke me +#endif + +int +main () +{ +return usleep (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_usleep=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_usleep=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_usleep" >&5 +echo "${ECHO_T}$ac_cv_func_usleep" >&6; } +if test $ac_cv_func_usleep = yes; then + TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_USLEEP=1" +fi + + +#-------------------------------------------------------------------- +# Redefine fdatasync as fsync on systems that lack fdatasync +#-------------------------------------------------------------------- + +{ echo "$as_me:$LINENO: checking for fdatasync" >&5 +echo $ECHO_N "checking for fdatasync... $ECHO_C" >&6; } +if test "${ac_cv_func_fdatasync+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define fdatasync to an innocuous variant, in case declares fdatasync. + For example, HP-UX 11i declares gettimeofday. */ +#define fdatasync innocuous_fdatasync + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char fdatasync (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef fdatasync + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fdatasync (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_fdatasync || defined __stub___fdatasync +choke me +#endif + +int +main () +{ +return fdatasync (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_fdatasync=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_fdatasync=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_fdatasync" >&5 +echo "${ECHO_T}$ac_cv_func_fdatasync" >&6; } +if test $ac_cv_func_fdatasync = yes; then + TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_FDATASYNC=1" +fi + + +######### +# Generate the output files. +# +ac_config_files="$ac_config_files Makefile sqlite3.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "sqlite3.pc") CONFIG_FILES="$CONFIG_FILES sqlite3.pc" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +LN_S!$LN_S$ac_delim +ECHO!$ECHO$ac_delim +AR!$AR$ac_delim +RANLIB!$RANLIB$ac_delim +STRIP!$STRIP$ac_delim +CPP!$CPP$ac_delim +CXX!$CXX$ac_delim +CXXFLAGS!$CXXFLAGS$ac_delim +ac_ct_CXX!$ac_ct_CXX$ac_delim +CXXCPP!$CXXCPP$ac_delim +F77!$F77$ac_delim +FFLAGS!$FFLAGS$ac_delim +ac_ct_F77!$ac_ct_F77$ac_delim +LIBTOOL!$LIBTOOL$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +AWK!$AWK$ac_delim +program_prefix!$program_prefix$ac_delim +VERSION!$VERSION$ac_delim +RELEASE!$RELEASE$ac_delim +VERSION_NUMBER!$VERSION_NUMBER$ac_delim +BUILD_CC!$BUILD_CC$ac_delim +BUILD_CFLAGS!$BUILD_CFLAGS$ac_delim +SQLITE_THREADSAFE!$SQLITE_THREADSAFE$ac_delim +TARGET_THREAD_LIB!$TARGET_THREAD_LIB$ac_delim +XTHREADCONNECT!$XTHREADCONNECT$ac_delim +THREADSOVERRIDELOCKS!$THREADSOVERRIDELOCKS$ac_delim +ALLOWRELEASE!$ALLOWRELEASE$ac_delim +TEMP_STORE!$TEMP_STORE$ac_delim +BUILD_EXEEXT!$BUILD_EXEEXT$ac_delim +OS_UNIX!$OS_UNIX$ac_delim +OS_WIN!$OS_WIN$ac_delim +OS_OS2!$OS_OS2$ac_delim +TARGET_EXEEXT!$TARGET_EXEEXT$ac_delim +TCL_VERSION!$TCL_VERSION$ac_delim +TCL_BIN_DIR!$TCL_BIN_DIR$ac_delim +TCL_SRC_DIR!$TCL_SRC_DIR$ac_delim +TCL_LIBS!$TCL_LIBS$ac_delim +TCL_INCLUDE_SPEC!$TCL_INCLUDE_SPEC$ac_delim +TCL_LIB_FILE!$TCL_LIB_FILE$ac_delim +TCL_LIB_FLAG!$TCL_LIB_FLAG$ac_delim +TCL_LIB_SPEC!$TCL_LIB_SPEC$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +TCL_STUB_LIB_FILE!$TCL_STUB_LIB_FILE$ac_delim +TCL_STUB_LIB_FLAG!$TCL_STUB_LIB_FLAG$ac_delim +TCL_STUB_LIB_SPEC!$TCL_STUB_LIB_SPEC$ac_delim +HAVE_TCL!$HAVE_TCL$ac_delim +TARGET_READLINE_LIBS!$TARGET_READLINE_LIBS$ac_delim +TARGET_READLINE_INC!$TARGET_READLINE_INC$ac_delim +TARGET_HAVE_READLINE!$TARGET_HAVE_READLINE$ac_delim +TARGET_DEBUG!$TARGET_DEBUG$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 10; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + + + + esac + +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi diff --git a/libraries/sqlite/unix/sqlite-3.5.1/configure.ac b/libraries/sqlite/unix/sqlite-3.5.1/configure.ac new file mode 100644 index 0000000000..311459af0e --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/configure.ac @@ -0,0 +1,582 @@ +# +# The build process allows for using a cross-compiler. But the default +# action is to target the same platform that we are running on. The +# configure script needs to discover the following properties of the +# build and target systems: +# +# srcdir +# +# The is the name of the directory that contains the +# "configure" shell script. All source files are +# located relative to this directory. +# +# bindir +# +# The name of the directory where executables should be +# written by the "install" target of the makefile. +# +# program_prefix +# +# Add this prefix to the names of all executables that run +# on the target machine. Default: "" +# +# ENABLE_SHARED +# +# True if shared libraries should be generated. +# +# BUILD_CC +# +# The name of a command that is used to convert C +# source files into executables that run on the build +# platform. +# +# BUILD_CFLAGS +# +# Switches that the build compiler needs in order to construct +# command-line programs. +# +# BUILD_LIBS +# +# Libraries that the build compiler needs in order to construct +# command-line programs. +# +# BUILD_EXEEXT +# +# The filename extension for executables on the build +# platform. "" for Unix and ".exe" for Windows. +# +# TCL_* +# +# Lots of values are read in from the tclConfig.sh script, +# if that script is available. This values are used for +# constructing and installing the TCL extension. +# +# TARGET_READLINE_LIBS +# +# This is the library directives passed to the target linker +# that cause the executable to link against the readline library. +# This might be a switch like "-lreadline" or pathnames of library +# file like "../../src/libreadline.a". +# +# TARGET_READLINE_INC +# +# This variables define the directory that contain header +# files for the readline library. If the compiler is able +# to find on its own, then this can be blank. +# +# TARGET_EXEEXT +# +# The filename extension for executables on the +# target platform. "" for Unix and ".exe" for windows. +# +# The generated configure script will make an attempt to guess +# at all of the above parameters. You can override any of +# the guesses by setting the environment variable named +# "config_AAAA" where "AAAA" is the name of the parameter +# described above. (Exception: srcdir cannot be set this way.) +# If you have a file that sets one or more of these environment +# variables, you can invoke configure as follows: +# +# configure --with-hints=FILE +# +# where FILE is the name of the file that sets the environment +# variables. FILE should be an absolute pathname. +# +# This configure.in file is easy to reuse on other projects. Just +# change the argument to AC_INIT(). And disable any features that +# you don't need (for example BLT) by erasing or commenting out +# the corresponding code. +# +AC_INIT(src/sqlite.h.in) + +dnl Put the RCS revision string after AC_INIT so that it will also +dnl show in in configure. +# The following RCS revision string applies to configure.in +# $Revision: 1.30 $ + +######### +# Programs needed +# +AC_PROG_LIBTOOL +AC_PROG_INSTALL +AC_PROG_AWK + +######### +# Set up an appropriate program prefix +# +if test "$program_prefix" = "NONE"; then + program_prefix="" +fi +AC_SUBST(program_prefix) + +VERSION=[`cat $srcdir/VERSION | sed 's/^\([0-9]*\.*[0-9]*\).*/\1/'`] +echo "Version set to $VERSION" +AC_SUBST(VERSION) +RELEASE=`cat $srcdir/VERSION` +echo "Release set to $RELEASE" +AC_SUBST(RELEASE) +VERSION_NUMBER=[`cat $srcdir/VERSION \ + | sed 's/[^0-9]/ /g' \ + | awk '{printf "%d%03d%03d",$1,$2,$3}'`] +echo "Version number set to $VERSION_NUMBER" +AC_SUBST(VERSION_NUMBER) + +######### +# Check to see if the --with-hints=FILE option is used. If there is none, +# then check for a files named "$host.hints" and ../$hosts.hints where +# $host is the hostname of the build system. If still no hints are +# found, try looking in $system.hints and ../$system.hints where +# $system is the result of uname -s. +# +AC_ARG_WITH(hints, + AC_HELP_STRING([--with-hints=FILE],[Read configuration options from FILE]), + hints=$withval) +if test "$hints" = ""; then + host=`hostname | sed 's/\..*//'` + if test -r $host.hints; then + hints=$host.hints + else + if test -r ../$host.hints; then + hints=../$host.hints + fi + fi +fi +if test "$hints" = ""; then + sys=`uname -s` + if test -r $sys.hints; then + hints=$sys.hints + else + if test -r ../$sys.hints; then + hints=../$sys.hints + fi + fi +fi +if test "$hints" != ""; then + AC_MSG_RESULT(reading hints from $hints) + . $hints +fi + +######### +# Locate a compiler for the build machine. This compiler should +# generate command-line programs that run on the build machine. +# +if test x"$cross_compiling" = xno; then + BUILD_CC=$CC + BUILD_CFLAGS=$CFLAGS +else + if test "${BUILD_CC+set}" != set; then + AC_CHECK_PROGS(BUILD_CC, gcc cc cl) + fi + if test "${BUILD_CFLAGS+set}" != set; then + BUILD_CFLAGS="-g" + fi +fi +AC_SUBST(BUILD_CC) +AC_SUBST(BUILD_CFLAGS) + +########## +# Do we want to support multithreaded use of sqlite +# +AC_ARG_ENABLE(threadsafe, +AC_HELP_STRING([--enable-threadsafe],[Support threadsafe operation]),,enable_threadsafe=yes) +AC_MSG_CHECKING([whether to support threadsafe operation]) +if test "$enable_threadsafe" = "no"; then + SQLITE_THREADSAFE=0 + AC_MSG_RESULT([no]) +else + SQLITE_THREADSAFE=1 + AC_MSG_RESULT([yes]) +fi +AC_SUBST(SQLITE_THREADSAFE) + +if test "$SQLITE_THREADSAFE" = "1"; then + LIBS="" + AC_CHECK_LIB(pthread, pthread_create) + TARGET_THREAD_LIB="$LIBS" + LIBS="" +else + TARGET_THREAD_LIB="" +fi +AC_SUBST(TARGET_THREAD_LIB) + +########## +# Do we want to allow a connection created in one thread to be used +# in another thread. This does not work on many Linux systems (ex: RedHat 9) +# due to bugs in the threading implementations. This is thus off by default. +# +AC_ARG_ENABLE(cross-thread-connections, +AC_HELP_STRING([--enable-cross-thread-connections],[Allow connection sharing across threads]),,enable_xthreadconnect=no) +AC_MSG_CHECKING([whether to allow connections to be shared across threads]) +if test "$enable_xthreadconnect" = "no"; then + XTHREADCONNECT='' + AC_MSG_RESULT([no]) +else + XTHREADCONNECT='-DSQLITE_ALLOW_XTHREAD_CONNECT=1' + AC_MSG_RESULT([yes]) +fi +AC_SUBST(XTHREADCONNECT) + +########## +# Do we want to set threadsOverrideEachOthersLocks variable to be 1 (true) by +# default. Normally, a test at runtime is performed to determine the +# appropriate value of this variable. Use this option only if you're sure that +# threads can safely override each others locks in all runtime situations. +# +AC_ARG_ENABLE(threads-override-locks, +AC_HELP_STRING([--enable-threads-override-locks],[Threads can override each others locks]),,enable_threads_override_locks=no) +AC_MSG_CHECKING([whether threads can override each others locks]) +if test "$enable_threads_override_locks" = "no"; then + THREADSOVERRIDELOCKS='-1' + AC_MSG_RESULT([no]) +else + THREADSOVERRIDELOCKS='1' + AC_MSG_RESULT([yes]) +fi +AC_SUBST(THREADSOVERRIDELOCKS) + +########## +# Do we want to support release +# +AC_ARG_ENABLE(releasemode, +AC_HELP_STRING([--enable-releasemode],[Support libtool link to release mode]),,enable_releasemode=no) +AC_MSG_CHECKING([whether to support shared library linked as release mode or not]) +if test "$enable_releasemode" = "no"; then + ALLOWRELEASE="" + AC_MSG_RESULT([no]) +else + ALLOWRELEASE="-release `cat VERSION`" + AC_MSG_RESULT([yes]) +fi +AC_SUBST(ALLOWRELEASE) + +########## +# Do we want temporary databases in memory +# +AC_ARG_ENABLE(tempstore, +AC_HELP_STRING([--enable-tempstore],[Use an in-ram database for temporary tables (never,no,yes,always)]),,enable_tempstore=no) +AC_MSG_CHECKING([whether to use an in-ram database for temporary tables]) +case "$enable_tempstore" in + never ) + TEMP_STORE=0 + AC_MSG_RESULT([never]) + ;; + no ) + TEMP_STORE=1 + AC_MSG_RESULT([no]) + ;; + always ) + TEMP_STORE=3 + AC_MSG_RESULT([always]) + ;; + yes ) + TEMP_STORE=3 + AC_MSG_RESULT([always]) + ;; + * ) + TEMP_STORE=1 + AC_MSG_RESULT([yes]) + ;; +esac + +AC_SUBST(TEMP_STORE) + +########### +# Lots of things are different if we are compiling for Windows using +# the CYGWIN environment. So check for that special case and handle +# things accordingly. +# +AC_MSG_CHECKING([if executables have the .exe suffix]) +if test "$config_BUILD_EXEEXT" = ".exe"; then + CYGWIN=yes + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(unknown) +fi +if test "$CYGWIN" != "yes"; then + AC_CYGWIN +fi +if test "$CYGWIN" = "yes"; then + BUILD_EXEEXT=.exe +else + BUILD_EXEEXT=$EXEEXT +fi +if test x"$cross_compiling" = xno; then + TARGET_EXEEXT=$BUILD_EXEEXT +else + TARGET_EXEEXT=$config_TARGET_EXEEXT +fi +if test "$TARGET_EXEEXT" = ".exe"; then + if test $OS2_SHELL ; then + OS_UNIX=0 + OS_WIN=0 + OS_OS2=1 + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_OS2=1" + if test "$ac_compiler_gnu" == "yes" ; then + TARGET_CFLAGS="$TARGET_CFLAGS -Zomf -Zexe -Zmap" + BUILD_CFLAGS="$BUILD_CFLAGS -Zomf -Zexe" + fi + else + OS_UNIX=0 + OS_WIN=1 + OS_OS2=0 + tclsubdir=win + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_WIN=1" + fi +else + OS_UNIX=1 + OS_WIN=0 + OS_OS2=0 + tclsubdir=unix + TARGET_CFLAGS="$TARGET_CFLAGS -DOS_UNIX=1" +fi + +AC_SUBST(BUILD_EXEEXT) +AC_SUBST(OS_UNIX) +AC_SUBST(OS_WIN) +AC_SUBST(OS_OS2) +AC_SUBST(TARGET_EXEEXT) + +########## +# Figure out all the parameters needed to compile against Tcl. +# +# This code is derived from the SC_PATH_TCLCONFIG and SC_LOAD_TCLCONFIG +# macros in the in the tcl.m4 file of the standard TCL distribution. +# Those macros could not be used directly since we have to make some +# minor changes to accomodate systems that do not have TCL installed. +# +AC_ARG_ENABLE(tcl, AC_HELP_STRING([--disable-tcl],[do not build TCL extension]), + [use_tcl=$enableval],[use_tcl=yes]) +if test "${use_tcl}" = "yes" ; then + AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl=DIR],[directory containing tcl configuration (tclConfig.sh)]), with_tclconfig=${withval}) + AC_MSG_CHECKING([for Tcl configuration]) + AC_CACHE_VAL(ac_cv_c_tclconfig,[ + # First check to see if --with-tcl was specified. + if test x"${with_tclconfig}" != x ; then + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` + else + AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) + fi + fi + # then check for a private Tcl installation + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ../tcl \ + `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` + do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + `ls -d ${libdir} 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` + do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` + do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + ]) + + if test x"${ac_cv_c_tclconfig}" = x ; then + use_tcl=no + AC_MSG_WARN(Can't find Tcl configuration definitions) + AC_MSG_WARN(*** Without Tcl the regression tests cannot be executed ***) + AC_MSG_WARN(*** Consider using --with-tcl=... to define location of Tcl ***) + else + TCL_BIN_DIR=${ac_cv_c_tclconfig} + AC_MSG_RESULT(found $TCL_BIN_DIR/tclConfig.sh) + + AC_MSG_CHECKING([for existence of $TCL_BIN_DIR/tclConfig.sh]) + if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then + AC_MSG_RESULT([loading]) + . $TCL_BIN_DIR/tclConfig.sh + else + AC_MSG_RESULT([file not found]) + fi + + # + # If the TCL_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TCL_LIB_SPEC will be set to the value + # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC + # instead of TCL_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + # + + if test -f $TCL_BIN_DIR/Makefile ; then + TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} + TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} + TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} + fi + + # + # eval is required to do the TCL_DBGX substitution + # + + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + AC_SUBST(TCL_VERSION) + AC_SUBST(TCL_BIN_DIR) + AC_SUBST(TCL_SRC_DIR) + AC_SUBST(TCL_LIBS) + AC_SUBST(TCL_INCLUDE_SPEC) + + AC_SUBST(TCL_LIB_FILE) + AC_SUBST(TCL_LIB_FLAG) + AC_SUBST(TCL_LIB_SPEC) + + AC_SUBST(TCL_STUB_LIB_FILE) + AC_SUBST(TCL_STUB_LIB_FLAG) + AC_SUBST(TCL_STUB_LIB_SPEC) + fi +fi +if test "${use_tcl}" = "no" ; then + HAVE_TCL="" +else + HAVE_TCL=1 +fi +AC_SUBST(HAVE_TCL) + +########## +# Figure out what C libraries are required to compile programs +# that use "readline()" library. +# +TARGET_READLINE_LIBS="" +TARGET_READLINE_INC="" +TARGET_HAVE_READLINE=0 +AC_ARG_ENABLE([readline], + [AC_HELP_STRING([--disable-readline],[disable readline support [default=detect]])], + [with_readline=$enableval], + [with_readline=auto]) + +if test x"$with_readline" != xno; then + found="yes" + + AC_ARG_WITH([readline-lib], + [AC_HELP_STRING([--with-readline-lib],[specify readline library])], + [with_readline_lib=$withval], + [with_readline_lib="auto"]) + if test "x$with_readline_lib" = xauto; then + save_LIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS(tgetent, [readline ncurses curses termcap], [term_LIBS="$LIBS"], [term_LIBS=""]) + AC_CHECK_LIB([readline], [readline], [TARGET_READLINE_LIBS="-lreadline"], [found="no"]) + TARGET_READLINE_LIBS="$TARGET_READLINE_LIBS $term_LIBS" + LIBS="$save_LIBS" + else + TARGET_READLINE_LIBS="$with_readline_lib" + fi + + AC_ARG_WITH([readline-inc], + [AC_HELP_STRING([--with-readline-inc],[specify readline include paths])], + [with_readline_inc=$withval], + [with_readline_inc="auto"]) + if test "x$with_readline_inc" = xauto; then + AC_CHECK_HEADER(readline.h, [found="yes"], [ + found="no" + if test "$cross_compiling" != yes; then + for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do + for subdir in include include/readline; do + AC_CHECK_FILE($dir/$subdir/readline.h, found=yes) + if test "$found" = "yes"; then + TARGET_READLINE_INC="-I$dir/$subdir" + break + fi + done + test "$found" = "yes" && break + done + fi + ]) + else + TARGET_READLINE_INC="$with_readline_inc" + fi + + if test x"$found" = xno; then + TARGET_READLINE_LIBS="" + TARGET_READLINE_INC="" + TARGET_HAVE_READLINE=0 + else + TARGET_HAVE_READLINE=1 + fi +fi + +AC_SUBST(TARGET_READLINE_LIBS) +AC_SUBST(TARGET_READLINE_INC) +AC_SUBST(TARGET_HAVE_READLINE) + +########## +# Figure out what C libraries are required to compile programs +# that use "fdatasync()" function. +# +AC_SEARCH_LIBS(fdatasync, [rt]) + +######### +# check for debug enabled +AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[enable debugging & verbose explain]), + [use_debug=$enableval],[use_debug=no]) +if test "${use_debug}" = "yes" ; then + TARGET_DEBUG="-DSQLITE_DEBUG=1" +else + TARGET_DEBUG="-DNDEBUG" +fi +AC_SUBST(TARGET_DEBUG) + +######### +# Figure out whether or not we have a "usleep()" function. +# +AC_CHECK_FUNC(usleep, [TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_USLEEP=1"]) + +#-------------------------------------------------------------------- +# Redefine fdatasync as fsync on systems that lack fdatasync +#-------------------------------------------------------------------- + +AC_CHECK_FUNC(fdatasync, [TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_FDATASYNC=1"]) + +######### +# Generate the output files. +# +AC_OUTPUT([ +Makefile +sqlite3.pc +]) diff --git a/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl b/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl new file mode 100644 index 0000000000..b5dbcafc2a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl @@ -0,0 +1,679 @@ +# A Tk console widget for SQLite. Invoke sqlitecon::create with a window name, +# a prompt string, a title to set a new top-level window, and the SQLite +# database handle. For example: +# +# sqlitecon::create .sqlcon {sql:- } {SQL Console} db +# +# A toplevel window is created that allows you to type in SQL commands to +# be processed on the spot. +# +# A limited set of dot-commands are supported: +# +# .table +# .schema ?TABLE? +# .mode list|column|multicolumn|line +# .exit +# +# In addition, a new SQL function named "edit()" is created. This function +# takes a single text argument and returns a text result. Whenever the +# the function is called, it pops up a new toplevel window containing a +# text editor screen initialized to the argument. When the "OK" button +# is pressed, whatever revised text is in the text editor is returned as +# the result of the edit() function. This allows text fields of SQL tables +# to be edited quickly and easily as follows: +# +# UPDATE table1 SET dscr = edit(dscr) WHERE rowid=15; +# + + +# Create a namespace to work in +# +namespace eval ::sqlitecon { + # do nothing +} + +# Create a console widget named $w. The prompt string is $prompt. +# The title at the top of the window is $title. The database connection +# object is $db +# +proc sqlitecon::create {w prompt title db} { + upvar #0 $w.t v + if {[winfo exists $w]} {destroy $w} + if {[info exists v]} {unset v} + toplevel $w + wm title $w $title + wm iconname $w $title + frame $w.mb -bd 2 -relief raised + pack $w.mb -side top -fill x + menubutton $w.mb.file -text File -menu $w.mb.file.m + menubutton $w.mb.edit -text Edit -menu $w.mb.edit.m + pack $w.mb.file $w.mb.edit -side left -padx 8 -pady 1 + set m [menu $w.mb.file.m -tearoff 0] + $m add command -label {Close} -command "destroy $w" + sqlitecon::create_child $w $prompt $w.mb.edit.m + set v(db) $db + $db function edit ::sqlitecon::_edit +} + +# This routine creates a console as a child window within a larger +# window. It also creates an edit menu named "$editmenu" if $editmenu!="". +# The calling function is responsible for posting the edit menu. +# +proc sqlitecon::create_child {w prompt editmenu} { + upvar #0 $w.t v + if {$editmenu!=""} { + set m [menu $editmenu -tearoff 0] + $m add command -label Cut -command "sqlitecon::Cut $w.t" + $m add command -label Copy -command "sqlitecon::Copy $w.t" + $m add command -label Paste -command "sqlitecon::Paste $w.t" + $m add command -label {Clear Screen} -command "sqlitecon::Clear $w.t" + $m add separator + $m add command -label {Save As...} -command "sqlitecon::SaveFile $w.t" + catch {$editmenu config -postcommand "sqlitecon::EnableEditMenu $w"} + } + scrollbar $w.sb -orient vertical -command "$w.t yview" + pack $w.sb -side right -fill y + text $w.t -font fixed -yscrollcommand "$w.sb set" + pack $w.t -side right -fill both -expand 1 + bindtags $w.t Sqlitecon + set v(editmenu) $editmenu + set v(history) 0 + set v(historycnt) 0 + set v(current) -1 + set v(prompt) $prompt + set v(prior) {} + set v(plength) [string length $v(prompt)] + set v(x) 0 + set v(y) 0 + set v(mode) column + set v(header) on + $w.t mark set insert end + $w.t tag config ok -foreground blue + $w.t tag config err -foreground red + $w.t insert end $v(prompt) + $w.t mark set out 1.0 + after idle "focus $w.t" +} + +bind Sqlitecon <1> {sqlitecon::Button1 %W %x %y} +bind Sqlitecon {sqlitecon::B1Motion %W %x %y} +bind Sqlitecon {sqlitecon::B1Leave %W %x %y} +bind Sqlitecon {sqlitecon::cancelMotor %W} +bind Sqlitecon {sqlitecon::cancelMotor %W} +bind Sqlitecon {sqlitecon::Insert %W %A} +bind Sqlitecon {sqlitecon::Left %W} +bind Sqlitecon {sqlitecon::Left %W} +bind Sqlitecon {sqlitecon::Right %W} +bind Sqlitecon {sqlitecon::Right %W} +bind Sqlitecon {sqlitecon::Backspace %W} +bind Sqlitecon {sqlitecon::Backspace %W} +bind Sqlitecon {sqlitecon::Delete %W} +bind Sqlitecon {sqlitecon::Delete %W} +bind Sqlitecon {sqlitecon::Home %W} +bind Sqlitecon {sqlitecon::Home %W} +bind Sqlitecon {sqlitecon::End %W} +bind Sqlitecon {sqlitecon::End %W} +bind Sqlitecon {sqlitecon::Enter %W} +bind Sqlitecon {sqlitecon::Enter %W} +bind Sqlitecon {sqlitecon::Prior %W} +bind Sqlitecon {sqlitecon::Prior %W} +bind Sqlitecon {sqlitecon::Next %W} +bind Sqlitecon {sqlitecon::Next %W} +bind Sqlitecon {sqlitecon::EraseEOL %W} +bind Sqlitecon <> {sqlitecon::Cut %W} +bind Sqlitecon <> {sqlitecon::Copy %W} +bind Sqlitecon <> {sqlitecon::Paste %W} +bind Sqlitecon <> {sqlitecon::Clear %W} + +# Insert a single character at the insertion cursor +# +proc sqlitecon::Insert {w a} { + $w insert insert $a + $w yview insert +} + +# Move the cursor one character to the left +# +proc sqlitecon::Left {w} { + upvar #0 $w v + scan [$w index insert] %d.%d row col + if {$col>$v(plength)} { + $w mark set insert "insert -1c" + } +} + +# Erase the character to the left of the cursor +# +proc sqlitecon::Backspace {w} { + upvar #0 $w v + scan [$w index insert] %d.%d row col + if {$col>$v(plength)} { + $w delete {insert -1c} + } +} + +# Erase to the end of the line +# +proc sqlitecon::EraseEOL {w} { + upvar #0 $w v + scan [$w index insert] %d.%d row col + if {$col>=$v(plength)} { + $w delete insert {insert lineend} + } +} + +# Move the cursor one character to the right +# +proc sqlitecon::Right {w} { + $w mark set insert "insert +1c" +} + +# Erase the character to the right of the cursor +# +proc sqlitecon::Delete w { + $w delete insert +} + +# Move the cursor to the beginning of the current line +# +proc sqlitecon::Home w { + upvar #0 $w v + scan [$w index insert] %d.%d row col + $w mark set insert $row.$v(plength) +} + +# Move the cursor to the end of the current line +# +proc sqlitecon::End w { + $w mark set insert {insert lineend} +} + +# Add a line to the history +# +proc sqlitecon::addHistory {w line} { + upvar #0 $w v + if {$v(historycnt)>0} { + set last [lindex $v(history) [expr $v(historycnt)-1]] + if {[string compare $last $line]} { + lappend v(history) $line + incr v(historycnt) + } + } else { + set v(history) [list $line] + set v(historycnt) 1 + } + set v(current) $v(historycnt) +} + +# Called when "Enter" is pressed. Do something with the line +# of text that was entered. +# +proc sqlitecon::Enter w { + upvar #0 $w v + scan [$w index insert] %d.%d row col + set start $row.$v(plength) + set line [$w get $start "$start lineend"] + $w insert end \n + $w mark set out end + if {$v(prior)==""} { + set cmd $line + } else { + set cmd $v(prior)\n$line + } + if {[string index $cmd 0]=="." || [$v(db) complete $cmd]} { + regsub -all {\n} [string trim $cmd] { } cmd2 + addHistory $w $cmd2 + set rc [catch {DoCommand $w $cmd} res] + if {![winfo exists $w]} return + if {$rc} { + $w insert end $res\n err + } elseif {[string length $res]>0} { + $w insert end $res\n ok + } + set v(prior) {} + $w insert end $v(prompt) + } else { + set v(prior) $cmd + regsub -all {[^ ]} $v(prompt) . x + $w insert end $x + } + $w mark set insert end + $w mark set out {insert linestart} + $w yview insert +} + +# Execute a single SQL command. Pay special attention to control +# directives that begin with "." +# +# The return value is the text output from the command, properly +# formatted. +# +proc sqlitecon::DoCommand {w cmd} { + upvar #0 $w v + set mode $v(mode) + set header $v(header) + if {[regexp {^(\.[a-z]+)} $cmd all word]} { + if {$word==".mode"} { + regexp {^.[a-z]+ +([a-z]+)} $cmd all v(mode) + return {} + } elseif {$word==".exit"} { + destroy [winfo toplevel $w] + return {} + } elseif {$word==".header"} { + regexp {^.[a-z]+ +([a-z]+)} $cmd all v(header) + return {} + } elseif {$word==".tables"} { + set mode multicolumn + set cmd {SELECT name FROM sqlite_master WHERE type='table' + UNION ALL + SELECT name FROM sqlite_temp_master WHERE type='table'} + $v(db) eval {PRAGMA database_list} { + if {$name!="temp" && $name!="main"} { + append cmd "UNION ALL SELECT name FROM $name.sqlite_master\ + WHERE type='table'" + } + } + append cmd { ORDER BY 1} + } elseif {$word==".fullschema"} { + set pattern % + regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern + set mode list + set header 0 + set cmd "SELECT sql FROM sqlite_master WHERE tbl_name LIKE '$pattern' + AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master + WHERE tbl_name LIKE '$pattern' AND sql NOT NULL" + $v(db) eval {PRAGMA database_list} { + if {$name!="temp" && $name!="main"} { + append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\ + WHERE tbl_name LIKE '$pattern' AND sql NOT NULL" + } + } + } elseif {$word==".schema"} { + set pattern % + regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern + set mode list + set header 0 + set cmd "SELECT sql FROM sqlite_master WHERE name LIKE '$pattern' + AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master + WHERE name LIKE '$pattern' AND sql NOT NULL" + $v(db) eval {PRAGMA database_list} { + if {$name!="temp" && $name!="main"} { + append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\ + WHERE name LIKE '$pattern' AND sql NOT NULL" + } + } + } else { + return \ + ".exit\n.mode line|list|column\n.schema ?TABLENAME?\n.tables" + } + } + set res {} + if {$mode=="list"} { + $v(db) eval $cmd x { + set sep {} + foreach col $x(*) { + append res $sep$x($col) + set sep | + } + append res \n + } + if {[info exists x(*)] && $header} { + set sep {} + set hdr {} + foreach col $x(*) { + append hdr $sep$col + set sep | + } + set res $hdr\n$res + } + } elseif {[string range $mode 0 2]=="col"} { + set y {} + $v(db) eval $cmd x { + foreach col $x(*) { + if {![info exists cw($col)] || $cw($col)<[string length $x($col)]} { + set cw($col) [string length $x($col)] + } + lappend y $x($col) + } + } + if {[info exists x(*)] && $header} { + set hdr {} + set ln {} + set dash --------------------------------------------------------------- + append dash ------------------------------------------------------------ + foreach col $x(*) { + if {![info exists cw($col)] || $cw($col)<[string length $col]} { + set cw($col) [string length $col] + } + lappend hdr $col + lappend ln [string range $dash 1 $cw($col)] + } + set y [concat $hdr $ln $y] + } + if {[info exists x(*)]} { + set format {} + set arglist {} + set arglist2 {} + set i 0 + foreach col $x(*) { + lappend arglist x$i + append arglist2 " \$x$i" + incr i + append format " %-$cw($col)s" + } + set format [string trimleft $format]\n + if {[llength $arglist]>0} { + foreach $arglist $y "append res \[format [list $format] $arglist2\]" + } + } + } elseif {$mode=="multicolumn"} { + set y [$v(db) eval $cmd] + set max 0 + foreach e $y { + if {$max<[string length $e]} {set max [string length $e]} + } + set ncol [expr {int(80/($max+2))}] + if {$ncol<1} {set ncol 1} + set nelem [llength $y] + set nrow [expr {($nelem+$ncol-1)/$ncol}] + set format "%-${max}s" + for {set i 0} {$i<$nrow} {incr i} { + set j $i + while 1 { + append res [format $format [lindex $y $j]] + incr j $nrow + if {$j>=$nelem} break + append res { } + } + append res \n + } + } else { + $v(db) eval $cmd x { + foreach col $x(*) {append res "$col = $x($col)\n"} + append res \n + } + } + return [string trimright $res] +} + +# Change the line to the previous line +# +proc sqlitecon::Prior w { + upvar #0 $w v + if {$v(current)<=0} return + incr v(current) -1 + set line [lindex $v(history) $v(current)] + sqlitecon::SetLine $w $line +} + +# Change the line to the next line +# +proc sqlitecon::Next w { + upvar #0 $w v + if {$v(current)>=$v(historycnt)} return + incr v(current) 1 + set line [lindex $v(history) $v(current)] + sqlitecon::SetLine $w $line +} + +# Change the contents of the entry line +# +proc sqlitecon::SetLine {w line} { + upvar #0 $w v + scan [$w index insert] %d.%d row col + set start $row.$v(plength) + $w delete $start end + $w insert end $line + $w mark set insert end + $w yview insert +} + +# Called when the mouse button is pressed at position $x,$y on +# the console widget. +# +proc sqlitecon::Button1 {w x y} { + global tkPriv + upvar #0 $w v + set v(mouseMoved) 0 + set v(pressX) $x + set p [sqlitecon::nearestBoundry $w $x $y] + scan [$w index insert] %d.%d ix iy + scan $p %d.%d px py + if {$px==$ix} { + $w mark set insert $p + } + $w mark set anchor $p + focus $w +} + +# Find the boundry between characters that is nearest +# to $x,$y +# +proc sqlitecon::nearestBoundry {w x y} { + set p [$w index @$x,$y] + set bb [$w bbox $p] + if {![string compare $bb ""]} {return $p} + if {($x-[lindex $bb 0])<([lindex $bb 2]/2)} {return $p} + $w index "$p + 1 char" +} + +# This routine extends the selection to the point specified by $x,$y +# +proc sqlitecon::SelectTo {w x y} { + upvar #0 $w v + set cur [sqlitecon::nearestBoundry $w $x $y] + if {[catch {$w index anchor}]} { + $w mark set anchor $cur + } + set anchor [$w index anchor] + if {[$w compare $cur != $anchor] || (abs($v(pressX) - $x) >= 3)} { + if {$v(mouseMoved)==0} { + $w tag remove sel 0.0 end + } + set v(mouseMoved) 1 + } + if {[$w compare $cur < anchor]} { + set first $cur + set last anchor + } else { + set first anchor + set last $cur + } + if {$v(mouseMoved)} { + $w tag remove sel 0.0 $first + $w tag add sel $first $last + $w tag remove sel $last end + update idletasks + } +} + +# Called whenever the mouse moves while button-1 is held down. +# +proc sqlitecon::B1Motion {w x y} { + upvar #0 $w v + set v(y) $y + set v(x) $x + sqlitecon::SelectTo $w $x $y +} + +# Called whenever the mouse leaves the boundries of the widget +# while button 1 is held down. +# +proc sqlitecon::B1Leave {w x y} { + upvar #0 $w v + set v(y) $y + set v(x) $x + sqlitecon::motor $w +} + +# This routine is called to automatically scroll the window when +# the mouse drags offscreen. +# +proc sqlitecon::motor w { + upvar #0 $w v + if {![winfo exists $w]} return + if {$v(y)>=[winfo height $w]} { + $w yview scroll 1 units + } elseif {$v(y)<0} { + $w yview scroll -1 units + } else { + return + } + sqlitecon::SelectTo $w $v(x) $v(y) + set v(timer) [after 50 sqlitecon::motor $w] +} + +# This routine cancels the scrolling motor if it is active +# +proc sqlitecon::cancelMotor w { + upvar #0 $w v + catch {after cancel $v(timer)} + catch {unset v(timer)} +} + +# Do a Copy operation on the stuff currently selected. +# +proc sqlitecon::Copy w { + if {![catch {set text [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $text + } +} + +# Return 1 if the selection exists and is contained +# entirely on the input line. Return 2 if the selection +# exists but is not entirely on the input line. Return 0 +# if the selection does not exist. +# +proc sqlitecon::canCut w { + set r [catch { + scan [$w index sel.first] %d.%d s1x s1y + scan [$w index sel.last] %d.%d s2x s2y + scan [$w index insert] %d.%d ix iy + }] + if {$r==1} {return 0} + if {$s1x==$ix && $s2x==$ix} {return 1} + return 2 +} + +# Do a Cut operation if possible. Cuts are only allowed +# if the current selection is entirely contained on the +# current input line. +# +proc sqlitecon::Cut w { + if {[sqlitecon::canCut $w]==1} { + sqlitecon::Copy $w + $w delete sel.first sel.last + } +} + +# Do a paste opeation. +# +proc sqlitecon::Paste w { + if {[sqlitecon::canCut $w]==1} { + $w delete sel.first sel.last + } + if {[catch {selection get -displayof $w -selection CLIPBOARD} topaste] + && [catch {selection get -displayof $w -selection PRIMARY} topaste]} { + return + } + if {[info exists ::$w]} { + set prior 0 + foreach line [split $topaste \n] { + if {$prior} { + sqlitecon::Enter $w + update + } + set prior 1 + $w insert insert $line + } + } else { + $w insert insert $topaste + } +} + +# Enable or disable entries in the Edit menu +# +proc sqlitecon::EnableEditMenu w { + upvar #0 $w.t v + set m $v(editmenu) + if {$m=="" || ![winfo exists $m]} return + switch [sqlitecon::canCut $w.t] { + 0 { + $m entryconf Copy -state disabled + $m entryconf Cut -state disabled + } + 1 { + $m entryconf Copy -state normal + $m entryconf Cut -state normal + } + 2 { + $m entryconf Copy -state normal + $m entryconf Cut -state disabled + } + } +} + +# Prompt the user for the name of a writable file. Then write the +# entire contents of the console screen to that file. +# +proc sqlitecon::SaveFile w { + set types { + {{Text Files} {.txt}} + {{All Files} *} + } + set f [tk_getSaveFile -filetypes $types -title "Write Screen To..."] + if {$f!=""} { + if {[catch {open $f w} fd]} { + tk_messageBox -type ok -icon error -message $fd + } else { + puts $fd [string trimright [$w get 1.0 end] \n] + close $fd + } + } +} + +# Erase everything from the console above the insertion line. +# +proc sqlitecon::Clear w { + $w delete 1.0 {insert linestart} +} + +# An in-line editor for SQL +# +proc sqlitecon::_edit {origtxt {title {}}} { + for {set i 0} {[winfo exists .ed$i]} {incr i} continue + set w .ed$i + toplevel $w + wm protocol $w WM_DELETE_WINDOW "$w.b.can invoke" + wm title $w {Inline SQL Editor} + frame $w.b + pack $w.b -side bottom -fill x + button $w.b.can -text Cancel -width 6 -command [list set ::$w 0] + button $w.b.ok -text OK -width 6 -command [list set ::$w 1] + button $w.b.cut -text Cut -width 6 -command [list ::sqlitecon::Cut $w.t] + button $w.b.copy -text Copy -width 6 -command [list ::sqlitecon::Copy $w.t] + button $w.b.paste -text Paste -width 6 -command [list ::sqlitecon::Paste $w.t] + set ::$w {} + pack $w.b.cut $w.b.copy $w.b.paste $w.b.can $w.b.ok\ + -side left -padx 5 -pady 5 -expand 1 + if {$title!=""} { + label $w.title -text $title + pack $w.title -side top -padx 5 -pady 5 + } + text $w.t -bg white -fg black -yscrollcommand [list $w.sb set] + pack $w.t -side left -fill both -expand 1 + scrollbar $w.sb -orient vertical -command [list $w.t yview] + pack $w.sb -side left -fill y + $w.t insert end $origtxt + + vwait ::$w + + if {[set ::$w]} { + set txt [string trimright [$w.t get 1.0 end]] + } else { + set txt $origtxt + } + destroy $w + return $txt +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html b/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html new file mode 100644 index 0000000000..6a4d6dbd2c --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html @@ -0,0 +1,892 @@ + + +The Lemon Parser Generator + + +

      The Lemon Parser Generator

      + +

      Lemon is an LALR(1) parser generator for C or C++. +It does the same job as ``bison'' and ``yacc''. +But lemon is not another bison or yacc clone. It +uses a different grammar syntax which is designed to +reduce the number of coding errors. Lemon also uses a more +sophisticated parsing engine that is faster than yacc and +bison and which is both reentrant and thread-safe. +Furthermore, Lemon implements features that can be used +to eliminate resource leaks, making is suitable for use +in long-running programs such as graphical user interfaces +or embedded controllers.

      + +

      This document is an introduction to the Lemon +parser generator.

      + +

      Theory of Operation

      + +

      The main goal of Lemon is to translate a context free grammar (CFG) +for a particular language into C code that implements a parser for +that language. +The program has two inputs: +

        +
      • The grammar specification. +
      • A parser template file. +
      +Typically, only the grammar specification is supplied by the programmer. +Lemon comes with a default parser template which works fine for most +applications. But the user is free to substitute a different parser +template if desired.

      + +

      Depending on command-line options, Lemon will generate between +one and three files of outputs. +

        +
      • C code to implement the parser. +
      • A header file defining an integer ID for each terminal symbol. +
      • An information file that describes the states of the generated parser + automaton. +
      +By default, all three of these output files are generated. +The header file is suppressed if the ``-m'' command-line option is +used and the report file is omitted when ``-q'' is selected.

      + +

      The grammar specification file uses a ``.y'' suffix, by convention. +In the examples used in this document, we'll assume the name of the +grammar file is ``gram.y''. A typical use of Lemon would be the +following command: +

      +   lemon gram.y
      +
      +This command will generate three output files named ``gram.c'', +``gram.h'' and ``gram.out''. +The first is C code to implement the parser. The second +is the header file that defines numerical values for all +terminal symbols, and the last is the report that explains +the states used by the parser automaton.

      + +

      Command Line Options

      + +

      The behavior of Lemon can be modified using command-line options. +You can obtain a list of the available command-line options together +with a brief explanation of what each does by typing +

      +   lemon -?
      +
      +As of this writing, the following command-line options are supported: +
        +
      • -b +
      • -c +
      • -g +
      • -m +
      • -q +
      • -s +
      • -x +
      +The ``-b'' option reduces the amount of text in the report file by +printing only the basis of each parser state, rather than the full +configuration. +The ``-c'' option suppresses action table compression. Using -c +will make the parser a little larger and slower but it will detect +syntax errors sooner. +The ``-g'' option causes no output files to be generated at all. +Instead, the input grammar file is printed on standard output but +with all comments, actions and other extraneous text deleted. This +is a useful way to get a quick summary of a grammar. +The ``-m'' option causes the output C source file to be compatible +with the ``makeheaders'' program. +Makeheaders is a program that automatically generates header files +from C source code. When the ``-m'' option is used, the header +file is not output since the makeheaders program will take care +of generated all header files automatically. +The ``-q'' option suppresses the report file. +Using ``-s'' causes a brief summary of parser statistics to be +printed. Like this: +
      +   Parser statistics: 74 terminals, 70 nonterminals, 179 rules
      +                      340 states, 2026 parser table entries, 0 conflicts
      +
      +Finally, the ``-x'' option causes Lemon to print its version number +and then stops without attempting to read the grammar or generate a parser.

      + +

      The Parser Interface

      + +

      Lemon doesn't generate a complete, working program. It only generates +a few subroutines that implement a parser. This section describes +the interface to those subroutines. It is up to the programmer to +call these subroutines in an appropriate way in order to produce a +complete system.

      + +

      Before a program begins using a Lemon-generated parser, the program +must first create the parser. +A new parser is created as follows: +

      +   void *pParser = ParseAlloc( malloc );
      +
      +The ParseAlloc() routine allocates and initializes a new parser and +returns a pointer to it. +The actual data structure used to represent a parser is opaque -- +its internal structure is not visible or usable by the calling routine. +For this reason, the ParseAlloc() routine returns a pointer to void +rather than a pointer to some particular structure. +The sole argument to the ParseAlloc() routine is a pointer to the +subroutine used to allocate memory. Typically this means ``malloc()''.

      + +

      After a program is finished using a parser, it can reclaim all +memory allocated by that parser by calling +

      +   ParseFree(pParser, free);
      +
      +The first argument is the same pointer returned by ParseAlloc(). The +second argument is a pointer to the function used to release bulk +memory back to the system.

      + +

      After a parser has been allocated using ParseAlloc(), the programmer +must supply the parser with a sequence of tokens (terminal symbols) to +be parsed. This is accomplished by calling the following function +once for each token: +

      +   Parse(pParser, hTokenID, sTokenData, pArg);
      +
      +The first argument to the Parse() routine is the pointer returned by +ParseAlloc(). +The second argument is a small positive integer that tells the parse the +type of the next token in the data stream. +There is one token type for each terminal symbol in the grammar. +The gram.h file generated by Lemon contains #define statements that +map symbolic terminal symbol names into appropriate integer values. +(A value of 0 for the second argument is a special flag to the +parser to indicate that the end of input has been reached.) +The third argument is the value of the given token. By default, +the type of the third argument is integer, but the grammar will +usually redefine this type to be some kind of structure. +Typically the second argument will be a broad category of tokens +such as ``identifier'' or ``number'' and the third argument will +be the name of the identifier or the value of the number.

      + +

      The Parse() function may have either three or four arguments, +depending on the grammar. If the grammar specification file request +it, the Parse() function will have a fourth parameter that can be +of any type chosen by the programmer. The parser doesn't do anything +with this argument except to pass it through to action routines. +This is a convenient mechanism for passing state information down +to the action routines without having to use global variables.

      + +

      A typical use of a Lemon parser might look something like the +following: +

      +   01 ParseTree *ParseFile(const char *zFilename){
      +   02    Tokenizer *pTokenizer;
      +   03    void *pParser;
      +   04    Token sToken;
      +   05    int hTokenId;
      +   06    ParserState sState;
      +   07
      +   08    pTokenizer = TokenizerCreate(zFilename);
      +   09    pParser = ParseAlloc( malloc );
      +   10    InitParserState(&sState);
      +   11    while( GetNextToken(pTokenizer, &hTokenId, &sToken) ){
      +   12       Parse(pParser, hTokenId, sToken, &sState);
      +   13    }
      +   14    Parse(pParser, 0, sToken, &sState);
      +   15    ParseFree(pParser, free );
      +   16    TokenizerFree(pTokenizer);
      +   17    return sState.treeRoot;
      +   18 }
      +
      +This example shows a user-written routine that parses a file of +text and returns a pointer to the parse tree. +(We've omitted all error-handling from this example to keep it +simple.) +We assume the existence of some kind of tokenizer which is created +using TokenizerCreate() on line 8 and deleted by TokenizerFree() +on line 16. The GetNextToken() function on line 11 retrieves the +next token from the input file and puts its type in the +integer variable hTokenId. The sToken variable is assumed to be +some kind of structure that contains details about each token, +such as its complete text, what line it occurs on, etc.

      + +

      This example also assumes the existence of structure of type +ParserState that holds state information about a particular parse. +An instance of such a structure is created on line 6 and initialized +on line 10. A pointer to this structure is passed into the Parse() +routine as the optional 4th argument. +The action routine specified by the grammar for the parser can use +the ParserState structure to hold whatever information is useful and +appropriate. In the example, we note that the treeRoot field of +the ParserState structure is left pointing to the root of the parse +tree.

      + +

      The core of this example as it relates to Lemon is as follows: +

      +   ParseFile(){
      +      pParser = ParseAlloc( malloc );
      +      while( GetNextToken(pTokenizer,&hTokenId, &sToken) ){
      +         Parse(pParser, hTokenId, sToken);
      +      }
      +      Parse(pParser, 0, sToken);
      +      ParseFree(pParser, free );
      +   }
      +
      +Basically, what a program has to do to use a Lemon-generated parser +is first create the parser, then send it lots of tokens obtained by +tokenizing an input source. When the end of input is reached, the +Parse() routine should be called one last time with a token type +of 0. This step is necessary to inform the parser that the end of +input has been reached. Finally, we reclaim memory used by the +parser by calling ParseFree().

      + +

      There is one other interface routine that should be mentioned +before we move on. +The ParseTrace() function can be used to generate debugging output +from the parser. A prototype for this routine is as follows: +

      +   ParseTrace(FILE *stream, char *zPrefix);
      +
      +After this routine is called, a short (one-line) message is written +to the designated output stream every time the parser changes states +or calls an action routine. Each such message is prefaced using +the text given by zPrefix. This debugging output can be turned off +by calling ParseTrace() again with a first argument of NULL (0).

      + +

      Differences With YACC and BISON

      + +

      Programmers who have previously used the yacc or bison parser +generator will notice several important differences between yacc and/or +bison and Lemon. +

        +
      • In yacc and bison, the parser calls the tokenizer. In Lemon, + the tokenizer calls the parser. +
      • Lemon uses no global variables. Yacc and bison use global variables + to pass information between the tokenizer and parser. +
      • Lemon allows multiple parsers to be running simultaneously. Yacc + and bison do not. +
      +These differences may cause some initial confusion for programmers +with prior yacc and bison experience. +But after years of experience using Lemon, I firmly +believe that the Lemon way of doing things is better.

      + +

      Input File Syntax

      + +

      The main purpose of the grammar specification file for Lemon is +to define the grammar for the parser. But the input file also +specifies additional information Lemon requires to do its job. +Most of the work in using Lemon is in writing an appropriate +grammar file.

      + +

      The grammar file for lemon is, for the most part, free format. +It does not have sections or divisions like yacc or bison. Any +declaration can occur at any point in the file. +Lemon ignores whitespace (except where it is needed to separate +tokens) and it honors the same commenting conventions as C and C++.

      + +

      Terminals and Nonterminals

      + +

      A terminal symbol (token) is any string of alphanumeric +and underscore characters +that begins with an upper case letter. +A terminal can contain lower class letters after the first character, +but the usual convention is to make terminals all upper case. +A nonterminal, on the other hand, is any string of alphanumeric +and underscore characters than begins with a lower case letter. +Again, the usual convention is to make nonterminals use all lower +case letters.

      + +

      In Lemon, terminal and nonterminal symbols do not need to +be declared or identified in a separate section of the grammar file. +Lemon is able to generate a list of all terminals and nonterminals +by examining the grammar rules, and it can always distinguish a +terminal from a nonterminal by checking the case of the first +character of the name.

      + +

      Yacc and bison allow terminal symbols to have either alphanumeric +names or to be individual characters included in single quotes, like +this: ')' or '$'. Lemon does not allow this alternative form for +terminal symbols. With Lemon, all symbols, terminals and nonterminals, +must have alphanumeric names.

      + +

      Grammar Rules

      + +

      The main component of a Lemon grammar file is a sequence of grammar +rules. +Each grammar rule consists of a nonterminal symbol followed by +the special symbol ``::='' and then a list of terminals and/or nonterminals. +The rule is terminated by a period. +The list of terminals and nonterminals on the right-hand side of the +rule can be empty. +Rules can occur in any order, except that the left-hand side of the +first rule is assumed to be the start symbol for the grammar (unless +specified otherwise using the %start directive described below.) +A typical sequence of grammar rules might look something like this: +

      +  expr ::= expr PLUS expr.
      +  expr ::= expr TIMES expr.
      +  expr ::= LPAREN expr RPAREN.
      +  expr ::= VALUE.
      +
      +

      + +

      There is one non-terminal in this example, ``expr'', and five +terminal symbols or tokens: ``PLUS'', ``TIMES'', ``LPAREN'', +``RPAREN'' and ``VALUE''.

      + +

      Like yacc and bison, Lemon allows the grammar to specify a block +of C code that will be executed whenever a grammar rule is reduced +by the parser. +In Lemon, this action is specified by putting the C code (contained +within curly braces {...}) immediately after the +period that closes the rule. +For example: +

      +  expr ::= expr PLUS expr.   { printf("Doing an addition...\n"); }
      +
      +

      + +

      In order to be useful, grammar actions must normally be linked to +their associated grammar rules. +In yacc and bison, this is accomplished by embedding a ``$$'' in the +action to stand for the value of the left-hand side of the rule and +symbols ``$1'', ``$2'', and so forth to stand for the value of +the terminal or nonterminal at position 1, 2 and so forth on the +right-hand side of the rule. +This idea is very powerful, but it is also very error-prone. The +single most common source of errors in a yacc or bison grammar is +to miscount the number of symbols on the right-hand side of a grammar +rule and say ``$7'' when you really mean ``$8''.

      + +

      Lemon avoids the need to count grammar symbols by assigning symbolic +names to each symbol in a grammar rule and then using those symbolic +names in the action. +In yacc or bison, one would write this: +

      +  expr -> expr PLUS expr  { $$ = $1 + $3; };
      +
      +But in Lemon, the same rule becomes the following: +
      +  expr(A) ::= expr(B) PLUS expr(C).  { A = B+C; }
      +
      +In the Lemon rule, any symbol in parentheses after a grammar rule +symbol becomes a place holder for that symbol in the grammar rule. +This place holder can then be used in the associated C action to +stand for the value of that symbol.

      + +

      The Lemon notation for linking a grammar rule with its reduce +action is superior to yacc/bison on several counts. +First, as mentioned above, the Lemon method avoids the need to +count grammar symbols. +Secondly, if a terminal or nonterminal in a Lemon grammar rule +includes a linking symbol in parentheses but that linking symbol +is not actually used in the reduce action, then an error message +is generated. +For example, the rule +

      +  expr(A) ::= expr(B) PLUS expr(C).  { A = B; }
      +
      +will generate an error because the linking symbol ``C'' is used +in the grammar rule but not in the reduce action.

      + +

      The Lemon notation for linking grammar rules to reduce actions +also facilitates the use of destructors for reclaiming memory +allocated by the values of terminals and nonterminals on the +right-hand side of a rule.

      + +

      Precedence Rules

      + +

      Lemon resolves parsing ambiguities in exactly the same way as +yacc and bison. A shift-reduce conflict is resolved in favor +of the shift, and a reduce-reduce conflict is resolved by reducing +whichever rule comes first in the grammar file.

      + +

      Just like in +yacc and bison, Lemon allows a measure of control +over the resolution of paring conflicts using precedence rules. +A precedence value can be assigned to any terminal symbol +using the %left, %right or %nonassoc directives. Terminal symbols +mentioned in earlier directives have a lower precedence that +terminal symbols mentioned in later directives. For example:

      + +

      +   %left AND.
      +   %left OR.
      +   %nonassoc EQ NE GT GE LT LE.
      +   %left PLUS MINUS.
      +   %left TIMES DIVIDE MOD.
      +   %right EXP NOT.
      +

      + +

      In the preceding sequence of directives, the AND operator is +defined to have the lowest precedence. The OR operator is one +precedence level higher. And so forth. Hence, the grammar would +attempt to group the ambiguous expression +

      +     a AND b OR c
      +
      +like this +
      +     a AND (b OR c).
      +
      +The associativity (left, right or nonassoc) is used to determine +the grouping when the precedence is the same. AND is left-associative +in our example, so +
      +     a AND b AND c
      +
      +is parsed like this +
      +     (a AND b) AND c.
      +
      +The EXP operator is right-associative, though, so +
      +     a EXP b EXP c
      +
      +is parsed like this +
      +     a EXP (b EXP c).
      +
      +The nonassoc precedence is used for non-associative operators. +So +
      +     a EQ b EQ c
      +
      +is an error.

      + +

      The precedence of non-terminals is transferred to rules as follows: +The precedence of a grammar rule is equal to the precedence of the +left-most terminal symbol in the rule for which a precedence is +defined. This is normally what you want, but in those cases where +you want to precedence of a grammar rule to be something different, +you can specify an alternative precedence symbol by putting the +symbol in square braces after the period at the end of the rule and +before any C-code. For example:

      + +

      +   expr = MINUS expr.  [NOT]
      +

      + +

      This rule has a precedence equal to that of the NOT symbol, not the +MINUS symbol as would have been the case by default.

      + +

      With the knowledge of how precedence is assigned to terminal +symbols and individual +grammar rules, we can now explain precisely how parsing conflicts +are resolved in Lemon. Shift-reduce conflicts are resolved +as follows: +

        +
      • If either the token to be shifted or the rule to be reduced + lacks precedence information, then resolve in favor of the + shift, but report a parsing conflict. +
      • If the precedence of the token to be shifted is greater than + the precedence of the rule to reduce, then resolve in favor + of the shift. No parsing conflict is reported. +
      • If the precedence of the token it be shifted is less than the + precedence of the rule to reduce, then resolve in favor of the + reduce action. No parsing conflict is reported. +
      • If the precedences are the same and the shift token is + right-associative, then resolve in favor of the shift. + No parsing conflict is reported. +
      • If the precedences are the same the the shift token is + left-associative, then resolve in favor of the reduce. + No parsing conflict is reported. +
      • Otherwise, resolve the conflict by doing the shift and + report the parsing conflict. +
      +Reduce-reduce conflicts are resolved this way: +
        +
      • If either reduce rule + lacks precedence information, then resolve in favor of the + rule that appears first in the grammar and report a parsing + conflict. +
      • If both rules have precedence and the precedence is different + then resolve the dispute in favor of the rule with the highest + precedence and do not report a conflict. +
      • Otherwise, resolve the conflict by reducing by the rule that + appears first in the grammar and report a parsing conflict. +
      + +

      Special Directives

      + +

      The input grammar to Lemon consists of grammar rules and special +directives. We've described all the grammar rules, so now we'll +talk about the special directives.

      + +

      Directives in lemon can occur in any order. You can put them before +the grammar rules, or after the grammar rules, or in the mist of the +grammar rules. It doesn't matter. The relative order of +directives used to assign precedence to terminals is important, but +other than that, the order of directives in Lemon is arbitrary.

      + +

      Lemon supports the following special directives: +

        +
      • %code +
      • %default_destructor +
      • %default_type +
      • %destructor +
      • %extra_argument +
      • %include +
      • %left +
      • %name +
      • %nonassoc +
      • %parse_accept +
      • %parse_failure +
      • %right +
      • %stack_overflow +
      • %stack_size +
      • %start_symbol +
      • %syntax_error +
      • %token_destructor +
      • %token_prefix +
      • %token_type +
      • %type +
      +Each of these directives will be described separately in the +following sections:

      + +

      The %code directive

      + +

      The %code directive is used to specify addition C/C++ code that +is added to the end of the main output file. This is similar to +the %include directive except that %include is inserted at the +beginning of the main output file.

      + +

      %code is typically used to include some action routines or perhaps +a tokenizer as part of the output file.

      + +

      The %default_destructor directive

      + +

      The %default_destructor directive specifies a destructor to +use for non-terminals that do not have their own destructor +specified by a separate %destructor directive. See the documentation +on the %destructor directive below for additional information.

      + +

      In some grammers, many different non-terminal symbols have the +same datatype and hence the same destructor. This directive is +a convenience way to specify the same destructor for all those +non-terminals using a single statement.

      + +

      The %default_type directive

      + +

      The %default_type directive specifies the datatype of non-terminal +symbols that do no have their own datatype defined using a separate +%type directive. See the documentation on %type below for addition +information.

      + +

      The %destructor directive

      + +

      The %destructor directive is used to specify a destructor for +a non-terminal symbol. +(See also the %token_destructor directive which is used to +specify a destructor for terminal symbols.)

      + +

      A non-terminal's destructor is called to dispose of the +non-terminal's value whenever the non-terminal is popped from +the stack. This includes all of the following circumstances: +

        +
      • When a rule reduces and the value of a non-terminal on + the right-hand side is not linked to C code. +
      • When the stack is popped during error processing. +
      • When the ParseFree() function runs. +
      +The destructor can do whatever it wants with the value of +the non-terminal, but its design is to deallocate memory +or other resources held by that non-terminal.

      + +

      Consider an example: +

      +   %type nt {void*}
      +   %destructor nt { free($$); }
      +   nt(A) ::= ID NUM.   { A = malloc( 100 ); }
      +
      +This example is a bit contrived but it serves to illustrate how +destructors work. The example shows a non-terminal named +``nt'' that holds values of type ``void*''. When the rule for +an ``nt'' reduces, it sets the value of the non-terminal to +space obtained from malloc(). Later, when the nt non-terminal +is popped from the stack, the destructor will fire and call +free() on this malloced space, thus avoiding a memory leak. +(Note that the symbol ``$$'' in the destructor code is replaced +by the value of the non-terminal.)

      + +

      It is important to note that the value of a non-terminal is passed +to the destructor whenever the non-terminal is removed from the +stack, unless the non-terminal is used in a C-code action. If +the non-terminal is used by C-code, then it is assumed that the +C-code will take care of destroying it if it should really +be destroyed. More commonly, the value is used to build some +larger structure and we don't want to destroy it, which is why +the destructor is not called in this circumstance.

      + +

      By appropriate use of destructors, it is possible to +build a parser using Lemon that can be used within a long-running +program, such as a GUI, that will not leak memory or other resources. +To do the same using yacc or bison is much more difficult.

      + +

      The %extra_argument directive

      + +The %extra_argument directive instructs Lemon to add a 4th parameter +to the parameter list of the Parse() function it generates. Lemon +doesn't do anything itself with this extra argument, but it does +make the argument available to C-code action routines, destructors, +and so forth. For example, if the grammar file contains:

      + +

      +    %extra_argument { MyStruct *pAbc }
      +

      + +

      Then the Parse() function generated will have an 4th parameter +of type ``MyStruct*'' and all action routines will have access to +a variable named ``pAbc'' that is the value of the 4th parameter +in the most recent call to Parse().

      + +

      The %include directive

      + +

      The %include directive specifies C code that is included at the +top of the generated parser. You can include any text you want -- +the Lemon parser generator copies it blindly. If you have multiple +%include directives in your grammar file the value of the last +%include directive overwrites all the others.The %include directive is very handy for getting some extra #include +preprocessor statements at the beginning of the generated parser. +For example:

      + +

      +   %include {#include <unistd.h>}
      +

      + +

      This might be needed, for example, if some of the C actions in the +grammar call functions that are prototyed in unistd.h.

      + +

      The %left directive

      + +The %left directive is used (along with the %right and +%nonassoc directives) to declare precedences of terminal +symbols. Every terminal symbol whose name appears after +a %left directive but before the next period (``.'') is +given the same left-associative precedence value. Subsequent +%left directives have higher precedence. For example:

      + +

      +   %left AND.
      +   %left OR.
      +   %nonassoc EQ NE GT GE LT LE.
      +   %left PLUS MINUS.
      +   %left TIMES DIVIDE MOD.
      +   %right EXP NOT.
      +

      + +

      Note the period that terminates each %left, %right or %nonassoc +directive.

      + +

      LALR(1) grammars can get into a situation where they require +a large amount of stack space if you make heavy use or right-associative +operators. For this reason, it is recommended that you use %left +rather than %right whenever possible.

      + +

      The %name directive

      + +

      By default, the functions generated by Lemon all begin with the +five-character string ``Parse''. You can change this string to something +different using the %name directive. For instance:

      + +

      +   %name Abcde
      +

      + +

      Putting this directive in the grammar file will cause Lemon to generate +functions named +

        +
      • AbcdeAlloc(), +
      • AbcdeFree(), +
      • AbcdeTrace(), and +
      • Abcde(). +
      +The %name directive allows you to generator two or more different +parsers and link them all into the same executable. +

      + +

      The %nonassoc directive

      + +

      This directive is used to assign non-associative precedence to +one or more terminal symbols. See the section on precedence rules +or on the %left directive for additional information.

      + +

      The %parse_accept directive

      + +

      The %parse_accept directive specifies a block of C code that is +executed whenever the parser accepts its input string. To ``accept'' +an input string means that the parser was able to process all tokens +without error.

      + +

      For example:

      + +

      +   %parse_accept {
      +      printf("parsing complete!\n");
      +   }
      +

      + + +

      The %parse_failure directive

      + +

      The %parse_failure directive specifies a block of C code that +is executed whenever the parser fails complete. This code is not +executed until the parser has tried and failed to resolve an input +error using is usual error recovery strategy. The routine is +only invoked when parsing is unable to continue.

      + +

      +   %parse_failure {
      +     fprintf(stderr,"Giving up.  Parser is hopelessly lost...\n");
      +   }
      +

      + +

      The %right directive

      + +

      This directive is used to assign right-associative precedence to +one or more terminal symbols. See the section on precedence rules +or on the %left directive for additional information.

      + +

      The %stack_overflow directive

      + +

      The %stack_overflow directive specifies a block of C code that +is executed if the parser's internal stack ever overflows. Typically +this just prints an error message. After a stack overflow, the parser +will be unable to continue and must be reset.

      + +

      +   %stack_overflow {
      +     fprintf(stderr,"Giving up.  Parser stack overflow\n");
      +   }
      +

      + +

      You can help prevent parser stack overflows by avoiding the use +of right recursion and right-precedence operators in your grammar. +Use left recursion and and left-precedence operators instead, to +encourage rules to reduce sooner and keep the stack size down. +For example, do rules like this: +

      +   list ::= list element.      // left-recursion.  Good!
      +   list ::= .
      +
      +Not like this: +
      +   list ::= element list.      // right-recursion.  Bad!
      +   list ::= .
      +
      + +

      The %stack_size directive

      + +

      If stack overflow is a problem and you can't resolve the trouble +by using left-recursion, then you might want to increase the size +of the parser's stack using this directive. Put an positive integer +after the %stack_size directive and Lemon will generate a parse +with a stack of the requested size. The default value is 100.

      + +

      +   %stack_size 2000
      +

      + +

      The %start_symbol directive

      + +

      By default, the start-symbol for the grammar that Lemon generates +is the first non-terminal that appears in the grammar file. But you +can choose a different start-symbol using the %start_symbol directive.

      + +

      +   %start_symbol  prog
      +

      + +

      The %token_destructor directive

      + +

      The %destructor directive assigns a destructor to a non-terminal +symbol. (See the description of the %destructor directive above.) +This directive does the same thing for all terminal symbols.

      + +

      Unlike non-terminal symbols which may each have a different data type +for their values, terminals all use the same data type (defined by +the %token_type directive) and so they use a common destructor. Other +than that, the token destructor works just like the non-terminal +destructors.

      + +

      The %token_prefix directive

      + +

      Lemon generates #defines that assign small integer constants +to each terminal symbol in the grammar. If desired, Lemon will +add a prefix specified by this directive +to each of the #defines it generates. +So if the default output of Lemon looked like this: +

      +    #define AND              1
      +    #define MINUS            2
      +    #define OR               3
      +    #define PLUS             4
      +
      +You can insert a statement into the grammar like this: +
      +    %token_prefix    TOKEN_
      +
      +to cause Lemon to produce these symbols instead: +
      +    #define TOKEN_AND        1
      +    #define TOKEN_MINUS      2
      +    #define TOKEN_OR         3
      +    #define TOKEN_PLUS       4
      +
      + +

      The %token_type and %type directives

      + +

      These directives are used to specify the data types for values +on the parser's stack associated with terminal and non-terminal +symbols. The values of all terminal symbols must be of the same +type. This turns out to be the same data type as the 3rd parameter +to the Parse() function generated by Lemon. Typically, you will +make the value of a terminal symbol by a pointer to some kind of +token structure. Like this:

      + +

      +   %token_type    {Token*}
      +

      + +

      If the data type of terminals is not specified, the default value +is ``int''.

      + +

      Non-terminal symbols can each have their own data types. Typically +the data type of a non-terminal is a pointer to the root of a parse-tree +structure that contains all information about that non-terminal. +For example:

      + +

      +   %type   expr  {Expr*}
      +

      + +

      Each entry on the parser's stack is actually a union containing +instances of all data types for every non-terminal and terminal symbol. +Lemon will automatically use the correct element of this union depending +on what the corresponding non-terminal or terminal symbol is. But +the grammar designer should keep in mind that the size of the union +will be the size of its largest element. So if you have a single +non-terminal whose data type requires 1K of storage, then your 100 +entry parser stack will require 100K of heap space. If you are willing +and able to pay that price, fine. You just need to know.

      + +

      Error Processing

      + +

      After extensive experimentation over several years, it has been +discovered that the error recovery strategy used by yacc is about +as good as it gets. And so that is what Lemon uses.

      + +

      When a Lemon-generated parser encounters a syntax error, it +first invokes the code specified by the %syntax_error directive, if +any. It then enters its error recovery strategy. The error recovery +strategy is to begin popping the parsers stack until it enters a +state where it is permitted to shift a special non-terminal symbol +named ``error''. It then shifts this non-terminal and continues +parsing. But the %syntax_error routine will not be called again +until at least three new tokens have been successfully shifted.

      + +

      If the parser pops its stack until the stack is empty, and it still +is unable to shift the error symbol, then the %parse_failed routine +is invoked and the parser resets itself to its start state, ready +to begin parsing a new file. This is what will happen at the very +first syntax error, of course, if there are no instances of the +``error'' non-terminal in your grammar.

      + + + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt b/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt new file mode 100644 index 0000000000..a236e7cedf --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt @@ -0,0 +1,121 @@ +An SQLite (version 1.0) database was used in a large military application +where the database contained 105 tables and indices. The following is +a breakdown on the sizes of keys and data within these tables and indices: + +Entries: 967089 +Size: 45896104 +Avg Size: 48 +Key Size: 11112265 +Avg Key Size: 12 +Max Key Size: 99 + + 0..8 263 0% + 9..12 5560 0% + 13..16 71394 7% + 17..24 180717 26% + 25..32 215442 48% + 33..40 151118 64% + 41..48 77479 72% + 49..56 13983 74% + 57..64 14481 75% + 65..80 41342 79% + 81..96 127098 92% + 97..112 38054 96% + 113..128 14197 98% + 129..144 8208 99% + 145..160 3326 99% + 161..176 1242 99% + 177..192 604 99% + 193..208 222 99% + 209..224 213 99% + 225..240 132 99% + 241..256 58 99% + 257..288 515 99% + 289..320 64 99% + 321..352 39 99% + 353..384 44 99% + 385..416 25 99% + 417..448 24 99% + 449..480 26 99% + 481..512 27 99% + 513..1024 470 99% + 1025..2048 396 99% + 2049..4096 187 99% + 4097..8192 78 99% + 8193..16384 35 99% +16385..32768 17 99% +32769..65536 6 99% +65537..65541 3 100% + +If the indices are omitted, the statistics for the 49 tables +become the following: + +Entries: 451103 +Size: 30930282 +Avg Size: 69 +Key Size: 1804412 +Avg Key Size: 4 +Max Key Size: 4 + + 0..24 89 0% + 25..32 9417 2% + 33..40 119162 28% + 41..48 68710 43% + 49..56 9539 45% + 57..64 12435 48% + 65..80 38650 57% + 81..96 126877 85% + 97..112 38030 93% + 113..128 14183 96% + 129..144 7668 98% + 145..160 3302 99% + 161..176 1238 99% + 177..192 597 99% + 193..208 217 99% + 209..224 211 99% + 225..240 130 99% + 241..256 57 99% + 257..288 100 99% + 289..320 62 99% + 321..352 34 99% + 353..384 43 99% + 385..416 24 99% + 417..448 24 99% + 449..480 25 99% + 481..512 27 99% + 513..1024 153 99% + 1025..2048 92 99% + 2049..4096 7 100% + +The 56 indices have these statistics: + +Entries: 512422 +Size: 14879828 +Avg Size: 30 +Key Size: 9253204 +Avg Key Size: 19 +Max Key Size: 99 + + 0..8 246 0% + 9..12 5486 1% + 13..16 70717 14% + 17..24 178246 49% + 25..32 205722 89% + 33..40 31951 96% + 41..48 8768 97% + 49..56 4444 98% + 57..64 2046 99% + 65..80 2691 99% + 81..96 202 99% + 97..112 11 99% + 113..144 527 99% + 145..160 20 99% + 161..288 406 99% + 289..1024 316 99% + 1025..2048 304 99% + 2049..4096 180 99% + 4097..8192 78 99% + 8193..16384 35 99% +16385..32768 17 99% +32769..65536 6 99% +65537..65541 3 100% diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt new file mode 100644 index 0000000000..009495f59d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt @@ -0,0 +1,2 @@ +Version loadable extensions to SQLite are found in subfolders +of this folder. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt new file mode 100644 index 0000000000..292b7daa0b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt @@ -0,0 +1,2 @@ +This folder contains source code to the first full-text search +extension for SQLite. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c new file mode 100644 index 0000000000..5a69965d47 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c @@ -0,0 +1,3344 @@ +/* fts1 has a design flaw which can lead to database corruption (see +** below). It is recommended not to use it any longer, instead use +** fts3 (or higher). If you believe that your use of fts1 is safe, +** add -DSQLITE_ENABLE_BROKEN_FTS1=1 to your CFLAGS. +*/ +#ifndef SQLITE_ENABLE_BROKEN_FTS1 +#error fts1 has a design flaw and has been deprecated. +#endif +/* The flaw is that fts1 uses the content table's unaliased rowid as +** the unique docid. fts1 embeds the rowid in the index it builds, +** and expects the rowid to not change. The SQLite VACUUM operation +** will renumber such rowids, thereby breaking fts1. If you are using +** fts1 in a system which has disabled VACUUM, then you can continue +** to use it safely. Note that PRAGMA auto_vacuum does NOT disable +** VACUUM, though systems using auto_vacuum are unlikely to invoke +** VACUUM. +** +** fts1 should be safe even across VACUUM if you only insert documents +** and never delete. +*/ + +/* The author disclaims copyright to this source code. + * + * This is an SQLite module implementing full-text search. + */ + +/* +** The code in this file is only compiled if: +** +** * The FTS1 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS1 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) + +#if defined(SQLITE_ENABLE_FTS1) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +#include +#include +#include +#include +#include + +#include "fts1.h" +#include "fts1_hash.h" +#include "fts1_tokenizer.h" +#include "sqlite3.h" +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + + +#if 0 +# define TRACE(A) printf A; fflush(stdout) +#else +# define TRACE(A) +#endif + +/* utility functions */ + +typedef struct StringBuffer { + int len; /* length, not including null terminator */ + int alloced; /* Space allocated for s[] */ + char *s; /* Content of the string */ +} StringBuffer; + +static void initStringBuffer(StringBuffer *sb){ + sb->len = 0; + sb->alloced = 100; + sb->s = malloc(100); + sb->s[0] = '\0'; +} + +static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ + if( sb->len + nFrom >= sb->alloced ){ + sb->alloced = sb->len + nFrom + 100; + sb->s = realloc(sb->s, sb->alloced+1); + if( sb->s==0 ){ + initStringBuffer(sb); + return; + } + } + memcpy(sb->s + sb->len, zFrom, nFrom); + sb->len += nFrom; + sb->s[sb->len] = 0; +} +static void append(StringBuffer *sb, const char *zFrom){ + nappend(sb, zFrom, strlen(zFrom)); +} + +/* We encode variable-length integers in little-endian order using seven bits + * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +*/ + +/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ +#define VARINT_MAX 10 + +/* Write a 64-bit variable-length integer to memory starting at p[0]. + * The length of data written will be between 1 and VARINT_MAX bytes. + * The number of bytes written is returned. */ +static int putVarint(char *p, sqlite_int64 v){ + unsigned char *q = (unsigned char *) p; + sqlite_uint64 vu = v; + do{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +/* Read a 64-bit variable-length integer from memory starting at p[0]. + * Return the number of bytes read, or 0 on error. + * The value is stored in *v. */ +static int getVarint(const char *p, sqlite_int64 *v){ + const unsigned char *q = (const unsigned char *) p; + sqlite_uint64 x = 0, y = 1; + while( (*q & 0x80) == 0x80 ){ + x += y * (*q++ & 0x7f); + y <<= 7; + if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ + assert( 0 ); + return 0; + } + } + x += y * (*q++); + *v = (sqlite_int64) x; + return (int) (q - (unsigned char *)p); +} + +static int getVarint32(const char *p, int *pi){ + sqlite_int64 i; + int ret = getVarint(p, &i); + *pi = (int) i; + assert( *pi==i ); + return ret; +} + +/*** Document lists *** + * + * A document list holds a sorted list of varint-encoded document IDs. + * + * A doclist with type DL_POSITIONS_OFFSETS is stored like this: + * + * array { + * varint docid; + * array { + * varint position; (delta from previous position plus POS_BASE) + * varint startOffset; (delta from previous startOffset) + * varint endOffset; (delta from startOffset) + * } + * } + * + * Here, array { X } means zero or more occurrences of X, adjacent in memory. + * + * A position list may hold positions for text in multiple columns. A position + * POS_COLUMN is followed by a varint containing the index of the column for + * following positions in the list. Any positions appearing before any + * occurrences of POS_COLUMN are for column 0. + * + * A doclist with type DL_POSITIONS is like the above, but holds only docids + * and positions without offset information. + * + * A doclist with type DL_DOCIDS is like the above, but holds only docids + * without positions or offset information. + * + * On disk, every document list has positions and offsets, so we don't bother + * to serialize a doclist's type. + * + * We don't yet delta-encode document IDs; doing so will probably be a + * modest win. + * + * NOTE(shess) I've thought of a slightly (1%) better offset encoding. + * After the first offset, estimate the next offset by using the + * current token position and the previous token position and offset, + * offset to handle some variance. So the estimate would be + * (iPosition*w->iStartOffset/w->iPosition-64), which is delta-encoded + * as normal. Offsets more than 64 chars from the estimate are + * encoded as the delta to the previous start offset + 128. An + * additional tiny increment can be gained by using the end offset of + * the previous token to make the estimate a tiny bit more precise. +*/ + +/* It is not safe to call isspace(), tolower(), or isalnum() on +** hi-bit-set characters. This is the same solution used in the +** tokenizer. +*/ +/* TODO(shess) The snippet-generation code should be using the +** tokenizer-generated tokens rather than doing its own local +** tokenization. +*/ +/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ +static int safe_isspace(char c){ + return (c&0x80)==0 ? isspace(c) : 0; +} +static int safe_tolower(char c){ + return (c&0x80)==0 ? tolower(c) : c; +} +static int safe_isalnum(char c){ + return (c&0x80)==0 ? isalnum(c) : 0; +} + +typedef enum DocListType { + DL_DOCIDS, /* docids only */ + DL_POSITIONS, /* docids + positions */ + DL_POSITIONS_OFFSETS /* docids + positions + offsets */ +} DocListType; + +/* +** By default, only positions and not offsets are stored in the doclists. +** To change this so that offsets are stored too, compile with +** +** -DDL_DEFAULT=DL_POSITIONS_OFFSETS +** +*/ +#ifndef DL_DEFAULT +# define DL_DEFAULT DL_POSITIONS +#endif + +typedef struct DocList { + char *pData; + int nData; + DocListType iType; + int iLastColumn; /* the last column written */ + int iLastPos; /* the last position written */ + int iLastOffset; /* the last start offset written */ +} DocList; + +enum { + POS_END = 0, /* end of this position list */ + POS_COLUMN, /* followed by new column number */ + POS_BASE +}; + +/* Initialize a new DocList to hold the given data. */ +static void docListInit(DocList *d, DocListType iType, + const char *pData, int nData){ + d->nData = nData; + if( nData>0 ){ + d->pData = malloc(nData); + memcpy(d->pData, pData, nData); + } else { + d->pData = NULL; + } + d->iType = iType; + d->iLastColumn = 0; + d->iLastPos = d->iLastOffset = 0; +} + +/* Create a new dynamically-allocated DocList. */ +static DocList *docListNew(DocListType iType){ + DocList *d = (DocList *) malloc(sizeof(DocList)); + docListInit(d, iType, 0, 0); + return d; +} + +static void docListDestroy(DocList *d){ + free(d->pData); +#ifndef NDEBUG + memset(d, 0x55, sizeof(*d)); +#endif +} + +static void docListDelete(DocList *d){ + docListDestroy(d); + free(d); +} + +static char *docListEnd(DocList *d){ + return d->pData + d->nData; +} + +/* Append a varint to a DocList's data. */ +static void appendVarint(DocList *d, sqlite_int64 i){ + char c[VARINT_MAX]; + int n = putVarint(c, i); + d->pData = realloc(d->pData, d->nData + n); + memcpy(d->pData + d->nData, c, n); + d->nData += n; +} + +static void docListAddDocid(DocList *d, sqlite_int64 iDocid){ + appendVarint(d, iDocid); + if( d->iType>=DL_POSITIONS ){ + appendVarint(d, POS_END); /* initially empty position list */ + d->iLastColumn = 0; + d->iLastPos = d->iLastOffset = 0; + } +} + +/* helper function for docListAddPos and docListAddPosOffset */ +static void addPos(DocList *d, int iColumn, int iPos){ + assert( d->nData>0 ); + --d->nData; /* remove previous terminator */ + if( iColumn!=d->iLastColumn ){ + assert( iColumn>d->iLastColumn ); + appendVarint(d, POS_COLUMN); + appendVarint(d, iColumn); + d->iLastColumn = iColumn; + d->iLastPos = d->iLastOffset = 0; + } + assert( iPos>=d->iLastPos ); + appendVarint(d, iPos-d->iLastPos+POS_BASE); + d->iLastPos = iPos; +} + +/* Add a position to the last position list in a doclist. */ +static void docListAddPos(DocList *d, int iColumn, int iPos){ + assert( d->iType==DL_POSITIONS ); + addPos(d, iColumn, iPos); + appendVarint(d, POS_END); /* add new terminator */ +} + +/* +** Add a position and starting and ending offsets to a doclist. +** +** If the doclist is setup to handle only positions, then insert +** the position only and ignore the offsets. +*/ +static void docListAddPosOffset( + DocList *d, /* Doclist under construction */ + int iColumn, /* Column the inserted term is part of */ + int iPos, /* Position of the inserted term */ + int iStartOffset, /* Starting offset of inserted term */ + int iEndOffset /* Ending offset of inserted term */ +){ + assert( d->iType>=DL_POSITIONS ); + addPos(d, iColumn, iPos); + if( d->iType==DL_POSITIONS_OFFSETS ){ + assert( iStartOffset>=d->iLastOffset ); + appendVarint(d, iStartOffset-d->iLastOffset); + d->iLastOffset = iStartOffset; + assert( iEndOffset>=iStartOffset ); + appendVarint(d, iEndOffset-iStartOffset); + } + appendVarint(d, POS_END); /* add new terminator */ +} + +/* +** A DocListReader object is a cursor into a doclist. Initialize +** the cursor to the beginning of the doclist by calling readerInit(). +** Then use routines +** +** peekDocid() +** readDocid() +** readPosition() +** skipPositionList() +** and so forth... +** +** to read information out of the doclist. When we reach the end +** of the doclist, atEnd() returns TRUE. +*/ +typedef struct DocListReader { + DocList *pDoclist; /* The document list we are stepping through */ + char *p; /* Pointer to next unread byte in the doclist */ + int iLastColumn; + int iLastPos; /* the last position read, or -1 when not in a position list */ +} DocListReader; + +/* +** Initialize the DocListReader r to point to the beginning of pDoclist. +*/ +static void readerInit(DocListReader *r, DocList *pDoclist){ + r->pDoclist = pDoclist; + if( pDoclist!=NULL ){ + r->p = pDoclist->pData; + } + r->iLastColumn = -1; + r->iLastPos = -1; +} + +/* +** Return TRUE if we have reached then end of pReader and there is +** nothing else left to read. +*/ +static int atEnd(DocListReader *pReader){ + return pReader->pDoclist==0 || (pReader->p >= docListEnd(pReader->pDoclist)); +} + +/* Peek at the next docid without advancing the read pointer. +*/ +static sqlite_int64 peekDocid(DocListReader *pReader){ + sqlite_int64 ret; + assert( !atEnd(pReader) ); + assert( pReader->iLastPos==-1 ); + getVarint(pReader->p, &ret); + return ret; +} + +/* Read the next docid. See also nextDocid(). +*/ +static sqlite_int64 readDocid(DocListReader *pReader){ + sqlite_int64 ret; + assert( !atEnd(pReader) ); + assert( pReader->iLastPos==-1 ); + pReader->p += getVarint(pReader->p, &ret); + if( pReader->pDoclist->iType>=DL_POSITIONS ){ + pReader->iLastColumn = 0; + pReader->iLastPos = 0; + } + return ret; +} + +/* Read the next position and column index from a position list. + * Returns the position, or -1 at the end of the list. */ +static int readPosition(DocListReader *pReader, int *iColumn){ + int i; + int iType = pReader->pDoclist->iType; + + if( pReader->iLastPos==-1 ){ + return -1; + } + assert( !atEnd(pReader) ); + + if( iTypep += getVarint32(pReader->p, &i); + if( i==POS_END ){ + pReader->iLastColumn = pReader->iLastPos = -1; + *iColumn = -1; + return -1; + } + if( i==POS_COLUMN ){ + pReader->p += getVarint32(pReader->p, &pReader->iLastColumn); + pReader->iLastPos = 0; + pReader->p += getVarint32(pReader->p, &i); + assert( i>=POS_BASE ); + } + pReader->iLastPos += ((int) i)-POS_BASE; + if( iType>=DL_POSITIONS_OFFSETS ){ + /* Skip over offsets, ignoring them for now. */ + int iStart, iEnd; + pReader->p += getVarint32(pReader->p, &iStart); + pReader->p += getVarint32(pReader->p, &iEnd); + } + *iColumn = pReader->iLastColumn; + return pReader->iLastPos; +} + +/* Skip past the end of a position list. */ +static void skipPositionList(DocListReader *pReader){ + DocList *p = pReader->pDoclist; + if( p && p->iType>=DL_POSITIONS ){ + int iColumn; + while( readPosition(pReader, &iColumn)!=-1 ){} + } +} + +/* Skip over a docid, including its position list if the doclist has + * positions. */ +static void skipDocument(DocListReader *pReader){ + readDocid(pReader); + skipPositionList(pReader); +} + +/* Skip past all docids which are less than [iDocid]. Returns 1 if a docid + * matching [iDocid] was found. */ +static int skipToDocid(DocListReader *pReader, sqlite_int64 iDocid){ + sqlite_int64 d = 0; + while( !atEnd(pReader) && (d=peekDocid(pReader))iType>=DL_POSITIONS ){ + int iPos, iCol; + const char *zDiv = ""; + printf("("); + while( (iPos = readPosition(&r, &iCol))>=0 ){ + printf("%s%d:%d", zDiv, iCol, iPos); + zDiv = ":"; + } + printf(")"); + } + } + printf("\n"); + fflush(stdout); +} +#endif /* SQLITE_DEBUG */ + +/* Trim the given doclist to contain only positions in column + * [iRestrictColumn]. */ +static void docListRestrictColumn(DocList *in, int iRestrictColumn){ + DocListReader r; + DocList out; + + assert( in->iType>=DL_POSITIONS ); + readerInit(&r, in); + docListInit(&out, DL_POSITIONS, NULL, 0); + + while( !atEnd(&r) ){ + sqlite_int64 iDocid = readDocid(&r); + int iPos, iColumn; + + docListAddDocid(&out, iDocid); + while( (iPos = readPosition(&r, &iColumn)) != -1 ){ + if( iColumn==iRestrictColumn ){ + docListAddPos(&out, iColumn, iPos); + } + } + } + + docListDestroy(in); + *in = out; +} + +/* Trim the given doclist by discarding any docids without any remaining + * positions. */ +static void docListDiscardEmpty(DocList *in) { + DocListReader r; + DocList out; + + /* TODO: It would be nice to implement this operation in place; that + * could save a significant amount of memory in queries with long doclists. */ + assert( in->iType>=DL_POSITIONS ); + readerInit(&r, in); + docListInit(&out, DL_POSITIONS, NULL, 0); + + while( !atEnd(&r) ){ + sqlite_int64 iDocid = readDocid(&r); + int match = 0; + int iPos, iColumn; + while( (iPos = readPosition(&r, &iColumn)) != -1 ){ + if( !match ){ + docListAddDocid(&out, iDocid); + match = 1; + } + docListAddPos(&out, iColumn, iPos); + } + } + + docListDestroy(in); + *in = out; +} + +/* Helper function for docListUpdate() and docListAccumulate(). +** Splices a doclist element into the doclist represented by r, +** leaving r pointing after the newly spliced element. +*/ +static void docListSpliceElement(DocListReader *r, sqlite_int64 iDocid, + const char *pSource, int nSource){ + DocList *d = r->pDoclist; + char *pTarget; + int nTarget, found; + + found = skipToDocid(r, iDocid); + + /* Describe slice in d to place pSource/nSource. */ + pTarget = r->p; + if( found ){ + skipDocument(r); + nTarget = r->p-pTarget; + }else{ + nTarget = 0; + } + + /* The sense of the following is that there are three possibilities. + ** If nTarget==nSource, we should not move any memory nor realloc. + ** If nTarget>nSource, trim target and realloc. + ** If nTargetnSource ){ + memmove(pTarget+nSource, pTarget+nTarget, docListEnd(d)-(pTarget+nTarget)); + } + if( nTarget!=nSource ){ + int iDoclist = pTarget-d->pData; + d->pData = realloc(d->pData, d->nData+nSource-nTarget); + pTarget = d->pData+iDoclist; + } + if( nTargetnData += nSource-nTarget; + r->p = pTarget+nSource; +} + +/* Insert/update pUpdate into the doclist. */ +static void docListUpdate(DocList *d, DocList *pUpdate){ + DocListReader reader; + + assert( d!=NULL && pUpdate!=NULL ); + assert( d->iType==pUpdate->iType); + + readerInit(&reader, d); + docListSpliceElement(&reader, firstDocid(pUpdate), + pUpdate->pData, pUpdate->nData); +} + +/* Propagate elements from pUpdate to pAcc, overwriting elements with +** matching docids. +*/ +static void docListAccumulate(DocList *pAcc, DocList *pUpdate){ + DocListReader accReader, updateReader; + + /* Handle edge cases where one doclist is empty. */ + assert( pAcc!=NULL ); + if( pUpdate==NULL || pUpdate->nData==0 ) return; + if( pAcc->nData==0 ){ + pAcc->pData = malloc(pUpdate->nData); + memcpy(pAcc->pData, pUpdate->pData, pUpdate->nData); + pAcc->nData = pUpdate->nData; + return; + } + + readerInit(&accReader, pAcc); + readerInit(&updateReader, pUpdate); + + while( !atEnd(&updateReader) ){ + char *pSource = updateReader.p; + sqlite_int64 iDocid = readDocid(&updateReader); + skipPositionList(&updateReader); + docListSpliceElement(&accReader, iDocid, pSource, updateReader.p-pSource); + } +} + +/* +** Read the next docid off of pIn. Return 0 if we reach the end. +* +* TODO: This assumes that docids are never 0, but they may actually be 0 since +* users can choose docids when inserting into a full-text table. Fix this. +*/ +static sqlite_int64 nextDocid(DocListReader *pIn){ + skipPositionList(pIn); + return atEnd(pIn) ? 0 : readDocid(pIn); +} + +/* +** pLeft and pRight are two DocListReaders that are pointing to +** positions lists of the same document: iDocid. +** +** If there are no instances in pLeft or pRight where the position +** of pLeft is one less than the position of pRight, then this +** routine adds nothing to pOut. +** +** If there are one or more instances where positions from pLeft +** are exactly one less than positions from pRight, then add a new +** document record to pOut. If pOut wants to hold positions, then +** include the positions from pRight that are one more than a +** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. +** +** pLeft and pRight are left pointing at the next document record. +*/ +static void mergePosList( + DocListReader *pLeft, /* Left position list */ + DocListReader *pRight, /* Right position list */ + sqlite_int64 iDocid, /* The docid from pLeft and pRight */ + DocList *pOut /* Write the merged document record here */ +){ + int iLeftCol, iLeftPos = readPosition(pLeft, &iLeftCol); + int iRightCol, iRightPos = readPosition(pRight, &iRightCol); + int match = 0; + + /* Loop until we've reached the end of both position lists. */ + while( iLeftPos!=-1 && iRightPos!=-1 ){ + if( iLeftCol==iRightCol && iLeftPos+1==iRightPos ){ + if( !match ){ + docListAddDocid(pOut, iDocid); + match = 1; + } + if( pOut->iType>=DL_POSITIONS ){ + docListAddPos(pOut, iRightCol, iRightPos); + } + iLeftPos = readPosition(pLeft, &iLeftCol); + iRightPos = readPosition(pRight, &iRightCol); + }else if( iRightCol=0 ) skipPositionList(pLeft); + if( iRightPos>=0 ) skipPositionList(pRight); +} + +/* We have two doclists: pLeft and pRight. +** Write the phrase intersection of these two doclists into pOut. +** +** A phrase intersection means that two documents only match +** if pLeft.iPos+1==pRight.iPos. +** +** The output pOut may or may not contain positions. If pOut +** does contain positions, they are the positions of pRight. +*/ +static void docListPhraseMerge( + DocList *pLeft, /* Doclist resulting from the words on the left */ + DocList *pRight, /* Doclist for the next word to the right */ + DocList *pOut /* Write the combined doclist here */ +){ + DocListReader left, right; + sqlite_int64 docidLeft, docidRight; + + readerInit(&left, pLeft); + readerInit(&right, pRight); + docidLeft = nextDocid(&left); + docidRight = nextDocid(&right); + + while( docidLeft>0 && docidRight>0 ){ + if( docidLeftiType0 && docidRight>0 ){ + if( docidLeft0 && docidRight>0 ){ + if( docidLeft<=docidRight ){ + docListAddDocid(pOut, docidLeft); + }else{ + docListAddDocid(pOut, docidRight); + } + priorLeft = docidLeft; + if( docidLeft<=docidRight ){ + docidLeft = nextDocid(&left); + } + if( docidRight>0 && docidRight<=priorLeft ){ + docidRight = nextDocid(&right); + } + } + while( docidLeft>0 ){ + docListAddDocid(pOut, docidLeft); + docidLeft = nextDocid(&left); + } + while( docidRight>0 ){ + docListAddDocid(pOut, docidRight); + docidRight = nextDocid(&right); + } +} + +/* We have two doclists: pLeft and pRight. +** Write into pOut all documents that occur in pLeft but not +** in pRight. +** +** Only docids are matched. Position information is ignored. +** +** The output pOut never holds positions. +*/ +static void docListExceptMerge( + DocList *pLeft, /* Doclist resulting from the words on the left */ + DocList *pRight, /* Doclist for the next word to the right */ + DocList *pOut /* Write the combined doclist here */ +){ + DocListReader left, right; + sqlite_int64 docidLeft, docidRight, priorLeft; + + readerInit(&left, pLeft); + readerInit(&right, pRight); + docidLeft = nextDocid(&left); + docidRight = nextDocid(&right); + + while( docidLeft>0 && docidRight>0 ){ + priorLeft = docidLeft; + if( docidLeft0 && docidRight<=priorLeft ){ + docidRight = nextDocid(&right); + } + } + while( docidLeft>0 ){ + docListAddDocid(pOut, docidLeft); + docidLeft = nextDocid(&left); + } +} + +static char *string_dup_n(const char *s, int n){ + char *str = malloc(n + 1); + memcpy(str, s, n); + str[n] = '\0'; + return str; +} + +/* Duplicate a string; the caller must free() the returned string. + * (We don't use strdup() since it's not part of the standard C library and + * may not be available everywhere.) */ +static char *string_dup(const char *s){ + return string_dup_n(s, strlen(s)); +} + +/* Format a string, replacing each occurrence of the % character with + * zDb.zName. This may be more convenient than sqlite_mprintf() + * when one string is used repeatedly in a format string. + * The caller must free() the returned string. */ +static char *string_format(const char *zFormat, + const char *zDb, const char *zName){ + const char *p; + size_t len = 0; + size_t nDb = strlen(zDb); + size_t nName = strlen(zName); + size_t nFullTableName = nDb+1+nName; + char *result; + char *r; + + /* first compute length needed */ + for(p = zFormat ; *p ; ++p){ + len += (*p=='%' ? nFullTableName : 1); + } + len += 1; /* for null terminator */ + + r = result = malloc(len); + for(p = zFormat; *p; ++p){ + if( *p=='%' ){ + memcpy(r, zDb, nDb); + r += nDb; + *r++ = '.'; + memcpy(r, zName, nName); + r += nName; + } else { + *r++ = *p; + } + } + *r++ = '\0'; + assert( r == result + len ); + return result; +} + +static int sql_exec(sqlite3 *db, const char *zDb, const char *zName, + const char *zFormat){ + char *zCommand = string_format(zFormat, zDb, zName); + int rc; + TRACE(("FTS1 sql: %s\n", zCommand)); + rc = sqlite3_exec(db, zCommand, NULL, 0, NULL); + free(zCommand); + return rc; +} + +static int sql_prepare(sqlite3 *db, const char *zDb, const char *zName, + sqlite3_stmt **ppStmt, const char *zFormat){ + char *zCommand = string_format(zFormat, zDb, zName); + int rc; + TRACE(("FTS1 prepare: %s\n", zCommand)); + rc = sqlite3_prepare(db, zCommand, -1, ppStmt, NULL); + free(zCommand); + return rc; +} + +/* end utility functions */ + +/* Forward reference */ +typedef struct fulltext_vtab fulltext_vtab; + +/* A single term in a query is represented by an instances of +** the following structure. +*/ +typedef struct QueryTerm { + short int nPhrase; /* How many following terms are part of the same phrase */ + short int iPhrase; /* This is the i-th term of a phrase. */ + short int iColumn; /* Column of the index that must match this term */ + signed char isOr; /* this term is preceded by "OR" */ + signed char isNot; /* this term is preceded by "-" */ + char *pTerm; /* text of the term. '\000' terminated. malloced */ + int nTerm; /* Number of bytes in pTerm[] */ +} QueryTerm; + + +/* A query string is parsed into a Query structure. + * + * We could, in theory, allow query strings to be complicated + * nested expressions with precedence determined by parentheses. + * But none of the major search engines do this. (Perhaps the + * feeling is that an parenthesized expression is two complex of + * an idea for the average user to grasp.) Taking our lead from + * the major search engines, we will allow queries to be a list + * of terms (with an implied AND operator) or phrases in double-quotes, + * with a single optional "-" before each non-phrase term to designate + * negation and an optional OR connector. + * + * OR binds more tightly than the implied AND, which is what the + * major search engines seem to do. So, for example: + * + * [one two OR three] ==> one AND (two OR three) + * [one OR two three] ==> (one OR two) AND three + * + * A "-" before a term matches all entries that lack that term. + * The "-" must occur immediately before the term with in intervening + * space. This is how the search engines do it. + * + * A NOT term cannot be the right-hand operand of an OR. If this + * occurs in the query string, the NOT is ignored: + * + * [one OR -two] ==> one OR two + * + */ +typedef struct Query { + fulltext_vtab *pFts; /* The full text index */ + int nTerms; /* Number of terms in the query */ + QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ + int nextIsOr; /* Set the isOr flag on the next inserted term */ + int nextColumn; /* Next word parsed must be in this column */ + int dfltColumn; /* The default column */ +} Query; + + +/* +** An instance of the following structure keeps track of generated +** matching-word offset information and snippets. +*/ +typedef struct Snippet { + int nMatch; /* Total number of matches */ + int nAlloc; /* Space allocated for aMatch[] */ + struct snippetMatch { /* One entry for each matching term */ + char snStatus; /* Status flag for use while constructing snippets */ + short int iCol; /* The column that contains the match */ + short int iTerm; /* The index in Query.pTerms[] of the matching term */ + short int nByte; /* Number of bytes in the term */ + int iStart; /* The offset to the first character of the term */ + } *aMatch; /* Points to space obtained from malloc */ + char *zOffset; /* Text rendering of aMatch[] */ + int nOffset; /* strlen(zOffset) */ + char *zSnippet; /* Snippet text */ + int nSnippet; /* strlen(zSnippet) */ +} Snippet; + + +typedef enum QueryType { + QUERY_GENERIC, /* table scan */ + QUERY_ROWID, /* lookup by rowid */ + QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ +} QueryType; + +/* TODO(shess) CHUNK_MAX controls how much data we allow in segment 0 +** before we start aggregating into larger segments. Lower CHUNK_MAX +** means that for a given input we have more individual segments per +** term, which means more rows in the table and a bigger index (due to +** both more rows and bigger rowids). But it also reduces the average +** cost of adding new elements to the segment 0 doclist, and it seems +** to reduce the number of pages read and written during inserts. 256 +** was chosen by measuring insertion times for a certain input (first +** 10k documents of Enron corpus), though including query performance +** in the decision may argue for a larger value. +*/ +#define CHUNK_MAX 256 + +typedef enum fulltext_statement { + CONTENT_INSERT_STMT, + CONTENT_SELECT_STMT, + CONTENT_UPDATE_STMT, + CONTENT_DELETE_STMT, + + TERM_SELECT_STMT, + TERM_SELECT_ALL_STMT, + TERM_INSERT_STMT, + TERM_UPDATE_STMT, + TERM_DELETE_STMT, + + MAX_STMT /* Always at end! */ +} fulltext_statement; + +/* These must exactly match the enum above. */ +/* TODO(adam): Is there some risk that a statement (in particular, +** pTermSelectStmt) will be used in two cursors at once, e.g. if a +** query joins a virtual table to itself? If so perhaps we should +** move some of these to the cursor object. +*/ +static const char *const fulltext_zStatement[MAX_STMT] = { + /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ + /* CONTENT_SELECT */ "select * from %_content where rowid = ?", + /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ + /* CONTENT_DELETE */ "delete from %_content where rowid = ?", + + /* TERM_SELECT */ + "select rowid, doclist from %_term where term = ? and segment = ?", + /* TERM_SELECT_ALL */ + "select doclist from %_term where term = ? order by segment", + /* TERM_INSERT */ + "insert into %_term (rowid, term, segment, doclist) values (?, ?, ?, ?)", + /* TERM_UPDATE */ "update %_term set doclist = ? where rowid = ?", + /* TERM_DELETE */ "delete from %_term where rowid = ?", +}; + +/* +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct fulltext_vtab { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of columns in virtual table */ + char **azColumn; /* column names. malloced */ + char **azContentColumn; /* column names in content table; malloced */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + + /* Precompiled statements which we keep as long as the table is + ** open. + */ + sqlite3_stmt *pFulltextStatements[MAX_STMT]; +}; + +/* +** When the core wants to do a query, it create a cursor using a +** call to xOpen. This structure is an instance of a cursor. It +** is destroyed by xClose. +*/ +typedef struct fulltext_cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + int eof; /* True if at End Of Results */ + Query q; /* Parsed query string */ + Snippet snippet; /* Cached snippet for the current row */ + int iColumn; /* Column being searched */ + DocListReader result; /* used when iCursorType == QUERY_FULLTEXT */ +} fulltext_cursor; + +static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ + return (fulltext_vtab *) c->base.pVtab; +} + +static const sqlite3_module fulltextModule; /* forward declaration */ + +/* Append a list of strings separated by commas to a StringBuffer. */ +static void appendList(StringBuffer *sb, int nString, char **azString){ + int i; + for(i=0; i0 ) append(sb, ", "); + append(sb, azString[i]); + } +} + +/* Return a dynamically generated statement of the form + * insert into %_content (rowid, ...) values (?, ...) + */ +static const char *contentInsertStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "insert into %_content (rowid, "); + appendList(&sb, v->nColumn, v->azContentColumn); + append(&sb, ") values (?"); + for(i=0; inColumn; ++i) + append(&sb, ", ?"); + append(&sb, ")"); + return sb.s; +} + +/* Return a dynamically generated statement of the form + * update %_content set [col_0] = ?, [col_1] = ?, ... + * where rowid = ? + */ +static const char *contentUpdateStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "update %_content set "); + for(i=0; inColumn; ++i) { + if( i>0 ){ + append(&sb, ", "); + } + append(&sb, v->azContentColumn[i]); + append(&sb, " = ?"); + } + append(&sb, " where rowid = ?"); + return sb.s; +} + +/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. +** If the indicated statement has never been prepared, it is prepared +** and cached, otherwise the cached version is reset. +*/ +static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, + sqlite3_stmt **ppStmt){ + assert( iStmtpFulltextStatements[iStmt]==NULL ){ + const char *zStmt; + int rc; + switch( iStmt ){ + case CONTENT_INSERT_STMT: + zStmt = contentInsertStatement(v); break; + case CONTENT_UPDATE_STMT: + zStmt = contentUpdateStatement(v); break; + default: + zStmt = fulltext_zStatement[iStmt]; + } + rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], + zStmt); + if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); + if( rc!=SQLITE_OK ) return rc; + } else { + int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); + if( rc!=SQLITE_OK ) return rc; + } + + *ppStmt = v->pFulltextStatements[iStmt]; + return SQLITE_OK; +} + +/* Step the indicated statement, handling errors SQLITE_BUSY (by +** retrying) and SQLITE_SCHEMA (by re-preparing and transferring +** bindings to the new statement). +** TODO(adam): We should extend this function so that it can work with +** statements declared locally, not only globally cached statements. +*/ +static int sql_step_statement(fulltext_vtab *v, fulltext_statement iStmt, + sqlite3_stmt **ppStmt){ + int rc; + sqlite3_stmt *s = *ppStmt; + assert( iStmtpFulltextStatements[iStmt] ); + + while( (rc=sqlite3_step(s))!=SQLITE_DONE && rc!=SQLITE_ROW ){ + if( rc==SQLITE_BUSY ) continue; + if( rc!=SQLITE_ERROR ) return rc; + + /* If an SQLITE_SCHEMA error has occured, then finalizing this + * statement is going to delete the fulltext_vtab structure. If + * the statement just executed is in the pFulltextStatements[] + * array, it will be finalized twice. So remove it before + * calling sqlite3_finalize(). + */ + v->pFulltextStatements[iStmt] = NULL; + rc = sqlite3_finalize(s); + break; + } + return rc; + + err: + sqlite3_finalize(s); + return rc; +} + +/* Like sql_step_statement(), but convert SQLITE_DONE to SQLITE_OK. +** Useful for statements like UPDATE, where we expect no results. +*/ +static int sql_single_step_statement(fulltext_vtab *v, + fulltext_statement iStmt, + sqlite3_stmt **ppStmt){ + int rc = sql_step_statement(v, iStmt, ppStmt); + return (rc==SQLITE_DONE) ? SQLITE_OK : rc; +} + +/* insert into %_content (rowid, ...) values ([rowid], [pValues]) */ +static int content_insert(fulltext_vtab *v, sqlite3_value *rowid, + sqlite3_value **pValues){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_value(s, 1, rowid); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 2+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + return sql_single_step_statement(v, CONTENT_INSERT_STMT, &s); +} + +/* update %_content set col0 = pValues[0], col1 = pValues[1], ... + * where rowid = [iRowid] */ +static int content_update(fulltext_vtab *v, sqlite3_value **pValues, + sqlite_int64 iRowid){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 1+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + rc = sqlite3_bind_int64(s, 1+v->nColumn, iRowid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step_statement(v, CONTENT_UPDATE_STMT, &s); +} + +static void freeStringArray(int nString, const char **pString){ + int i; + + for (i=0 ; i < nString ; ++i) { + if( pString[i]!=NULL ) free((void *) pString[i]); + } + free((void *) pString); +} + +/* select * from %_content where rowid = [iRow] + * The caller must delete the returned array and all strings in it. + * null fields will be NULL in the returned array. + * + * TODO: Perhaps we should return pointer/length strings here for consistency + * with other code which uses pointer/length. */ +static int content_select(fulltext_vtab *v, sqlite_int64 iRow, + const char ***pValues){ + sqlite3_stmt *s; + const char **values; + int i; + int rc; + + *pValues = NULL; + + rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = sql_step_statement(v, CONTENT_SELECT_STMT, &s); + if( rc!=SQLITE_ROW ) return rc; + + values = (const char **) malloc(v->nColumn * sizeof(const char *)); + for(i=0; inColumn; ++i){ + if( sqlite3_column_type(s, i)==SQLITE_NULL ){ + values[i] = NULL; + }else{ + values[i] = string_dup((char*)sqlite3_column_text(s, i)); + } + } + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ){ + *pValues = values; + return SQLITE_OK; + } + + freeStringArray(v->nColumn, values); + return rc; +} + +/* delete from %_content where rowid = [iRow ] */ +static int content_delete(fulltext_vtab *v, sqlite_int64 iRow){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iRow); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step_statement(v, CONTENT_DELETE_STMT, &s); +} + +/* select rowid, doclist from %_term + * where term = [pTerm] and segment = [iSegment] + * If found, returns SQLITE_ROW; the caller must free the + * returned doclist. If no rows found, returns SQLITE_DONE. */ +static int term_select(fulltext_vtab *v, const char *pTerm, int nTerm, + int iSegment, + sqlite_int64 *rowid, DocList *out){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, TERM_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_text(s, 1, pTerm, nTerm, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 2, iSegment); + if( rc!=SQLITE_OK ) return rc; + + rc = sql_step_statement(v, TERM_SELECT_STMT, &s); + if( rc!=SQLITE_ROW ) return rc; + + *rowid = sqlite3_column_int64(s, 0); + docListInit(out, DL_DEFAULT, + sqlite3_column_blob(s, 1), sqlite3_column_bytes(s, 1)); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + return rc==SQLITE_DONE ? SQLITE_ROW : rc; +} + +/* Load the segment doclists for term pTerm and merge them in +** appropriate order into out. Returns SQLITE_OK if successful. If +** there are no segments for pTerm, successfully returns an empty +** doclist in out. +** +** Each document consists of 1 or more "columns". The number of +** columns is v->nColumn. If iColumn==v->nColumn, then return +** position information about all columns. If iColumnnColumn, +** then only return position information about the iColumn-th column +** (where the first column is 0). +*/ +static int term_select_all( + fulltext_vtab *v, /* The fulltext index we are querying against */ + int iColumn, /* If nColumn ){ /* querying a single column */ + docListRestrictColumn(&old, iColumn); + } + + /* doclist contains the newer data, so write it over old. Then + ** steal accumulated result for doclist. + */ + docListAccumulate(&old, &doclist); + docListDestroy(&doclist); + doclist = old; + } + if( rc!=SQLITE_DONE ){ + docListDestroy(&doclist); + return rc; + } + + docListDiscardEmpty(&doclist); + *out = doclist; + return SQLITE_OK; +} + +/* insert into %_term (rowid, term, segment, doclist) + values ([piRowid], [pTerm], [iSegment], [doclist]) +** Lets sqlite select rowid if piRowid is NULL, else uses *piRowid. +** +** NOTE(shess) piRowid is IN, with values of "space of int64" plus +** null, it is not used to pass data back to the caller. +*/ +static int term_insert(fulltext_vtab *v, sqlite_int64 *piRowid, + const char *pTerm, int nTerm, + int iSegment, DocList *doclist){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, TERM_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + if( piRowid==NULL ){ + rc = sqlite3_bind_null(s, 1); + }else{ + rc = sqlite3_bind_int64(s, 1, *piRowid); + } + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_text(s, 2, pTerm, nTerm, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 3, iSegment); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 4, doclist->pData, doclist->nData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step_statement(v, TERM_INSERT_STMT, &s); +} + +/* update %_term set doclist = [doclist] where rowid = [rowid] */ +static int term_update(fulltext_vtab *v, sqlite_int64 rowid, + DocList *doclist){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, TERM_UPDATE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 1, doclist->pData, doclist->nData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 2, rowid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step_statement(v, TERM_UPDATE_STMT, &s); +} + +static int term_delete(fulltext_vtab *v, sqlite_int64 rowid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, TERM_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, rowid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step_statement(v, TERM_DELETE_STMT, &s); +} + +/* +** Free the memory used to contain a fulltext_vtab structure. +*/ +static void fulltext_vtab_destroy(fulltext_vtab *v){ + int iStmt, i; + + TRACE(("FTS1 Destroy %p\n", v)); + for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ + sqlite3_finalize(v->pFulltextStatements[iStmt]); + v->pFulltextStatements[iStmt] = NULL; + } + } + + if( v->pTokenizer!=NULL ){ + v->pTokenizer->pModule->xDestroy(v->pTokenizer); + v->pTokenizer = NULL; + } + + free(v->azColumn); + for(i = 0; i < v->nColumn; ++i) { + sqlite3_free(v->azContentColumn[i]); + } + free(v->azContentColumn); + free(v); +} + +/* +** Token types for parsing the arguments to xConnect or xCreate. +*/ +#define TOKEN_EOF 0 /* End of file */ +#define TOKEN_SPACE 1 /* Any kind of whitespace */ +#define TOKEN_ID 2 /* An identifier */ +#define TOKEN_STRING 3 /* A string literal */ +#define TOKEN_PUNCT 4 /* A single punctuation character */ + +/* +** If X is a character that can be used in an identifier then +** IdChar(X) will be true. Otherwise it is false. +** +** For ASCII, any character with the high-order bit set is +** allowed in an identifier. For 7-bit characters, +** sqlite3IsIdChar[X] must be 1. +** +** Ticket #1066. the SQL standard does not allow '$' in the +** middle of identfiers. But many SQL implementations do. +** SQLite will allow '$' in identifiers for compatibility. +** But the feature is undocumented. +*/ +static const char isIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) + + +/* +** Return the length of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +static int getToken(const char *z, int *tokenType){ + int i, c; + switch( *z ){ + case 0: { + *tokenType = TOKEN_EOF; + return 0; + } + case ' ': case '\t': case '\n': case '\f': case '\r': { + for(i=1; safe_isspace(z[i]); i++){} + *tokenType = TOKEN_SPACE; + return i; + } + case '`': + case '\'': + case '"': { + int delim = z[0]; + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + *tokenType = TOKEN_STRING; + return i + (c!=0); + } + case '[': { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = TOKEN_ID; + return i; + } + default: { + if( !IdChar(*z) ){ + break; + } + for(i=1; IdChar(z[i]); i++){} + *tokenType = TOKEN_ID; + return i; + } + } + *tokenType = TOKEN_PUNCT; + return 1; +} + +/* +** A token extracted from a string is an instance of the following +** structure. +*/ +typedef struct Token { + const char *z; /* Pointer to token text. Not '\000' terminated */ + short int n; /* Length of the token text in bytes. */ +} Token; + +/* +** Given a input string (which is really one of the argv[] parameters +** passed into xConnect or xCreate) split the string up into tokens. +** Return an array of pointers to '\000' terminated strings, one string +** for each non-whitespace token. +** +** The returned array is terminated by a single NULL pointer. +** +** Space to hold the returned array is obtained from a single +** malloc and should be freed by passing the return value to free(). +** The individual strings within the token list are all a part of +** the single memory allocation and will all be freed at once. +*/ +static char **tokenizeString(const char *z, int *pnToken){ + int nToken = 0; + Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); + int n = 1; + int e, i; + int totalSize = 0; + char **azToken; + char *zCopy; + while( n>0 ){ + n = getToken(z, &e); + if( e!=TOKEN_SPACE ){ + aToken[nToken].z = z; + aToken[nToken].n = n; + nToken++; + totalSize += n+1; + } + z += n; + } + azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); + zCopy = (char*)&azToken[nToken]; + nToken--; + for(i=0; i=0 ){ + azIn[j] = azIn[i]; + } + j++; + } + } + azIn[j] = 0; + } +} + + +/* +** Find the first alphanumeric token in the string zIn. Null-terminate +** this token. Remove any quotation marks. And return a pointer to +** the result. +*/ +static char *firstToken(char *zIn, char **pzTail){ + int n, ttype; + while(1){ + n = getToken(zIn, &ttype); + if( ttype==TOKEN_SPACE ){ + zIn += n; + }else if( ttype==TOKEN_EOF ){ + *pzTail = zIn; + return 0; + }else{ + zIn[n] = 0; + *pzTail = &zIn[1]; + dequoteString(zIn); + return zIn; + } + } + /*NOTREACHED*/ +} + +/* Return true if... +** +** * s begins with the string t, ignoring case +** * s is longer than t +** * The first character of s beyond t is not a alphanumeric +** +** Ignore leading space in *s. +** +** To put it another way, return true if the first token of +** s[] is t[]. +*/ +static int startsWith(const char *s, const char *t){ + while( safe_isspace(*s) ){ s++; } + while( *t ){ + if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; + } + return *s!='_' && !safe_isalnum(*s); +} + +/* +** An instance of this structure defines the "spec" of a +** full text index. This structure is populated by parseSpec +** and use by fulltextConnect and fulltextCreate. +*/ +typedef struct TableSpec { + const char *zDb; /* Logical database name */ + const char *zName; /* Name of the full-text index */ + int nColumn; /* Number of columns to be indexed */ + char **azColumn; /* Original names of columns to be indexed */ + char **azContentColumn; /* Column names for %_content */ + char **azTokenizer; /* Name of tokenizer and its arguments */ +} TableSpec; + +/* +** Reclaim all of the memory used by a TableSpec +*/ +static void clearTableSpec(TableSpec *p) { + free(p->azColumn); + free(p->azContentColumn); + free(p->azTokenizer); +} + +/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: + * + * CREATE VIRTUAL TABLE email + * USING fts1(subject, body, tokenize mytokenizer(myarg)) + * + * We return parsed information in a TableSpec structure. + * + */ +static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, + char**pzErr){ + int i, n; + char *z, *zDummy; + char **azArg; + const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ + + assert( argc>=3 ); + /* Current interface: + ** argv[0] - module name + ** argv[1] - database name + ** argv[2] - table name + ** argv[3..] - columns, optionally followed by tokenizer specification + ** and snippet delimiters specification. + */ + + /* Make a copy of the complete argv[][] array in a single allocation. + ** The argv[][] array is read-only and transient. We can write to the + ** copy in order to modify things and the copy is persistent. + */ + memset(pSpec, 0, sizeof(*pSpec)); + for(i=n=0; izDb = azArg[1]; + pSpec->zName = azArg[2]; + pSpec->nColumn = 0; + pSpec->azColumn = azArg; + zTokenizer = "tokenize simple"; + for(i=3; inColumn] = firstToken(azArg[i], &zDummy); + pSpec->nColumn++; + } + } + if( pSpec->nColumn==0 ){ + azArg[0] = "content"; + pSpec->nColumn = 1; + } + + /* + ** Construct the list of content column names. + ** + ** Each content column name will be of the form cNNAAAA + ** where NN is the column number and AAAA is the sanitized + ** column name. "sanitized" means that special characters are + ** converted to "_". The cNN prefix guarantees that all column + ** names are unique. + ** + ** The AAAA suffix is not strictly necessary. It is included + ** for the convenience of people who might examine the generated + ** %_content table and wonder what the columns are used for. + */ + pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); + if( pSpec->azContentColumn==0 ){ + clearTableSpec(pSpec); + return SQLITE_NOMEM; + } + for(i=0; inColumn; i++){ + char *p; + pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); + for (p = pSpec->azContentColumn[i]; *p ; ++p) { + if( !safe_isalnum(*p) ) *p = '_'; + } + } + + /* + ** Parse the tokenizer specification string. + */ + pSpec->azTokenizer = tokenizeString(zTokenizer, &n); + tokenListToIdList(pSpec->azTokenizer); + + return SQLITE_OK; +} + +/* +** Generate a CREATE TABLE statement that describes the schema of +** the virtual table. Return a pointer to this schema string. +** +** Space is obtained from sqlite3_mprintf() and should be freed +** using sqlite3_free(). +*/ +static char *fulltextSchema( + int nColumn, /* Number of columns */ + const char *const* azColumn, /* List of columns */ + const char *zTableName /* Name of the table */ +){ + int i; + char *zSchema, *zNext; + const char *zSep = "("; + zSchema = sqlite3_mprintf("CREATE TABLE x"); + for(i=0; ibase */ + v->db = db; + v->zDb = spec->zDb; /* Freed when azColumn is freed */ + v->zName = spec->zName; /* Freed when azColumn is freed */ + v->nColumn = spec->nColumn; + v->azContentColumn = spec->azContentColumn; + spec->azContentColumn = 0; + v->azColumn = spec->azColumn; + spec->azColumn = 0; + + if( spec->azTokenizer==0 ){ + return SQLITE_NOMEM; + } + /* TODO(shess) For now, add new tokenizers as else if clauses. */ + if( spec->azTokenizer[0]==0 || startsWith(spec->azTokenizer[0], "simple") ){ + sqlite3Fts1SimpleTokenizerModule(&m); + }else if( startsWith(spec->azTokenizer[0], "porter") ){ + sqlite3Fts1PorterTokenizerModule(&m); + }else{ + *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); + rc = SQLITE_ERROR; + goto err; + } + for(n=0; spec->azTokenizer[n]; n++){} + if( n ){ + rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], + &v->pTokenizer); + }else{ + rc = m->xCreate(0, 0, &v->pTokenizer); + } + if( rc!=SQLITE_OK ) goto err; + v->pTokenizer->pModule = m; + + /* TODO: verify the existence of backing tables foo_content, foo_term */ + + schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, + spec->zName); + rc = sqlite3_declare_vtab(db, schema); + sqlite3_free(schema); + if( rc!=SQLITE_OK ) goto err; + + memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); + + *ppVTab = &v->base; + TRACE(("FTS1 Connect %p\n", v)); + + return rc; + +err: + fulltext_vtab_destroy(v); + return rc; +} + +static int fulltextConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, + char **pzErr +){ + TableSpec spec; + int rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + rc = constructVtab(db, &spec, ppVTab, pzErr); + clearTableSpec(&spec); + return rc; +} + + /* The %_content table holds the text of each document, with + ** the rowid used as the docid. + ** + ** The %_term table maps each term to a document list blob + ** containing elements sorted by ascending docid, each element + ** encoded as: + ** + ** docid varint-encoded + ** token elements: + ** position+1 varint-encoded as delta from previous position + ** start offset varint-encoded as delta from previous start offset + ** end offset varint-encoded as delta from start offset + ** + ** The sentinel position of 0 indicates the end of the token list. + ** + ** Additionally, doclist blobs are chunked into multiple segments, + ** using segment to order the segments. New elements are added to + ** the segment at segment 0, until it exceeds CHUNK_MAX. Then + ** segment 0 is deleted, and the doclist is inserted at segment 1. + ** If there is already a doclist at segment 1, the segment 0 doclist + ** is merged with it, the segment 1 doclist is deleted, and the + ** merged doclist is inserted at segment 2, repeating those + ** operations until an insert succeeds. + ** + ** Since this structure doesn't allow us to update elements in place + ** in case of deletion or update, these are simply written to + ** segment 0 (with an empty token list in case of deletion), with + ** docListAccumulate() taking care to retain lower-segment + ** information in preference to higher-segment information. + */ + /* TODO(shess) Provide a VACUUM type operation which both removes + ** deleted elements which are no longer necessary, and duplicated + ** elements. I suspect this will probably not be necessary in + ** practice, though. + */ +static int fulltextCreate(sqlite3 *db, void *pAux, + int argc, const char * const *argv, + sqlite3_vtab **ppVTab, char **pzErr){ + int rc; + TableSpec spec; + StringBuffer schema; + TRACE(("FTS1 Create\n")); + + rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + initStringBuffer(&schema); + append(&schema, "CREATE TABLE %_content("); + appendList(&schema, spec.nColumn, spec.azContentColumn); + append(&schema, ")"); + rc = sql_exec(db, spec.zDb, spec.zName, schema.s); + free(schema.s); + if( rc!=SQLITE_OK ) goto out; + + rc = sql_exec(db, spec.zDb, spec.zName, + "create table %_term(term text, segment integer, doclist blob, " + "primary key(term, segment));"); + if( rc!=SQLITE_OK ) goto out; + + rc = constructVtab(db, &spec, ppVTab, pzErr); + +out: + clearTableSpec(&spec); + return rc; +} + +/* Decide how to handle an SQL query. */ +static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + int i; + TRACE(("FTS1 BestIndex\n")); + + for(i=0; inConstraint; ++i){ + const struct sqlite3_index_constraint *pConstraint; + pConstraint = &pInfo->aConstraint[i]; + if( pConstraint->usable ) { + if( pConstraint->iColumn==-1 && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + pInfo->idxNum = QUERY_ROWID; /* lookup by rowid */ + TRACE(("FTS1 QUERY_ROWID\n")); + } else if( pConstraint->iColumn>=0 && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* full-text search */ + pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; + TRACE(("FTS1 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); + } else continue; + + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + + /* An arbitrary value for now. + * TODO: Perhaps rowid matches should be considered cheaper than + * full-text searches. */ + pInfo->estimatedCost = 1.0; + + return SQLITE_OK; + } + } + pInfo->idxNum = QUERY_GENERIC; + return SQLITE_OK; +} + +static int fulltextDisconnect(sqlite3_vtab *pVTab){ + TRACE(("FTS1 Disconnect %p\n", pVTab)); + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextDestroy(sqlite3_vtab *pVTab){ + fulltext_vtab *v = (fulltext_vtab *)pVTab; + int rc; + + TRACE(("FTS1 Destroy %p\n", pVTab)); + rc = sql_exec(v->db, v->zDb, v->zName, + "drop table if exists %_content;" + "drop table if exists %_term;" + ); + if( rc!=SQLITE_OK ) return rc; + + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + fulltext_cursor *c; + + c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); + /* sqlite will initialize c->base */ + *ppCursor = &c->base; + TRACE(("FTS1 Open %p: %p\n", pVTab, c)); + + return SQLITE_OK; +} + + +/* Free all of the dynamically allocated memory held by *q +*/ +static void queryClear(Query *q){ + int i; + for(i = 0; i < q->nTerms; ++i){ + free(q->pTerms[i].pTerm); + } + free(q->pTerms); + memset(q, 0, sizeof(*q)); +} + +/* Free all of the dynamically allocated memory held by the +** Snippet +*/ +static void snippetClear(Snippet *p){ + free(p->aMatch); + free(p->zOffset); + free(p->zSnippet); + memset(p, 0, sizeof(*p)); +} +/* +** Append a single entry to the p->aMatch[] log. +*/ +static void snippetAppendMatch( + Snippet *p, /* Append the entry to this snippet */ + int iCol, int iTerm, /* The column and query term */ + int iStart, int nByte /* Offset and size of the match */ +){ + int i; + struct snippetMatch *pMatch; + if( p->nMatch+1>=p->nAlloc ){ + p->nAlloc = p->nAlloc*2 + 10; + p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); + if( p->aMatch==0 ){ + p->nMatch = 0; + p->nAlloc = 0; + return; + } + } + i = p->nMatch++; + pMatch = &p->aMatch[i]; + pMatch->iCol = iCol; + pMatch->iTerm = iTerm; + pMatch->iStart = iStart; + pMatch->nByte = nByte; +} + +/* +** Sizing information for the circular buffer used in snippetOffsetsOfColumn() +*/ +#define FTS1_ROTOR_SZ (32) +#define FTS1_ROTOR_MASK (FTS1_ROTOR_SZ-1) + +/* +** Add entries to pSnippet->aMatch[] for every match that occurs against +** document zDoc[0..nDoc-1] which is stored in column iColumn. +*/ +static void snippetOffsetsOfColumn( + Query *pQuery, + Snippet *pSnippet, + int iColumn, + const char *zDoc, + int nDoc +){ + const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ + sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ + sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ + fulltext_vtab *pVtab; /* The full text index */ + int nColumn; /* Number of columns in the index */ + const QueryTerm *aTerm; /* Query string terms */ + int nTerm; /* Number of query string terms */ + int i, j; /* Loop counters */ + int rc; /* Return code */ + unsigned int match, prevMatch; /* Phrase search bitmasks */ + const char *zToken; /* Next token from the tokenizer */ + int nToken; /* Size of zToken */ + int iBegin, iEnd, iPos; /* Offsets of beginning and end */ + + /* The following variables keep a circular buffer of the last + ** few tokens */ + unsigned int iRotor = 0; /* Index of current token */ + int iRotorBegin[FTS1_ROTOR_SZ]; /* Beginning offset of token */ + int iRotorLen[FTS1_ROTOR_SZ]; /* Length of token */ + + pVtab = pQuery->pFts; + nColumn = pVtab->nColumn; + pTokenizer = pVtab->pTokenizer; + pTModule = pTokenizer->pModule; + rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); + if( rc ) return; + pTCursor->pTokenizer = pTokenizer; + aTerm = pQuery->pTerms; + nTerm = pQuery->nTerms; + if( nTerm>=FTS1_ROTOR_SZ ){ + nTerm = FTS1_ROTOR_SZ - 1; + } + prevMatch = 0; + while(1){ + rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); + if( rc ) break; + iRotorBegin[iRotor&FTS1_ROTOR_MASK] = iBegin; + iRotorLen[iRotor&FTS1_ROTOR_MASK] = iEnd-iBegin; + match = 0; + for(i=0; i=0 && iCol1 && (prevMatch & (1<=0; j--){ + int k = (iRotor-j) & FTS1_ROTOR_MASK; + snippetAppendMatch(pSnippet, iColumn, i-j, + iRotorBegin[k], iRotorLen[k]); + } + } + } + prevMatch = match<<1; + iRotor++; + } + pTModule->xClose(pTCursor); +} + + +/* +** Compute all offsets for the current row of the query. +** If the offsets have already been computed, this routine is a no-op. +*/ +static void snippetAllOffsets(fulltext_cursor *p){ + int nColumn; + int iColumn, i; + int iFirst, iLast; + fulltext_vtab *pFts; + + if( p->snippet.nMatch ) return; + if( p->q.nTerms==0 ) return; + pFts = p->q.pFts; + nColumn = pFts->nColumn; + iColumn = p->iCursorType - QUERY_FULLTEXT; + if( iColumn<0 || iColumn>=nColumn ){ + iFirst = 0; + iLast = nColumn-1; + }else{ + iFirst = iColumn; + iLast = iColumn; + } + for(i=iFirst; i<=iLast; i++){ + const char *zDoc; + int nDoc; + zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); + nDoc = sqlite3_column_bytes(p->pStmt, i+1); + snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); + } +} + +/* +** Convert the information in the aMatch[] array of the snippet +** into the string zOffset[0..nOffset-1]. +*/ +static void snippetOffsetText(Snippet *p){ + int i; + int cnt = 0; + StringBuffer sb; + char zBuf[200]; + if( p->zOffset ) return; + initStringBuffer(&sb); + for(i=0; inMatch; i++){ + struct snippetMatch *pMatch = &p->aMatch[i]; + zBuf[0] = ' '; + sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, + pMatch->iTerm, pMatch->iStart, pMatch->nByte); + append(&sb, zBuf); + cnt++; + } + p->zOffset = sb.s; + p->nOffset = sb.len; +} + +/* +** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set +** of matching words some of which might be in zDoc. zDoc is column +** number iCol. +** +** iBreak is suggested spot in zDoc where we could begin or end an +** excerpt. Return a value similar to iBreak but possibly adjusted +** to be a little left or right so that the break point is better. +*/ +static int wordBoundary( + int iBreak, /* The suggested break point */ + const char *zDoc, /* Document text */ + int nDoc, /* Number of bytes in zDoc[] */ + struct snippetMatch *aMatch, /* Matching words */ + int nMatch, /* Number of entries in aMatch[] */ + int iCol /* The column number for zDoc[] */ +){ + int i; + if( iBreak<=10 ){ + return 0; + } + if( iBreak>=nDoc-10 ){ + return nDoc; + } + for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ + return aMatch[i-1].iStart; + } + } + for(i=1; i<=10; i++){ + if( safe_isspace(zDoc[iBreak-i]) ){ + return iBreak - i + 1; + } + if( safe_isspace(zDoc[iBreak+i]) ){ + return iBreak + i + 1; + } + } + return iBreak; +} + +/* +** If the StringBuffer does not end in white space, add a single +** space character to the end. +*/ +static void appendWhiteSpace(StringBuffer *p){ + if( p->len==0 ) return; + if( safe_isspace(p->s[p->len-1]) ) return; + append(p, " "); +} + +/* +** Remove white space from teh end of the StringBuffer +*/ +static void trimWhiteSpace(StringBuffer *p){ + while( p->len>0 && safe_isspace(p->s[p->len-1]) ){ + p->len--; + } +} + + + +/* +** Allowed values for Snippet.aMatch[].snStatus +*/ +#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ +#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ + +/* +** Generate the text of a snippet. +*/ +static void snippetText( + fulltext_cursor *pCursor, /* The cursor we need the snippet for */ + const char *zStartMark, /* Markup to appear before each match */ + const char *zEndMark, /* Markup to appear after each match */ + const char *zEllipsis /* Ellipsis mark */ +){ + int i, j; + struct snippetMatch *aMatch; + int nMatch; + int nDesired; + StringBuffer sb; + int tailCol; + int tailOffset; + int iCol; + int nDoc; + const char *zDoc; + int iStart, iEnd; + int tailEllipsis = 0; + int iMatch; + + + free(pCursor->snippet.zSnippet); + pCursor->snippet.zSnippet = 0; + aMatch = pCursor->snippet.aMatch; + nMatch = pCursor->snippet.nMatch; + initStringBuffer(&sb); + + for(i=0; iq.nTerms; i++){ + for(j=0; j0; i++){ + if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; + nDesired--; + iCol = aMatch[i].iCol; + zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); + iStart = aMatch[i].iStart - 40; + iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); + if( iStart<=10 ){ + iStart = 0; + } + if( iCol==tailCol && iStart<=tailOffset+20 ){ + iStart = tailOffset; + } + if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ + trimWhiteSpace(&sb); + appendWhiteSpace(&sb); + append(&sb, zEllipsis); + appendWhiteSpace(&sb); + } + iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; + iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); + if( iEnd>=nDoc-10 ){ + iEnd = nDoc; + tailEllipsis = 0; + }else{ + tailEllipsis = 1; + } + while( iMatchsnippet.zSnippet = sb.s; + pCursor->snippet.nSnippet = sb.len; +} + + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fulltextClose(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + TRACE(("FTS1 Close %p\n", c)); + sqlite3_finalize(c->pStmt); + queryClear(&c->q); + snippetClear(&c->snippet); + if( c->result.pDoclist!=NULL ){ + docListDelete(c->result.pDoclist); + } + free(c); + return SQLITE_OK; +} + +static int fulltextNext(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + sqlite_int64 iDocid; + int rc; + + TRACE(("FTS1 Next %p\n", pCursor)); + snippetClear(&c->snippet); + if( c->iCursorType < QUERY_FULLTEXT ){ + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + switch( rc ){ + case SQLITE_ROW: + c->eof = 0; + return SQLITE_OK; + case SQLITE_DONE: + c->eof = 1; + return SQLITE_OK; + default: + c->eof = 1; + return rc; + } + } else { /* full-text query */ + rc = sqlite3_reset(c->pStmt); + if( rc!=SQLITE_OK ) return rc; + + iDocid = nextDocid(&c->result); + if( iDocid==0 ){ + c->eof = 1; + return SQLITE_OK; + } + rc = sqlite3_bind_int64(c->pStmt, 1, iDocid); + if( rc!=SQLITE_OK ) return rc; + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + if( rc==SQLITE_ROW ){ /* the case we expect */ + c->eof = 0; + return SQLITE_OK; + } + /* an error occurred; abort */ + return rc==SQLITE_DONE ? SQLITE_ERROR : rc; + } +} + + +/* Return a DocList corresponding to the query term *pTerm. If *pTerm +** is the first term of a phrase query, go ahead and evaluate the phrase +** query and return the doclist for the entire phrase query. +** +** The result is stored in pTerm->doclist. +*/ +static int docListOfTerm( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* column to restrict to. No restrition if >=nColumn */ + QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ + DocList **ppResult /* Write the result here */ +){ + DocList *pLeft, *pRight, *pNew; + int i, rc; + + pLeft = docListNew(DL_POSITIONS); + rc = term_select_all(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pLeft); + if( rc ){ + docListDelete(pLeft); + return rc; + } + for(i=1; i<=pQTerm->nPhrase; i++){ + pRight = docListNew(DL_POSITIONS); + rc = term_select_all(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, pRight); + if( rc ){ + docListDelete(pLeft); + return rc; + } + pNew = docListNew(inPhrase ? DL_POSITIONS : DL_DOCIDS); + docListPhraseMerge(pLeft, pRight, pNew); + docListDelete(pLeft); + docListDelete(pRight); + pLeft = pNew; + } + *ppResult = pLeft; + return SQLITE_OK; +} + +/* Add a new term pTerm[0..nTerm-1] to the query *q. +*/ +static void queryAdd(Query *q, const char *pTerm, int nTerm){ + QueryTerm *t; + ++q->nTerms; + q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); + if( q->pTerms==0 ){ + q->nTerms = 0; + return; + } + t = &q->pTerms[q->nTerms - 1]; + memset(t, 0, sizeof(*t)); + t->pTerm = malloc(nTerm+1); + memcpy(t->pTerm, pTerm, nTerm); + t->pTerm[nTerm] = 0; + t->nTerm = nTerm; + t->isOr = q->nextIsOr; + q->nextIsOr = 0; + t->iColumn = q->nextColumn; + q->nextColumn = q->dfltColumn; +} + +/* +** Check to see if the string zToken[0...nToken-1] matches any +** column name in the virtual table. If it does, +** return the zero-indexed column number. If not, return -1. +*/ +static int checkColumnSpecifier( + fulltext_vtab *pVtab, /* The virtual table */ + const char *zToken, /* Text of the token */ + int nToken /* Number of characters in the token */ +){ + int i; + for(i=0; inColumn; i++){ + if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 + && pVtab->azColumn[i][nToken]==0 ){ + return i; + } + } + return -1; +} + +/* +** Parse the text at pSegment[0..nSegment-1]. Add additional terms +** to the query being assemblied in pQuery. +** +** inPhrase is true if pSegment[0..nSegement-1] is contained within +** double-quotes. If inPhrase is true, then the first term +** is marked with the number of terms in the phrase less one and +** OR and "-" syntax is ignored. If inPhrase is false, then every +** term found is marked with nPhrase=0 and OR and "-" syntax is significant. +*/ +static int tokenizeSegment( + sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ + const char *pSegment, int nSegment, /* Query expression being parsed */ + int inPhrase, /* True if within "..." */ + Query *pQuery /* Append results here */ +){ + const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCursor; + int firstIndex = pQuery->nTerms; + int iCol; + int nTerm = 1; + + int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); + if( rc!=SQLITE_OK ) return rc; + pCursor->pTokenizer = pTokenizer; + + while( 1 ){ + const char *pToken; + int nToken, iBegin, iEnd, iPos; + + rc = pModule->xNext(pCursor, + &pToken, &nToken, + &iBegin, &iEnd, &iPos); + if( rc!=SQLITE_OK ) break; + if( !inPhrase && + pSegment[iEnd]==':' && + (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ + pQuery->nextColumn = iCol; + continue; + } + if( !inPhrase && pQuery->nTerms>0 && nToken==2 + && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ + pQuery->nextIsOr = 1; + continue; + } + queryAdd(pQuery, pToken, nToken); + if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ + pQuery->pTerms[pQuery->nTerms-1].isNot = 1; + } + pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; + if( inPhrase ){ + nTerm++; + } + } + + if( inPhrase && pQuery->nTerms>firstIndex ){ + pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; + } + + return pModule->xClose(pCursor); +} + +/* Parse a query string, yielding a Query object pQuery. +** +** The calling function will need to queryClear() to clean up +** the dynamically allocated memory held by pQuery. +*/ +static int parseQuery( + fulltext_vtab *v, /* The fulltext index */ + const char *zInput, /* Input text of the query string */ + int nInput, /* Size of the input text */ + int dfltColumn, /* Default column of the index to match against */ + Query *pQuery /* Write the parse results here. */ +){ + int iInput, inPhrase = 0; + + if( zInput==0 ) nInput = 0; + if( nInput<0 ) nInput = strlen(zInput); + pQuery->nTerms = 0; + pQuery->pTerms = NULL; + pQuery->nextIsOr = 0; + pQuery->nextColumn = dfltColumn; + pQuery->dfltColumn = dfltColumn; + pQuery->pFts = v; + + for(iInput=0; iInputiInput ){ + tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, + pQuery); + } + iInput = i; + if( i=nColumn +** they are allowed to match against any column. +*/ +static int fulltextQuery( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* Match against this column by default */ + const char *zInput, /* The query string */ + int nInput, /* Number of bytes in zInput[] */ + DocList **pResult, /* Write the result doclist here */ + Query *pQuery /* Put parsed query string here */ +){ + int i, iNext, rc; + DocList *pLeft = NULL; + DocList *pRight, *pNew, *pOr; + int nNot = 0; + QueryTerm *aTerm; + + rc = parseQuery(v, zInput, nInput, iColumn, pQuery); + if( rc!=SQLITE_OK ) return rc; + + /* Merge AND terms. */ + aTerm = pQuery->pTerms; + for(i = 0; inTerms; i=iNext){ + if( aTerm[i].isNot ){ + /* Handle all NOT terms in a separate pass */ + nNot++; + iNext = i + aTerm[i].nPhrase+1; + continue; + } + iNext = i + aTerm[i].nPhrase + 1; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &pRight); + if( rc ){ + queryClear(pQuery); + return rc; + } + while( iNextnTerms && aTerm[iNext].isOr ){ + rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &pOr); + iNext += aTerm[iNext].nPhrase + 1; + if( rc ){ + queryClear(pQuery); + return rc; + } + pNew = docListNew(DL_DOCIDS); + docListOrMerge(pRight, pOr, pNew); + docListDelete(pRight); + docListDelete(pOr); + pRight = pNew; + } + if( pLeft==0 ){ + pLeft = pRight; + }else{ + pNew = docListNew(DL_DOCIDS); + docListAndMerge(pLeft, pRight, pNew); + docListDelete(pRight); + docListDelete(pLeft); + pLeft = pNew; + } + } + + if( nNot && pLeft==0 ){ + /* We do not yet know how to handle a query of only NOT terms */ + return SQLITE_ERROR; + } + + /* Do the EXCEPT terms */ + for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ + if( !aTerm[i].isNot ) continue; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &pRight); + if( rc ){ + queryClear(pQuery); + docListDelete(pLeft); + return rc; + } + pNew = docListNew(DL_DOCIDS); + docListExceptMerge(pLeft, pRight, pNew); + docListDelete(pRight); + docListDelete(pLeft); + pLeft = pNew; + } + + *pResult = pLeft; + return rc; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==QUERY_GENERIC then do a full table scan against +** the %_content table. +** +** If idxNum==QUERY_ROWID then do a rowid lookup for a single entry +** in the %_content table. +** +** If idxNum>=QUERY_FULLTEXT then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. +*/ +/* TODO(shess) Upgrade the cursor initialization and destruction to +** account for fulltextFilter() being called multiple times on the +** same cursor. The current solution is very fragile. Apply fix to +** fts2 as appropriate. +*/ +static int fulltextFilter( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, const char *idxStr, /* Which indexing scheme to use */ + int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ +){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + int rc; + char *zSql; + + TRACE(("FTS1 Filter %p\n",pCursor)); + + zSql = sqlite3_mprintf("select rowid, * from %%_content %s", + idxNum==QUERY_GENERIC ? "" : "where rowid=?"); + sqlite3_finalize(c->pStmt); + rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, zSql); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ) return rc; + + c->iCursorType = idxNum; + switch( idxNum ){ + case QUERY_GENERIC: + break; + + case QUERY_ROWID: + rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); + if( rc!=SQLITE_OK ) return rc; + break; + + default: /* full-text search */ + { + const char *zQuery = (const char *)sqlite3_value_text(argv[0]); + DocList *pResult; + assert( idxNum<=QUERY_FULLTEXT+v->nColumn); + assert( argc==1 ); + queryClear(&c->q); + rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &pResult, &c->q); + if( rc!=SQLITE_OK ) return rc; + if( c->result.pDoclist!=NULL ) docListDelete(c->result.pDoclist); + readerInit(&c->result, pResult); + break; + } + } + + return fulltextNext(pCursor); +} + +/* This is the xEof method of the virtual table. The SQLite core +** calls this routine to find out if it has reached the end of +** a query's results set. +*/ +static int fulltextEof(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + return c->eof; +} + +/* This is the xColumn method of the virtual table. The SQLite +** core calls this method during a query when it needs the value +** of a column from the virtual table. This method needs to use +** one of the sqlite3_result_*() routines to store the requested +** value back in the pContext. +*/ +static int fulltextColumn(sqlite3_vtab_cursor *pCursor, + sqlite3_context *pContext, int idxCol){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + + if( idxColnColumn ){ + sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); + sqlite3_result_value(pContext, pVal); + }else if( idxCol==v->nColumn ){ + /* The extra column whose name is the same as the table. + ** Return a blob which is a pointer to the cursor + */ + sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* This is the xRowid method. The SQLite core calls this routine to +** retrive the rowid for the current row of the result set. The +** rowid should be written to *pRowid. +*/ +static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + + *pRowid = sqlite3_column_int64(c->pStmt, 0); + return SQLITE_OK; +} + +/* Add all terms in [zText] to the given hash table. If [iColumn] > 0, + * we also store positions and offsets in the hash table using the given + * column number. */ +static int buildTerms(fulltext_vtab *v, fts1Hash *terms, sqlite_int64 iDocid, + const char *zText, int iColumn){ + sqlite3_tokenizer *pTokenizer = v->pTokenizer; + sqlite3_tokenizer_cursor *pCursor; + const char *pToken; + int nTokenBytes; + int iStartOffset, iEndOffset, iPosition; + int rc; + + rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); + if( rc!=SQLITE_OK ) return rc; + + pCursor->pTokenizer = pTokenizer; + while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, + &pToken, &nTokenBytes, + &iStartOffset, &iEndOffset, + &iPosition) ){ + DocList *p; + + /* Positions can't be negative; we use -1 as a terminator internally. */ + if( iPosition<0 ){ + pTokenizer->pModule->xClose(pCursor); + return SQLITE_ERROR; + } + + p = fts1HashFind(terms, pToken, nTokenBytes); + if( p==NULL ){ + p = docListNew(DL_DEFAULT); + docListAddDocid(p, iDocid); + fts1HashInsert(terms, pToken, nTokenBytes, p); + } + if( iColumn>=0 ){ + docListAddPosOffset(p, iColumn, iPosition, iStartOffset, iEndOffset); + } + } + + /* TODO(shess) Check return? Should this be able to cause errors at + ** this point? Actually, same question about sqlite3_finalize(), + ** though one could argue that failure there means that the data is + ** not durable. *ponder* + */ + pTokenizer->pModule->xClose(pCursor); + return rc; +} + +/* Update the %_terms table to map the term [pTerm] to the given rowid. */ +static int index_insert_term(fulltext_vtab *v, const char *pTerm, int nTerm, + DocList *d){ + sqlite_int64 iIndexRow; + DocList doclist; + int iSegment = 0, rc; + + rc = term_select(v, pTerm, nTerm, iSegment, &iIndexRow, &doclist); + if( rc==SQLITE_DONE ){ + docListInit(&doclist, DL_DEFAULT, 0, 0); + docListUpdate(&doclist, d); + /* TODO(shess) Consider length(doclist)>CHUNK_MAX? */ + rc = term_insert(v, NULL, pTerm, nTerm, iSegment, &doclist); + goto err; + } + if( rc!=SQLITE_ROW ) return SQLITE_ERROR; + + docListUpdate(&doclist, d); + if( doclist.nData<=CHUNK_MAX ){ + rc = term_update(v, iIndexRow, &doclist); + goto err; + } + + /* Doclist doesn't fit, delete what's there, and accumulate + ** forward. + */ + rc = term_delete(v, iIndexRow); + if( rc!=SQLITE_OK ) goto err; + + /* Try to insert the doclist into a higher segment bucket. On + ** failure, accumulate existing doclist with the doclist from that + ** bucket, and put results in the next bucket. + */ + iSegment++; + while( (rc=term_insert(v, &iIndexRow, pTerm, nTerm, iSegment, + &doclist))!=SQLITE_OK ){ + sqlite_int64 iSegmentRow; + DocList old; + int rc2; + + /* Retain old error in case the term_insert() error was really an + ** error rather than a bounced insert. + */ + rc2 = term_select(v, pTerm, nTerm, iSegment, &iSegmentRow, &old); + if( rc2!=SQLITE_ROW ) goto err; + + rc = term_delete(v, iSegmentRow); + if( rc!=SQLITE_OK ) goto err; + + /* Reusing lowest-number deleted row keeps the index smaller. */ + if( iSegmentRownColumn ; ++i){ + char *zText = (char*)sqlite3_value_text(pValues[i]); + int rc = buildTerms(v, terms, iRowid, zText, i); + if( rc!=SQLITE_OK ) return rc; + } + return SQLITE_OK; +} + +/* Add empty doclists for all terms in the given row's content to the hash + * table [pTerms]. */ +static int deleteTerms(fulltext_vtab *v, fts1Hash *pTerms, sqlite_int64 iRowid){ + const char **pValues; + int i; + + int rc = content_select(v, iRowid, &pValues); + if( rc!=SQLITE_OK ) return rc; + + for(i = 0 ; i < v->nColumn; ++i) { + rc = buildTerms(v, pTerms, iRowid, pValues[i], -1); + if( rc!=SQLITE_OK ) break; + } + + freeStringArray(v->nColumn, pValues); + return SQLITE_OK; +} + +/* Insert a row into the %_content table; set *piRowid to be the ID of the + * new row. Fill [pTerms] with new doclists for the %_term table. */ +static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestRowid, + sqlite3_value **pValues, + sqlite_int64 *piRowid, fts1Hash *pTerms){ + int rc; + + rc = content_insert(v, pRequestRowid, pValues); /* execute an SQL INSERT */ + if( rc!=SQLITE_OK ) return rc; + *piRowid = sqlite3_last_insert_rowid(v->db); + return insertTerms(v, pTerms, *piRowid, pValues); +} + +/* Delete a row from the %_content table; fill [pTerms] with empty doclists + * to be written to the %_term table. */ +static int index_delete(fulltext_vtab *v, sqlite_int64 iRow, fts1Hash *pTerms){ + int rc = deleteTerms(v, pTerms, iRow); + if( rc!=SQLITE_OK ) return rc; + return content_delete(v, iRow); /* execute an SQL DELETE */ +} + +/* Update a row in the %_content table; fill [pTerms] with new doclists for the + * %_term table. */ +static int index_update(fulltext_vtab *v, sqlite_int64 iRow, + sqlite3_value **pValues, fts1Hash *pTerms){ + /* Generate an empty doclist for each term that previously appeared in this + * row. */ + int rc = deleteTerms(v, pTerms, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ + if( rc!=SQLITE_OK ) return rc; + + /* Now add positions for terms which appear in the updated row. */ + return insertTerms(v, pTerms, iRow, pValues); +} + +/* This function implements the xUpdate callback; it's the top-level entry + * point for inserting, deleting or updating a row in a full-text table. */ +static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, + sqlite_int64 *pRowid){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + fts1Hash terms; /* maps term string -> PosList */ + int rc; + fts1HashElem *e; + + TRACE(("FTS1 Update %p\n", pVtab)); + + fts1HashInit(&terms, FTS1_HASH_STRING, 1); + + if( nArg<2 ){ + rc = index_delete(v, sqlite3_value_int64(ppArg[0]), &terms); + } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ + /* An update: + * ppArg[0] = old rowid + * ppArg[1] = new rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + */ + sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); + if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || + sqlite3_value_int64(ppArg[1]) != rowid ){ + rc = SQLITE_ERROR; /* we don't allow changing the rowid */ + } else { + assert( nArg==2+v->nColumn+1); + rc = index_update(v, rowid, &ppArg[2], &terms); + } + } else { + /* An insert: + * ppArg[1] = requested rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + */ + assert( nArg==2+v->nColumn+1); + rc = index_insert(v, ppArg[1], &ppArg[2], pRowid, &terms); + } + + if( rc==SQLITE_OK ){ + /* Write updated doclists to disk. */ + for(e=fts1HashFirst(&terms); e; e=fts1HashNext(e)){ + DocList *p = fts1HashData(e); + rc = index_insert_term(v, fts1HashKey(e), fts1HashKeysize(e), p); + if( rc!=SQLITE_OK ) break; + } + } + + /* clean up */ + for(e=fts1HashFirst(&terms); e; e=fts1HashNext(e)){ + DocList *p = fts1HashData(e); + docListDelete(p); + } + fts1HashClear(&terms); + + return rc; +} + +/* +** Implementation of the snippet() function for FTS1 +*/ +static void snippetFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); + }else{ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + if( argc>=2 ){ + zStart = (const char*)sqlite3_value_text(argv[1]); + if( argc>=3 ){ + zEnd = (const char*)sqlite3_value_text(argv[2]); + if( argc>=4 ){ + zEllipsis = (const char*)sqlite3_value_text(argv[3]); + } + } + } + snippetAllOffsets(pCursor); + snippetText(pCursor, zStart, zEnd, zEllipsis); + sqlite3_result_text(pContext, pCursor->snippet.zSnippet, + pCursor->snippet.nSnippet, SQLITE_STATIC); + } +} + +/* +** Implementation of the offsets() function for FTS1 +*/ +static void snippetOffsetsFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to offsets",-1); + }else{ + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + snippetAllOffsets(pCursor); + snippetOffsetText(&pCursor->snippet); + sqlite3_result_text(pContext, + pCursor->snippet.zOffset, pCursor->snippet.nOffset, + SQLITE_STATIC); + } +} + +/* +** This routine implements the xFindFunction method for the FTS1 +** virtual table. +*/ +static int fulltextFindFunction( + sqlite3_vtab *pVtab, + int nArg, + const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg +){ + if( strcmp(zName,"snippet")==0 ){ + *pxFunc = snippetFunc; + return 1; + }else if( strcmp(zName,"offsets")==0 ){ + *pxFunc = snippetOffsetsFunc; + return 1; + } + return 0; +} + +/* +** Rename an fts1 table. +*/ +static int fulltextRename( + sqlite3_vtab *pVtab, + const char *zName +){ + fulltext_vtab *p = (fulltext_vtab *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" + "ALTER TABLE %Q.'%q_term' RENAME TO '%q_term';" + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + ); + if( zSql ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +static const sqlite3_module fulltextModule = { + /* iVersion */ 0, + /* xCreate */ fulltextCreate, + /* xConnect */ fulltextConnect, + /* xBestIndex */ fulltextBestIndex, + /* xDisconnect */ fulltextDisconnect, + /* xDestroy */ fulltextDestroy, + /* xOpen */ fulltextOpen, + /* xClose */ fulltextClose, + /* xFilter */ fulltextFilter, + /* xNext */ fulltextNext, + /* xEof */ fulltextEof, + /* xColumn */ fulltextColumn, + /* xRowid */ fulltextRowid, + /* xUpdate */ fulltextUpdate, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindFunction */ fulltextFindFunction, + /* xRename */ fulltextRename, +}; + +int sqlite3Fts1Init(sqlite3 *db){ + sqlite3_overload_function(db, "snippet", -1); + sqlite3_overload_function(db, "offsets", -1); + return sqlite3_create_module(db, "fts1", &fulltextModule, 0); +} + +#if !SQLITE_CORE +int sqlite3_extension_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts1Init(db); +} +#endif + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h new file mode 100644 index 0000000000..d55e689733 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h @@ -0,0 +1,11 @@ +#include "sqlite3.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int sqlite3Fts1Init(sqlite3 *db); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c new file mode 100644 index 0000000000..463a52b645 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c @@ -0,0 +1,369 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. +*/ +#include +#include +#include + +/* +** The code in this file is only compiled if: +** +** * The FTS1 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS1 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) + + +#include "fts1_hash.h" + +static void *malloc_and_zero(int n){ + void *p = malloc(n); + if( p ){ + memset(p, 0, n); + } + return p; +} + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS1_HASH_BINARY or FTS1_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +void sqlite3Fts1HashInit(fts1Hash *pNew, int keyClass, int copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS1_HASH_STRING && keyClass<=FTS1_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; + pNew->xMalloc = malloc_and_zero; + pNew->xFree = free; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +void sqlite3Fts1HashClear(fts1Hash *pH){ + fts1HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + if( pH->ht ) pH->xFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + fts1HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + pH->xFree(elem->pKey); + } + pH->xFree(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS1_HASH_STRING +*/ +static int strHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + int h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return h & 0x7fffffff; +} +static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is FTS1_HASH_BINARY +*/ +static int binHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "hashFunction". The function takes a +** single parameter "keyClass". The return value of hashFunction() +** is a pointer to another function. Specifically, the return value +** of hashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*hashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS1_HASH_STRING ){ + return &strHash; + }else{ + assert( keyClass==FTS1_HASH_BINARY ); + return &binHash; + } +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS1_HASH_STRING ){ + return &strCompare; + }else{ + assert( keyClass==FTS1_HASH_BINARY ); + return &binCompare; + } +} + +/* Link an element into the hash table +*/ +static void insertElement( + fts1Hash *pH, /* The complete hash table */ + struct _fts1ht *pEntry, /* The entry into which pNew is inserted */ + fts1HashElem *pNew /* The element to be inserted */ +){ + fts1HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +*/ +static void rehash(fts1Hash *pH, int new_size){ + struct _fts1ht *new_ht; /* The new hash table */ + fts1HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts1ht *)pH->xMalloc( new_size*sizeof(struct _fts1ht) ); + if( new_ht==0 ) return; + if( pH->ht ) pH->xFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = hashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static fts1HashElem *findElementGivenHash( + const fts1Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + fts1HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _fts1ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = compareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + fts1Hash *pH, /* The pH containing "elem" */ + fts1HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts1ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + pH->xFree(elem->pKey); + } + pH->xFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts1HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +void *sqlite3Fts1HashFind(const fts1Hash *pH, const void *pKey, int nKey){ + int h; /* A hash on key */ + fts1HashElem *elem; /* The element that matches key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); + return elem ? elem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +void *sqlite3Fts1HashInsert( + fts1Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + fts1HashElem *elem; /* Used to loop thru the element list */ + fts1HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = findElementGivenHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (fts1HashElem*)pH->xMalloc( sizeof(fts1HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = pH->xMalloc( nKey ); + if( new_elem->pKey==0 ){ + pH->xFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + if( pH->htsize==0 ){ + rehash(pH,8); + if( pH->htsize==0 ){ + pH->count = 0; + pH->xFree(new_elem); + return data; + } + } + if( pH->count > pH->htsize ){ + rehash(pH,pH->htsize*2); + } + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + insertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h new file mode 100644 index 0000000000..c31c430f7c --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h @@ -0,0 +1,112 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS1_HASH_H_ +#define _FTS1_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct fts1Hash fts1Hash; +typedef struct fts1HashElem fts1HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct fts1Hash { + char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + fts1HashElem *first; /* The first element of the array */ + void *(*xMalloc)(int); /* malloc() function to use */ + void (*xFree)(void *); /* free() function to use */ + int htsize; /* Number of buckets in the hash table */ + struct _fts1ht { /* the hash table */ + int count; /* Number of entries with this hash */ + fts1HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct fts1HashElem { + fts1HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS1_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS1_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts1HashInit is 1. +*/ +#define FTS1_HASH_STRING 1 +#define FTS1_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +void sqlite3Fts1HashInit(fts1Hash*, int keytype, int copyKey); +void *sqlite3Fts1HashInsert(fts1Hash*, const void *pKey, int nKey, void *pData); +void *sqlite3Fts1HashFind(const fts1Hash*, const void *pKey, int nKey); +void sqlite3Fts1HashClear(fts1Hash*); + +/* +** Shorthand for the functions above +*/ +#define fts1HashInit sqlite3Fts1HashInit +#define fts1HashInsert sqlite3Fts1HashInsert +#define fts1HashFind sqlite3Fts1HashFind +#define fts1HashClear sqlite3Fts1HashClear + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** fts1Hash h; +** fts1HashElem *p; +** ... +** for(p=fts1HashFirst(&h); p; p=fts1HashNext(p)){ +** SomeStructure *pData = fts1HashData(p); +** // do something with pData +** } +*/ +#define fts1HashFirst(H) ((H)->first) +#define fts1HashNext(E) ((E)->next) +#define fts1HashData(E) ((E)->data) +#define fts1HashKey(E) ((E)->pKey) +#define fts1HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts1HashCount(H) ((H)->count) + +#endif /* _FTS1_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c new file mode 100644 index 0000000000..1d26236681 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c @@ -0,0 +1,643 @@ +/* +** 2006 September 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS1 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS1 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) + + +#include +#include +#include +#include +#include + +#include "fts1_tokenizer.h" + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlit3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module porterTokenizerModule; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + t = (porter_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; + + c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + free(c->zToken); + free(c); + return SQLITE_OK; +} +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; + +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); +} +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); +} + +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. +** +** In this routine z[] is in reverse order. So we are really looking +** for an instance of of a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; +} + +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 +*/ +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. +*/ +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); +} + +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. +*/ +static int star_oh(const char *z){ + return + z[0]!=0 && isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + z[1]!=0 && isVowel(z+1) && + z[2]!=0 && isConsonant(z+2); +} + +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. +*/ +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); + } + *pz = z; + return 1; +} + +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. +*/ +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; + }else{ + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + } + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; + + + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } + + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } + + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + stem(&z, "lanoita", "ate", m_gt_0) || + stem(&z, "lanoit", "tion", m_gt_0); + break; + case 'c': + stem(&z, "icne", "ence", m_gt_0) || + stem(&z, "icna", "ance", m_gt_0); + break; + case 'e': + stem(&z, "rezi", "ize", m_gt_0); + break; + case 'g': + stem(&z, "igol", "log", m_gt_0); + break; + case 'l': + stem(&z, "ilb", "ble", m_gt_0) || + stem(&z, "illa", "al", m_gt_0) || + stem(&z, "iltne", "ent", m_gt_0) || + stem(&z, "ile", "e", m_gt_0) || + stem(&z, "ilsuo", "ous", m_gt_0); + break; + case 'o': + stem(&z, "noitazi", "ize", m_gt_0) || + stem(&z, "noita", "ate", m_gt_0) || + stem(&z, "rota", "ate", m_gt_0); + break; + case 's': + stem(&z, "msila", "al", m_gt_0) || + stem(&z, "ssenevi", "ive", m_gt_0) || + stem(&z, "ssenluf", "ful", m_gt_0) || + stem(&z, "ssensuo", "ous", m_gt_0); + break; + case 't': + stem(&z, "itila", "al", m_gt_0) || + stem(&z, "itivi", "ive", m_gt_0) || + stem(&z, "itilib", "ble", m_gt_0); + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + stem(&z, "etaci", "ic", m_gt_0) || + stem(&z, "evita", "", m_gt_0) || + stem(&z, "ezila", "al", m_gt_0); + break; + case 'i': + stem(&z, "itici", "ic", m_gt_0); + break; + case 'l': + stem(&z, "laci", "ic", m_gt_0) || + stem(&z, "luf", "", m_gt_0); + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + stem(&z, "tneme", "", m_gt_1) || + stem(&z, "tnem", "", m_gt_1) || + stem(&z, "tne", "", m_gt_1); + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + stem(&z, "eta", "", m_gt_1) || + stem(&z, "iti", "", m_gt_1); + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } + + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** Characters that can be part of a token. We assume any character +** whose value is greater than 0x80 (any UTF character) can be +** part of a token. In other words, delimiters all must have +** values of 0x7f or lower. +*/ +static const char isIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define idChar(C) (((ch=C)&0x80)!=0 || (ch>0x2f && isIdChar[ch-0x30])) +#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !isIdChar[ch-0x30])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +static int porterNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ + const char **pzToken, /* OUT: *pzToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + const char *z = c->zInput; + + while( c->iOffsetnInput ){ + int iStartOffset, ch; + + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + c->nAllocated = n+20; + c->zToken = realloc(c->zToken, c->nAllocated); + if( c->zToken==NULL ) return SQLITE_NOMEM; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the porter-stemmer tokenizer +*/ +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, +}; + +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts1PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h new file mode 100644 index 0000000000..a48cb74519 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h @@ -0,0 +1,90 @@ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS1_TOKENIZER_H_ +#define _FTS1_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +#include "sqlite3.h" + +/* +** Structures used by the tokenizer interface. +*/ +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; + +struct sqlite3_tokenizer_module { + int iVersion; /* currently 0 */ + + /* + ** Create and destroy a tokenizer. argc/argv are passed down from + ** the fulltext virtual table creation to allow customization. + */ + int (*xCreate)(int argc, const char *const*argv, + sqlite3_tokenizer **ppTokenizer); + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Tokenize a particular input. Call xOpen() to prepare to + ** tokenize, xNext() repeatedly until it returns SQLITE_DONE, then + ** xClose() to free any internal state. The pInput passed to + ** xOpen() must exist until the cursor is closed. The ppToken + ** result from xNext() is only valid until the next call to xNext() + ** or until xClose() is called. + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xOpen)(sqlite3_tokenizer *pTokenizer, + const char *pInput, int nBytes, + sqlite3_tokenizer_cursor **ppCursor); + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + int (*xNext)(sqlite3_tokenizer_cursor *pCursor, + const char **ppToken, int *pnBytes, + int *piStartOffset, int *piEndOffset, int *piPosition); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +/* +** Get the module for a tokenizer which generates tokens based on a +** set of non-token characters. The default is to break tokens at any +** non-alnum character, though the set of delimiters can also be +** specified by the first argv argument to xCreate(). +*/ +/* TODO(shess) This doesn't belong here. Need some sort of +** registration process. +*/ +void sqlite3Fts1SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +void sqlite3Fts1PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +#endif /* _FTS1_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c new file mode 100644 index 0000000000..f58fba8f8e --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c @@ -0,0 +1,221 @@ +/* +** The author disclaims copyright to this source code. +** +************************************************************************* +** Implementation of the "simple" full-text-search tokenizer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS1 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS1 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) + + +#include +#include +#include +#include +#include + +#include "fts1_tokenizer.h" + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module simpleTokenizerModule; + +static int isDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = strlen(argv[1]); + for(i=0; i=0x80 ){ + free(t); + return SQLITE_ERROR; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !isalnum(i); + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; + + c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + free(c->pToken); + free(c); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && isDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !isDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + c->nTokenAllocated = n+20; + c->pToken = realloc(c->pToken, c->nTokenAllocated); + if( c->pToken==NULL ) return SQLITE_NOMEM; + } + for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, +}; + +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts1SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers new file mode 100644 index 0000000000..6625b316b1 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers @@ -0,0 +1,134 @@ + +1. FTS2 Tokenizers + + When creating a new full-text table, FTS2 allows the user to select + the text tokenizer implementation to be used when indexing text + by specifying a "tokenizer" clause as part of the CREATE VIRTUAL TABLE + statement: + + CREATE VIRTUAL TABLE USING fts2( + [, tokenizer []] + ); + + The built-in tokenizers (valid values to pass as ) are + "simple" and "porter". + + should consist of zero or more white-space separated + arguments to pass to the selected tokenizer implementation. The + interpretation of the arguments, if any, depends on the individual + tokenizer. + +2. Custom Tokenizers + + FTS2 allows users to provide custom tokenizer implementations. The + interface used to create a new tokenizer is defined and described in + the fts2_tokenizer.h source file. + + Registering a new FTS2 tokenizer is similar to registering a new + virtual table module with SQLite. The user passes a pointer to a + structure containing pointers to various callback functions that + make up the implementation of the new tokenizer type. For tokenizers, + the structure (defined in fts2_tokenizer.h) is called + "sqlite3_tokenizer_module". + + FTS2 does not expose a C-function that users call to register new + tokenizer types with a database handle. Instead, the pointer must + be encoded as an SQL blob value and passed to FTS2 through the SQL + engine by evaluating a special scalar function, "fts2_tokenizer()". + The fts2_tokenizer() function may be called with one or two arguments, + as follows: + + SELECT fts2_tokenizer(); + SELECT fts2_tokenizer(, ); + + Where is a string identifying the tokenizer and + is a pointer to an sqlite3_tokenizer_module + structure encoded as an SQL blob. If the second argument is present, + it is registered as tokenizer and a copy of it + returned. If only one argument is passed, a pointer to the tokenizer + implementation currently registered as is returned, + encoded as a blob. Or, if no such tokenizer exists, an SQL exception + (error) is raised. + + SECURITY: If the fts2 extension is used in an environment where potentially + malicious users may execute arbitrary SQL (i.e. gears), they should be + prevented from invoking the fts2_tokenizer() function, possibly using the + authorisation callback. + + See "Sample code" below for an example of calling the fts2_tokenizer() + function from C code. + +3. ICU Library Tokenizers + + If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor + symbol defined, then there exists a built-in tokenizer named "icu" + implemented using the ICU library. The first argument passed to the + xCreate() method (see fts2_tokenizer.h) of this tokenizer may be + an ICU locale identifier. For example "tr_TR" for Turkish as used + in Turkey, or "en_AU" for English as used in Australia. For example: + + "CREATE VIRTUAL TABLE thai_text USING fts2(text, tokenizer icu th_TH)" + + The ICU tokenizer implementation is very simple. It splits the input + text according to the ICU rules for finding word boundaries and discards + any tokens that consist entirely of white-space. This may be suitable + for some applications in some locales, but not all. If more complex + processing is required, for example to implement stemming or + discard punctuation, this can be done by creating a tokenizer + implementation that uses the ICU tokenizer as part of it's implementation. + + When using the ICU tokenizer this way, it is safe to overwrite the + contents of the strings returned by the xNext() method (see + fts2_tokenizer.h). + +4. Sample code. + + The following two code samples illustrate the way C code should invoke + the fts2_tokenizer() scalar function: + + int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p + ){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts2_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); + } + + int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp + ){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts2_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); + } + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt new file mode 100644 index 0000000000..517a2a0434 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt @@ -0,0 +1,4 @@ +This folder contains source code to the second full-text search +extension for SQLite. While the API is the same, this version uses a +substantially different storage schema from fts1, so tables will need +to be rebuilt. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c new file mode 100644 index 0000000000..65ad173abc --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c @@ -0,0 +1,5936 @@ +/* fts2 has a design flaw which can lead to database corruption (see +** below). It is recommended not to use it any longer, instead use +** fts3 (or higher). If you believe that your use of fts2 is safe, +** add -DSQLITE_ENABLE_BROKEN_FTS2=1 to your CFLAGS. +*/ +#ifndef SQLITE_ENABLE_BROKEN_FTS2 +#error fts2 has a design flaw and has been deprecated. +#endif +/* The flaw is that fts2 uses the content table's unaliased rowid as +** the unique docid. fts2 embeds the rowid in the index it builds, +** and expects the rowid to not change. The SQLite VACUUM operation +** will renumber such rowids, thereby breaking fts2. If you are using +** fts2 in a system which has disabled VACUUM, then you can continue +** to use it safely. Note that PRAGMA auto_vacuum does NOT disable +** VACUUM, though systems using auto_vacuum are unlikely to invoke +** VACUUM. +** +** Unlike fts1, which is safe across VACUUM if you never delete +** documents, fts2 has a second exposure to this flaw, in the segments +** table. So fts2 should be considered unsafe across VACUUM in all +** cases. +*/ + +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is an SQLite module implementing full-text search. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS2 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS2 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). +*/ + +/* TODO(shess) Consider exporting this comment to an HTML file or the +** wiki. +*/ +/* The full-text index is stored in a series of b+tree (-like) +** structures called segments which map terms to doclists. The +** structures are like b+trees in layout, but are constructed from the +** bottom up in optimal fashion and are not updatable. Since trees +** are built from the bottom up, things will be described from the +** bottom up. +** +** +**** Varints **** +** The basic unit of encoding is a variable-length integer called a +** varint. We encode variable-length integers in little-endian order +** using seven bits * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +** +** This is identical to how sqlite encodes varints (see util.c). +** +** +**** Document lists **** +** A doclist (document list) holds a docid-sorted list of hits for a +** given term. Doclists hold docids, and can optionally associate +** token positions and offsets with docids. +** +** A DL_POSITIONS_OFFSETS doclist is stored like this: +** +** array { +** varint docid; +** array { (position list for column 0) +** varint position; (delta from previous position plus POS_BASE) +** varint startOffset; (delta from previous startOffset) +** varint endOffset; (delta from startOffset) +** } +** array { +** varint POS_COLUMN; (marks start of position list for new column) +** varint column; (index of new column) +** array { +** varint position; (delta from previous position plus POS_BASE) +** varint startOffset;(delta from previous startOffset) +** varint endOffset; (delta from startOffset) +** } +** } +** varint POS_END; (marks end of positions for this document. +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. A "position" is an index of a token in the token stream +** generated by the tokenizer, while an "offset" is a byte offset, +** both based at 0. Note that POS_END and POS_COLUMN occur in the +** same logical place as the position element, and act as sentinals +** ending a position list array. +** +** A DL_POSITIONS doclist omits the startOffset and endOffset +** information. A DL_DOCIDS doclist omits both the position and +** offset information, becoming an array of varint-encoded docids. +** +** On-disk data is stored as type DL_DEFAULT, so we don't serialize +** the type. Due to how deletion is implemented in the segmentation +** system, on-disk doclists MUST store at least positions. +** +** +**** Segment leaf nodes **** +** Segment leaf nodes store terms and doclists, ordered by term. Leaf +** nodes are written using LeafWriter, and read using LeafReader (to +** iterate through a single leaf node's data) and LeavesReader (to +** iterate through a segment's entire leaf layer). Leaf nodes have +** the format: +** +** varint iHeight; (height from leaf level, always 0) +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of prefix shared with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix];(unshared suffix of next term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. +** +** Leaf nodes are broken into blocks which are stored contiguously in +** the %_segments table in sorted order. This means that when the end +** of a node is reached, the next term is in the node with the next +** greater node id. +** +** New data is spilled to a new leaf node when the current node +** exceeds LEAF_MAX bytes (default 2048). New data which itself is +** larger than STANDALONE_MIN (default 1024) is placed in a standalone +** node (a leaf node with a single term and doclist). The goal of +** these settings is to pack together groups of small doclists while +** making it efficient to directly access large doclists. The +** assumption is that large doclists represent terms which are more +** likely to be query targets. +** +** TODO(shess) It may be useful for blocking decisions to be more +** dynamic. For instance, it may make more sense to have a 2.5k leaf +** node rather than splitting into 2k and .5k nodes. My intuition is +** that this might extend through 2x or 4x the pagesize. +** +** +**** Segment interior nodes **** +** Segment interior nodes store blockids for subtree nodes and terms +** to describe what data is stored by the each subtree. Interior +** nodes are written using InteriorWriter, and read using +** InteriorReader. InteriorWriters are created as needed when +** SegmentWriter creates new leaf nodes, or when an interior node +** itself grows too big and must be split. The format of interior +** nodes: +** +** varint iHeight; (height from leaf level, always >0) +** varint iBlockid; (block id of node's leftmost subtree) +** optional { +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of shared prefix with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix]; (unshared suffix of next term) +** } +** } +** +** Here, optional { X } means an optional element, while array { X } +** means zero or more occurrences of X, adjacent in memory. +** +** An interior node encodes n terms separating n+1 subtrees. The +** subtree blocks are contiguous, so only the first subtree's blockid +** is encoded. The subtree at iBlockid will contain all terms less +** than the first term encoded (or all terms if no term is encoded). +** Otherwise, for terms greater than or equal to pTerm[i] but less +** than pTerm[i+1], the subtree for that term will be rooted at +** iBlockid+i. Interior nodes only store enough term data to +** distinguish adjacent children (if the rightmost term of the left +** child is "something", and the leftmost term of the right child is +** "wicked", only "w" is stored). +** +** New data is spilled to a new interior node at the same height when +** the current node exceeds INTERIOR_MAX bytes (default 2048). +** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing +** interior nodes and making the tree too skinny. The interior nodes +** at a given height are naturally tracked by interior nodes at +** height+1, and so on. +** +** +**** Segment directory **** +** The segment directory in table %_segdir stores meta-information for +** merging and deleting segments, and also the root node of the +** segment's tree. +** +** The root node is the top node of the segment's tree after encoding +** the entire segment, restricted to ROOT_MAX bytes (default 1024). +** This could be either a leaf node or an interior node. If the top +** node requires more than ROOT_MAX bytes, it is flushed to %_segments +** and a new root interior node is generated (which should always fit +** within ROOT_MAX because it only needs space for 2 varints, the +** height and the blockid of the previous root). +** +** The meta-information in the segment directory is: +** level - segment level (see below) +** idx - index within level +** - (level,idx uniquely identify a segment) +** start_block - first leaf node +** leaves_end_block - last leaf node +** end_block - last block (including interior nodes) +** root - contents of root node +** +** If the root node is a leaf node, then start_block, +** leaves_end_block, and end_block are all 0. +** +** +**** Segment merging **** +** To amortize update costs, segments are groups into levels and +** merged in matches. Each increase in level represents exponentially +** more documents. +** +** New documents (actually, document updates) are tokenized and +** written individually (using LeafWriter) to a level 0 segment, with +** incrementing idx. When idx reaches MERGE_COUNT (default 16), all +** level 0 segments are merged into a single level 1 segment. Level 1 +** is populated like level 0, and eventually MERGE_COUNT level 1 +** segments are merged to a single level 2 segment (representing +** MERGE_COUNT^2 updates), and so on. +** +** A segment merge traverses all segments at a given level in +** parallel, performing a straightforward sorted merge. Since segment +** leaf nodes are written in to the %_segments table in order, this +** merge traverses the underlying sqlite disk structures efficiently. +** After the merge, all segment blocks from the merged level are +** deleted. +** +** MERGE_COUNT controls how often we merge segments. 16 seems to be +** somewhat of a sweet spot for insertion performance. 32 and 64 show +** very similar performance numbers to 16 on insertion, though they're +** a tiny bit slower (perhaps due to more overhead in merge-time +** sorting). 8 is about 20% slower than 16, 4 about 50% slower than +** 16, 2 about 66% slower than 16. +** +** At query time, high MERGE_COUNT increases the number of segments +** which need to be scanned and merged. For instance, with 100k docs +** inserted: +** +** MERGE_COUNT segments +** 16 25 +** 8 12 +** 4 10 +** 2 6 +** +** This appears to have only a moderate impact on queries for very +** frequent terms (which are somewhat dominated by segment merge +** costs), and infrequent and non-existent terms still seem to be fast +** even with many segments. +** +** TODO(shess) That said, it would be nice to have a better query-side +** argument for MERGE_COUNT of 16. Also, it's possible/likely that +** optimizations to things like doclist merging will swing the sweet +** spot around. +** +** +** +**** Handling of deletions and updates **** +** Since we're using a segmented structure, with no docid-oriented +** index into the term index, we clearly cannot simply update the term +** index when a document is deleted or updated. For deletions, we +** write an empty doclist (varint(docid) varint(POS_END)), for updates +** we simply write the new doclist. Segment merges overwrite older +** data for a particular docid with newer data, so deletes or updates +** will eventually overtake the earlier data and knock it out. The +** query logic likewise merges doclists so that newer data knocks out +** older data. +** +** TODO(shess) Provide a VACUUM type operation to clear out all +** deletions and duplications. This would basically be a forced merge +** into a single segment. +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) + +#if defined(SQLITE_ENABLE_FTS2) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +#include +#include +#include +#include +#include + +#include "fts2.h" +#include "fts2_hash.h" +#include "fts2_tokenizer.h" +#include "sqlite3.h" +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + + +/* TODO(shess) MAN, this thing needs some refactoring. At minimum, it +** would be nice to order the file better, perhaps something along the +** lines of: +** +** - utility functions +** - table setup functions +** - table update functions +** - table query functions +** +** Put the query functions last because they're likely to reference +** typedefs or functions from the table update section. +*/ + +#if 0 +# define TRACE(A) printf A; fflush(stdout) +#else +# define TRACE(A) +#endif + +/* It is not safe to call isspace(), tolower(), or isalnum() on +** hi-bit-set characters. This is the same solution used in the +** tokenizer. +*/ +/* TODO(shess) The snippet-generation code should be using the +** tokenizer-generated tokens rather than doing its own local +** tokenization. +*/ +/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ +static int safe_isspace(char c){ + return (c&0x80)==0 ? isspace(c) : 0; +} +static int safe_tolower(char c){ + return (c&0x80)==0 ? tolower(c) : c; +} +static int safe_isalnum(char c){ + return (c&0x80)==0 ? isalnum(c) : 0; +} + +typedef enum DocListType { + DL_DOCIDS, /* docids only */ + DL_POSITIONS, /* docids + positions */ + DL_POSITIONS_OFFSETS /* docids + positions + offsets */ +} DocListType; + +/* +** By default, only positions and not offsets are stored in the doclists. +** To change this so that offsets are stored too, compile with +** +** -DDL_DEFAULT=DL_POSITIONS_OFFSETS +** +** If DL_DEFAULT is set to DL_DOCIDS, your table can only be inserted +** into (no deletes or updates). +*/ +#ifndef DL_DEFAULT +# define DL_DEFAULT DL_POSITIONS +#endif + +enum { + POS_END = 0, /* end of this position list */ + POS_COLUMN, /* followed by new column number */ + POS_BASE +}; + +/* MERGE_COUNT controls how often we merge segments (see comment at +** top of file). +*/ +#define MERGE_COUNT 16 + +/* utility functions */ + +/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single +** record to prevent errors of the form: +** +** my_function(SomeType *b){ +** memset(b, '\0', sizeof(b)); // sizeof(b)!=sizeof(*b) +** } +*/ +/* TODO(shess) Obvious candidates for a header file. */ +#define CLEAR(b) memset(b, '\0', sizeof(*(b))) + +#ifndef NDEBUG +# define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b))) +#else +# define SCRAMBLE(b) +#endif + +/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ +#define VARINT_MAX 10 + +/* Write a 64-bit variable-length integer to memory starting at p[0]. + * The length of data written will be between 1 and VARINT_MAX bytes. + * The number of bytes written is returned. */ +static int putVarint(char *p, sqlite_int64 v){ + unsigned char *q = (unsigned char *) p; + sqlite_uint64 vu = v; + do{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +/* Read a 64-bit variable-length integer from memory starting at p[0]. + * Return the number of bytes read, or 0 on error. + * The value is stored in *v. */ +static int getVarint(const char *p, sqlite_int64 *v){ + const unsigned char *q = (const unsigned char *) p; + sqlite_uint64 x = 0, y = 1; + while( (*q & 0x80) == 0x80 ){ + x += y * (*q++ & 0x7f); + y <<= 7; + if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ + assert( 0 ); + return 0; + } + } + x += y * (*q++); + *v = (sqlite_int64) x; + return (int) (q - (unsigned char *)p); +} + +static int getVarint32(const char *p, int *pi){ + sqlite_int64 i; + int ret = getVarint(p, &i); + *pi = (int) i; + assert( *pi==i ); + return ret; +} + +/*******************************************************************/ +/* DataBuffer is used to collect data into a buffer in piecemeal +** fashion. It implements the usual distinction between amount of +** data currently stored (nData) and buffer capacity (nCapacity). +** +** dataBufferInit - create a buffer with given initial capacity. +** dataBufferReset - forget buffer's data, retaining capacity. +** dataBufferDestroy - free buffer's data. +** dataBufferExpand - expand capacity without adding data. +** dataBufferAppend - append data. +** dataBufferAppend2 - append two pieces of data at once. +** dataBufferReplace - replace buffer's data. +*/ +typedef struct DataBuffer { + char *pData; /* Pointer to malloc'ed buffer. */ + int nCapacity; /* Size of pData buffer. */ + int nData; /* End of data loaded into pData. */ +} DataBuffer; + +static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){ + assert( nCapacity>=0 ); + pBuffer->nData = 0; + pBuffer->nCapacity = nCapacity; + pBuffer->pData = nCapacity==0 ? NULL : malloc(nCapacity); +} +static void dataBufferReset(DataBuffer *pBuffer){ + pBuffer->nData = 0; +} +static void dataBufferDestroy(DataBuffer *pBuffer){ + if( pBuffer->pData!=NULL ) free(pBuffer->pData); + SCRAMBLE(pBuffer); +} +static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){ + assert( nAddCapacity>0 ); + /* TODO(shess) Consider expanding more aggressively. Note that the + ** underlying malloc implementation may take care of such things for + ** us already. + */ + if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){ + pBuffer->nCapacity = pBuffer->nData+nAddCapacity; + pBuffer->pData = realloc(pBuffer->pData, pBuffer->nCapacity); + } +} +static void dataBufferAppend(DataBuffer *pBuffer, + const char *pSource, int nSource){ + assert( nSource>0 && pSource!=NULL ); + dataBufferExpand(pBuffer, nSource); + memcpy(pBuffer->pData+pBuffer->nData, pSource, nSource); + pBuffer->nData += nSource; +} +static void dataBufferAppend2(DataBuffer *pBuffer, + const char *pSource1, int nSource1, + const char *pSource2, int nSource2){ + assert( nSource1>0 && pSource1!=NULL ); + assert( nSource2>0 && pSource2!=NULL ); + dataBufferExpand(pBuffer, nSource1+nSource2); + memcpy(pBuffer->pData+pBuffer->nData, pSource1, nSource1); + memcpy(pBuffer->pData+pBuffer->nData+nSource1, pSource2, nSource2); + pBuffer->nData += nSource1+nSource2; +} +static void dataBufferReplace(DataBuffer *pBuffer, + const char *pSource, int nSource){ + dataBufferReset(pBuffer); + dataBufferAppend(pBuffer, pSource, nSource); +} + +/* StringBuffer is a null-terminated version of DataBuffer. */ +typedef struct StringBuffer { + DataBuffer b; /* Includes null terminator. */ +} StringBuffer; + +static void initStringBuffer(StringBuffer *sb){ + dataBufferInit(&sb->b, 100); + dataBufferReplace(&sb->b, "", 1); +} +static int stringBufferLength(StringBuffer *sb){ + return sb->b.nData-1; +} +static char *stringBufferData(StringBuffer *sb){ + return sb->b.pData; +} +static void stringBufferDestroy(StringBuffer *sb){ + dataBufferDestroy(&sb->b); +} + +static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ + assert( sb->b.nData>0 ); + if( nFrom>0 ){ + sb->b.nData--; + dataBufferAppend2(&sb->b, zFrom, nFrom, "", 1); + } +} +static void append(StringBuffer *sb, const char *zFrom){ + nappend(sb, zFrom, strlen(zFrom)); +} + +/* Append a list of strings separated by commas. */ +static void appendList(StringBuffer *sb, int nString, char **azString){ + int i; + for(i=0; i0 ) append(sb, ", "); + append(sb, azString[i]); + } +} + +static int endsInWhiteSpace(StringBuffer *p){ + return stringBufferLength(p)>0 && + safe_isspace(stringBufferData(p)[stringBufferLength(p)-1]); +} + +/* If the StringBuffer ends in something other than white space, add a +** single space character to the end. +*/ +static void appendWhiteSpace(StringBuffer *p){ + if( stringBufferLength(p)==0 ) return; + if( !endsInWhiteSpace(p) ) append(p, " "); +} + +/* Remove white space from the end of the StringBuffer */ +static void trimWhiteSpace(StringBuffer *p){ + while( endsInWhiteSpace(p) ){ + p->b.pData[--p->b.nData-1] = '\0'; + } +} + +/*******************************************************************/ +/* DLReader is used to read document elements from a doclist. The +** current docid is cached, so dlrDocid() is fast. DLReader does not +** own the doclist buffer. +** +** dlrAtEnd - true if there's no more data to read. +** dlrDocid - docid of current document. +** dlrDocData - doclist data for current document (including docid). +** dlrDocDataBytes - length of same. +** dlrAllDataBytes - length of all remaining data. +** dlrPosData - position data for current document. +** dlrPosDataLen - length of pos data for current document (incl POS_END). +** dlrStep - step to current document. +** dlrInit - initial for doclist of given type against given data. +** dlrDestroy - clean up. +** +** Expected usage is something like: +** +** DLReader reader; +** dlrInit(&reader, pData, nData); +** while( !dlrAtEnd(&reader) ){ +** // calls to dlrDocid() and kin. +** dlrStep(&reader); +** } +** dlrDestroy(&reader); +*/ +typedef struct DLReader { + DocListType iType; + const char *pData; + int nData; + + sqlite_int64 iDocid; + int nElement; +} DLReader; + +static int dlrAtEnd(DLReader *pReader){ + assert( pReader->nData>=0 ); + return pReader->nData==0; +} +static sqlite_int64 dlrDocid(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->iDocid; +} +static const char *dlrDocData(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->pData; +} +static int dlrDocDataBytes(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->nElement; +} +static int dlrAllDataBytes(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->nData; +} +/* TODO(shess) Consider adding a field to track iDocid varint length +** to make these two functions faster. This might matter (a tiny bit) +** for queries. +*/ +static const char *dlrPosData(DLReader *pReader){ + sqlite_int64 iDummy; + int n = getVarint(pReader->pData, &iDummy); + assert( !dlrAtEnd(pReader) ); + return pReader->pData+n; +} +static int dlrPosDataLen(DLReader *pReader){ + sqlite_int64 iDummy; + int n = getVarint(pReader->pData, &iDummy); + assert( !dlrAtEnd(pReader) ); + return pReader->nElement-n; +} +static void dlrStep(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + + /* Skip past current doclist element. */ + assert( pReader->nElement<=pReader->nData ); + pReader->pData += pReader->nElement; + pReader->nData -= pReader->nElement; + + /* If there is more data, read the next doclist element. */ + if( pReader->nData!=0 ){ + sqlite_int64 iDocidDelta; + int iDummy, n = getVarint(pReader->pData, &iDocidDelta); + pReader->iDocid += iDocidDelta; + if( pReader->iType>=DL_POSITIONS ){ + assert( nnData ); + while( 1 ){ + n += getVarint32(pReader->pData+n, &iDummy); + assert( n<=pReader->nData ); + if( iDummy==POS_END ) break; + if( iDummy==POS_COLUMN ){ + n += getVarint32(pReader->pData+n, &iDummy); + assert( nnData ); + }else if( pReader->iType==DL_POSITIONS_OFFSETS ){ + n += getVarint32(pReader->pData+n, &iDummy); + n += getVarint32(pReader->pData+n, &iDummy); + assert( nnData ); + } + } + } + pReader->nElement = n; + assert( pReader->nElement<=pReader->nData ); + } +} +static void dlrInit(DLReader *pReader, DocListType iType, + const char *pData, int nData){ + assert( pData!=NULL && nData!=0 ); + pReader->iType = iType; + pReader->pData = pData; + pReader->nData = nData; + pReader->nElement = 0; + pReader->iDocid = 0; + + /* Load the first element's data. There must be a first element. */ + dlrStep(pReader); +} +static void dlrDestroy(DLReader *pReader){ + SCRAMBLE(pReader); +} + +#ifndef NDEBUG +/* Verify that the doclist can be validly decoded. Also returns the +** last docid found because it's convenient in other assertions for +** DLWriter. +*/ +static void docListValidate(DocListType iType, const char *pData, int nData, + sqlite_int64 *pLastDocid){ + sqlite_int64 iPrevDocid = 0; + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + while( nData!=0 ){ + sqlite_int64 iDocidDelta; + int n = getVarint(pData, &iDocidDelta); + iPrevDocid += iDocidDelta; + if( iType>DL_DOCIDS ){ + int iDummy; + while( 1 ){ + n += getVarint32(pData+n, &iDummy); + if( iDummy==POS_END ) break; + if( iDummy==POS_COLUMN ){ + n += getVarint32(pData+n, &iDummy); + }else if( iType>DL_POSITIONS ){ + n += getVarint32(pData+n, &iDummy); + n += getVarint32(pData+n, &iDummy); + } + assert( n<=nData ); + } + } + assert( n<=nData ); + pData += n; + nData -= n; + } + if( pLastDocid ) *pLastDocid = iPrevDocid; +} +#define ASSERT_VALID_DOCLIST(i, p, n, o) docListValidate(i, p, n, o) +#else +#define ASSERT_VALID_DOCLIST(i, p, n, o) assert( 1 ) +#endif + +/*******************************************************************/ +/* DLWriter is used to write doclist data to a DataBuffer. DLWriter +** always appends to the buffer and does not own it. +** +** dlwInit - initialize to write a given type doclistto a buffer. +** dlwDestroy - clear the writer's memory. Does not free buffer. +** dlwAppend - append raw doclist data to buffer. +** dlwCopy - copy next doclist from reader to writer. +** dlwAdd - construct doclist element and append to buffer. +** Only apply dlwAdd() to DL_DOCIDS doclists (else use PLWriter). +*/ +typedef struct DLWriter { + DocListType iType; + DataBuffer *b; + sqlite_int64 iPrevDocid; +#ifndef NDEBUG + int has_iPrevDocid; +#endif +} DLWriter; + +static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){ + pWriter->b = b; + pWriter->iType = iType; + pWriter->iPrevDocid = 0; +#ifndef NDEBUG + pWriter->has_iPrevDocid = 0; +#endif +} +static void dlwDestroy(DLWriter *pWriter){ + SCRAMBLE(pWriter); +} +/* iFirstDocid is the first docid in the doclist in pData. It is +** needed because pData may point within a larger doclist, in which +** case the first item would be delta-encoded. +** +** iLastDocid is the final docid in the doclist in pData. It is +** needed to create the new iPrevDocid for future delta-encoding. The +** code could decode the passed doclist to recreate iLastDocid, but +** the only current user (docListMerge) already has decoded this +** information. +*/ +/* TODO(shess) This has become just a helper for docListMerge. +** Consider a refactor to make this cleaner. +*/ +static void dlwAppend(DLWriter *pWriter, + const char *pData, int nData, + sqlite_int64 iFirstDocid, sqlite_int64 iLastDocid){ + sqlite_int64 iDocid = 0; + char c[VARINT_MAX]; + int nFirstOld, nFirstNew; /* Old and new varint len of first docid. */ +#ifndef NDEBUG + sqlite_int64 iLastDocidDelta; +#endif + + /* Recode the initial docid as delta from iPrevDocid. */ + nFirstOld = getVarint(pData, &iDocid); + assert( nFirstOldiType==DL_DOCIDS) ); + nFirstNew = putVarint(c, iFirstDocid-pWriter->iPrevDocid); + + /* Verify that the incoming doclist is valid AND that it ends with + ** the expected docid. This is essential because we'll trust this + ** docid in future delta-encoding. + */ + ASSERT_VALID_DOCLIST(pWriter->iType, pData, nData, &iLastDocidDelta); + assert( iLastDocid==iFirstDocid-iDocid+iLastDocidDelta ); + + /* Append recoded initial docid and everything else. Rest of docids + ** should have been delta-encoded from previous initial docid. + */ + if( nFirstOldb, c, nFirstNew, + pData+nFirstOld, nData-nFirstOld); + }else{ + dataBufferAppend(pWriter->b, c, nFirstNew); + } + pWriter->iPrevDocid = iLastDocid; +} +static void dlwCopy(DLWriter *pWriter, DLReader *pReader){ + dlwAppend(pWriter, dlrDocData(pReader), dlrDocDataBytes(pReader), + dlrDocid(pReader), dlrDocid(pReader)); +} +static void dlwAdd(DLWriter *pWriter, sqlite_int64 iDocid){ + char c[VARINT_MAX]; + int n = putVarint(c, iDocid-pWriter->iPrevDocid); + + /* Docids must ascend. */ + assert( !pWriter->has_iPrevDocid || iDocid>pWriter->iPrevDocid ); + assert( pWriter->iType==DL_DOCIDS ); + + dataBufferAppend(pWriter->b, c, n); + pWriter->iPrevDocid = iDocid; +#ifndef NDEBUG + pWriter->has_iPrevDocid = 1; +#endif +} + +/*******************************************************************/ +/* PLReader is used to read data from a document's position list. As +** the caller steps through the list, data is cached so that varints +** only need to be decoded once. +** +** plrInit, plrDestroy - create/destroy a reader. +** plrColumn, plrPosition, plrStartOffset, plrEndOffset - accessors +** plrAtEnd - at end of stream, only call plrDestroy once true. +** plrStep - step to the next element. +*/ +typedef struct PLReader { + /* These refer to the next position's data. nData will reach 0 when + ** reading the last position, so plrStep() signals EOF by setting + ** pData to NULL. + */ + const char *pData; + int nData; + + DocListType iType; + int iColumn; /* the last column read */ + int iPosition; /* the last position read */ + int iStartOffset; /* the last start offset read */ + int iEndOffset; /* the last end offset read */ +} PLReader; + +static int plrAtEnd(PLReader *pReader){ + return pReader->pData==NULL; +} +static int plrColumn(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iColumn; +} +static int plrPosition(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iPosition; +} +static int plrStartOffset(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iStartOffset; +} +static int plrEndOffset(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iEndOffset; +} +static void plrStep(PLReader *pReader){ + int i, n; + + assert( !plrAtEnd(pReader) ); + + if( pReader->nData==0 ){ + pReader->pData = NULL; + return; + } + + n = getVarint32(pReader->pData, &i); + if( i==POS_COLUMN ){ + n += getVarint32(pReader->pData+n, &pReader->iColumn); + pReader->iPosition = 0; + pReader->iStartOffset = 0; + n += getVarint32(pReader->pData+n, &i); + } + /* Should never see adjacent column changes. */ + assert( i!=POS_COLUMN ); + + if( i==POS_END ){ + pReader->nData = 0; + pReader->pData = NULL; + return; + } + + pReader->iPosition += i-POS_BASE; + if( pReader->iType==DL_POSITIONS_OFFSETS ){ + n += getVarint32(pReader->pData+n, &i); + pReader->iStartOffset += i; + n += getVarint32(pReader->pData+n, &i); + pReader->iEndOffset = pReader->iStartOffset+i; + } + assert( n<=pReader->nData ); + pReader->pData += n; + pReader->nData -= n; +} + +static void plrInit(PLReader *pReader, DLReader *pDLReader){ + pReader->pData = dlrPosData(pDLReader); + pReader->nData = dlrPosDataLen(pDLReader); + pReader->iType = pDLReader->iType; + pReader->iColumn = 0; + pReader->iPosition = 0; + pReader->iStartOffset = 0; + pReader->iEndOffset = 0; + plrStep(pReader); +} +static void plrDestroy(PLReader *pReader){ + SCRAMBLE(pReader); +} + +/*******************************************************************/ +/* PLWriter is used in constructing a document's position list. As a +** convenience, if iType is DL_DOCIDS, PLWriter becomes a no-op. +** PLWriter writes to the associated DLWriter's buffer. +** +** plwInit - init for writing a document's poslist. +** plwDestroy - clear a writer. +** plwAdd - append position and offset information. +** plwCopy - copy next position's data from reader to writer. +** plwTerminate - add any necessary doclist terminator. +** +** Calling plwAdd() after plwTerminate() may result in a corrupt +** doclist. +*/ +/* TODO(shess) Until we've written the second item, we can cache the +** first item's information. Then we'd have three states: +** +** - initialized with docid, no positions. +** - docid and one position. +** - docid and multiple positions. +** +** Only the last state needs to actually write to dlw->b, which would +** be an improvement in the DLCollector case. +*/ +typedef struct PLWriter { + DLWriter *dlw; + + int iColumn; /* the last column written */ + int iPos; /* the last position written */ + int iOffset; /* the last start offset written */ +} PLWriter; + +/* TODO(shess) In the case where the parent is reading these values +** from a PLReader, we could optimize to a copy if that PLReader has +** the same type as pWriter. +*/ +static void plwAdd(PLWriter *pWriter, int iColumn, int iPos, + int iStartOffset, int iEndOffset){ + /* Worst-case space for POS_COLUMN, iColumn, iPosDelta, + ** iStartOffsetDelta, and iEndOffsetDelta. + */ + char c[5*VARINT_MAX]; + int n = 0; + + /* Ban plwAdd() after plwTerminate(). */ + assert( pWriter->iPos!=-1 ); + + if( pWriter->dlw->iType==DL_DOCIDS ) return; + + if( iColumn!=pWriter->iColumn ){ + n += putVarint(c+n, POS_COLUMN); + n += putVarint(c+n, iColumn); + pWriter->iColumn = iColumn; + pWriter->iPos = 0; + pWriter->iOffset = 0; + } + assert( iPos>=pWriter->iPos ); + n += putVarint(c+n, POS_BASE+(iPos-pWriter->iPos)); + pWriter->iPos = iPos; + if( pWriter->dlw->iType==DL_POSITIONS_OFFSETS ){ + assert( iStartOffset>=pWriter->iOffset ); + n += putVarint(c+n, iStartOffset-pWriter->iOffset); + pWriter->iOffset = iStartOffset; + assert( iEndOffset>=iStartOffset ); + n += putVarint(c+n, iEndOffset-iStartOffset); + } + dataBufferAppend(pWriter->dlw->b, c, n); +} +static void plwCopy(PLWriter *pWriter, PLReader *pReader){ + plwAdd(pWriter, plrColumn(pReader), plrPosition(pReader), + plrStartOffset(pReader), plrEndOffset(pReader)); +} +static void plwInit(PLWriter *pWriter, DLWriter *dlw, sqlite_int64 iDocid){ + char c[VARINT_MAX]; + int n; + + pWriter->dlw = dlw; + + /* Docids must ascend. */ + assert( !pWriter->dlw->has_iPrevDocid || iDocid>pWriter->dlw->iPrevDocid ); + n = putVarint(c, iDocid-pWriter->dlw->iPrevDocid); + dataBufferAppend(pWriter->dlw->b, c, n); + pWriter->dlw->iPrevDocid = iDocid; +#ifndef NDEBUG + pWriter->dlw->has_iPrevDocid = 1; +#endif + + pWriter->iColumn = 0; + pWriter->iPos = 0; + pWriter->iOffset = 0; +} +/* TODO(shess) Should plwDestroy() also terminate the doclist? But +** then plwDestroy() would no longer be just a destructor, it would +** also be doing work, which isn't consistent with the overall idiom. +** Another option would be for plwAdd() to always append any necessary +** terminator, so that the output is always correct. But that would +** add incremental work to the common case with the only benefit being +** API elegance. Punt for now. +*/ +static void plwTerminate(PLWriter *pWriter){ + if( pWriter->dlw->iType>DL_DOCIDS ){ + char c[VARINT_MAX]; + int n = putVarint(c, POS_END); + dataBufferAppend(pWriter->dlw->b, c, n); + } +#ifndef NDEBUG + /* Mark as terminated for assert in plwAdd(). */ + pWriter->iPos = -1; +#endif +} +static void plwDestroy(PLWriter *pWriter){ + SCRAMBLE(pWriter); +} + +/*******************************************************************/ +/* DLCollector wraps PLWriter and DLWriter to provide a +** dynamically-allocated doclist area to use during tokenization. +** +** dlcNew - malloc up and initialize a collector. +** dlcDelete - destroy a collector and all contained items. +** dlcAddPos - append position and offset information. +** dlcAddDoclist - add the collected doclist to the given buffer. +** dlcNext - terminate the current document and open another. +*/ +typedef struct DLCollector { + DataBuffer b; + DLWriter dlw; + PLWriter plw; +} DLCollector; + +/* TODO(shess) This could also be done by calling plwTerminate() and +** dataBufferAppend(). I tried that, expecting nominal performance +** differences, but it seemed to pretty reliably be worth 1% to code +** it this way. I suspect it's the incremental malloc overhead (some +** percentage of the plwTerminate() calls will cause a realloc), so +** this might be worth revisiting if the DataBuffer implementation +** changes. +*/ +static void dlcAddDoclist(DLCollector *pCollector, DataBuffer *b){ + if( pCollector->dlw.iType>DL_DOCIDS ){ + char c[VARINT_MAX]; + int n = putVarint(c, POS_END); + dataBufferAppend2(b, pCollector->b.pData, pCollector->b.nData, c, n); + }else{ + dataBufferAppend(b, pCollector->b.pData, pCollector->b.nData); + } +} +static void dlcNext(DLCollector *pCollector, sqlite_int64 iDocid){ + plwTerminate(&pCollector->plw); + plwDestroy(&pCollector->plw); + plwInit(&pCollector->plw, &pCollector->dlw, iDocid); +} +static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos, + int iStartOffset, int iEndOffset){ + plwAdd(&pCollector->plw, iColumn, iPos, iStartOffset, iEndOffset); +} + +static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){ + DLCollector *pCollector = malloc(sizeof(DLCollector)); + dataBufferInit(&pCollector->b, 0); + dlwInit(&pCollector->dlw, iType, &pCollector->b); + plwInit(&pCollector->plw, &pCollector->dlw, iDocid); + return pCollector; +} +static void dlcDelete(DLCollector *pCollector){ + plwDestroy(&pCollector->plw); + dlwDestroy(&pCollector->dlw); + dataBufferDestroy(&pCollector->b); + SCRAMBLE(pCollector); + free(pCollector); +} + + +/* Copy the doclist data of iType in pData/nData into *out, trimming +** unnecessary data as we go. Only columns matching iColumn are +** copied, all columns copied if iColumn is -1. Elements with no +** matching columns are dropped. The output is an iOutType doclist. +*/ +/* NOTE(shess) This code is only valid after all doclists are merged. +** If this is run before merges, then doclist items which represent +** deletion will be trimmed, and will thus not effect a deletion +** during the merge. +*/ +static void docListTrim(DocListType iType, const char *pData, int nData, + int iColumn, DocListType iOutType, DataBuffer *out){ + DLReader dlReader; + DLWriter dlWriter; + + assert( iOutType<=iType ); + + dlrInit(&dlReader, iType, pData, nData); + dlwInit(&dlWriter, iOutType, out); + + while( !dlrAtEnd(&dlReader) ){ + PLReader plReader; + PLWriter plWriter; + int match = 0; + + plrInit(&plReader, &dlReader); + + while( !plrAtEnd(&plReader) ){ + if( iColumn==-1 || plrColumn(&plReader)==iColumn ){ + if( !match ){ + plwInit(&plWriter, &dlWriter, dlrDocid(&dlReader)); + match = 1; + } + plwAdd(&plWriter, plrColumn(&plReader), plrPosition(&plReader), + plrStartOffset(&plReader), plrEndOffset(&plReader)); + } + plrStep(&plReader); + } + if( match ){ + plwTerminate(&plWriter); + plwDestroy(&plWriter); + } + + plrDestroy(&plReader); + dlrStep(&dlReader); + } + dlwDestroy(&dlWriter); + dlrDestroy(&dlReader); +} + +/* Used by docListMerge() to keep doclists in the ascending order by +** docid, then ascending order by age (so the newest comes first). +*/ +typedef struct OrderedDLReader { + DLReader *pReader; + + /* TODO(shess) If we assume that docListMerge pReaders is ordered by + ** age (which we do), then we could use pReader comparisons to break + ** ties. + */ + int idx; +} OrderedDLReader; + +/* Order eof to end, then by docid asc, idx desc. */ +static int orderedDLReaderCmp(OrderedDLReader *r1, OrderedDLReader *r2){ + if( dlrAtEnd(r1->pReader) ){ + if( dlrAtEnd(r2->pReader) ) return 0; /* Both atEnd(). */ + return 1; /* Only r1 atEnd(). */ + } + if( dlrAtEnd(r2->pReader) ) return -1; /* Only r2 atEnd(). */ + + if( dlrDocid(r1->pReader)pReader) ) return -1; + if( dlrDocid(r1->pReader)>dlrDocid(r2->pReader) ) return 1; + + /* Descending on idx. */ + return r2->idx-r1->idx; +} + +/* Bubble p[0] to appropriate place in p[1..n-1]. Assumes that +** p[1..n-1] is already sorted. +*/ +/* TODO(shess) Is this frequent enough to warrant a binary search? +** Before implementing that, instrument the code to check. In most +** current usage, I expect that p[0] will be less than p[1] a very +** high proportion of the time. +*/ +static void orderedDLReaderReorder(OrderedDLReader *p, int n){ + while( n>1 && orderedDLReaderCmp(p, p+1)>0 ){ + OrderedDLReader tmp = p[0]; + p[0] = p[1]; + p[1] = tmp; + n--; + p++; + } +} + +/* Given an array of doclist readers, merge their doclist elements +** into out in sorted order (by docid), dropping elements from older +** readers when there is a duplicate docid. pReaders is assumed to be +** ordered by age, oldest first. +*/ +/* TODO(shess) nReaders must be <= MERGE_COUNT. This should probably +** be fixed. +*/ +static void docListMerge(DataBuffer *out, + DLReader *pReaders, int nReaders){ + OrderedDLReader readers[MERGE_COUNT]; + DLWriter writer; + int i, n; + const char *pStart = 0; + int nStart = 0; + sqlite_int64 iFirstDocid = 0, iLastDocid = 0; + + assert( nReaders>0 ); + if( nReaders==1 ){ + dataBufferAppend(out, dlrDocData(pReaders), dlrAllDataBytes(pReaders)); + return; + } + + assert( nReaders<=MERGE_COUNT ); + n = 0; + for(i=0; i0 ){ + orderedDLReaderReorder(readers+i, nReaders-i); + } + + dlwInit(&writer, pReaders[0].iType, out); + while( !dlrAtEnd(readers[0].pReader) ){ + sqlite_int64 iDocid = dlrDocid(readers[0].pReader); + + /* If this is a continuation of the current buffer to copy, extend + ** that buffer. memcpy() seems to be more efficient if it has a + ** lots of data to copy. + */ + if( dlrDocData(readers[0].pReader)==pStart+nStart ){ + nStart += dlrDocDataBytes(readers[0].pReader); + }else{ + if( pStart!=0 ){ + dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); + } + pStart = dlrDocData(readers[0].pReader); + nStart = dlrDocDataBytes(readers[0].pReader); + iFirstDocid = iDocid; + } + iLastDocid = iDocid; + dlrStep(readers[0].pReader); + + /* Drop all of the older elements with the same docid. */ + for(i=1; i0 ){ + orderedDLReaderReorder(readers+i, nReaders-i); + } + } + + /* Copy over any remaining elements. */ + if( nStart>0 ) dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); + dlwDestroy(&writer); +} + +/* Helper function for posListUnion(). Compares the current position +** between left and right, returning as standard C idiom of <0 if +** left0 if left>right, and 0 if left==right. "End" always +** compares greater. +*/ +static int posListCmp(PLReader *pLeft, PLReader *pRight){ + assert( pLeft->iType==pRight->iType ); + if( pLeft->iType==DL_DOCIDS ) return 0; + + if( plrAtEnd(pLeft) ) return plrAtEnd(pRight) ? 0 : 1; + if( plrAtEnd(pRight) ) return -1; + + if( plrColumn(pLeft)plrColumn(pRight) ) return 1; + + if( plrPosition(pLeft)plrPosition(pRight) ) return 1; + if( pLeft->iType==DL_POSITIONS ) return 0; + + if( plrStartOffset(pLeft)plrStartOffset(pRight) ) return 1; + + if( plrEndOffset(pLeft)plrEndOffset(pRight) ) return 1; + + return 0; +} + +/* Write the union of position lists in pLeft and pRight to pOut. +** "Union" in this case meaning "All unique position tuples". Should +** work with any doclist type, though both inputs and the output +** should be the same type. +*/ +static void posListUnion(DLReader *pLeft, DLReader *pRight, DLWriter *pOut){ + PLReader left, right; + PLWriter writer; + + assert( dlrDocid(pLeft)==dlrDocid(pRight) ); + assert( pLeft->iType==pRight->iType ); + assert( pLeft->iType==pOut->iType ); + + plrInit(&left, pLeft); + plrInit(&right, pRight); + plwInit(&writer, pOut, dlrDocid(pLeft)); + + while( !plrAtEnd(&left) || !plrAtEnd(&right) ){ + int c = posListCmp(&left, &right); + if( c<0 ){ + plwCopy(&writer, &left); + plrStep(&left); + }else if( c>0 ){ + plwCopy(&writer, &right); + plrStep(&right); + }else{ + plwCopy(&writer, &left); + plrStep(&left); + plrStep(&right); + } + } + + plwTerminate(&writer); + plwDestroy(&writer); + plrDestroy(&left); + plrDestroy(&right); +} + +/* Write the union of doclists in pLeft and pRight to pOut. For +** docids in common between the inputs, the union of the position +** lists is written. Inputs and outputs are always type DL_DEFAULT. +*/ +static void docListUnion( + const char *pLeft, int nLeft, + const char *pRight, int nRight, + DataBuffer *pOut /* Write the combined doclist here */ +){ + DLReader left, right; + DLWriter writer; + + if( nLeft==0 ){ + dataBufferAppend(pOut, pRight, nRight); + return; + } + if( nRight==0 ){ + dataBufferAppend(pOut, pLeft, nLeft); + return; + } + + dlrInit(&left, DL_DEFAULT, pLeft, nLeft); + dlrInit(&right, DL_DEFAULT, pRight, nRight); + dlwInit(&writer, DL_DEFAULT, pOut); + + while( !dlrAtEnd(&left) || !dlrAtEnd(&right) ){ + if( dlrAtEnd(&right) ){ + dlwCopy(&writer, &left); + dlrStep(&left); + }else if( dlrAtEnd(&left) ){ + dlwCopy(&writer, &right); + dlrStep(&right); + }else if( dlrDocid(&left)dlrDocid(&right) ){ + dlwCopy(&writer, &right); + dlrStep(&right); + }else{ + posListUnion(&left, &right, &writer); + dlrStep(&left); + dlrStep(&right); + } + } + + dlrDestroy(&left); + dlrDestroy(&right); + dlwDestroy(&writer); +} + +/* pLeft and pRight are DLReaders positioned to the same docid. +** +** If there are no instances in pLeft or pRight where the position +** of pLeft is one less than the position of pRight, then this +** routine adds nothing to pOut. +** +** If there are one or more instances where positions from pLeft +** are exactly one less than positions from pRight, then add a new +** document record to pOut. If pOut wants to hold positions, then +** include the positions from pRight that are one more than a +** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. +*/ +static void posListPhraseMerge(DLReader *pLeft, DLReader *pRight, + DLWriter *pOut){ + PLReader left, right; + PLWriter writer; + int match = 0; + + assert( dlrDocid(pLeft)==dlrDocid(pRight) ); + assert( pOut->iType!=DL_POSITIONS_OFFSETS ); + + plrInit(&left, pLeft); + plrInit(&right, pRight); + + while( !plrAtEnd(&left) && !plrAtEnd(&right) ){ + if( plrColumn(&left)plrColumn(&right) ){ + plrStep(&right); + }else if( plrPosition(&left)+1plrPosition(&right) ){ + plrStep(&right); + }else{ + if( !match ){ + plwInit(&writer, pOut, dlrDocid(pLeft)); + match = 1; + } + plwAdd(&writer, plrColumn(&right), plrPosition(&right), 0, 0); + plrStep(&left); + plrStep(&right); + } + } + + if( match ){ + plwTerminate(&writer); + plwDestroy(&writer); + } + + plrDestroy(&left); + plrDestroy(&right); +} + +/* We have two doclists with positions: pLeft and pRight. +** Write the phrase intersection of these two doclists into pOut. +** +** A phrase intersection means that two documents only match +** if pLeft.iPos+1==pRight.iPos. +** +** iType controls the type of data written to pOut. If iType is +** DL_POSITIONS, the positions are those from pRight. +*/ +static void docListPhraseMerge( + const char *pLeft, int nLeft, + const char *pRight, int nRight, + DocListType iType, + DataBuffer *pOut /* Write the combined doclist here */ +){ + DLReader left, right; + DLWriter writer; + + if( nLeft==0 || nRight==0 ) return; + + assert( iType!=DL_POSITIONS_OFFSETS ); + + dlrInit(&left, DL_POSITIONS, pLeft, nLeft); + dlrInit(&right, DL_POSITIONS, pRight, nRight); + dlwInit(&writer, iType, pOut); + + while( !dlrAtEnd(&left) && !dlrAtEnd(&right) ){ + if( dlrDocid(&left) one AND (two OR three) + * [one OR two three] ==> (one OR two) AND three + * + * A "-" before a term matches all entries that lack that term. + * The "-" must occur immediately before the term with in intervening + * space. This is how the search engines do it. + * + * A NOT term cannot be the right-hand operand of an OR. If this + * occurs in the query string, the NOT is ignored: + * + * [one OR -two] ==> one OR two + * + */ +typedef struct Query { + fulltext_vtab *pFts; /* The full text index */ + int nTerms; /* Number of terms in the query */ + QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ + int nextIsOr; /* Set the isOr flag on the next inserted term */ + int nextColumn; /* Next word parsed must be in this column */ + int dfltColumn; /* The default column */ +} Query; + + +/* +** An instance of the following structure keeps track of generated +** matching-word offset information and snippets. +*/ +typedef struct Snippet { + int nMatch; /* Total number of matches */ + int nAlloc; /* Space allocated for aMatch[] */ + struct snippetMatch { /* One entry for each matching term */ + char snStatus; /* Status flag for use while constructing snippets */ + short int iCol; /* The column that contains the match */ + short int iTerm; /* The index in Query.pTerms[] of the matching term */ + short int nByte; /* Number of bytes in the term */ + int iStart; /* The offset to the first character of the term */ + } *aMatch; /* Points to space obtained from malloc */ + char *zOffset; /* Text rendering of aMatch[] */ + int nOffset; /* strlen(zOffset) */ + char *zSnippet; /* Snippet text */ + int nSnippet; /* strlen(zSnippet) */ +} Snippet; + + +typedef enum QueryType { + QUERY_GENERIC, /* table scan */ + QUERY_ROWID, /* lookup by rowid */ + QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ +} QueryType; + +typedef enum fulltext_statement { + CONTENT_INSERT_STMT, + CONTENT_SELECT_STMT, + CONTENT_UPDATE_STMT, + CONTENT_DELETE_STMT, + + BLOCK_INSERT_STMT, + BLOCK_SELECT_STMT, + BLOCK_DELETE_STMT, + + SEGDIR_MAX_INDEX_STMT, + SEGDIR_SET_STMT, + SEGDIR_SELECT_STMT, + SEGDIR_SPAN_STMT, + SEGDIR_DELETE_STMT, + SEGDIR_SELECT_ALL_STMT, + + MAX_STMT /* Always at end! */ +} fulltext_statement; + +/* These must exactly match the enum above. */ +/* TODO(shess): Is there some risk that a statement will be used in two +** cursors at once, e.g. if a query joins a virtual table to itself? +** If so perhaps we should move some of these to the cursor object. +*/ +static const char *const fulltext_zStatement[MAX_STMT] = { + /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ + /* CONTENT_SELECT */ "select * from %_content where rowid = ?", + /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ + /* CONTENT_DELETE */ "delete from %_content where rowid = ?", + + /* BLOCK_INSERT */ "insert into %_segments values (?)", + /* BLOCK_SELECT */ "select block from %_segments where rowid = ?", + /* BLOCK_DELETE */ "delete from %_segments where rowid between ? and ?", + + /* SEGDIR_MAX_INDEX */ "select max(idx) from %_segdir where level = ?", + /* SEGDIR_SET */ "insert into %_segdir values (?, ?, ?, ?, ?, ?)", + /* SEGDIR_SELECT */ + "select start_block, leaves_end_block, root from %_segdir " + " where level = ? order by idx", + /* SEGDIR_SPAN */ + "select min(start_block), max(end_block) from %_segdir " + " where level = ? and start_block <> 0", + /* SEGDIR_DELETE */ "delete from %_segdir where level = ?", + /* SEGDIR_SELECT_ALL */ + "select root, leaves_end_block from %_segdir order by level desc, idx", +}; + +/* +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct fulltext_vtab { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of columns in virtual table */ + char **azColumn; /* column names. malloced */ + char **azContentColumn; /* column names in content table; malloced */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + + /* Precompiled statements which we keep as long as the table is + ** open. + */ + sqlite3_stmt *pFulltextStatements[MAX_STMT]; + + /* Precompiled statements used for segment merges. We run a + ** separate select across the leaf level of each tree being merged. + */ + sqlite3_stmt *pLeafSelectStmts[MERGE_COUNT]; + /* The statement used to prepare pLeafSelectStmts. */ +#define LEAF_SELECT \ + "select block from %_segments where rowid between ? and ? order by rowid" + + /* These buffer pending index updates during transactions. + ** nPendingData estimates the memory size of the pending data. It + ** doesn't include the hash-bucket overhead, nor any malloc + ** overhead. When nPendingData exceeds kPendingThreshold, the + ** buffer is flushed even before the transaction closes. + ** pendingTerms stores the data, and is only valid when nPendingData + ** is >=0 (nPendingData<0 means pendingTerms has not been + ** initialized). iPrevDocid is the last docid written, used to make + ** certain we're inserting in sorted order. + */ + int nPendingData; +#define kPendingThreshold (1*1024*1024) + sqlite_int64 iPrevDocid; + fts2Hash pendingTerms; +}; + +/* +** When the core wants to do a query, it create a cursor using a +** call to xOpen. This structure is an instance of a cursor. It +** is destroyed by xClose. +*/ +typedef struct fulltext_cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + int eof; /* True if at End Of Results */ + Query q; /* Parsed query string */ + Snippet snippet; /* Cached snippet for the current row */ + int iColumn; /* Column being searched */ + DataBuffer result; /* Doclist results from fulltextQuery */ + DLReader reader; /* Result reader if result not empty */ +} fulltext_cursor; + +static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ + return (fulltext_vtab *) c->base.pVtab; +} + +static const sqlite3_module fts2Module; /* forward declaration */ + +/* Return a dynamically generated statement of the form + * insert into %_content (rowid, ...) values (?, ...) + */ +static const char *contentInsertStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "insert into %_content (rowid, "); + appendList(&sb, v->nColumn, v->azContentColumn); + append(&sb, ") values (?"); + for(i=0; inColumn; ++i) + append(&sb, ", ?"); + append(&sb, ")"); + return stringBufferData(&sb); +} + +/* Return a dynamically generated statement of the form + * update %_content set [col_0] = ?, [col_1] = ?, ... + * where rowid = ? + */ +static const char *contentUpdateStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "update %_content set "); + for(i=0; inColumn; ++i) { + if( i>0 ){ + append(&sb, ", "); + } + append(&sb, v->azContentColumn[i]); + append(&sb, " = ?"); + } + append(&sb, " where rowid = ?"); + return stringBufferData(&sb); +} + +/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. +** If the indicated statement has never been prepared, it is prepared +** and cached, otherwise the cached version is reset. +*/ +static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, + sqlite3_stmt **ppStmt){ + assert( iStmtpFulltextStatements[iStmt]==NULL ){ + const char *zStmt; + int rc; + switch( iStmt ){ + case CONTENT_INSERT_STMT: + zStmt = contentInsertStatement(v); break; + case CONTENT_UPDATE_STMT: + zStmt = contentUpdateStatement(v); break; + default: + zStmt = fulltext_zStatement[iStmt]; + } + rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], + zStmt); + if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); + if( rc!=SQLITE_OK ) return rc; + } else { + int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); + if( rc!=SQLITE_OK ) return rc; + } + + *ppStmt = v->pFulltextStatements[iStmt]; + return SQLITE_OK; +} + +/* Like sqlite3_step(), but convert SQLITE_DONE to SQLITE_OK and +** SQLITE_ROW to SQLITE_ERROR. Useful for statements like UPDATE, +** where we expect no results. +*/ +static int sql_single_step(sqlite3_stmt *s){ + int rc = sqlite3_step(s); + return (rc==SQLITE_DONE) ? SQLITE_OK : rc; +} + +/* Like sql_get_statement(), but for special replicated LEAF_SELECT +** statements. +*/ +/* TODO(shess) Write version for generic statements and then share +** that between the cached-statement functions. +*/ +static int sql_get_leaf_statement(fulltext_vtab *v, int idx, + sqlite3_stmt **ppStmt){ + assert( idx>=0 && idxpLeafSelectStmts[idx]==NULL ){ + int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx], + LEAF_SELECT); + if( rc!=SQLITE_OK ) return rc; + }else{ + int rc = sqlite3_reset(v->pLeafSelectStmts[idx]); + if( rc!=SQLITE_OK ) return rc; + } + + *ppStmt = v->pLeafSelectStmts[idx]; + return SQLITE_OK; +} + +/* insert into %_content (rowid, ...) values ([rowid], [pValues]) */ +static int content_insert(fulltext_vtab *v, sqlite3_value *rowid, + sqlite3_value **pValues){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_value(s, 1, rowid); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 2+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + return sql_single_step(s); +} + +/* update %_content set col0 = pValues[0], col1 = pValues[1], ... + * where rowid = [iRowid] */ +static int content_update(fulltext_vtab *v, sqlite3_value **pValues, + sqlite_int64 iRowid){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 1+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + rc = sqlite3_bind_int64(s, 1+v->nColumn, iRowid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +static void freeStringArray(int nString, const char **pString){ + int i; + + for (i=0 ; i < nString ; ++i) { + if( pString[i]!=NULL ) free((void *) pString[i]); + } + free((void *) pString); +} + +/* select * from %_content where rowid = [iRow] + * The caller must delete the returned array and all strings in it. + * null fields will be NULL in the returned array. + * + * TODO: Perhaps we should return pointer/length strings here for consistency + * with other code which uses pointer/length. */ +static int content_select(fulltext_vtab *v, sqlite_int64 iRow, + const char ***pValues){ + sqlite3_stmt *s; + const char **values; + int i; + int rc; + + *pValues = NULL; + + rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc!=SQLITE_ROW ) return rc; + + values = (const char **) malloc(v->nColumn * sizeof(const char *)); + for(i=0; inColumn; ++i){ + if( sqlite3_column_type(s, i)==SQLITE_NULL ){ + values[i] = NULL; + }else{ + values[i] = string_dup((char*)sqlite3_column_text(s, i)); + } + } + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ){ + *pValues = values; + return SQLITE_OK; + } + + freeStringArray(v->nColumn, values); + return rc; +} + +/* delete from %_content where rowid = [iRow ] */ +static int content_delete(fulltext_vtab *v, sqlite_int64 iRow){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iRow); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* insert into %_segments values ([pData]) +** returns assigned rowid in *piBlockid +*/ +static int block_insert(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 *piBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, BLOCK_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 1, pData, nData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + + *piBlockid = sqlite3_last_insert_rowid(v->db); + return SQLITE_OK; +} + +/* delete from %_segments +** where rowid between [iStartBlockid] and [iEndBlockid] +** +** Deletes the range of blocks, inclusive, used to delete the blocks +** which form a segment. +*/ +static int block_delete(fulltext_vtab *v, + sqlite_int64 iStartBlockid, sqlite_int64 iEndBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, BLOCK_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 2, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* Returns SQLITE_ROW with *pidx set to the maximum segment idx found +** at iLevel. Returns SQLITE_DONE if there are no segments at +** iLevel. Otherwise returns an error. +*/ +static int segdir_max_index(fulltext_vtab *v, int iLevel, int *pidx){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_MAX_INDEX_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + /* Should always get at least one row due to how max() works. */ + if( rc==SQLITE_DONE ) return SQLITE_DONE; + if( rc!=SQLITE_ROW ) return rc; + + /* NULL means that there were no inputs to max(). */ + if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + return rc; + } + + *pidx = sqlite3_column_int(s, 0); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + return SQLITE_ROW; +} + +/* insert into %_segdir values ( +** [iLevel], [idx], +** [iStartBlockid], [iLeavesEndBlockid], [iEndBlockid], +** [pRootData] +** ) +*/ +static int segdir_set(fulltext_vtab *v, int iLevel, int idx, + sqlite_int64 iStartBlockid, + sqlite_int64 iLeavesEndBlockid, + sqlite_int64 iEndBlockid, + const char *pRootData, int nRootData){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SET_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 2, idx); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 3, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 4, iLeavesEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 5, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 6, pRootData, nRootData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* Queries %_segdir for the block span of the segments in level +** iLevel. Returns SQLITE_DONE if there are no blocks for iLevel, +** SQLITE_ROW if there are blocks, else an error. +*/ +static int segdir_span(fulltext_vtab *v, int iLevel, + sqlite_int64 *piStartBlockid, + sqlite_int64 *piEndBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SPAN_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ) return SQLITE_DONE; /* Should never happen */ + if( rc!=SQLITE_ROW ) return rc; + + /* This happens if all segments at this level are entirely inline. */ + if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + int rc2 = sqlite3_step(s); + if( rc2==SQLITE_ROW ) return SQLITE_ERROR; + return rc2; + } + + *piStartBlockid = sqlite3_column_int64(s, 0); + *piEndBlockid = sqlite3_column_int64(s, 1); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + return SQLITE_ROW; +} + +/* Delete the segment blocks and segment directory records for all +** segments at iLevel. +*/ +static int segdir_delete(fulltext_vtab *v, int iLevel){ + sqlite3_stmt *s; + sqlite_int64 iStartBlockid, iEndBlockid; + int rc = segdir_span(v, iLevel, &iStartBlockid, &iEndBlockid); + if( rc!=SQLITE_ROW && rc!=SQLITE_DONE ) return rc; + + if( rc==SQLITE_ROW ){ + rc = block_delete(v, iStartBlockid, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + } + + /* Delete the segment directory itself. */ + rc = sql_get_statement(v, SEGDIR_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* TODO(shess) clearPendingTerms() is far down the file because +** writeZeroSegment() is far down the file because LeafWriter is far +** down the file. Consider refactoring the code to move the non-vtab +** code above the vtab code so that we don't need this forward +** reference. +*/ +static int clearPendingTerms(fulltext_vtab *v); + +/* +** Free the memory used to contain a fulltext_vtab structure. +*/ +static void fulltext_vtab_destroy(fulltext_vtab *v){ + int iStmt, i; + + TRACE(("FTS2 Destroy %p\n", v)); + for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ + sqlite3_finalize(v->pFulltextStatements[iStmt]); + v->pFulltextStatements[iStmt] = NULL; + } + } + + for( i=0; ipLeafSelectStmts[i]!=NULL ){ + sqlite3_finalize(v->pLeafSelectStmts[i]); + v->pLeafSelectStmts[i] = NULL; + } + } + + if( v->pTokenizer!=NULL ){ + v->pTokenizer->pModule->xDestroy(v->pTokenizer); + v->pTokenizer = NULL; + } + + clearPendingTerms(v); + + free(v->azColumn); + for(i = 0; i < v->nColumn; ++i) { + sqlite3_free(v->azContentColumn[i]); + } + free(v->azContentColumn); + free(v); +} + +/* +** Token types for parsing the arguments to xConnect or xCreate. +*/ +#define TOKEN_EOF 0 /* End of file */ +#define TOKEN_SPACE 1 /* Any kind of whitespace */ +#define TOKEN_ID 2 /* An identifier */ +#define TOKEN_STRING 3 /* A string literal */ +#define TOKEN_PUNCT 4 /* A single punctuation character */ + +/* +** If X is a character that can be used in an identifier then +** IdChar(X) will be true. Otherwise it is false. +** +** For ASCII, any character with the high-order bit set is +** allowed in an identifier. For 7-bit characters, +** sqlite3IsIdChar[X] must be 1. +** +** Ticket #1066. the SQL standard does not allow '$' in the +** middle of identfiers. But many SQL implementations do. +** SQLite will allow '$' in identifiers for compatibility. +** But the feature is undocumented. +*/ +static const char isIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) + + +/* +** Return the length of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +static int getToken(const char *z, int *tokenType){ + int i, c; + switch( *z ){ + case 0: { + *tokenType = TOKEN_EOF; + return 0; + } + case ' ': case '\t': case '\n': case '\f': case '\r': { + for(i=1; safe_isspace(z[i]); i++){} + *tokenType = TOKEN_SPACE; + return i; + } + case '`': + case '\'': + case '"': { + int delim = z[0]; + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + *tokenType = TOKEN_STRING; + return i + (c!=0); + } + case '[': { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = TOKEN_ID; + return i; + } + default: { + if( !IdChar(*z) ){ + break; + } + for(i=1; IdChar(z[i]); i++){} + *tokenType = TOKEN_ID; + return i; + } + } + *tokenType = TOKEN_PUNCT; + return 1; +} + +/* +** A token extracted from a string is an instance of the following +** structure. +*/ +typedef struct Token { + const char *z; /* Pointer to token text. Not '\000' terminated */ + short int n; /* Length of the token text in bytes. */ +} Token; + +/* +** Given a input string (which is really one of the argv[] parameters +** passed into xConnect or xCreate) split the string up into tokens. +** Return an array of pointers to '\000' terminated strings, one string +** for each non-whitespace token. +** +** The returned array is terminated by a single NULL pointer. +** +** Space to hold the returned array is obtained from a single +** malloc and should be freed by passing the return value to free(). +** The individual strings within the token list are all a part of +** the single memory allocation and will all be freed at once. +*/ +static char **tokenizeString(const char *z, int *pnToken){ + int nToken = 0; + Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); + int n = 1; + int e, i; + int totalSize = 0; + char **azToken; + char *zCopy; + while( n>0 ){ + n = getToken(z, &e); + if( e!=TOKEN_SPACE ){ + aToken[nToken].z = z; + aToken[nToken].n = n; + nToken++; + totalSize += n+1; + } + z += n; + } + azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); + zCopy = (char*)&azToken[nToken]; + nToken--; + for(i=0; i=0 ){ + azIn[j] = azIn[i]; + } + j++; + } + } + azIn[j] = 0; + } +} + + +/* +** Find the first alphanumeric token in the string zIn. Null-terminate +** this token. Remove any quotation marks. And return a pointer to +** the result. +*/ +static char *firstToken(char *zIn, char **pzTail){ + int n, ttype; + while(1){ + n = getToken(zIn, &ttype); + if( ttype==TOKEN_SPACE ){ + zIn += n; + }else if( ttype==TOKEN_EOF ){ + *pzTail = zIn; + return 0; + }else{ + zIn[n] = 0; + *pzTail = &zIn[1]; + dequoteString(zIn); + return zIn; + } + } + /*NOTREACHED*/ +} + +/* Return true if... +** +** * s begins with the string t, ignoring case +** * s is longer than t +** * The first character of s beyond t is not a alphanumeric +** +** Ignore leading space in *s. +** +** To put it another way, return true if the first token of +** s[] is t[]. +*/ +static int startsWith(const char *s, const char *t){ + while( safe_isspace(*s) ){ s++; } + while( *t ){ + if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; + } + return *s!='_' && !safe_isalnum(*s); +} + +/* +** An instance of this structure defines the "spec" of a +** full text index. This structure is populated by parseSpec +** and use by fulltextConnect and fulltextCreate. +*/ +typedef struct TableSpec { + const char *zDb; /* Logical database name */ + const char *zName; /* Name of the full-text index */ + int nColumn; /* Number of columns to be indexed */ + char **azColumn; /* Original names of columns to be indexed */ + char **azContentColumn; /* Column names for %_content */ + char **azTokenizer; /* Name of tokenizer and its arguments */ +} TableSpec; + +/* +** Reclaim all of the memory used by a TableSpec +*/ +static void clearTableSpec(TableSpec *p) { + free(p->azColumn); + free(p->azContentColumn); + free(p->azTokenizer); +} + +/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: + * + * CREATE VIRTUAL TABLE email + * USING fts2(subject, body, tokenize mytokenizer(myarg)) + * + * We return parsed information in a TableSpec structure. + * + */ +static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, + char**pzErr){ + int i, n; + char *z, *zDummy; + char **azArg; + const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ + + assert( argc>=3 ); + /* Current interface: + ** argv[0] - module name + ** argv[1] - database name + ** argv[2] - table name + ** argv[3..] - columns, optionally followed by tokenizer specification + ** and snippet delimiters specification. + */ + + /* Make a copy of the complete argv[][] array in a single allocation. + ** The argv[][] array is read-only and transient. We can write to the + ** copy in order to modify things and the copy is persistent. + */ + CLEAR(pSpec); + for(i=n=0; izDb = azArg[1]; + pSpec->zName = azArg[2]; + pSpec->nColumn = 0; + pSpec->azColumn = azArg; + zTokenizer = "tokenize simple"; + for(i=3; inColumn] = firstToken(azArg[i], &zDummy); + pSpec->nColumn++; + } + } + if( pSpec->nColumn==0 ){ + azArg[0] = "content"; + pSpec->nColumn = 1; + } + + /* + ** Construct the list of content column names. + ** + ** Each content column name will be of the form cNNAAAA + ** where NN is the column number and AAAA is the sanitized + ** column name. "sanitized" means that special characters are + ** converted to "_". The cNN prefix guarantees that all column + ** names are unique. + ** + ** The AAAA suffix is not strictly necessary. It is included + ** for the convenience of people who might examine the generated + ** %_content table and wonder what the columns are used for. + */ + pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); + if( pSpec->azContentColumn==0 ){ + clearTableSpec(pSpec); + return SQLITE_NOMEM; + } + for(i=0; inColumn; i++){ + char *p; + pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); + for (p = pSpec->azContentColumn[i]; *p ; ++p) { + if( !safe_isalnum(*p) ) *p = '_'; + } + } + + /* + ** Parse the tokenizer specification string. + */ + pSpec->azTokenizer = tokenizeString(zTokenizer, &n); + tokenListToIdList(pSpec->azTokenizer); + + return SQLITE_OK; +} + +/* +** Generate a CREATE TABLE statement that describes the schema of +** the virtual table. Return a pointer to this schema string. +** +** Space is obtained from sqlite3_mprintf() and should be freed +** using sqlite3_free(). +*/ +static char *fulltextSchema( + int nColumn, /* Number of columns */ + const char *const* azColumn, /* List of columns */ + const char *zTableName /* Name of the table */ +){ + int i; + char *zSchema, *zNext; + const char *zSep = "("; + zSchema = sqlite3_mprintf("CREATE TABLE x"); + for(i=0; ibase */ + v->db = db; + v->zDb = spec->zDb; /* Freed when azColumn is freed */ + v->zName = spec->zName; /* Freed when azColumn is freed */ + v->nColumn = spec->nColumn; + v->azContentColumn = spec->azContentColumn; + spec->azContentColumn = 0; + v->azColumn = spec->azColumn; + spec->azColumn = 0; + + if( spec->azTokenizer==0 ){ + return SQLITE_NOMEM; + } + + zTok = spec->azTokenizer[0]; + if( !zTok ){ + zTok = "simple"; + } + nTok = strlen(zTok)+1; + + m = (sqlite3_tokenizer_module *)sqlite3Fts2HashFind(pHash, zTok, nTok); + if( !m ){ + *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); + rc = SQLITE_ERROR; + goto err; + } + + for(n=0; spec->azTokenizer[n]; n++){} + if( n ){ + rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], + &v->pTokenizer); + }else{ + rc = m->xCreate(0, 0, &v->pTokenizer); + } + if( rc!=SQLITE_OK ) goto err; + v->pTokenizer->pModule = m; + + /* TODO: verify the existence of backing tables foo_content, foo_term */ + + schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, + spec->zName); + rc = sqlite3_declare_vtab(db, schema); + sqlite3_free(schema); + if( rc!=SQLITE_OK ) goto err; + + memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); + + /* Indicate that the buffer is not live. */ + v->nPendingData = -1; + + *ppVTab = &v->base; + TRACE(("FTS2 Connect %p\n", v)); + + return rc; + +err: + fulltext_vtab_destroy(v); + return rc; +} + +static int fulltextConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, + char **pzErr +){ + TableSpec spec; + int rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + rc = constructVtab(db, (fts2Hash *)pAux, &spec, ppVTab, pzErr); + clearTableSpec(&spec); + return rc; +} + +/* The %_content table holds the text of each document, with +** the rowid used as the docid. +*/ +/* TODO(shess) This comment needs elaboration to match the updated +** code. Work it into the top-of-file comment at that time. +*/ +static int fulltextCreate(sqlite3 *db, void *pAux, + int argc, const char * const *argv, + sqlite3_vtab **ppVTab, char **pzErr){ + int rc; + TableSpec spec; + StringBuffer schema; + TRACE(("FTS2 Create\n")); + + rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + initStringBuffer(&schema); + append(&schema, "CREATE TABLE %_content("); + appendList(&schema, spec.nColumn, spec.azContentColumn); + append(&schema, ")"); + rc = sql_exec(db, spec.zDb, spec.zName, stringBufferData(&schema)); + stringBufferDestroy(&schema); + if( rc!=SQLITE_OK ) goto out; + + rc = sql_exec(db, spec.zDb, spec.zName, + "create table %_segments(block blob);"); + if( rc!=SQLITE_OK ) goto out; + + rc = sql_exec(db, spec.zDb, spec.zName, + "create table %_segdir(" + " level integer," + " idx integer," + " start_block integer," + " leaves_end_block integer," + " end_block integer," + " root blob," + " primary key(level, idx)" + ");"); + if( rc!=SQLITE_OK ) goto out; + + rc = constructVtab(db, (fts2Hash *)pAux, &spec, ppVTab, pzErr); + +out: + clearTableSpec(&spec); + return rc; +} + +/* Decide how to handle an SQL query. */ +static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + int i; + TRACE(("FTS2 BestIndex\n")); + + for(i=0; inConstraint; ++i){ + const struct sqlite3_index_constraint *pConstraint; + pConstraint = &pInfo->aConstraint[i]; + if( pConstraint->usable ) { + if( pConstraint->iColumn==-1 && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + pInfo->idxNum = QUERY_ROWID; /* lookup by rowid */ + TRACE(("FTS2 QUERY_ROWID\n")); + } else if( pConstraint->iColumn>=0 && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* full-text search */ + pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; + TRACE(("FTS2 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); + } else continue; + + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + + /* An arbitrary value for now. + * TODO: Perhaps rowid matches should be considered cheaper than + * full-text searches. */ + pInfo->estimatedCost = 1.0; + + return SQLITE_OK; + } + } + pInfo->idxNum = QUERY_GENERIC; + return SQLITE_OK; +} + +static int fulltextDisconnect(sqlite3_vtab *pVTab){ + TRACE(("FTS2 Disconnect %p\n", pVTab)); + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextDestroy(sqlite3_vtab *pVTab){ + fulltext_vtab *v = (fulltext_vtab *)pVTab; + int rc; + + TRACE(("FTS2 Destroy %p\n", pVTab)); + rc = sql_exec(v->db, v->zDb, v->zName, + "drop table if exists %_content;" + "drop table if exists %_segments;" + "drop table if exists %_segdir;" + ); + if( rc!=SQLITE_OK ) return rc; + + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + fulltext_cursor *c; + + c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); + /* sqlite will initialize c->base */ + *ppCursor = &c->base; + TRACE(("FTS2 Open %p: %p\n", pVTab, c)); + + return SQLITE_OK; +} + + +/* Free all of the dynamically allocated memory held by *q +*/ +static void queryClear(Query *q){ + int i; + for(i = 0; i < q->nTerms; ++i){ + free(q->pTerms[i].pTerm); + } + free(q->pTerms); + CLEAR(q); +} + +/* Free all of the dynamically allocated memory held by the +** Snippet +*/ +static void snippetClear(Snippet *p){ + free(p->aMatch); + free(p->zOffset); + free(p->zSnippet); + CLEAR(p); +} +/* +** Append a single entry to the p->aMatch[] log. +*/ +static void snippetAppendMatch( + Snippet *p, /* Append the entry to this snippet */ + int iCol, int iTerm, /* The column and query term */ + int iStart, int nByte /* Offset and size of the match */ +){ + int i; + struct snippetMatch *pMatch; + if( p->nMatch+1>=p->nAlloc ){ + p->nAlloc = p->nAlloc*2 + 10; + p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); + if( p->aMatch==0 ){ + p->nMatch = 0; + p->nAlloc = 0; + return; + } + } + i = p->nMatch++; + pMatch = &p->aMatch[i]; + pMatch->iCol = iCol; + pMatch->iTerm = iTerm; + pMatch->iStart = iStart; + pMatch->nByte = nByte; +} + +/* +** Sizing information for the circular buffer used in snippetOffsetsOfColumn() +*/ +#define FTS2_ROTOR_SZ (32) +#define FTS2_ROTOR_MASK (FTS2_ROTOR_SZ-1) + +/* +** Add entries to pSnippet->aMatch[] for every match that occurs against +** document zDoc[0..nDoc-1] which is stored in column iColumn. +*/ +static void snippetOffsetsOfColumn( + Query *pQuery, + Snippet *pSnippet, + int iColumn, + const char *zDoc, + int nDoc +){ + const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ + sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ + sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ + fulltext_vtab *pVtab; /* The full text index */ + int nColumn; /* Number of columns in the index */ + const QueryTerm *aTerm; /* Query string terms */ + int nTerm; /* Number of query string terms */ + int i, j; /* Loop counters */ + int rc; /* Return code */ + unsigned int match, prevMatch; /* Phrase search bitmasks */ + const char *zToken; /* Next token from the tokenizer */ + int nToken; /* Size of zToken */ + int iBegin, iEnd, iPos; /* Offsets of beginning and end */ + + /* The following variables keep a circular buffer of the last + ** few tokens */ + unsigned int iRotor = 0; /* Index of current token */ + int iRotorBegin[FTS2_ROTOR_SZ]; /* Beginning offset of token */ + int iRotorLen[FTS2_ROTOR_SZ]; /* Length of token */ + + pVtab = pQuery->pFts; + nColumn = pVtab->nColumn; + pTokenizer = pVtab->pTokenizer; + pTModule = pTokenizer->pModule; + rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); + if( rc ) return; + pTCursor->pTokenizer = pTokenizer; + aTerm = pQuery->pTerms; + nTerm = pQuery->nTerms; + if( nTerm>=FTS2_ROTOR_SZ ){ + nTerm = FTS2_ROTOR_SZ - 1; + } + prevMatch = 0; + while(1){ + rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); + if( rc ) break; + iRotorBegin[iRotor&FTS2_ROTOR_MASK] = iBegin; + iRotorLen[iRotor&FTS2_ROTOR_MASK] = iEnd-iBegin; + match = 0; + for(i=0; i=0 && iColnToken ) continue; + if( !aTerm[i].isPrefix && aTerm[i].nTerm1 && (prevMatch & (1<=0; j--){ + int k = (iRotor-j) & FTS2_ROTOR_MASK; + snippetAppendMatch(pSnippet, iColumn, i-j, + iRotorBegin[k], iRotorLen[k]); + } + } + } + prevMatch = match<<1; + iRotor++; + } + pTModule->xClose(pTCursor); +} + + +/* +** Compute all offsets for the current row of the query. +** If the offsets have already been computed, this routine is a no-op. +*/ +static void snippetAllOffsets(fulltext_cursor *p){ + int nColumn; + int iColumn, i; + int iFirst, iLast; + fulltext_vtab *pFts; + + if( p->snippet.nMatch ) return; + if( p->q.nTerms==0 ) return; + pFts = p->q.pFts; + nColumn = pFts->nColumn; + iColumn = (p->iCursorType - QUERY_FULLTEXT); + if( iColumn<0 || iColumn>=nColumn ){ + iFirst = 0; + iLast = nColumn-1; + }else{ + iFirst = iColumn; + iLast = iColumn; + } + for(i=iFirst; i<=iLast; i++){ + const char *zDoc; + int nDoc; + zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); + nDoc = sqlite3_column_bytes(p->pStmt, i+1); + snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); + } +} + +/* +** Convert the information in the aMatch[] array of the snippet +** into the string zOffset[0..nOffset-1]. +*/ +static void snippetOffsetText(Snippet *p){ + int i; + int cnt = 0; + StringBuffer sb; + char zBuf[200]; + if( p->zOffset ) return; + initStringBuffer(&sb); + for(i=0; inMatch; i++){ + struct snippetMatch *pMatch = &p->aMatch[i]; + zBuf[0] = ' '; + sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, + pMatch->iTerm, pMatch->iStart, pMatch->nByte); + append(&sb, zBuf); + cnt++; + } + p->zOffset = stringBufferData(&sb); + p->nOffset = stringBufferLength(&sb); +} + +/* +** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set +** of matching words some of which might be in zDoc. zDoc is column +** number iCol. +** +** iBreak is suggested spot in zDoc where we could begin or end an +** excerpt. Return a value similar to iBreak but possibly adjusted +** to be a little left or right so that the break point is better. +*/ +static int wordBoundary( + int iBreak, /* The suggested break point */ + const char *zDoc, /* Document text */ + int nDoc, /* Number of bytes in zDoc[] */ + struct snippetMatch *aMatch, /* Matching words */ + int nMatch, /* Number of entries in aMatch[] */ + int iCol /* The column number for zDoc[] */ +){ + int i; + if( iBreak<=10 ){ + return 0; + } + if( iBreak>=nDoc-10 ){ + return nDoc; + } + for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ + return aMatch[i-1].iStart; + } + } + for(i=1; i<=10; i++){ + if( safe_isspace(zDoc[iBreak-i]) ){ + return iBreak - i + 1; + } + if( safe_isspace(zDoc[iBreak+i]) ){ + return iBreak + i + 1; + } + } + return iBreak; +} + + + +/* +** Allowed values for Snippet.aMatch[].snStatus +*/ +#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ +#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ + +/* +** Generate the text of a snippet. +*/ +static void snippetText( + fulltext_cursor *pCursor, /* The cursor we need the snippet for */ + const char *zStartMark, /* Markup to appear before each match */ + const char *zEndMark, /* Markup to appear after each match */ + const char *zEllipsis /* Ellipsis mark */ +){ + int i, j; + struct snippetMatch *aMatch; + int nMatch; + int nDesired; + StringBuffer sb; + int tailCol; + int tailOffset; + int iCol; + int nDoc; + const char *zDoc; + int iStart, iEnd; + int tailEllipsis = 0; + int iMatch; + + + free(pCursor->snippet.zSnippet); + pCursor->snippet.zSnippet = 0; + aMatch = pCursor->snippet.aMatch; + nMatch = pCursor->snippet.nMatch; + initStringBuffer(&sb); + + for(i=0; iq.nTerms; i++){ + for(j=0; j0; i++){ + if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; + nDesired--; + iCol = aMatch[i].iCol; + zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); + iStart = aMatch[i].iStart - 40; + iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); + if( iStart<=10 ){ + iStart = 0; + } + if( iCol==tailCol && iStart<=tailOffset+20 ){ + iStart = tailOffset; + } + if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ + trimWhiteSpace(&sb); + appendWhiteSpace(&sb); + append(&sb, zEllipsis); + appendWhiteSpace(&sb); + } + iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; + iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); + if( iEnd>=nDoc-10 ){ + iEnd = nDoc; + tailEllipsis = 0; + }else{ + tailEllipsis = 1; + } + while( iMatchsnippet.zSnippet = stringBufferData(&sb); + pCursor->snippet.nSnippet = stringBufferLength(&sb); +} + + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fulltextClose(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + TRACE(("FTS2 Close %p\n", c)); + sqlite3_finalize(c->pStmt); + queryClear(&c->q); + snippetClear(&c->snippet); + if( c->result.nData!=0 ) dlrDestroy(&c->reader); + dataBufferDestroy(&c->result); + free(c); + return SQLITE_OK; +} + +static int fulltextNext(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + int rc; + + TRACE(("FTS2 Next %p\n", pCursor)); + snippetClear(&c->snippet); + if( c->iCursorType < QUERY_FULLTEXT ){ + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + switch( rc ){ + case SQLITE_ROW: + c->eof = 0; + return SQLITE_OK; + case SQLITE_DONE: + c->eof = 1; + return SQLITE_OK; + default: + c->eof = 1; + return rc; + } + } else { /* full-text query */ + rc = sqlite3_reset(c->pStmt); + if( rc!=SQLITE_OK ) return rc; + + if( c->result.nData==0 || dlrAtEnd(&c->reader) ){ + c->eof = 1; + return SQLITE_OK; + } + rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader)); + dlrStep(&c->reader); + if( rc!=SQLITE_OK ) return rc; + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + if( rc==SQLITE_ROW ){ /* the case we expect */ + c->eof = 0; + return SQLITE_OK; + } + /* an error occurred; abort */ + return rc==SQLITE_DONE ? SQLITE_ERROR : rc; + } +} + + +/* TODO(shess) If we pushed LeafReader to the top of the file, or to +** another file, term_select() could be pushed above +** docListOfTerm(). +*/ +static int termSelect(fulltext_vtab *v, int iColumn, + const char *pTerm, int nTerm, int isPrefix, + DocListType iType, DataBuffer *out); + +/* Return a DocList corresponding to the query term *pTerm. If *pTerm +** is the first term of a phrase query, go ahead and evaluate the phrase +** query and return the doclist for the entire phrase query. +** +** The resulting DL_DOCIDS doclist is stored in pResult, which is +** overwritten. +*/ +static int docListOfTerm( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* column to restrict to. No restriction if >=nColumn */ + QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ + DataBuffer *pResult /* Write the result here */ +){ + DataBuffer left, right, new; + int i, rc; + + /* No phrase search if no position info. */ + assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS ); + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&left, 0); + rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix, + 0nPhrase ? DL_POSITIONS : DL_DOCIDS, &left); + if( rc ) return rc; + for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){ + dataBufferInit(&right, 0); + rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, + pQTerm[i].isPrefix, DL_POSITIONS, &right); + if( rc ){ + dataBufferDestroy(&left); + return rc; + } + dataBufferInit(&new, 0); + docListPhraseMerge(left.pData, left.nData, right.pData, right.nData, + inPhrase ? DL_POSITIONS : DL_DOCIDS, &new); + dataBufferDestroy(&left); + dataBufferDestroy(&right); + left = new; + } + *pResult = left; + return SQLITE_OK; +} + +/* Add a new term pTerm[0..nTerm-1] to the query *q. +*/ +static void queryAdd(Query *q, const char *pTerm, int nTerm){ + QueryTerm *t; + ++q->nTerms; + q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); + if( q->pTerms==0 ){ + q->nTerms = 0; + return; + } + t = &q->pTerms[q->nTerms - 1]; + CLEAR(t); + t->pTerm = malloc(nTerm+1); + memcpy(t->pTerm, pTerm, nTerm); + t->pTerm[nTerm] = 0; + t->nTerm = nTerm; + t->isOr = q->nextIsOr; + t->isPrefix = 0; + q->nextIsOr = 0; + t->iColumn = q->nextColumn; + q->nextColumn = q->dfltColumn; +} + +/* +** Check to see if the string zToken[0...nToken-1] matches any +** column name in the virtual table. If it does, +** return the zero-indexed column number. If not, return -1. +*/ +static int checkColumnSpecifier( + fulltext_vtab *pVtab, /* The virtual table */ + const char *zToken, /* Text of the token */ + int nToken /* Number of characters in the token */ +){ + int i; + for(i=0; inColumn; i++){ + if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 + && pVtab->azColumn[i][nToken]==0 ){ + return i; + } + } + return -1; +} + +/* +** Parse the text at pSegment[0..nSegment-1]. Add additional terms +** to the query being assemblied in pQuery. +** +** inPhrase is true if pSegment[0..nSegement-1] is contained within +** double-quotes. If inPhrase is true, then the first term +** is marked with the number of terms in the phrase less one and +** OR and "-" syntax is ignored. If inPhrase is false, then every +** term found is marked with nPhrase=0 and OR and "-" syntax is significant. +*/ +static int tokenizeSegment( + sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ + const char *pSegment, int nSegment, /* Query expression being parsed */ + int inPhrase, /* True if within "..." */ + Query *pQuery /* Append results here */ +){ + const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCursor; + int firstIndex = pQuery->nTerms; + int iCol; + int nTerm = 1; + + int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); + if( rc!=SQLITE_OK ) return rc; + pCursor->pTokenizer = pTokenizer; + + while( 1 ){ + const char *pToken; + int nToken, iBegin, iEnd, iPos; + + rc = pModule->xNext(pCursor, + &pToken, &nToken, + &iBegin, &iEnd, &iPos); + if( rc!=SQLITE_OK ) break; + if( !inPhrase && + pSegment[iEnd]==':' && + (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ + pQuery->nextColumn = iCol; + continue; + } + if( !inPhrase && pQuery->nTerms>0 && nToken==2 + && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ + pQuery->nextIsOr = 1; + continue; + } + queryAdd(pQuery, pToken, nToken); + if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ + pQuery->pTerms[pQuery->nTerms-1].isNot = 1; + } + if( iEndpTerms[pQuery->nTerms-1].isPrefix = 1; + } + pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; + if( inPhrase ){ + nTerm++; + } + } + + if( inPhrase && pQuery->nTerms>firstIndex ){ + pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; + } + + return pModule->xClose(pCursor); +} + +/* Parse a query string, yielding a Query object pQuery. +** +** The calling function will need to queryClear() to clean up +** the dynamically allocated memory held by pQuery. +*/ +static int parseQuery( + fulltext_vtab *v, /* The fulltext index */ + const char *zInput, /* Input text of the query string */ + int nInput, /* Size of the input text */ + int dfltColumn, /* Default column of the index to match against */ + Query *pQuery /* Write the parse results here. */ +){ + int iInput, inPhrase = 0; + + if( zInput==0 ) nInput = 0; + if( nInput<0 ) nInput = strlen(zInput); + pQuery->nTerms = 0; + pQuery->pTerms = NULL; + pQuery->nextIsOr = 0; + pQuery->nextColumn = dfltColumn; + pQuery->dfltColumn = dfltColumn; + pQuery->pFts = v; + + for(iInput=0; iInputiInput ){ + tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, + pQuery); + } + iInput = i; + if( i=nColumn +** they are allowed to match against any column. +*/ +static int fulltextQuery( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* Match against this column by default */ + const char *zInput, /* The query string */ + int nInput, /* Number of bytes in zInput[] */ + DataBuffer *pResult, /* Write the result doclist here */ + Query *pQuery /* Put parsed query string here */ +){ + int i, iNext, rc; + DataBuffer left, right, or, new; + int nNot = 0; + QueryTerm *aTerm; + + /* TODO(shess) Instead of flushing pendingTerms, we could query for + ** the relevant term and merge the doclist into what we receive from + ** the database. Wait and see if this is a common issue, first. + ** + ** A good reason not to flush is to not generate update-related + ** error codes from here. + */ + + /* Flush any buffered updates before executing the query. */ + rc = flushPendingTerms(v); + if( rc!=SQLITE_OK ) return rc; + + /* TODO(shess) I think that the queryClear() calls below are not + ** necessary, because fulltextClose() already clears the query. + */ + rc = parseQuery(v, zInput, nInput, iColumn, pQuery); + if( rc!=SQLITE_OK ) return rc; + + /* Empty or NULL queries return no results. */ + if( pQuery->nTerms==0 ){ + dataBufferInit(pResult, 0); + return SQLITE_OK; + } + + /* Merge AND terms. */ + /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */ + aTerm = pQuery->pTerms; + for(i = 0; inTerms; i=iNext){ + if( aTerm[i].isNot ){ + /* Handle all NOT terms in a separate pass */ + nNot++; + iNext = i + aTerm[i].nPhrase+1; + continue; + } + iNext = i + aTerm[i].nPhrase + 1; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); + if( rc ){ + if( i!=nNot ) dataBufferDestroy(&left); + queryClear(pQuery); + return rc; + } + while( iNextnTerms && aTerm[iNext].isOr ){ + rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or); + iNext += aTerm[iNext].nPhrase + 1; + if( rc ){ + if( i!=nNot ) dataBufferDestroy(&left); + dataBufferDestroy(&right); + queryClear(pQuery); + return rc; + } + dataBufferInit(&new, 0); + docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&or); + right = new; + } + if( i==nNot ){ /* first term processed. */ + left = right; + }else{ + dataBufferInit(&new, 0); + docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&left); + left = new; + } + } + + if( nNot==pQuery->nTerms ){ + /* We do not yet know how to handle a query of only NOT terms */ + return SQLITE_ERROR; + } + + /* Do the EXCEPT terms */ + for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ + if( !aTerm[i].isNot ) continue; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); + if( rc ){ + queryClear(pQuery); + dataBufferDestroy(&left); + return rc; + } + dataBufferInit(&new, 0); + docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&left); + left = new; + } + + *pResult = left; + return rc; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==QUERY_GENERIC then do a full table scan against +** the %_content table. +** +** If idxNum==QUERY_ROWID then do a rowid lookup for a single entry +** in the %_content table. +** +** If idxNum>=QUERY_FULLTEXT then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. +*/ +/* TODO(shess) Upgrade the cursor initialization and destruction to +** account for fulltextFilter() being called multiple times on the +** same cursor. The current solution is very fragile. Apply fix to +** fts2 as appropriate. +*/ +static int fulltextFilter( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, const char *idxStr, /* Which indexing scheme to use */ + int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ +){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + int rc; + char *zSql; + + TRACE(("FTS2 Filter %p\n",pCursor)); + + zSql = sqlite3_mprintf("select rowid, * from %%_content %s", + idxNum==QUERY_GENERIC ? "" : "where rowid=?"); + sqlite3_finalize(c->pStmt); + rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, zSql); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ) return rc; + + c->iCursorType = idxNum; + switch( idxNum ){ + case QUERY_GENERIC: + break; + + case QUERY_ROWID: + rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); + if( rc!=SQLITE_OK ) return rc; + break; + + default: /* full-text search */ + { + const char *zQuery = (const char *)sqlite3_value_text(argv[0]); + assert( idxNum<=QUERY_FULLTEXT+v->nColumn); + assert( argc==1 ); + queryClear(&c->q); + if( c->result.nData!=0 ){ + /* This case happens if the same cursor is used repeatedly. */ + dlrDestroy(&c->reader); + dataBufferReset(&c->result); + }else{ + dataBufferInit(&c->result, 0); + } + rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q); + if( rc!=SQLITE_OK ) return rc; + if( c->result.nData!=0 ){ + dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData); + } + break; + } + } + + return fulltextNext(pCursor); +} + +/* This is the xEof method of the virtual table. The SQLite core +** calls this routine to find out if it has reached the end of +** a query's results set. +*/ +static int fulltextEof(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + return c->eof; +} + +/* This is the xColumn method of the virtual table. The SQLite +** core calls this method during a query when it needs the value +** of a column from the virtual table. This method needs to use +** one of the sqlite3_result_*() routines to store the requested +** value back in the pContext. +*/ +static int fulltextColumn(sqlite3_vtab_cursor *pCursor, + sqlite3_context *pContext, int idxCol){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + + if( idxColnColumn ){ + sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); + sqlite3_result_value(pContext, pVal); + }else if( idxCol==v->nColumn ){ + /* The extra column whose name is the same as the table. + ** Return a blob which is a pointer to the cursor + */ + sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* This is the xRowid method. The SQLite core calls this routine to +** retrive the rowid for the current row of the result set. The +** rowid should be written to *pRowid. +*/ +static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + + *pRowid = sqlite3_column_int64(c->pStmt, 0); + return SQLITE_OK; +} + +/* Add all terms in [zText] to pendingTerms table. If [iColumn] > 0, +** we also store positions and offsets in the hash table using that +** column number. +*/ +static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid, + const char *zText, int iColumn){ + sqlite3_tokenizer *pTokenizer = v->pTokenizer; + sqlite3_tokenizer_cursor *pCursor; + const char *pToken; + int nTokenBytes; + int iStartOffset, iEndOffset, iPosition; + int rc; + + rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); + if( rc!=SQLITE_OK ) return rc; + + pCursor->pTokenizer = pTokenizer; + while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, + &pToken, &nTokenBytes, + &iStartOffset, &iEndOffset, + &iPosition) ){ + DLCollector *p; + int nData; /* Size of doclist before our update. */ + + /* Positions can't be negative; we use -1 as a terminator internally. */ + if( iPosition<0 ){ + pTokenizer->pModule->xClose(pCursor); + return SQLITE_ERROR; + } + + p = fts2HashFind(&v->pendingTerms, pToken, nTokenBytes); + if( p==NULL ){ + nData = 0; + p = dlcNew(iDocid, DL_DEFAULT); + fts2HashInsert(&v->pendingTerms, pToken, nTokenBytes, p); + + /* Overhead for our hash table entry, the key, and the value. */ + v->nPendingData += sizeof(struct fts2HashElem)+sizeof(*p)+nTokenBytes; + }else{ + nData = p->b.nData; + if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid); + } + if( iColumn>=0 ){ + dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset); + } + + /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */ + v->nPendingData += p->b.nData-nData; + } + + /* TODO(shess) Check return? Should this be able to cause errors at + ** this point? Actually, same question about sqlite3_finalize(), + ** though one could argue that failure there means that the data is + ** not durable. *ponder* + */ + pTokenizer->pModule->xClose(pCursor); + return rc; +} + +/* Add doclists for all terms in [pValues] to pendingTerms table. */ +static int insertTerms(fulltext_vtab *v, sqlite_int64 iRowid, + sqlite3_value **pValues){ + int i; + for(i = 0; i < v->nColumn ; ++i){ + char *zText = (char*)sqlite3_value_text(pValues[i]); + int rc = buildTerms(v, iRowid, zText, i); + if( rc!=SQLITE_OK ) return rc; + } + return SQLITE_OK; +} + +/* Add empty doclists for all terms in the given row's content to +** pendingTerms. +*/ +static int deleteTerms(fulltext_vtab *v, sqlite_int64 iRowid){ + const char **pValues; + int i, rc; + + /* TODO(shess) Should we allow such tables at all? */ + if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR; + + rc = content_select(v, iRowid, &pValues); + if( rc!=SQLITE_OK ) return rc; + + for(i = 0 ; i < v->nColumn; ++i) { + rc = buildTerms(v, iRowid, pValues[i], -1); + if( rc!=SQLITE_OK ) break; + } + + freeStringArray(v->nColumn, pValues); + return SQLITE_OK; +} + +/* TODO(shess) Refactor the code to remove this forward decl. */ +static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid); + +/* Insert a row into the %_content table; set *piRowid to be the ID of the +** new row. Add doclists for terms to pendingTerms. +*/ +static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestRowid, + sqlite3_value **pValues, sqlite_int64 *piRowid){ + int rc; + + rc = content_insert(v, pRequestRowid, pValues); /* execute an SQL INSERT */ + if( rc!=SQLITE_OK ) return rc; + + *piRowid = sqlite3_last_insert_rowid(v->db); + rc = initPendingTerms(v, *piRowid); + if( rc!=SQLITE_OK ) return rc; + + return insertTerms(v, *piRowid, pValues); +} + +/* Delete a row from the %_content table; add empty doclists for terms +** to pendingTerms. +*/ +static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){ + int rc = initPendingTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = deleteTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + return content_delete(v, iRow); /* execute an SQL DELETE */ +} + +/* Update a row in the %_content table; add delete doclists to +** pendingTerms for old terms not in the new data, add insert doclists +** to pendingTerms for terms in the new data. +*/ +static int index_update(fulltext_vtab *v, sqlite_int64 iRow, + sqlite3_value **pValues){ + int rc = initPendingTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + /* Generate an empty doclist for each term that previously appeared in this + * row. */ + rc = deleteTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ + if( rc!=SQLITE_OK ) return rc; + + /* Now add positions for terms which appear in the updated row. */ + return insertTerms(v, iRow, pValues); +} + +/*******************************************************************/ +/* InteriorWriter is used to collect terms and block references into +** interior nodes in %_segments. See commentary at top of file for +** format. +*/ + +/* How large interior nodes can grow. */ +#define INTERIOR_MAX 2048 + +/* Minimum number of terms per interior node (except the root). This +** prevents large terms from making the tree too skinny - must be >0 +** so that the tree always makes progress. Note that the min tree +** fanout will be INTERIOR_MIN_TERMS+1. +*/ +#define INTERIOR_MIN_TERMS 7 +#if INTERIOR_MIN_TERMS<1 +# error INTERIOR_MIN_TERMS must be greater than 0. +#endif + +/* ROOT_MAX controls how much data is stored inline in the segment +** directory. +*/ +/* TODO(shess) Push ROOT_MAX down to whoever is writing things. It's +** only here so that interiorWriterRootInfo() and leafWriterRootInfo() +** can both see it, but if the caller passed it in, we wouldn't even +** need a define. +*/ +#define ROOT_MAX 1024 +#if ROOT_MAXterm, 0); + dataBufferReplace(&block->term, pTerm, nTerm); + + n = putVarint(c, iHeight); + n += putVarint(c+n, iChildBlock); + dataBufferInit(&block->data, INTERIOR_MAX); + dataBufferReplace(&block->data, c, n); + + return block; +} + +#ifndef NDEBUG +/* Verify that the data is readable as an interior node. */ +static void interiorBlockValidate(InteriorBlock *pBlock){ + const char *pData = pBlock->data.pData; + int nData = pBlock->data.nData; + int n, iDummy; + sqlite_int64 iBlockid; + + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + + /* Must lead with height of node as a varint(n), n>0 */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>0 ); + assert( n0 ); + assert( n<=nData ); + pData += n; + nData -= n; + + /* Zero or more terms of positive length */ + if( nData!=0 ){ + /* First term is not delta-encoded. */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>0 ); + assert( n+iDummy>0); + assert( n+iDummy<=nData ); + pData += n+iDummy; + nData -= n+iDummy; + + /* Following terms delta-encoded. */ + while( nData!=0 ){ + /* Length of shared prefix. */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>=0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0); + assert( n+iDummy<=nData ); + pData += n+iDummy; + nData -= n+iDummy; + } + } +} +#define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x) +#else +#define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 ) +#endif + +typedef struct InteriorWriter { + int iHeight; /* from 0 at leaves. */ + InteriorBlock *first, *last; + struct InteriorWriter *parentWriter; + + DataBuffer term; /* Last term written to block "last". */ + sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */ +#ifndef NDEBUG + sqlite_int64 iLastChildBlock; /* for consistency checks. */ +#endif +} InteriorWriter; + +/* Initialize an interior node where pTerm[nTerm] marks the leftmost +** term in the tree. iChildBlock is the leftmost child block at the +** next level down the tree. +*/ +static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm, + sqlite_int64 iChildBlock, + InteriorWriter *pWriter){ + InteriorBlock *block; + assert( iHeight>0 ); + CLEAR(pWriter); + + pWriter->iHeight = iHeight; + pWriter->iOpeningChildBlock = iChildBlock; +#ifndef NDEBUG + pWriter->iLastChildBlock = iChildBlock; +#endif + block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm); + pWriter->last = pWriter->first = block; + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); + dataBufferInit(&pWriter->term, 0); +} + +/* Append the child node rooted at iChildBlock to the interior node, +** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree. +*/ +static void interiorWriterAppend(InteriorWriter *pWriter, + const char *pTerm, int nTerm, + sqlite_int64 iChildBlock){ + char c[VARINT_MAX+VARINT_MAX]; + int n, nPrefix = 0; + + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); + + /* The first term written into an interior node is actually + ** associated with the second child added (the first child was added + ** in interiorWriterInit, or in the if clause at the bottom of this + ** function). That term gets encoded straight up, with nPrefix left + ** at 0. + */ + if( pWriter->term.nData==0 ){ + n = putVarint(c, nTerm); + }else{ + while( nPrefixterm.nData && + pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ + nPrefix++; + } + + n = putVarint(c, nPrefix); + n += putVarint(c+n, nTerm-nPrefix); + } + +#ifndef NDEBUG + pWriter->iLastChildBlock++; +#endif + assert( pWriter->iLastChildBlock==iChildBlock ); + + /* Overflow to a new block if the new term makes the current block + ** too big, and the current block already has enough terms. + */ + if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX && + iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){ + pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock, + pTerm, nTerm); + pWriter->last = pWriter->last->next; + pWriter->iOpeningChildBlock = iChildBlock; + dataBufferReset(&pWriter->term); + }else{ + dataBufferAppend2(&pWriter->last->data, c, n, + pTerm+nPrefix, nTerm-nPrefix); + dataBufferReplace(&pWriter->term, pTerm, nTerm); + } + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); +} + +/* Free the space used by pWriter, including the linked-list of +** InteriorBlocks, and parentWriter, if present. +*/ +static int interiorWriterDestroy(InteriorWriter *pWriter){ + InteriorBlock *block = pWriter->first; + + while( block!=NULL ){ + InteriorBlock *b = block; + block = block->next; + dataBufferDestroy(&b->term); + dataBufferDestroy(&b->data); + free(b); + } + if( pWriter->parentWriter!=NULL ){ + interiorWriterDestroy(pWriter->parentWriter); + free(pWriter->parentWriter); + } + dataBufferDestroy(&pWriter->term); + SCRAMBLE(pWriter); + return SQLITE_OK; +} + +/* If pWriter can fit entirely in ROOT_MAX, return it as the root info +** directly, leaving *piEndBlockid unchanged. Otherwise, flush +** pWriter to %_segments, building a new layer of interior nodes, and +** recursively ask for their root into. +*/ +static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter, + char **ppRootInfo, int *pnRootInfo, + sqlite_int64 *piEndBlockid){ + InteriorBlock *block = pWriter->first; + sqlite_int64 iBlockid = 0; + int rc; + + /* If we can fit the segment inline */ + if( block==pWriter->last && block->data.nDatadata.pData; + *pnRootInfo = block->data.nData; + return SQLITE_OK; + } + + /* Flush the first block to %_segments, and create a new level of + ** interior node. + */ + ASSERT_VALID_INTERIOR_BLOCK(block); + rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + *piEndBlockid = iBlockid; + + pWriter->parentWriter = malloc(sizeof(*pWriter->parentWriter)); + interiorWriterInit(pWriter->iHeight+1, + block->term.pData, block->term.nData, + iBlockid, pWriter->parentWriter); + + /* Flush additional blocks and append to the higher interior + ** node. + */ + for(block=block->next; block!=NULL; block=block->next){ + ASSERT_VALID_INTERIOR_BLOCK(block); + rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + *piEndBlockid = iBlockid; + + interiorWriterAppend(pWriter->parentWriter, + block->term.pData, block->term.nData, iBlockid); + } + + /* Parent node gets the chance to be the root. */ + return interiorWriterRootInfo(v, pWriter->parentWriter, + ppRootInfo, pnRootInfo, piEndBlockid); +} + +/****************************************************************/ +/* InteriorReader is used to read off the data from an interior node +** (see comment at top of file for the format). +*/ +typedef struct InteriorReader { + const char *pData; + int nData; + + DataBuffer term; /* previous term, for decoding term delta. */ + + sqlite_int64 iBlockid; +} InteriorReader; + +static void interiorReaderDestroy(InteriorReader *pReader){ + dataBufferDestroy(&pReader->term); + SCRAMBLE(pReader); +} + +/* TODO(shess) The assertions are great, but what if we're in NDEBUG +** and the blob is empty or otherwise contains suspect data? +*/ +static void interiorReaderInit(const char *pData, int nData, + InteriorReader *pReader){ + int n, nTerm; + + /* Require at least the leading flag byte */ + assert( nData>0 ); + assert( pData[0]!='\0' ); + + CLEAR(pReader); + + /* Decode the base blockid, and set the cursor to the first term. */ + n = getVarint(pData+1, &pReader->iBlockid); + assert( 1+n<=nData ); + pReader->pData = pData+1+n; + pReader->nData = nData-(1+n); + + /* A single-child interior node (such as when a leaf node was too + ** large for the segment directory) won't have any terms. + ** Otherwise, decode the first term. + */ + if( pReader->nData==0 ){ + dataBufferInit(&pReader->term, 0); + }else{ + n = getVarint32(pReader->pData, &nTerm); + dataBufferInit(&pReader->term, nTerm); + dataBufferReplace(&pReader->term, pReader->pData+n, nTerm); + assert( n+nTerm<=pReader->nData ); + pReader->pData += n+nTerm; + pReader->nData -= n+nTerm; + } +} + +static int interiorReaderAtEnd(InteriorReader *pReader){ + return pReader->term.nData==0; +} + +static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){ + return pReader->iBlockid; +} + +static int interiorReaderTermBytes(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + return pReader->term.nData; +} +static const char *interiorReaderTerm(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + return pReader->term.pData; +} + +/* Step forward to the next term in the node. */ +static void interiorReaderStep(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + + /* If the last term has been read, signal eof, else construct the + ** next term. + */ + if( pReader->nData==0 ){ + dataBufferReset(&pReader->term); + }else{ + int n, nPrefix, nSuffix; + + n = getVarint32(pReader->pData, &nPrefix); + n += getVarint32(pReader->pData+n, &nSuffix); + + /* Truncate the current term and append suffix data. */ + pReader->term.nData = nPrefix; + dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); + + assert( n+nSuffix<=pReader->nData ); + pReader->pData += n+nSuffix; + pReader->nData -= n+nSuffix; + } + pReader->iBlockid++; +} + +/* Compare the current term to pTerm[nTerm], returning strcmp-style +** results. If isPrefix, equality means equal through nTerm bytes. +*/ +static int interiorReaderTermCmp(InteriorReader *pReader, + const char *pTerm, int nTerm, int isPrefix){ + const char *pReaderTerm = interiorReaderTerm(pReader); + int nReaderTerm = interiorReaderTermBytes(pReader); + int c, n = nReaderTerm0 ) return -1; + if( nTerm>0 ) return 1; + return 0; + } + + c = memcmp(pReaderTerm, pTerm, n); + if( c!=0 ) return c; + if( isPrefix && n==nTerm ) return 0; + return nReaderTerm - nTerm; +} + +/****************************************************************/ +/* LeafWriter is used to collect terms and associated doclist data +** into leaf blocks in %_segments (see top of file for format info). +** Expected usage is: +** +** LeafWriter writer; +** leafWriterInit(0, 0, &writer); +** while( sorted_terms_left_to_process ){ +** // data is doclist data for that term. +** rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData); +** if( rc!=SQLITE_OK ) goto err; +** } +** rc = leafWriterFinalize(v, &writer); +**err: +** leafWriterDestroy(&writer); +** return rc; +** +** leafWriterStep() may write a collected leaf out to %_segments. +** leafWriterFinalize() finishes writing any buffered data and stores +** a root node in %_segdir. leafWriterDestroy() frees all buffers and +** InteriorWriters allocated as part of writing this segment. +** +** TODO(shess) Document leafWriterStepMerge(). +*/ + +/* Put terms with data this big in their own block. */ +#define STANDALONE_MIN 1024 + +/* Keep leaf blocks below this size. */ +#define LEAF_MAX 2048 + +typedef struct LeafWriter { + int iLevel; + int idx; + sqlite_int64 iStartBlockid; /* needed to create the root info */ + sqlite_int64 iEndBlockid; /* when we're done writing. */ + + DataBuffer term; /* previous encoded term */ + DataBuffer data; /* encoding buffer */ + + /* bytes of first term in the current node which distinguishes that + ** term from the last term of the previous node. + */ + int nTermDistinct; + + InteriorWriter parentWriter; /* if we overflow */ + int has_parent; +} LeafWriter; + +static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){ + CLEAR(pWriter); + pWriter->iLevel = iLevel; + pWriter->idx = idx; + + dataBufferInit(&pWriter->term, 32); + + /* Start out with a reasonably sized block, though it can grow. */ + dataBufferInit(&pWriter->data, LEAF_MAX); +} + +#ifndef NDEBUG +/* Verify that the data is readable as a leaf node. */ +static void leafNodeValidate(const char *pData, int nData){ + int n, iDummy; + + if( nData==0 ) return; + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + + /* Must lead with a varint(0) */ + n = getVarint32(pData, &iDummy); + assert( iDummy==0 ); + assert( n>0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy<=nData ); + ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); + pData += n+iDummy; + nData -= n+iDummy; + + /* Verify that trailing terms and doclists also are readable. */ + while( nData!=0 ){ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>=0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy<=nData ); + ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); + pData += n+iDummy; + nData -= n+iDummy; + } +} +#define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n) +#else +#define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 ) +#endif + +/* Flush the current leaf node to %_segments, and adding the resulting +** blockid and the starting term to the interior node which will +** contain it. +*/ +static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter, + int iData, int nData){ + sqlite_int64 iBlockid = 0; + const char *pStartingTerm; + int nStartingTerm, rc, n; + + /* Must have the leading varint(0) flag, plus at least some + ** valid-looking data. + */ + assert( nData>2 ); + assert( iData>=0 ); + assert( iData+nData<=pWriter->data.nData ); + ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData); + + rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + assert( iBlockid!=0 ); + + /* Reconstruct the first term in the leaf for purposes of building + ** the interior node. + */ + n = getVarint32(pWriter->data.pData+iData+1, &nStartingTerm); + pStartingTerm = pWriter->data.pData+iData+1+n; + assert( pWriter->data.nData>iData+1+n+nStartingTerm ); + assert( pWriter->nTermDistinct>0 ); + assert( pWriter->nTermDistinct<=nStartingTerm ); + nStartingTerm = pWriter->nTermDistinct; + + if( pWriter->has_parent ){ + interiorWriterAppend(&pWriter->parentWriter, + pStartingTerm, nStartingTerm, iBlockid); + }else{ + interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid, + &pWriter->parentWriter); + pWriter->has_parent = 1; + } + + /* Track the span of this segment's leaf nodes. */ + if( pWriter->iEndBlockid==0 ){ + pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid; + }else{ + pWriter->iEndBlockid++; + assert( iBlockid==pWriter->iEndBlockid ); + } + + return SQLITE_OK; +} +static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){ + int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData); + if( rc!=SQLITE_OK ) return rc; + + /* Re-initialize the output buffer. */ + dataBufferReset(&pWriter->data); + + return SQLITE_OK; +} + +/* Fetch the root info for the segment. If the entire leaf fits +** within ROOT_MAX, then it will be returned directly, otherwise it +** will be flushed and the root info will be returned from the +** interior node. *piEndBlockid is set to the blockid of the last +** interior or leaf node written to disk (0 if none are written at +** all). +*/ +static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter, + char **ppRootInfo, int *pnRootInfo, + sqlite_int64 *piEndBlockid){ + /* we can fit the segment entirely inline */ + if( !pWriter->has_parent && pWriter->data.nDatadata.pData; + *pnRootInfo = pWriter->data.nData; + *piEndBlockid = 0; + return SQLITE_OK; + } + + /* Flush remaining leaf data. */ + if( pWriter->data.nData>0 ){ + int rc = leafWriterFlush(v, pWriter); + if( rc!=SQLITE_OK ) return rc; + } + + /* We must have flushed a leaf at some point. */ + assert( pWriter->has_parent ); + + /* Tenatively set the end leaf blockid as the end blockid. If the + ** interior node can be returned inline, this will be the final + ** blockid, otherwise it will be overwritten by + ** interiorWriterRootInfo(). + */ + *piEndBlockid = pWriter->iEndBlockid; + + return interiorWriterRootInfo(v, &pWriter->parentWriter, + ppRootInfo, pnRootInfo, piEndBlockid); +} + +/* Collect the rootInfo data and store it into the segment directory. +** This has the effect of flushing the segment's leaf data to +** %_segments, and also flushing any interior nodes to %_segments. +*/ +static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){ + sqlite_int64 iEndBlockid; + char *pRootInfo; + int rc, nRootInfo; + + rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + /* Don't bother storing an entirely empty segment. */ + if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK; + + return segdir_set(v, pWriter->iLevel, pWriter->idx, + pWriter->iStartBlockid, pWriter->iEndBlockid, + iEndBlockid, pRootInfo, nRootInfo); +} + +static void leafWriterDestroy(LeafWriter *pWriter){ + if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter); + dataBufferDestroy(&pWriter->term); + dataBufferDestroy(&pWriter->data); +} + +/* Encode a term into the leafWriter, delta-encoding as appropriate. +** Returns the length of the new term which distinguishes it from the +** previous term, which can be used to set nTermDistinct when a node +** boundary is crossed. +*/ +static int leafWriterEncodeTerm(LeafWriter *pWriter, + const char *pTerm, int nTerm){ + char c[VARINT_MAX+VARINT_MAX]; + int n, nPrefix = 0; + + assert( nTerm>0 ); + while( nPrefixterm.nData && + pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ + nPrefix++; + /* Failing this implies that the terms weren't in order. */ + assert( nPrefixdata.nData==0 ){ + /* Encode the node header and leading term as: + ** varint(0) + ** varint(nTerm) + ** char pTerm[nTerm] + */ + n = putVarint(c, '\0'); + n += putVarint(c+n, nTerm); + dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm); + }else{ + /* Delta-encode the term as: + ** varint(nPrefix) + ** varint(nSuffix) + ** char pTermSuffix[nSuffix] + */ + n = putVarint(c, nPrefix); + n += putVarint(c+n, nTerm-nPrefix); + dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix); + } + dataBufferReplace(&pWriter->term, pTerm, nTerm); + + return nPrefix+1; +} + +/* Used to avoid a memmove when a large amount of doclist data is in +** the buffer. This constructs a node and term header before +** iDoclistData and flushes the resulting complete node using +** leafWriterInternalFlush(). +*/ +static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + int iDoclistData){ + char c[VARINT_MAX+VARINT_MAX]; + int iData, n = putVarint(c, 0); + n += putVarint(c+n, nTerm); + + /* There should always be room for the header. Even if pTerm shared + ** a substantial prefix with the previous term, the entire prefix + ** could be constructed from earlier data in the doclist, so there + ** should be room. + */ + assert( iDoclistData>=n+nTerm ); + + iData = iDoclistData-(n+nTerm); + memcpy(pWriter->data.pData+iData, c, n); + memcpy(pWriter->data.pData+iData+n, pTerm, nTerm); + + return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData); +} + +/* Push pTerm[nTerm] along with the doclist data to the leaf layer of +** %_segments. +*/ +static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + DLReader *pReaders, int nReaders){ + char c[VARINT_MAX+VARINT_MAX]; + int iTermData = pWriter->data.nData, iDoclistData; + int i, nData, n, nActualData, nActual, rc, nTermDistinct; + + ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); + nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm); + + /* Remember nTermDistinct if opening a new node. */ + if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct; + + iDoclistData = pWriter->data.nData; + + /* Estimate the length of the merged doclist so we can leave space + ** to encode it. + */ + for(i=0, nData=0; idata, c, n); + + docListMerge(&pWriter->data, pReaders, nReaders); + ASSERT_VALID_DOCLIST(DL_DEFAULT, + pWriter->data.pData+iDoclistData+n, + pWriter->data.nData-iDoclistData-n, NULL); + + /* The actual amount of doclist data at this point could be smaller + ** than the length we encoded. Additionally, the space required to + ** encode this length could be smaller. For small doclists, this is + ** not a big deal, we can just use memmove() to adjust things. + */ + nActualData = pWriter->data.nData-(iDoclistData+n); + nActual = putVarint(c, nActualData); + assert( nActualData<=nData ); + assert( nActual<=n ); + + /* If the new doclist is big enough for force a standalone leaf + ** node, we can immediately flush it inline without doing the + ** memmove(). + */ + /* TODO(shess) This test matches leafWriterStep(), which does this + ** test before it knows the cost to varint-encode the term and + ** doclist lengths. At some point, change to + ** pWriter->data.nData-iTermData>STANDALONE_MIN. + */ + if( nTerm+nActualData>STANDALONE_MIN ){ + /* Push leaf node from before this term. */ + if( iTermData>0 ){ + rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); + if( rc!=SQLITE_OK ) return rc; + + pWriter->nTermDistinct = nTermDistinct; + } + + /* Fix the encoded doclist length. */ + iDoclistData += n - nActual; + memcpy(pWriter->data.pData+iDoclistData, c, nActual); + + /* Push the standalone leaf node. */ + rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData); + if( rc!=SQLITE_OK ) return rc; + + /* Leave the node empty. */ + dataBufferReset(&pWriter->data); + + return rc; + } + + /* At this point, we know that the doclist was small, so do the + ** memmove if indicated. + */ + if( nActualdata.pData+iDoclistData+nActual, + pWriter->data.pData+iDoclistData+n, + pWriter->data.nData-(iDoclistData+n)); + pWriter->data.nData -= n-nActual; + } + + /* Replace written length with actual length. */ + memcpy(pWriter->data.pData+iDoclistData, c, nActual); + + /* If the node is too large, break things up. */ + /* TODO(shess) This test matches leafWriterStep(), which does this + ** test before it knows the cost to varint-encode the term and + ** doclist lengths. At some point, change to + ** pWriter->data.nData>LEAF_MAX. + */ + if( iTermData+nTerm+nActualData>LEAF_MAX ){ + /* Flush out the leading data as a node */ + rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); + if( rc!=SQLITE_OK ) return rc; + + pWriter->nTermDistinct = nTermDistinct; + + /* Rebuild header using the current term */ + n = putVarint(pWriter->data.pData, 0); + n += putVarint(pWriter->data.pData+n, nTerm); + memcpy(pWriter->data.pData+n, pTerm, nTerm); + n += nTerm; + + /* There should always be room, because the previous encoding + ** included all data necessary to construct the term. + */ + assert( ndata.nData-iDoclistDatadata.pData+n, + pWriter->data.pData+iDoclistData, + pWriter->data.nData-iDoclistData); + pWriter->data.nData -= iDoclistData-n; + } + ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); + + return SQLITE_OK; +} + +/* Push pTerm[nTerm] along with the doclist data to the leaf layer of +** %_segments. +*/ +/* TODO(shess) Revise writeZeroSegment() so that doclists are +** constructed directly in pWriter->data. +*/ +static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + const char *pData, int nData){ + int rc; + DLReader reader; + + dlrInit(&reader, DL_DEFAULT, pData, nData); + rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1); + dlrDestroy(&reader); + + return rc; +} + + +/****************************************************************/ +/* LeafReader is used to iterate over an individual leaf node. */ +typedef struct LeafReader { + DataBuffer term; /* copy of current term. */ + + const char *pData; /* data for current term. */ + int nData; +} LeafReader; + +static void leafReaderDestroy(LeafReader *pReader){ + dataBufferDestroy(&pReader->term); + SCRAMBLE(pReader); +} + +static int leafReaderAtEnd(LeafReader *pReader){ + return pReader->nData<=0; +} + +/* Access the current term. */ +static int leafReaderTermBytes(LeafReader *pReader){ + return pReader->term.nData; +} +static const char *leafReaderTerm(LeafReader *pReader){ + assert( pReader->term.nData>0 ); + return pReader->term.pData; +} + +/* Access the doclist data for the current term. */ +static int leafReaderDataBytes(LeafReader *pReader){ + int nData; + assert( pReader->term.nData>0 ); + getVarint32(pReader->pData, &nData); + return nData; +} +static const char *leafReaderData(LeafReader *pReader){ + int n, nData; + assert( pReader->term.nData>0 ); + n = getVarint32(pReader->pData, &nData); + return pReader->pData+n; +} + +static void leafReaderInit(const char *pData, int nData, + LeafReader *pReader){ + int nTerm, n; + + assert( nData>0 ); + assert( pData[0]=='\0' ); + + CLEAR(pReader); + + /* Read the first term, skipping the header byte. */ + n = getVarint32(pData+1, &nTerm); + dataBufferInit(&pReader->term, nTerm); + dataBufferReplace(&pReader->term, pData+1+n, nTerm); + + /* Position after the first term. */ + assert( 1+n+nTermpData = pData+1+n+nTerm; + pReader->nData = nData-1-n-nTerm; +} + +/* Step the reader forward to the next term. */ +static void leafReaderStep(LeafReader *pReader){ + int n, nData, nPrefix, nSuffix; + assert( !leafReaderAtEnd(pReader) ); + + /* Skip previous entry's data block. */ + n = getVarint32(pReader->pData, &nData); + assert( n+nData<=pReader->nData ); + pReader->pData += n+nData; + pReader->nData -= n+nData; + + if( !leafReaderAtEnd(pReader) ){ + /* Construct the new term using a prefix from the old term plus a + ** suffix from the leaf data. + */ + n = getVarint32(pReader->pData, &nPrefix); + n += getVarint32(pReader->pData+n, &nSuffix); + assert( n+nSuffixnData ); + pReader->term.nData = nPrefix; + dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); + + pReader->pData += n+nSuffix; + pReader->nData -= n+nSuffix; + } +} + +/* strcmp-style comparison of pReader's current term against pTerm. +** If isPrefix, equality means equal through nTerm bytes. +*/ +static int leafReaderTermCmp(LeafReader *pReader, + const char *pTerm, int nTerm, int isPrefix){ + int c, n = pReader->term.nDataterm.nData : nTerm; + if( n==0 ){ + if( pReader->term.nData>0 ) return -1; + if(nTerm>0 ) return 1; + return 0; + } + + c = memcmp(pReader->term.pData, pTerm, n); + if( c!=0 ) return c; + if( isPrefix && n==nTerm ) return 0; + return pReader->term.nData - nTerm; +} + + +/****************************************************************/ +/* LeavesReader wraps LeafReader to allow iterating over the entire +** leaf layer of the tree. +*/ +typedef struct LeavesReader { + int idx; /* Index within the segment. */ + + sqlite3_stmt *pStmt; /* Statement we're streaming leaves from. */ + int eof; /* we've seen SQLITE_DONE from pStmt. */ + + LeafReader leafReader; /* reader for the current leaf. */ + DataBuffer rootData; /* root data for inline. */ +} LeavesReader; + +/* Access the current term. */ +static int leavesReaderTermBytes(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderTermBytes(&pReader->leafReader); +} +static const char *leavesReaderTerm(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderTerm(&pReader->leafReader); +} + +/* Access the doclist data for the current term. */ +static int leavesReaderDataBytes(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderDataBytes(&pReader->leafReader); +} +static const char *leavesReaderData(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderData(&pReader->leafReader); +} + +static int leavesReaderAtEnd(LeavesReader *pReader){ + return pReader->eof; +} + +/* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus +** leaving the statement handle open, which locks the table. +*/ +/* TODO(shess) This "solution" is not satisfactory. Really, there +** should be check-in function for all statement handles which +** arranges to call sqlite3_reset(). This most likely will require +** modification to control flow all over the place, though, so for now +** just punt. +** +** Note the the current system assumes that segment merges will run to +** completion, which is why this particular probably hasn't arisen in +** this case. Probably a brittle assumption. +*/ +static int leavesReaderReset(LeavesReader *pReader){ + return sqlite3_reset(pReader->pStmt); +} + +static void leavesReaderDestroy(LeavesReader *pReader){ + leafReaderDestroy(&pReader->leafReader); + dataBufferDestroy(&pReader->rootData); + SCRAMBLE(pReader); +} + +/* Initialize pReader with the given root data (if iStartBlockid==0 +** the leaf data was entirely contained in the root), or from the +** stream of blocks between iStartBlockid and iEndBlockid, inclusive. +*/ +static int leavesReaderInit(fulltext_vtab *v, + int idx, + sqlite_int64 iStartBlockid, + sqlite_int64 iEndBlockid, + const char *pRootData, int nRootData, + LeavesReader *pReader){ + CLEAR(pReader); + pReader->idx = idx; + + dataBufferInit(&pReader->rootData, 0); + if( iStartBlockid==0 ){ + /* Entire leaf level fit in root data. */ + dataBufferReplace(&pReader->rootData, pRootData, nRootData); + leafReaderInit(pReader->rootData.pData, pReader->rootData.nData, + &pReader->leafReader); + }else{ + sqlite3_stmt *s; + int rc = sql_get_leaf_statement(v, idx, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 2, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ){ + pReader->eof = 1; + return SQLITE_OK; + } + if( rc!=SQLITE_ROW ) return rc; + + pReader->pStmt = s; + leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), + sqlite3_column_bytes(pReader->pStmt, 0), + &pReader->leafReader); + } + return SQLITE_OK; +} + +/* Step the current leaf forward to the next term. If we reach the +** end of the current leaf, step forward to the next leaf block. +*/ +static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ + assert( !leavesReaderAtEnd(pReader) ); + leafReaderStep(&pReader->leafReader); + + if( leafReaderAtEnd(&pReader->leafReader) ){ + int rc; + if( pReader->rootData.pData ){ + pReader->eof = 1; + return SQLITE_OK; + } + rc = sqlite3_step(pReader->pStmt); + if( rc!=SQLITE_ROW ){ + pReader->eof = 1; + return rc==SQLITE_DONE ? SQLITE_OK : rc; + } + leafReaderDestroy(&pReader->leafReader); + leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), + sqlite3_column_bytes(pReader->pStmt, 0), + &pReader->leafReader); + } + return SQLITE_OK; +} + +/* Order LeavesReaders by their term, ignoring idx. Readers at eof +** always sort to the end. +*/ +static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){ + if( leavesReaderAtEnd(lr1) ){ + if( leavesReaderAtEnd(lr2) ) return 0; + return 1; + } + if( leavesReaderAtEnd(lr2) ) return -1; + + return leafReaderTermCmp(&lr1->leafReader, + leavesReaderTerm(lr2), leavesReaderTermBytes(lr2), + 0); +} + +/* Similar to leavesReaderTermCmp(), with additional ordering by idx +** so that older segments sort before newer segments. +*/ +static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){ + int c = leavesReaderTermCmp(lr1, lr2); + if( c!=0 ) return c; + return lr1->idx-lr2->idx; +} + +/* Assume that pLr[1]..pLr[nLr] are sorted. Bubble pLr[0] into its +** sorted position. +*/ +static void leavesReaderReorder(LeavesReader *pLr, int nLr){ + while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){ + LeavesReader tmp = pLr[0]; + pLr[0] = pLr[1]; + pLr[1] = tmp; + nLr--; + pLr++; + } +} + +/* Initializes pReaders with the segments from level iLevel, returning +** the number of segments in *piReaders. Leaves pReaders in sorted +** order. +*/ +static int leavesReadersInit(fulltext_vtab *v, int iLevel, + LeavesReader *pReaders, int *piReaders){ + sqlite3_stmt *s; + int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + i = 0; + while( (rc = sqlite3_step(s))==SQLITE_ROW ){ + sqlite_int64 iStart = sqlite3_column_int64(s, 0); + sqlite_int64 iEnd = sqlite3_column_int64(s, 1); + const char *pRootData = sqlite3_column_blob(s, 2); + int nRootData = sqlite3_column_bytes(s, 2); + + assert( i0 ){ + leavesReaderDestroy(&pReaders[i]); + } + return rc; + } + + *piReaders = i; + + /* Leave our results sorted by term, then age. */ + while( i-- ){ + leavesReaderReorder(pReaders+i, *piReaders-i); + } + return SQLITE_OK; +} + +/* Merge doclists from pReaders[nReaders] into a single doclist, which +** is written to pWriter. Assumes pReaders is ordered oldest to +** newest. +*/ +/* TODO(shess) Consider putting this inline in segmentMerge(). */ +static int leavesReadersMerge(fulltext_vtab *v, + LeavesReader *pReaders, int nReaders, + LeafWriter *pWriter){ + DLReader dlReaders[MERGE_COUNT]; + const char *pTerm = leavesReaderTerm(pReaders); + int i, nTerm = leavesReaderTermBytes(pReaders); + + assert( nReaders<=MERGE_COUNT ); + + for(i=0; i0 ){ + rc = leavesReaderStep(v, lrs+i); + if( rc!=SQLITE_OK ) goto err; + + /* Reorder by term, then by age. */ + leavesReaderReorder(lrs+i, MERGE_COUNT-i); + } + } + + for(i=0; i0 ); + + /* Process while the prefix matches. */ + while( !leavesReaderAtEnd(pReader) ){ + /* TODO(shess) Really want leavesReaderTermCmp(), but that name is + ** already taken to compare the terms of two LeavesReaders. Think + ** on a better name. [Meanwhile, break encapsulation rather than + ** use a confusing name.] + */ + int rc; + int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); + if( c==0 ){ + const char *pData = leavesReaderData(pReader); + int nData = leavesReaderDataBytes(pReader); + if( out->nData==0 ){ + dataBufferReplace(out, pData, nData); + }else{ + DataBuffer result; + dataBufferInit(&result, out->nData+nData); + docListUnion(out->pData, out->nData, pData, nData, &result); + dataBufferDestroy(out); + *out = result; + /* TODO(shess) Rather than destroy out, we could retain it for + ** later reuse. + */ + } + } + if( c>0 ) break; /* Past any possible matches. */ + + rc = leavesReaderStep(v, pReader); + if( rc!=SQLITE_OK ) return rc; + } + return SQLITE_OK; +} + +/* Call loadSegmentLeavesInt() with pData/nData as input. */ +static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + LeavesReader reader; + int rc; + + assert( nData>1 ); + assert( *pData=='\0' ); + rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); + if( rc!=SQLITE_OK ) return rc; + + rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); + leavesReaderReset(&reader); + leavesReaderDestroy(&reader); + return rc; +} + +/* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to +** iEndLeaf (inclusive) as input, and merge the resulting doclist into +** out. +*/ +static int loadSegmentLeaves(fulltext_vtab *v, + sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + int rc; + LeavesReader reader; + + assert( iStartLeaf<=iEndLeaf ); + rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader); + if( rc!=SQLITE_OK ) return rc; + + rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); + leavesReaderReset(&reader); + leavesReaderDestroy(&reader); + return rc; +} + +/* Taking pData/nData as an interior node, find the sequence of child +** nodes which could include pTerm/nTerm/isPrefix. Note that the +** interior node terms logically come between the blocks, so there is +** one more blockid than there are terms (that block contains terms >= +** the last interior-node term). +*/ +/* TODO(shess) The calling code may already know that the end child is +** not worth calculating, because the end may be in a later sibling +** node. Consider whether breaking symmetry is worthwhile. I suspect +** it's not worthwhile. +*/ +static void getChildrenContaining(const char *pData, int nData, + const char *pTerm, int nTerm, int isPrefix, + sqlite_int64 *piStartChild, + sqlite_int64 *piEndChild){ + InteriorReader reader; + + assert( nData>1 ); + assert( *pData!='\0' ); + interiorReaderInit(pData, nData, &reader); + + /* Scan for the first child which could contain pTerm/nTerm. */ + while( !interiorReaderAtEnd(&reader) ){ + if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break; + interiorReaderStep(&reader); + } + *piStartChild = interiorReaderCurrentBlockid(&reader); + + /* Keep scanning to find a term greater than our term, using prefix + ** comparison if indicated. If isPrefix is false, this will be the + ** same blockid as the starting block. + */ + while( !interiorReaderAtEnd(&reader) ){ + if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; + interiorReaderStep(&reader); + } + *piEndChild = interiorReaderCurrentBlockid(&reader); + + interiorReaderDestroy(&reader); + + /* Children must ascend, and if !prefix, both must be the same. */ + assert( *piEndChild>=*piStartChild ); + assert( isPrefix || *piStartChild==*piEndChild ); +} + +/* Read block at iBlockid and pass it with other params to +** getChildrenContaining(). +*/ +static int loadAndGetChildrenContaining( + fulltext_vtab *v, + sqlite_int64 iBlockid, + const char *pTerm, int nTerm, int isPrefix, + sqlite_int64 *piStartChild, sqlite_int64 *piEndChild +){ + sqlite3_stmt *s = NULL; + int rc; + + assert( iBlockid!=0 ); + assert( pTerm!=NULL ); + assert( nTerm!=0 ); /* TODO(shess) Why not allow this? */ + assert( piStartChild!=NULL ); + assert( piEndChild!=NULL ); + + rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ) return SQLITE_ERROR; + if( rc!=SQLITE_ROW ) return rc; + + getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0), + pTerm, nTerm, isPrefix, piStartChild, piEndChild); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain + * locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + + return SQLITE_OK; +} + +/* Traverse the tree represented by pData[nData] looking for +** pTerm[nTerm], placing its doclist into *out. This is internal to +** loadSegment() to make error-handling cleaner. +*/ +static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 iLeavesEnd, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + /* Special case where root is a leaf. */ + if( *pData=='\0' ){ + return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out); + }else{ + int rc; + sqlite_int64 iStartChild, iEndChild; + + /* Process pData as an interior node, then loop down the tree + ** until we find the set of leaf nodes to scan for the term. + */ + getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix, + &iStartChild, &iEndChild); + while( iStartChild>iLeavesEnd ){ + sqlite_int64 iNextStart, iNextEnd; + rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, + &iNextStart, &iNextEnd); + if( rc!=SQLITE_OK ) return rc; + + /* If we've branched, follow the end branch, too. */ + if( iStartChild!=iEndChild ){ + sqlite_int64 iDummy; + rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix, + &iDummy, &iNextEnd); + if( rc!=SQLITE_OK ) return rc; + } + + assert( iNextStart<=iNextEnd ); + iStartChild = iNextStart; + iEndChild = iNextEnd; + } + assert( iStartChild<=iLeavesEnd ); + assert( iEndChild<=iLeavesEnd ); + + /* Scan through the leaf segments for doclists. */ + return loadSegmentLeaves(v, iStartChild, iEndChild, + pTerm, nTerm, isPrefix, out); + } +} + +/* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then +** merge its doclist over *out (any duplicate doclists read from the +** segment rooted at pData will overwrite those in *out). +*/ +/* TODO(shess) Consider changing this to determine the depth of the +** leaves using either the first characters of interior nodes (when +** ==1, we're one level above the leaves), or the first character of +** the root (which will describe the height of the tree directly). +** Either feels somewhat tricky to me. +*/ +/* TODO(shess) The current merge is likely to be slow for large +** doclists (though it should process from newest/smallest to +** oldest/largest, so it may not be that bad). It might be useful to +** modify things to allow for N-way merging. This could either be +** within a segment, with pairwise merges across segments, or across +** all segments at once. +*/ +static int loadSegment(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 iLeavesEnd, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + DataBuffer result; + int rc; + + assert( nData>1 ); + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&result, 0); + rc = loadSegmentInt(v, pData, nData, iLeavesEnd, + pTerm, nTerm, isPrefix, &result); + if( rc==SQLITE_OK && result.nData>0 ){ + if( out->nData==0 ){ + DataBuffer tmp = *out; + *out = result; + result = tmp; + }else{ + DataBuffer merged; + DLReader readers[2]; + + dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); + dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData); + dataBufferInit(&merged, out->nData+result.nData); + docListMerge(&merged, readers, 2); + dataBufferDestroy(out); + *out = merged; + dlrDestroy(&readers[0]); + dlrDestroy(&readers[1]); + } + } + dataBufferDestroy(&result); + return rc; +} + +/* Scan the database and merge together the posting lists for the term +** into *out. +*/ +static int termSelect(fulltext_vtab *v, int iColumn, + const char *pTerm, int nTerm, int isPrefix, + DocListType iType, DataBuffer *out){ + DataBuffer doclist; + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&doclist, 0); + + /* Traverse the segments from oldest to newest so that newer doclist + ** elements for given docids overwrite older elements. + */ + while( (rc = sqlite3_step(s))==SQLITE_ROW ){ + const char *pData = sqlite3_column_blob(s, 0); + const int nData = sqlite3_column_bytes(s, 0); + const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); + rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix, + &doclist); + if( rc!=SQLITE_OK ) goto err; + } + if( rc==SQLITE_DONE ){ + if( doclist.nData!=0 ){ + /* TODO(shess) The old term_select_all() code applied the column + ** restrict as we merged segments, leading to smaller buffers. + ** This is probably worthwhile to bring back, once the new storage + ** system is checked in. + */ + if( iColumn==v->nColumn) iColumn = -1; + docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, + iColumn, iType, out); + } + rc = SQLITE_OK; + } + + err: + dataBufferDestroy(&doclist); + return rc; +} + +/****************************************************************/ +/* Used to hold hashtable data for sorting. */ +typedef struct TermData { + const char *pTerm; + int nTerm; + DLCollector *pCollector; +} TermData; + +/* Orders TermData elements in strcmp fashion ( <0 for less-than, 0 +** for equal, >0 for greater-than). +*/ +static int termDataCmp(const void *av, const void *bv){ + const TermData *a = (const TermData *)av; + const TermData *b = (const TermData *)bv; + int n = a->nTermnTerm ? a->nTerm : b->nTerm; + int c = memcmp(a->pTerm, b->pTerm, n); + if( c!=0 ) return c; + return a->nTerm-b->nTerm; +} + +/* Order pTerms data by term, then write a new level 0 segment using +** LeafWriter. +*/ +static int writeZeroSegment(fulltext_vtab *v, fts2Hash *pTerms){ + fts2HashElem *e; + int idx, rc, i, n; + TermData *pData; + LeafWriter writer; + DataBuffer dl; + + /* Determine the next index at level 0, merging as necessary. */ + rc = segdirNextIndex(v, 0, &idx); + if( rc!=SQLITE_OK ) return rc; + + n = fts2HashCount(pTerms); + pData = malloc(n*sizeof(TermData)); + + for(i = 0, e = fts2HashFirst(pTerms); e; i++, e = fts2HashNext(e)){ + assert( i1 ) qsort(pData, n, sizeof(*pData), termDataCmp); + + /* TODO(shess) Refactor so that we can write directly to the segment + ** DataBuffer, as happens for segment merges. + */ + leafWriterInit(0, idx, &writer); + dataBufferInit(&dl, 0); + for(i=0; inPendingData>=0 ){ + fts2HashElem *e; + for(e=fts2HashFirst(&v->pendingTerms); e; e=fts2HashNext(e)){ + dlcDelete(fts2HashData(e)); + } + fts2HashClear(&v->pendingTerms); + v->nPendingData = -1; + } + return SQLITE_OK; +} + +/* If pendingTerms has data, flush it to a level-zero segment, and +** free it. +*/ +static int flushPendingTerms(fulltext_vtab *v){ + if( v->nPendingData>=0 ){ + int rc = writeZeroSegment(v, &v->pendingTerms); + if( rc==SQLITE_OK ) clearPendingTerms(v); + return rc; + } + return SQLITE_OK; +} + +/* If pendingTerms is "too big", or docid is out of order, flush it. +** Regardless, be certain that pendingTerms is initialized for use. +*/ +static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){ + /* TODO(shess) Explore whether partially flushing the buffer on + ** forced-flush would provide better performance. I suspect that if + ** we ordered the doclists by size and flushed the largest until the + ** buffer was half empty, that would let the less frequent terms + ** generate longer doclists. + */ + if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){ + int rc = flushPendingTerms(v); + if( rc!=SQLITE_OK ) return rc; + } + if( v->nPendingData<0 ){ + fts2HashInit(&v->pendingTerms, FTS2_HASH_STRING, 1); + v->nPendingData = 0; + } + v->iPrevDocid = iDocid; + return SQLITE_OK; +} + +/* This function implements the xUpdate callback; it's the top-level entry + * point for inserting, deleting or updating a row in a full-text table. */ +static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, + sqlite_int64 *pRowid){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + int rc; + + TRACE(("FTS2 Update %p\n", pVtab)); + + if( nArg<2 ){ + rc = index_delete(v, sqlite3_value_int64(ppArg[0])); + } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ + /* An update: + * ppArg[0] = old rowid + * ppArg[1] = new rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + */ + sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); + if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || + sqlite3_value_int64(ppArg[1]) != rowid ){ + rc = SQLITE_ERROR; /* we don't allow changing the rowid */ + } else { + assert( nArg==2+v->nColumn+1); + rc = index_update(v, rowid, &ppArg[2]); + } + } else { + /* An insert: + * ppArg[1] = requested rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + */ + assert( nArg==2+v->nColumn+1); + rc = index_insert(v, ppArg[1], &ppArg[2], pRowid); + } + + return rc; +} + +static int fulltextSync(sqlite3_vtab *pVtab){ + TRACE(("FTS2 xSync()\n")); + return flushPendingTerms((fulltext_vtab *)pVtab); +} + +static int fulltextBegin(sqlite3_vtab *pVtab){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + TRACE(("FTS2 xBegin()\n")); + + /* Any buffered updates should have been cleared by the previous + ** transaction. + */ + assert( v->nPendingData<0 ); + return clearPendingTerms(v); +} + +static int fulltextCommit(sqlite3_vtab *pVtab){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + TRACE(("FTS2 xCommit()\n")); + + /* Buffered updates should have been cleared by fulltextSync(). */ + assert( v->nPendingData<0 ); + return clearPendingTerms(v); +} + +static int fulltextRollback(sqlite3_vtab *pVtab){ + TRACE(("FTS2 xRollback()\n")); + return clearPendingTerms((fulltext_vtab *)pVtab); +} + +/* +** Implementation of the snippet() function for FTS2 +*/ +static void snippetFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); + }else{ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + if( argc>=2 ){ + zStart = (const char*)sqlite3_value_text(argv[1]); + if( argc>=3 ){ + zEnd = (const char*)sqlite3_value_text(argv[2]); + if( argc>=4 ){ + zEllipsis = (const char*)sqlite3_value_text(argv[3]); + } + } + } + snippetAllOffsets(pCursor); + snippetText(pCursor, zStart, zEnd, zEllipsis); + sqlite3_result_text(pContext, pCursor->snippet.zSnippet, + pCursor->snippet.nSnippet, SQLITE_STATIC); + } +} + +/* +** Implementation of the offsets() function for FTS2 +*/ +static void snippetOffsetsFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to offsets",-1); + }else{ + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + snippetAllOffsets(pCursor); + snippetOffsetText(&pCursor->snippet); + sqlite3_result_text(pContext, + pCursor->snippet.zOffset, pCursor->snippet.nOffset, + SQLITE_STATIC); + } +} + +/* +** This routine implements the xFindFunction method for the FTS2 +** virtual table. +*/ +static int fulltextFindFunction( + sqlite3_vtab *pVtab, + int nArg, + const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg +){ + if( strcmp(zName,"snippet")==0 ){ + *pxFunc = snippetFunc; + return 1; + }else if( strcmp(zName,"offsets")==0 ){ + *pxFunc = snippetOffsetsFunc; + return 1; + } + return 0; +} + +/* +** Rename an fts2 table. +*/ +static int fulltextRename( + sqlite3_vtab *pVtab, + const char *zName +){ + fulltext_vtab *p = (fulltext_vtab *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + ); + if( zSql ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +static const sqlite3_module fts2Module = { + /* iVersion */ 0, + /* xCreate */ fulltextCreate, + /* xConnect */ fulltextConnect, + /* xBestIndex */ fulltextBestIndex, + /* xDisconnect */ fulltextDisconnect, + /* xDestroy */ fulltextDestroy, + /* xOpen */ fulltextOpen, + /* xClose */ fulltextClose, + /* xFilter */ fulltextFilter, + /* xNext */ fulltextNext, + /* xEof */ fulltextEof, + /* xColumn */ fulltextColumn, + /* xRowid */ fulltextRowid, + /* xUpdate */ fulltextUpdate, + /* xBegin */ fulltextBegin, + /* xSync */ fulltextSync, + /* xCommit */ fulltextCommit, + /* xRollback */ fulltextRollback, + /* xFindFunction */ fulltextFindFunction, + /* xRename */ fulltextRename, +}; + +static void hashDestroy(void *p){ + fts2Hash *pHash = (fts2Hash *)p; + sqlite3Fts2HashClear(pHash); + sqlite3_free(pHash); +} + +/* +** The fts2 built-in tokenizers - "simple" and "porter" - are implemented +** in files fts2_tokenizer1.c and fts2_porter.c respectively. The following +** two forward declarations are for functions declared in these files +** used to retrieve the respective implementations. +** +** Calling sqlite3Fts2SimpleTokenizerModule() sets the value pointed +** to by the argument to point a the "simple" tokenizer implementation. +** Function ...PorterTokenizerModule() sets *pModule to point to the +** porter tokenizer/stemmer implementation. +*/ +void sqlite3Fts2SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +void sqlite3Fts2PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); +void sqlite3Fts2IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +int sqlite3Fts2InitHashTable(sqlite3 *, fts2Hash *, const char *); + +/* +** Initialise the fts2 extension. If this extension is built as part +** of the sqlite library, then this function is called directly by +** SQLite. If fts2 is built as a dynamically loadable extension, this +** function is called by the sqlite3_extension_init() entry point. +*/ +int sqlite3Fts2Init(sqlite3 *db){ + int rc = SQLITE_OK; + fts2Hash *pHash = 0; + const sqlite3_tokenizer_module *pSimple = 0; + const sqlite3_tokenizer_module *pPorter = 0; + const sqlite3_tokenizer_module *pIcu = 0; + + sqlite3Fts2SimpleTokenizerModule(&pSimple); + sqlite3Fts2PorterTokenizerModule(&pPorter); +#ifdef SQLITE_ENABLE_ICU + sqlite3Fts2IcuTokenizerModule(&pIcu); +#endif + + /* Allocate and initialise the hash-table used to store tokenizers. */ + pHash = sqlite3_malloc(sizeof(fts2Hash)); + if( !pHash ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3Fts2HashInit(pHash, FTS2_HASH_STRING, 1); + } + + /* Load the built-in tokenizers into the hash table */ + if( rc==SQLITE_OK ){ + if( sqlite3Fts2HashInsert(pHash, "simple", 7, (void *)pSimple) + || sqlite3Fts2HashInsert(pHash, "porter", 7, (void *)pPorter) + || (pIcu && sqlite3Fts2HashInsert(pHash, "icu", 4, (void *)pIcu)) + ){ + rc = SQLITE_NOMEM; + } + } + + /* Create the virtual table wrapper around the hash-table and overload + ** the two scalar functions. If this is successful, register the + ** module with sqlite. + */ + if( SQLITE_OK==rc + && SQLITE_OK==(rc = sqlite3Fts2InitHashTable(db, pHash, "fts2_tokenizer")) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1)) + ){ + return sqlite3_create_module_v2( + db, "fts2", &fts2Module, (void *)pHash, hashDestroy + ); + } + + /* An error has occured. Delete the hash table and return the error code. */ + assert( rc!=SQLITE_OK ); + if( pHash ){ + sqlite3Fts2HashClear(pHash); + sqlite3_free(pHash); + } + return rc; +} + +#if !SQLITE_CORE +int sqlite3_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts2Init(db); +} +#endif + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h new file mode 100644 index 0000000000..4da4c3877b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h @@ -0,0 +1,26 @@ +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This header file is used by programs that want to link against the +** FTS2 library. All it does is declare the sqlite3Fts2Init() interface. +*/ +#include "sqlite3.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int sqlite3Fts2Init(sqlite3 *db); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c new file mode 100644 index 0000000000..fcd5cc2fd8 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c @@ -0,0 +1,369 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS2 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS2 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) + +#include +#include +#include + +#include "fts2_hash.h" + +static void *malloc_and_zero(int n){ + void *p = malloc(n); + if( p ){ + memset(p, 0, n); + } + return p; +} + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS2_HASH_BINARY or FTS2_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +void sqlite3Fts2HashInit(fts2Hash *pNew, int keyClass, int copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS2_HASH_STRING && keyClass<=FTS2_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; + pNew->xMalloc = malloc_and_zero; + pNew->xFree = free; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +void sqlite3Fts2HashClear(fts2Hash *pH){ + fts2HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + if( pH->ht ) pH->xFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + fts2HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + pH->xFree(elem->pKey); + } + pH->xFree(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS2_HASH_STRING +*/ +static int strHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + int h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return h & 0x7fffffff; +} +static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is FTS2_HASH_BINARY +*/ +static int binHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "hashFunction". The function takes a +** single parameter "keyClass". The return value of hashFunction() +** is a pointer to another function. Specifically, the return value +** of hashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*hashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS2_HASH_STRING ){ + return &strHash; + }else{ + assert( keyClass==FTS2_HASH_BINARY ); + return &binHash; + } +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS2_HASH_STRING ){ + return &strCompare; + }else{ + assert( keyClass==FTS2_HASH_BINARY ); + return &binCompare; + } +} + +/* Link an element into the hash table +*/ +static void insertElement( + fts2Hash *pH, /* The complete hash table */ + struct _fts2ht *pEntry, /* The entry into which pNew is inserted */ + fts2HashElem *pNew /* The element to be inserted */ +){ + fts2HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +*/ +static void rehash(fts2Hash *pH, int new_size){ + struct _fts2ht *new_ht; /* The new hash table */ + fts2HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts2ht *)pH->xMalloc( new_size*sizeof(struct _fts2ht) ); + if( new_ht==0 ) return; + if( pH->ht ) pH->xFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = hashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static fts2HashElem *findElementGivenHash( + const fts2Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + fts2HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _fts2ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = compareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + fts2Hash *pH, /* The pH containing "elem" */ + fts2HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts2ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + pH->xFree(elem->pKey); + } + pH->xFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts2HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +void *sqlite3Fts2HashFind(const fts2Hash *pH, const void *pKey, int nKey){ + int h; /* A hash on key */ + fts2HashElem *elem; /* The element that matches key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); + return elem ? elem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +void *sqlite3Fts2HashInsert( + fts2Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + fts2HashElem *elem; /* Used to loop thru the element list */ + fts2HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = findElementGivenHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (fts2HashElem*)pH->xMalloc( sizeof(fts2HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = pH->xMalloc( nKey ); + if( new_elem->pKey==0 ){ + pH->xFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + if( pH->htsize==0 ){ + rehash(pH,8); + if( pH->htsize==0 ){ + pH->count = 0; + pH->xFree(new_elem); + return data; + } + } + if( pH->count > pH->htsize ){ + rehash(pH,pH->htsize*2); + } + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + insertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h new file mode 100644 index 0000000000..97f35291cb --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h @@ -0,0 +1,112 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS2_HASH_H_ +#define _FTS2_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct fts2Hash fts2Hash; +typedef struct fts2HashElem fts2HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct fts2Hash { + char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + fts2HashElem *first; /* The first element of the array */ + void *(*xMalloc)(int); /* malloc() function to use */ + void (*xFree)(void *); /* free() function to use */ + int htsize; /* Number of buckets in the hash table */ + struct _fts2ht { /* the hash table */ + int count; /* Number of entries with this hash */ + fts2HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct fts2HashElem { + fts2HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS2_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS2_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts2HashInit is 1. +*/ +#define FTS2_HASH_STRING 1 +#define FTS2_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +void sqlite3Fts2HashInit(fts2Hash*, int keytype, int copyKey); +void *sqlite3Fts2HashInsert(fts2Hash*, const void *pKey, int nKey, void *pData); +void *sqlite3Fts2HashFind(const fts2Hash*, const void *pKey, int nKey); +void sqlite3Fts2HashClear(fts2Hash*); + +/* +** Shorthand for the functions above +*/ +#define fts2HashInit sqlite3Fts2HashInit +#define fts2HashInsert sqlite3Fts2HashInsert +#define fts2HashFind sqlite3Fts2HashFind +#define fts2HashClear sqlite3Fts2HashClear + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** fts2Hash h; +** fts2HashElem *p; +** ... +** for(p=fts2HashFirst(&h); p; p=fts2HashNext(p)){ +** SomeStructure *pData = fts2HashData(p); +** // do something with pData +** } +*/ +#define fts2HashFirst(H) ((H)->first) +#define fts2HashNext(E) ((E)->next) +#define fts2HashData(E) ((E)->data) +#define fts2HashKey(E) ((E)->pKey) +#define fts2HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts2HashCount(H) ((H)->count) + +#endif /* _FTS2_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c new file mode 100644 index 0000000000..ed15f333d6 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c @@ -0,0 +1,257 @@ +/* +** 2007 June 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file implements a tokenizer for fts2 based on the ICU library. +** +** $Id: fts2_icu.c,v 1.1 2007/06/22 15:21:16 danielk1977 Exp $ +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) +#ifdef SQLITE_ENABLE_ICU + +#include +#include +#include "fts2_tokenizer.h" + +#include +#include +#include +#include + +typedef struct IcuTokenizer IcuTokenizer; +typedef struct IcuCursor IcuCursor; + +struct IcuTokenizer { + sqlite3_tokenizer base; + char *zLocale; +}; + +struct IcuCursor { + sqlite3_tokenizer_cursor base; + + UBreakIterator *pIter; /* ICU break-iterator object */ + int nChar; /* Number of UChar elements in pInput */ + UChar *aChar; /* Copy of input using utf-16 encoding */ + int *aOffset; /* Offsets of each character in utf-8 input */ + + int nBuffer; + char *zBuffer; + + int iToken; +}; + +/* +** Create a new tokenizer instance. +*/ +static int icuCreate( + int argc, /* Number of entries in argv[] */ + const char * const *argv, /* Tokenizer creation arguments */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ +){ + IcuTokenizer *p; + int n = 0; + + if( argc>0 ){ + n = strlen(argv[0])+1; + } + p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + if( !p ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(IcuTokenizer)); + + if( n ){ + p->zLocale = (char *)&p[1]; + memcpy(p->zLocale, argv[0], n); + } + + *ppTokenizer = (sqlite3_tokenizer *)p; + + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int icuDestroy(sqlite3_tokenizer *pTokenizer){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int icuOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, /* Input string */ + int nInput, /* Length of zInput in bytes */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + IcuCursor *pCsr; + + const int32_t opt = U_FOLD_CASE_DEFAULT; + UErrorCode status = U_ZERO_ERROR; + int nChar; + + UChar32 c; + int iInput = 0; + int iOut = 0; + + *ppCursor = 0; + + nChar = nInput+1; + pCsr = (IcuCursor *)sqlite3_malloc( + sizeof(IcuCursor) + /* IcuCursor */ + nChar * sizeof(UChar) + /* IcuCursor.aChar[] */ + (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ + ); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(IcuCursor)); + pCsr->aChar = (UChar *)&pCsr[1]; + pCsr->aOffset = (int *)&pCsr->aChar[nChar]; + + pCsr->aOffset[iOut] = iInput; + U8_NEXT(zInput, iInput, nInput, c); + while( c>0 ){ + int isError = 0; + c = u_foldCase(c, opt); + U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); + if( isError ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->aOffset[iOut] = iInput; + + if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); + if( !U_SUCCESS(status) ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->nChar = iOut; + + ubrk_first(pCsr->pIter); + *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to icuOpen(). +*/ +static int icuClose(sqlite3_tokenizer_cursor *pCursor){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + ubrk_close(pCsr->pIter); + sqlite3_free(pCsr->zBuffer); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. +*/ +static int icuNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + + int iStart = 0; + int iEnd = 0; + int nByte = 0; + + while( iStart==iEnd ){ + UChar32 c; + + iStart = ubrk_current(pCsr->pIter); + iEnd = ubrk_next(pCsr->pIter); + if( iEnd==UBRK_DONE ){ + return SQLITE_DONE; + } + + while( iStartaChar, iWhite, pCsr->nChar, c); + if( u_isspace(c) ){ + iStart = iWhite; + }else{ + break; + } + } + assert(iStart<=iEnd); + } + + do { + UErrorCode status = U_ZERO_ERROR; + if( nByte ){ + char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); + if( !zNew ){ + return SQLITE_NOMEM; + } + pCsr->zBuffer = zNew; + pCsr->nBuffer = nByte; + } + + u_strToUTF8( + pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ + &status /* Output success/failure */ + ); + } while( nByte>pCsr->nBuffer ); + + *ppToken = pCsr->zBuffer; + *pnBytes = nByte; + *piStartOffset = pCsr->aOffset[iStart]; + *piEndOffset = pCsr->aOffset[iEnd]; + *piPosition = pCsr->iToken++; + + return SQLITE_OK; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module icuTokenizerModule = { + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ +}; + +/* +** Set *ppModule to point at the implementation of the ICU tokenizer. +*/ +void sqlite3Fts2IcuTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &icuTokenizerModule; +} + +#endif /* defined(SQLITE_ENABLE_ICU) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c new file mode 100644 index 0000000000..dab1849531 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c @@ -0,0 +1,642 @@ +/* +** 2006 September 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS2 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS2 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) + + +#include +#include +#include +#include +#include + +#include "fts2_tokenizer.h" + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlit3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module porterTokenizerModule; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + t = (porter_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; + + c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + free(c->zToken); + free(c); + return SQLITE_OK; +} +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; + +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); +} +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); +} + +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. +** +** In this routine z[] is in reverse order. So we are really looking +** for an instance of of a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; +} + +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 +*/ +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. +*/ +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); +} + +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. +*/ +static int star_oh(const char *z){ + return + z[0]!=0 && isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + z[1]!=0 && isVowel(z+1) && + z[2]!=0 && isConsonant(z+2); +} + +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. +*/ +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); + } + *pz = z; + return 1; +} + +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. +*/ +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; + }else{ + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + } + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; + + + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } + + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } + + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + stem(&z, "lanoita", "ate", m_gt_0) || + stem(&z, "lanoit", "tion", m_gt_0); + break; + case 'c': + stem(&z, "icne", "ence", m_gt_0) || + stem(&z, "icna", "ance", m_gt_0); + break; + case 'e': + stem(&z, "rezi", "ize", m_gt_0); + break; + case 'g': + stem(&z, "igol", "log", m_gt_0); + break; + case 'l': + stem(&z, "ilb", "ble", m_gt_0) || + stem(&z, "illa", "al", m_gt_0) || + stem(&z, "iltne", "ent", m_gt_0) || + stem(&z, "ile", "e", m_gt_0) || + stem(&z, "ilsuo", "ous", m_gt_0); + break; + case 'o': + stem(&z, "noitazi", "ize", m_gt_0) || + stem(&z, "noita", "ate", m_gt_0) || + stem(&z, "rota", "ate", m_gt_0); + break; + case 's': + stem(&z, "msila", "al", m_gt_0) || + stem(&z, "ssenevi", "ive", m_gt_0) || + stem(&z, "ssenluf", "ful", m_gt_0) || + stem(&z, "ssensuo", "ous", m_gt_0); + break; + case 't': + stem(&z, "itila", "al", m_gt_0) || + stem(&z, "itivi", "ive", m_gt_0) || + stem(&z, "itilib", "ble", m_gt_0); + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + stem(&z, "etaci", "ic", m_gt_0) || + stem(&z, "evita", "", m_gt_0) || + stem(&z, "ezila", "al", m_gt_0); + break; + case 'i': + stem(&z, "itici", "ic", m_gt_0); + break; + case 'l': + stem(&z, "laci", "ic", m_gt_0) || + stem(&z, "luf", "", m_gt_0); + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + stem(&z, "tneme", "", m_gt_1) || + stem(&z, "tnem", "", m_gt_1) || + stem(&z, "tne", "", m_gt_1); + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + stem(&z, "eta", "", m_gt_1) || + stem(&z, "iti", "", m_gt_1); + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } + + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** Characters that can be part of a token. We assume any character +** whose value is greater than 0x80 (any UTF character) can be +** part of a token. In other words, delimiters all must have +** values of 0x7f or lower. +*/ +static const char porterIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +static int porterNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ + const char **pzToken, /* OUT: *pzToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + const char *z = c->zInput; + + while( c->iOffsetnInput ){ + int iStartOffset, ch; + + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + c->nAllocated = n+20; + c->zToken = realloc(c->zToken, c->nAllocated); + if( c->zToken==NULL ) return SQLITE_NOMEM; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the porter-stemmer tokenizer +*/ +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, +}; + +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts2PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c new file mode 100644 index 0000000000..cbf771b47f --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c @@ -0,0 +1,371 @@ +/* +** 2007 June 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is part of an SQLite module implementing full-text search. +** This particular file implements the generic tokenizer interface. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS2 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS2 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) + + +#include "sqlite3.h" +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + +#include "fts2_hash.h" +#include "fts2_tokenizer.h" +#include + +/* +** Implementation of the SQL scalar function for accessing the underlying +** hash table. This function may be called as follows: +** +** SELECT (); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts2InitHashTable() function (e.g. 'fts2_tokenizer'). +** +** If the argument is specified, it must be a blob value +** containing a pointer to be stored as the hash data corresponding +** to the string . If is not specified, then +** the string must already exist in the has table. Otherwise, +** an error is returned. +** +** Whether or not the argument is specified, the value returned +** is a blob containing the pointer stored as the hash data corresponding +** to string (after the hash-table is updated, if applicable). +*/ +static void scalarFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts2Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; + + assert( argc==1 || argc==2 ); + + pHash = (fts2Hash *)sqlite3_user_data(context); + + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; + + if( argc==2 ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts2HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + return; + } + }else{ + pPtr = sqlite3Fts2HashFind(pHash, zName, nName); + if( !pPtr ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + } + + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); +} + +#ifdef SQLITE_TEST + +#include +#include + +/* +** Implementation of a special SQL scalar function for testing tokenizers +** designed to be used in concert with the Tcl testing framework. This +** function must be called with two arguments: +** +** SELECT (, ); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts2InitHashTable() function (e.g. 'fts2_tokenizer') +** concatenated with the string '_test' (e.g. 'fts2_tokenizer_test'). +** +** The return value is a string that may be interpreted as a Tcl +** list. For each token in the , three elements are +** added to the returned list. The first is the token position, the +** second is the token text (folded, stemmed, etc.) and the third is the +** substring of associated with the token. For example, +** using the built-in "simple" tokenizer: +** +** SELECT fts_tokenizer_test('simple', 'I don't see how'); +** +** will return the string: +** +** "{0 i I 1 dont don't 2 see see 3 how how}" +** +*/ +static void testFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts2Hash *pHash; + sqlite3_tokenizer_module *p; + sqlite3_tokenizer *pTokenizer = 0; + sqlite3_tokenizer_cursor *pCsr = 0; + + const char *zErr = 0; + + const char *zName; + int nName; + const char *zInput; + int nInput; + + const char *zArg = 0; + + const char *zToken; + int nToken; + int iStart; + int iEnd; + int iPos; + + Tcl_Obj *pRet; + + assert( argc==2 || argc==3 ); + + nName = sqlite3_value_bytes(argv[0]); + zName = (const char *)sqlite3_value_text(argv[0]); + nInput = sqlite3_value_bytes(argv[argc-1]); + zInput = (const char *)sqlite3_value_text(argv[argc-1]); + + if( argc==3 ){ + zArg = (const char *)sqlite3_value_text(argv[1]); + } + + pHash = (fts2Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts2HashFind(pHash, zName, nName+1); + + if( !p ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + + if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; + } + pTokenizer->pModule = p; + if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + pCsr->pTokenizer = pTokenizer; + + while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + zToken = &zInput[iStart]; + nToken = iEnd-iStart; + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + } + + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; + } + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; + } + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); +} + +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts2_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); +} + +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts2_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +void sqlite3Fts2SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +/* +** Implementation of the scalar function fts2_tokenizer_internal_test(). +** This function is used for testing only, it is not included in the +** build unless SQLITE_TEST is defined. +** +** The purpose of this is to test that the fts2_tokenizer() function +** can be used as designed by the C-code in the queryTokenizer and +** registerTokenizer() functions above. These two functions are repeated +** in the README.tokenizer file as an example, so it is important to +** test them. +** +** To run the tests, evaluate the fts2_tokenizer_internal_test() scalar +** function with no arguments. An assert() will fail if a problem is +** detected. i.e.: +** +** SELECT fts2_tokenizer_internal_test(); +** +*/ +static void intTestFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + + /* Test the query function */ + sqlite3Fts2SimpleTokenizerModule(&p1); + rc = queryTokenizer(db, "simple", &p2); + assert( rc==SQLITE_OK ); + assert( p1==p2 ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_ERROR ); + assert( p2==0 ); + assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); + + /* Test the storage function */ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + + sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); +} + +#endif + +/* +** Set up SQL objects in database db used to access the contents of +** the hash table pointed to by argument pHash. The hash table must +** been initialised to use string keys, and to take a private copy +** of the key when a value is inserted. i.e. by a call similar to: +** +** sqlite3Fts2HashInit(pHash, FTS2_HASH_STRING, 1); +** +** This function adds a scalar function (see header comment above +** scalarFunc() in this file for details) and, if ENABLE_TABLE is +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both +** provide read/write access to the contents of *pHash. +** +** The third argument to this function, zName, is used as the name +** of both the scalar and, if created, the virtual table. +*/ +int sqlite3Fts2InitHashTable( + sqlite3 *db, + fts2Hash *pHash, + const char *zName +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_ANY; + char *zTest = 0; + char *zTest2 = 0; + +#ifdef SQLITE_TEST + void *pdb = (void *)db; + zTest = sqlite3_mprintf("%s_test", zName); + zTest2 = sqlite3_mprintf("%s_internal_test", zName); + if( !zTest || !zTest2 ){ + rc = SQLITE_NOMEM; + } +#endif + + if( rc!=SQLITE_OK + || (rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) +#ifdef SQLITE_TEST + || (rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) +#endif + ); + + sqlite3_free(zTest); + sqlite3_free(zTest2); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h new file mode 100644 index 0000000000..8c256b2bed --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h @@ -0,0 +1,145 @@ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS2_TOKENIZER_H_ +#define _FTS2_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +#include "sqlite3.h" + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts2 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts2 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts2 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts2( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialised by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts2 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts2 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +#endif /* _FTS2_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c new file mode 100644 index 0000000000..540ba27def --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c @@ -0,0 +1,229 @@ +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Implementation of the "simple" full-text-search tokenizer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS2 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS2 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) + + +#include +#include +#include +#include +#include + +#include "fts2_tokenizer.h" + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module simpleTokenizerModule; + +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = strlen(argv[1]); + for(i=0; i=0x80 ){ + free(t); + return SQLITE_ERROR; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !isalnum(i); + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; + + c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + free(c->pToken); + free(c); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + c->nTokenAllocated = n+20; + c->pToken = realloc(c->pToken, c->nTokenAllocated); + if( c->pToken==NULL ) return SQLITE_NOMEM; + } + for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, +}; + +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts2SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl new file mode 100644 index 0000000000..5c8d1e93d7 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl @@ -0,0 +1,116 @@ +#!/usr/bin/tclsh +# +# This script builds a single C code file holding all of FTS2 code. +# The name of the output file is fts2amal.c. To build this file, +# first do: +# +# make target_source +# +# The make target above moves all of the source code files into +# a subdirectory named "tsrc". (This script expects to find the files +# there and will not work if they are not found.) +# +# After the "tsrc" directory has been created and populated, run +# this script: +# +# tclsh mkfts2amal.tcl +# +# The amalgamated FTS2 code will be written into fts2amal.c +# + +# Open the output file and write a header comment at the beginning +# of the file. +# +set out [open fts2amal.c w] +set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] +puts $out [subst \ +{/****************************************************************************** +** This file is an amalgamation of separate C source files from the SQLite +** Full Text Search extension 2 (fts2). By combining all the individual C +** code files into this single large file, the entire code can be compiled +** as a one translation unit. This allows many compilers to do optimizations +** that would not be possible if the files were compiled separately. It also +** makes the code easier to import into other projects. +** +** This amalgamation was generated on $today. +*/}] + +# These are the header files used by FTS2. The first time any of these +# files are seen in a #include statement in the C code, include the complete +# text of the file in-line. The file only needs to be included once. +# +foreach hdr { + fts2.h + fts2_hash.h + fts2_tokenizer.h + sqlite3.h + sqlite3ext.h +} { + set available_hdr($hdr) 1 +} + +# 78 stars used for comment formatting. +set s78 \ +{*****************************************************************************} + +# Insert a comment into the code +# +proc section_comment {text} { + global out s78 + set n [string length $text] + set nstar [expr {60 - $n}] + set stars [string range $s78 0 $nstar] + puts $out "/************** $text $stars/" +} + +# Read the source file named $filename and write it into the +# sqlite3.c output file. If any #include statements are seen, +# process them approprately. +# +proc copy_file {filename} { + global seen_hdr available_hdr out + set tail [file tail $filename] + section_comment "Begin file $tail" + set in [open $filename r] + while {![eof $in]} { + set line [gets $in] + if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} { + if {[info exists available_hdr($hdr)]} { + if {$available_hdr($hdr)} { + section_comment "Include $hdr in the middle of $tail" + copy_file tsrc/$hdr + section_comment "Continuing where we left off in $tail" + } + } elseif {![info exists seen_hdr($hdr)]} { + set seen_hdr($hdr) 1 + puts $out $line + } + } elseif {[regexp {^#ifdef __cplusplus} $line]} { + puts $out "#if 0" + } elseif {[regexp {^#line} $line]} { + # Skip #line directives. + } else { + puts $out $line + } + } + close $in + section_comment "End of $tail" +} + + +# Process the source files. Process files containing commonly +# used subroutines first in order to help the compiler find +# inlining opportunities. +# +foreach file { + fts2.c + fts2_hash.c + fts2_porter.c + fts2_tokenizer.c + fts2_tokenizer1.c + fts2_icu.c +} { + copy_file tsrc/$file +} + +close $out diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers new file mode 100644 index 0000000000..f214b24552 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers @@ -0,0 +1,134 @@ + +1. FTS3 Tokenizers + + When creating a new full-text table, FTS3 allows the user to select + the text tokenizer implementation to be used when indexing text + by specifying a "tokenizer" clause as part of the CREATE VIRTUAL TABLE + statement: + + CREATE VIRTUAL TABLE USING fts3( + [, tokenizer []] + ); + + The built-in tokenizers (valid values to pass as ) are + "simple" and "porter". + + should consist of zero or more white-space separated + arguments to pass to the selected tokenizer implementation. The + interpretation of the arguments, if any, depends on the individual + tokenizer. + +2. Custom Tokenizers + + FTS3 allows users to provide custom tokenizer implementations. The + interface used to create a new tokenizer is defined and described in + the fts3_tokenizer.h source file. + + Registering a new FTS3 tokenizer is similar to registering a new + virtual table module with SQLite. The user passes a pointer to a + structure containing pointers to various callback functions that + make up the implementation of the new tokenizer type. For tokenizers, + the structure (defined in fts3_tokenizer.h) is called + "sqlite3_tokenizer_module". + + FTS3 does not expose a C-function that users call to register new + tokenizer types with a database handle. Instead, the pointer must + be encoded as an SQL blob value and passed to FTS3 through the SQL + engine by evaluating a special scalar function, "fts3_tokenizer()". + The fts3_tokenizer() function may be called with one or two arguments, + as follows: + + SELECT fts3_tokenizer(); + SELECT fts3_tokenizer(, ); + + Where is a string identifying the tokenizer and + is a pointer to an sqlite3_tokenizer_module + structure encoded as an SQL blob. If the second argument is present, + it is registered as tokenizer and a copy of it + returned. If only one argument is passed, a pointer to the tokenizer + implementation currently registered as is returned, + encoded as a blob. Or, if no such tokenizer exists, an SQL exception + (error) is raised. + + SECURITY: If the fts3 extension is used in an environment where potentially + malicious users may execute arbitrary SQL (i.e. gears), they should be + prevented from invoking the fts3_tokenizer() function, possibly using the + authorisation callback. + + See "Sample code" below for an example of calling the fts3_tokenizer() + function from C code. + +3. ICU Library Tokenizers + + If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor + symbol defined, then there exists a built-in tokenizer named "icu" + implemented using the ICU library. The first argument passed to the + xCreate() method (see fts3_tokenizer.h) of this tokenizer may be + an ICU locale identifier. For example "tr_TR" for Turkish as used + in Turkey, or "en_AU" for English as used in Australia. For example: + + "CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenizer icu th_TH)" + + The ICU tokenizer implementation is very simple. It splits the input + text according to the ICU rules for finding word boundaries and discards + any tokens that consist entirely of white-space. This may be suitable + for some applications in some locales, but not all. If more complex + processing is required, for example to implement stemming or + discard punctuation, this can be done by creating a tokenizer + implementation that uses the ICU tokenizer as part of it's implementation. + + When using the ICU tokenizer this way, it is safe to overwrite the + contents of the strings returned by the xNext() method (see + fts3_tokenizer.h). + +4. Sample code. + + The following two code samples illustrate the way C code should invoke + the fts3_tokenizer() scalar function: + + int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p + ){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); + } + + int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp + ){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); + } + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt new file mode 100644 index 0000000000..517a2a0434 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt @@ -0,0 +1,4 @@ +This folder contains source code to the second full-text search +extension for SQLite. While the API is the same, this version uses a +substantially different storage schema from fts1, so tables will need +to be rebuilt. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c new file mode 100644 index 0000000000..b39291975a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c @@ -0,0 +1,5971 @@ +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is an SQLite module implementing full-text search. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ + +/* TODO(shess) Consider exporting this comment to an HTML file or the +** wiki. +*/ +/* The full-text index is stored in a series of b+tree (-like) +** structures called segments which map terms to doclists. The +** structures are like b+trees in layout, but are constructed from the +** bottom up in optimal fashion and are not updatable. Since trees +** are built from the bottom up, things will be described from the +** bottom up. +** +** +**** Varints **** +** The basic unit of encoding is a variable-length integer called a +** varint. We encode variable-length integers in little-endian order +** using seven bits * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +** +** This is identical to how sqlite encodes varints (see util.c). +** +** +**** Document lists **** +** A doclist (document list) holds a docid-sorted list of hits for a +** given term. Doclists hold docids, and can optionally associate +** token positions and offsets with docids. +** +** A DL_POSITIONS_OFFSETS doclist is stored like this: +** +** array { +** varint docid; +** array { (position list for column 0) +** varint position; (delta from previous position plus POS_BASE) +** varint startOffset; (delta from previous startOffset) +** varint endOffset; (delta from startOffset) +** } +** array { +** varint POS_COLUMN; (marks start of position list for new column) +** varint column; (index of new column) +** array { +** varint position; (delta from previous position plus POS_BASE) +** varint startOffset;(delta from previous startOffset) +** varint endOffset; (delta from startOffset) +** } +** } +** varint POS_END; (marks end of positions for this document. +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. A "position" is an index of a token in the token stream +** generated by the tokenizer, while an "offset" is a byte offset, +** both based at 0. Note that POS_END and POS_COLUMN occur in the +** same logical place as the position element, and act as sentinals +** ending a position list array. +** +** A DL_POSITIONS doclist omits the startOffset and endOffset +** information. A DL_DOCIDS doclist omits both the position and +** offset information, becoming an array of varint-encoded docids. +** +** On-disk data is stored as type DL_DEFAULT, so we don't serialize +** the type. Due to how deletion is implemented in the segmentation +** system, on-disk doclists MUST store at least positions. +** +** +**** Segment leaf nodes **** +** Segment leaf nodes store terms and doclists, ordered by term. Leaf +** nodes are written using LeafWriter, and read using LeafReader (to +** iterate through a single leaf node's data) and LeavesReader (to +** iterate through a segment's entire leaf layer). Leaf nodes have +** the format: +** +** varint iHeight; (height from leaf level, always 0) +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of prefix shared with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix];(unshared suffix of next term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. +** +** Leaf nodes are broken into blocks which are stored contiguously in +** the %_segments table in sorted order. This means that when the end +** of a node is reached, the next term is in the node with the next +** greater node id. +** +** New data is spilled to a new leaf node when the current node +** exceeds LEAF_MAX bytes (default 2048). New data which itself is +** larger than STANDALONE_MIN (default 1024) is placed in a standalone +** node (a leaf node with a single term and doclist). The goal of +** these settings is to pack together groups of small doclists while +** making it efficient to directly access large doclists. The +** assumption is that large doclists represent terms which are more +** likely to be query targets. +** +** TODO(shess) It may be useful for blocking decisions to be more +** dynamic. For instance, it may make more sense to have a 2.5k leaf +** node rather than splitting into 2k and .5k nodes. My intuition is +** that this might extend through 2x or 4x the pagesize. +** +** +**** Segment interior nodes **** +** Segment interior nodes store blockids for subtree nodes and terms +** to describe what data is stored by the each subtree. Interior +** nodes are written using InteriorWriter, and read using +** InteriorReader. InteriorWriters are created as needed when +** SegmentWriter creates new leaf nodes, or when an interior node +** itself grows too big and must be split. The format of interior +** nodes: +** +** varint iHeight; (height from leaf level, always >0) +** varint iBlockid; (block id of node's leftmost subtree) +** optional { +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of shared prefix with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix]; (unshared suffix of next term) +** } +** } +** +** Here, optional { X } means an optional element, while array { X } +** means zero or more occurrences of X, adjacent in memory. +** +** An interior node encodes n terms separating n+1 subtrees. The +** subtree blocks are contiguous, so only the first subtree's blockid +** is encoded. The subtree at iBlockid will contain all terms less +** than the first term encoded (or all terms if no term is encoded). +** Otherwise, for terms greater than or equal to pTerm[i] but less +** than pTerm[i+1], the subtree for that term will be rooted at +** iBlockid+i. Interior nodes only store enough term data to +** distinguish adjacent children (if the rightmost term of the left +** child is "something", and the leftmost term of the right child is +** "wicked", only "w" is stored). +** +** New data is spilled to a new interior node at the same height when +** the current node exceeds INTERIOR_MAX bytes (default 2048). +** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing +** interior nodes and making the tree too skinny. The interior nodes +** at a given height are naturally tracked by interior nodes at +** height+1, and so on. +** +** +**** Segment directory **** +** The segment directory in table %_segdir stores meta-information for +** merging and deleting segments, and also the root node of the +** segment's tree. +** +** The root node is the top node of the segment's tree after encoding +** the entire segment, restricted to ROOT_MAX bytes (default 1024). +** This could be either a leaf node or an interior node. If the top +** node requires more than ROOT_MAX bytes, it is flushed to %_segments +** and a new root interior node is generated (which should always fit +** within ROOT_MAX because it only needs space for 2 varints, the +** height and the blockid of the previous root). +** +** The meta-information in the segment directory is: +** level - segment level (see below) +** idx - index within level +** - (level,idx uniquely identify a segment) +** start_block - first leaf node +** leaves_end_block - last leaf node +** end_block - last block (including interior nodes) +** root - contents of root node +** +** If the root node is a leaf node, then start_block, +** leaves_end_block, and end_block are all 0. +** +** +**** Segment merging **** +** To amortize update costs, segments are groups into levels and +** merged in matches. Each increase in level represents exponentially +** more documents. +** +** New documents (actually, document updates) are tokenized and +** written individually (using LeafWriter) to a level 0 segment, with +** incrementing idx. When idx reaches MERGE_COUNT (default 16), all +** level 0 segments are merged into a single level 1 segment. Level 1 +** is populated like level 0, and eventually MERGE_COUNT level 1 +** segments are merged to a single level 2 segment (representing +** MERGE_COUNT^2 updates), and so on. +** +** A segment merge traverses all segments at a given level in +** parallel, performing a straightforward sorted merge. Since segment +** leaf nodes are written in to the %_segments table in order, this +** merge traverses the underlying sqlite disk structures efficiently. +** After the merge, all segment blocks from the merged level are +** deleted. +** +** MERGE_COUNT controls how often we merge segments. 16 seems to be +** somewhat of a sweet spot for insertion performance. 32 and 64 show +** very similar performance numbers to 16 on insertion, though they're +** a tiny bit slower (perhaps due to more overhead in merge-time +** sorting). 8 is about 20% slower than 16, 4 about 50% slower than +** 16, 2 about 66% slower than 16. +** +** At query time, high MERGE_COUNT increases the number of segments +** which need to be scanned and merged. For instance, with 100k docs +** inserted: +** +** MERGE_COUNT segments +** 16 25 +** 8 12 +** 4 10 +** 2 6 +** +** This appears to have only a moderate impact on queries for very +** frequent terms (which are somewhat dominated by segment merge +** costs), and infrequent and non-existent terms still seem to be fast +** even with many segments. +** +** TODO(shess) That said, it would be nice to have a better query-side +** argument for MERGE_COUNT of 16. Also, it's possible/likely that +** optimizations to things like doclist merging will swing the sweet +** spot around. +** +** +** +**** Handling of deletions and updates **** +** Since we're using a segmented structure, with no docid-oriented +** index into the term index, we clearly cannot simply update the term +** index when a document is deleted or updated. For deletions, we +** write an empty doclist (varint(docid) varint(POS_END)), for updates +** we simply write the new doclist. Segment merges overwrite older +** data for a particular docid with newer data, so deletes or updates +** will eventually overtake the earlier data and knock it out. The +** query logic likewise merges doclists so that newer data knocks out +** older data. +** +** TODO(shess) Provide a VACUUM type operation to clear out all +** deletions and duplications. This would basically be a forced merge +** into a single segment. +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +#if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +#include +#include +#include +#include +#include + +#include "fts3.h" +#include "fts3_hash.h" +#include "fts3_tokenizer.h" +#include "sqlite3.h" +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + + +/* TODO(shess) MAN, this thing needs some refactoring. At minimum, it +** would be nice to order the file better, perhaps something along the +** lines of: +** +** - utility functions +** - table setup functions +** - table update functions +** - table query functions +** +** Put the query functions last because they're likely to reference +** typedefs or functions from the table update section. +*/ + +#if 0 +# define TRACE(A) printf A; fflush(stdout) +#else +# define TRACE(A) +#endif + +/* It is not safe to call isspace(), tolower(), or isalnum() on +** hi-bit-set characters. This is the same solution used in the +** tokenizer. +*/ +/* TODO(shess) The snippet-generation code should be using the +** tokenizer-generated tokens rather than doing its own local +** tokenization. +*/ +/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ +static int safe_isspace(char c){ + return (c&0x80)==0 ? isspace(c) : 0; +} +static int safe_tolower(char c){ + return (c&0x80)==0 ? tolower(c) : c; +} +static int safe_isalnum(char c){ + return (c&0x80)==0 ? isalnum(c) : 0; +} + +typedef enum DocListType { + DL_DOCIDS, /* docids only */ + DL_POSITIONS, /* docids + positions */ + DL_POSITIONS_OFFSETS /* docids + positions + offsets */ +} DocListType; + +/* +** By default, only positions and not offsets are stored in the doclists. +** To change this so that offsets are stored too, compile with +** +** -DDL_DEFAULT=DL_POSITIONS_OFFSETS +** +** If DL_DEFAULT is set to DL_DOCIDS, your table can only be inserted +** into (no deletes or updates). +*/ +#ifndef DL_DEFAULT +# define DL_DEFAULT DL_POSITIONS +#endif + +enum { + POS_END = 0, /* end of this position list */ + POS_COLUMN, /* followed by new column number */ + POS_BASE +}; + +/* MERGE_COUNT controls how often we merge segments (see comment at +** top of file). +*/ +#define MERGE_COUNT 16 + +/* utility functions */ + +/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single +** record to prevent errors of the form: +** +** my_function(SomeType *b){ +** memset(b, '\0', sizeof(b)); // sizeof(b)!=sizeof(*b) +** } +*/ +/* TODO(shess) Obvious candidates for a header file. */ +#define CLEAR(b) memset(b, '\0', sizeof(*(b))) + +#ifndef NDEBUG +# define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b))) +#else +# define SCRAMBLE(b) +#endif + +/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ +#define VARINT_MAX 10 + +/* Write a 64-bit variable-length integer to memory starting at p[0]. + * The length of data written will be between 1 and VARINT_MAX bytes. + * The number of bytes written is returned. */ +static int putVarint(char *p, sqlite_int64 v){ + unsigned char *q = (unsigned char *) p; + sqlite_uint64 vu = v; + do{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +/* Read a 64-bit variable-length integer from memory starting at p[0]. + * Return the number of bytes read, or 0 on error. + * The value is stored in *v. */ +static int getVarint(const char *p, sqlite_int64 *v){ + const unsigned char *q = (const unsigned char *) p; + sqlite_uint64 x = 0, y = 1; + while( (*q & 0x80) == 0x80 ){ + x += y * (*q++ & 0x7f); + y <<= 7; + if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ + assert( 0 ); + return 0; + } + } + x += y * (*q++); + *v = (sqlite_int64) x; + return (int) (q - (unsigned char *)p); +} + +static int getVarint32(const char *p, int *pi){ + sqlite_int64 i; + int ret = getVarint(p, &i); + *pi = (int) i; + assert( *pi==i ); + return ret; +} + +/*******************************************************************/ +/* DataBuffer is used to collect data into a buffer in piecemeal +** fashion. It implements the usual distinction between amount of +** data currently stored (nData) and buffer capacity (nCapacity). +** +** dataBufferInit - create a buffer with given initial capacity. +** dataBufferReset - forget buffer's data, retaining capacity. +** dataBufferDestroy - free buffer's data. +** dataBufferExpand - expand capacity without adding data. +** dataBufferAppend - append data. +** dataBufferAppend2 - append two pieces of data at once. +** dataBufferReplace - replace buffer's data. +*/ +typedef struct DataBuffer { + char *pData; /* Pointer to malloc'ed buffer. */ + int nCapacity; /* Size of pData buffer. */ + int nData; /* End of data loaded into pData. */ +} DataBuffer; + +static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){ + assert( nCapacity>=0 ); + pBuffer->nData = 0; + pBuffer->nCapacity = nCapacity; + pBuffer->pData = nCapacity==0 ? NULL : malloc(nCapacity); +} +static void dataBufferReset(DataBuffer *pBuffer){ + pBuffer->nData = 0; +} +static void dataBufferDestroy(DataBuffer *pBuffer){ + if( pBuffer->pData!=NULL ) free(pBuffer->pData); + SCRAMBLE(pBuffer); +} +static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){ + assert( nAddCapacity>0 ); + /* TODO(shess) Consider expanding more aggressively. Note that the + ** underlying malloc implementation may take care of such things for + ** us already. + */ + if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){ + pBuffer->nCapacity = pBuffer->nData+nAddCapacity; + pBuffer->pData = realloc(pBuffer->pData, pBuffer->nCapacity); + } +} +static void dataBufferAppend(DataBuffer *pBuffer, + const char *pSource, int nSource){ + assert( nSource>0 && pSource!=NULL ); + dataBufferExpand(pBuffer, nSource); + memcpy(pBuffer->pData+pBuffer->nData, pSource, nSource); + pBuffer->nData += nSource; +} +static void dataBufferAppend2(DataBuffer *pBuffer, + const char *pSource1, int nSource1, + const char *pSource2, int nSource2){ + assert( nSource1>0 && pSource1!=NULL ); + assert( nSource2>0 && pSource2!=NULL ); + dataBufferExpand(pBuffer, nSource1+nSource2); + memcpy(pBuffer->pData+pBuffer->nData, pSource1, nSource1); + memcpy(pBuffer->pData+pBuffer->nData+nSource1, pSource2, nSource2); + pBuffer->nData += nSource1+nSource2; +} +static void dataBufferReplace(DataBuffer *pBuffer, + const char *pSource, int nSource){ + dataBufferReset(pBuffer); + dataBufferAppend(pBuffer, pSource, nSource); +} + +/* StringBuffer is a null-terminated version of DataBuffer. */ +typedef struct StringBuffer { + DataBuffer b; /* Includes null terminator. */ +} StringBuffer; + +static void initStringBuffer(StringBuffer *sb){ + dataBufferInit(&sb->b, 100); + dataBufferReplace(&sb->b, "", 1); +} +static int stringBufferLength(StringBuffer *sb){ + return sb->b.nData-1; +} +static char *stringBufferData(StringBuffer *sb){ + return sb->b.pData; +} +static void stringBufferDestroy(StringBuffer *sb){ + dataBufferDestroy(&sb->b); +} + +static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ + assert( sb->b.nData>0 ); + if( nFrom>0 ){ + sb->b.nData--; + dataBufferAppend2(&sb->b, zFrom, nFrom, "", 1); + } +} +static void append(StringBuffer *sb, const char *zFrom){ + nappend(sb, zFrom, strlen(zFrom)); +} + +/* Append a list of strings separated by commas. */ +static void appendList(StringBuffer *sb, int nString, char **azString){ + int i; + for(i=0; i0 ) append(sb, ", "); + append(sb, azString[i]); + } +} + +static int endsInWhiteSpace(StringBuffer *p){ + return stringBufferLength(p)>0 && + safe_isspace(stringBufferData(p)[stringBufferLength(p)-1]); +} + +/* If the StringBuffer ends in something other than white space, add a +** single space character to the end. +*/ +static void appendWhiteSpace(StringBuffer *p){ + if( stringBufferLength(p)==0 ) return; + if( !endsInWhiteSpace(p) ) append(p, " "); +} + +/* Remove white space from the end of the StringBuffer */ +static void trimWhiteSpace(StringBuffer *p){ + while( endsInWhiteSpace(p) ){ + p->b.pData[--p->b.nData-1] = '\0'; + } +} + +/*******************************************************************/ +/* DLReader is used to read document elements from a doclist. The +** current docid is cached, so dlrDocid() is fast. DLReader does not +** own the doclist buffer. +** +** dlrAtEnd - true if there's no more data to read. +** dlrDocid - docid of current document. +** dlrDocData - doclist data for current document (including docid). +** dlrDocDataBytes - length of same. +** dlrAllDataBytes - length of all remaining data. +** dlrPosData - position data for current document. +** dlrPosDataLen - length of pos data for current document (incl POS_END). +** dlrStep - step to current document. +** dlrInit - initial for doclist of given type against given data. +** dlrDestroy - clean up. +** +** Expected usage is something like: +** +** DLReader reader; +** dlrInit(&reader, pData, nData); +** while( !dlrAtEnd(&reader) ){ +** // calls to dlrDocid() and kin. +** dlrStep(&reader); +** } +** dlrDestroy(&reader); +*/ +typedef struct DLReader { + DocListType iType; + const char *pData; + int nData; + + sqlite_int64 iDocid; + int nElement; +} DLReader; + +static int dlrAtEnd(DLReader *pReader){ + assert( pReader->nData>=0 ); + return pReader->nData==0; +} +static sqlite_int64 dlrDocid(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->iDocid; +} +static const char *dlrDocData(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->pData; +} +static int dlrDocDataBytes(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->nElement; +} +static int dlrAllDataBytes(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + return pReader->nData; +} +/* TODO(shess) Consider adding a field to track iDocid varint length +** to make these two functions faster. This might matter (a tiny bit) +** for queries. +*/ +static const char *dlrPosData(DLReader *pReader){ + sqlite_int64 iDummy; + int n = getVarint(pReader->pData, &iDummy); + assert( !dlrAtEnd(pReader) ); + return pReader->pData+n; +} +static int dlrPosDataLen(DLReader *pReader){ + sqlite_int64 iDummy; + int n = getVarint(pReader->pData, &iDummy); + assert( !dlrAtEnd(pReader) ); + return pReader->nElement-n; +} +static void dlrStep(DLReader *pReader){ + assert( !dlrAtEnd(pReader) ); + + /* Skip past current doclist element. */ + assert( pReader->nElement<=pReader->nData ); + pReader->pData += pReader->nElement; + pReader->nData -= pReader->nElement; + + /* If there is more data, read the next doclist element. */ + if( pReader->nData!=0 ){ + sqlite_int64 iDocidDelta; + int iDummy, n = getVarint(pReader->pData, &iDocidDelta); + pReader->iDocid += iDocidDelta; + if( pReader->iType>=DL_POSITIONS ){ + assert( nnData ); + while( 1 ){ + n += getVarint32(pReader->pData+n, &iDummy); + assert( n<=pReader->nData ); + if( iDummy==POS_END ) break; + if( iDummy==POS_COLUMN ){ + n += getVarint32(pReader->pData+n, &iDummy); + assert( nnData ); + }else if( pReader->iType==DL_POSITIONS_OFFSETS ){ + n += getVarint32(pReader->pData+n, &iDummy); + n += getVarint32(pReader->pData+n, &iDummy); + assert( nnData ); + } + } + } + pReader->nElement = n; + assert( pReader->nElement<=pReader->nData ); + } +} +static void dlrInit(DLReader *pReader, DocListType iType, + const char *pData, int nData){ + assert( pData!=NULL && nData!=0 ); + pReader->iType = iType; + pReader->pData = pData; + pReader->nData = nData; + pReader->nElement = 0; + pReader->iDocid = 0; + + /* Load the first element's data. There must be a first element. */ + dlrStep(pReader); +} +static void dlrDestroy(DLReader *pReader){ + SCRAMBLE(pReader); +} + +#ifndef NDEBUG +/* Verify that the doclist can be validly decoded. Also returns the +** last docid found because it's convenient in other assertions for +** DLWriter. +*/ +static void docListValidate(DocListType iType, const char *pData, int nData, + sqlite_int64 *pLastDocid){ + sqlite_int64 iPrevDocid = 0; + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + while( nData!=0 ){ + sqlite_int64 iDocidDelta; + int n = getVarint(pData, &iDocidDelta); + iPrevDocid += iDocidDelta; + if( iType>DL_DOCIDS ){ + int iDummy; + while( 1 ){ + n += getVarint32(pData+n, &iDummy); + if( iDummy==POS_END ) break; + if( iDummy==POS_COLUMN ){ + n += getVarint32(pData+n, &iDummy); + }else if( iType>DL_POSITIONS ){ + n += getVarint32(pData+n, &iDummy); + n += getVarint32(pData+n, &iDummy); + } + assert( n<=nData ); + } + } + assert( n<=nData ); + pData += n; + nData -= n; + } + if( pLastDocid ) *pLastDocid = iPrevDocid; +} +#define ASSERT_VALID_DOCLIST(i, p, n, o) docListValidate(i, p, n, o) +#else +#define ASSERT_VALID_DOCLIST(i, p, n, o) assert( 1 ) +#endif + +/*******************************************************************/ +/* DLWriter is used to write doclist data to a DataBuffer. DLWriter +** always appends to the buffer and does not own it. +** +** dlwInit - initialize to write a given type doclistto a buffer. +** dlwDestroy - clear the writer's memory. Does not free buffer. +** dlwAppend - append raw doclist data to buffer. +** dlwCopy - copy next doclist from reader to writer. +** dlwAdd - construct doclist element and append to buffer. +** Only apply dlwAdd() to DL_DOCIDS doclists (else use PLWriter). +*/ +typedef struct DLWriter { + DocListType iType; + DataBuffer *b; + sqlite_int64 iPrevDocid; +#ifndef NDEBUG + int has_iPrevDocid; +#endif +} DLWriter; + +static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){ + pWriter->b = b; + pWriter->iType = iType; + pWriter->iPrevDocid = 0; +#ifndef NDEBUG + pWriter->has_iPrevDocid = 0; +#endif +} +static void dlwDestroy(DLWriter *pWriter){ + SCRAMBLE(pWriter); +} +/* iFirstDocid is the first docid in the doclist in pData. It is +** needed because pData may point within a larger doclist, in which +** case the first item would be delta-encoded. +** +** iLastDocid is the final docid in the doclist in pData. It is +** needed to create the new iPrevDocid for future delta-encoding. The +** code could decode the passed doclist to recreate iLastDocid, but +** the only current user (docListMerge) already has decoded this +** information. +*/ +/* TODO(shess) This has become just a helper for docListMerge. +** Consider a refactor to make this cleaner. +*/ +static void dlwAppend(DLWriter *pWriter, + const char *pData, int nData, + sqlite_int64 iFirstDocid, sqlite_int64 iLastDocid){ + sqlite_int64 iDocid = 0; + char c[VARINT_MAX]; + int nFirstOld, nFirstNew; /* Old and new varint len of first docid. */ +#ifndef NDEBUG + sqlite_int64 iLastDocidDelta; +#endif + + /* Recode the initial docid as delta from iPrevDocid. */ + nFirstOld = getVarint(pData, &iDocid); + assert( nFirstOldiType==DL_DOCIDS) ); + nFirstNew = putVarint(c, iFirstDocid-pWriter->iPrevDocid); + + /* Verify that the incoming doclist is valid AND that it ends with + ** the expected docid. This is essential because we'll trust this + ** docid in future delta-encoding. + */ + ASSERT_VALID_DOCLIST(pWriter->iType, pData, nData, &iLastDocidDelta); + assert( iLastDocid==iFirstDocid-iDocid+iLastDocidDelta ); + + /* Append recoded initial docid and everything else. Rest of docids + ** should have been delta-encoded from previous initial docid. + */ + if( nFirstOldb, c, nFirstNew, + pData+nFirstOld, nData-nFirstOld); + }else{ + dataBufferAppend(pWriter->b, c, nFirstNew); + } + pWriter->iPrevDocid = iLastDocid; +} +static void dlwCopy(DLWriter *pWriter, DLReader *pReader){ + dlwAppend(pWriter, dlrDocData(pReader), dlrDocDataBytes(pReader), + dlrDocid(pReader), dlrDocid(pReader)); +} +static void dlwAdd(DLWriter *pWriter, sqlite_int64 iDocid){ + char c[VARINT_MAX]; + int n = putVarint(c, iDocid-pWriter->iPrevDocid); + + /* Docids must ascend. */ + assert( !pWriter->has_iPrevDocid || iDocid>pWriter->iPrevDocid ); + assert( pWriter->iType==DL_DOCIDS ); + + dataBufferAppend(pWriter->b, c, n); + pWriter->iPrevDocid = iDocid; +#ifndef NDEBUG + pWriter->has_iPrevDocid = 1; +#endif +} + +/*******************************************************************/ +/* PLReader is used to read data from a document's position list. As +** the caller steps through the list, data is cached so that varints +** only need to be decoded once. +** +** plrInit, plrDestroy - create/destroy a reader. +** plrColumn, plrPosition, plrStartOffset, plrEndOffset - accessors +** plrAtEnd - at end of stream, only call plrDestroy once true. +** plrStep - step to the next element. +*/ +typedef struct PLReader { + /* These refer to the next position's data. nData will reach 0 when + ** reading the last position, so plrStep() signals EOF by setting + ** pData to NULL. + */ + const char *pData; + int nData; + + DocListType iType; + int iColumn; /* the last column read */ + int iPosition; /* the last position read */ + int iStartOffset; /* the last start offset read */ + int iEndOffset; /* the last end offset read */ +} PLReader; + +static int plrAtEnd(PLReader *pReader){ + return pReader->pData==NULL; +} +static int plrColumn(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iColumn; +} +static int plrPosition(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iPosition; +} +static int plrStartOffset(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iStartOffset; +} +static int plrEndOffset(PLReader *pReader){ + assert( !plrAtEnd(pReader) ); + return pReader->iEndOffset; +} +static void plrStep(PLReader *pReader){ + int i, n; + + assert( !plrAtEnd(pReader) ); + + if( pReader->nData==0 ){ + pReader->pData = NULL; + return; + } + + n = getVarint32(pReader->pData, &i); + if( i==POS_COLUMN ){ + n += getVarint32(pReader->pData+n, &pReader->iColumn); + pReader->iPosition = 0; + pReader->iStartOffset = 0; + n += getVarint32(pReader->pData+n, &i); + } + /* Should never see adjacent column changes. */ + assert( i!=POS_COLUMN ); + + if( i==POS_END ){ + pReader->nData = 0; + pReader->pData = NULL; + return; + } + + pReader->iPosition += i-POS_BASE; + if( pReader->iType==DL_POSITIONS_OFFSETS ){ + n += getVarint32(pReader->pData+n, &i); + pReader->iStartOffset += i; + n += getVarint32(pReader->pData+n, &i); + pReader->iEndOffset = pReader->iStartOffset+i; + } + assert( n<=pReader->nData ); + pReader->pData += n; + pReader->nData -= n; +} + +static void plrInit(PLReader *pReader, DLReader *pDLReader){ + pReader->pData = dlrPosData(pDLReader); + pReader->nData = dlrPosDataLen(pDLReader); + pReader->iType = pDLReader->iType; + pReader->iColumn = 0; + pReader->iPosition = 0; + pReader->iStartOffset = 0; + pReader->iEndOffset = 0; + plrStep(pReader); +} +static void plrDestroy(PLReader *pReader){ + SCRAMBLE(pReader); +} + +/*******************************************************************/ +/* PLWriter is used in constructing a document's position list. As a +** convenience, if iType is DL_DOCIDS, PLWriter becomes a no-op. +** PLWriter writes to the associated DLWriter's buffer. +** +** plwInit - init for writing a document's poslist. +** plwDestroy - clear a writer. +** plwAdd - append position and offset information. +** plwCopy - copy next position's data from reader to writer. +** plwTerminate - add any necessary doclist terminator. +** +** Calling plwAdd() after plwTerminate() may result in a corrupt +** doclist. +*/ +/* TODO(shess) Until we've written the second item, we can cache the +** first item's information. Then we'd have three states: +** +** - initialized with docid, no positions. +** - docid and one position. +** - docid and multiple positions. +** +** Only the last state needs to actually write to dlw->b, which would +** be an improvement in the DLCollector case. +*/ +typedef struct PLWriter { + DLWriter *dlw; + + int iColumn; /* the last column written */ + int iPos; /* the last position written */ + int iOffset; /* the last start offset written */ +} PLWriter; + +/* TODO(shess) In the case where the parent is reading these values +** from a PLReader, we could optimize to a copy if that PLReader has +** the same type as pWriter. +*/ +static void plwAdd(PLWriter *pWriter, int iColumn, int iPos, + int iStartOffset, int iEndOffset){ + /* Worst-case space for POS_COLUMN, iColumn, iPosDelta, + ** iStartOffsetDelta, and iEndOffsetDelta. + */ + char c[5*VARINT_MAX]; + int n = 0; + + /* Ban plwAdd() after plwTerminate(). */ + assert( pWriter->iPos!=-1 ); + + if( pWriter->dlw->iType==DL_DOCIDS ) return; + + if( iColumn!=pWriter->iColumn ){ + n += putVarint(c+n, POS_COLUMN); + n += putVarint(c+n, iColumn); + pWriter->iColumn = iColumn; + pWriter->iPos = 0; + pWriter->iOffset = 0; + } + assert( iPos>=pWriter->iPos ); + n += putVarint(c+n, POS_BASE+(iPos-pWriter->iPos)); + pWriter->iPos = iPos; + if( pWriter->dlw->iType==DL_POSITIONS_OFFSETS ){ + assert( iStartOffset>=pWriter->iOffset ); + n += putVarint(c+n, iStartOffset-pWriter->iOffset); + pWriter->iOffset = iStartOffset; + assert( iEndOffset>=iStartOffset ); + n += putVarint(c+n, iEndOffset-iStartOffset); + } + dataBufferAppend(pWriter->dlw->b, c, n); +} +static void plwCopy(PLWriter *pWriter, PLReader *pReader){ + plwAdd(pWriter, plrColumn(pReader), plrPosition(pReader), + plrStartOffset(pReader), plrEndOffset(pReader)); +} +static void plwInit(PLWriter *pWriter, DLWriter *dlw, sqlite_int64 iDocid){ + char c[VARINT_MAX]; + int n; + + pWriter->dlw = dlw; + + /* Docids must ascend. */ + assert( !pWriter->dlw->has_iPrevDocid || iDocid>pWriter->dlw->iPrevDocid ); + n = putVarint(c, iDocid-pWriter->dlw->iPrevDocid); + dataBufferAppend(pWriter->dlw->b, c, n); + pWriter->dlw->iPrevDocid = iDocid; +#ifndef NDEBUG + pWriter->dlw->has_iPrevDocid = 1; +#endif + + pWriter->iColumn = 0; + pWriter->iPos = 0; + pWriter->iOffset = 0; +} +/* TODO(shess) Should plwDestroy() also terminate the doclist? But +** then plwDestroy() would no longer be just a destructor, it would +** also be doing work, which isn't consistent with the overall idiom. +** Another option would be for plwAdd() to always append any necessary +** terminator, so that the output is always correct. But that would +** add incremental work to the common case with the only benefit being +** API elegance. Punt for now. +*/ +static void plwTerminate(PLWriter *pWriter){ + if( pWriter->dlw->iType>DL_DOCIDS ){ + char c[VARINT_MAX]; + int n = putVarint(c, POS_END); + dataBufferAppend(pWriter->dlw->b, c, n); + } +#ifndef NDEBUG + /* Mark as terminated for assert in plwAdd(). */ + pWriter->iPos = -1; +#endif +} +static void plwDestroy(PLWriter *pWriter){ + SCRAMBLE(pWriter); +} + +/*******************************************************************/ +/* DLCollector wraps PLWriter and DLWriter to provide a +** dynamically-allocated doclist area to use during tokenization. +** +** dlcNew - malloc up and initialize a collector. +** dlcDelete - destroy a collector and all contained items. +** dlcAddPos - append position and offset information. +** dlcAddDoclist - add the collected doclist to the given buffer. +** dlcNext - terminate the current document and open another. +*/ +typedef struct DLCollector { + DataBuffer b; + DLWriter dlw; + PLWriter plw; +} DLCollector; + +/* TODO(shess) This could also be done by calling plwTerminate() and +** dataBufferAppend(). I tried that, expecting nominal performance +** differences, but it seemed to pretty reliably be worth 1% to code +** it this way. I suspect it's the incremental malloc overhead (some +** percentage of the plwTerminate() calls will cause a realloc), so +** this might be worth revisiting if the DataBuffer implementation +** changes. +*/ +static void dlcAddDoclist(DLCollector *pCollector, DataBuffer *b){ + if( pCollector->dlw.iType>DL_DOCIDS ){ + char c[VARINT_MAX]; + int n = putVarint(c, POS_END); + dataBufferAppend2(b, pCollector->b.pData, pCollector->b.nData, c, n); + }else{ + dataBufferAppend(b, pCollector->b.pData, pCollector->b.nData); + } +} +static void dlcNext(DLCollector *pCollector, sqlite_int64 iDocid){ + plwTerminate(&pCollector->plw); + plwDestroy(&pCollector->plw); + plwInit(&pCollector->plw, &pCollector->dlw, iDocid); +} +static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos, + int iStartOffset, int iEndOffset){ + plwAdd(&pCollector->plw, iColumn, iPos, iStartOffset, iEndOffset); +} + +static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){ + DLCollector *pCollector = malloc(sizeof(DLCollector)); + dataBufferInit(&pCollector->b, 0); + dlwInit(&pCollector->dlw, iType, &pCollector->b); + plwInit(&pCollector->plw, &pCollector->dlw, iDocid); + return pCollector; +} +static void dlcDelete(DLCollector *pCollector){ + plwDestroy(&pCollector->plw); + dlwDestroy(&pCollector->dlw); + dataBufferDestroy(&pCollector->b); + SCRAMBLE(pCollector); + free(pCollector); +} + + +/* Copy the doclist data of iType in pData/nData into *out, trimming +** unnecessary data as we go. Only columns matching iColumn are +** copied, all columns copied if iColumn is -1. Elements with no +** matching columns are dropped. The output is an iOutType doclist. +*/ +/* NOTE(shess) This code is only valid after all doclists are merged. +** If this is run before merges, then doclist items which represent +** deletion will be trimmed, and will thus not effect a deletion +** during the merge. +*/ +static void docListTrim(DocListType iType, const char *pData, int nData, + int iColumn, DocListType iOutType, DataBuffer *out){ + DLReader dlReader; + DLWriter dlWriter; + + assert( iOutType<=iType ); + + dlrInit(&dlReader, iType, pData, nData); + dlwInit(&dlWriter, iOutType, out); + + while( !dlrAtEnd(&dlReader) ){ + PLReader plReader; + PLWriter plWriter; + int match = 0; + + plrInit(&plReader, &dlReader); + + while( !plrAtEnd(&plReader) ){ + if( iColumn==-1 || plrColumn(&plReader)==iColumn ){ + if( !match ){ + plwInit(&plWriter, &dlWriter, dlrDocid(&dlReader)); + match = 1; + } + plwAdd(&plWriter, plrColumn(&plReader), plrPosition(&plReader), + plrStartOffset(&plReader), plrEndOffset(&plReader)); + } + plrStep(&plReader); + } + if( match ){ + plwTerminate(&plWriter); + plwDestroy(&plWriter); + } + + plrDestroy(&plReader); + dlrStep(&dlReader); + } + dlwDestroy(&dlWriter); + dlrDestroy(&dlReader); +} + +/* Used by docListMerge() to keep doclists in the ascending order by +** docid, then ascending order by age (so the newest comes first). +*/ +typedef struct OrderedDLReader { + DLReader *pReader; + + /* TODO(shess) If we assume that docListMerge pReaders is ordered by + ** age (which we do), then we could use pReader comparisons to break + ** ties. + */ + int idx; +} OrderedDLReader; + +/* Order eof to end, then by docid asc, idx desc. */ +static int orderedDLReaderCmp(OrderedDLReader *r1, OrderedDLReader *r2){ + if( dlrAtEnd(r1->pReader) ){ + if( dlrAtEnd(r2->pReader) ) return 0; /* Both atEnd(). */ + return 1; /* Only r1 atEnd(). */ + } + if( dlrAtEnd(r2->pReader) ) return -1; /* Only r2 atEnd(). */ + + if( dlrDocid(r1->pReader)pReader) ) return -1; + if( dlrDocid(r1->pReader)>dlrDocid(r2->pReader) ) return 1; + + /* Descending on idx. */ + return r2->idx-r1->idx; +} + +/* Bubble p[0] to appropriate place in p[1..n-1]. Assumes that +** p[1..n-1] is already sorted. +*/ +/* TODO(shess) Is this frequent enough to warrant a binary search? +** Before implementing that, instrument the code to check. In most +** current usage, I expect that p[0] will be less than p[1] a very +** high proportion of the time. +*/ +static void orderedDLReaderReorder(OrderedDLReader *p, int n){ + while( n>1 && orderedDLReaderCmp(p, p+1)>0 ){ + OrderedDLReader tmp = p[0]; + p[0] = p[1]; + p[1] = tmp; + n--; + p++; + } +} + +/* Given an array of doclist readers, merge their doclist elements +** into out in sorted order (by docid), dropping elements from older +** readers when there is a duplicate docid. pReaders is assumed to be +** ordered by age, oldest first. +*/ +/* TODO(shess) nReaders must be <= MERGE_COUNT. This should probably +** be fixed. +*/ +static void docListMerge(DataBuffer *out, + DLReader *pReaders, int nReaders){ + OrderedDLReader readers[MERGE_COUNT]; + DLWriter writer; + int i, n; + const char *pStart = 0; + int nStart = 0; + sqlite_int64 iFirstDocid = 0, iLastDocid = 0; + + assert( nReaders>0 ); + if( nReaders==1 ){ + dataBufferAppend(out, dlrDocData(pReaders), dlrAllDataBytes(pReaders)); + return; + } + + assert( nReaders<=MERGE_COUNT ); + n = 0; + for(i=0; i0 ){ + orderedDLReaderReorder(readers+i, nReaders-i); + } + + dlwInit(&writer, pReaders[0].iType, out); + while( !dlrAtEnd(readers[0].pReader) ){ + sqlite_int64 iDocid = dlrDocid(readers[0].pReader); + + /* If this is a continuation of the current buffer to copy, extend + ** that buffer. memcpy() seems to be more efficient if it has a + ** lots of data to copy. + */ + if( dlrDocData(readers[0].pReader)==pStart+nStart ){ + nStart += dlrDocDataBytes(readers[0].pReader); + }else{ + if( pStart!=0 ){ + dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); + } + pStart = dlrDocData(readers[0].pReader); + nStart = dlrDocDataBytes(readers[0].pReader); + iFirstDocid = iDocid; + } + iLastDocid = iDocid; + dlrStep(readers[0].pReader); + + /* Drop all of the older elements with the same docid. */ + for(i=1; i0 ){ + orderedDLReaderReorder(readers+i, nReaders-i); + } + } + + /* Copy over any remaining elements. */ + if( nStart>0 ) dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); + dlwDestroy(&writer); +} + +/* Helper function for posListUnion(). Compares the current position +** between left and right, returning as standard C idiom of <0 if +** left0 if left>right, and 0 if left==right. "End" always +** compares greater. +*/ +static int posListCmp(PLReader *pLeft, PLReader *pRight){ + assert( pLeft->iType==pRight->iType ); + if( pLeft->iType==DL_DOCIDS ) return 0; + + if( plrAtEnd(pLeft) ) return plrAtEnd(pRight) ? 0 : 1; + if( plrAtEnd(pRight) ) return -1; + + if( plrColumn(pLeft)plrColumn(pRight) ) return 1; + + if( plrPosition(pLeft)plrPosition(pRight) ) return 1; + if( pLeft->iType==DL_POSITIONS ) return 0; + + if( plrStartOffset(pLeft)plrStartOffset(pRight) ) return 1; + + if( plrEndOffset(pLeft)plrEndOffset(pRight) ) return 1; + + return 0; +} + +/* Write the union of position lists in pLeft and pRight to pOut. +** "Union" in this case meaning "All unique position tuples". Should +** work with any doclist type, though both inputs and the output +** should be the same type. +*/ +static void posListUnion(DLReader *pLeft, DLReader *pRight, DLWriter *pOut){ + PLReader left, right; + PLWriter writer; + + assert( dlrDocid(pLeft)==dlrDocid(pRight) ); + assert( pLeft->iType==pRight->iType ); + assert( pLeft->iType==pOut->iType ); + + plrInit(&left, pLeft); + plrInit(&right, pRight); + plwInit(&writer, pOut, dlrDocid(pLeft)); + + while( !plrAtEnd(&left) || !plrAtEnd(&right) ){ + int c = posListCmp(&left, &right); + if( c<0 ){ + plwCopy(&writer, &left); + plrStep(&left); + }else if( c>0 ){ + plwCopy(&writer, &right); + plrStep(&right); + }else{ + plwCopy(&writer, &left); + plrStep(&left); + plrStep(&right); + } + } + + plwTerminate(&writer); + plwDestroy(&writer); + plrDestroy(&left); + plrDestroy(&right); +} + +/* Write the union of doclists in pLeft and pRight to pOut. For +** docids in common between the inputs, the union of the position +** lists is written. Inputs and outputs are always type DL_DEFAULT. +*/ +static void docListUnion( + const char *pLeft, int nLeft, + const char *pRight, int nRight, + DataBuffer *pOut /* Write the combined doclist here */ +){ + DLReader left, right; + DLWriter writer; + + if( nLeft==0 ){ + dataBufferAppend(pOut, pRight, nRight); + return; + } + if( nRight==0 ){ + dataBufferAppend(pOut, pLeft, nLeft); + return; + } + + dlrInit(&left, DL_DEFAULT, pLeft, nLeft); + dlrInit(&right, DL_DEFAULT, pRight, nRight); + dlwInit(&writer, DL_DEFAULT, pOut); + + while( !dlrAtEnd(&left) || !dlrAtEnd(&right) ){ + if( dlrAtEnd(&right) ){ + dlwCopy(&writer, &left); + dlrStep(&left); + }else if( dlrAtEnd(&left) ){ + dlwCopy(&writer, &right); + dlrStep(&right); + }else if( dlrDocid(&left)dlrDocid(&right) ){ + dlwCopy(&writer, &right); + dlrStep(&right); + }else{ + posListUnion(&left, &right, &writer); + dlrStep(&left); + dlrStep(&right); + } + } + + dlrDestroy(&left); + dlrDestroy(&right); + dlwDestroy(&writer); +} + +/* pLeft and pRight are DLReaders positioned to the same docid. +** +** If there are no instances in pLeft or pRight where the position +** of pLeft is one less than the position of pRight, then this +** routine adds nothing to pOut. +** +** If there are one or more instances where positions from pLeft +** are exactly one less than positions from pRight, then add a new +** document record to pOut. If pOut wants to hold positions, then +** include the positions from pRight that are one more than a +** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. +*/ +static void posListPhraseMerge(DLReader *pLeft, DLReader *pRight, + DLWriter *pOut){ + PLReader left, right; + PLWriter writer; + int match = 0; + + assert( dlrDocid(pLeft)==dlrDocid(pRight) ); + assert( pOut->iType!=DL_POSITIONS_OFFSETS ); + + plrInit(&left, pLeft); + plrInit(&right, pRight); + + while( !plrAtEnd(&left) && !plrAtEnd(&right) ){ + if( plrColumn(&left)plrColumn(&right) ){ + plrStep(&right); + }else if( plrPosition(&left)+1plrPosition(&right) ){ + plrStep(&right); + }else{ + if( !match ){ + plwInit(&writer, pOut, dlrDocid(pLeft)); + match = 1; + } + plwAdd(&writer, plrColumn(&right), plrPosition(&right), 0, 0); + plrStep(&left); + plrStep(&right); + } + } + + if( match ){ + plwTerminate(&writer); + plwDestroy(&writer); + } + + plrDestroy(&left); + plrDestroy(&right); +} + +/* We have two doclists with positions: pLeft and pRight. +** Write the phrase intersection of these two doclists into pOut. +** +** A phrase intersection means that two documents only match +** if pLeft.iPos+1==pRight.iPos. +** +** iType controls the type of data written to pOut. If iType is +** DL_POSITIONS, the positions are those from pRight. +*/ +static void docListPhraseMerge( + const char *pLeft, int nLeft, + const char *pRight, int nRight, + DocListType iType, + DataBuffer *pOut /* Write the combined doclist here */ +){ + DLReader left, right; + DLWriter writer; + + if( nLeft==0 || nRight==0 ) return; + + assert( iType!=DL_POSITIONS_OFFSETS ); + + dlrInit(&left, DL_POSITIONS, pLeft, nLeft); + dlrInit(&right, DL_POSITIONS, pRight, nRight); + dlwInit(&writer, iType, pOut); + + while( !dlrAtEnd(&left) && !dlrAtEnd(&right) ){ + if( dlrDocid(&left) one AND (two OR three) + * [one OR two three] ==> (one OR two) AND three + * + * A "-" before a term matches all entries that lack that term. + * The "-" must occur immediately before the term with in intervening + * space. This is how the search engines do it. + * + * A NOT term cannot be the right-hand operand of an OR. If this + * occurs in the query string, the NOT is ignored: + * + * [one OR -two] ==> one OR two + * + */ +typedef struct Query { + fulltext_vtab *pFts; /* The full text index */ + int nTerms; /* Number of terms in the query */ + QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ + int nextIsOr; /* Set the isOr flag on the next inserted term */ + int nextColumn; /* Next word parsed must be in this column */ + int dfltColumn; /* The default column */ +} Query; + + +/* +** An instance of the following structure keeps track of generated +** matching-word offset information and snippets. +*/ +typedef struct Snippet { + int nMatch; /* Total number of matches */ + int nAlloc; /* Space allocated for aMatch[] */ + struct snippetMatch { /* One entry for each matching term */ + char snStatus; /* Status flag for use while constructing snippets */ + short int iCol; /* The column that contains the match */ + short int iTerm; /* The index in Query.pTerms[] of the matching term */ + short int nByte; /* Number of bytes in the term */ + int iStart; /* The offset to the first character of the term */ + } *aMatch; /* Points to space obtained from malloc */ + char *zOffset; /* Text rendering of aMatch[] */ + int nOffset; /* strlen(zOffset) */ + char *zSnippet; /* Snippet text */ + int nSnippet; /* strlen(zSnippet) */ +} Snippet; + + +typedef enum QueryType { + QUERY_GENERIC, /* table scan */ + QUERY_DOCID, /* lookup by docid */ + QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ +} QueryType; + +typedef enum fulltext_statement { + CONTENT_INSERT_STMT, + CONTENT_SELECT_STMT, + CONTENT_UPDATE_STMT, + CONTENT_DELETE_STMT, + + BLOCK_INSERT_STMT, + BLOCK_SELECT_STMT, + BLOCK_DELETE_STMT, + + SEGDIR_MAX_INDEX_STMT, + SEGDIR_SET_STMT, + SEGDIR_SELECT_STMT, + SEGDIR_SPAN_STMT, + SEGDIR_DELETE_STMT, + SEGDIR_SELECT_ALL_STMT, + + MAX_STMT /* Always at end! */ +} fulltext_statement; + +/* These must exactly match the enum above. */ +/* TODO(shess): Is there some risk that a statement will be used in two +** cursors at once, e.g. if a query joins a virtual table to itself? +** If so perhaps we should move some of these to the cursor object. +*/ +static const char *const fulltext_zStatement[MAX_STMT] = { + /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ + /* CONTENT_SELECT */ NULL, /* generated in contentSelectStatement() */ + /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ + /* CONTENT_DELETE */ "delete from %_content where docid = ?", + + /* BLOCK_INSERT */ + "insert into %_segments (blockid, block) values (null, ?)", + /* BLOCK_SELECT */ "select block from %_segments where blockid = ?", + /* BLOCK_DELETE */ "delete from %_segments where blockid between ? and ?", + + /* SEGDIR_MAX_INDEX */ "select max(idx) from %_segdir where level = ?", + /* SEGDIR_SET */ "insert into %_segdir values (?, ?, ?, ?, ?, ?)", + /* SEGDIR_SELECT */ + "select start_block, leaves_end_block, root from %_segdir " + " where level = ? order by idx", + /* SEGDIR_SPAN */ + "select min(start_block), max(end_block) from %_segdir " + " where level = ? and start_block <> 0", + /* SEGDIR_DELETE */ "delete from %_segdir where level = ?", + /* SEGDIR_SELECT_ALL */ + "select root, leaves_end_block from %_segdir order by level desc, idx", +}; + +/* +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct fulltext_vtab { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of columns in virtual table */ + char **azColumn; /* column names. malloced */ + char **azContentColumn; /* column names in content table; malloced */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + + /* Precompiled statements which we keep as long as the table is + ** open. + */ + sqlite3_stmt *pFulltextStatements[MAX_STMT]; + + /* Precompiled statements used for segment merges. We run a + ** separate select across the leaf level of each tree being merged. + */ + sqlite3_stmt *pLeafSelectStmts[MERGE_COUNT]; + /* The statement used to prepare pLeafSelectStmts. */ +#define LEAF_SELECT \ + "select block from %_segments where blockid between ? and ? order by blockid" + + /* These buffer pending index updates during transactions. + ** nPendingData estimates the memory size of the pending data. It + ** doesn't include the hash-bucket overhead, nor any malloc + ** overhead. When nPendingData exceeds kPendingThreshold, the + ** buffer is flushed even before the transaction closes. + ** pendingTerms stores the data, and is only valid when nPendingData + ** is >=0 (nPendingData<0 means pendingTerms has not been + ** initialized). iPrevDocid is the last docid written, used to make + ** certain we're inserting in sorted order. + */ + int nPendingData; +#define kPendingThreshold (1*1024*1024) + sqlite_int64 iPrevDocid; + fts3Hash pendingTerms; +}; + +/* +** When the core wants to do a query, it create a cursor using a +** call to xOpen. This structure is an instance of a cursor. It +** is destroyed by xClose. +*/ +typedef struct fulltext_cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + int eof; /* True if at End Of Results */ + Query q; /* Parsed query string */ + Snippet snippet; /* Cached snippet for the current row */ + int iColumn; /* Column being searched */ + DataBuffer result; /* Doclist results from fulltextQuery */ + DLReader reader; /* Result reader if result not empty */ +} fulltext_cursor; + +static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ + return (fulltext_vtab *) c->base.pVtab; +} + +static const sqlite3_module fts3Module; /* forward declaration */ + +/* Return a dynamically generated statement of the form + * insert into %_content (docid, ...) values (?, ...) + */ +static const char *contentInsertStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "insert into %_content (docid, "); + appendList(&sb, v->nColumn, v->azContentColumn); + append(&sb, ") values (?"); + for(i=0; inColumn; ++i) + append(&sb, ", ?"); + append(&sb, ")"); + return stringBufferData(&sb); +} + +/* Return a dynamically generated statement of the form + * select from %_content where docid = ? + */ +static const char *contentSelectStatement(fulltext_vtab *v){ + StringBuffer sb; + initStringBuffer(&sb); + append(&sb, "SELECT "); + appendList(&sb, v->nColumn, v->azContentColumn); + append(&sb, " FROM %_content WHERE docid = ?"); + return stringBufferData(&sb); +} + +/* Return a dynamically generated statement of the form + * update %_content set [col_0] = ?, [col_1] = ?, ... + * where docid = ? + */ +static const char *contentUpdateStatement(fulltext_vtab *v){ + StringBuffer sb; + int i; + + initStringBuffer(&sb); + append(&sb, "update %_content set "); + for(i=0; inColumn; ++i) { + if( i>0 ){ + append(&sb, ", "); + } + append(&sb, v->azContentColumn[i]); + append(&sb, " = ?"); + } + append(&sb, " where docid = ?"); + return stringBufferData(&sb); +} + +/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. +** If the indicated statement has never been prepared, it is prepared +** and cached, otherwise the cached version is reset. +*/ +static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, + sqlite3_stmt **ppStmt){ + assert( iStmtpFulltextStatements[iStmt]==NULL ){ + const char *zStmt; + int rc; + switch( iStmt ){ + case CONTENT_INSERT_STMT: + zStmt = contentInsertStatement(v); break; + case CONTENT_SELECT_STMT: + zStmt = contentSelectStatement(v); break; + case CONTENT_UPDATE_STMT: + zStmt = contentUpdateStatement(v); break; + default: + zStmt = fulltext_zStatement[iStmt]; + } + rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], + zStmt); + if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); + if( rc!=SQLITE_OK ) return rc; + } else { + int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); + if( rc!=SQLITE_OK ) return rc; + } + + *ppStmt = v->pFulltextStatements[iStmt]; + return SQLITE_OK; +} + +/* Like sqlite3_step(), but convert SQLITE_DONE to SQLITE_OK and +** SQLITE_ROW to SQLITE_ERROR. Useful for statements like UPDATE, +** where we expect no results. +*/ +static int sql_single_step(sqlite3_stmt *s){ + int rc = sqlite3_step(s); + return (rc==SQLITE_DONE) ? SQLITE_OK : rc; +} + +/* Like sql_get_statement(), but for special replicated LEAF_SELECT +** statements. +*/ +/* TODO(shess) Write version for generic statements and then share +** that between the cached-statement functions. +*/ +static int sql_get_leaf_statement(fulltext_vtab *v, int idx, + sqlite3_stmt **ppStmt){ + assert( idx>=0 && idxpLeafSelectStmts[idx]==NULL ){ + int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx], + LEAF_SELECT); + if( rc!=SQLITE_OK ) return rc; + }else{ + int rc = sqlite3_reset(v->pLeafSelectStmts[idx]); + if( rc!=SQLITE_OK ) return rc; + } + + *ppStmt = v->pLeafSelectStmts[idx]; + return SQLITE_OK; +} + +/* insert into %_content (docid, ...) values ([docid], [pValues]) +** If the docid contains SQL NULL, then a unique docid will be +** generated. +*/ +static int content_insert(fulltext_vtab *v, sqlite3_value *docid, + sqlite3_value **pValues){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_value(s, 1, docid); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 2+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + return sql_single_step(s); +} + +/* update %_content set col0 = pValues[0], col1 = pValues[1], ... + * where docid = [iDocid] */ +static int content_update(fulltext_vtab *v, sqlite3_value **pValues, + sqlite_int64 iDocid){ + sqlite3_stmt *s; + int i; + int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + for(i=0; inColumn; ++i){ + rc = sqlite3_bind_value(s, 1+i, pValues[i]); + if( rc!=SQLITE_OK ) return rc; + } + + rc = sqlite3_bind_int64(s, 1+v->nColumn, iDocid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +static void freeStringArray(int nString, const char **pString){ + int i; + + for (i=0 ; i < nString ; ++i) { + if( pString[i]!=NULL ) free((void *) pString[i]); + } + free((void *) pString); +} + +/* select * from %_content where docid = [iDocid] + * The caller must delete the returned array and all strings in it. + * null fields will be NULL in the returned array. + * + * TODO: Perhaps we should return pointer/length strings here for consistency + * with other code which uses pointer/length. */ +static int content_select(fulltext_vtab *v, sqlite_int64 iDocid, + const char ***pValues){ + sqlite3_stmt *s; + const char **values; + int i; + int rc; + + *pValues = NULL; + + rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iDocid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc!=SQLITE_ROW ) return rc; + + values = (const char **) malloc(v->nColumn * sizeof(const char *)); + for(i=0; inColumn; ++i){ + if( sqlite3_column_type(s, i)==SQLITE_NULL ){ + values[i] = NULL; + }else{ + values[i] = string_dup((char*)sqlite3_column_text(s, i)); + } + } + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ){ + *pValues = values; + return SQLITE_OK; + } + + freeStringArray(v->nColumn, values); + return rc; +} + +/* delete from %_content where docid = [iDocid ] */ +static int content_delete(fulltext_vtab *v, sqlite_int64 iDocid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iDocid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* insert into %_segments values ([pData]) +** returns assigned blockid in *piBlockid +*/ +static int block_insert(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 *piBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, BLOCK_INSERT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 1, pData, nData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + + /* blockid column is an alias for rowid. */ + *piBlockid = sqlite3_last_insert_rowid(v->db); + return SQLITE_OK; +} + +/* delete from %_segments +** where blockid between [iStartBlockid] and [iEndBlockid] +** +** Deletes the range of blocks, inclusive, used to delete the blocks +** which form a segment. +*/ +static int block_delete(fulltext_vtab *v, + sqlite_int64 iStartBlockid, sqlite_int64 iEndBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, BLOCK_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 2, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* Returns SQLITE_ROW with *pidx set to the maximum segment idx found +** at iLevel. Returns SQLITE_DONE if there are no segments at +** iLevel. Otherwise returns an error. +*/ +static int segdir_max_index(fulltext_vtab *v, int iLevel, int *pidx){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_MAX_INDEX_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + /* Should always get at least one row due to how max() works. */ + if( rc==SQLITE_DONE ) return SQLITE_DONE; + if( rc!=SQLITE_ROW ) return rc; + + /* NULL means that there were no inputs to max(). */ + if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + return rc; + } + + *pidx = sqlite3_column_int(s, 0); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + return SQLITE_ROW; +} + +/* insert into %_segdir values ( +** [iLevel], [idx], +** [iStartBlockid], [iLeavesEndBlockid], [iEndBlockid], +** [pRootData] +** ) +*/ +static int segdir_set(fulltext_vtab *v, int iLevel, int idx, + sqlite_int64 iStartBlockid, + sqlite_int64 iLeavesEndBlockid, + sqlite_int64 iEndBlockid, + const char *pRootData, int nRootData){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SET_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 2, idx); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 3, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 4, iLeavesEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 5, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_blob(s, 6, pRootData, nRootData, SQLITE_STATIC); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* Queries %_segdir for the block span of the segments in level +** iLevel. Returns SQLITE_DONE if there are no blocks for iLevel, +** SQLITE_ROW if there are blocks, else an error. +*/ +static int segdir_span(fulltext_vtab *v, int iLevel, + sqlite_int64 *piStartBlockid, + sqlite_int64 *piEndBlockid){ + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SPAN_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ) return SQLITE_DONE; /* Should never happen */ + if( rc!=SQLITE_ROW ) return rc; + + /* This happens if all segments at this level are entirely inline. */ + if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + int rc2 = sqlite3_step(s); + if( rc2==SQLITE_ROW ) return SQLITE_ERROR; + return rc2; + } + + *piStartBlockid = sqlite3_column_int64(s, 0); + *piEndBlockid = sqlite3_column_int64(s, 1); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + return SQLITE_ROW; +} + +/* Delete the segment blocks and segment directory records for all +** segments at iLevel. +*/ +static int segdir_delete(fulltext_vtab *v, int iLevel){ + sqlite3_stmt *s; + sqlite_int64 iStartBlockid, iEndBlockid; + int rc = segdir_span(v, iLevel, &iStartBlockid, &iEndBlockid); + if( rc!=SQLITE_ROW && rc!=SQLITE_DONE ) return rc; + + if( rc==SQLITE_ROW ){ + rc = block_delete(v, iStartBlockid, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + } + + /* Delete the segment directory itself. */ + rc = sql_get_statement(v, SEGDIR_DELETE_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + return sql_single_step(s); +} + +/* TODO(shess) clearPendingTerms() is far down the file because +** writeZeroSegment() is far down the file because LeafWriter is far +** down the file. Consider refactoring the code to move the non-vtab +** code above the vtab code so that we don't need this forward +** reference. +*/ +static int clearPendingTerms(fulltext_vtab *v); + +/* +** Free the memory used to contain a fulltext_vtab structure. +*/ +static void fulltext_vtab_destroy(fulltext_vtab *v){ + int iStmt, i; + + TRACE(("FTS3 Destroy %p\n", v)); + for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ + sqlite3_finalize(v->pFulltextStatements[iStmt]); + v->pFulltextStatements[iStmt] = NULL; + } + } + + for( i=0; ipLeafSelectStmts[i]!=NULL ){ + sqlite3_finalize(v->pLeafSelectStmts[i]); + v->pLeafSelectStmts[i] = NULL; + } + } + + if( v->pTokenizer!=NULL ){ + v->pTokenizer->pModule->xDestroy(v->pTokenizer); + v->pTokenizer = NULL; + } + + clearPendingTerms(v); + + free(v->azColumn); + for(i = 0; i < v->nColumn; ++i) { + sqlite3_free(v->azContentColumn[i]); + } + free(v->azContentColumn); + free(v); +} + +/* +** Token types for parsing the arguments to xConnect or xCreate. +*/ +#define TOKEN_EOF 0 /* End of file */ +#define TOKEN_SPACE 1 /* Any kind of whitespace */ +#define TOKEN_ID 2 /* An identifier */ +#define TOKEN_STRING 3 /* A string literal */ +#define TOKEN_PUNCT 4 /* A single punctuation character */ + +/* +** If X is a character that can be used in an identifier then +** IdChar(X) will be true. Otherwise it is false. +** +** For ASCII, any character with the high-order bit set is +** allowed in an identifier. For 7-bit characters, +** sqlite3IsIdChar[X] must be 1. +** +** Ticket #1066. the SQL standard does not allow '$' in the +** middle of identfiers. But many SQL implementations do. +** SQLite will allow '$' in identifiers for compatibility. +** But the feature is undocumented. +*/ +static const char isIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) + + +/* +** Return the length of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +static int getToken(const char *z, int *tokenType){ + int i, c; + switch( *z ){ + case 0: { + *tokenType = TOKEN_EOF; + return 0; + } + case ' ': case '\t': case '\n': case '\f': case '\r': { + for(i=1; safe_isspace(z[i]); i++){} + *tokenType = TOKEN_SPACE; + return i; + } + case '`': + case '\'': + case '"': { + int delim = z[0]; + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + *tokenType = TOKEN_STRING; + return i + (c!=0); + } + case '[': { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = TOKEN_ID; + return i; + } + default: { + if( !IdChar(*z) ){ + break; + } + for(i=1; IdChar(z[i]); i++){} + *tokenType = TOKEN_ID; + return i; + } + } + *tokenType = TOKEN_PUNCT; + return 1; +} + +/* +** A token extracted from a string is an instance of the following +** structure. +*/ +typedef struct Token { + const char *z; /* Pointer to token text. Not '\000' terminated */ + short int n; /* Length of the token text in bytes. */ +} Token; + +/* +** Given a input string (which is really one of the argv[] parameters +** passed into xConnect or xCreate) split the string up into tokens. +** Return an array of pointers to '\000' terminated strings, one string +** for each non-whitespace token. +** +** The returned array is terminated by a single NULL pointer. +** +** Space to hold the returned array is obtained from a single +** malloc and should be freed by passing the return value to free(). +** The individual strings within the token list are all a part of +** the single memory allocation and will all be freed at once. +*/ +static char **tokenizeString(const char *z, int *pnToken){ + int nToken = 0; + Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); + int n = 1; + int e, i; + int totalSize = 0; + char **azToken; + char *zCopy; + while( n>0 ){ + n = getToken(z, &e); + if( e!=TOKEN_SPACE ){ + aToken[nToken].z = z; + aToken[nToken].n = n; + nToken++; + totalSize += n+1; + } + z += n; + } + azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); + zCopy = (char*)&azToken[nToken]; + nToken--; + for(i=0; i=0 ){ + azIn[j] = azIn[i]; + } + j++; + } + } + azIn[j] = 0; + } +} + + +/* +** Find the first alphanumeric token in the string zIn. Null-terminate +** this token. Remove any quotation marks. And return a pointer to +** the result. +*/ +static char *firstToken(char *zIn, char **pzTail){ + int n, ttype; + while(1){ + n = getToken(zIn, &ttype); + if( ttype==TOKEN_SPACE ){ + zIn += n; + }else if( ttype==TOKEN_EOF ){ + *pzTail = zIn; + return 0; + }else{ + zIn[n] = 0; + *pzTail = &zIn[1]; + dequoteString(zIn); + return zIn; + } + } + /*NOTREACHED*/ +} + +/* Return true if... +** +** * s begins with the string t, ignoring case +** * s is longer than t +** * The first character of s beyond t is not a alphanumeric +** +** Ignore leading space in *s. +** +** To put it another way, return true if the first token of +** s[] is t[]. +*/ +static int startsWith(const char *s, const char *t){ + while( safe_isspace(*s) ){ s++; } + while( *t ){ + if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; + } + return *s!='_' && !safe_isalnum(*s); +} + +/* +** An instance of this structure defines the "spec" of a +** full text index. This structure is populated by parseSpec +** and use by fulltextConnect and fulltextCreate. +*/ +typedef struct TableSpec { + const char *zDb; /* Logical database name */ + const char *zName; /* Name of the full-text index */ + int nColumn; /* Number of columns to be indexed */ + char **azColumn; /* Original names of columns to be indexed */ + char **azContentColumn; /* Column names for %_content */ + char **azTokenizer; /* Name of tokenizer and its arguments */ +} TableSpec; + +/* +** Reclaim all of the memory used by a TableSpec +*/ +static void clearTableSpec(TableSpec *p) { + free(p->azColumn); + free(p->azContentColumn); + free(p->azTokenizer); +} + +/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: + * + * CREATE VIRTUAL TABLE email + * USING fts3(subject, body, tokenize mytokenizer(myarg)) + * + * We return parsed information in a TableSpec structure. + * + */ +static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, + char**pzErr){ + int i, n; + char *z, *zDummy; + char **azArg; + const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ + + assert( argc>=3 ); + /* Current interface: + ** argv[0] - module name + ** argv[1] - database name + ** argv[2] - table name + ** argv[3..] - columns, optionally followed by tokenizer specification + ** and snippet delimiters specification. + */ + + /* Make a copy of the complete argv[][] array in a single allocation. + ** The argv[][] array is read-only and transient. We can write to the + ** copy in order to modify things and the copy is persistent. + */ + CLEAR(pSpec); + for(i=n=0; izDb = azArg[1]; + pSpec->zName = azArg[2]; + pSpec->nColumn = 0; + pSpec->azColumn = azArg; + zTokenizer = "tokenize simple"; + for(i=3; inColumn] = firstToken(azArg[i], &zDummy); + pSpec->nColumn++; + } + } + if( pSpec->nColumn==0 ){ + azArg[0] = "content"; + pSpec->nColumn = 1; + } + + /* + ** Construct the list of content column names. + ** + ** Each content column name will be of the form cNNAAAA + ** where NN is the column number and AAAA is the sanitized + ** column name. "sanitized" means that special characters are + ** converted to "_". The cNN prefix guarantees that all column + ** names are unique. + ** + ** The AAAA suffix is not strictly necessary. It is included + ** for the convenience of people who might examine the generated + ** %_content table and wonder what the columns are used for. + */ + pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); + if( pSpec->azContentColumn==0 ){ + clearTableSpec(pSpec); + return SQLITE_NOMEM; + } + for(i=0; inColumn; i++){ + char *p; + pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); + for (p = pSpec->azContentColumn[i]; *p ; ++p) { + if( !safe_isalnum(*p) ) *p = '_'; + } + } + + /* + ** Parse the tokenizer specification string. + */ + pSpec->azTokenizer = tokenizeString(zTokenizer, &n); + tokenListToIdList(pSpec->azTokenizer); + + return SQLITE_OK; +} + +/* +** Generate a CREATE TABLE statement that describes the schema of +** the virtual table. Return a pointer to this schema string. +** +** Space is obtained from sqlite3_mprintf() and should be freed +** using sqlite3_free(). +*/ +static char *fulltextSchema( + int nColumn, /* Number of columns */ + const char *const* azColumn, /* List of columns */ + const char *zTableName /* Name of the table */ +){ + int i; + char *zSchema, *zNext; + const char *zSep = "("; + zSchema = sqlite3_mprintf("CREATE TABLE x"); + for(i=0; ibase */ + v->db = db; + v->zDb = spec->zDb; /* Freed when azColumn is freed */ + v->zName = spec->zName; /* Freed when azColumn is freed */ + v->nColumn = spec->nColumn; + v->azContentColumn = spec->azContentColumn; + spec->azContentColumn = 0; + v->azColumn = spec->azColumn; + spec->azColumn = 0; + + if( spec->azTokenizer==0 ){ + return SQLITE_NOMEM; + } + + zTok = spec->azTokenizer[0]; + if( !zTok ){ + zTok = "simple"; + } + nTok = strlen(zTok)+1; + + m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zTok, nTok); + if( !m ){ + *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); + rc = SQLITE_ERROR; + goto err; + } + + for(n=0; spec->azTokenizer[n]; n++){} + if( n ){ + rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], + &v->pTokenizer); + }else{ + rc = m->xCreate(0, 0, &v->pTokenizer); + } + if( rc!=SQLITE_OK ) goto err; + v->pTokenizer->pModule = m; + + /* TODO: verify the existence of backing tables foo_content, foo_term */ + + schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, + spec->zName); + rc = sqlite3_declare_vtab(db, schema); + sqlite3_free(schema); + if( rc!=SQLITE_OK ) goto err; + + memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); + + /* Indicate that the buffer is not live. */ + v->nPendingData = -1; + + *ppVTab = &v->base; + TRACE(("FTS3 Connect %p\n", v)); + + return rc; + +err: + fulltext_vtab_destroy(v); + return rc; +} + +static int fulltextConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, + char **pzErr +){ + TableSpec spec; + int rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); + clearTableSpec(&spec); + return rc; +} + +/* The %_content table holds the text of each document, with +** the docid column exposed as the SQLite rowid for the table. +*/ +/* TODO(shess) This comment needs elaboration to match the updated +** code. Work it into the top-of-file comment at that time. +*/ +static int fulltextCreate(sqlite3 *db, void *pAux, + int argc, const char * const *argv, + sqlite3_vtab **ppVTab, char **pzErr){ + int rc; + TableSpec spec; + StringBuffer schema; + TRACE(("FTS3 Create\n")); + + rc = parseSpec(&spec, argc, argv, pzErr); + if( rc!=SQLITE_OK ) return rc; + + initStringBuffer(&schema); + append(&schema, "CREATE TABLE %_content("); + append(&schema, " docid INTEGER PRIMARY KEY,"); + appendList(&schema, spec.nColumn, spec.azContentColumn); + append(&schema, ")"); + rc = sql_exec(db, spec.zDb, spec.zName, stringBufferData(&schema)); + stringBufferDestroy(&schema); + if( rc!=SQLITE_OK ) goto out; + + rc = sql_exec(db, spec.zDb, spec.zName, + "create table %_segments(" + " blockid INTEGER PRIMARY KEY," + " block blob" + ");" + ); + if( rc!=SQLITE_OK ) goto out; + + rc = sql_exec(db, spec.zDb, spec.zName, + "create table %_segdir(" + " level integer," + " idx integer," + " start_block integer," + " leaves_end_block integer," + " end_block integer," + " root blob," + " primary key(level, idx)" + ");"); + if( rc!=SQLITE_OK ) goto out; + + rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); + +out: + clearTableSpec(&spec); + return rc; +} + +/* Decide how to handle an SQL query. */ +static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + fulltext_vtab *v = (fulltext_vtab *)pVTab; + int i; + TRACE(("FTS3 BestIndex\n")); + + for(i=0; inConstraint; ++i){ + const struct sqlite3_index_constraint *pConstraint; + pConstraint = &pInfo->aConstraint[i]; + if( pConstraint->usable ) { + if( (pConstraint->iColumn==-1 || pConstraint->iColumn==v->nColumn+1) && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + pInfo->idxNum = QUERY_DOCID; /* lookup by docid */ + TRACE(("FTS3 QUERY_DOCID\n")); + } else if( pConstraint->iColumn>=0 && pConstraint->iColumn<=v->nColumn && + pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* full-text search */ + pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; + TRACE(("FTS3 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); + } else continue; + + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + + /* An arbitrary value for now. + * TODO: Perhaps docid matches should be considered cheaper than + * full-text searches. */ + pInfo->estimatedCost = 1.0; + + return SQLITE_OK; + } + } + pInfo->idxNum = QUERY_GENERIC; + return SQLITE_OK; +} + +static int fulltextDisconnect(sqlite3_vtab *pVTab){ + TRACE(("FTS3 Disconnect %p\n", pVTab)); + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextDestroy(sqlite3_vtab *pVTab){ + fulltext_vtab *v = (fulltext_vtab *)pVTab; + int rc; + + TRACE(("FTS3 Destroy %p\n", pVTab)); + rc = sql_exec(v->db, v->zDb, v->zName, + "drop table if exists %_content;" + "drop table if exists %_segments;" + "drop table if exists %_segdir;" + ); + if( rc!=SQLITE_OK ) return rc; + + fulltext_vtab_destroy((fulltext_vtab *)pVTab); + return SQLITE_OK; +} + +static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + fulltext_cursor *c; + + c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); + /* sqlite will initialize c->base */ + *ppCursor = &c->base; + TRACE(("FTS3 Open %p: %p\n", pVTab, c)); + + return SQLITE_OK; +} + + +/* Free all of the dynamically allocated memory held by *q +*/ +static void queryClear(Query *q){ + int i; + for(i = 0; i < q->nTerms; ++i){ + free(q->pTerms[i].pTerm); + } + free(q->pTerms); + CLEAR(q); +} + +/* Free all of the dynamically allocated memory held by the +** Snippet +*/ +static void snippetClear(Snippet *p){ + free(p->aMatch); + free(p->zOffset); + free(p->zSnippet); + CLEAR(p); +} +/* +** Append a single entry to the p->aMatch[] log. +*/ +static void snippetAppendMatch( + Snippet *p, /* Append the entry to this snippet */ + int iCol, int iTerm, /* The column and query term */ + int iStart, int nByte /* Offset and size of the match */ +){ + int i; + struct snippetMatch *pMatch; + if( p->nMatch+1>=p->nAlloc ){ + p->nAlloc = p->nAlloc*2 + 10; + p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); + if( p->aMatch==0 ){ + p->nMatch = 0; + p->nAlloc = 0; + return; + } + } + i = p->nMatch++; + pMatch = &p->aMatch[i]; + pMatch->iCol = iCol; + pMatch->iTerm = iTerm; + pMatch->iStart = iStart; + pMatch->nByte = nByte; +} + +/* +** Sizing information for the circular buffer used in snippetOffsetsOfColumn() +*/ +#define FTS3_ROTOR_SZ (32) +#define FTS3_ROTOR_MASK (FTS3_ROTOR_SZ-1) + +/* +** Add entries to pSnippet->aMatch[] for every match that occurs against +** document zDoc[0..nDoc-1] which is stored in column iColumn. +*/ +static void snippetOffsetsOfColumn( + Query *pQuery, + Snippet *pSnippet, + int iColumn, + const char *zDoc, + int nDoc +){ + const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ + sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ + sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ + fulltext_vtab *pVtab; /* The full text index */ + int nColumn; /* Number of columns in the index */ + const QueryTerm *aTerm; /* Query string terms */ + int nTerm; /* Number of query string terms */ + int i, j; /* Loop counters */ + int rc; /* Return code */ + unsigned int match, prevMatch; /* Phrase search bitmasks */ + const char *zToken; /* Next token from the tokenizer */ + int nToken; /* Size of zToken */ + int iBegin, iEnd, iPos; /* Offsets of beginning and end */ + + /* The following variables keep a circular buffer of the last + ** few tokens */ + unsigned int iRotor = 0; /* Index of current token */ + int iRotorBegin[FTS3_ROTOR_SZ]; /* Beginning offset of token */ + int iRotorLen[FTS3_ROTOR_SZ]; /* Length of token */ + + pVtab = pQuery->pFts; + nColumn = pVtab->nColumn; + pTokenizer = pVtab->pTokenizer; + pTModule = pTokenizer->pModule; + rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); + if( rc ) return; + pTCursor->pTokenizer = pTokenizer; + aTerm = pQuery->pTerms; + nTerm = pQuery->nTerms; + if( nTerm>=FTS3_ROTOR_SZ ){ + nTerm = FTS3_ROTOR_SZ - 1; + } + prevMatch = 0; + while(1){ + rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); + if( rc ) break; + iRotorBegin[iRotor&FTS3_ROTOR_MASK] = iBegin; + iRotorLen[iRotor&FTS3_ROTOR_MASK] = iEnd-iBegin; + match = 0; + for(i=0; i=0 && iColnToken ) continue; + if( !aTerm[i].isPrefix && aTerm[i].nTerm1 && (prevMatch & (1<=0; j--){ + int k = (iRotor-j) & FTS3_ROTOR_MASK; + snippetAppendMatch(pSnippet, iColumn, i-j, + iRotorBegin[k], iRotorLen[k]); + } + } + } + prevMatch = match<<1; + iRotor++; + } + pTModule->xClose(pTCursor); +} + + +/* +** Compute all offsets for the current row of the query. +** If the offsets have already been computed, this routine is a no-op. +*/ +static void snippetAllOffsets(fulltext_cursor *p){ + int nColumn; + int iColumn, i; + int iFirst, iLast; + fulltext_vtab *pFts; + + if( p->snippet.nMatch ) return; + if( p->q.nTerms==0 ) return; + pFts = p->q.pFts; + nColumn = pFts->nColumn; + iColumn = (p->iCursorType - QUERY_FULLTEXT); + if( iColumn<0 || iColumn>=nColumn ){ + iFirst = 0; + iLast = nColumn-1; + }else{ + iFirst = iColumn; + iLast = iColumn; + } + for(i=iFirst; i<=iLast; i++){ + const char *zDoc; + int nDoc; + zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); + nDoc = sqlite3_column_bytes(p->pStmt, i+1); + snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); + } +} + +/* +** Convert the information in the aMatch[] array of the snippet +** into the string zOffset[0..nOffset-1]. +*/ +static void snippetOffsetText(Snippet *p){ + int i; + int cnt = 0; + StringBuffer sb; + char zBuf[200]; + if( p->zOffset ) return; + initStringBuffer(&sb); + for(i=0; inMatch; i++){ + struct snippetMatch *pMatch = &p->aMatch[i]; + zBuf[0] = ' '; + sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, + pMatch->iTerm, pMatch->iStart, pMatch->nByte); + append(&sb, zBuf); + cnt++; + } + p->zOffset = stringBufferData(&sb); + p->nOffset = stringBufferLength(&sb); +} + +/* +** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set +** of matching words some of which might be in zDoc. zDoc is column +** number iCol. +** +** iBreak is suggested spot in zDoc where we could begin or end an +** excerpt. Return a value similar to iBreak but possibly adjusted +** to be a little left or right so that the break point is better. +*/ +static int wordBoundary( + int iBreak, /* The suggested break point */ + const char *zDoc, /* Document text */ + int nDoc, /* Number of bytes in zDoc[] */ + struct snippetMatch *aMatch, /* Matching words */ + int nMatch, /* Number of entries in aMatch[] */ + int iCol /* The column number for zDoc[] */ +){ + int i; + if( iBreak<=10 ){ + return 0; + } + if( iBreak>=nDoc-10 ){ + return nDoc; + } + for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ + return aMatch[i-1].iStart; + } + } + for(i=1; i<=10; i++){ + if( safe_isspace(zDoc[iBreak-i]) ){ + return iBreak - i + 1; + } + if( safe_isspace(zDoc[iBreak+i]) ){ + return iBreak + i + 1; + } + } + return iBreak; +} + + + +/* +** Allowed values for Snippet.aMatch[].snStatus +*/ +#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ +#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ + +/* +** Generate the text of a snippet. +*/ +static void snippetText( + fulltext_cursor *pCursor, /* The cursor we need the snippet for */ + const char *zStartMark, /* Markup to appear before each match */ + const char *zEndMark, /* Markup to appear after each match */ + const char *zEllipsis /* Ellipsis mark */ +){ + int i, j; + struct snippetMatch *aMatch; + int nMatch; + int nDesired; + StringBuffer sb; + int tailCol; + int tailOffset; + int iCol; + int nDoc; + const char *zDoc; + int iStart, iEnd; + int tailEllipsis = 0; + int iMatch; + + + free(pCursor->snippet.zSnippet); + pCursor->snippet.zSnippet = 0; + aMatch = pCursor->snippet.aMatch; + nMatch = pCursor->snippet.nMatch; + initStringBuffer(&sb); + + for(i=0; iq.nTerms; i++){ + for(j=0; j0; i++){ + if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; + nDesired--; + iCol = aMatch[i].iCol; + zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); + iStart = aMatch[i].iStart - 40; + iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); + if( iStart<=10 ){ + iStart = 0; + } + if( iCol==tailCol && iStart<=tailOffset+20 ){ + iStart = tailOffset; + } + if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ + trimWhiteSpace(&sb); + appendWhiteSpace(&sb); + append(&sb, zEllipsis); + appendWhiteSpace(&sb); + } + iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; + iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); + if( iEnd>=nDoc-10 ){ + iEnd = nDoc; + tailEllipsis = 0; + }else{ + tailEllipsis = 1; + } + while( iMatchsnippet.zSnippet = stringBufferData(&sb); + pCursor->snippet.nSnippet = stringBufferLength(&sb); +} + + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fulltextClose(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + TRACE(("FTS3 Close %p\n", c)); + sqlite3_finalize(c->pStmt); + queryClear(&c->q); + snippetClear(&c->snippet); + if( c->result.nData!=0 ) dlrDestroy(&c->reader); + dataBufferDestroy(&c->result); + free(c); + return SQLITE_OK; +} + +static int fulltextNext(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + int rc; + + TRACE(("FTS3 Next %p\n", pCursor)); + snippetClear(&c->snippet); + if( c->iCursorType < QUERY_FULLTEXT ){ + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + switch( rc ){ + case SQLITE_ROW: + c->eof = 0; + return SQLITE_OK; + case SQLITE_DONE: + c->eof = 1; + return SQLITE_OK; + default: + c->eof = 1; + return rc; + } + } else { /* full-text query */ + rc = sqlite3_reset(c->pStmt); + if( rc!=SQLITE_OK ) return rc; + + if( c->result.nData==0 || dlrAtEnd(&c->reader) ){ + c->eof = 1; + return SQLITE_OK; + } + rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader)); + dlrStep(&c->reader); + if( rc!=SQLITE_OK ) return rc; + /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ + rc = sqlite3_step(c->pStmt); + if( rc==SQLITE_ROW ){ /* the case we expect */ + c->eof = 0; + return SQLITE_OK; + } + /* an error occurred; abort */ + return rc==SQLITE_DONE ? SQLITE_ERROR : rc; + } +} + + +/* TODO(shess) If we pushed LeafReader to the top of the file, or to +** another file, term_select() could be pushed above +** docListOfTerm(). +*/ +static int termSelect(fulltext_vtab *v, int iColumn, + const char *pTerm, int nTerm, int isPrefix, + DocListType iType, DataBuffer *out); + +/* Return a DocList corresponding to the query term *pTerm. If *pTerm +** is the first term of a phrase query, go ahead and evaluate the phrase +** query and return the doclist for the entire phrase query. +** +** The resulting DL_DOCIDS doclist is stored in pResult, which is +** overwritten. +*/ +static int docListOfTerm( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* column to restrict to. No restriction if >=nColumn */ + QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ + DataBuffer *pResult /* Write the result here */ +){ + DataBuffer left, right, new; + int i, rc; + + /* No phrase search if no position info. */ + assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS ); + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&left, 0); + rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix, + 0nPhrase ? DL_POSITIONS : DL_DOCIDS, &left); + if( rc ) return rc; + for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){ + dataBufferInit(&right, 0); + rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, + pQTerm[i].isPrefix, DL_POSITIONS, &right); + if( rc ){ + dataBufferDestroy(&left); + return rc; + } + dataBufferInit(&new, 0); + docListPhraseMerge(left.pData, left.nData, right.pData, right.nData, + inPhrase ? DL_POSITIONS : DL_DOCIDS, &new); + dataBufferDestroy(&left); + dataBufferDestroy(&right); + left = new; + } + *pResult = left; + return SQLITE_OK; +} + +/* Add a new term pTerm[0..nTerm-1] to the query *q. +*/ +static void queryAdd(Query *q, const char *pTerm, int nTerm){ + QueryTerm *t; + ++q->nTerms; + q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); + if( q->pTerms==0 ){ + q->nTerms = 0; + return; + } + t = &q->pTerms[q->nTerms - 1]; + CLEAR(t); + t->pTerm = malloc(nTerm+1); + memcpy(t->pTerm, pTerm, nTerm); + t->pTerm[nTerm] = 0; + t->nTerm = nTerm; + t->isOr = q->nextIsOr; + t->isPrefix = 0; + q->nextIsOr = 0; + t->iColumn = q->nextColumn; + q->nextColumn = q->dfltColumn; +} + +/* +** Check to see if the string zToken[0...nToken-1] matches any +** column name in the virtual table. If it does, +** return the zero-indexed column number. If not, return -1. +*/ +static int checkColumnSpecifier( + fulltext_vtab *pVtab, /* The virtual table */ + const char *zToken, /* Text of the token */ + int nToken /* Number of characters in the token */ +){ + int i; + for(i=0; inColumn; i++){ + if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 + && pVtab->azColumn[i][nToken]==0 ){ + return i; + } + } + return -1; +} + +/* +** Parse the text at pSegment[0..nSegment-1]. Add additional terms +** to the query being assemblied in pQuery. +** +** inPhrase is true if pSegment[0..nSegement-1] is contained within +** double-quotes. If inPhrase is true, then the first term +** is marked with the number of terms in the phrase less one and +** OR and "-" syntax is ignored. If inPhrase is false, then every +** term found is marked with nPhrase=0 and OR and "-" syntax is significant. +*/ +static int tokenizeSegment( + sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ + const char *pSegment, int nSegment, /* Query expression being parsed */ + int inPhrase, /* True if within "..." */ + Query *pQuery /* Append results here */ +){ + const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCursor; + int firstIndex = pQuery->nTerms; + int iCol; + int nTerm = 1; + + int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); + if( rc!=SQLITE_OK ) return rc; + pCursor->pTokenizer = pTokenizer; + + while( 1 ){ + const char *pToken; + int nToken, iBegin, iEnd, iPos; + + rc = pModule->xNext(pCursor, + &pToken, &nToken, + &iBegin, &iEnd, &iPos); + if( rc!=SQLITE_OK ) break; + if( !inPhrase && + pSegment[iEnd]==':' && + (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ + pQuery->nextColumn = iCol; + continue; + } + if( !inPhrase && pQuery->nTerms>0 && nToken==2 + && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ + pQuery->nextIsOr = 1; + continue; + } + queryAdd(pQuery, pToken, nToken); + if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ + pQuery->pTerms[pQuery->nTerms-1].isNot = 1; + } + if( iEndpTerms[pQuery->nTerms-1].isPrefix = 1; + } + pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; + if( inPhrase ){ + nTerm++; + } + } + + if( inPhrase && pQuery->nTerms>firstIndex ){ + pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; + } + + return pModule->xClose(pCursor); +} + +/* Parse a query string, yielding a Query object pQuery. +** +** The calling function will need to queryClear() to clean up +** the dynamically allocated memory held by pQuery. +*/ +static int parseQuery( + fulltext_vtab *v, /* The fulltext index */ + const char *zInput, /* Input text of the query string */ + int nInput, /* Size of the input text */ + int dfltColumn, /* Default column of the index to match against */ + Query *pQuery /* Write the parse results here. */ +){ + int iInput, inPhrase = 0; + + if( zInput==0 ) nInput = 0; + if( nInput<0 ) nInput = strlen(zInput); + pQuery->nTerms = 0; + pQuery->pTerms = NULL; + pQuery->nextIsOr = 0; + pQuery->nextColumn = dfltColumn; + pQuery->dfltColumn = dfltColumn; + pQuery->pFts = v; + + for(iInput=0; iInputiInput ){ + tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, + pQuery); + } + iInput = i; + if( i=nColumn +** they are allowed to match against any column. +*/ +static int fulltextQuery( + fulltext_vtab *v, /* The full text index */ + int iColumn, /* Match against this column by default */ + const char *zInput, /* The query string */ + int nInput, /* Number of bytes in zInput[] */ + DataBuffer *pResult, /* Write the result doclist here */ + Query *pQuery /* Put parsed query string here */ +){ + int i, iNext, rc; + DataBuffer left, right, or, new; + int nNot = 0; + QueryTerm *aTerm; + + /* TODO(shess) Instead of flushing pendingTerms, we could query for + ** the relevant term and merge the doclist into what we receive from + ** the database. Wait and see if this is a common issue, first. + ** + ** A good reason not to flush is to not generate update-related + ** error codes from here. + */ + + /* Flush any buffered updates before executing the query. */ + rc = flushPendingTerms(v); + if( rc!=SQLITE_OK ) return rc; + + /* TODO(shess) I think that the queryClear() calls below are not + ** necessary, because fulltextClose() already clears the query. + */ + rc = parseQuery(v, zInput, nInput, iColumn, pQuery); + if( rc!=SQLITE_OK ) return rc; + + /* Empty or NULL queries return no results. */ + if( pQuery->nTerms==0 ){ + dataBufferInit(pResult, 0); + return SQLITE_OK; + } + + /* Merge AND terms. */ + /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */ + aTerm = pQuery->pTerms; + for(i = 0; inTerms; i=iNext){ + if( aTerm[i].isNot ){ + /* Handle all NOT terms in a separate pass */ + nNot++; + iNext = i + aTerm[i].nPhrase+1; + continue; + } + iNext = i + aTerm[i].nPhrase + 1; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); + if( rc ){ + if( i!=nNot ) dataBufferDestroy(&left); + queryClear(pQuery); + return rc; + } + while( iNextnTerms && aTerm[iNext].isOr ){ + rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or); + iNext += aTerm[iNext].nPhrase + 1; + if( rc ){ + if( i!=nNot ) dataBufferDestroy(&left); + dataBufferDestroy(&right); + queryClear(pQuery); + return rc; + } + dataBufferInit(&new, 0); + docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&or); + right = new; + } + if( i==nNot ){ /* first term processed. */ + left = right; + }else{ + dataBufferInit(&new, 0); + docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&left); + left = new; + } + } + + if( nNot==pQuery->nTerms ){ + /* We do not yet know how to handle a query of only NOT terms */ + return SQLITE_ERROR; + } + + /* Do the EXCEPT terms */ + for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ + if( !aTerm[i].isNot ) continue; + rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); + if( rc ){ + queryClear(pQuery); + dataBufferDestroy(&left); + return rc; + } + dataBufferInit(&new, 0); + docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new); + dataBufferDestroy(&right); + dataBufferDestroy(&left); + left = new; + } + + *pResult = left; + return rc; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==QUERY_GENERIC then do a full table scan against +** the %_content table. +** +** If idxNum==QUERY_DOCID then do a docid lookup for a single entry +** in the %_content table. +** +** If idxNum>=QUERY_FULLTEXT then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. +*/ +/* TODO(shess) Upgrade the cursor initialization and destruction to +** account for fulltextFilter() being called multiple times on the +** same cursor. The current solution is very fragile. Apply fix to +** fts3 as appropriate. +*/ +static int fulltextFilter( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, const char *idxStr, /* Which indexing scheme to use */ + int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ +){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + int rc; + StringBuffer sb; + + TRACE(("FTS3 Filter %p\n",pCursor)); + + initStringBuffer(&sb); + append(&sb, "SELECT docid, "); + appendList(&sb, v->nColumn, v->azContentColumn); + append(&sb, " FROM %_content"); + if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?"); + sqlite3_finalize(c->pStmt); + rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, stringBufferData(&sb)); + stringBufferDestroy(&sb); + if( rc!=SQLITE_OK ) return rc; + + c->iCursorType = idxNum; + switch( idxNum ){ + case QUERY_GENERIC: + break; + + case QUERY_DOCID: + rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); + if( rc!=SQLITE_OK ) return rc; + break; + + default: /* full-text search */ + { + const char *zQuery = (const char *)sqlite3_value_text(argv[0]); + assert( idxNum<=QUERY_FULLTEXT+v->nColumn); + assert( argc==1 ); + queryClear(&c->q); + if( c->result.nData!=0 ){ + /* This case happens if the same cursor is used repeatedly. */ + dlrDestroy(&c->reader); + dataBufferReset(&c->result); + }else{ + dataBufferInit(&c->result, 0); + } + rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q); + if( rc!=SQLITE_OK ) return rc; + if( c->result.nData!=0 ){ + dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData); + } + break; + } + } + + return fulltextNext(pCursor); +} + +/* This is the xEof method of the virtual table. The SQLite core +** calls this routine to find out if it has reached the end of +** a query's results set. +*/ +static int fulltextEof(sqlite3_vtab_cursor *pCursor){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + return c->eof; +} + +/* This is the xColumn method of the virtual table. The SQLite +** core calls this method during a query when it needs the value +** of a column from the virtual table. This method needs to use +** one of the sqlite3_result_*() routines to store the requested +** value back in the pContext. +*/ +static int fulltextColumn(sqlite3_vtab_cursor *pCursor, + sqlite3_context *pContext, int idxCol){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + fulltext_vtab *v = cursor_vtab(c); + + if( idxColnColumn ){ + sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); + sqlite3_result_value(pContext, pVal); + }else if( idxCol==v->nColumn ){ + /* The extra column whose name is the same as the table. + ** Return a blob which is a pointer to the cursor + */ + sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); + }else if( idxCol==v->nColumn+1 ){ + /* The docid column, which is an alias for rowid. */ + sqlite3_value *pVal = sqlite3_column_value(c->pStmt, 0); + sqlite3_result_value(pContext, pVal); + } + return SQLITE_OK; +} + +/* This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. fts3 +** exposes %_content.docid as the rowid for the virtual table. The +** rowid should be written to *pRowid. +*/ +static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + fulltext_cursor *c = (fulltext_cursor *) pCursor; + + *pRowid = sqlite3_column_int64(c->pStmt, 0); + return SQLITE_OK; +} + +/* Add all terms in [zText] to pendingTerms table. If [iColumn] > 0, +** we also store positions and offsets in the hash table using that +** column number. +*/ +static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid, + const char *zText, int iColumn){ + sqlite3_tokenizer *pTokenizer = v->pTokenizer; + sqlite3_tokenizer_cursor *pCursor; + const char *pToken; + int nTokenBytes; + int iStartOffset, iEndOffset, iPosition; + int rc; + + rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); + if( rc!=SQLITE_OK ) return rc; + + pCursor->pTokenizer = pTokenizer; + while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, + &pToken, &nTokenBytes, + &iStartOffset, &iEndOffset, + &iPosition) ){ + DLCollector *p; + int nData; /* Size of doclist before our update. */ + + /* Positions can't be negative; we use -1 as a terminator internally. */ + if( iPosition<0 ){ + pTokenizer->pModule->xClose(pCursor); + return SQLITE_ERROR; + } + + p = fts3HashFind(&v->pendingTerms, pToken, nTokenBytes); + if( p==NULL ){ + nData = 0; + p = dlcNew(iDocid, DL_DEFAULT); + fts3HashInsert(&v->pendingTerms, pToken, nTokenBytes, p); + + /* Overhead for our hash table entry, the key, and the value. */ + v->nPendingData += sizeof(struct fts3HashElem)+sizeof(*p)+nTokenBytes; + }else{ + nData = p->b.nData; + if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid); + } + if( iColumn>=0 ){ + dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset); + } + + /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */ + v->nPendingData += p->b.nData-nData; + } + + /* TODO(shess) Check return? Should this be able to cause errors at + ** this point? Actually, same question about sqlite3_finalize(), + ** though one could argue that failure there means that the data is + ** not durable. *ponder* + */ + pTokenizer->pModule->xClose(pCursor); + return rc; +} + +/* Add doclists for all terms in [pValues] to pendingTerms table. */ +static int insertTerms(fulltext_vtab *v, sqlite_int64 iDocid, + sqlite3_value **pValues){ + int i; + for(i = 0; i < v->nColumn ; ++i){ + char *zText = (char*)sqlite3_value_text(pValues[i]); + int rc = buildTerms(v, iDocid, zText, i); + if( rc!=SQLITE_OK ) return rc; + } + return SQLITE_OK; +} + +/* Add empty doclists for all terms in the given row's content to +** pendingTerms. +*/ +static int deleteTerms(fulltext_vtab *v, sqlite_int64 iDocid){ + const char **pValues; + int i, rc; + + /* TODO(shess) Should we allow such tables at all? */ + if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR; + + rc = content_select(v, iDocid, &pValues); + if( rc!=SQLITE_OK ) return rc; + + for(i = 0 ; i < v->nColumn; ++i) { + rc = buildTerms(v, iDocid, pValues[i], -1); + if( rc!=SQLITE_OK ) break; + } + + freeStringArray(v->nColumn, pValues); + return SQLITE_OK; +} + +/* TODO(shess) Refactor the code to remove this forward decl. */ +static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid); + +/* Insert a row into the %_content table; set *piDocid to be the ID of the +** new row. Add doclists for terms to pendingTerms. +*/ +static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestDocid, + sqlite3_value **pValues, sqlite_int64 *piDocid){ + int rc; + + rc = content_insert(v, pRequestDocid, pValues); /* execute an SQL INSERT */ + if( rc!=SQLITE_OK ) return rc; + + /* docid column is an alias for rowid. */ + *piDocid = sqlite3_last_insert_rowid(v->db); + rc = initPendingTerms(v, *piDocid); + if( rc!=SQLITE_OK ) return rc; + + return insertTerms(v, *piDocid, pValues); +} + +/* Delete a row from the %_content table; add empty doclists for terms +** to pendingTerms. +*/ +static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){ + int rc = initPendingTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = deleteTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + return content_delete(v, iRow); /* execute an SQL DELETE */ +} + +/* Update a row in the %_content table; add delete doclists to +** pendingTerms for old terms not in the new data, add insert doclists +** to pendingTerms for terms in the new data. +*/ +static int index_update(fulltext_vtab *v, sqlite_int64 iRow, + sqlite3_value **pValues){ + int rc = initPendingTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + /* Generate an empty doclist for each term that previously appeared in this + * row. */ + rc = deleteTerms(v, iRow); + if( rc!=SQLITE_OK ) return rc; + + rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ + if( rc!=SQLITE_OK ) return rc; + + /* Now add positions for terms which appear in the updated row. */ + return insertTerms(v, iRow, pValues); +} + +/*******************************************************************/ +/* InteriorWriter is used to collect terms and block references into +** interior nodes in %_segments. See commentary at top of file for +** format. +*/ + +/* How large interior nodes can grow. */ +#define INTERIOR_MAX 2048 + +/* Minimum number of terms per interior node (except the root). This +** prevents large terms from making the tree too skinny - must be >0 +** so that the tree always makes progress. Note that the min tree +** fanout will be INTERIOR_MIN_TERMS+1. +*/ +#define INTERIOR_MIN_TERMS 7 +#if INTERIOR_MIN_TERMS<1 +# error INTERIOR_MIN_TERMS must be greater than 0. +#endif + +/* ROOT_MAX controls how much data is stored inline in the segment +** directory. +*/ +/* TODO(shess) Push ROOT_MAX down to whoever is writing things. It's +** only here so that interiorWriterRootInfo() and leafWriterRootInfo() +** can both see it, but if the caller passed it in, we wouldn't even +** need a define. +*/ +#define ROOT_MAX 1024 +#if ROOT_MAXterm, 0); + dataBufferReplace(&block->term, pTerm, nTerm); + + n = putVarint(c, iHeight); + n += putVarint(c+n, iChildBlock); + dataBufferInit(&block->data, INTERIOR_MAX); + dataBufferReplace(&block->data, c, n); + + return block; +} + +#ifndef NDEBUG +/* Verify that the data is readable as an interior node. */ +static void interiorBlockValidate(InteriorBlock *pBlock){ + const char *pData = pBlock->data.pData; + int nData = pBlock->data.nData; + int n, iDummy; + sqlite_int64 iBlockid; + + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + + /* Must lead with height of node as a varint(n), n>0 */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>0 ); + assert( n0 ); + assert( n<=nData ); + pData += n; + nData -= n; + + /* Zero or more terms of positive length */ + if( nData!=0 ){ + /* First term is not delta-encoded. */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>0 ); + assert( n+iDummy>0); + assert( n+iDummy<=nData ); + pData += n+iDummy; + nData -= n+iDummy; + + /* Following terms delta-encoded. */ + while( nData!=0 ){ + /* Length of shared prefix. */ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>=0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0); + assert( n+iDummy<=nData ); + pData += n+iDummy; + nData -= n+iDummy; + } + } +} +#define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x) +#else +#define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 ) +#endif + +typedef struct InteriorWriter { + int iHeight; /* from 0 at leaves. */ + InteriorBlock *first, *last; + struct InteriorWriter *parentWriter; + + DataBuffer term; /* Last term written to block "last". */ + sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */ +#ifndef NDEBUG + sqlite_int64 iLastChildBlock; /* for consistency checks. */ +#endif +} InteriorWriter; + +/* Initialize an interior node where pTerm[nTerm] marks the leftmost +** term in the tree. iChildBlock is the leftmost child block at the +** next level down the tree. +*/ +static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm, + sqlite_int64 iChildBlock, + InteriorWriter *pWriter){ + InteriorBlock *block; + assert( iHeight>0 ); + CLEAR(pWriter); + + pWriter->iHeight = iHeight; + pWriter->iOpeningChildBlock = iChildBlock; +#ifndef NDEBUG + pWriter->iLastChildBlock = iChildBlock; +#endif + block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm); + pWriter->last = pWriter->first = block; + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); + dataBufferInit(&pWriter->term, 0); +} + +/* Append the child node rooted at iChildBlock to the interior node, +** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree. +*/ +static void interiorWriterAppend(InteriorWriter *pWriter, + const char *pTerm, int nTerm, + sqlite_int64 iChildBlock){ + char c[VARINT_MAX+VARINT_MAX]; + int n, nPrefix = 0; + + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); + + /* The first term written into an interior node is actually + ** associated with the second child added (the first child was added + ** in interiorWriterInit, or in the if clause at the bottom of this + ** function). That term gets encoded straight up, with nPrefix left + ** at 0. + */ + if( pWriter->term.nData==0 ){ + n = putVarint(c, nTerm); + }else{ + while( nPrefixterm.nData && + pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ + nPrefix++; + } + + n = putVarint(c, nPrefix); + n += putVarint(c+n, nTerm-nPrefix); + } + +#ifndef NDEBUG + pWriter->iLastChildBlock++; +#endif + assert( pWriter->iLastChildBlock==iChildBlock ); + + /* Overflow to a new block if the new term makes the current block + ** too big, and the current block already has enough terms. + */ + if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX && + iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){ + pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock, + pTerm, nTerm); + pWriter->last = pWriter->last->next; + pWriter->iOpeningChildBlock = iChildBlock; + dataBufferReset(&pWriter->term); + }else{ + dataBufferAppend2(&pWriter->last->data, c, n, + pTerm+nPrefix, nTerm-nPrefix); + dataBufferReplace(&pWriter->term, pTerm, nTerm); + } + ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); +} + +/* Free the space used by pWriter, including the linked-list of +** InteriorBlocks, and parentWriter, if present. +*/ +static int interiorWriterDestroy(InteriorWriter *pWriter){ + InteriorBlock *block = pWriter->first; + + while( block!=NULL ){ + InteriorBlock *b = block; + block = block->next; + dataBufferDestroy(&b->term); + dataBufferDestroy(&b->data); + free(b); + } + if( pWriter->parentWriter!=NULL ){ + interiorWriterDestroy(pWriter->parentWriter); + free(pWriter->parentWriter); + } + dataBufferDestroy(&pWriter->term); + SCRAMBLE(pWriter); + return SQLITE_OK; +} + +/* If pWriter can fit entirely in ROOT_MAX, return it as the root info +** directly, leaving *piEndBlockid unchanged. Otherwise, flush +** pWriter to %_segments, building a new layer of interior nodes, and +** recursively ask for their root into. +*/ +static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter, + char **ppRootInfo, int *pnRootInfo, + sqlite_int64 *piEndBlockid){ + InteriorBlock *block = pWriter->first; + sqlite_int64 iBlockid = 0; + int rc; + + /* If we can fit the segment inline */ + if( block==pWriter->last && block->data.nDatadata.pData; + *pnRootInfo = block->data.nData; + return SQLITE_OK; + } + + /* Flush the first block to %_segments, and create a new level of + ** interior node. + */ + ASSERT_VALID_INTERIOR_BLOCK(block); + rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + *piEndBlockid = iBlockid; + + pWriter->parentWriter = malloc(sizeof(*pWriter->parentWriter)); + interiorWriterInit(pWriter->iHeight+1, + block->term.pData, block->term.nData, + iBlockid, pWriter->parentWriter); + + /* Flush additional blocks and append to the higher interior + ** node. + */ + for(block=block->next; block!=NULL; block=block->next){ + ASSERT_VALID_INTERIOR_BLOCK(block); + rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + *piEndBlockid = iBlockid; + + interiorWriterAppend(pWriter->parentWriter, + block->term.pData, block->term.nData, iBlockid); + } + + /* Parent node gets the chance to be the root. */ + return interiorWriterRootInfo(v, pWriter->parentWriter, + ppRootInfo, pnRootInfo, piEndBlockid); +} + +/****************************************************************/ +/* InteriorReader is used to read off the data from an interior node +** (see comment at top of file for the format). +*/ +typedef struct InteriorReader { + const char *pData; + int nData; + + DataBuffer term; /* previous term, for decoding term delta. */ + + sqlite_int64 iBlockid; +} InteriorReader; + +static void interiorReaderDestroy(InteriorReader *pReader){ + dataBufferDestroy(&pReader->term); + SCRAMBLE(pReader); +} + +/* TODO(shess) The assertions are great, but what if we're in NDEBUG +** and the blob is empty or otherwise contains suspect data? +*/ +static void interiorReaderInit(const char *pData, int nData, + InteriorReader *pReader){ + int n, nTerm; + + /* Require at least the leading flag byte */ + assert( nData>0 ); + assert( pData[0]!='\0' ); + + CLEAR(pReader); + + /* Decode the base blockid, and set the cursor to the first term. */ + n = getVarint(pData+1, &pReader->iBlockid); + assert( 1+n<=nData ); + pReader->pData = pData+1+n; + pReader->nData = nData-(1+n); + + /* A single-child interior node (such as when a leaf node was too + ** large for the segment directory) won't have any terms. + ** Otherwise, decode the first term. + */ + if( pReader->nData==0 ){ + dataBufferInit(&pReader->term, 0); + }else{ + n = getVarint32(pReader->pData, &nTerm); + dataBufferInit(&pReader->term, nTerm); + dataBufferReplace(&pReader->term, pReader->pData+n, nTerm); + assert( n+nTerm<=pReader->nData ); + pReader->pData += n+nTerm; + pReader->nData -= n+nTerm; + } +} + +static int interiorReaderAtEnd(InteriorReader *pReader){ + return pReader->term.nData==0; +} + +static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){ + return pReader->iBlockid; +} + +static int interiorReaderTermBytes(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + return pReader->term.nData; +} +static const char *interiorReaderTerm(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + return pReader->term.pData; +} + +/* Step forward to the next term in the node. */ +static void interiorReaderStep(InteriorReader *pReader){ + assert( !interiorReaderAtEnd(pReader) ); + + /* If the last term has been read, signal eof, else construct the + ** next term. + */ + if( pReader->nData==0 ){ + dataBufferReset(&pReader->term); + }else{ + int n, nPrefix, nSuffix; + + n = getVarint32(pReader->pData, &nPrefix); + n += getVarint32(pReader->pData+n, &nSuffix); + + /* Truncate the current term and append suffix data. */ + pReader->term.nData = nPrefix; + dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); + + assert( n+nSuffix<=pReader->nData ); + pReader->pData += n+nSuffix; + pReader->nData -= n+nSuffix; + } + pReader->iBlockid++; +} + +/* Compare the current term to pTerm[nTerm], returning strcmp-style +** results. If isPrefix, equality means equal through nTerm bytes. +*/ +static int interiorReaderTermCmp(InteriorReader *pReader, + const char *pTerm, int nTerm, int isPrefix){ + const char *pReaderTerm = interiorReaderTerm(pReader); + int nReaderTerm = interiorReaderTermBytes(pReader); + int c, n = nReaderTerm0 ) return -1; + if( nTerm>0 ) return 1; + return 0; + } + + c = memcmp(pReaderTerm, pTerm, n); + if( c!=0 ) return c; + if( isPrefix && n==nTerm ) return 0; + return nReaderTerm - nTerm; +} + +/****************************************************************/ +/* LeafWriter is used to collect terms and associated doclist data +** into leaf blocks in %_segments (see top of file for format info). +** Expected usage is: +** +** LeafWriter writer; +** leafWriterInit(0, 0, &writer); +** while( sorted_terms_left_to_process ){ +** // data is doclist data for that term. +** rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData); +** if( rc!=SQLITE_OK ) goto err; +** } +** rc = leafWriterFinalize(v, &writer); +**err: +** leafWriterDestroy(&writer); +** return rc; +** +** leafWriterStep() may write a collected leaf out to %_segments. +** leafWriterFinalize() finishes writing any buffered data and stores +** a root node in %_segdir. leafWriterDestroy() frees all buffers and +** InteriorWriters allocated as part of writing this segment. +** +** TODO(shess) Document leafWriterStepMerge(). +*/ + +/* Put terms with data this big in their own block. */ +#define STANDALONE_MIN 1024 + +/* Keep leaf blocks below this size. */ +#define LEAF_MAX 2048 + +typedef struct LeafWriter { + int iLevel; + int idx; + sqlite_int64 iStartBlockid; /* needed to create the root info */ + sqlite_int64 iEndBlockid; /* when we're done writing. */ + + DataBuffer term; /* previous encoded term */ + DataBuffer data; /* encoding buffer */ + + /* bytes of first term in the current node which distinguishes that + ** term from the last term of the previous node. + */ + int nTermDistinct; + + InteriorWriter parentWriter; /* if we overflow */ + int has_parent; +} LeafWriter; + +static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){ + CLEAR(pWriter); + pWriter->iLevel = iLevel; + pWriter->idx = idx; + + dataBufferInit(&pWriter->term, 32); + + /* Start out with a reasonably sized block, though it can grow. */ + dataBufferInit(&pWriter->data, LEAF_MAX); +} + +#ifndef NDEBUG +/* Verify that the data is readable as a leaf node. */ +static void leafNodeValidate(const char *pData, int nData){ + int n, iDummy; + + if( nData==0 ) return; + assert( nData>0 ); + assert( pData!=0 ); + assert( pData+nData>pData ); + + /* Must lead with a varint(0) */ + n = getVarint32(pData, &iDummy); + assert( iDummy==0 ); + assert( n>0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy<=nData ); + ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); + pData += n+iDummy; + nData -= n+iDummy; + + /* Verify that trailing terms and doclists also are readable. */ + while( nData!=0 ){ + n = getVarint32(pData, &iDummy); + assert( n>0 ); + assert( iDummy>=0 ); + assert( n0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy0 ); + assert( iDummy>0 ); + assert( n+iDummy>0 ); + assert( n+iDummy<=nData ); + ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); + pData += n+iDummy; + nData -= n+iDummy; + } +} +#define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n) +#else +#define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 ) +#endif + +/* Flush the current leaf node to %_segments, and adding the resulting +** blockid and the starting term to the interior node which will +** contain it. +*/ +static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter, + int iData, int nData){ + sqlite_int64 iBlockid = 0; + const char *pStartingTerm; + int nStartingTerm, rc, n; + + /* Must have the leading varint(0) flag, plus at least some + ** valid-looking data. + */ + assert( nData>2 ); + assert( iData>=0 ); + assert( iData+nData<=pWriter->data.nData ); + ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData); + + rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid); + if( rc!=SQLITE_OK ) return rc; + assert( iBlockid!=0 ); + + /* Reconstruct the first term in the leaf for purposes of building + ** the interior node. + */ + n = getVarint32(pWriter->data.pData+iData+1, &nStartingTerm); + pStartingTerm = pWriter->data.pData+iData+1+n; + assert( pWriter->data.nData>iData+1+n+nStartingTerm ); + assert( pWriter->nTermDistinct>0 ); + assert( pWriter->nTermDistinct<=nStartingTerm ); + nStartingTerm = pWriter->nTermDistinct; + + if( pWriter->has_parent ){ + interiorWriterAppend(&pWriter->parentWriter, + pStartingTerm, nStartingTerm, iBlockid); + }else{ + interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid, + &pWriter->parentWriter); + pWriter->has_parent = 1; + } + + /* Track the span of this segment's leaf nodes. */ + if( pWriter->iEndBlockid==0 ){ + pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid; + }else{ + pWriter->iEndBlockid++; + assert( iBlockid==pWriter->iEndBlockid ); + } + + return SQLITE_OK; +} +static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){ + int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData); + if( rc!=SQLITE_OK ) return rc; + + /* Re-initialize the output buffer. */ + dataBufferReset(&pWriter->data); + + return SQLITE_OK; +} + +/* Fetch the root info for the segment. If the entire leaf fits +** within ROOT_MAX, then it will be returned directly, otherwise it +** will be flushed and the root info will be returned from the +** interior node. *piEndBlockid is set to the blockid of the last +** interior or leaf node written to disk (0 if none are written at +** all). +*/ +static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter, + char **ppRootInfo, int *pnRootInfo, + sqlite_int64 *piEndBlockid){ + /* we can fit the segment entirely inline */ + if( !pWriter->has_parent && pWriter->data.nDatadata.pData; + *pnRootInfo = pWriter->data.nData; + *piEndBlockid = 0; + return SQLITE_OK; + } + + /* Flush remaining leaf data. */ + if( pWriter->data.nData>0 ){ + int rc = leafWriterFlush(v, pWriter); + if( rc!=SQLITE_OK ) return rc; + } + + /* We must have flushed a leaf at some point. */ + assert( pWriter->has_parent ); + + /* Tenatively set the end leaf blockid as the end blockid. If the + ** interior node can be returned inline, this will be the final + ** blockid, otherwise it will be overwritten by + ** interiorWriterRootInfo(). + */ + *piEndBlockid = pWriter->iEndBlockid; + + return interiorWriterRootInfo(v, &pWriter->parentWriter, + ppRootInfo, pnRootInfo, piEndBlockid); +} + +/* Collect the rootInfo data and store it into the segment directory. +** This has the effect of flushing the segment's leaf data to +** %_segments, and also flushing any interior nodes to %_segments. +*/ +static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){ + sqlite_int64 iEndBlockid; + char *pRootInfo; + int rc, nRootInfo; + + rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + /* Don't bother storing an entirely empty segment. */ + if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK; + + return segdir_set(v, pWriter->iLevel, pWriter->idx, + pWriter->iStartBlockid, pWriter->iEndBlockid, + iEndBlockid, pRootInfo, nRootInfo); +} + +static void leafWriterDestroy(LeafWriter *pWriter){ + if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter); + dataBufferDestroy(&pWriter->term); + dataBufferDestroy(&pWriter->data); +} + +/* Encode a term into the leafWriter, delta-encoding as appropriate. +** Returns the length of the new term which distinguishes it from the +** previous term, which can be used to set nTermDistinct when a node +** boundary is crossed. +*/ +static int leafWriterEncodeTerm(LeafWriter *pWriter, + const char *pTerm, int nTerm){ + char c[VARINT_MAX+VARINT_MAX]; + int n, nPrefix = 0; + + assert( nTerm>0 ); + while( nPrefixterm.nData && + pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ + nPrefix++; + /* Failing this implies that the terms weren't in order. */ + assert( nPrefixdata.nData==0 ){ + /* Encode the node header and leading term as: + ** varint(0) + ** varint(nTerm) + ** char pTerm[nTerm] + */ + n = putVarint(c, '\0'); + n += putVarint(c+n, nTerm); + dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm); + }else{ + /* Delta-encode the term as: + ** varint(nPrefix) + ** varint(nSuffix) + ** char pTermSuffix[nSuffix] + */ + n = putVarint(c, nPrefix); + n += putVarint(c+n, nTerm-nPrefix); + dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix); + } + dataBufferReplace(&pWriter->term, pTerm, nTerm); + + return nPrefix+1; +} + +/* Used to avoid a memmove when a large amount of doclist data is in +** the buffer. This constructs a node and term header before +** iDoclistData and flushes the resulting complete node using +** leafWriterInternalFlush(). +*/ +static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + int iDoclistData){ + char c[VARINT_MAX+VARINT_MAX]; + int iData, n = putVarint(c, 0); + n += putVarint(c+n, nTerm); + + /* There should always be room for the header. Even if pTerm shared + ** a substantial prefix with the previous term, the entire prefix + ** could be constructed from earlier data in the doclist, so there + ** should be room. + */ + assert( iDoclistData>=n+nTerm ); + + iData = iDoclistData-(n+nTerm); + memcpy(pWriter->data.pData+iData, c, n); + memcpy(pWriter->data.pData+iData+n, pTerm, nTerm); + + return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData); +} + +/* Push pTerm[nTerm] along with the doclist data to the leaf layer of +** %_segments. +*/ +static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + DLReader *pReaders, int nReaders){ + char c[VARINT_MAX+VARINT_MAX]; + int iTermData = pWriter->data.nData, iDoclistData; + int i, nData, n, nActualData, nActual, rc, nTermDistinct; + + ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); + nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm); + + /* Remember nTermDistinct if opening a new node. */ + if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct; + + iDoclistData = pWriter->data.nData; + + /* Estimate the length of the merged doclist so we can leave space + ** to encode it. + */ + for(i=0, nData=0; idata, c, n); + + docListMerge(&pWriter->data, pReaders, nReaders); + ASSERT_VALID_DOCLIST(DL_DEFAULT, + pWriter->data.pData+iDoclistData+n, + pWriter->data.nData-iDoclistData-n, NULL); + + /* The actual amount of doclist data at this point could be smaller + ** than the length we encoded. Additionally, the space required to + ** encode this length could be smaller. For small doclists, this is + ** not a big deal, we can just use memmove() to adjust things. + */ + nActualData = pWriter->data.nData-(iDoclistData+n); + nActual = putVarint(c, nActualData); + assert( nActualData<=nData ); + assert( nActual<=n ); + + /* If the new doclist is big enough for force a standalone leaf + ** node, we can immediately flush it inline without doing the + ** memmove(). + */ + /* TODO(shess) This test matches leafWriterStep(), which does this + ** test before it knows the cost to varint-encode the term and + ** doclist lengths. At some point, change to + ** pWriter->data.nData-iTermData>STANDALONE_MIN. + */ + if( nTerm+nActualData>STANDALONE_MIN ){ + /* Push leaf node from before this term. */ + if( iTermData>0 ){ + rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); + if( rc!=SQLITE_OK ) return rc; + + pWriter->nTermDistinct = nTermDistinct; + } + + /* Fix the encoded doclist length. */ + iDoclistData += n - nActual; + memcpy(pWriter->data.pData+iDoclistData, c, nActual); + + /* Push the standalone leaf node. */ + rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData); + if( rc!=SQLITE_OK ) return rc; + + /* Leave the node empty. */ + dataBufferReset(&pWriter->data); + + return rc; + } + + /* At this point, we know that the doclist was small, so do the + ** memmove if indicated. + */ + if( nActualdata.pData+iDoclistData+nActual, + pWriter->data.pData+iDoclistData+n, + pWriter->data.nData-(iDoclistData+n)); + pWriter->data.nData -= n-nActual; + } + + /* Replace written length with actual length. */ + memcpy(pWriter->data.pData+iDoclistData, c, nActual); + + /* If the node is too large, break things up. */ + /* TODO(shess) This test matches leafWriterStep(), which does this + ** test before it knows the cost to varint-encode the term and + ** doclist lengths. At some point, change to + ** pWriter->data.nData>LEAF_MAX. + */ + if( iTermData+nTerm+nActualData>LEAF_MAX ){ + /* Flush out the leading data as a node */ + rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); + if( rc!=SQLITE_OK ) return rc; + + pWriter->nTermDistinct = nTermDistinct; + + /* Rebuild header using the current term */ + n = putVarint(pWriter->data.pData, 0); + n += putVarint(pWriter->data.pData+n, nTerm); + memcpy(pWriter->data.pData+n, pTerm, nTerm); + n += nTerm; + + /* There should always be room, because the previous encoding + ** included all data necessary to construct the term. + */ + assert( ndata.nData-iDoclistDatadata.pData+n, + pWriter->data.pData+iDoclistData, + pWriter->data.nData-iDoclistData); + pWriter->data.nData -= iDoclistData-n; + } + ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); + + return SQLITE_OK; +} + +/* Push pTerm[nTerm] along with the doclist data to the leaf layer of +** %_segments. +*/ +/* TODO(shess) Revise writeZeroSegment() so that doclists are +** constructed directly in pWriter->data. +*/ +static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter, + const char *pTerm, int nTerm, + const char *pData, int nData){ + int rc; + DLReader reader; + + dlrInit(&reader, DL_DEFAULT, pData, nData); + rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1); + dlrDestroy(&reader); + + return rc; +} + + +/****************************************************************/ +/* LeafReader is used to iterate over an individual leaf node. */ +typedef struct LeafReader { + DataBuffer term; /* copy of current term. */ + + const char *pData; /* data for current term. */ + int nData; +} LeafReader; + +static void leafReaderDestroy(LeafReader *pReader){ + dataBufferDestroy(&pReader->term); + SCRAMBLE(pReader); +} + +static int leafReaderAtEnd(LeafReader *pReader){ + return pReader->nData<=0; +} + +/* Access the current term. */ +static int leafReaderTermBytes(LeafReader *pReader){ + return pReader->term.nData; +} +static const char *leafReaderTerm(LeafReader *pReader){ + assert( pReader->term.nData>0 ); + return pReader->term.pData; +} + +/* Access the doclist data for the current term. */ +static int leafReaderDataBytes(LeafReader *pReader){ + int nData; + assert( pReader->term.nData>0 ); + getVarint32(pReader->pData, &nData); + return nData; +} +static const char *leafReaderData(LeafReader *pReader){ + int n, nData; + assert( pReader->term.nData>0 ); + n = getVarint32(pReader->pData, &nData); + return pReader->pData+n; +} + +static void leafReaderInit(const char *pData, int nData, + LeafReader *pReader){ + int nTerm, n; + + assert( nData>0 ); + assert( pData[0]=='\0' ); + + CLEAR(pReader); + + /* Read the first term, skipping the header byte. */ + n = getVarint32(pData+1, &nTerm); + dataBufferInit(&pReader->term, nTerm); + dataBufferReplace(&pReader->term, pData+1+n, nTerm); + + /* Position after the first term. */ + assert( 1+n+nTermpData = pData+1+n+nTerm; + pReader->nData = nData-1-n-nTerm; +} + +/* Step the reader forward to the next term. */ +static void leafReaderStep(LeafReader *pReader){ + int n, nData, nPrefix, nSuffix; + assert( !leafReaderAtEnd(pReader) ); + + /* Skip previous entry's data block. */ + n = getVarint32(pReader->pData, &nData); + assert( n+nData<=pReader->nData ); + pReader->pData += n+nData; + pReader->nData -= n+nData; + + if( !leafReaderAtEnd(pReader) ){ + /* Construct the new term using a prefix from the old term plus a + ** suffix from the leaf data. + */ + n = getVarint32(pReader->pData, &nPrefix); + n += getVarint32(pReader->pData+n, &nSuffix); + assert( n+nSuffixnData ); + pReader->term.nData = nPrefix; + dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); + + pReader->pData += n+nSuffix; + pReader->nData -= n+nSuffix; + } +} + +/* strcmp-style comparison of pReader's current term against pTerm. +** If isPrefix, equality means equal through nTerm bytes. +*/ +static int leafReaderTermCmp(LeafReader *pReader, + const char *pTerm, int nTerm, int isPrefix){ + int c, n = pReader->term.nDataterm.nData : nTerm; + if( n==0 ){ + if( pReader->term.nData>0 ) return -1; + if(nTerm>0 ) return 1; + return 0; + } + + c = memcmp(pReader->term.pData, pTerm, n); + if( c!=0 ) return c; + if( isPrefix && n==nTerm ) return 0; + return pReader->term.nData - nTerm; +} + + +/****************************************************************/ +/* LeavesReader wraps LeafReader to allow iterating over the entire +** leaf layer of the tree. +*/ +typedef struct LeavesReader { + int idx; /* Index within the segment. */ + + sqlite3_stmt *pStmt; /* Statement we're streaming leaves from. */ + int eof; /* we've seen SQLITE_DONE from pStmt. */ + + LeafReader leafReader; /* reader for the current leaf. */ + DataBuffer rootData; /* root data for inline. */ +} LeavesReader; + +/* Access the current term. */ +static int leavesReaderTermBytes(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderTermBytes(&pReader->leafReader); +} +static const char *leavesReaderTerm(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderTerm(&pReader->leafReader); +} + +/* Access the doclist data for the current term. */ +static int leavesReaderDataBytes(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderDataBytes(&pReader->leafReader); +} +static const char *leavesReaderData(LeavesReader *pReader){ + assert( !pReader->eof ); + return leafReaderData(&pReader->leafReader); +} + +static int leavesReaderAtEnd(LeavesReader *pReader){ + return pReader->eof; +} + +/* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus +** leaving the statement handle open, which locks the table. +*/ +/* TODO(shess) This "solution" is not satisfactory. Really, there +** should be check-in function for all statement handles which +** arranges to call sqlite3_reset(). This most likely will require +** modification to control flow all over the place, though, so for now +** just punt. +** +** Note the the current system assumes that segment merges will run to +** completion, which is why this particular probably hasn't arisen in +** this case. Probably a brittle assumption. +*/ +static int leavesReaderReset(LeavesReader *pReader){ + return sqlite3_reset(pReader->pStmt); +} + +static void leavesReaderDestroy(LeavesReader *pReader){ + leafReaderDestroy(&pReader->leafReader); + dataBufferDestroy(&pReader->rootData); + SCRAMBLE(pReader); +} + +/* Initialize pReader with the given root data (if iStartBlockid==0 +** the leaf data was entirely contained in the root), or from the +** stream of blocks between iStartBlockid and iEndBlockid, inclusive. +*/ +static int leavesReaderInit(fulltext_vtab *v, + int idx, + sqlite_int64 iStartBlockid, + sqlite_int64 iEndBlockid, + const char *pRootData, int nRootData, + LeavesReader *pReader){ + CLEAR(pReader); + pReader->idx = idx; + + dataBufferInit(&pReader->rootData, 0); + if( iStartBlockid==0 ){ + /* Entire leaf level fit in root data. */ + dataBufferReplace(&pReader->rootData, pRootData, nRootData); + leafReaderInit(pReader->rootData.pData, pReader->rootData.nData, + &pReader->leafReader); + }else{ + sqlite3_stmt *s; + int rc = sql_get_leaf_statement(v, idx, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iStartBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 2, iEndBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ){ + pReader->eof = 1; + return SQLITE_OK; + } + if( rc!=SQLITE_ROW ) return rc; + + pReader->pStmt = s; + leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), + sqlite3_column_bytes(pReader->pStmt, 0), + &pReader->leafReader); + } + return SQLITE_OK; +} + +/* Step the current leaf forward to the next term. If we reach the +** end of the current leaf, step forward to the next leaf block. +*/ +static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ + assert( !leavesReaderAtEnd(pReader) ); + leafReaderStep(&pReader->leafReader); + + if( leafReaderAtEnd(&pReader->leafReader) ){ + int rc; + if( pReader->rootData.pData ){ + pReader->eof = 1; + return SQLITE_OK; + } + rc = sqlite3_step(pReader->pStmt); + if( rc!=SQLITE_ROW ){ + pReader->eof = 1; + return rc==SQLITE_DONE ? SQLITE_OK : rc; + } + leafReaderDestroy(&pReader->leafReader); + leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), + sqlite3_column_bytes(pReader->pStmt, 0), + &pReader->leafReader); + } + return SQLITE_OK; +} + +/* Order LeavesReaders by their term, ignoring idx. Readers at eof +** always sort to the end. +*/ +static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){ + if( leavesReaderAtEnd(lr1) ){ + if( leavesReaderAtEnd(lr2) ) return 0; + return 1; + } + if( leavesReaderAtEnd(lr2) ) return -1; + + return leafReaderTermCmp(&lr1->leafReader, + leavesReaderTerm(lr2), leavesReaderTermBytes(lr2), + 0); +} + +/* Similar to leavesReaderTermCmp(), with additional ordering by idx +** so that older segments sort before newer segments. +*/ +static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){ + int c = leavesReaderTermCmp(lr1, lr2); + if( c!=0 ) return c; + return lr1->idx-lr2->idx; +} + +/* Assume that pLr[1]..pLr[nLr] are sorted. Bubble pLr[0] into its +** sorted position. +*/ +static void leavesReaderReorder(LeavesReader *pLr, int nLr){ + while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){ + LeavesReader tmp = pLr[0]; + pLr[0] = pLr[1]; + pLr[1] = tmp; + nLr--; + pLr++; + } +} + +/* Initializes pReaders with the segments from level iLevel, returning +** the number of segments in *piReaders. Leaves pReaders in sorted +** order. +*/ +static int leavesReadersInit(fulltext_vtab *v, int iLevel, + LeavesReader *pReaders, int *piReaders){ + sqlite3_stmt *s; + int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int(s, 1, iLevel); + if( rc!=SQLITE_OK ) return rc; + + i = 0; + while( (rc = sqlite3_step(s))==SQLITE_ROW ){ + sqlite_int64 iStart = sqlite3_column_int64(s, 0); + sqlite_int64 iEnd = sqlite3_column_int64(s, 1); + const char *pRootData = sqlite3_column_blob(s, 2); + int nRootData = sqlite3_column_bytes(s, 2); + + assert( i0 ){ + leavesReaderDestroy(&pReaders[i]); + } + return rc; + } + + *piReaders = i; + + /* Leave our results sorted by term, then age. */ + while( i-- ){ + leavesReaderReorder(pReaders+i, *piReaders-i); + } + return SQLITE_OK; +} + +/* Merge doclists from pReaders[nReaders] into a single doclist, which +** is written to pWriter. Assumes pReaders is ordered oldest to +** newest. +*/ +/* TODO(shess) Consider putting this inline in segmentMerge(). */ +static int leavesReadersMerge(fulltext_vtab *v, + LeavesReader *pReaders, int nReaders, + LeafWriter *pWriter){ + DLReader dlReaders[MERGE_COUNT]; + const char *pTerm = leavesReaderTerm(pReaders); + int i, nTerm = leavesReaderTermBytes(pReaders); + + assert( nReaders<=MERGE_COUNT ); + + for(i=0; i0 ){ + rc = leavesReaderStep(v, lrs+i); + if( rc!=SQLITE_OK ) goto err; + + /* Reorder by term, then by age. */ + leavesReaderReorder(lrs+i, MERGE_COUNT-i); + } + } + + for(i=0; i0 ); + + /* Process while the prefix matches. */ + while( !leavesReaderAtEnd(pReader) ){ + /* TODO(shess) Really want leavesReaderTermCmp(), but that name is + ** already taken to compare the terms of two LeavesReaders. Think + ** on a better name. [Meanwhile, break encapsulation rather than + ** use a confusing name.] + */ + int rc; + int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); + if( c==0 ){ + const char *pData = leavesReaderData(pReader); + int nData = leavesReaderDataBytes(pReader); + if( out->nData==0 ){ + dataBufferReplace(out, pData, nData); + }else{ + DataBuffer result; + dataBufferInit(&result, out->nData+nData); + docListUnion(out->pData, out->nData, pData, nData, &result); + dataBufferDestroy(out); + *out = result; + /* TODO(shess) Rather than destroy out, we could retain it for + ** later reuse. + */ + } + } + if( c>0 ) break; /* Past any possible matches. */ + + rc = leavesReaderStep(v, pReader); + if( rc!=SQLITE_OK ) return rc; + } + return SQLITE_OK; +} + +/* Call loadSegmentLeavesInt() with pData/nData as input. */ +static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + LeavesReader reader; + int rc; + + assert( nData>1 ); + assert( *pData=='\0' ); + rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); + if( rc!=SQLITE_OK ) return rc; + + rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); + leavesReaderReset(&reader); + leavesReaderDestroy(&reader); + return rc; +} + +/* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to +** iEndLeaf (inclusive) as input, and merge the resulting doclist into +** out. +*/ +static int loadSegmentLeaves(fulltext_vtab *v, + sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + int rc; + LeavesReader reader; + + assert( iStartLeaf<=iEndLeaf ); + rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader); + if( rc!=SQLITE_OK ) return rc; + + rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); + leavesReaderReset(&reader); + leavesReaderDestroy(&reader); + return rc; +} + +/* Taking pData/nData as an interior node, find the sequence of child +** nodes which could include pTerm/nTerm/isPrefix. Note that the +** interior node terms logically come between the blocks, so there is +** one more blockid than there are terms (that block contains terms >= +** the last interior-node term). +*/ +/* TODO(shess) The calling code may already know that the end child is +** not worth calculating, because the end may be in a later sibling +** node. Consider whether breaking symmetry is worthwhile. I suspect +** it's not worthwhile. +*/ +static void getChildrenContaining(const char *pData, int nData, + const char *pTerm, int nTerm, int isPrefix, + sqlite_int64 *piStartChild, + sqlite_int64 *piEndChild){ + InteriorReader reader; + + assert( nData>1 ); + assert( *pData!='\0' ); + interiorReaderInit(pData, nData, &reader); + + /* Scan for the first child which could contain pTerm/nTerm. */ + while( !interiorReaderAtEnd(&reader) ){ + if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break; + interiorReaderStep(&reader); + } + *piStartChild = interiorReaderCurrentBlockid(&reader); + + /* Keep scanning to find a term greater than our term, using prefix + ** comparison if indicated. If isPrefix is false, this will be the + ** same blockid as the starting block. + */ + while( !interiorReaderAtEnd(&reader) ){ + if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; + interiorReaderStep(&reader); + } + *piEndChild = interiorReaderCurrentBlockid(&reader); + + interiorReaderDestroy(&reader); + + /* Children must ascend, and if !prefix, both must be the same. */ + assert( *piEndChild>=*piStartChild ); + assert( isPrefix || *piStartChild==*piEndChild ); +} + +/* Read block at iBlockid and pass it with other params to +** getChildrenContaining(). +*/ +static int loadAndGetChildrenContaining( + fulltext_vtab *v, + sqlite_int64 iBlockid, + const char *pTerm, int nTerm, int isPrefix, + sqlite_int64 *piStartChild, sqlite_int64 *piEndChild +){ + sqlite3_stmt *s = NULL; + int rc; + + assert( iBlockid!=0 ); + assert( pTerm!=NULL ); + assert( nTerm!=0 ); /* TODO(shess) Why not allow this? */ + assert( piStartChild!=NULL ); + assert( piEndChild!=NULL ); + + rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_bind_int64(s, 1, iBlockid); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3_step(s); + if( rc==SQLITE_DONE ) return SQLITE_ERROR; + if( rc!=SQLITE_ROW ) return rc; + + getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0), + pTerm, nTerm, isPrefix, piStartChild, piEndChild); + + /* We expect only one row. We must execute another sqlite3_step() + * to complete the iteration; otherwise the table will remain + * locked. */ + rc = sqlite3_step(s); + if( rc==SQLITE_ROW ) return SQLITE_ERROR; + if( rc!=SQLITE_DONE ) return rc; + + return SQLITE_OK; +} + +/* Traverse the tree represented by pData[nData] looking for +** pTerm[nTerm], placing its doclist into *out. This is internal to +** loadSegment() to make error-handling cleaner. +*/ +static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 iLeavesEnd, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + /* Special case where root is a leaf. */ + if( *pData=='\0' ){ + return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out); + }else{ + int rc; + sqlite_int64 iStartChild, iEndChild; + + /* Process pData as an interior node, then loop down the tree + ** until we find the set of leaf nodes to scan for the term. + */ + getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix, + &iStartChild, &iEndChild); + while( iStartChild>iLeavesEnd ){ + sqlite_int64 iNextStart, iNextEnd; + rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, + &iNextStart, &iNextEnd); + if( rc!=SQLITE_OK ) return rc; + + /* If we've branched, follow the end branch, too. */ + if( iStartChild!=iEndChild ){ + sqlite_int64 iDummy; + rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix, + &iDummy, &iNextEnd); + if( rc!=SQLITE_OK ) return rc; + } + + assert( iNextStart<=iNextEnd ); + iStartChild = iNextStart; + iEndChild = iNextEnd; + } + assert( iStartChild<=iLeavesEnd ); + assert( iEndChild<=iLeavesEnd ); + + /* Scan through the leaf segments for doclists. */ + return loadSegmentLeaves(v, iStartChild, iEndChild, + pTerm, nTerm, isPrefix, out); + } +} + +/* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then +** merge its doclist over *out (any duplicate doclists read from the +** segment rooted at pData will overwrite those in *out). +*/ +/* TODO(shess) Consider changing this to determine the depth of the +** leaves using either the first characters of interior nodes (when +** ==1, we're one level above the leaves), or the first character of +** the root (which will describe the height of the tree directly). +** Either feels somewhat tricky to me. +*/ +/* TODO(shess) The current merge is likely to be slow for large +** doclists (though it should process from newest/smallest to +** oldest/largest, so it may not be that bad). It might be useful to +** modify things to allow for N-way merging. This could either be +** within a segment, with pairwise merges across segments, or across +** all segments at once. +*/ +static int loadSegment(fulltext_vtab *v, const char *pData, int nData, + sqlite_int64 iLeavesEnd, + const char *pTerm, int nTerm, int isPrefix, + DataBuffer *out){ + DataBuffer result; + int rc; + + assert( nData>1 ); + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&result, 0); + rc = loadSegmentInt(v, pData, nData, iLeavesEnd, + pTerm, nTerm, isPrefix, &result); + if( rc==SQLITE_OK && result.nData>0 ){ + if( out->nData==0 ){ + DataBuffer tmp = *out; + *out = result; + result = tmp; + }else{ + DataBuffer merged; + DLReader readers[2]; + + dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); + dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData); + dataBufferInit(&merged, out->nData+result.nData); + docListMerge(&merged, readers, 2); + dataBufferDestroy(out); + *out = merged; + dlrDestroy(&readers[0]); + dlrDestroy(&readers[1]); + } + } + dataBufferDestroy(&result); + return rc; +} + +/* Scan the database and merge together the posting lists for the term +** into *out. +*/ +static int termSelect(fulltext_vtab *v, int iColumn, + const char *pTerm, int nTerm, int isPrefix, + DocListType iType, DataBuffer *out){ + DataBuffer doclist; + sqlite3_stmt *s; + int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); + if( rc!=SQLITE_OK ) return rc; + + /* This code should never be called with buffered updates. */ + assert( v->nPendingData<0 ); + + dataBufferInit(&doclist, 0); + + /* Traverse the segments from oldest to newest so that newer doclist + ** elements for given docids overwrite older elements. + */ + while( (rc = sqlite3_step(s))==SQLITE_ROW ){ + const char *pData = sqlite3_column_blob(s, 0); + const int nData = sqlite3_column_bytes(s, 0); + const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); + rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix, + &doclist); + if( rc!=SQLITE_OK ) goto err; + } + if( rc==SQLITE_DONE ){ + if( doclist.nData!=0 ){ + /* TODO(shess) The old term_select_all() code applied the column + ** restrict as we merged segments, leading to smaller buffers. + ** This is probably worthwhile to bring back, once the new storage + ** system is checked in. + */ + if( iColumn==v->nColumn) iColumn = -1; + docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, + iColumn, iType, out); + } + rc = SQLITE_OK; + } + + err: + dataBufferDestroy(&doclist); + return rc; +} + +/****************************************************************/ +/* Used to hold hashtable data for sorting. */ +typedef struct TermData { + const char *pTerm; + int nTerm; + DLCollector *pCollector; +} TermData; + +/* Orders TermData elements in strcmp fashion ( <0 for less-than, 0 +** for equal, >0 for greater-than). +*/ +static int termDataCmp(const void *av, const void *bv){ + const TermData *a = (const TermData *)av; + const TermData *b = (const TermData *)bv; + int n = a->nTermnTerm ? a->nTerm : b->nTerm; + int c = memcmp(a->pTerm, b->pTerm, n); + if( c!=0 ) return c; + return a->nTerm-b->nTerm; +} + +/* Order pTerms data by term, then write a new level 0 segment using +** LeafWriter. +*/ +static int writeZeroSegment(fulltext_vtab *v, fts3Hash *pTerms){ + fts3HashElem *e; + int idx, rc, i, n; + TermData *pData; + LeafWriter writer; + DataBuffer dl; + + /* Determine the next index at level 0, merging as necessary. */ + rc = segdirNextIndex(v, 0, &idx); + if( rc!=SQLITE_OK ) return rc; + + n = fts3HashCount(pTerms); + pData = malloc(n*sizeof(TermData)); + + for(i = 0, e = fts3HashFirst(pTerms); e; i++, e = fts3HashNext(e)){ + assert( i1 ) qsort(pData, n, sizeof(*pData), termDataCmp); + + /* TODO(shess) Refactor so that we can write directly to the segment + ** DataBuffer, as happens for segment merges. + */ + leafWriterInit(0, idx, &writer); + dataBufferInit(&dl, 0); + for(i=0; inPendingData>=0 ){ + fts3HashElem *e; + for(e=fts3HashFirst(&v->pendingTerms); e; e=fts3HashNext(e)){ + dlcDelete(fts3HashData(e)); + } + fts3HashClear(&v->pendingTerms); + v->nPendingData = -1; + } + return SQLITE_OK; +} + +/* If pendingTerms has data, flush it to a level-zero segment, and +** free it. +*/ +static int flushPendingTerms(fulltext_vtab *v){ + if( v->nPendingData>=0 ){ + int rc = writeZeroSegment(v, &v->pendingTerms); + if( rc==SQLITE_OK ) clearPendingTerms(v); + return rc; + } + return SQLITE_OK; +} + +/* If pendingTerms is "too big", or docid is out of order, flush it. +** Regardless, be certain that pendingTerms is initialized for use. +*/ +static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){ + /* TODO(shess) Explore whether partially flushing the buffer on + ** forced-flush would provide better performance. I suspect that if + ** we ordered the doclists by size and flushed the largest until the + ** buffer was half empty, that would let the less frequent terms + ** generate longer doclists. + */ + if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){ + int rc = flushPendingTerms(v); + if( rc!=SQLITE_OK ) return rc; + } + if( v->nPendingData<0 ){ + fts3HashInit(&v->pendingTerms, FTS3_HASH_STRING, 1); + v->nPendingData = 0; + } + v->iPrevDocid = iDocid; + return SQLITE_OK; +} + +/* This function implements the xUpdate callback; it's the top-level entry + * point for inserting, deleting or updating a row in a full-text table. */ +static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, + sqlite_int64 *pRowid){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + int rc; + + TRACE(("FTS3 Update %p\n", pVtab)); + + if( nArg<2 ){ + rc = index_delete(v, sqlite3_value_int64(ppArg[0])); + } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ + /* An update: + * ppArg[0] = old rowid + * ppArg[1] = new rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + * ppArg[2+v->nColumn+1] = value for docid + */ + sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); + if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || + sqlite3_value_int64(ppArg[1]) != rowid ){ + rc = SQLITE_ERROR; /* we don't allow changing the rowid */ + }else if( sqlite3_value_type(ppArg[2+v->nColumn+1]) != SQLITE_INTEGER || + sqlite3_value_int64(ppArg[2+v->nColumn+1]) != rowid ){ + rc = SQLITE_ERROR; /* we don't allow changing the docid */ + }else{ + assert( nArg==2+v->nColumn+2); + rc = index_update(v, rowid, &ppArg[2]); + } + } else { + /* An insert: + * ppArg[1] = requested rowid + * ppArg[2..2+v->nColumn-1] = values + * ppArg[2+v->nColumn] = value for magic column (we ignore this) + * ppArg[2+v->nColumn+1] = value for docid + */ + sqlite3_value *pRequestDocid = ppArg[2+v->nColumn+1]; + assert( nArg==2+v->nColumn+2); + if( SQLITE_NULL != sqlite3_value_type(pRequestDocid) && + SQLITE_NULL != sqlite3_value_type(ppArg[1]) ){ + /* TODO(shess) Consider allowing this to work if the values are + ** identical. I'm inclined to discourage that usage, though, + ** given that both rowid and docid are special columns. Better + ** would be to define one or the other as the default winner, + ** but should it be fts3-centric (docid) or SQLite-centric + ** (rowid)? + */ + rc = SQLITE_ERROR; + }else{ + if( SQLITE_NULL == sqlite3_value_type(pRequestDocid) ){ + pRequestDocid = ppArg[1]; + } + rc = index_insert(v, pRequestDocid, &ppArg[2], pRowid); + } + } + + return rc; +} + +static int fulltextSync(sqlite3_vtab *pVtab){ + TRACE(("FTS3 xSync()\n")); + return flushPendingTerms((fulltext_vtab *)pVtab); +} + +static int fulltextBegin(sqlite3_vtab *pVtab){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + TRACE(("FTS3 xBegin()\n")); + + /* Any buffered updates should have been cleared by the previous + ** transaction. + */ + assert( v->nPendingData<0 ); + return clearPendingTerms(v); +} + +static int fulltextCommit(sqlite3_vtab *pVtab){ + fulltext_vtab *v = (fulltext_vtab *) pVtab; + TRACE(("FTS3 xCommit()\n")); + + /* Buffered updates should have been cleared by fulltextSync(). */ + assert( v->nPendingData<0 ); + return clearPendingTerms(v); +} + +static int fulltextRollback(sqlite3_vtab *pVtab){ + TRACE(("FTS3 xRollback()\n")); + return clearPendingTerms((fulltext_vtab *)pVtab); +} + +/* +** Implementation of the snippet() function for FTS3 +*/ +static void snippetFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); + }else{ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + if( argc>=2 ){ + zStart = (const char*)sqlite3_value_text(argv[1]); + if( argc>=3 ){ + zEnd = (const char*)sqlite3_value_text(argv[2]); + if( argc>=4 ){ + zEllipsis = (const char*)sqlite3_value_text(argv[3]); + } + } + } + snippetAllOffsets(pCursor); + snippetText(pCursor, zStart, zEnd, zEllipsis); + sqlite3_result_text(pContext, pCursor->snippet.zSnippet, + pCursor->snippet.nSnippet, SQLITE_STATIC); + } +} + +/* +** Implementation of the offsets() function for FTS3 +*/ +static void snippetOffsetsFunc( + sqlite3_context *pContext, + int argc, + sqlite3_value **argv +){ + fulltext_cursor *pCursor; + if( argc<1 ) return; + if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || + sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ + sqlite3_result_error(pContext, "illegal first argument to offsets",-1); + }else{ + memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); + snippetAllOffsets(pCursor); + snippetOffsetText(&pCursor->snippet); + sqlite3_result_text(pContext, + pCursor->snippet.zOffset, pCursor->snippet.nOffset, + SQLITE_STATIC); + } +} + +/* +** This routine implements the xFindFunction method for the FTS3 +** virtual table. +*/ +static int fulltextFindFunction( + sqlite3_vtab *pVtab, + int nArg, + const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg +){ + if( strcmp(zName,"snippet")==0 ){ + *pxFunc = snippetFunc; + return 1; + }else if( strcmp(zName,"offsets")==0 ){ + *pxFunc = snippetOffsetsFunc; + return 1; + } + return 0; +} + +/* +** Rename an fts3 table. +*/ +static int fulltextRename( + sqlite3_vtab *pVtab, + const char *zName +){ + fulltext_vtab *p = (fulltext_vtab *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + ); + if( zSql ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +static const sqlite3_module fts3Module = { + /* iVersion */ 0, + /* xCreate */ fulltextCreate, + /* xConnect */ fulltextConnect, + /* xBestIndex */ fulltextBestIndex, + /* xDisconnect */ fulltextDisconnect, + /* xDestroy */ fulltextDestroy, + /* xOpen */ fulltextOpen, + /* xClose */ fulltextClose, + /* xFilter */ fulltextFilter, + /* xNext */ fulltextNext, + /* xEof */ fulltextEof, + /* xColumn */ fulltextColumn, + /* xRowid */ fulltextRowid, + /* xUpdate */ fulltextUpdate, + /* xBegin */ fulltextBegin, + /* xSync */ fulltextSync, + /* xCommit */ fulltextCommit, + /* xRollback */ fulltextRollback, + /* xFindFunction */ fulltextFindFunction, + /* xRename */ fulltextRename, +}; + +static void hashDestroy(void *p){ + fts3Hash *pHash = (fts3Hash *)p; + sqlite3Fts3HashClear(pHash); + sqlite3_free(pHash); +} + +/* +** The fts3 built-in tokenizers - "simple" and "porter" - are implemented +** in files fts3_tokenizer1.c and fts3_porter.c respectively. The following +** two forward declarations are for functions declared in these files +** used to retrieve the respective implementations. +** +** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed +** to by the argument to point a the "simple" tokenizer implementation. +** Function ...PorterTokenizerModule() sets *pModule to point to the +** porter tokenizer/stemmer implementation. +*/ +void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); +void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +int sqlite3Fts3InitHashTable(sqlite3 *, fts3Hash *, const char *); + +/* +** Initialise the fts3 extension. If this extension is built as part +** of the sqlite library, then this function is called directly by +** SQLite. If fts3 is built as a dynamically loadable extension, this +** function is called by the sqlite3_extension_init() entry point. +*/ +int sqlite3Fts3Init(sqlite3 *db){ + int rc = SQLITE_OK; + fts3Hash *pHash = 0; + const sqlite3_tokenizer_module *pSimple = 0; + const sqlite3_tokenizer_module *pPorter = 0; + const sqlite3_tokenizer_module *pIcu = 0; + + sqlite3Fts3SimpleTokenizerModule(&pSimple); + sqlite3Fts3PorterTokenizerModule(&pPorter); +#ifdef SQLITE_ENABLE_ICU + sqlite3Fts3IcuTokenizerModule(&pIcu); +#endif + + /* Allocate and initialise the hash-table used to store tokenizers. */ + pHash = sqlite3_malloc(sizeof(fts3Hash)); + if( !pHash ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); + } + + /* Load the built-in tokenizers into the hash table */ + if( rc==SQLITE_OK ){ + if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple) + || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) + || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) + ){ + rc = SQLITE_NOMEM; + } + } + + /* Create the virtual table wrapper around the hash-table and overload + ** the two scalar functions. If this is successful, register the + ** module with sqlite. + */ + if( SQLITE_OK==rc + && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1)) + ){ + return sqlite3_create_module_v2( + db, "fts3", &fts3Module, (void *)pHash, hashDestroy + ); + } + + /* An error has occured. Delete the hash table and return the error code. */ + assert( rc!=SQLITE_OK ); + if( pHash ){ + sqlite3Fts3HashClear(pHash); + sqlite3_free(pHash); + } + return rc; +} + +#if !SQLITE_CORE +int sqlite3_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts3Init(db); +} +#endif + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h new file mode 100644 index 0000000000..c1aa8caf09 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h @@ -0,0 +1,26 @@ +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This header file is used by programs that want to link against the +** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. +*/ +#include "sqlite3.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int sqlite3Fts3Init(sqlite3 *db); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c new file mode 100644 index 0000000000..b14511a3c9 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c @@ -0,0 +1,373 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +#include +#include +#include + +#include "fts3_hash.h" + +/* +** Malloc and Free functions +*/ +static void *fts3HashMalloc(int n){ + void *p = sqlite3_malloc(n); + if( p ){ + memset(p, 0, n); + } + return p; +} +static void fts3HashFree(void *p){ + sqlite3_free(p); +} + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +void sqlite3Fts3HashInit(fts3Hash *pNew, int keyClass, int copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +void sqlite3Fts3HashClear(fts3Hash *pH){ + fts3HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + fts3HashFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + fts3HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_STRING +*/ +static int fts3StrHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + int h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return h & 0x7fffffff; +} +static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_BINARY +*/ +static int fts3BinHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "hashFunction". The function takes a +** single parameter "keyClass". The return value of hashFunction() +** is a pointer to another function. Specifically, the return value +** of hashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*hashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrHash; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinHash; + } +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrCompare; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinCompare; + } +} + +/* Link an element into the hash table +*/ +static void fts3HashInsertElement( + fts3Hash *pH, /* The complete hash table */ + struct _fts3ht *pEntry, /* The entry into which pNew is inserted */ + fts3HashElem *pNew /* The element to be inserted */ +){ + fts3HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +*/ +static void fts3Rehash(fts3Hash *pH, int new_size){ + struct _fts3ht *new_ht; /* The new hash table */ + fts3HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); + if( new_ht==0 ) return; + fts3HashFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = hashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + fts3HashInsertElement(pH, &new_ht[h], elem); + } +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static fts3HashElem *fts3FindElementByHash( + const fts3Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + fts3HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _fts3ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = compareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void fts3RemoveElementByHash( + fts3Hash *pH, /* The pH containing "elem" */ + fts3HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts3ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts3HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +void *sqlite3Fts3HashFind(const fts3Hash *pH, const void *pKey, int nKey){ + int h; /* A hash on key */ + fts3HashElem *elem; /* The element that matches key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + elem = fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); + return elem ? elem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +void *sqlite3Fts3HashInsert( + fts3Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + fts3HashElem *elem; /* Used to loop thru the element list */ + fts3HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = fts3FindElementByHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + fts3RemoveElementByHash(pH,elem,h); + }else{ + elem->data = data; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (fts3HashElem*)fts3HashMalloc( sizeof(fts3HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = fts3HashMalloc( nKey ); + if( new_elem->pKey==0 ){ + fts3HashFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + if( pH->htsize==0 ){ + fts3Rehash(pH,8); + if( pH->htsize==0 ){ + pH->count = 0; + fts3HashFree(new_elem); + return data; + } + } + if( pH->count > pH->htsize ){ + fts3Rehash(pH,pH->htsize*2); + } + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + fts3HashInsertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h new file mode 100644 index 0000000000..e01954edc8 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h @@ -0,0 +1,110 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS3_HASH_H_ +#define _FTS3_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct fts3Hash fts3Hash; +typedef struct fts3HashElem fts3HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct fts3Hash { + char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + fts3HashElem *first; /* The first element of the array */ + int htsize; /* Number of buckets in the hash table */ + struct _fts3ht { /* the hash table */ + int count; /* Number of entries with this hash */ + fts3HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct fts3HashElem { + fts3HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS3_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. +*/ +#define FTS3_HASH_STRING 1 +#define FTS3_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +void sqlite3Fts3HashInit(fts3Hash*, int keytype, int copyKey); +void *sqlite3Fts3HashInsert(fts3Hash*, const void *pKey, int nKey, void *pData); +void *sqlite3Fts3HashFind(const fts3Hash*, const void *pKey, int nKey); +void sqlite3Fts3HashClear(fts3Hash*); + +/* +** Shorthand for the functions above +*/ +#define fts3HashInit sqlite3Fts3HashInit +#define fts3HashInsert sqlite3Fts3HashInsert +#define fts3HashFind sqlite3Fts3HashFind +#define fts3HashClear sqlite3Fts3HashClear + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** fts3Hash h; +** fts3HashElem *p; +** ... +** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ +** SomeStructure *pData = fts3HashData(p); +** // do something with pData +** } +*/ +#define fts3HashFirst(H) ((H)->first) +#define fts3HashNext(E) ((E)->next) +#define fts3HashData(E) ((E)->data) +#define fts3HashKey(E) ((E)->pKey) +#define fts3HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts3HashCount(H) ((H)->count) + +#endif /* _FTS3_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c new file mode 100644 index 0000000000..86a9a50cfd --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c @@ -0,0 +1,257 @@ +/* +** 2007 June 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file implements a tokenizer for fts3 based on the ICU library. +** +** $Id: fts3_icu.c,v 1.1 2007/08/20 17:37:04 shess Exp $ +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) +#ifdef SQLITE_ENABLE_ICU + +#include +#include +#include "fts3_tokenizer.h" + +#include +#include +#include +#include + +typedef struct IcuTokenizer IcuTokenizer; +typedef struct IcuCursor IcuCursor; + +struct IcuTokenizer { + sqlite3_tokenizer base; + char *zLocale; +}; + +struct IcuCursor { + sqlite3_tokenizer_cursor base; + + UBreakIterator *pIter; /* ICU break-iterator object */ + int nChar; /* Number of UChar elements in pInput */ + UChar *aChar; /* Copy of input using utf-16 encoding */ + int *aOffset; /* Offsets of each character in utf-8 input */ + + int nBuffer; + char *zBuffer; + + int iToken; +}; + +/* +** Create a new tokenizer instance. +*/ +static int icuCreate( + int argc, /* Number of entries in argv[] */ + const char * const *argv, /* Tokenizer creation arguments */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ +){ + IcuTokenizer *p; + int n = 0; + + if( argc>0 ){ + n = strlen(argv[0])+1; + } + p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + if( !p ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(IcuTokenizer)); + + if( n ){ + p->zLocale = (char *)&p[1]; + memcpy(p->zLocale, argv[0], n); + } + + *ppTokenizer = (sqlite3_tokenizer *)p; + + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int icuDestroy(sqlite3_tokenizer *pTokenizer){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int icuOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, /* Input string */ + int nInput, /* Length of zInput in bytes */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + IcuCursor *pCsr; + + const int32_t opt = U_FOLD_CASE_DEFAULT; + UErrorCode status = U_ZERO_ERROR; + int nChar; + + UChar32 c; + int iInput = 0; + int iOut = 0; + + *ppCursor = 0; + + nChar = nInput+1; + pCsr = (IcuCursor *)sqlite3_malloc( + sizeof(IcuCursor) + /* IcuCursor */ + nChar * sizeof(UChar) + /* IcuCursor.aChar[] */ + (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ + ); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(IcuCursor)); + pCsr->aChar = (UChar *)&pCsr[1]; + pCsr->aOffset = (int *)&pCsr->aChar[nChar]; + + pCsr->aOffset[iOut] = iInput; + U8_NEXT(zInput, iInput, nInput, c); + while( c>0 ){ + int isError = 0; + c = u_foldCase(c, opt); + U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); + if( isError ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->aOffset[iOut] = iInput; + + if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); + if( !U_SUCCESS(status) ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->nChar = iOut; + + ubrk_first(pCsr->pIter); + *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to icuOpen(). +*/ +static int icuClose(sqlite3_tokenizer_cursor *pCursor){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + ubrk_close(pCsr->pIter); + sqlite3_free(pCsr->zBuffer); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. +*/ +static int icuNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + + int iStart = 0; + int iEnd = 0; + int nByte = 0; + + while( iStart==iEnd ){ + UChar32 c; + + iStart = ubrk_current(pCsr->pIter); + iEnd = ubrk_next(pCsr->pIter); + if( iEnd==UBRK_DONE ){ + return SQLITE_DONE; + } + + while( iStartaChar, iWhite, pCsr->nChar, c); + if( u_isspace(c) ){ + iStart = iWhite; + }else{ + break; + } + } + assert(iStart<=iEnd); + } + + do { + UErrorCode status = U_ZERO_ERROR; + if( nByte ){ + char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); + if( !zNew ){ + return SQLITE_NOMEM; + } + pCsr->zBuffer = zNew; + pCsr->nBuffer = nByte; + } + + u_strToUTF8( + pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ + &status /* Output success/failure */ + ); + } while( nByte>pCsr->nBuffer ); + + *ppToken = pCsr->zBuffer; + *pnBytes = nByte; + *piStartOffset = pCsr->aOffset[iStart]; + *piEndOffset = pCsr->aOffset[iEnd]; + *piPosition = pCsr->iToken++; + + return SQLITE_OK; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module icuTokenizerModule = { + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ +}; + +/* +** Set *ppModule to point at the implementation of the ICU tokenizer. +*/ +void sqlite3Fts3IcuTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &icuTokenizerModule; +} + +#endif /* defined(SQLITE_ENABLE_ICU) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c new file mode 100644 index 0000000000..14e129f4b7 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c @@ -0,0 +1,642 @@ +/* +** 2006 September 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + + +#include +#include +#include +#include +#include + +#include "fts3_tokenizer.h" + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlit3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module porterTokenizerModule; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + t = (porter_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; + + c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + free(c->zToken); + free(c); + return SQLITE_OK; +} +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; + +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); +} +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); +} + +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. +** +** In this routine z[] is in reverse order. So we are really looking +** for an instance of of a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; +} + +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 +*/ +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. +*/ +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); +} + +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. +*/ +static int star_oh(const char *z){ + return + z[0]!=0 && isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + z[1]!=0 && isVowel(z+1) && + z[2]!=0 && isConsonant(z+2); +} + +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. +*/ +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); + } + *pz = z; + return 1; +} + +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. +*/ +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; + }else{ + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + } + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; + + + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } + + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } + + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + stem(&z, "lanoita", "ate", m_gt_0) || + stem(&z, "lanoit", "tion", m_gt_0); + break; + case 'c': + stem(&z, "icne", "ence", m_gt_0) || + stem(&z, "icna", "ance", m_gt_0); + break; + case 'e': + stem(&z, "rezi", "ize", m_gt_0); + break; + case 'g': + stem(&z, "igol", "log", m_gt_0); + break; + case 'l': + stem(&z, "ilb", "ble", m_gt_0) || + stem(&z, "illa", "al", m_gt_0) || + stem(&z, "iltne", "ent", m_gt_0) || + stem(&z, "ile", "e", m_gt_0) || + stem(&z, "ilsuo", "ous", m_gt_0); + break; + case 'o': + stem(&z, "noitazi", "ize", m_gt_0) || + stem(&z, "noita", "ate", m_gt_0) || + stem(&z, "rota", "ate", m_gt_0); + break; + case 's': + stem(&z, "msila", "al", m_gt_0) || + stem(&z, "ssenevi", "ive", m_gt_0) || + stem(&z, "ssenluf", "ful", m_gt_0) || + stem(&z, "ssensuo", "ous", m_gt_0); + break; + case 't': + stem(&z, "itila", "al", m_gt_0) || + stem(&z, "itivi", "ive", m_gt_0) || + stem(&z, "itilib", "ble", m_gt_0); + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + stem(&z, "etaci", "ic", m_gt_0) || + stem(&z, "evita", "", m_gt_0) || + stem(&z, "ezila", "al", m_gt_0); + break; + case 'i': + stem(&z, "itici", "ic", m_gt_0); + break; + case 'l': + stem(&z, "laci", "ic", m_gt_0) || + stem(&z, "luf", "", m_gt_0); + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + stem(&z, "tneme", "", m_gt_1) || + stem(&z, "tnem", "", m_gt_1) || + stem(&z, "tne", "", m_gt_1); + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + stem(&z, "eta", "", m_gt_1) || + stem(&z, "iti", "", m_gt_1); + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } + + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** Characters that can be part of a token. We assume any character +** whose value is greater than 0x80 (any UTF character) can be +** part of a token. In other words, delimiters all must have +** values of 0x7f or lower. +*/ +static const char porterIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +static int porterNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ + const char **pzToken, /* OUT: *pzToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + const char *z = c->zInput; + + while( c->iOffsetnInput ){ + int iStartOffset, ch; + + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + c->nAllocated = n+20; + c->zToken = realloc(c->zToken, c->nAllocated); + if( c->zToken==NULL ) return SQLITE_NOMEM; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the porter-stemmer tokenizer +*/ +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, +}; + +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts3PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c new file mode 100644 index 0000000000..7398227257 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c @@ -0,0 +1,371 @@ +/* +** 2007 June 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is part of an SQLite module implementing full-text search. +** This particular file implements the generic tokenizer interface. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + + +#include "sqlite3.h" +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + +#include "fts3_hash.h" +#include "fts3_tokenizer.h" +#include + +/* +** Implementation of the SQL scalar function for accessing the underlying +** hash table. This function may be called as follows: +** +** SELECT (); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). +** +** If the argument is specified, it must be a blob value +** containing a pointer to be stored as the hash data corresponding +** to the string . If is not specified, then +** the string must already exist in the has table. Otherwise, +** an error is returned. +** +** Whether or not the argument is specified, the value returned +** is a blob containing the pointer stored as the hash data corresponding +** to string (after the hash-table is updated, if applicable). +*/ +static void scalarFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; + + assert( argc==1 || argc==2 ); + + pHash = (fts3Hash *)sqlite3_user_data(context); + + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; + + if( argc==2 ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + return; + } + }else{ + pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + if( !pPtr ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + } + + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); +} + +#ifdef SQLITE_TEST + +#include +#include + +/* +** Implementation of a special SQL scalar function for testing tokenizers +** designed to be used in concert with the Tcl testing framework. This +** function must be called with two arguments: +** +** SELECT (, ); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') +** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). +** +** The return value is a string that may be interpreted as a Tcl +** list. For each token in the , three elements are +** added to the returned list. The first is the token position, the +** second is the token text (folded, stemmed, etc.) and the third is the +** substring of associated with the token. For example, +** using the built-in "simple" tokenizer: +** +** SELECT fts_tokenizer_test('simple', 'I don't see how'); +** +** will return the string: +** +** "{0 i I 1 dont don't 2 see see 3 how how}" +** +*/ +static void testFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3Hash *pHash; + sqlite3_tokenizer_module *p; + sqlite3_tokenizer *pTokenizer = 0; + sqlite3_tokenizer_cursor *pCsr = 0; + + const char *zErr = 0; + + const char *zName; + int nName; + const char *zInput; + int nInput; + + const char *zArg = 0; + + const char *zToken; + int nToken; + int iStart; + int iEnd; + int iPos; + + Tcl_Obj *pRet; + + assert( argc==2 || argc==3 ); + + nName = sqlite3_value_bytes(argv[0]); + zName = (const char *)sqlite3_value_text(argv[0]); + nInput = sqlite3_value_bytes(argv[argc-1]); + zInput = (const char *)sqlite3_value_text(argv[argc-1]); + + if( argc==3 ){ + zArg = (const char *)sqlite3_value_text(argv[1]); + } + + pHash = (fts3Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + + if( !p ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + + if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; + } + pTokenizer->pModule = p; + if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + pCsr->pTokenizer = pTokenizer; + + while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + zToken = &zInput[iStart]; + nToken = iEnd-iStart; + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + } + + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; + } + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; + } + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); +} + +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); +} + +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +/* +** Implementation of the scalar function fts3_tokenizer_internal_test(). +** This function is used for testing only, it is not included in the +** build unless SQLITE_TEST is defined. +** +** The purpose of this is to test that the fts3_tokenizer() function +** can be used as designed by the C-code in the queryTokenizer and +** registerTokenizer() functions above. These two functions are repeated +** in the README.tokenizer file as an example, so it is important to +** test them. +** +** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar +** function with no arguments. An assert() will fail if a problem is +** detected. i.e.: +** +** SELECT fts3_tokenizer_internal_test(); +** +*/ +static void intTestFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + + /* Test the query function */ + sqlite3Fts3SimpleTokenizerModule(&p1); + rc = queryTokenizer(db, "simple", &p2); + assert( rc==SQLITE_OK ); + assert( p1==p2 ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_ERROR ); + assert( p2==0 ); + assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); + + /* Test the storage function */ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + + sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); +} + +#endif + +/* +** Set up SQL objects in database db used to access the contents of +** the hash table pointed to by argument pHash. The hash table must +** been initialised to use string keys, and to take a private copy +** of the key when a value is inserted. i.e. by a call similar to: +** +** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); +** +** This function adds a scalar function (see header comment above +** scalarFunc() in this file for details) and, if ENABLE_TABLE is +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both +** provide read/write access to the contents of *pHash. +** +** The third argument to this function, zName, is used as the name +** of both the scalar and, if created, the virtual table. +*/ +int sqlite3Fts3InitHashTable( + sqlite3 *db, + fts3Hash *pHash, + const char *zName +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_ANY; + char *zTest = 0; + char *zTest2 = 0; + +#ifdef SQLITE_TEST + void *pdb = (void *)db; + zTest = sqlite3_mprintf("%s_test", zName); + zTest2 = sqlite3_mprintf("%s_internal_test", zName); + if( !zTest || !zTest2 ){ + rc = SQLITE_NOMEM; + } +#endif + + if( rc!=SQLITE_OK + || (rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) +#ifdef SQLITE_TEST + || (rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) + || (rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) +#endif + ); + + sqlite3_free(zTest); + sqlite3_free(zTest2); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h new file mode 100644 index 0000000000..4faef56f24 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h @@ -0,0 +1,145 @@ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +#include "sqlite3.h" + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialised by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c new file mode 100644 index 0000000000..f53cc1dd46 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c @@ -0,0 +1,229 @@ +/* +** 2006 Oct 10 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Implementation of the "simple" full-text-search tokenizer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + + +#include +#include +#include +#include +#include + +#include "fts3_tokenizer.h" + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; + + +/* Forward declaration */ +static const sqlite3_tokenizer_module simpleTokenizerModule; + +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) calloc(sizeof(*t), 1); + if( t==NULL ) return SQLITE_NOMEM; + + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = strlen(argv[1]); + for(i=0; i=0x80 ){ + free(t); + return SQLITE_ERROR; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !isalnum(i); + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; + + c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + free(c->pToken); + free(c); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + c->nTokenAllocated = n+20; + c->pToken = realloc(c->pToken, c->nTokenAllocated); + if( c->pToken==NULL ) return SQLITE_NOMEM; + } + for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, +}; + +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +void sqlite3Fts3SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl new file mode 100644 index 0000000000..cfea5d2ab0 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl @@ -0,0 +1,116 @@ +#!/usr/bin/tclsh +# +# This script builds a single C code file holding all of FTS3 code. +# The name of the output file is fts3amal.c. To build this file, +# first do: +# +# make target_source +# +# The make target above moves all of the source code files into +# a subdirectory named "tsrc". (This script expects to find the files +# there and will not work if they are not found.) +# +# After the "tsrc" directory has been created and populated, run +# this script: +# +# tclsh mkfts3amal.tcl +# +# The amalgamated FTS3 code will be written into fts3amal.c +# + +# Open the output file and write a header comment at the beginning +# of the file. +# +set out [open fts3amal.c w] +set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] +puts $out [subst \ +{/****************************************************************************** +** This file is an amalgamation of separate C source files from the SQLite +** Full Text Search extension 2 (fts3). By combining all the individual C +** code files into this single large file, the entire code can be compiled +** as a one translation unit. This allows many compilers to do optimizations +** that would not be possible if the files were compiled separately. It also +** makes the code easier to import into other projects. +** +** This amalgamation was generated on $today. +*/}] + +# These are the header files used by FTS3. The first time any of these +# files are seen in a #include statement in the C code, include the complete +# text of the file in-line. The file only needs to be included once. +# +foreach hdr { + fts3.h + fts3_hash.h + fts3_tokenizer.h + sqlite3.h + sqlite3ext.h +} { + set available_hdr($hdr) 1 +} + +# 78 stars used for comment formatting. +set s78 \ +{*****************************************************************************} + +# Insert a comment into the code +# +proc section_comment {text} { + global out s78 + set n [string length $text] + set nstar [expr {60 - $n}] + set stars [string range $s78 0 $nstar] + puts $out "/************** $text $stars/" +} + +# Read the source file named $filename and write it into the +# sqlite3.c output file. If any #include statements are seen, +# process them approprately. +# +proc copy_file {filename} { + global seen_hdr available_hdr out + set tail [file tail $filename] + section_comment "Begin file $tail" + set in [open $filename r] + while {![eof $in]} { + set line [gets $in] + if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} { + if {[info exists available_hdr($hdr)]} { + if {$available_hdr($hdr)} { + section_comment "Include $hdr in the middle of $tail" + copy_file tsrc/$hdr + section_comment "Continuing where we left off in $tail" + } + } elseif {![info exists seen_hdr($hdr)]} { + set seen_hdr($hdr) 1 + puts $out $line + } + } elseif {[regexp {^#ifdef __cplusplus} $line]} { + puts $out "#if 0" + } elseif {[regexp {^#line} $line]} { + # Skip #line directives. + } else { + puts $out $line + } + } + close $in + section_comment "End of $tail" +} + + +# Process the source files. Process files containing commonly +# used subroutines first in order to help the compiler find +# inlining opportunities. +# +foreach file { + fts3.c + fts3_hash.c + fts3_porter.c + fts3_tokenizer.c + fts3_tokenizer1.c + fts3_icu.c +} { + copy_file tsrc/$file +} + +close $out diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt new file mode 100644 index 0000000000..5c995ccb4a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt @@ -0,0 +1,170 @@ + +This directory contains source code for the SQLite "ICU" extension, an +integration of the "International Components for Unicode" library with +SQLite. Documentation follows. + + 1. Features + + 1.1 SQL Scalars upper() and lower() + 1.2 Unicode Aware LIKE Operator + 1.3 ICU Collation Sequences + 1.4 SQL REGEXP Operator + + 2. Compilation and Usage + + 3. Bugs, Problems and Security Issues + + 3.1 The "case_sensitive_like" Pragma + 3.2 The SQLITE_MAX_LIKE_PATTERN_LENGTH Macro + 3.3 Collation Sequence Security Issue + + +1. FEATURES + + 1.1 SQL Scalars upper() and lower() + + SQLite's built-in implementations of these two functions only + provide case mapping for the 26 letters used in the English + language. The ICU based functions provided by this extension + provide case mapping, where defined, for the full range of + unicode characters. + + ICU provides two types of case mapping, "general" case mapping and + "language specific". Refer to ICU documentation for the differences + between the two. Specifically: + + http://www.icu-project.org/userguide/caseMappings.html + http://www.icu-project.org/userguide/posix.html#case_mappings + + To utilise "general" case mapping, the upper() or lower() scalar + functions are invoked with one argument: + + upper('ABC') -> 'abc' + lower('abc') -> 'ABC' + + To access ICU "language specific" case mapping, upper() or lower() + should be invoked with two arguments. The second argument is the name + of the locale to use. Passing an empty string ("") or SQL NULL value + as the second argument is the same as invoking the 1 argument version + of upper() or lower(): + + lower('I', 'en_us') -> 'i' + lower('I', 'tr_tr') -> 'ı' (small dotless i) + + 1.2 Unicode Aware LIKE Operator + + Similarly to the upper() and lower() functions, the built-in SQLite LIKE + operator understands case equivalence for the 26 letters of the English + language alphabet. The implementation of LIKE included in this + extension uses the ICU function u_foldCase() to provide case + independent comparisons for the full range of unicode characters. + + The U_FOLD_CASE_DEFAULT flag is passed to u_foldCase(), meaning the + dotless 'I' character used in the Turkish language is considered + to be in the same equivalence class as the dotted 'I' character + used by many languages (including English). + + 1.3 ICU Collation Sequences + + A special SQL scalar function, icu_load_collation() is provided that + may be used to register ICU collation sequences with SQLite. It + is always called with exactly two arguments, the ICU locale + identifying the collation sequence to ICU, and the name of the + SQLite collation sequence to create. For example, to create an + SQLite collation sequence named "turkish" using Turkish language + sorting rules, the SQL statement: + + SELECT icu_load_collation('tr_TR', 'turkish'); + + Or, for Australian English: + + SELECT icu_load_collation('en_AU', 'australian'); + + The identifiers "turkish" and "australian" may then be used + as collation sequence identifiers in SQL statements: + + CREATE TABLE aust_turkish_penpals( + australian_penpal_name TEXT COLLATE australian, + turkish_penpal_name TEXT COLLATE turkish + ); + + 1.4 SQL REGEXP Operator + + This extension provides an implementation of the SQL binary + comparision operator "REGEXP", based on the regular expression functions + provided by the ICU library. The syntax of the operator is as described + in SQLite documentation: + + REGEXP + + This extension uses the ICU defaults for regular expression matching + behaviour. Specifically, this means that: + + * Matching is case-sensitive, + * Regular expression comments are not allowed within patterns, and + * The '^' and '$' characters match the beginning and end of the + argument, not the beginning and end of lines within + the argument. + + Even more specifically, the value passed to the "flags" parameter + of ICU C function uregex_open() is 0. + + +2 COMPILATION AND USAGE + + The easiest way to compile and use the ICU extension is to build + and use it as a dynamically loadable SQLite extension. To do this + using gcc on *nix: + + gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so + + You may need to add "-I" flags so that gcc can find sqlite3ext.h + and sqlite3.h. The resulting shared lib, libSqliteIcu.so, may be + loaded into sqlite in the same way as any other dynamically loadable + extension. + + +3 BUGS, PROBLEMS AND SECURITY ISSUES + + 3.1 The "case_sensitive_like" Pragma + + This extension does not work well with the "case_sensitive_like" + pragma. If this pragma is used before the ICU extension is loaded, + then the pragma has no effect. If the pragma is used after the ICU + extension is loaded, then SQLite ignores the ICU implementation and + always uses the built-in LIKE operator. + + The ICU extension LIKE operator is always case insensitive. + + 3.2 The SQLITE_MAX_LIKE_PATTERN_LENGTH Macro + + Passing very long patterns to the built-in SQLite LIKE operator can + cause a stack overflow. To curb this problem, SQLite defines the + SQLITE_MAX_LIKE_PATTERN_LENGTH macro as the maximum length of a + pattern in bytes (irrespective of encoding). The default value is + defined in internal header file "limits.h". + + The ICU extension LIKE implementation suffers from the same + problem and uses the same solution. However, since the ICU extension + code does not include the SQLite file "limits.h", modifying + the default value therein does not affect the ICU extension. + The default value of SQLITE_MAX_LIKE_PATTERN_LENGTH used by + the ICU extension LIKE operator is 50000, defined in source + file "icu.c". + + 3.3 Collation Sequence Security Issue + + Internally, SQLite assumes that indices stored in database files + are sorted according to the collation sequence indicated by the + SQL schema. Changing the definition of a collation sequence after + an index has been built is therefore equivalent to database + corruption. The SQLite library is not very well tested under + these conditions, and may contain potential buffer overruns + or other programming errors that could be exploited by a malicious + programmer. + + If the ICU extension is used in an environment where potentially + malicious users may execute arbitrary SQL (i.e. gears), they + should be prevented from invoking the icu_load_collation() function, + possibly using the authorisation callback. + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c new file mode 100644 index 0000000000..11bb116d8d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c @@ -0,0 +1,499 @@ +/* +** 2007 May 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** $Id: icu.c,v 1.6 2007/06/22 15:21:16 danielk1977 Exp $ +** +** This file implements an integration between the ICU library +** ("International Components for Unicode", an open-source library +** for handling unicode data) and SQLite. The integration uses +** ICU to provide the following to SQLite: +** +** * An implementation of the SQL regexp() function (and hence REGEXP +** operator) using the ICU uregex_XX() APIs. +** +** * Implementations of the SQL scalar upper() and lower() functions +** for case mapping. +** +** * Integration of ICU and SQLite collation seqences. +** +** * An implementation of the LIKE operator that uses ICU to +** provide case-independent matching. +*/ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + +/* Include ICU headers */ +#include +#include +#include +#include + +#include + +#ifndef SQLITE_CORE + #include "sqlite3ext.h" + SQLITE_EXTENSION_INIT1 +#else + #include "sqlite3.h" +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Version of sqlite3_free() that is always a function, never a macro. +*/ +static void xFree(void *p){ + sqlite3_free(p); +} + +/* +** Compare two UTF-8 strings for equality where the first string is +** a "LIKE" expression. Return true (1) if they are the same and +** false (0) if they are different. +*/ +static int icuLikeCompare( + const uint8_t *zPattern, /* LIKE pattern */ + const uint8_t *zString, /* The UTF-8 string to compare against */ + const UChar32 uEsc /* The escape character */ +){ + static const int MATCH_ONE = (UChar32)'_'; + static const int MATCH_ALL = (UChar32)'%'; + + int iPattern = 0; /* Current byte index in zPattern */ + int iString = 0; /* Current byte index in zString */ + + int prevEscape = 0; /* True if the previous character was uEsc */ + + while( zPattern[iPattern]!=0 ){ + + /* Read (and consume) the next character from the input pattern. */ + UChar32 uPattern; + U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); + assert(uPattern!=0); + + /* There are now 4 possibilities: + ** + ** 1. uPattern is an unescaped match-all character "%", + ** 2. uPattern is an unescaped match-one character "_", + ** 3. uPattern is an unescaped escape character, or + ** 4. uPattern is to be handled as an ordinary character + */ + if( !prevEscape && uPattern==MATCH_ALL ){ + /* Case 1. */ + uint8_t c; + + /* Skip any MATCH_ALL or MATCH_ONE characters that follow a + ** MATCH_ALL. For each MATCH_ONE, skip one character in the + ** test string. + */ + while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){ + if( c==MATCH_ONE ){ + if( zString[iString]==0 ) return 0; + U8_FWD_1_UNSAFE(zString, iString); + } + iPattern++; + } + + if( zPattern[iPattern]==0 ) return 1; + + while( zString[iString] ){ + if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){ + return 1; + } + U8_FWD_1_UNSAFE(zString, iString); + } + return 0; + + }else if( !prevEscape && uPattern==MATCH_ONE ){ + /* Case 2. */ + if( zString[iString]==0 ) return 0; + U8_FWD_1_UNSAFE(zString, iString); + + }else if( !prevEscape && uPattern==uEsc){ + /* Case 3. */ + prevEscape = 1; + + }else{ + /* Case 4. */ + UChar32 uString; + U8_NEXT_UNSAFE(zString, iString, uString); + uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); + uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); + if( uString!=uPattern ){ + return 0; + } + prevEscape = 0; + } + } + + return zString[iString]==0; +} + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B, A). If there is an escape character E, +** +** A LIKE B ESCAPE E +** +** is mapped to like(B, A, E). +*/ +static void icuLikeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA = sqlite3_value_text(argv[0]); + const unsigned char *zB = sqlite3_value_text(argv[1]); + UChar32 uEsc = 0; + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + int nE= sqlite3_value_bytes(argv[2]); + const unsigned char *zE = sqlite3_value_text(argv[2]); + int i = 0; + if( zE==0 ) return; + U8_NEXT(zE, i, nE, uEsc); + if( i!=nE){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + } + + if( zA && zB ){ + sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); + } +} + +/* +** This function is called when an ICU function called from within +** the implementation of an SQL scalar function returns an error. +** +** The scalar function context passed as the first argument is +** loaded with an error message based on the following two args. +*/ +static void icuFunctionError( + sqlite3_context *pCtx, /* SQLite scalar function context */ + const char *zName, /* Name of ICU function that failed */ + UErrorCode e /* Error code returned by ICU function */ +){ + char zBuf[128]; + sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); + zBuf[127] = '\0'; + sqlite3_result_error(pCtx, zBuf, -1); +} + +/* +** Function to delete compiled regexp objects. Registered as +** a destructor function with sqlite3_set_auxdata(). +*/ +static void icuRegexpDelete(void *p){ + URegularExpression *pExpr = (URegularExpression *)p; + uregex_close(pExpr); +} + +/* +** Implementation of SQLite REGEXP operator. This scalar function takes +** two arguments. The first is a regular expression pattern to compile +** the second is a string to match against that pattern. If either +** argument is an SQL NULL, then NULL Is returned. Otherwise, the result +** is 1 if the string matches the pattern, or 0 otherwise. +** +** SQLite maps the regexp() function to the regexp() operator such +** that the following two are equivalent: +** +** zString REGEXP zPattern +** regexp(zPattern, zString) +** +** Uses the following ICU regexp APIs: +** +** uregex_open() +** uregex_matches() +** uregex_close() +*/ +static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + UErrorCode status = U_ZERO_ERROR; + URegularExpression *pExpr; + UBool res; + const UChar *zString = sqlite3_value_text16(apArg[1]); + + /* If the left hand side of the regexp operator is NULL, + ** then the result is also NULL. + */ + if( !zString ){ + return; + } + + pExpr = sqlite3_get_auxdata(p, 0); + if( !pExpr ){ + const UChar *zPattern = sqlite3_value_text16(apArg[0]); + if( !zPattern ){ + return; + } + pExpr = uregex_open(zPattern, -1, 0, 0, &status); + + if( U_SUCCESS(status) ){ + sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); + }else{ + assert(!pExpr); + icuFunctionError(p, "uregex_open", status); + return; + } + } + + /* Configure the text that the regular expression operates on. */ + uregex_setText(pExpr, zString, -1, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_setText", status); + return; + } + + /* Attempt the match */ + res = uregex_matches(pExpr, 0, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_matches", status); + return; + } + + /* Set the text that the regular expression operates on to a NULL + ** pointer. This is not really necessary, but it is tidier than + ** leaving the regular expression object configured with an invalid + ** pointer after this function returns. + */ + uregex_setText(pExpr, 0, 0, &status); + + /* Return 1 or 0. */ + sqlite3_result_int(p, res ? 1 : 0); +} + +/* +** Implementations of scalar functions for case mapping - upper() and +** lower(). Function upper() converts it's input to upper-case (ABC). +** Function lower() converts to lower-case (abc). +** +** ICU provides two types of case mapping, "general" case mapping and +** "language specific". Refer to ICU documentation for the differences +** between the two. +** +** To utilise "general" case mapping, the upper() or lower() scalar +** functions are invoked with one argument: +** +** upper('ABC') -> 'abc' +** lower('abc') -> 'ABC' +** +** To access ICU "language specific" case mapping, upper() or lower() +** should be invoked with two arguments. The second argument is the name +** of the locale to use. Passing an empty string ("") or SQL NULL value +** as the second argument is the same as invoking the 1 argument version +** of upper() or lower(). +** +** lower('I', 'en_us') -> 'i' +** lower('I', 'tr_tr') -> 'ı' (small dotless i) +** +** http://www.icu-project.org/userguide/posix.html#case_mappings +*/ +static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + const UChar *zInput; + UChar *zOutput; + int nInput; + int nOutput; + + UErrorCode status = U_ZERO_ERROR; + const char *zLocale = 0; + + assert(nArg==1 || nArg==2); + if( nArg==2 ){ + zLocale = (const char *)sqlite3_value_text(apArg[1]); + } + + zInput = sqlite3_value_text16(apArg[0]); + if( !zInput ){ + return; + } + nInput = sqlite3_value_bytes16(apArg[0]); + + nOutput = nInput * 2 + 2; + zOutput = sqlite3_malloc(nOutput); + if( !zOutput ){ + return; + } + + if( sqlite3_user_data(p) ){ + u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); + }else{ + u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); + } + + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "u_strToLower()/u_strToUpper", status); + return; + } + + sqlite3_result_text16(p, zOutput, -1, xFree); +} + +/* +** Collation sequence destructor function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static void icuCollationDel(void *pCtx){ + UCollator *p = (UCollator *)pCtx; + ucol_close(p); +} + +/* +** Collation sequence comparison function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static int icuCollationColl( + void *pCtx, + int nLeft, + const void *zLeft, + int nRight, + const void *zRight +){ + UCollationResult res; + UCollator *p = (UCollator *)pCtx; + res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); + switch( res ){ + case UCOL_LESS: return -1; + case UCOL_GREATER: return +1; + case UCOL_EQUAL: return 0; + } + assert(!"Unexpected return value from ucol_strcoll()"); + return 0; +} + +/* +** Implementation of the scalar function icu_load_collation(). +** +** This scalar function is used to add ICU collation based collation +** types to an SQLite database connection. It is intended to be called +** as follows: +** +** SELECT icu_load_collation(, ); +** +** Where is a string containing an ICU locale identifier (i.e. +** "en_AU", "tr_TR" etc.) and is the name of the +** collation sequence to create. +*/ +static void icuLoadCollation( + sqlite3_context *p, + int nArg, + sqlite3_value **apArg +){ + sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); + UErrorCode status = U_ZERO_ERROR; + const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ + const char *zName; /* SQL Collation sequence name (eg. "japanese") */ + UCollator *pUCollator; /* ICU library collation object */ + int rc; /* Return code from sqlite3_create_collation_x() */ + + assert(nArg==2); + zLocale = (const char *)sqlite3_value_text(apArg[0]); + zName = (const char *)sqlite3_value_text(apArg[1]); + + if( !zLocale || !zName ){ + return; + } + + pUCollator = ucol_open(zLocale, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "ucol_open", status); + return; + } + assert(p); + + rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, + icuCollationColl, icuCollationDel + ); + if( rc!=SQLITE_OK ){ + ucol_close(pUCollator); + sqlite3_result_error(p, "Error registering collation function", -1); + } +} + +/* +** Register the ICU extension functions with database db. +*/ +int sqlite3IcuInit(sqlite3 *db){ + struct IcuScalar { + const char *zName; /* Function name */ + int nArg; /* Number of arguments */ + int enc; /* Optimal text encoding */ + void *pContext; /* sqlite3_user_data() context */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } scalars[] = { + {"regexp",-1, SQLITE_ANY, 0, icuRegexpFunc}, + + {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16}, + + {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16}, + + {"like", 2, SQLITE_UTF8, 0, icuLikeFunc}, + {"like", 3, SQLITE_UTF8, 0, icuLikeFunc}, + + {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, + }; + + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && i<(sizeof(scalars)/sizeof(struct IcuScalar)); i++){ + struct IcuScalar *p = &scalars[i]; + rc = sqlite3_create_function( + db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 + ); + } + + return rc; +} + +#if !SQLITE_CORE +int sqlite3_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3IcuInit(db); +} +#endif + +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/install-sh b/libraries/sqlite/unix/sqlite-3.5.1/install-sh new file mode 100755 index 0000000000..e9de23842d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh b/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh new file mode 100644 index 0000000000..8f7a6ac10d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh @@ -0,0 +1,6971 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# define SED for historic ltconfig's generated by Libtool 1.3 +test -z "$SED" && SED=sed + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.22 +TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +# Same for EGREP, and just to be sure, do LTCC as well +if test "X$EGREP" = X ; then + EGREP=egrep +fi +if test "X$LTCC" = X ; then + LTCC=${CC-gcc} +fi + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +if test -z "$max_cmd_len"; then + i=0 + testring="ABCD" + new_result= + + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$SHELL $0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + max_cmd_len="$new_result" && + test "$i" != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring="$testring$testring" + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + max_cmd_len=`expr $max_cmd_len \/ 2` +fi + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + # user sometimes does CC=-gcc so we need to match that to 'gcc' + trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` + # and sometimes libtool has CC=-gcc but user does CC=gcc + extendcc=${host}-${CC} + # and sometimes libtool has CC=-gcc but user has CC=-gcc + # (Gentoo-specific hack because we always export $CHOST) + mungedcc=${CHOST-${host}}-${trimedcc} + case "$@ " in + "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ + "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) + tagname=CC + break ;; + "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ + "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ + "$mungedcc "* | " $mungedcc "* | "`$echo $mungedcc` "* | " `$echo $mungedcc` "*|\ + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xdir="$my_gentop/$my_xlib" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2005 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$srcfile" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + fi + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -pg pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ + -t[45]*|-txscale*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + # It is ok to link against an archive when + # building a shared library. + if $AR -t $potlib > /dev/null 2>&1; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + else + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + + # Make sure env LD_LIBRARY_PATH does not mess us up + if test -n \"\${LD_LIBRARY_PATH+set}\"; then + export LD_LIBRARY_PATH=\$progdir:\$LD_LIBRARY_PATH + fi +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "X$EGREP" = X ; then + EGREP=egrep + fi + # We do not want portage's install root ($D) present. Check only for + # this if the .la is being installed. + if test "$installed" = yes && test "$D"; then + eval mynewdependency_lib=`echo "$libdir/$name" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` + else + mynewdependency_lib="$libdir/$name" + fi + # Do not add duplicates + if test "$mynewdependency_lib"; then + my_little_ninja_foo_1=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` + if test -z "$my_little_ninja_foo_1"; then + newdependency_libs="$newdependency_libs $mynewdependency_lib" + fi + fi + ;; + *) + if test "$installed" = yes; then + # Rather use S=WORKDIR if our version of portage supports it. + # This is because some ebuild (gcc) do not use $S as buildroot. + if test "$PWORKDIR"; then + S="$PWORKDIR" + fi + # We do not want portage's build root ($S) present. + my_little_ninja_foo_2=`echo $deplib |$EGREP -e "$S"` + # We do not want portage's install root ($D) present. + my_little_ninja_foo_3=`echo $deplib |$EGREP -e "$D"` + if test -n "$my_little_ninja_foo_2" && test "$S"; then + mynewdependency_lib="" + elif test -n "$my_little_ninja_foo_3" && test "$D"; then + eval mynewdependency_lib=`echo "$deplib" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` + else + mynewdependency_lib="$deplib" + fi + else + mynewdependency_lib="$deplib" + fi + # Do not add duplicates + if test "$mynewdependency_lib"; then + my_little_ninja_foo_4=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` + if test -z "$my_little_ninja_foo_4"; then + newdependency_libs="$newdependency_libs $mynewdependency_lib" + fi + fi + ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + # Do not add duplicates + if test "$installed" = yes && test "$D"; then + install_libdir=`echo "$install_libdir" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` + fi + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/main.mk b/libraries/sqlite/unix/sqlite-3.5.1/main.mk new file mode 100644 index 0000000000..c700c5bc73 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/main.mk @@ -0,0 +1,552 @@ +############################################################################### +# The following macros should be defined before this script is +# invoked: +# +# TOP The toplevel directory of the source tree. This is the +# directory that contains this "Makefile.in" and the +# "configure.in" script. +# +# BCC C Compiler and options for use in building executables that +# will run on the platform that is doing the build. +# +# THREADLIB Specify any extra linker options needed to make the library +# thread safe +# +# OPTS Extra compiler command-line options. +# +# EXE The suffix to add to executable files. ".exe" for windows +# and "" for Unix. +# +# TCC C Compiler and options for use in building executables that +# will run on the target platform. This is usually the same +# as BCC, unless you are cross-compiling. +# +# AR Tools used to build a static library. +# RANLIB +# +# TCL_FLAGS Extra compiler options needed for programs that use the +# TCL library. +# +# LIBTCL Linker options needed to link against the TCL library. +# +# READLINE_FLAGS Compiler options needed for programs that use the +# readline() library. +# +# LIBREADLINE Linker options needed by programs using readline() must +# link against. +# +# NAWK Nawk compatible awk program. Older (obsolete?) solaris +# systems need this to avoid using the original AT&T AWK. +# +# Once the macros above are defined, the rest of this make script will +# build the SQLite library and testing tools. +################################################################################ + +# This is how we compile +# +TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src + +# Object files for the SQLite library. +# +LIBOBJ+= alter.o analyze.o attach.o auth.o btmutex.o btree.o build.o \ + callback.o complete.o date.o delete.o \ + expr.o func.o hash.o insert.o journal.o loadext.o \ + main.o malloc.o mem1.o mem2.o mutex.o mutex_os2.o \ + mutex_unix.o mutex_w32.o \ + opcodes.o os.o os_os2.o os_unix.o os_win.o \ + pager.o parse.o pragma.o prepare.o printf.o random.o \ + select.o table.o tclsqlite.o tokenize.o trigger.o \ + update.o util.o vacuum.o \ + vdbe.o vdbeapi.o vdbeaux.o vdbeblob.o vdbefifo.o vdbemem.o \ + where.o utf.o legacy.o vtab.o + +EXTOBJ = icu.o +EXTOBJ += fts1.o \ + fts1_hash.o \ + fts1_tokenizer1.o \ + fts1_porter.o +EXTOBJ += fts2.o \ + fts2_hash.o \ + fts2_icu.o \ + fts2_porter.o \ + fts2_tokenizer.o \ + fts2_tokenizer1.o +EXTOBJ += fts3.o \ + fts3_hash.o \ + fts3_icu.o \ + fts3_porter.o \ + fts3_tokenizer.o \ + fts3_tokenizer1.o + +# All of the source code files. +# +SRC = \ + $(TOP)/src/alter.c \ + $(TOP)/src/analyze.c \ + $(TOP)/src/attach.c \ + $(TOP)/src/auth.c \ + $(TOP)/src/btmutex.c \ + $(TOP)/src/btree.c \ + $(TOP)/src/btree.h \ + $(TOP)/src/btreeInt.h \ + $(TOP)/src/build.c \ + $(TOP)/src/callback.c \ + $(TOP)/src/complete.c \ + $(TOP)/src/date.c \ + $(TOP)/src/delete.c \ + $(TOP)/src/expr.c \ + $(TOP)/src/func.c \ + $(TOP)/src/hash.c \ + $(TOP)/src/hash.h \ + $(TOP)/src/insert.c \ + $(TOP)/src/journal.c \ + $(TOP)/src/legacy.c \ + $(TOP)/src/loadext.c \ + $(TOP)/src/main.c \ + $(TOP)/src/malloc.c \ + $(TOP)/src/mem1.c \ + $(TOP)/src/mem2.c \ + $(TOP)/src/mutex.c \ + $(TOP)/src/mutex.h \ + $(TOP)/src/mutex_os2.c \ + $(TOP)/src/mutex_unix.c \ + $(TOP)/src/mutex_w32.c \ + $(TOP)/src/os.c \ + $(TOP)/src/os.h \ + $(TOP)/src/os_common.h \ + $(TOP)/src/os_os2.c \ + $(TOP)/src/os_unix.c \ + $(TOP)/src/os_win.c \ + $(TOP)/src/pager.c \ + $(TOP)/src/pager.h \ + $(TOP)/src/parse.y \ + $(TOP)/src/pragma.c \ + $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c \ + $(TOP)/src/random.c \ + $(TOP)/src/select.c \ + $(TOP)/src/shell.c \ + $(TOP)/src/sqlite.h.in \ + $(TOP)/src/sqlite3ext.h \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/sqliteLimit.h \ + $(TOP)/src/table.c \ + $(TOP)/src/tclsqlite.c \ + $(TOP)/src/tokenize.c \ + $(TOP)/src/trigger.c \ + $(TOP)/src/utf.c \ + $(TOP)/src/update.c \ + $(TOP)/src/util.c \ + $(TOP)/src/vacuum.c \ + $(TOP)/src/vdbe.c \ + $(TOP)/src/vdbe.h \ + $(TOP)/src/vdbeapi.c \ + $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbeblob.c \ + $(TOP)/src/vdbefifo.c \ + $(TOP)/src/vdbemem.c \ + $(TOP)/src/vdbeInt.h \ + $(TOP)/src/vtab.c \ + $(TOP)/src/where.c + +# Source code for extensions +# +SRC += \ + $(TOP)/ext/fts1/fts1.c \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.c \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_porter.c \ + $(TOP)/ext/fts1/fts1_tokenizer.h \ + $(TOP)/ext/fts1/fts1_tokenizer1.c +SRC += \ + $(TOP)/ext/fts2/fts2.c \ + $(TOP)/ext/fts2/fts2.h \ + $(TOP)/ext/fts2/fts2_hash.c \ + $(TOP)/ext/fts2/fts2_hash.h \ + $(TOP)/ext/fts2/fts2_icu.c \ + $(TOP)/ext/fts2/fts2_porter.c \ + $(TOP)/ext/fts2/fts2_tokenizer.h \ + $(TOP)/ext/fts2/fts2_tokenizer.c \ + $(TOP)/ext/fts2/fts2_tokenizer1.c +SRC += \ + $(TOP)/ext/fts3/fts3.c \ + $(TOP)/ext/fts3/fts3.h \ + $(TOP)/ext/fts3/fts3_hash.c \ + $(TOP)/ext/fts3/fts3_hash.h \ + $(TOP)/ext/fts3/fts3_icu.c \ + $(TOP)/ext/fts3/fts3_porter.c \ + $(TOP)/ext/fts3/fts3_tokenizer.h \ + $(TOP)/ext/fts3/fts3_tokenizer.c \ + $(TOP)/ext/fts3/fts3_tokenizer1.c +SRC += \ + $(TOP)/ext/icu/icu.c + + +# Generated source code files +# +SRC += \ + keywordhash.h \ + opcodes.c \ + opcodes.h \ + parse.c \ + parse.h \ + sqlite3.h + + +# Source code to the test files. +# +TESTSRC = \ + $(TOP)/src/test1.c \ + $(TOP)/src/test2.c \ + $(TOP)/src/test3.c \ + $(TOP)/src/test4.c \ + $(TOP)/src/test5.c \ + $(TOP)/src/test6.c \ + $(TOP)/src/test7.c \ + $(TOP)/src/test8.c \ + $(TOP)/src/test9.c \ + $(TOP)/src/test_autoext.c \ + $(TOP)/src/test_async.c \ + $(TOP)/src/test_btree.c \ + $(TOP)/src/test_config.c \ + $(TOP)/src/test_hexio.c \ + $(TOP)/src/test_malloc.c \ + $(TOP)/src/test_md5.c \ + $(TOP)/src/test_onefile.c \ + $(TOP)/src/test_schema.c \ + $(TOP)/src/test_server.c \ + $(TOP)/src/test_tclvar.c \ + $(TOP)/src/test_thread.c \ + +TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c +TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c + +TESTSRC2 = \ + $(TOP)/src/attach.c $(TOP)/src/btree.c $(TOP)/src/build.c $(TOP)/src/date.c \ + $(TOP)/src/expr.c $(TOP)/src/func.c $(TOP)/src/insert.c $(TOP)/src/os.c \ + $(TOP)/src/os_os2.c $(TOP)/src/os_unix.c $(TOP)/src/os_win.c \ + $(TOP)/src/pager.c $(TOP)/src/pragma.c $(TOP)/src/prepare.c \ + $(TOP)/src/printf.c $(TOP)/src/select.c $(TOP)/src/tokenize.c \ + $(TOP)/src/utf.c $(TOP)/src/util.c $(TOP)/src/vdbeapi.c $(TOP)/src/vdbeaux.c \ + $(TOP)/src/vdbe.c $(TOP)/src/vdbemem.c $(TOP)/src/where.c parse.c + +# Header files used by all library source files. +# +HDR = \ + $(TOP)/src/btree.h \ + $(TOP)/src/btreeInt.h \ + $(TOP)/src/hash.h \ + keywordhash.h \ + $(TOP)/src/mutex.h \ + opcodes.h \ + $(TOP)/src/os.h \ + $(TOP)/src/os_common.h \ + $(TOP)/src/pager.h \ + parse.h \ + sqlite3.h \ + $(TOP)/src/sqlite3ext.h \ + $(TOP)/src/sqliteInt.h \ + $(TOP)/src/sqliteLimit.h \ + $(TOP)/src/vdbe.h \ + $(TOP)/src/vdbeInt.h + +# Header files used by extensions +# +EXTHDR += \ + $(TOP)/ext/fts1/fts1.h \ + $(TOP)/ext/fts1/fts1_hash.h \ + $(TOP)/ext/fts1/fts1_tokenizer.h +EXTHDR += \ + $(TOP)/ext/fts2/fts2.h \ + $(TOP)/ext/fts2/fts2_hash.h \ + $(TOP)/ext/fts2/fts2_tokenizer.h +EXTHDR += \ + $(TOP)/ext/fts3/fts3.h \ + $(TOP)/ext/fts3/fts3_hash.h \ + $(TOP)/ext/fts3/fts3_tokenizer.h + +# This is the default Makefile target. The objects listed here +# are what get build when you type just "make" with no arguments. +# +all: sqlite3.h libsqlite3.a sqlite3$(EXE) + +# Generate the file "last_change" which contains the date of change +# of the most recently modified source code file +# +last_change: $(SRC) + cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ + | $(NAWK) '{print $$5,$$6}' >last_change + +libsqlite3.a: $(LIBOBJ) + $(AR) libsqlite3.a $(LIBOBJ) + $(RANLIB) libsqlite3.a + +sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h + $(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) \ + $(TOP)/src/shell.c \ + libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) + +objects: $(LIBOBJ_ORIG) + +# This target creates a directory named "tsrc" and fills it with +# copies of all of the C source code and header files needed to +# build on the target system. Some of the C source code and header +# files are automatically generated. This target takes care of +# all that automatic generation. +# +target_source: $(SRC) + rm -rf tsrc + mkdir tsrc + cp -f $(SRC) tsrc + rm tsrc/sqlite.h.in tsrc/parse.y + +sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl + tclsh $(TOP)/tool/mksqlite3c.tcl + cp sqlite3.c tclsqlite3.c + cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c + tclsh $(TOP)/tool/mksqlite3internalh.tcl + +fts2amal.c: target_source $(TOP)/ext/fts2/mkfts2amal.tcl + tclsh $(TOP)/ext/fts2/mkfts2amal.tcl + +fts3amal.c: target_source $(TOP)/ext/fts3/mkfts3amal.tcl + tclsh $(TOP)/ext/fts3/mkfts3amal.tcl + +# Rules to build the LEMON compiler generator +# +lemon: $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c + $(BCC) -o lemon $(TOP)/tool/lemon.c + cp $(TOP)/tool/lempar.c . + +# Rules to build individual *.o files from files in the src directory. +# +%.o: %.c $(HDR) + $(TCCX) -c $< + +# Rules to build individual *.o files from generated *.c files. This +# applies to: +# +# parse.o +# opcodes.o +# +%.o: $(TOP)/src/%.c $(HDR) + $(TCCX) -c $< + +tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) + $(TCCX) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c + + + +# Rules to build opcodes.c and opcodes.h +# +opcodes.c: opcodes.h $(TOP)/mkopcodec.awk + sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c + +opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk + cat parse.h $(TOP)/src/vdbe.c |$(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h + + +# Rules to build parse.c and parse.h - the outputs of lemon. +# +parse.h: parse.c + +parse.c: $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk + cp $(TOP)/src/parse.y . + ./lemon $(OPTS) parse.y + mv parse.h parse.h.temp + awk -f $(TOP)/addopcodes.awk parse.h.temp >parse.h + +sqlite3.h: $(TOP)/src/sqlite.h.in + sed -e s/--VERS--/`cat ${TOP}/VERSION`/ \ + -e s/--VERSION-NUMBER--/`cat ${TOP}/VERSION | sed 's/[^0-9]/ /g' | $(NAWK) '{printf "%d%03d%03d",$$1,$$2,$$3}'`/ \ + $(TOP)/src/sqlite.h.in >sqlite3.h + +keywordhash.h: $(TOP)/tool/mkkeywordhash.c + $(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c + ./mkkeywordhash >keywordhash.h + + + +# Rules to build the extension objects. +# +icu.o: $(TOP)/ext/icu/icu.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/icu/icu.c + +fts2.o: $(TOP)/ext/fts2/fts2.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2.c + +fts2_hash.o: $(TOP)/ext/fts2/fts2_hash.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_hash.c + +fts2_icu.o: $(TOP)/ext/fts2/fts2_icu.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_icu.c + +fts2_porter.o: $(TOP)/ext/fts2/fts2_porter.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_porter.c + +fts2_tokenizer.o: $(TOP)/ext/fts2/fts2_tokenizer.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer.c + +fts2_tokenizer1.o: $(TOP)/ext/fts2/fts2_tokenizer1.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer1.c + +fts3.o: $(TOP)/ext/fts3/fts3.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3.c + +fts3_hash.o: $(TOP)/ext/fts3/fts3_hash.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_hash.c + +fts3_icu.o: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_icu.c + +fts3_porter.o: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c + +fts3_tokenizer.o: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer.c + +fts3_tokenizer1.o: $(TOP)/ext/fts3/fts3_tokenizer1.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer1.c + + +# Rules for building test programs and for running tests +# +tclsqlite3: $(TOP)/src/tclsqlite.c libsqlite3.a + $(TCCX) $(TCL_FLAGS) -DTCLSH=1 -o tclsqlite3 \ + $(TOP)/src/tclsqlite.c libsqlite3.a $(LIBTCL) $(THREADLIB) + + +# Rules to build the 'testfixture' application. +# +TESTFIXTURE_FLAGS = -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 +TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE + +testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c + $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ + $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ + -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) libsqlite3.a + +amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c + $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ + $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ + -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) + +fulltest: testfixture$(EXE) sqlite3$(EXE) + ./testfixture$(EXE) $(TOP)/test/all.test + +soaktest: testfixture$(EXE) sqlite3$(EXE) + ./testfixture$(EXE) $(TOP)/test/all.test -soak 1 + +test: testfixture$(EXE) sqlite3$(EXE) + ./testfixture$(EXE) $(TOP)/test/quick.test + +sqlite3_analyzer$(EXE): $(TOP)/src/tclsqlite.c sqlite3.c $(TESTSRC) \ + $(TOP)/tool/spaceanal.tcl + sed \ + -e '/^#/d' \ + -e 's,\\,\\\\,g' \ + -e 's,",\\",g' \ + -e 's,^,",' \ + -e 's,$$,\\n",' \ + $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h + $(TCCX) $(TCL_FLAGS) \ + -DTCLSH=2 -DSQLITE_TEST=1 -DSQLITE_DEBUG=1 -DSQLITE_PRIVATE="" \ + $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ + -o sqlite3_analyzer$(EXE) \ + $(LIBTCL) $(THREADLIB) + +TEST_EXTENSION = $(SHPREFIX)testloadext.$(SO) +$(TEST_EXTENSION): $(TOP)/src/test_loadext.c + $(MKSHLIB) $(TOP)/src/test_loadext.c -o $(TEST_EXTENSION) + +extensiontest: testfixture$(EXE) $(TEST_EXTENSION) + ./testfixture$(EXE) $(TOP)/test/loadext.test + + +# Rules used to build documentation +# +%.html: $(TOP)/www/%.tcl docdir last_change common.tcl + tclsh $< > $@ + +lang.html: $(TOP)/www/lang.tcl docdir + tclsh $(TOP)/www/lang.tcl doc >lang.html + +opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c + tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html + +capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h + tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html + +copyright-release.html: $(TOP)/www/copyright-release.html + cp $(TOP)/www/copyright-release.html . + +%: $(TOP)/www/% + cp $< $@ + +# Files to be published on the website. +# +DOC = \ + arch.html \ + autoinc.html \ + c_interface.html \ + capi3.html \ + capi3ref.html \ + changes.html \ + compile.html \ + copyright.html \ + copyright-release.html \ + copyright-release.pdf \ + conflict.html \ + datatypes.html \ + datatype3.html \ + different.html \ + docs.html \ + download.html \ + faq.html \ + fileformat.html \ + formatchng.html \ + index.html \ + limits.html \ + lang.html \ + lockingv3.html \ + mingw.html \ + nulls.html \ + oldnews.html \ + omitted.html \ + opcode.html \ + optimizer.html \ + optoverview.html \ + pragma.html \ + quickstart.html \ + sharedcache.html \ + speed.html \ + sqlite.html \ + support.html \ + tclsqlite.html \ + vdbe.html \ + version3.html \ + whentouse.html \ + 34to35.html + +docdir: + mkdir -p doc + +doc: common.tcl $(DOC) docdir + mv $(DOC) doc + cp $(TOP)/www/*.gif $(TOP)/art/*.gif doc + +# Standard install and cleanup targets +# +install: sqlite3 libsqlite3.a sqlite3.h + mv sqlite3 /usr/bin + mv libsqlite3.a /usr/lib + mv sqlite3.h /usr/include + +clean: + rm -f *.o sqlite3 libsqlite3.a sqlite3.h opcodes.* + rm -f lemon lempar.c parse.* sqlite*.tar.gz mkkeywordhash keywordhash.h + rm -f $(PUBLISH) + rm -f *.da *.bb *.bbg gmon.out + rm -rf tsrc + rm -f testloadext.dll libtestloadext.so diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh new file mode 100644 index 0000000000..e1e6d98818 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# +# This script is used to compile SQLite into a DLL. +# +# Two separate DLLs are generated. "sqlite3.dll" is the core +# library. "tclsqlite3.dll" contains the TCL bindings and is the +# library that is loaded into TCL in order to run SQLite. +# +make sqlite3.c +PATH=$PATH:/opt/mingw/bin +TCLDIR=/home/drh/tcltk/846/win/846win +TCLSTUBLIB=$TCLDIR/libtcl84stub.a +OPTS='-DUSE_TCL_STUBS=1 -DTHREADSAFE=1 -DBUILD_sqlite=1 -DOS_WIN=1' +CC="i386-mingw32msvc-gcc -O2 $OPTS -Itsrc -I$TCLDIR" +NM="i386-mingw32msvc-nm" +CMD="$CC -c sqlite3.c" +echo $CMD +$CMD +CMD="$CC -c tclsqlite3.c" +echo $CMD +$CMD +echo 'EXPORTS' >tclsqlite3.def +$NM tclsqlite3.o | grep ' T ' >temp1 +grep '_Init$' temp1 >temp2 +grep '_SafeInit$' temp1 >>temp2 +grep ' T _sqlite3_' temp1 >>temp2 +echo 'EXPORTS' >tclsqlite3.def +sed 's/^.* T _//' temp2 | sort | uniq >>tclsqlite3.def +i386-mingw32msvc-dllwrap \ + --def tclsqlite3.def -v --export-all \ + --driver-name i386-mingw32msvc-gcc \ + --dlltool-name i386-mingw32msvc-dlltool \ + --as i386-mingw32msvc-as \ + --target i386-mingw32 \ + -dllname tclsqlite3.dll -lmsvcrt tclsqlite3.o $TCLSTUBLIB +$NM sqlite3.o | grep ' T ' >temp1 +echo 'EXPORTS' >sqlite3.def +grep ' _sqlite3_' temp1 | sed 's/^.* _//' >>sqlite3.def +i386-mingw32msvc-dllwrap \ + --def sqlite3.def -v --export-all \ + --driver-name i386-mingw32msvc-gcc \ + --dlltool-name i386-mingw32msvc-dlltool \ + --as i386-mingw32msvc-as \ + --target i386-mingw32 \ + -dllname sqlite3.dll -lmsvcrt sqlite3.o diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh new file mode 100644 index 0000000000..1d96897769 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# +# This script is used to compile SQLite into a shared library on Linux. +# +# Two separate shared libraries are generated. "sqlite3.so" is the core +# library. "tclsqlite3.so" contains the TCL bindings and is the +# library that is loaded into TCL in order to run SQLite. +# +CFLAGS=-O2 -Wall +make fts2amal.c +echo gcc $CFLAGS -shared fts2amal.c -o fts2.so +gcc $CFLAGS -shared fts2amal.c -o fts2.so +strip fts2.so diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh new file mode 100644 index 0000000000..3332f912f3 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# This script is used to compile SQLite extensions into DLLs. +# +make fts2amal.c +PATH=$PATH:/opt/mingw/bin +OPTS='-DTHREADSAFE=1 -DBUILD_sqlite=1 -DOS_WIN=1' +CC="i386-mingw32msvc-gcc -O2 $OPTS -Itsrc" +NM="i386-mingw32msvc-nm" +CMD="$CC -c fts2amal.c" +echo $CMD +$CMD +echo 'EXPORTS' >fts2.def +echo 'sqlite3_extension_init' >>fts2.def +i386-mingw32msvc-dllwrap \ + --def fts2.def -v --export-all \ + --driver-name i386-mingw32msvc-gcc \ + --dlltool-name i386-mingw32msvc-dlltool \ + --as i386-mingw32msvc-as \ + --target i386-mingw32 \ + -dllname fts2.dll -lmsvcrt fts2amal.o +zip fts2dll.zip fts2.dll fts2.def diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk new file mode 100644 index 0000000000..ec80953009 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk @@ -0,0 +1,31 @@ +#!/usr/bin/awk -f +# +# This AWK script scans the opcodes.h file (which is itself generated by +# another awk script) and uses the information gleaned to create the +# opcodes.c source file. +# +# Opcodes.c contains strings which are the symbolic names for the various +# opcodes used by the VDBE. These strings are used when disassembling a +# VDBE program during tracing or as a result of the EXPLAIN keyword. +# +BEGIN { + print "/* Automatically generated. Do not edit */" + print "/* See the mkopcodec.awk script for details. */" + printf "#if !defined(SQLITE_OMIT_EXPLAIN)" + printf " || !defined(NDEBUG)" + printf " || defined(VDBE_PROFILE)" + print " || defined(SQLITE_DEBUG)" + print "const char *sqlite3OpcodeName(int i){" + print " static const char *const azName[] = { \"?\"," +} +/define OP_/ { + sub("OP_","",$2) + i++ + printf " /* %3d */ \"%s\",\n", $3, $2 +} +END { + print " };" + print " return azName[i];" + print "}" + print "#endif" +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk new file mode 100644 index 0000000000..c0874b1439 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk @@ -0,0 +1,127 @@ +#!/usr/bin/awk -f +# +# Generate the file opcodes.h. +# +# This AWK script scans a concatenation of the parse.h output file from the +# parser and the vdbe.c source file in order to generate the opcodes numbers +# for all opcodes. +# +# The lines of the vdbe.c that we are interested in are of the form: +# +# case OP_aaaa: /* same as TK_bbbbb */ +# +# The TK_ comment is optional. If it is present, then the value assigned to +# the OP_ is the same as the TK_ value. If missing, the OP_ value is assigned +# a small integer that is different from every other OP_ value. +# +# We go to the trouble of making some OP_ values the same as TK_ values +# as an optimization. During parsing, things like expression operators +# are coded with TK_ values such as TK_ADD, TK_DIVIDE, and so forth. Later +# during code generation, we need to generate corresponding opcodes like +# OP_Add and OP_Divide. By making TK_ADD==OP_Add and TK_DIVIDE==OP_Divide, +# code to translate from one to the other is avoided. This makes the +# code generator run (infinitesimally) faster and more importantly it makes +# the library footprint smaller. +# +# This script also scans for lines of the form: +# +# case OP_aaaa: /* no-push */ +# +# When the no-push comment is found on an opcode, it means that that +# opcode does not leave a result on the stack. By identifying which +# opcodes leave results on the stack it is possible to determine a +# much smaller upper bound on the size of the stack. This allows +# a smaller stack to be allocated, which is important to embedded +# systems with limited memory space. This script generates a series +# of "NOPUSH_MASK" defines that contain bitmaps of opcodes that leave +# results on the stack. The NOPUSH_MASK defines are used in vdbeaux.c +# to help determine the maximum stack size. +# + + +# Remember the TK_ values from the parse.h file +/^#define TK_/ { + tk[$2] = $3 +} + +# Scan for "case OP_aaaa:" lines in the vdbe.c file +/^case OP_/ { + name = $2 + sub(/:/,"",name) + sub("\r","",name) + op[name] = -1 + for(i=3; imax ) max = op[name] + printf "#define %-25s %15d", name, op[name] + if( sameas[op[name]] ) { + printf " /* same as %-12s*/", sameas[op[name]] + } + printf "\n" + + } + seenUnused = 0; + for(i=1; i $HOME/.rpmmacros +echo "%_topdir %{HOME}/rpm" >> $HOME/.rpmmacros +mkdir $HOME/rpm +mkdir $HOME/rpm/BUILD +mkdir $HOME/rpm/SOURCES +mkdir $HOME/rpm/RPMS +mkdir $HOME/rpm/SRPMS +mkdir $HOME/rpm/SPECS + +# create the spec file from the template +sed s/SQLITE_VERSION/$VERS/g $srcdir/spec.template > $HOME/rpm/SPECS/sqlite.spec + +# copy the source tarball to the rpm directory +cp doc/sqlite-$VERS.tar.gz $HOME/rpm/SOURCES/. + +# build all the rpms +rpm -ba $HOME/rpm/SPECS/sqlite.spec >& rpm-$vers.log + +# copy the RPMs into the build directory. +mv $HOME/rpm/RPMS/i386/sqlite*-$vers*.rpm doc +mv $HOME/rpm/SRPMS/sqlite-$vers*.rpm doc + +# Build the website +# +#cp $srcdir/../historical/* doc +make doc +cd doc +chmod 644 *.gz diff --git a/libraries/sqlite/unix/sqlite-3.5.1/spec.template b/libraries/sqlite/unix/sqlite-3.5.1/spec.template new file mode 100644 index 0000000000..24c5eaebb8 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/spec.template @@ -0,0 +1,62 @@ +%define name sqlite +%define version SQLITE_VERSION +%define release 1 + +Name: %{name} +Summary: SQLite is a C library that implements an embeddable SQL database engine +Version: %{version} +Release: %{release} +Source: %{name}-%{version}.tar.gz +Group: System/Libraries +URL: http://www.hwaci.com/sw/sqlite/ +License: Public Domain +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +SQLite is a C library that implements an embeddable SQL database engine. +Programs that link with the SQLite library can have SQL database access +without running a separate RDBMS process. The distribution comes with a +standalone command-line access program (sqlite) that can be used to +administer an SQLite database and which serves as an example of how to +use the SQLite library. + +%package -n %{name}-devel +Summary: Header files and libraries for developing apps which will use sqlite +Group: Development/C +Requires: %{name} = %{version}-%{release} + +%description -n %{name}-devel +The sqlite-devel package contains the header files and libraries needed +to develop programs that use the sqlite database library. + +%prep +%setup -q -n %{name} + +%build +CFLAGS="%optflags -DNDEBUG=1" CXXFLAGS="%optflags -DNDEBUG=1" ./configure --prefix=%{_prefix} + +make +make doc + +%install +install -d $RPM_BUILD_ROOT/%{_prefix} +install -d $RPM_BUILD_ROOT/%{_prefix}/bin +install -d $RPM_BUILD_ROOT/%{_prefix}/include +install -d $RPM_BUILD_ROOT/%{_prefix}/lib +make install prefix=$RPM_BUILD_ROOT/%{_prefix} + +%clean +rm -fr $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) +%{_libdir}/*.so* +%{_bindir}/* + +%files -n %{name}-devel +%defattr(-, root, root) +%{_libdir}/pkgconfig/sqlite3.pc +%{_libdir}/*.a +%{_libdir}/*.la +%{_includedir}/* +%doc doc/* diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in b/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in new file mode 100644 index 0000000000..16ed41c3d9 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: SQLite +Description: SQL database engine +Version: @VERSION@ +Libs: -L${libdir} -lsqlite +Cflags: -I${includedir} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 new file mode 100644 index 0000000000..785995bf60 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 @@ -0,0 +1,229 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH SQLITE3 1 "Mon Apr 15 23:49:17 2002" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +.B sqlite3 +\- A command line interface for SQLite version 3 + +.SH SYNOPSIS +.B sqlite3 +.RI [ options ] +.RI [ databasefile ] +.RI [ SQL ] + +.SH SUMMARY +.PP +.B sqlite3 +is a terminal-based front-end to the SQLite library that can evaluate +queries interactively and display the results in multiple formats. +.B sqlite3 +can also be used within shell scripts and other applications to provide +batch processing features. + +.SH DESCRIPTION +To start a +.B sqlite3 +interactive session, invoke the +.B sqlite3 +command and optionally provide the name of a database file. If the +database file does not exist, it will be created. If the database file +does exist, it will be opened. + +For example, to create a new database file named "mydata.db", create +a table named "memos" and insert a couple of records into that table: +.sp +$ +.B sqlite3 mydata.db +.br +SQLite version 3.1.3 +.br +Enter ".help" for instructions +.br +sqlite> +.B create table memos(text, priority INTEGER); +.br +sqlite> +.B insert into memos values('deliver project description', 10); +.br +sqlite> +.B insert into memos values('lunch with Christine', 100); +.br +sqlite> +.B select * from memos; +.br +deliver project description|10 +.br +lunch with Christine|100 +.br +sqlite> +.sp + +If no database name is supplied, the ATTACH sql command can be used +to attach to existing or create new database files. ATTACH can also +be used to attach to multiple databases within the same interactive +session. This is useful for migrating data between databases, +possibly changing the schema along the way. + +Optionally, a SQL statement or set of SQL statements can be supplied as +a single argument. Multiple statements should be separated by +semi-colons. + +For example: +.sp +$ +.B sqlite3 -line mydata.db 'select * from memos where priority > 20;' +.br + text = lunch with Christine +.br +priority = 100 +.br +.sp + +.SS SQLITE META-COMMANDS +.PP +The interactive interpreter offers a set of meta-commands that can be +used to control the output format, examine the currently attached +database files, or perform administrative operations upon the +attached databases (such as rebuilding indices). Meta-commands are +always prefixed with a dot (.). + +A list of available meta-commands can be viewed at any time by issuing +the '.help' command. For example: +.sp +sqlite> +.B .help +.nf +.cc | +.databases List names and files of attached databases +.dump ?TABLE? ... Dump the database in an SQL text format +.echo ON|OFF Turn command echo on or off +.exit Exit this program +.explain ON|OFF Turn output mode suitable for EXPLAIN on or off. +.header(s) ON|OFF Turn display of headers on or off +.help Show this message +.import FILE TABLE Import data from FILE into TABLE +.indices TABLE Show names of all indices on TABLE +.mode MODE ?TABLE? Set output mode where MODE is one of: + csv Comma-separated values + column Left-aligned columns. (See .width) + html HTML code + insert SQL insert statements for TABLE + line One value per line + list Values delimited by .separator string + tabs Tab-separated values + tcl TCL list elements +.nullvalue STRING Print STRING in place of NULL values +.output FILENAME Send output to FILENAME +.output stdout Send output to the screen +.prompt MAIN CONTINUE Replace the standard prompts +.quit Exit this program +.read FILENAME Execute SQL in FILENAME +.schema ?TABLE? Show the CREATE statements +.separator STRING Change separator used by output mode and .import +.show Show the current values for various settings +.tables ?PATTERN? List names of tables matching a LIKE pattern +.timeout MS Try opening locked tables for MS milliseconds +.width NUM NUM ... Set column widths for "column" mode +sqlite> +|cc . +.sp +.fi + +.SH OPTIONS +.B sqlite3 +has the following options: +.TP +.BI \-init\ file +Read and execute commands from +.I file +, which can contain a mix of SQL statements and meta-commands. +.TP +.B \-echo +Print commands before execution. +.TP +.B \-[no]header +Turn headers on or off. +.TP +.B \-column +Query results will be displayed in a table like form, using +whitespace characters to separate the columns and align the +output. +.TP +.B \-html +Query results will be output as simple HTML tables. +.TP +.B \-line +Query results will be displayed with one value per line, rows +separated by a blank line. Designed to be easily parsed by +scripts or other programs +.TP +.B \-list +Query results will be displayed with the separator (|, by default) +character between each field value. The default. +.TP +.BI \-separator\ separator +Set output field separator. Default is '|'. +.TP +.BI \-nullvalue\ string +Set string used to represent NULL values. Default is '' +(empty string). +.TP +.B \-version +Show SQLite version. +.TP +.B \-help +Show help on options and exit. + + +.SH INIT FILE +.B sqlite3 +reads an initialization file to set the configuration of the +interactive environment. Throughout initialization, any previously +specified setting can be overridden. The sequence of initialization is +as follows: + +o The default configuration is established as follows: + +.sp +.nf +.cc | +mode = LIST +separator = "|" +main prompt = "sqlite> " +continue prompt = " ...> " +|cc . +.sp +.fi + +o If the file +.B ~/.sqliterc +exists, it is processed first. +can be found in the user's home directory, it is +read and processed. It should generally only contain meta-commands. + +o If the -init option is present, the specified file is processed. + +o All other command line options are processed. + +.SH SEE ALSO +http://www.sqlite.org/ +.br +The sqlite-doc package +.SH AUTHOR +This manual page was originally written by Andreas Rottmann +, for the Debian GNU/Linux system (but may be used +by others). It was subsequently revised by Bill Bumgarner . diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in new file mode 100644 index 0000000000..c14b5ba33a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: SQLite +Description: SQL database engine +Version: @VERSION@ +Libs: -L${libdir} -lsqlite3 +Cflags: -I${includedir} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c b/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c new file mode 100644 index 0000000000..9d1ebd22cb --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c @@ -0,0 +1,622 @@ +/* +** 2005 February 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains C code routines that used to generate VDBE code +** that implements the ALTER TABLE command. +** +** $Id: alter.c,v 1.32 2007/08/29 14:06:23 danielk1977 Exp $ +*/ +#include "sqliteInt.h" +#include + +/* +** The code in this file only exists if we are not omitting the +** ALTER TABLE logic from the build. +*/ +#ifndef SQLITE_OMIT_ALTERTABLE + + +/* +** This function is used by SQL generated to implement the +** ALTER TABLE command. The first argument is the text of a CREATE TABLE or +** CREATE INDEX command. The second is a table name. The table name in +** the CREATE TABLE or CREATE INDEX statement is replaced with the third +** argument and the result returned. Examples: +** +** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def') +** -> 'CREATE TABLE def(a, b, c)' +** +** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def') +** -> 'CREATE INDEX i ON def(a, b, c)' +*/ +static void renameTableFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char const *zSql = sqlite3_value_text(argv[0]); + unsigned char const *zTableName = sqlite3_value_text(argv[1]); + + int token; + Token tname; + unsigned char const *zCsr = zSql; + int len = 0; + char *zRet; + + sqlite3 *db = sqlite3_user_data(context); + + /* The principle used to locate the table name in the CREATE TABLE + ** statement is that the table name is the first token that is immediatedly + ** followed by a left parenthesis - TK_LP - or "USING" TK_USING. + */ + if( zSql ){ + do { + if( !*zCsr ){ + /* Ran out of input before finding an opening bracket. Return NULL. */ + return; + } + + /* Store the token that zCsr points to in tname. */ + tname.z = zCsr; + tname.n = len; + + /* Advance zCsr to the next token. Store that token type in 'token', + ** and it's length in 'len' (to be used next iteration of this loop). + */ + do { + zCsr += len; + len = sqlite3GetToken(zCsr, &token); + } while( token==TK_SPACE ); + assert( len>0 ); + } while( token!=TK_LP && token!=TK_USING ); + + zRet = sqlite3MPrintf(db, "%.*s%Q%s", tname.z - zSql, zSql, + zTableName, tname.z+tname.n); + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } +} + +#ifndef SQLITE_OMIT_TRIGGER +/* This function is used by SQL generated to implement the +** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER +** statement. The second is a table name. The table name in the CREATE +** TRIGGER statement is replaced with the third argument and the result +** returned. This is analagous to renameTableFunc() above, except for CREATE +** TRIGGER, not CREATE INDEX and CREATE TABLE. +*/ +static void renameTriggerFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char const *zSql = sqlite3_value_text(argv[0]); + unsigned char const *zTableName = sqlite3_value_text(argv[1]); + + int token; + Token tname; + int dist = 3; + unsigned char const *zCsr = zSql; + int len = 0; + char *zRet; + + sqlite3 *db = sqlite3_user_data(context); + + /* The principle used to locate the table name in the CREATE TRIGGER + ** statement is that the table name is the first token that is immediatedly + ** preceded by either TK_ON or TK_DOT and immediatedly followed by one + ** of TK_WHEN, TK_BEGIN or TK_FOR. + */ + if( zSql ){ + do { + + if( !*zCsr ){ + /* Ran out of input before finding the table name. Return NULL. */ + return; + } + + /* Store the token that zCsr points to in tname. */ + tname.z = zCsr; + tname.n = len; + + /* Advance zCsr to the next token. Store that token type in 'token', + ** and it's length in 'len' (to be used next iteration of this loop). + */ + do { + zCsr += len; + len = sqlite3GetToken(zCsr, &token); + }while( token==TK_SPACE ); + assert( len>0 ); + + /* Variable 'dist' stores the number of tokens read since the most + ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN + ** token is read and 'dist' equals 2, the condition stated above + ** to be met. + ** + ** Note that ON cannot be a database, table or column name, so + ** there is no need to worry about syntax like + ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc. + */ + dist++; + if( token==TK_DOT || token==TK_ON ){ + dist = 0; + } + } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) ); + + /* Variable tname now contains the token that is the old table-name + ** in the CREATE TRIGGER statement. + */ + zRet = sqlite3MPrintf(db, "%.*s%Q%s", tname.z - zSql, zSql, + zTableName, tname.z+tname.n); + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } +} +#endif /* !SQLITE_OMIT_TRIGGER */ + +/* +** Register built-in functions used to help implement ALTER TABLE +*/ +void sqlite3AlterFunctions(sqlite3 *db){ + static const struct { + char *zName; + signed char nArg; + void (*xFunc)(sqlite3_context*,int,sqlite3_value **); + } aFuncs[] = { + { "sqlite_rename_table", 2, renameTableFunc}, +#ifndef SQLITE_OMIT_TRIGGER + { "sqlite_rename_trigger", 2, renameTriggerFunc}, +#endif + }; + int i; + + for(i=0; idb->aDb[1].pSchema; /* Temp db schema */ + + /* If the table is not located in the temp-db (in which case NULL is + ** returned, loop through the tables list of triggers. For each trigger + ** that is not part of the temp-db schema, add a clause to the WHERE + ** expression being built up in zWhere. + */ + if( pTab->pSchema!=pTempSchema ){ + sqlite3 *db = pParse->db; + for( pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext ){ + if( pTrig->pSchema==pTempSchema ){ + if( !zWhere ){ + zWhere = sqlite3MPrintf(db, "name=%Q", pTrig->name); + }else{ + tmp = zWhere; + zWhere = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, pTrig->name); + sqlite3_free(tmp); + } + } + } + } + return zWhere; +} + +/* +** Generate code to drop and reload the internal representation of table +** pTab from the database, including triggers and temporary triggers. +** Argument zName is the name of the table in the database schema at +** the time the generated code is executed. This can be different from +** pTab->zName if this function is being called to code part of an +** "ALTER TABLE RENAME TO" statement. +*/ +static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){ + Vdbe *v; + char *zWhere; + int iDb; /* Index of database containing pTab */ +#ifndef SQLITE_OMIT_TRIGGER + Trigger *pTrig; +#endif + + v = sqlite3GetVdbe(pParse); + if( !v ) return; + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 ); + +#ifndef SQLITE_OMIT_TRIGGER + /* Drop any table triggers from the internal schema. */ + for(pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext){ + int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); + assert( iTrigDb==iDb || iTrigDb==1 ); + sqlite3VdbeOp3(v, OP_DropTrigger, iTrigDb, 0, pTrig->name, 0); + } +#endif + + /* Drop the table and index from the internal schema */ + sqlite3VdbeOp3(v, OP_DropTable, iDb, 0, pTab->zName, 0); + + /* Reload the table, index and permanent trigger schemas. */ + zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName); + if( !zWhere ) return; + sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, zWhere, P3_DYNAMIC); + +#ifndef SQLITE_OMIT_TRIGGER + /* Now, if the table is not stored in the temp database, reload any temp + ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined. + */ + if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ + sqlite3VdbeOp3(v, OP_ParseSchema, 1, 0, zWhere, P3_DYNAMIC); + } +#endif +} + +/* +** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" +** command. +*/ +void sqlite3AlterRenameTable( + Parse *pParse, /* Parser context. */ + SrcList *pSrc, /* The table to rename. */ + Token *pName /* The new table name. */ +){ + int iDb; /* Database that contains the table */ + char *zDb; /* Name of database iDb */ + Table *pTab; /* Table being renamed */ + char *zName = 0; /* NULL-terminated version of pName */ + sqlite3 *db = pParse->db; /* Database connection */ + int nTabName; /* Number of UTF-8 characters in zTabName */ + const char *zTabName; /* Original name of the table */ + Vdbe *v; +#ifndef SQLITE_OMIT_TRIGGER + char *zWhere = 0; /* Where clause to locate temp triggers */ +#endif + int isVirtualRename = 0; /* True if this is a v-table with an xRename() */ + + if( db->mallocFailed ) goto exit_rename_table; + assert( pSrc->nSrc==1 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + + pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase); + if( !pTab ) goto exit_rename_table; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + zDb = db->aDb[iDb].zName; + + /* Get a NULL terminated version of the new table name. */ + zName = sqlite3NameFromToken(db, pName); + if( !zName ) goto exit_rename_table; + + /* Check that a table or index named 'zName' does not already exist + ** in database iDb. If so, this is an error. + */ + if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){ + sqlite3ErrorMsg(pParse, + "there is already another table or index with this name: %s", zName); + goto exit_rename_table; + } + + /* Make sure it is not a system table being altered, or a reserved name + ** that the table is being renamed to. + */ + if( strlen(pTab->zName)>6 && 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); + goto exit_rename_table; + } + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto exit_rename_table; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_rename_table; + } + if( IsVirtual(pTab) && pTab->pMod->pModule->xRename ){ + isVirtualRename = 1; + } +#endif + + /* Begin a transaction and code the VerifyCookie for database iDb. + ** Then modify the schema cookie (since the ALTER TABLE modifies the + ** schema). Open a statement transaction if the table is a virtual + ** table. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto exit_rename_table; + } + sqlite3BeginWriteOperation(pParse, isVirtualRename, iDb); + sqlite3ChangeCookie(db, v, iDb); + + /* If this is a virtual table, invoke the xRename() function if + ** one is defined. The xRename() callback will modify the names + ** of any resources used by the v-table implementation (including other + ** SQLite tables) that are identified by the name of the virtual table. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( isVirtualRename ){ + sqlite3VdbeOp3(v, OP_String8, 0, 0, zName, 0); + sqlite3VdbeOp3(v, OP_VRename, 0, 0, (const char*)pTab->pVtab, P3_VTAB); + } +#endif + + /* figure out how many UTF-8 characters are in zName */ + zTabName = pTab->zName; + nTabName = sqlite3Utf8CharLen(zTabName, -1); + + /* Modify the sqlite_master table to use the new table name. */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET " +#ifdef SQLITE_OMIT_TRIGGER + "sql = sqlite_rename_table(sql, %Q), " +#else + "sql = CASE " + "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)" + "ELSE sqlite_rename_table(sql, %Q) END, " +#endif + "tbl_name = %Q, " + "name = CASE " + "WHEN type='table' THEN %Q " + "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN " + "'sqlite_autoindex_' || %Q || substr(name,%d+18,10) " + "ELSE name END " + "WHERE tbl_name=%Q AND " + "(type='table' OR type='index' OR type='trigger');", + zDb, SCHEMA_TABLE(iDb), zName, zName, zName, +#ifndef SQLITE_OMIT_TRIGGER + zName, +#endif + zName, nTabName, zTabName + ); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* If the sqlite_sequence table exists in this database, then update + ** it with the new table name. + */ + if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ + sqlite3NestedParse(pParse, + "UPDATE %Q.sqlite_sequence set name = %Q WHERE name = %Q", + zDb, zName, pTab->zName); + } +#endif + +#ifndef SQLITE_OMIT_TRIGGER + /* If there are TEMP triggers on this table, modify the sqlite_temp_master + ** table. Don't do this if the table being ALTERed is itself located in + ** the temp database. + */ + if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ + sqlite3NestedParse(pParse, + "UPDATE sqlite_temp_master SET " + "sql = sqlite_rename_trigger(sql, %Q), " + "tbl_name = %Q " + "WHERE %s;", zName, zName, zWhere); + sqlite3_free(zWhere); + } +#endif + + /* Drop and reload the internal table schema. */ + reloadTableSchema(pParse, pTab, zName); + +exit_rename_table: + sqlite3SrcListDelete(pSrc); + sqlite3_free(zName); +} + + +/* +** This function is called after an "ALTER TABLE ... ADD" statement +** has been parsed. Argument pColDef contains the text of the new +** column definition. +** +** The Table structure pParse->pNewTable was extended to include +** the new column during parsing. +*/ +void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ + Table *pNew; /* Copy of pParse->pNewTable */ + Table *pTab; /* Table being altered */ + int iDb; /* Database number */ + const char *zDb; /* Database name */ + const char *zTab; /* Table name */ + char *zCol; /* Null-terminated column definition */ + Column *pCol; /* The new column */ + Expr *pDflt; /* Default value for the new column */ + sqlite3 *db; /* The database connection; */ + + if( pParse->nErr ) return; + pNew = pParse->pNewTable; + assert( pNew ); + + db = pParse->db; + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pNew->pSchema); + zDb = db->aDb[iDb].zName; + zTab = pNew->zName; + pCol = &pNew->aCol[pNew->nCol-1]; + pDflt = pCol->pDflt; + pTab = sqlite3FindTable(db, zTab, zDb); + assert( pTab ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + return; + } +#endif + + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + if( pDflt && pDflt->op==TK_NULL ){ + pDflt = 0; + } + + /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. + ** If there is a NOT NULL constraint, then the default value for the + ** column must not be NULL. + */ + if( pCol->isPrimKey ){ + sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); + return; + } + if( pNew->pIndex ){ + sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); + return; + } + if( pCol->notNull && !pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a NOT NULL column with default value NULL"); + return; + } + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal; + if( sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_NONE, &pVal) ){ + db->mallocFailed = 1; + return; + } + if( !pVal ){ + sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default"); + return; + } + sqlite3ValueFree(pVal); + } + + /* Modify the CREATE TABLE statement. */ + zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); + if( zCol ){ + char *zEnd = &zCol[pColDef->n-1]; + while( (zEnd>zCol && *zEnd==';') || isspace(*(unsigned char *)zEnd) ){ + *zEnd-- = '\0'; + } + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET " + "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d,length(sql)) " + "WHERE type = 'table' AND name = %Q", + zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, + zTab + ); + sqlite3_free(zCol); + } + + /* If the default value of the new column is NULL, then set the file + ** format to 2. If the default value of the new column is not NULL, + ** the file format becomes 3. + */ + sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2); + + /* Reload the schema of the modified table. */ + reloadTableSchema(pParse, pTab, pTab->zName); +} + +/* +** This function is called by the parser after the table-name in +** an "ALTER TABLE ADD" statement is parsed. Argument +** pSrc is the full-name of the table being altered. +** +** This routine makes a (partial) copy of the Table structure +** for the table being altered and sets Parse.pNewTable to point +** to it. Routines called by the parser as the column definition +** is parsed (i.e. sqlite3AddColumn()) add the new Column data to +** the copy. The copy of the Table structure is deleted by tokenize.c +** after parsing is finished. +** +** Routine sqlite3AlterFinishAddColumn() will be called to complete +** coding the "ALTER TABLE ... ADD" statement. +*/ +void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ + Table *pNew; + Table *pTab; + Vdbe *v; + int iDb; + int i; + int nAlloc; + sqlite3 *db = pParse->db; + + /* Look up the table being altered. */ + assert( pParse->pNewTable==0 ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + if( db->mallocFailed ) goto exit_begin_add_column; + pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase); + if( !pTab ) goto exit_begin_add_column; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be altered"); + goto exit_begin_add_column; + } +#endif + + /* Make sure this is not an attempt to ALTER a view. */ + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); + goto exit_begin_add_column; + } + + assert( pTab->addColOffset>0 ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + + /* Put a copy of the Table struct in Parse.pNewTable for the + ** sqlite3AddColumn() function and friends to modify. + */ + pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); + if( !pNew ) goto exit_begin_add_column; + pParse->pNewTable = pNew; + pNew->nRef = 1; + pNew->nCol = pTab->nCol; + assert( pNew->nCol>0 ); + nAlloc = (((pNew->nCol-1)/8)*8)+8; + assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 ); + pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); + pNew->zName = sqlite3DbStrDup(db, pTab->zName); + if( !pNew->aCol || !pNew->zName ){ + db->mallocFailed = 1; + goto exit_begin_add_column; + } + memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); + for(i=0; inCol; i++){ + Column *pCol = &pNew->aCol[i]; + pCol->zName = sqlite3DbStrDup(db, pCol->zName); + pCol->zColl = 0; + pCol->zType = 0; + pCol->pDflt = 0; + } + pNew->pSchema = db->aDb[iDb].pSchema; + pNew->addColOffset = pTab->addColOffset; + pNew->nRef = 1; + + /* Begin a transaction and increment the schema cookie. */ + sqlite3BeginWriteOperation(pParse, 0, iDb); + v = sqlite3GetVdbe(pParse); + if( !v ) goto exit_begin_add_column; + sqlite3ChangeCookie(db, v, iDb); + +exit_begin_add_column: + sqlite3SrcListDelete(pSrc); + return; +} +#endif /* SQLITE_ALTER_TABLE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c b/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c new file mode 100644 index 0000000000..119e7f6484 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c @@ -0,0 +1,418 @@ +/* +** 2005 July 8 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code associated with the ANALYZE command. +** +** @(#) $Id: analyze.c,v 1.23 2007/08/29 17:43:20 drh Exp $ +*/ +#ifndef SQLITE_OMIT_ANALYZE +#include "sqliteInt.h" + +/* +** This routine generates code that opens the sqlite_stat1 table on cursor +** iStatCur. +** +** If the sqlite_stat1 tables does not previously exist, it is created. +** If it does previously exist, all entires associated with table zWhere +** are removed. If zWhere==0 then all entries are removed. +*/ +static void openStatTable( + Parse *pParse, /* Parsing context */ + int iDb, /* The database we are looking in */ + int iStatCur, /* Open the sqlite_stat1 table on this cursor */ + const char *zWhere /* Delete entries associated with this table */ +){ + sqlite3 *db = pParse->db; + Db *pDb; + int iRootPage; + Table *pStat; + Vdbe *v = sqlite3GetVdbe(pParse); + + if( v==0 ) return; + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3VdbeDb(v)==db ); + pDb = &db->aDb[iDb]; + if( (pStat = sqlite3FindTable(db, "sqlite_stat1", pDb->zName))==0 ){ + /* The sqlite_stat1 tables does not exist. Create it. + ** Note that a side-effect of the CREATE TABLE statement is to leave + ** the rootpage of the new table on the top of the stack. This is + ** important because the OpenWrite opcode below will be needing it. */ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.sqlite_stat1(tbl,idx,stat)", + pDb->zName + ); + iRootPage = 0; /* Cause rootpage to be taken from top of stack */ + }else if( zWhere ){ + /* The sqlite_stat1 table exists. Delete all entries associated with + ** the table zWhere. */ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.sqlite_stat1 WHERE tbl=%Q", + pDb->zName, zWhere + ); + iRootPage = pStat->tnum; + }else{ + /* The sqlite_stat1 table already exists. Delete all rows. */ + iRootPage = pStat->tnum; + sqlite3VdbeAddOp(v, OP_Clear, pStat->tnum, iDb); + } + + /* Open the sqlite_stat1 table for writing. Unless it was created + ** by this vdbe program, lock it for writing at the shared-cache level. + ** If this vdbe did create the sqlite_stat1 table, then it must have + ** already obtained a schema-lock, making the write-lock redundant. + */ + if( iRootPage>0 ){ + sqlite3TableLock(pParse, iDb, iRootPage, 1, "sqlite_stat1"); + } + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + sqlite3VdbeAddOp(v, OP_OpenWrite, iStatCur, iRootPage); + sqlite3VdbeAddOp(v, OP_SetNumColumns, iStatCur, 3); +} + +/* +** Generate code to do an analysis of all indices associated with +** a single table. +*/ +static void analyzeOneTable( + Parse *pParse, /* Parser context */ + Table *pTab, /* Table whose indices are to be analyzed */ + int iStatCur, /* Cursor that writes to the sqlite_stat1 table */ + int iMem /* Available memory locations begin here */ +){ + Index *pIdx; /* An index to being analyzed */ + int iIdxCur; /* Cursor number for index being analyzed */ + int nCol; /* Number of columns in the index */ + Vdbe *v; /* The virtual machine being built up */ + int i; /* Loop counter */ + int topOfLoop; /* The top of the loop */ + int endOfLoop; /* The end of the loop */ + int addr; /* The address of an instruction */ + int iDb; /* Index of database containing pTab */ + + v = sqlite3GetVdbe(pParse); + if( v==0 || pTab==0 || pTab->pIndex==0 ){ + /* Do no analysis for tables that have no indices */ + return; + } + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, + pParse->db->aDb[iDb].zName ) ){ + return; + } +#endif + + /* Establish a read-lock on the table at the shared-cache level. */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + iIdxCur = pParse->nTab; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); + + /* Open a cursor to the index to be analyzed + */ + assert( iDb==sqlite3SchemaToIndex(pParse->db, pIdx->pSchema) ); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + VdbeComment((v, "# %s", pIdx->zName)); + sqlite3VdbeOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, + (char *)pKey, P3_KEYINFO_HANDOFF); + nCol = pIdx->nColumn; + if( iMem+nCol*2>=pParse->nMem ){ + pParse->nMem = iMem+nCol*2+1; + } + sqlite3VdbeAddOp(v, OP_SetNumColumns, iIdxCur, nCol+1); + + /* Memory cells are used as follows: + ** + ** mem[iMem]: The total number of rows in the table. + ** mem[iMem+1]: Number of distinct values in column 1 + ** ... + ** mem[iMem+nCol]: Number of distinct values in column N + ** mem[iMem+nCol+1] Last observed value of column 1 + ** ... + ** mem[iMem+nCol+nCol]: Last observed value of column N + ** + ** Cells iMem through iMem+nCol are initialized to 0. The others + ** are initialized to NULL. + */ + for(i=0; i<=nCol; i++){ + sqlite3VdbeAddOp(v, OP_MemInt, 0, iMem+i); + } + for(i=0; i0 then it is always the case the D>0 so division by zero + ** is never possible. + */ + sqlite3VdbeAddOp(v, OP_MemLoad, iMem, 0); + addr = sqlite3VdbeAddOp(v, OP_IfNot, 0, 0); + sqlite3VdbeAddOp(v, OP_NewRowid, iStatCur, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pIdx->zName, 0); + sqlite3VdbeAddOp(v, OP_MemLoad, iMem, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, " ", 0); + for(i=0; idb; + Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ + HashElem *k; + int iStatCur; + int iMem; + + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab++; + openStatTable(pParse, iDb, iStatCur, 0); + iMem = pParse->nMem; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + analyzeOneTable(pParse, pTab, iStatCur, iMem); + } + loadAnalysis(pParse, iDb); +} + +/* +** Generate code that will do an analysis of a single table in +** a database. +*/ +static void analyzeTable(Parse *pParse, Table *pTab){ + int iDb; + int iStatCur; + + assert( pTab!=0 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab++; + openStatTable(pParse, iDb, iStatCur, pTab->zName); + analyzeOneTable(pParse, pTab, iStatCur, pParse->nMem); + loadAnalysis(pParse, iDb); +} + +/* +** Generate code for the ANALYZE command. The parser calls this routine +** when it recognizes an ANALYZE command. +** +** ANALYZE -- 1 +** ANALYZE -- 2 +** ANALYZE ?.? -- 3 +** +** Form 1 causes all indices in all attached databases to be analyzed. +** Form 2 analyzes all indices the single database named. +** Form 3 analyzes all indices associated with the named table. +*/ +void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ + sqlite3 *db = pParse->db; + int iDb; + int i; + char *z, *zDb; + Table *pTab; + Token *pTableName; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + if( pName1==0 ){ + /* Form 1: Analyze everything */ + for(i=0; inDb; i++){ + if( i==1 ) continue; /* Do not analyze the TEMP database */ + analyzeDatabase(pParse, i); + } + }else if( pName2==0 || pName2->n==0 ){ + /* Form 2: Analyze the database or table named */ + iDb = sqlite3FindDb(db, pName1); + if( iDb>=0 ){ + analyzeDatabase(pParse, iDb); + }else{ + z = sqlite3NameFromToken(db, pName1); + pTab = sqlite3LocateTable(pParse, z, 0); + sqlite3_free(z); + if( pTab ){ + analyzeTable(pParse, pTab); + } + } + }else{ + /* Form 3: Analyze the fully qualified table name */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); + if( iDb>=0 ){ + zDb = db->aDb[iDb].zName; + z = sqlite3NameFromToken(db, pTableName); + if( z ){ + pTab = sqlite3LocateTable(pParse, z, zDb); + sqlite3_free(z); + if( pTab ){ + analyzeTable(pParse, pTab); + } + } + } + } +} + +/* +** Used to pass information from the analyzer reader through to the +** callback routine. +*/ +typedef struct analysisInfo analysisInfo; +struct analysisInfo { + sqlite3 *db; + const char *zDatabase; +}; + +/* +** This callback is invoked once for each index when reading the +** sqlite_stat1 table. +** +** argv[0] = name of the index +** argv[1] = results of analysis - on integer for each column +*/ +static int analysisLoader(void *pData, int argc, char **argv, char **azNotUsed){ + analysisInfo *pInfo = (analysisInfo*)pData; + Index *pIndex; + int i, c; + unsigned int v; + const char *z; + + assert( argc==2 ); + if( argv==0 || argv[0]==0 || argv[1]==0 ){ + return 0; + } + pIndex = sqlite3FindIndex(pInfo->db, argv[0], pInfo->zDatabase); + if( pIndex==0 ){ + return 0; + } + z = argv[1]; + for(i=0; *z && i<=pIndex->nColumn; i++){ + v = 0; + while( (c=z[0])>='0' && c<='9' ){ + v = v*10 + c - '0'; + z++; + } + pIndex->aiRowEst[i] = v; + if( *z==' ' ) z++; + } + return 0; +} + +/* +** Load the content of the sqlite_stat1 table into the index hash tables. +*/ +int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ + analysisInfo sInfo; + HashElem *i; + char *zSql; + int rc; + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + assert( sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + + /* Clear any prior statistics */ + for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + sqlite3DefaultRowEst(pIdx); + } + + /* Check to make sure the sqlite_stat1 table existss */ + sInfo.db = db; + sInfo.zDatabase = db->aDb[iDb].zName; + if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){ + return SQLITE_ERROR; + } + + + /* Load new statistics out of the sqlite_stat1 table */ + zSql = sqlite3MPrintf(db, "SELECT idx, stat FROM %Q.sqlite_stat1", + sInfo.zDatabase); + sqlite3SafetyOff(db); + rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); + sqlite3SafetyOn(db); + sqlite3_free(zSql); + return rc; +} + + +#endif /* SQLITE_OMIT_ANALYZE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c b/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c new file mode 100644 index 0000000000..2fb950fd4a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c @@ -0,0 +1,521 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the ATTACH and DETACH commands. +** +** $Id: attach.c,v 1.63 2007/10/03 08:46:44 danielk1977 Exp $ +*/ +#include "sqliteInt.h" + +#ifndef SQLITE_OMIT_ATTACH +/* +** Resolve an expression that was part of an ATTACH or DETACH statement. This +** is slightly different from resolving a normal SQL expression, because simple +** identifiers are treated as strings, not possible column names or aliases. +** +** i.e. if the parser sees: +** +** ATTACH DATABASE abc AS def +** +** it treats the two expressions as literal strings 'abc' and 'def' instead of +** looking for columns of the same name. +** +** This only applies to the root node of pExpr, so the statement: +** +** ATTACH DATABASE abc||def AS 'db2' +** +** will fail because neither abc or def can be resolved. +*/ +static int resolveAttachExpr(NameContext *pName, Expr *pExpr) +{ + int rc = SQLITE_OK; + if( pExpr ){ + if( pExpr->op!=TK_ID ){ + rc = sqlite3ExprResolveNames(pName, pExpr); + if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){ + sqlite3ErrorMsg(pName->pParse, "invalid name: \"%T\"", &pExpr->span); + return SQLITE_ERROR; + } + }else{ + pExpr->op = TK_STRING; + } + } + return rc; +} + +/* +** An SQL user-function registered to do the work of an ATTACH statement. The +** three arguments to the function come directly from an attach statement: +** +** ATTACH DATABASE x AS y KEY z +** +** SELECT sqlite_attach(x, y, z) +** +** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the +** third argument. +*/ +static void attachFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int rc = 0; + sqlite3 *db = sqlite3_user_data(context); + const char *zName; + const char *zFile; + Db *aNew; + char *zErrDyn = 0; + char zErr[128]; + + zFile = (const char *)sqlite3_value_text(argv[0]); + zName = (const char *)sqlite3_value_text(argv[1]); + if( zFile==0 ) zFile = ""; + if( zName==0 ) zName = ""; + + /* Check for the following errors: + ** + ** * Too many attached databases, + ** * Transaction currently open + ** * Specified database name already being used. + */ + if( db->nDb>=SQLITE_MAX_ATTACHED+2 ){ + sqlite3_snprintf( + sizeof(zErr), zErr, "too many attached databases - max %d", + SQLITE_MAX_ATTACHED + ); + goto attach_error; + } + if( !db->autoCommit ){ + sqlite3_snprintf(sizeof(zErr), zErr, + "cannot ATTACH database within transaction"); + goto attach_error; + } + for(i=0; inDb; i++){ + char *z = db->aDb[i].zName; + if( z && zName && sqlite3StrICmp(z, zName)==0 ){ + sqlite3_snprintf(sizeof(zErr), zErr, + "database %s is already in use", zName); + goto attach_error; + } + } + + /* Allocate the new entry in the db->aDb[] array and initialise the schema + ** hash tables. + */ + if( db->aDb==db->aDbStatic ){ + aNew = sqlite3_malloc( sizeof(db->aDb[0])*3 ); + if( aNew==0 ){ + db->mallocFailed = 1; + return; + } + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqlite3_realloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ){ + db->mallocFailed = 1; + return; + } + } + db->aDb = aNew; + aNew = &db->aDb[db->nDb++]; + memset(aNew, 0, sizeof(*aNew)); + + /* Open the database file. If the btree is successfully opened, use + ** it to obtain the database schema. At this point the schema may + ** or may not be initialised. + */ + rc = sqlite3BtreeFactory(db, zFile, 0, SQLITE_DEFAULT_CACHE_SIZE, + db->openFlags | SQLITE_OPEN_MAIN_DB, + &aNew->pBt); + if( rc==SQLITE_OK ){ + aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt); + if( !aNew->pSchema ){ + rc = SQLITE_NOMEM; + }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){ + sqlite3_snprintf(sizeof(zErr), zErr, + "attached databases must use the same text encoding as main database"); + goto attach_error; + } + sqlite3PagerLockingMode(sqlite3BtreePager(aNew->pBt), db->dfltLockMode); + } + aNew->zName = sqlite3DbStrDup(db, zName); + aNew->safety_level = 3; + +#if SQLITE_HAS_CODEC + { + extern int sqlite3CodecAttach(sqlite3*, int, const void*, int); + extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); + int nKey; + char *zKey; + int t = sqlite3_value_type(argv[2]); + switch( t ){ + case SQLITE_INTEGER: + case SQLITE_FLOAT: + zErrDyn = sqlite3DbStrDup(db, "Invalid key value"); + rc = SQLITE_ERROR; + break; + + case SQLITE_TEXT: + case SQLITE_BLOB: + nKey = sqlite3_value_bytes(argv[2]); + zKey = (char *)sqlite3_value_blob(argv[2]); + sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + break; + + case SQLITE_NULL: + /* No key specified. Use the key from the main database */ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + break; + } + } +#endif + + /* If the file was opened successfully, read the schema for the new database. + ** If this fails, or if opening the file failed, then close the file and + ** remove the entry from the db->aDb[] array. i.e. put everything back the way + ** we found it. + */ + if( rc==SQLITE_OK ){ + sqlite3SafetyOn(db); + rc = sqlite3Init(db, &zErrDyn); + sqlite3SafetyOff(db); + } + if( rc ){ + int iDb = db->nDb - 1; + assert( iDb>=2 ); + if( db->aDb[iDb].pBt ){ + sqlite3BtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + db->aDb[iDb].pSchema = 0; + } + sqlite3ResetInternalSchema(db, 0); + db->nDb = iDb; + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + db->mallocFailed = 1; + sqlite3_snprintf(sizeof(zErr),zErr, "out of memory"); + }else{ + sqlite3_snprintf(sizeof(zErr),zErr, "unable to open database: %s", zFile); + } + goto attach_error; + } + + return; + +attach_error: + /* Return an error if we get here */ + if( zErrDyn ){ + sqlite3_result_error(context, zErrDyn, -1); + sqlite3_free(zErrDyn); + }else{ + zErr[sizeof(zErr)-1] = 0; + sqlite3_result_error(context, zErr, -1); + } +} + +/* +** An SQL user-function registered to do the work of an DETACH statement. The +** three arguments to the function come directly from a detach statement: +** +** DETACH DATABASE x +** +** SELECT sqlite_detach(x) +*/ +static void detachFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zName = (const char *)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_user_data(context); + int i; + Db *pDb = 0; + char zErr[128]; + + if( zName==0 ) zName = ""; + for(i=0; inDb; i++){ + pDb = &db->aDb[i]; + if( pDb->pBt==0 ) continue; + if( sqlite3StrICmp(pDb->zName, zName)==0 ) break; + } + + if( i>=db->nDb ){ + sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); + goto detach_error; + } + if( i<2 ){ + sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); + goto detach_error; + } + if( !db->autoCommit ){ + sqlite3_snprintf(sizeof(zErr), zErr, + "cannot DETACH database within transaction"); + goto detach_error; + } + if( sqlite3BtreeIsInReadTrans(pDb->pBt) ){ + sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); + goto detach_error; + } + + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + sqlite3ResetInternalSchema(db, 0); + return; + +detach_error: + sqlite3_result_error(context, zErr, -1); +} + +/* +** This procedure generates VDBE code for a single invocation of either the +** sqlite_detach() or sqlite_attach() SQL user functions. +*/ +static void codeAttach( + Parse *pParse, /* The parser context */ + int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */ + const char *zFunc, /* Either "sqlite_attach" or "sqlite_detach */ + int nFunc, /* Number of args to pass to zFunc */ + Expr *pAuthArg, /* Expression to pass to authorization callback */ + Expr *pFilename, /* Name of database file */ + Expr *pDbname, /* Name of the database to use internally */ + Expr *pKey /* Database key for encryption extension */ +){ + int rc; + NameContext sName; + Vdbe *v; + FuncDef *pFunc; + sqlite3* db = pParse->db; + +#ifndef SQLITE_OMIT_AUTHORIZATION + assert( db->mallocFailed || pAuthArg ); + if( pAuthArg ){ + char *zAuthArg = sqlite3NameFromToken(db, &pAuthArg->span); + if( !zAuthArg ){ + goto attach_end; + } + rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); + sqlite3_free(zAuthArg); + if(rc!=SQLITE_OK ){ + goto attach_end; + } + } +#endif /* SQLITE_OMIT_AUTHORIZATION */ + + memset(&sName, 0, sizeof(NameContext)); + sName.pParse = pParse; + + if( + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) + ){ + pParse->nErr++; + goto attach_end; + } + + v = sqlite3GetVdbe(pParse); + sqlite3ExprCode(pParse, pFilename); + sqlite3ExprCode(pParse, pDbname); + sqlite3ExprCode(pParse, pKey); + + assert( v || db->mallocFailed ); + if( v ){ + sqlite3VdbeAddOp(v, OP_Function, 0, nFunc); + pFunc = sqlite3FindFunction(db, zFunc, strlen(zFunc), nFunc, SQLITE_UTF8,0); + sqlite3VdbeChangeP3(v, -1, (char *)pFunc, P3_FUNCDEF); + + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this + ** statement only). For DETACH, set it to false (expire all existing + ** statements). + */ + sqlite3VdbeAddOp(v, OP_Expire, (type==SQLITE_ATTACH), 0); + } + +attach_end: + sqlite3ExprDelete(pFilename); + sqlite3ExprDelete(pDbname); + sqlite3ExprDelete(pKey); +} + +/* +** Called by the parser to compile a DETACH statement. +** +** DETACH pDbname +*/ +void sqlite3Detach(Parse *pParse, Expr *pDbname){ + codeAttach(pParse, SQLITE_DETACH, "sqlite_detach", 1, pDbname, 0, 0, pDbname); +} + +/* +** Called by the parser to compile an ATTACH statement. +** +** ATTACH p AS pDbname KEY pKey +*/ +void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){ + codeAttach(pParse, SQLITE_ATTACH, "sqlite_attach", 3, p, p, pDbname, pKey); +} +#endif /* SQLITE_OMIT_ATTACH */ + +/* +** Register the functions sqlite_attach and sqlite_detach. +*/ +void sqlite3AttachFunctions(sqlite3 *db){ +#ifndef SQLITE_OMIT_ATTACH + static const int enc = SQLITE_UTF8; + sqlite3CreateFunc(db, "sqlite_attach", 3, enc, db, attachFunc, 0, 0); + sqlite3CreateFunc(db, "sqlite_detach", 1, enc, db, detachFunc, 0, 0); +#endif +} + +/* +** Initialize a DbFixer structure. This routine must be called prior +** to passing the structure to one of the sqliteFixAAAA() routines below. +** +** The return value indicates whether or not fixation is required. TRUE +** means we do need to fix the database references, FALSE means we do not. +*/ +int sqlite3FixInit( + DbFixer *pFix, /* The fixer to be initialized */ + Parse *pParse, /* Error messages will be written here */ + int iDb, /* This is the database that must be used */ + const char *zType, /* "view", "trigger", or "index" */ + const Token *pName /* Name of the view, trigger, or index */ +){ + sqlite3 *db; + + if( iDb<0 || iDb==1 ) return 0; + db = pParse->db; + assert( db->nDb>iDb ); + pFix->pParse = pParse; + pFix->zDb = db->aDb[iDb].zName; + pFix->zType = zType; + pFix->pName = pName; + return 1; +} + +/* +** The following set of routines walk through the parse tree and assign +** a specific database to all table references where the database name +** was left unspecified in the original SQL statement. The pFix structure +** must have been initialized by a prior call to sqlite3FixInit(). +** +** These routines are used to make sure that an index, trigger, or +** view in one database does not refer to objects in a different database. +** (Exception: indices, triggers, and views in the TEMP database are +** allowed to refer to anything.) If a reference is explicitly made +** to an object in a different database, an error message is added to +** pParse->zErrMsg and these routines return non-zero. If everything +** checks out, these routines return 0. +*/ +int sqlite3FixSrcList( + DbFixer *pFix, /* Context of the fixation */ + SrcList *pList /* The Source list to check and modify */ +){ + int i; + const char *zDb; + struct SrcList_item *pItem; + + if( pList==0 ) return 0; + zDb = pFix->zDb; + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pItem->zDatabase==0 ){ + pItem->zDatabase = sqlite3DbStrDup(pFix->pParse->db, zDb); + }else if( sqlite3StrICmp(pItem->zDatabase,zDb)!=0 ){ + sqlite3ErrorMsg(pFix->pParse, + "%s %T cannot reference objects in database %s", + pFix->zType, pFix->pName, pItem->zDatabase); + return 1; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) + if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; + if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; +#endif + } + return 0; +} +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) +int sqlite3FixSelect( + DbFixer *pFix, /* Context of the fixation */ + Select *pSelect /* The SELECT statement to be fixed to one database */ +){ + while( pSelect ){ + if( sqlite3FixExprList(pFix, pSelect->pEList) ){ + return 1; + } + if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pWhere) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pHaving) ){ + return 1; + } + pSelect = pSelect->pPrior; + } + return 0; +} +int sqlite3FixExpr( + DbFixer *pFix, /* Context of the fixation */ + Expr *pExpr /* The expression to be fixed to one database */ +){ + while( pExpr ){ + if( sqlite3FixSelect(pFix, pExpr->pSelect) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pExpr->pList) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pExpr->pRight) ){ + return 1; + } + pExpr = pExpr->pLeft; + } + return 0; +} +int sqlite3FixExprList( + DbFixer *pFix, /* Context of the fixation */ + ExprList *pList /* The expression to be fixed to one database */ +){ + int i; + struct ExprList_item *pItem; + if( pList==0 ) return 0; + for(i=0, pItem=pList->a; inExpr; i++, pItem++){ + if( sqlite3FixExpr(pFix, pItem->pExpr) ){ + return 1; + } + } + return 0; +} +#endif + +#ifndef SQLITE_OMIT_TRIGGER +int sqlite3FixTriggerStep( + DbFixer *pFix, /* Context of the fixation */ + TriggerStep *pStep /* The trigger step be fixed to one database */ +){ + while( pStep ){ + if( sqlite3FixSelect(pFix, pStep->pSelect) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pStep->pWhere) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pStep->pExprList) ){ + return 1; + } + pStep = pStep->pNext; + } + return 0; +} +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c b/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c new file mode 100644 index 0000000000..5630c239f5 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c @@ -0,0 +1,234 @@ +/* +** 2003 January 11 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the sqlite3_set_authorizer() +** API. This facility is an optional feature of the library. Embedded +** systems that do not need this facility may omit it by recompiling +** the library with -DSQLITE_OMIT_AUTHORIZATION=1 +** +** $Id: auth.c,v 1.29 2007/09/18 15:55:07 drh Exp $ +*/ +#include "sqliteInt.h" + +/* +** All of the code in this file may be omitted by defining a single +** macro. +*/ +#ifndef SQLITE_OMIT_AUTHORIZATION + +/* +** Set or clear the access authorization function. +** +** The access authorization function is be called during the compilation +** phase to verify that the user has read and/or write access permission on +** various fields of the database. The first argument to the auth function +** is a copy of the 3rd argument to this routine. The second argument +** to the auth function is one of these constants: +** +** SQLITE_CREATE_INDEX +** SQLITE_CREATE_TABLE +** SQLITE_CREATE_TEMP_INDEX +** SQLITE_CREATE_TEMP_TABLE +** SQLITE_CREATE_TEMP_TRIGGER +** SQLITE_CREATE_TEMP_VIEW +** SQLITE_CREATE_TRIGGER +** SQLITE_CREATE_VIEW +** SQLITE_DELETE +** SQLITE_DROP_INDEX +** SQLITE_DROP_TABLE +** SQLITE_DROP_TEMP_INDEX +** SQLITE_DROP_TEMP_TABLE +** SQLITE_DROP_TEMP_TRIGGER +** SQLITE_DROP_TEMP_VIEW +** SQLITE_DROP_TRIGGER +** SQLITE_DROP_VIEW +** SQLITE_INSERT +** SQLITE_PRAGMA +** SQLITE_READ +** SQLITE_SELECT +** SQLITE_TRANSACTION +** SQLITE_UPDATE +** +** The third and fourth arguments to the auth function are the name of +** the table and the column that are being accessed. The auth function +** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If +** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY +** means that the SQL statement will never-run - the sqlite3_exec() call +** will return with an error. SQLITE_IGNORE means that the SQL statement +** should run but attempts to read the specified column will return NULL +** and attempts to write the column will be ignored. +** +** Setting the auth function to NULL disables this hook. The default +** setting of the auth function is NULL. +*/ +int sqlite3_set_authorizer( + sqlite3 *db, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pArg +){ + sqlite3_mutex_enter(db->mutex); + db->xAuth = xAuth; + db->pAuthArg = pArg; + sqlite3ExpirePreparedStatements(db); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Write an error message into pParse->zErrMsg that explains that the +** user-supplied authorization function returned an illegal value. +*/ +static void sqliteAuthBadReturnCode(Parse *pParse, int rc){ + sqlite3ErrorMsg(pParse, "illegal return value (%d) from the " + "authorization function - should be SQLITE_OK, SQLITE_IGNORE, " + "or SQLITE_DENY", rc); + pParse->rc = SQLITE_ERROR; +} + +/* +** The pExpr should be a TK_COLUMN expression. The table referred to +** is in pTabList or else it is the NEW or OLD table of a trigger. +** Check to see if it is OK to read this particular column. +** +** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN +** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, +** then generate an error. +*/ +void sqlite3AuthRead( + Parse *pParse, /* The parser context */ + Expr *pExpr, /* The expression to check authorization on */ + Schema *pSchema, /* The schema of the expression */ + SrcList *pTabList /* All table that pExpr might refer to */ +){ + sqlite3 *db = pParse->db; + int rc; + Table *pTab = 0; /* The table being read */ + const char *zCol; /* Name of the column of the table */ + int iSrc; /* Index in pTabList->a[] of table being read */ + const char *zDBase; /* Name of database being accessed */ + TriggerStack *pStack; /* The stack of current triggers */ + int iDb; /* The index of the database the expression refers to */ + + if( db->xAuth==0 ) return; + if( pExpr->op!=TK_COLUMN ) return; + iDb = sqlite3SchemaToIndex(pParse->db, pSchema); + if( iDb<0 ){ + /* An attempt to read a column out of a subquery or other + ** temporary table. */ + return; + } + for(iSrc=0; pTabList && iSrcnSrc; iSrc++){ + if( pExpr->iTable==pTabList->a[iSrc].iCursor ) break; + } + if( iSrc>=0 && pTabList && iSrcnSrc ){ + pTab = pTabList->a[iSrc].pTab; + }else if( (pStack = pParse->trigStack)!=0 ){ + /* This must be an attempt to read the NEW or OLD pseudo-tables + ** of a trigger. + */ + assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx ); + pTab = pStack->pTab; + } + if( pTab==0 ) return; + if( pExpr->iColumn>=0 ){ + assert( pExpr->iColumnnCol ); + zCol = pTab->aCol[pExpr->iColumn].zName; + }else if( pTab->iPKey>=0 ){ + assert( pTab->iPKeynCol ); + zCol = pTab->aCol[pTab->iPKey].zName; + }else{ + zCol = "ROWID"; + } + assert( iDb>=0 && iDbnDb ); + zDBase = db->aDb[iDb].zName; + rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol, zDBase, + pParse->zAuthContext); + if( rc==SQLITE_IGNORE ){ + pExpr->op = TK_NULL; + }else if( rc==SQLITE_DENY ){ + if( db->nDb>2 || iDb!=0 ){ + sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited", + zDBase, pTab->zName, zCol); + }else{ + sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited",pTab->zName,zCol); + } + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_OK ){ + sqliteAuthBadReturnCode(pParse, rc); + } +} + +/* +** Do an authorization check using the code and arguments given. Return +** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY +** is returned, then the error count and error message in pParse are +** modified appropriately. +*/ +int sqlite3AuthCheck( + Parse *pParse, + int code, + const char *zArg1, + const char *zArg2, + const char *zArg3 +){ + sqlite3 *db = pParse->db; + int rc; + + /* Don't do any authorization checks if the database is initialising + ** or if the parser is being invoked from within sqlite3_declare_vtab. + */ + if( db->init.busy || IN_DECLARE_VTAB ){ + return SQLITE_OK; + } + + if( db->xAuth==0 ){ + return SQLITE_OK; + } + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext); + if( rc==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized"); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ + rc = SQLITE_DENY; + sqliteAuthBadReturnCode(pParse, rc); + } + return rc; +} + +/* +** Push an authorization context. After this routine is called, the +** zArg3 argument to authorization callbacks will be zContext until +** popped. Or if pParse==0, this routine is a no-op. +*/ +void sqlite3AuthContextPush( + Parse *pParse, + AuthContext *pContext, + const char *zContext +){ + pContext->pParse = pParse; + if( pParse ){ + pContext->zAuthContext = pParse->zAuthContext; + pParse->zAuthContext = zContext; + } +} + +/* +** Pop an authorization context that was previously pushed +** by sqlite3AuthContextPush +*/ +void sqlite3AuthContextPop(AuthContext *pContext){ + if( pContext->pParse ){ + pContext->pParse->zAuthContext = pContext->zAuthContext; + pContext->pParse = 0; + } +} + +#endif /* SQLITE_OMIT_AUTHORIZATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c b/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c new file mode 100644 index 0000000000..1f63434231 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c @@ -0,0 +1,315 @@ +/* +** 2007 August 27 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** $Id: btmutex.c,v 1.7 2007/08/30 01:19:59 drh Exp $ +** +** This file contains code used to implement mutexes on Btree objects. +** This code really belongs in btree.c. But btree.c is getting too +** big and we want to break it down some. This packaged seemed like +** a good breakout. +*/ +#include "btreeInt.h" +#if SQLITE_THREADSAFE && !defined(SQLITE_OMIT_SHARED_CACHE) + + +/* +** Enter a mutex on the given BTree object. +** +** If the object is not sharable, then no mutex is ever required +** and this routine is a no-op. The underlying mutex is non-recursive. +** But we keep a reference count in Btree.wantToLock so the behavior +** of this interface is recursive. +** +** To avoid deadlocks, multiple Btrees are locked in the same order +** by all database connections. The p->pNext is a list of other +** Btrees belonging to the same database connection as the p Btree +** which need to be locked after p. If we cannot get a lock on +** p, then first unlock all of the others on p->pNext, then wait +** for the lock to become available on p, then relock all of the +** subsequent Btrees that desire a lock. +*/ +void sqlite3BtreeEnter(Btree *p){ + Btree *pLater; + + /* Some basic sanity checking on the Btree. The list of Btrees + ** connected by pNext and pPrev should be in sorted order by + ** Btree.pBt value. All elements of the list should belong to + ** the same connection. Only shared Btrees are on the list. */ + assert( p->pNext==0 || p->pNext->pBt>p->pBt ); + assert( p->pPrev==0 || p->pPrev->pBtpBt ); + assert( p->pNext==0 || p->pNext->pSqlite==p->pSqlite ); + assert( p->pPrev==0 || p->pPrev->pSqlite==p->pSqlite ); + assert( p->sharable || (p->pNext==0 && p->pPrev==0) ); + + /* Check for locking consistency */ + assert( !p->locked || p->wantToLock>0 ); + assert( p->sharable || p->wantToLock==0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + + if( !p->sharable ) return; + p->wantToLock++; + if( p->locked ) return; + + /* In most cases, we should be able to acquire the lock we + ** want without having to go throught the ascending lock + ** procedure that follows. Just be sure not to block. + */ + if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ + p->locked = 1; + return; + } + + /* To avoid deadlock, first release all locks with a larger + ** BtShared address. Then acquire our lock. Then reacquire + ** the other BtShared locks that we used to hold in ascending + ** order. + */ + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + assert( pLater->sharable ); + assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); + assert( !pLater->locked || pLater->wantToLock>0 ); + if( pLater->locked ){ + sqlite3_mutex_leave(pLater->pBt->mutex); + pLater->locked = 0; + } + } + sqlite3_mutex_enter(p->pBt->mutex); + p->locked = 1; + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + if( pLater->wantToLock ){ + sqlite3_mutex_enter(pLater->pBt->mutex); + pLater->locked = 1; + } + } +} + +/* +** Exit the recursive mutex on a Btree. +*/ +void sqlite3BtreeLeave(Btree *p){ + if( p->sharable ){ + assert( p->wantToLock>0 ); + p->wantToLock--; + if( p->wantToLock==0 ){ + assert( p->locked ); + sqlite3_mutex_leave(p->pBt->mutex); + p->locked = 0; + } + } +} + +#ifndef NDEBUG +/* +** Return true if the BtShared mutex is held on the btree. +** +** This routine makes no determination one why or another if the +** database connection mutex is held. +** +** This routine is used only from within assert() statements. +*/ +int sqlite3BtreeHoldsMutex(Btree *p){ + return (p->sharable==0 || + (p->locked && p->wantToLock && sqlite3_mutex_held(p->pBt->mutex))); +} +#endif + + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Enter and leave a mutex on a Btree given a cursor owned by that +** Btree. These entry points are used by incremental I/O and can be +** omitted if that module is not used. +*/ +void sqlite3BtreeEnterCursor(BtCursor *pCur){ + sqlite3BtreeEnter(pCur->pBtree); +} +void sqlite3BtreeLeaveCursor(BtCursor *pCur){ + sqlite3BtreeLeave(pCur->pBtree); +} +#endif /* SQLITE_OMIT_INCRBLOB */ + + +/* +** Enter the mutex on every Btree associated with a database +** connection. This is needed (for example) prior to parsing +** a statement since we will be comparing table and column names +** against all schemas and we do not want those schemas being +** reset out from under us. +** +** There is a corresponding leave-all procedures. +** +** Enter the mutexes in accending order by BtShared pointer address +** to avoid the possibility of deadlock when two threads with +** two or more btrees in common both try to lock all their btrees +** at the same instant. +*/ +void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + Btree *p, *pLater; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p && p->sharable ){ + p->wantToLock++; + if( !p->locked ){ + assert( p->wantToLock==1 ); + while( p->pPrev ) p = p->pPrev; + while( p->locked && p->pNext ) p = p->pNext; + for(pLater = p->pNext; pLater; pLater=pLater->pNext){ + if( pLater->locked ){ + sqlite3_mutex_leave(pLater->pBt->mutex); + pLater->locked = 0; + } + } + while( p ){ + sqlite3_mutex_enter(p->pBt->mutex); + p->locked++; + p = p->pNext; + } + } + } + } +} +void sqlite3BtreeLeaveAll(sqlite3 *db){ + int i; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p && p->sharable ){ + assert( p->wantToLock>0 ); + p->wantToLock--; + if( p->wantToLock==0 ){ + assert( p->locked ); + sqlite3_mutex_leave(p->pBt->mutex); + p->locked = 0; + } + } + } +} + +#ifndef NDEBUG +/* +** Return true if the current thread holds the database connection +** mutex and all required BtShared mutexes. +** +** This routine is used inside assert() statements only. +*/ +int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ + int i; + if( !sqlite3_mutex_held(db->mutex) ){ + return 0; + } + for(i=0; inDb; i++){ + Btree *p; + p = db->aDb[i].pBt; + if( p && p->sharable && + (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ + return 0; + } + } + return 1; +} +#endif /* NDEBUG */ + +/* +** Potentially dd a new Btree pointer to a BtreeMutexArray. +** Really only add the Btree if it can possibly be shared with +** another database connection. +** +** The Btrees are kept in sorted order by pBtree->pBt. That +** way when we go to enter all the mutexes, we can enter them +** in order without every having to backup and retry and without +** worrying about deadlock. +** +** The number of shared btrees will always be small (usually 0 or 1) +** so an insertion sort is an adequate algorithm here. +*/ +void sqlite3BtreeMutexArrayInsert(BtreeMutexArray *pArray, Btree *pBtree){ + int i, j; + BtShared *pBt; + if( pBtree==0 || pBtree->sharable==0 ) return; +#ifndef NDEBUG + { + for(i=0; inMutex; i++){ + assert( pArray->aBtree[i]!=pBtree ); + } + } +#endif + assert( pArray->nMutex>=0 ); + assert( pArray->nMutexaBtree)/sizeof(pArray->aBtree[0])-1 ); + pBt = pBtree->pBt; + for(i=0; inMutex; i++){ + assert( pArray->aBtree[i]!=pBtree ); + if( pArray->aBtree[i]->pBt>pBt ){ + for(j=pArray->nMutex; j>i; j--){ + pArray->aBtree[j] = pArray->aBtree[j-1]; + } + pArray->aBtree[i] = pBtree; + pArray->nMutex++; + return; + } + } + pArray->aBtree[pArray->nMutex++] = pBtree; +} + +/* +** Enter the mutex of every btree in the array. This routine is +** called at the beginning of sqlite3VdbeExec(). The mutexes are +** exited at the end of the same function. +*/ +void sqlite3BtreeMutexArrayEnter(BtreeMutexArray *pArray){ + int i; + for(i=0; inMutex; i++){ + Btree *p = pArray->aBtree[i]; + /* Some basic sanity checking */ + assert( i==0 || pArray->aBtree[i-1]->pBtpBt ); + assert( !p->locked || p->wantToLock>0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + + p->wantToLock++; + if( !p->locked && p->sharable ){ + sqlite3_mutex_enter(p->pBt->mutex); + p->locked = 1; + } + } +} + +/* +** Leave the mutex of every btree in the group. +*/ +void sqlite3BtreeMutexArrayLeave(BtreeMutexArray *pArray){ + int i; + for(i=0; inMutex; i++){ + Btree *p = pArray->aBtree[i]; + /* Some basic sanity checking */ + assert( i==0 || pArray->aBtree[i-1]->pBtpBt ); + assert( p->locked || !p->sharable ); + assert( p->wantToLock>0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + + p->wantToLock--; + if( p->wantToLock==0 && p->locked ){ + sqlite3_mutex_leave(p->pBt->mutex); + p->locked = 0; + } + } +} + + +#endif /* SQLITE_THREADSAFE && !SQLITE_OMIT_SHARED_CACHE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c new file mode 100644 index 0000000000..de8821a900 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c @@ -0,0 +1,6890 @@ +/* +** 2004 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** $Id: btree.c,v 1.428 2007/10/03 08:46:44 danielk1977 Exp $ +** +** This file implements a external (disk-based) database using BTrees. +** See the header comment on "btreeInt.h" for additional information. +** Including a description of file format and an overview of operation. +*/ +#include "btreeInt.h" + +/* +** The header string that appears at the beginning of every +** SQLite database. +*/ +static const char zMagicHeader[] = SQLITE_FILE_HEADER; + +/* +** Set this global variable to 1 to enable tracing using the TRACE +** macro. +*/ +#if SQLITE_TEST +int sqlite3_btree_trace=0; /* True to enable tracing */ +#endif + + + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** A flag to indicate whether or not shared cache is enabled. Also, +** a list of BtShared objects that are eligible for participation +** in shared cache. The variables have file scope during normal builds, +** but the test harness needs to access these variables so we make them +** global for test builds. +*/ +#ifdef SQLITE_TEST +BtShared *sqlite3SharedCacheList = 0; +int sqlite3SharedCacheEnabled = 0; +#else +static BtShared *sqlite3SharedCacheList = 0; +static int sqlite3SharedCacheEnabled = 0; +#endif +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Enable or disable the shared pager and schema features. +** +** This routine has no effect on existing database connections. +** The shared cache setting effects only future calls to +** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). +*/ +int sqlite3_enable_shared_cache(int enable){ + sqlite3SharedCacheEnabled = enable; + return SQLITE_OK; +} +#endif + + +/* +** Forward declaration +*/ +static int checkReadLocks(Btree*,Pgno,BtCursor*); + + +#ifdef SQLITE_OMIT_SHARED_CACHE + /* + ** The functions queryTableLock(), lockTable() and unlockAllTables() + ** manipulate entries in the BtShared.pLock linked list used to store + ** shared-cache table level locks. If the library is compiled with the + ** shared-cache feature disabled, then there is only ever one user + ** of each BtShared structure and so this locking is not necessary. + ** So define the lock related functions as no-ops. + */ + #define queryTableLock(a,b,c) SQLITE_OK + #define lockTable(a,b,c) SQLITE_OK + #define unlockAllTables(a) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Query to see if btree handle p may obtain a lock of type eLock +** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return +** SQLITE_OK if the lock may be obtained (by calling lockTable()), or +** SQLITE_LOCKED if not. +*/ +static int queryTableLock(Btree *p, Pgno iTab, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + + /* This is a no-op if the shared-cache is not enabled */ + if( !p->sharable ){ + return SQLITE_OK; + } + + /* This (along with lockTable()) is where the ReadUncommitted flag is + ** dealt with. If the caller is querying for a read-lock and the flag is + ** set, it is unconditionally granted - even if there are write-locks + ** on the table. If a write-lock is requested, the ReadUncommitted flag + ** is not considered. + ** + ** In function lockTable(), if a read-lock is demanded and the + ** ReadUncommitted flag is set, no entry is added to the locks list + ** (BtShared.pLock). + ** + ** To summarize: If the ReadUncommitted flag is set, then read cursors do + ** not create or respect table locks. The locking procedure for a + ** write-cursor does not change. + */ + if( + !p->pSqlite || + 0==(p->pSqlite->flags&SQLITE_ReadUncommitted) || + eLock==WRITE_LOCK || + iTab==MASTER_ROOT + ){ + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->pBtree!=p && pIter->iTable==iTab && + (pIter->eLock!=eLock || eLock!=READ_LOCK) ){ + return SQLITE_LOCKED; + } + } + } + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Add a lock on the table with root-page iTable to the shared-btree used +** by Btree handle p. Parameter eLock must be either READ_LOCK or +** WRITE_LOCK. +** +** SQLITE_OK is returned if the lock is added successfully. SQLITE_BUSY and +** SQLITE_NOMEM may also be returned. +*/ +static int lockTable(Btree *p, Pgno iTable, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pLock = 0; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + + /* This is a no-op if the shared-cache is not enabled */ + if( !p->sharable ){ + return SQLITE_OK; + } + + assert( SQLITE_OK==queryTableLock(p, iTable, eLock) ); + + /* If the read-uncommitted flag is set and a read-lock is requested, + ** return early without adding an entry to the BtShared.pLock list. See + ** comment in function queryTableLock() for more info on handling + ** the ReadUncommitted flag. + */ + if( + (p->pSqlite) && + (p->pSqlite->flags&SQLITE_ReadUncommitted) && + (eLock==READ_LOCK) && + iTable!=MASTER_ROOT + ){ + return SQLITE_OK; + } + + /* First search the list for an existing lock on this table. */ + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->iTable==iTable && pIter->pBtree==p ){ + pLock = pIter; + break; + } + } + + /* If the above search did not find a BtLock struct associating Btree p + ** with table iTable, allocate one and link it into the list. + */ + if( !pLock ){ + pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); + if( !pLock ){ + return SQLITE_NOMEM; + } + pLock->iTable = iTable; + pLock->pBtree = p; + pLock->pNext = pBt->pLock; + pBt->pLock = pLock; + } + + /* Set the BtLock.eLock variable to the maximum of the current lock + ** and the requested lock. This means if a write-lock was already held + ** and a read-lock requested, we don't incorrectly downgrade the lock. + */ + assert( WRITE_LOCK>READ_LOCK ); + if( eLock>pLock->eLock ){ + pLock->eLock = eLock; + } + + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Release all the table locks (locks obtained via calls to the lockTable() +** procedure) held by Btree handle p. +*/ +static void unlockAllTables(Btree *p){ + BtLock **ppIter = &p->pBt->pLock; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->sharable || 0==*ppIter ); + + while( *ppIter ){ + BtLock *pLock = *ppIter; + if( pLock->pBtree==p ){ + *ppIter = pLock->pNext; + sqlite3_free(pLock); + }else{ + ppIter = &pLock->pNext; + } + } +} +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +static void releasePage(MemPage *pPage); /* Forward reference */ + +/* +** Verify that the cursor holds a mutex on the BtShared +*/ +#ifndef NDEBUG +static int cursorHoldsMutex(BtCursor *p){ + return sqlite3_mutex_held(p->pBt->mutex); +} +#endif + + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Invalidate the overflow page-list cache for cursor pCur, if any. +*/ +static void invalidateOverflowCache(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + sqlite3_free(pCur->aOverflow); + pCur->aOverflow = 0; +} + +/* +** Invalidate the overflow page-list cache for all cursors opened +** on the shared btree structure pBt. +*/ +static void invalidateAllOverflowCache(BtShared *pBt){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + for(p=pBt->pCursor; p; p=p->pNext){ + invalidateOverflowCache(p); + } +} +#else + #define invalidateOverflowCache(x) + #define invalidateAllOverflowCache(x) +#endif + +/* +** Save the current cursor position in the variables BtCursor.nKey +** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. +*/ +static int saveCursorPosition(BtCursor *pCur){ + int rc; + + assert( CURSOR_VALID==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + rc = sqlite3BtreeKeySize(pCur, &pCur->nKey); + + /* If this is an intKey table, then the above call to BtreeKeySize() + ** stores the integer key in pCur->nKey. In this case this value is + ** all that is required. Otherwise, if pCur is not open on an intKey + ** table, then malloc space for and store the pCur->nKey bytes of key + ** data. + */ + if( rc==SQLITE_OK && 0==pCur->pPage->intKey){ + void *pKey = sqlite3_malloc(pCur->nKey); + if( pKey ){ + rc = sqlite3BtreeKey(pCur, 0, pCur->nKey, pKey); + if( rc==SQLITE_OK ){ + pCur->pKey = pKey; + }else{ + sqlite3_free(pKey); + } + }else{ + rc = SQLITE_NOMEM; + } + } + assert( !pCur->pPage->intKey || !pCur->pKey ); + + if( rc==SQLITE_OK ){ + releasePage(pCur->pPage); + pCur->pPage = 0; + pCur->eState = CURSOR_REQUIRESEEK; + } + + invalidateOverflowCache(pCur); + return rc; +} + +/* +** Save the positions of all cursors except pExcept open on the table +** with root-page iRoot. Usually, this is called just before cursor +** pExcept is used to modify the table (BtreeDelete() or BtreeInsert()). +*/ +static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pExcept==0 || pExcept->pBt==pBt ); + for(p=pBt->pCursor; p; p=p->pNext){ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) && + p->eState==CURSOR_VALID ){ + int rc = saveCursorPosition(p); + if( SQLITE_OK!=rc ){ + return rc; + } + } + } + return SQLITE_OK; +} + +/* +** Clear the current cursor position. +*/ +static void clearCursorPosition(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + pCur->eState = CURSOR_INVALID; +} + +/* +** Restore the cursor to the position it was in (or as close to as possible) +** when saveCursorPosition() was called. Note that this call deletes the +** saved position info stored by saveCursorPosition(), so there can be +** at most one effective restoreOrClearCursorPosition() call after each +** saveCursorPosition(). +** +** If the second argument argument - doSeek - is false, then instead of +** returning the cursor to it's saved position, any saved position is deleted +** and the cursor state set to CURSOR_INVALID. +*/ +int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur){ + int rc; + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState>=CURSOR_REQUIRESEEK ); + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skip; + } +#ifndef SQLITE_OMIT_INCRBLOB + if( pCur->isIncrblobHandle ){ + return SQLITE_ABORT; + } +#endif + pCur->eState = CURSOR_INVALID; + rc = sqlite3BtreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skip); + if( rc==SQLITE_OK ){ + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + } + return rc; +} + +#define restoreOrClearCursorPosition(p) \ + (p->eState>=CURSOR_REQUIRESEEK ? \ + sqlite3BtreeRestoreOrClearCursorPosition(p) : \ + SQLITE_OK) + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Given a page number of a regular database page, return the page +** number for the pointer-map page that contains the entry for the +** input page number. +*/ +static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ + int nPagesPerMapPage, iPtrMap, ret; + assert( sqlite3_mutex_held(pBt->mutex) ); + nPagesPerMapPage = (pBt->usableSize/5)+1; + iPtrMap = (pgno-2)/nPagesPerMapPage; + ret = (iPtrMap*nPagesPerMapPage) + 2; + if( ret==PENDING_BYTE_PAGE(pBt) ){ + ret++; + } + return ret; +} + +/* +** Write an entry into the pointer map. +** +** This routine updates the pointer map entry for page number 'key' +** so that it maps to type 'eType' and parent page number 'pgno'. +** An error code is returned if something goes wrong, otherwise SQLITE_OK. +*/ +static int ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent){ + DbPage *pDbPage; /* The pointer map page */ + u8 *pPtrmap; /* The pointer map data */ + Pgno iPtrmap; /* The pointer map page number */ + int offset; /* Offset in pointer map page */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + /* The master-journal page number must never be used as a pointer map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + + assert( pBt->autoVacuum ); + if( key==0 ){ + return SQLITE_CORRUPT_BKPT; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + offset = PTRMAP_PTROFFSET(pBt, key); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); + } + } + + sqlite3PagerUnref(pDbPage); + return rc; +} + +/* +** Read an entry from the pointer map. +** +** This routine retrieves the pointer map entry for page 'key', writing +** the type and parent page number to *pEType and *pPgno respectively. +** An error code is returned if something goes wrong, otherwise SQLITE_OK. +*/ +static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ + DbPage *pDbPage; /* The pointer map page */ + int iPtrmap; /* Pointer map page index */ + u8 *pPtrmap; /* Pointer map page data */ + int offset; /* Offset of entry in pointer map */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + if( rc!=0 ){ + return rc; + } + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + offset = PTRMAP_PTROFFSET(pBt, key); + assert( pEType!=0 ); + *pEType = pPtrmap[offset]; + if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); + + sqlite3PagerUnref(pDbPage); + if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT; + return SQLITE_OK; +} + +#endif /* SQLITE_OMIT_AUTOVACUUM */ + +/* +** Given a btree page and a cell index (0 means the first cell on +** the page, 1 means the second cell, and so forth) return a pointer +** to the cell content. +** +** This routine works only for pages that do not contain overflow cells. +*/ +#define findCell(pPage, iCell) \ + ((pPage)->aData + get2byte(&(pPage)->aData[(pPage)->cellOffset+2*(iCell)])) +#ifdef SQLITE_TEST +u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell){ + assert( iCell>=0 ); + assert( iCellaData[pPage->hdrOffset+3]) ); + return findCell(pPage, iCell); +} +#endif + +/* +** This a more complex version of sqlite3BtreeFindCell() that works for +** pages that do contain overflow cells. See insert +*/ +static u8 *findOverflowCell(MemPage *pPage, int iCell){ + int i; + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + for(i=pPage->nOverflow-1; i>=0; i--){ + int k; + struct _OvflCell *pOvfl; + pOvfl = &pPage->aOvfl[i]; + k = pOvfl->idx; + if( k<=iCell ){ + if( k==iCell ){ + return pOvfl->pCell; + } + iCell--; + } + } + return findCell(pPage, iCell); +} + +/* +** Parse a cell content block and fill in the CellInfo structure. There +** are two versions of this function. sqlite3BtreeParseCell() takes a +** cell index as the second argument and sqlite3BtreeParseCellPtr() +** takes a pointer to the body of the cell as its second argument. +** +** Within this file, the parseCell() macro can be called instead of +** sqlite3BtreeParseCellPtr(). Using some compilers, this will be faster. +*/ +void sqlite3BtreeParseCellPtr( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + int n; /* Number bytes in cell content header */ + u32 nPayload; /* Number of bytes of cell payload */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + pInfo->pCell = pCell; + assert( pPage->leaf==0 || pPage->leaf==1 ); + n = pPage->childPtrSize; + assert( n==4-4*pPage->leaf ); + if( pPage->hasData ){ + n += getVarint32(&pCell[n], &nPayload); + }else{ + nPayload = 0; + } + pInfo->nData = nPayload; + if( pPage->intKey ){ + n += getVarint(&pCell[n], (u64 *)&pInfo->nKey); + }else{ + u32 x; + n += getVarint32(&pCell[n], &x); + pInfo->nKey = x; + nPayload += x; + } + pInfo->nPayload = nPayload; + pInfo->nHeader = n; + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + int nSize; /* Total size of cell content in bytes */ + pInfo->nLocal = nPayload; + pInfo->iOverflow = 0; + nSize = nPayload + n; + if( nSize<4 ){ + nSize = 4; /* Minimum cell size is 4 */ + } + pInfo->nSize = nSize; + }else{ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4); + if( surplus <= maxLocal ){ + pInfo->nLocal = surplus; + }else{ + pInfo->nLocal = minLocal; + } + pInfo->iOverflow = pInfo->nLocal + n; + pInfo->nSize = pInfo->iOverflow + 4; + } +} +#define parseCell(pPage, iCell, pInfo) \ + sqlite3BtreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo)) +void sqlite3BtreeParseCell( + MemPage *pPage, /* Page containing the cell */ + int iCell, /* The cell index. First cell is 0 */ + CellInfo *pInfo /* Fill in this structure */ +){ + parseCell(pPage, iCell, pInfo); +} + +/* +** Compute the total number of bytes that a Cell needs in the cell +** data area of the btree-page. The return number includes the cell +** data header and the local payload, but not any overflow page or +** the space used by the cell pointer. +*/ +#ifndef NDEBUG +static int cellSize(MemPage *pPage, int iCell){ + CellInfo info; + sqlite3BtreeParseCell(pPage, iCell, &info); + return info.nSize; +} +#endif +static int cellSizePtr(MemPage *pPage, u8 *pCell){ + CellInfo info; + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + return info.nSize; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** If the cell pCell, part of page pPage contains a pointer +** to an overflow page, insert an entry into the pointer-map +** for the overflow page. +*/ +static int ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell){ + if( pCell ){ + CellInfo info; + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload ); + if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){ + Pgno ovfl = get4byte(&pCell[info.iOverflow]); + return ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno); + } + } + return SQLITE_OK; +} +/* +** If the cell with index iCell on page pPage contains a pointer +** to an overflow page, insert an entry into the pointer-map +** for the overflow page. +*/ +static int ptrmapPutOvfl(MemPage *pPage, int iCell){ + u8 *pCell; + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pCell = findOverflowCell(pPage, iCell); + return ptrmapPutOvflPtr(pPage, pCell); +} +#endif + + +/* +** Defragment the page given. All Cells are moved to the +** end of the page and all free space is collected into one +** big FreeBlk that occurs in between the header and cell +** pointer array and the cell content area. +*/ +static int defragmentPage(MemPage *pPage){ + int i; /* Loop counter */ + int pc; /* Address of a i-th cell */ + int addr; /* Offset of first byte after cell pointer array */ + int hdr; /* Offset to the page header */ + int size; /* Size of a cell */ + int usableSize; /* Number of usable bytes on a page */ + int cellOffset; /* Offset to the cell pointer array */ + int brk; /* Offset to the cell content area */ + int nCell; /* Number of cells on the page */ + unsigned char *data; /* The page data */ + unsigned char *temp; /* Temp area for cell content */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt!=0 ); + assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); + assert( pPage->nOverflow==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + temp = sqlite3_malloc( pPage->pBt->pageSize ); + if( temp==0 ) return SQLITE_NOMEM; + data = pPage->aData; + hdr = pPage->hdrOffset; + cellOffset = pPage->cellOffset; + nCell = pPage->nCell; + assert( nCell==get2byte(&data[hdr+3]) ); + usableSize = pPage->pBt->usableSize; + brk = get2byte(&data[hdr+5]); + memcpy(&temp[brk], &data[brk], usableSize - brk); + brk = usableSize; + for(i=0; ipBt->usableSize ); + size = cellSizePtr(pPage, &temp[pc]); + brk -= size; + memcpy(&data[brk], &temp[pc], size); + put2byte(pAddr, brk); + } + assert( brk>=cellOffset+2*nCell ); + put2byte(&data[hdr+5], brk); + data[hdr+1] = 0; + data[hdr+2] = 0; + data[hdr+7] = 0; + addr = cellOffset+2*nCell; + memset(&data[addr], 0, brk-addr); + sqlite3_free(temp); + return SQLITE_OK; +} + +/* +** Allocate nByte bytes of space on a page. +** +** Return the index into pPage->aData[] of the first byte of +** the new allocation. Or return 0 if there is not enough free +** space on the page to satisfy the allocation request. +** +** If the page contains nBytes of free space but does not contain +** nBytes of contiguous free space, then this routine automatically +** calls defragementPage() to consolidate all free space before +** allocating the new chunk. +*/ +static int allocateSpace(MemPage *pPage, int nByte){ + int addr, pc, hdr; + int size; + int nFrag; + int top; + int nCell; + int cellOffset; + unsigned char *data; + + data = pPage->aData; + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( nByte<4 ) nByte = 4; + if( pPage->nFreenOverflow>0 ) return 0; + pPage->nFree -= nByte; + hdr = pPage->hdrOffset; + + nFrag = data[hdr+7]; + if( nFrag<60 ){ + /* Search the freelist looking for a slot big enough to satisfy the + ** space request. */ + addr = hdr+1; + while( (pc = get2byte(&data[addr]))>0 ){ + size = get2byte(&data[pc+2]); + if( size>=nByte ){ + if( sizecellOffset; + if( nFrag>=60 || cellOffset + 2*nCell > top - nByte ){ + if( defragmentPage(pPage) ) return 0; + top = get2byte(&data[hdr+5]); + } + top -= nByte; + assert( cellOffset + 2*nCell <= top ); + put2byte(&data[hdr+5], top); + return top; +} + +/* +** Return a section of the pPage->aData to the freelist. +** The first byte of the new free block is pPage->aDisk[start] +** and the size of the block is "size" bytes. +** +** Most of the effort here is involved in coalesing adjacent +** free blocks into a single big free block. +*/ +static void freeSpace(MemPage *pPage, int start, int size){ + int addr, pbegin, hdr; + unsigned char *data = pPage->aData; + + assert( pPage->pBt!=0 ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( start>=pPage->hdrOffset+6+(pPage->leaf?0:4) ); + assert( (start + size)<=pPage->pBt->usableSize ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( size<4 ) size = 4; + +#ifdef SQLITE_SECURE_DELETE + /* Overwrite deleted information with zeros when the SECURE_DELETE + ** option is enabled at compile-time */ + memset(&data[start], 0, size); +#endif + + /* Add the space back into the linked list of freeblocks */ + hdr = pPage->hdrOffset; + addr = hdr + 1; + while( (pbegin = get2byte(&data[addr]))0 ){ + assert( pbegin<=pPage->pBt->usableSize-4 ); + assert( pbegin>addr ); + addr = pbegin; + } + assert( pbegin<=pPage->pBt->usableSize-4 ); + assert( pbegin>addr || pbegin==0 ); + put2byte(&data[addr], start); + put2byte(&data[start], pbegin); + put2byte(&data[start+2], size); + pPage->nFree += size; + + /* Coalesce adjacent free blocks */ + addr = pPage->hdrOffset + 1; + while( (pbegin = get2byte(&data[addr]))>0 ){ + int pnext, psize; + assert( pbegin>addr ); + assert( pbegin<=pPage->pBt->usableSize-4 ); + pnext = get2byte(&data[pbegin]); + psize = get2byte(&data[pbegin+2]); + if( pbegin + psize + 3 >= pnext && pnext>0 ){ + int frag = pnext - (pbegin+psize); + assert( frag<=data[pPage->hdrOffset+7] ); + data[pPage->hdrOffset+7] -= frag; + put2byte(&data[pbegin], get2byte(&data[pnext])); + put2byte(&data[pbegin+2], pnext+get2byte(&data[pnext+2])-pbegin); + }else{ + addr = pbegin; + } + } + + /* If the cell content area begins with a freeblock, remove it. */ + if( data[hdr+1]==data[hdr+5] && data[hdr+2]==data[hdr+6] ){ + int top; + pbegin = get2byte(&data[hdr+1]); + memcpy(&data[hdr+1], &data[pbegin], 2); + top = get2byte(&data[hdr+5]); + put2byte(&data[hdr+5], top + get2byte(&data[pbegin+2])); + } +} + +/* +** Decode the flags byte (the first byte of the header) for a page +** and initialize fields of the MemPage structure accordingly. +*/ +static void decodeFlags(MemPage *pPage, int flagByte){ + BtShared *pBt; /* A copy of pPage->pBt */ + + assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->intKey = (flagByte & (PTF_INTKEY|PTF_LEAFDATA))!=0; + pPage->zeroData = (flagByte & PTF_ZERODATA)!=0; + pPage->leaf = (flagByte & PTF_LEAF)!=0; + pPage->childPtrSize = 4*(pPage->leaf==0); + pBt = pPage->pBt; + if( flagByte & PTF_LEAFDATA ){ + pPage->leafData = 1; + pPage->maxLocal = pBt->maxLeaf; + pPage->minLocal = pBt->minLeaf; + }else{ + pPage->leafData = 0; + pPage->maxLocal = pBt->maxLocal; + pPage->minLocal = pBt->minLocal; + } + pPage->hasData = !(pPage->zeroData || (!pPage->leaf && pPage->leafData)); +} + +/* +** Initialize the auxiliary information for a disk block. +** +** The pParent parameter must be a pointer to the MemPage which +** is the parent of the page being initialized. The root of a +** BTree has no parent and so for that page, pParent==NULL. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +int sqlite3BtreeInitPage( + MemPage *pPage, /* The page to be initialized */ + MemPage *pParent /* The parent. Might be NULL */ +){ + int pc; /* Address of a freeblock within pPage->aData[] */ + int hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + int usableSize; /* Amount of usable space on each page */ + int cellOffset; /* Offset from start of page to first cell pointer */ + int nFree; /* Number of unused bytes on the page */ + int top; /* First byte of the cell content area */ + + pBt = pPage->pBt; + assert( pBt!=0 ); + assert( pParent==0 || pParent->pBt==pBt ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + if( pPage->pParent!=pParent && (pPage->pParent!=0 || pPage->isInit) ){ + /* The parent page should never change unless the file is corrupt */ + return SQLITE_CORRUPT_BKPT; + } + if( pPage->isInit ) return SQLITE_OK; + if( pPage->pParent==0 && pParent!=0 ){ + pPage->pParent = pParent; + sqlite3PagerRef(pParent->pDbPage); + } + hdr = pPage->hdrOffset; + data = pPage->aData; + decodeFlags(pPage, data[hdr]); + pPage->nOverflow = 0; + pPage->idxShift = 0; + usableSize = pBt->usableSize; + pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf; + top = get2byte(&data[hdr+5]); + pPage->nCell = get2byte(&data[hdr+3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_BKPT; + } + if( pPage->nCell==0 && pParent!=0 && pParent->pgno!=1 ){ + /* All pages must have at least one cell, except for root pages */ + return SQLITE_CORRUPT_BKPT; + } + + /* Compute the total free space on the page */ + pc = get2byte(&data[hdr+1]); + nFree = data[hdr+7] + top - (cellOffset + 2*pPage->nCell); + while( pc>0 ){ + int next, size; + if( pc>usableSize-4 ){ + /* Free block is off the page */ + return SQLITE_CORRUPT_BKPT; + } + next = get2byte(&data[pc]); + size = get2byte(&data[pc+2]); + if( next>0 && next<=pc+size+3 ){ + /* Free blocks must be in accending order */ + return SQLITE_CORRUPT_BKPT; + } + nFree += size; + pc = next; + } + pPage->nFree = nFree; + if( nFree>=usableSize ){ + /* Free space cannot exceed total page size */ + return SQLITE_CORRUPT_BKPT; + } + + pPage->isInit = 1; + return SQLITE_OK; +} + +/* +** Set up a raw page so that it looks like a database page holding +** no entries. +*/ +static void zeroPage(MemPage *pPage, int flags){ + unsigned char *data = pPage->aData; + BtShared *pBt = pPage->pBt; + int hdr = pPage->hdrOffset; + int first; + + assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage) == data ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pBt->mutex) ); + memset(&data[hdr], 0, pBt->usableSize - hdr); + data[hdr] = flags; + first = hdr + 8 + 4*((flags&PTF_LEAF)==0); + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pBt->usableSize); + pPage->nFree = pBt->usableSize - first; + decodeFlags(pPage, flags); + pPage->hdrOffset = hdr; + pPage->cellOffset = first; + pPage->nOverflow = 0; + pPage->idxShift = 0; + pPage->nCell = 0; + pPage->isInit = 1; +} + +/* +** Get a page from the pager. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. +** +** If the noContent flag is set, it means that we do not care about +** the content of the page at this time. So do not go to the disk +** to fetch the content. Just fill in the content with zeros for now. +** If in the future we call sqlite3PagerWrite() on this page, that +** means we have started to be concerned about content and the disk +** read should occur at that point. +*/ +int sqlite3BtreeGetPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int noContent /* Do not load page content if true */ +){ + int rc; + MemPage *pPage; + DbPage *pDbPage; + + assert( sqlite3_mutex_held(pBt->mutex) ); + rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, noContent); + if( rc ) return rc; + pPage = (MemPage *)sqlite3PagerGetExtra(pDbPage); + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pPage->pgno==1 ? 100 : 0; + *ppPage = pPage; + return SQLITE_OK; +} + +/* +** Get a page from the pager and initialize it. This routine +** is just a convenience wrapper around separate calls to +** sqlite3BtreeGetPage() and sqlite3BtreeInitPage(). +*/ +static int getAndInitPage( + BtShared *pBt, /* The database file */ + Pgno pgno, /* Number of the page to get */ + MemPage **ppPage, /* Write the page pointer here */ + MemPage *pParent /* Parent of the page */ +){ + int rc; + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + rc = sqlite3BtreeGetPage(pBt, pgno, ppPage, 0); + if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){ + rc = sqlite3BtreeInitPage(*ppPage, pParent); + } + return rc; +} + +/* +** Release a MemPage. This should be called once for each prior +** call to sqlite3BtreeGetPage. +*/ +static void releasePage(MemPage *pPage){ + if( pPage ){ + assert( pPage->aData ); + assert( pPage->pBt ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnref(pPage->pDbPage); + } +} + +/* +** This routine is called when the reference count for a page +** reaches zero. We need to unref the pParent pointer when that +** happens. +*/ +static void pageDestructor(DbPage *pData, int pageSize){ + MemPage *pPage; + assert( (pageSize & 7)==0 ); + pPage = (MemPage *)sqlite3PagerGetExtra(pData); + assert( pPage->isInit==0 || sqlite3_mutex_held(pPage->pBt->mutex) ); + if( pPage->pParent ){ + MemPage *pParent = pPage->pParent; + assert( pParent->pBt==pPage->pBt ); + pPage->pParent = 0; + releasePage(pParent); + } + pPage->isInit = 0; +} + +/* +** During a rollback, when the pager reloads information into the cache +** so that the cache is restored to its original state at the start of +** the transaction, for each page restored this routine is called. +** +** This routine needs to reset the extra data section at the end of the +** page to agree with the restored data. +*/ +static void pageReinit(DbPage *pData, int pageSize){ + MemPage *pPage; + assert( (pageSize & 7)==0 ); + pPage = (MemPage *)sqlite3PagerGetExtra(pData); + if( pPage->isInit ){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->isInit = 0; + sqlite3BtreeInitPage(pPage, pPage->pParent); + } +} + +/* +** Open a database file. +** +** zFilename is the name of the database file. If zFilename is NULL +** a new database with a random name is created. This randomly named +** database file will be deleted when sqlite3BtreeClose() is called. +** If zFilename is ":memory:" then an in-memory database is created +** that is automatically destroyed when it is closed. +*/ +int sqlite3BtreeOpen( + const char *zFilename, /* Name of the file containing the BTree database */ + sqlite3 *pSqlite, /* Associated database handle */ + Btree **ppBtree, /* Pointer to new Btree object written here */ + int flags, /* Options */ + int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */ +){ + sqlite3_vfs *pVfs; /* The VFS to use for this btree */ + BtShared *pBt = 0; /* Shared part of btree structure */ + Btree *p; /* Handle to return */ + int rc = SQLITE_OK; + int nReserve; + unsigned char zDbHeader[100]; + + /* Set the variable isMemdb to true for an in-memory database, or + ** false for a file-based database. This symbol is only required if + ** either of the shared-data or autovacuum features are compiled + ** into the library. + */ +#if !defined(SQLITE_OMIT_SHARED_CACHE) || !defined(SQLITE_OMIT_AUTOVACUUM) + #ifdef SQLITE_OMIT_MEMORYDB + const int isMemdb = 0; + #else + const int isMemdb = zFilename && !strcmp(zFilename, ":memory:"); + #endif +#endif + + assert( pSqlite!=0 ); + assert( sqlite3_mutex_held(pSqlite->mutex) ); + + pVfs = pSqlite->pVfs; + p = sqlite3MallocZero(sizeof(Btree)); + if( !p ){ + return SQLITE_NOMEM; + } + p->inTrans = TRANS_NONE; + p->pSqlite = pSqlite; + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* + ** If this Btree is a candidate for shared cache, try to find an + ** existing BtShared object that we can share with + */ + if( (flags & BTREE_PRIVATE)==0 + && isMemdb==0 + && (pSqlite->flags & SQLITE_Vtab)==0 + && zFilename && zFilename[0] + ){ + if( sqlite3SharedCacheEnabled ){ + int nFullPathname = pVfs->mxPathname+1; + char *zFullPathname = (char *)sqlite3_malloc(nFullPathname); + sqlite3_mutex *mutexShared; + p->sharable = 1; + if( pSqlite ){ + pSqlite->flags |= SQLITE_SharedCache; + } + if( !zFullPathname ){ + sqlite3_free(p); + return SQLITE_NOMEM; + } + sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); + mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(mutexShared); + for(pBt=sqlite3SharedCacheList; pBt; pBt=pBt->pNext){ + assert( pBt->nRef>0 ); + if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager)) + && sqlite3PagerVfs(pBt->pPager)==pVfs ){ + p->pBt = pBt; + pBt->nRef++; + break; + } + } + sqlite3_mutex_leave(mutexShared); + sqlite3_free(zFullPathname); + } +#ifdef SQLITE_DEBUG + else{ + /* In debug mode, we mark all persistent databases as sharable + ** even when they are not. This exercises the locking code and + ** gives more opportunity for asserts(sqlite3_mutex_held()) + ** statements to find locking problems. + */ + p->sharable = 1; + } +#endif + } +#endif + if( pBt==0 ){ + /* + ** The following asserts make sure that structures used by the btree are + ** the right size. This is to guard against size changes that result + ** when compiling on a different architecture. + */ + assert( sizeof(i64)==8 || sizeof(i64)==4 ); + assert( sizeof(u64)==8 || sizeof(u64)==4 ); + assert( sizeof(u32)==4 ); + assert( sizeof(u16)==2 ); + assert( sizeof(Pgno)==4 ); + + pBt = sqlite3MallocZero( sizeof(*pBt) ); + if( pBt==0 ){ + rc = SQLITE_NOMEM; + goto btree_open_out; + } + rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, + EXTRA_SIZE, flags, vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); + } + if( rc!=SQLITE_OK ){ + goto btree_open_out; + } + p->pBt = pBt; + + sqlite3PagerSetDestructor(pBt->pPager, pageDestructor); + sqlite3PagerSetReiniter(pBt->pPager, pageReinit); + pBt->pCursor = 0; + pBt->pPage1 = 0; + pBt->readOnly = sqlite3PagerIsreadonly(pBt->pPager); + pBt->pageSize = get2byte(&zDbHeader[16]); + if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE + || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ + pBt->pageSize = 0; + sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); + pBt->maxEmbedFrac = 64; /* 25% */ + pBt->minEmbedFrac = 32; /* 12.5% */ + pBt->minLeafFrac = 32; /* 12.5% */ +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the magic name ":memory:" will create an in-memory database, then + ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if + ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if + ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a + ** regular file-name. In this case the auto-vacuum applies as per normal. + */ + if( zFilename && !isMemdb ){ + pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); + pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); + } +#endif + nReserve = 0; + }else{ + nReserve = zDbHeader[20]; + pBt->maxEmbedFrac = zDbHeader[21]; + pBt->minEmbedFrac = zDbHeader[22]; + pBt->minLeafFrac = zDbHeader[23]; + pBt->pageSizeFixed = 1; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); +#endif + } + pBt->usableSize = pBt->pageSize - nReserve; + assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ + sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* Add the new BtShared object to the linked list sharable BtShareds. + */ + if( p->sharable ){ + sqlite3_mutex *mutexShared; + pBt->nRef = 1; + mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + if( SQLITE_THREADSAFE ){ + pBt->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pBt->mutex==0 ){ + rc = SQLITE_NOMEM; + pSqlite->mallocFailed = 0; + goto btree_open_out; + } + } + sqlite3_mutex_enter(mutexShared); + pBt->pNext = sqlite3SharedCacheList; + sqlite3SharedCacheList = pBt; + sqlite3_mutex_leave(mutexShared); + } +#endif + } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* If the new Btree uses a sharable pBtShared, then link the new + ** Btree into the list of all sharable Btrees for the same connection. + ** The list is kept in ascending order by pBt address. + */ + if( p->sharable ){ + int i; + Btree *pSib; + for(i=0; inDb; i++){ + if( (pSib = pSqlite->aDb[i].pBt)!=0 && pSib->sharable ){ + while( pSib->pPrev ){ pSib = pSib->pPrev; } + if( p->pBtpBt ){ + p->pNext = pSib; + p->pPrev = 0; + pSib->pPrev = p; + }else{ + while( pSib->pNext && pSib->pNext->pBtpBt ){ + pSib = pSib->pNext; + } + p->pNext = pSib->pNext; + p->pPrev = pSib; + if( p->pNext ){ + p->pNext->pPrev = p; + } + pSib->pNext = p; + } + break; + } + } + } +#endif + *ppBtree = p; + +btree_open_out: + if( rc!=SQLITE_OK ){ + if( pBt && pBt->pPager ){ + sqlite3PagerClose(pBt->pPager); + } + sqlite3_free(pBt); + sqlite3_free(p); + *ppBtree = 0; + } + return rc; +} + +/* +** Decrement the BtShared.nRef counter. When it reaches zero, +** remove the BtShared structure from the sharing list. Return +** true if the BtShared.nRef counter reaches zero and return +** false if it is still positive. +*/ +static int removeFromSharingList(BtShared *pBt){ +#ifndef SQLITE_OMIT_SHARED_CACHE + sqlite3_mutex *pMaster; + BtShared *pList; + int removed = 0; + + assert( sqlite3_mutex_notheld(pBt->mutex) ); + pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(pMaster); + pBt->nRef--; + if( pBt->nRef<=0 ){ + if( sqlite3SharedCacheList==pBt ){ + sqlite3SharedCacheList = pBt->pNext; + }else{ + pList = sqlite3SharedCacheList; + while( pList && pList->pNext!=pBt ){ + pList=pList->pNext; + } + if( pList ){ + pList->pNext = pBt->pNext; + } + } + if( SQLITE_THREADSAFE ){ + sqlite3_mutex_free(pBt->mutex); + } + removed = 1; + } + sqlite3_mutex_leave(pMaster); + return removed; +#else + return 1; +#endif +} + +/* +** Close an open database and invalidate all cursors. +*/ +int sqlite3BtreeClose(Btree *p){ + BtShared *pBt = p->pBt; + BtCursor *pCur; + + /* Close all cursors opened via this handle. */ + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + pCur = pBt->pCursor; + while( pCur ){ + BtCursor *pTmp = pCur; + pCur = pCur->pNext; + if( pTmp->pBtree==p ){ + sqlite3BtreeCloseCursor(pTmp); + } + } + + /* Rollback any active transaction and free the handle structure. + ** The call to sqlite3BtreeRollback() drops any table-locks held by + ** this handle. + */ + sqlite3BtreeRollback(p); + sqlite3BtreeLeave(p); + + /* If there are still other outstanding references to the shared-btree + ** structure, return now. The remainder of this procedure cleans + ** up the shared-btree. + */ + assert( p->wantToLock==0 && p->locked==0 ); + if( !p->sharable || removeFromSharingList(pBt) ){ + /* The pBt is no longer on the sharing list, so we can access + ** it without having to hold the mutex. + ** + ** Clean out and delete the BtShared object. + */ + assert( !pBt->pCursor ); + sqlite3PagerClose(pBt->pPager); + if( pBt->xFreeSchema && pBt->pSchema ){ + pBt->xFreeSchema(pBt->pSchema); + } + sqlite3_free(pBt->pSchema); + sqlite3_free(pBt); + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( p->wantToLock==0 ); + assert( p->locked==0 ); + if( p->pPrev ) p->pPrev->pNext = p->pNext; + if( p->pNext ) p->pNext->pPrev = p->pPrev; +#endif + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Change the busy handler callback function. +*/ +int sqlite3BtreeSetBusyHandler(Btree *p, BusyHandler *pHandler){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + pBt->pBusyHandler = pHandler; + sqlite3PagerSetBusyhandler(pBt->pPager, pHandler); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Change the limit on the number of pages allowed in the cache. +** +** The maximum number of cache pages is set to the absolute +** value of mxPage. If mxPage is negative, the pager will +** operate asynchronously - it will not stop to do fsync()s +** to insure data is written to the disk surface before +** continuing. Transactions still work if synchronous is off, +** and the database cannot be corrupted if this program +** crashes. But if the operating system crashes or there is +** an abrupt power failure when synchronous is off, the database +** could be left in an inconsistent and unrecoverable state. +** Synchronous is on by default so database corruption is not +** normally a worry. +*/ +int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetCachesize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Change the way data is synced to disk in order to increase or decrease +** how well the database resists damage due to OS crashes and power +** failures. Level 1 is the same as asynchronous (no syncs() occur and +** there is a high probability of damage) Level 2 is the default. There +** is a very low but non-zero probability of damage. Level 3 reduces the +** probability of damage to near zero but with a write performance reduction. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +int sqlite3BtreeSetSafetyLevel(Btree *p, int level, int fullSync){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetSafetyLevel(pBt->pPager, level, fullSync); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif + +/* +** Return TRUE if the given btree is set to safety level 1. In other +** words, return TRUE if no sync() occurs on the disk files. +*/ +int sqlite3BtreeSyncDisabled(Btree *p){ + BtShared *pBt = p->pBt; + int rc; + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + assert( pBt && pBt->pPager ); + rc = sqlite3PagerNosync(pBt->pPager); + sqlite3BtreeLeave(p); + return rc; +} + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) +/* +** Change the default pages size and the number of reserved bytes per page. +** +** The page size must be a power of 2 between 512 and 65536. If the page +** size supplied does not meet this constraint then the page size is not +** changed. +** +** Page sizes are constrained to be a power of two so that the region +** of the database file used for locking (beginning at PENDING_BYTE, +** the first byte past the 1GB boundary, 0x40000000) needs to occur +** at the beginning of a page. +** +** If parameter nReserve is less than zero, then the number of reserved +** bytes per page is left unchanged. +*/ +int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){ + int rc = SQLITE_OK; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->pageSizeFixed ){ + sqlite3BtreeLeave(p); + return SQLITE_READONLY; + } + if( nReserve<0 ){ + nReserve = pBt->pageSize - pBt->usableSize; + } + if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && + ((pageSize-1)&pageSize)==0 ){ + assert( (pageSize & 7)==0 ); + assert( !pBt->pPage1 && !pBt->pCursor ); + pBt->pageSize = pageSize; + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); + } + pBt->usableSize = pBt->pageSize - nReserve; + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Return the currently defined page size +*/ +int sqlite3BtreeGetPageSize(Btree *p){ + return p->pBt->pageSize; +} +int sqlite3BtreeGetReserve(Btree *p){ + int n; + sqlite3BtreeEnter(p); + n = p->pBt->pageSize - p->pBt->usableSize; + sqlite3BtreeLeave(p); + return n; +} + +/* +** Set the maximum page count for a database if mxPage is positive. +** No changes are made if mxPage is 0 or negative. +** Regardless of the value of mxPage, return the maximum page count. +*/ +int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){ + int n; + sqlite3BtreeEnter(p); + n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return n; +} +#endif /* !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) */ + +/* +** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' +** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it +** is disabled. The default value for the auto-vacuum property is +** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. +*/ +int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return SQLITE_READONLY; +#else + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + int av = (autoVacuum?1:0); + + sqlite3BtreeEnter(p); + if( pBt->pageSizeFixed && av!=pBt->autoVacuum ){ + rc = SQLITE_READONLY; + }else{ + pBt->autoVacuum = av; + } + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** Return the value of the 'auto-vacuum' property. If auto-vacuum is +** enabled 1 is returned. Otherwise 0. +*/ +int sqlite3BtreeGetAutoVacuum(Btree *p){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return BTREE_AUTOVACUUM_NONE; +#else + int rc; + sqlite3BtreeEnter(p); + rc = ( + (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE: + (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL: + BTREE_AUTOVACUUM_INCR + ); + sqlite3BtreeLeave(p); + return rc; +#endif +} + + +/* +** Get a reference to pPage1 of the database file. This will +** also acquire a readlock on that file. +** +** SQLITE_OK is returned on success. If the file is not a +** well-formed database file, then SQLITE_CORRUPT is returned. +** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM +** is returned if we run out of memory. +*/ +static int lockBtree(BtShared *pBt){ + int rc, pageSize; + MemPage *pPage1; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->pPage1 ) return SQLITE_OK; + rc = sqlite3BtreeGetPage(pBt, 1, &pPage1, 0); + if( rc!=SQLITE_OK ) return rc; + + + /* Do some checking to help insure the file we opened really is + ** a valid database file. + */ + rc = SQLITE_NOTADB; + if( sqlite3PagerPagecount(pBt->pPager)>0 ){ + u8 *page1 = pPage1->aData; + if( memcmp(page1, zMagicHeader, 16)!=0 ){ + goto page1_init_failed; + } + if( page1[18]>1 ){ + pBt->readOnly = 1; + } + if( page1[19]>1 ){ + goto page1_init_failed; + } + pageSize = get2byte(&page1[16]); + if( ((pageSize-1)&pageSize)!=0 || pageSize<512 || + (SQLITE_MAX_PAGE_SIZE<32768 && pageSize>SQLITE_MAX_PAGE_SIZE) + ){ + goto page1_init_failed; + } + assert( (pageSize & 7)==0 ); + pBt->pageSize = pageSize; + pBt->usableSize = pageSize - page1[20]; + if( pBt->usableSize<500 ){ + goto page1_init_failed; + } + pBt->maxEmbedFrac = page1[21]; + pBt->minEmbedFrac = page1[22]; + pBt->minLeafFrac = page1[23]; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0); +#endif + } + + /* maxLocal is the maximum amount of payload to store locally for + ** a cell. Make sure it is small enough so that at least minFanout + ** cells can will fit on one page. We assume a 10-byte page header. + ** Besides the payload, the cell must store: + ** 2-byte pointer to the cell + ** 4-byte child pointer + ** 9-byte nKey value + ** 4-byte nData value + ** 4-byte overflow page pointer + ** So a cell consists of a 2-byte poiner, a header which is as much as + ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow + ** page pointer. + */ + pBt->maxLocal = (pBt->usableSize-12)*pBt->maxEmbedFrac/255 - 23; + pBt->minLocal = (pBt->usableSize-12)*pBt->minEmbedFrac/255 - 23; + pBt->maxLeaf = pBt->usableSize - 35; + pBt->minLeaf = (pBt->usableSize-12)*pBt->minLeafFrac/255 - 23; + if( pBt->minLocal>pBt->maxLocal || pBt->maxLocal<0 ){ + goto page1_init_failed; + } + assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); + pBt->pPage1 = pPage1; + return SQLITE_OK; + +page1_init_failed: + releasePage(pPage1); + pBt->pPage1 = 0; + return rc; +} + +/* +** This routine works like lockBtree() except that it also invokes the +** busy callback if there is lock contention. +*/ +static int lockBtreeWithRetry(Btree *pRef){ + int rc = SQLITE_OK; + + assert( sqlite3BtreeHoldsMutex(pRef) ); + if( pRef->inTrans==TRANS_NONE ){ + u8 inTransaction = pRef->pBt->inTransaction; + btreeIntegrity(pRef); + rc = sqlite3BtreeBeginTrans(pRef, 0); + pRef->pBt->inTransaction = inTransaction; + pRef->inTrans = TRANS_NONE; + if( rc==SQLITE_OK ){ + pRef->pBt->nTransaction--; + } + btreeIntegrity(pRef); + } + return rc; +} + + +/* +** If there are no outstanding cursors and we are not in the middle +** of a transaction but there is a read lock on the database, then +** this routine unrefs the first page of the database file which +** has the effect of releasing the read lock. +** +** If there are any outstanding cursors, this routine is a no-op. +** +** If there is a transaction in progress, this routine is a no-op. +*/ +static void unlockBtreeIfUnused(BtShared *pBt){ + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->inTransaction==TRANS_NONE && pBt->pCursor==0 && pBt->pPage1!=0 ){ + if( sqlite3PagerRefcount(pBt->pPager)>=1 ){ + if( pBt->pPage1->aData==0 ){ + MemPage *pPage = pBt->pPage1; + pPage->aData = sqlite3PagerGetData(pPage->pDbPage); + pPage->pBt = pBt; + pPage->pgno = 1; + } + releasePage(pBt->pPage1); + } + pBt->pPage1 = 0; + pBt->inStmt = 0; + } +} + +/* +** Create a new database by initializing the first page of the +** file. +*/ +static int newDatabase(BtShared *pBt){ + MemPage *pP1; + unsigned char *data; + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( sqlite3PagerPagecount(pBt->pPager)>0 ) return SQLITE_OK; + pP1 = pBt->pPage1; + assert( pP1!=0 ); + data = pP1->aData; + rc = sqlite3PagerWrite(pP1->pDbPage); + if( rc ) return rc; + memcpy(data, zMagicHeader, sizeof(zMagicHeader)); + assert( sizeof(zMagicHeader)==16 ); + put2byte(&data[16], pBt->pageSize); + data[18] = 1; + data[19] = 1; + data[20] = pBt->pageSize - pBt->usableSize; + data[21] = pBt->maxEmbedFrac; + data[22] = pBt->minEmbedFrac; + data[23] = pBt->minLeafFrac; + memset(&data[24], 0, 100-24); + zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); + pBt->pageSizeFixed = 1; +#ifndef SQLITE_OMIT_AUTOVACUUM + assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); + assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); + put4byte(&data[36 + 4*4], pBt->autoVacuum); + put4byte(&data[36 + 7*4], pBt->incrVacuum); +#endif + return SQLITE_OK; +} + +/* +** Attempt to start a new transaction. A write-transaction +** is started if the second argument is nonzero, otherwise a read- +** transaction. If the second argument is 2 or more and exclusive +** transaction is started, meaning that no other process is allowed +** to access the database. A preexisting transaction may not be +** upgraded to exclusive by calling this routine a second time - the +** exclusivity flag only works for a new transaction. +** +** A write-transaction must be started before attempting any +** changes to the database. None of the following routines +** will work unless a transaction is started first: +** +** sqlite3BtreeCreateTable() +** sqlite3BtreeCreateIndex() +** sqlite3BtreeClearTable() +** sqlite3BtreeDropTable() +** sqlite3BtreeInsert() +** sqlite3BtreeDelete() +** sqlite3BtreeUpdateMeta() +** +** If an initial attempt to acquire the lock fails because of lock contention +** and the database was previously unlocked, then invoke the busy handler +** if there is one. But if there was previously a read-lock, do not +** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is +** returned when there is already a read-lock in order to avoid a deadlock. +** +** Suppose there are two processes A and B. A has a read lock and B has +** a reserved lock. B tries to promote to exclusive but is blocked because +** of A's read lock. A tries to promote to reserved but is blocked by B. +** One or the other of the two processes must give way or there can be +** no progress. By returning SQLITE_BUSY and not invoking the busy callback +** when A already has a read lock, we encourage A to give up and let B +** proceed. +*/ +int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the btree is already in a write-transaction, or it + ** is already in a read-transaction and a read-transaction + ** is requested, this is a no-op. + */ + if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ + goto trans_begun; + } + + /* Write transactions are not possible on a read-only database */ + if( pBt->readOnly && wrflag ){ + rc = SQLITE_READONLY; + goto trans_begun; + } + + /* If another database handle has already opened a write transaction + ** on this shared-btree structure and a second write transaction is + ** requested, return SQLITE_BUSY. + */ + if( pBt->inTransaction==TRANS_WRITE && wrflag ){ + rc = SQLITE_BUSY; + goto trans_begun; + } + + do { + if( pBt->pPage1==0 ){ + rc = lockBtree(pBt); + } + + if( rc==SQLITE_OK && wrflag ){ + if( pBt->readOnly ){ + rc = SQLITE_READONLY; + }else{ + rc = sqlite3PagerBegin(pBt->pPage1->pDbPage, wrflag>1); + if( rc==SQLITE_OK ){ + rc = newDatabase(pBt); + } + } + } + + if( rc==SQLITE_OK ){ + if( wrflag ) pBt->inStmt = 0; + }else{ + unlockBtreeIfUnused(pBt); + } + }while( rc==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && + sqlite3InvokeBusyHandler(pBt->pBusyHandler) ); + + if( rc==SQLITE_OK ){ + if( p->inTrans==TRANS_NONE ){ + pBt->nTransaction++; + } + p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ); + if( p->inTrans>pBt->inTransaction ){ + pBt->inTransaction = p->inTrans; + } + } + + +trans_begun: + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM + +/* +** Set the pointer-map entries for all children of page pPage. Also, if +** pPage contains cells that point to overflow pages, set the pointer +** map entries for the overflow pages as well. +*/ +static int setChildPtrmaps(MemPage *pPage){ + int i; /* Counter variable */ + int nCell; /* Number of cells in page pPage */ + int rc; /* Return code */ + BtShared *pBt = pPage->pBt; + int isInitOrig = pPage->isInit; + Pgno pgno = pPage->pgno; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + rc = sqlite3BtreeInitPage(pPage, pPage->pParent); + if( rc!=SQLITE_OK ){ + goto set_child_ptrmaps_out; + } + nCell = pPage->nCell; + + for(i=0; ileaf ){ + Pgno childPgno = get4byte(pCell); + rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno); + if( rc!=SQLITE_OK ) goto set_child_ptrmaps_out; + } + } + + if( !pPage->leaf ){ + Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno); + } + +set_child_ptrmaps_out: + pPage->isInit = isInitOrig; + return rc; +} + +/* +** Somewhere on pPage, which is guarenteed to be a btree page, not an overflow +** page, is a pointer to page iFrom. Modify this pointer so that it points to +** iTo. Parameter eType describes the type of pointer to be modified, as +** follows: +** +** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child +** page of pPage. +** +** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow +** page pointed to by one of the cells on pPage. +** +** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next +** overflow page in the list. +*/ +static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( eType==PTRMAP_OVERFLOW2 ){ + /* The pointer is always the first 4 bytes of the page in this case. */ + if( get4byte(pPage->aData)!=iFrom ){ + return SQLITE_CORRUPT_BKPT; + } + put4byte(pPage->aData, iTo); + }else{ + int isInitOrig = pPage->isInit; + int i; + int nCell; + + sqlite3BtreeInitPage(pPage, 0); + nCell = pPage->nCell; + + for(i=0; iaData[pPage->hdrOffset+8])!=iFrom ){ + return SQLITE_CORRUPT_BKPT; + } + put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); + } + + pPage->isInit = isInitOrig; + } + return SQLITE_OK; +} + + +/* +** Move the open database page pDbPage to location iFreePage in the +** database. The pDbPage reference remains valid. +*/ +static int relocatePage( + BtShared *pBt, /* Btree */ + MemPage *pDbPage, /* Open page to move */ + u8 eType, /* Pointer map 'type' entry for pDbPage */ + Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */ + Pgno iFreePage /* The location to move pDbPage to */ +){ + MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */ + Pgno iDbPage = pDbPage->pgno; + Pager *pPager = pBt->pPager; + int rc; + + assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pDbPage->pBt==pBt ); + + /* Move page iDbPage from it's current location to page number iFreePage */ + TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + iDbPage, iFreePage, iPtrPage, eType)); + rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage); + if( rc!=SQLITE_OK ){ + return rc; + } + pDbPage->pgno = iFreePage; + + /* If pDbPage was a btree-page, then it may have child pages and/or cells + ** that point to overflow pages. The pointer map entries for all these + ** pages need to be changed. + ** + ** If pDbPage is an overflow page, then the first 4 bytes may store a + ** pointer to a subsequent overflow page. If this is the case, then + ** the pointer map needs to be updated for the subsequent overflow page. + */ + if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){ + rc = setChildPtrmaps(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + Pgno nextOvfl = get4byte(pDbPage->aData); + if( nextOvfl!=0 ){ + rc = ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } + + /* Fix the database pointer on page iPtrPage that pointed at iDbPage so + ** that it points at iFreePage. Also fix the pointer map entry for + ** iPtrPage. + */ + if( eType!=PTRMAP_ROOTPAGE ){ + rc = sqlite3BtreeGetPage(pBt, iPtrPage, &pPtrPage, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pPtrPage->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pPtrPage); + return rc; + } + rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); + releasePage(pPtrPage); + if( rc==SQLITE_OK ){ + rc = ptrmapPut(pBt, iFreePage, eType, iPtrPage); + } + } + return rc; +} + +/* Forward declaration required by incrVacuumStep(). */ +static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); + +/* +** Perform a single step of an incremental-vacuum. If successful, +** return SQLITE_OK. If there is no work to do (and therefore no +** point in calling this function again), return SQLITE_DONE. +** +** More specificly, this function attempts to re-organize the +** database so that the last page of the file currently in use +** is no longer in use. +** +** If the nFin parameter is non-zero, the implementation assumes +** that the caller will keep calling incrVacuumStep() until +** it returns SQLITE_DONE or an error, and that nFin is the +** number of pages the database file will contain after this +** process is complete. +*/ +static int incrVacuumStep(BtShared *pBt, Pgno nFin){ + Pgno iLastPg; /* Last page in the database */ + Pgno nFreeList; /* Number of pages still on the free-list */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + iLastPg = pBt->nTrunc; + if( iLastPg==0 ){ + iLastPg = sqlite3PagerPagecount(pBt->pPager); + } + + if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ + int rc; + u8 eType; + Pgno iPtrPage; + + nFreeList = get4byte(&pBt->pPage1->aData[36]); + if( nFreeList==0 || nFin==iLastPg ){ + return SQLITE_DONE; + } + + rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); + if( rc!=SQLITE_OK ){ + return rc; + } + if( eType==PTRMAP_ROOTPAGE ){ + return SQLITE_CORRUPT_BKPT; + } + + if( eType==PTRMAP_FREEPAGE ){ + if( nFin==0 ){ + /* Remove the page from the files free-list. This is not required + ** if nFin is non-zero. In that case, the free-list will be + ** truncated to zero after this function returns, so it doesn't + ** matter if it still contains some garbage entries. + */ + Pgno iFreePg; + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, 1); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( iFreePg==iLastPg ); + releasePage(pFreePg); + } + } else { + Pgno iFreePg; /* Index of free page to move pLastPg to */ + MemPage *pLastPg; + + rc = sqlite3BtreeGetPage(pBt, iLastPg, &pLastPg, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If nFin is zero, this loop runs exactly once and page pLastPg + ** is swapped with the first free page pulled off the free list. + ** + ** On the other hand, if nFin is greater than zero, then keep + ** looping until a free-page located within the first nFin pages + ** of the file is found. + */ + do { + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, 0, 0); + if( rc!=SQLITE_OK ){ + releasePage(pLastPg); + return rc; + } + releasePage(pFreePg); + }while( nFin!=0 && iFreePg>nFin ); + assert( iFreePgpDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg); + releasePage(pLastPg); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } + + pBt->nTrunc = iLastPg - 1; + while( pBt->nTrunc==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, pBt->nTrunc) ){ + pBt->nTrunc--; + } + return SQLITE_OK; +} + +/* +** A write-transaction must be opened before calling this function. +** It performs a single unit of work towards an incremental vacuum. +** +** If the incremental vacuum is finished after this function has run, +** SQLITE_DONE is returned. If it is not finished, but no error occured, +** SQLITE_OK is returned. Otherwise an SQLite error code. +*/ +int sqlite3BtreeIncrVacuum(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); + if( !pBt->autoVacuum ){ + rc = SQLITE_DONE; + }else{ + invalidateAllOverflowCache(pBt); + rc = incrVacuumStep(pBt, 0); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine is called prior to sqlite3PagerCommit when a transaction +** is commited for an auto-vacuum database. +** +** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages +** the database file should be truncated to during the commit process. +** i.e. the database has been reorganized so that only the first *pnTrunc +** pages are in use. +*/ +static int autoVacuumCommit(BtShared *pBt, Pgno *pnTrunc){ + int rc = SQLITE_OK; + Pager *pPager = pBt->pPager; +#ifndef NDEBUG + int nRef = sqlite3PagerRefcount(pPager); +#endif + + assert( sqlite3_mutex_held(pBt->mutex) ); + invalidateAllOverflowCache(pBt); + assert(pBt->autoVacuum); + if( !pBt->incrVacuum ){ + Pgno nFin = 0; + + if( pBt->nTrunc==0 ){ + Pgno nFree; + Pgno nPtrmap; + const int pgsz = pBt->pageSize; + Pgno nOrig = sqlite3PagerPagecount(pBt->pPager); + + if( PTRMAP_ISPAGE(pBt, nOrig) ){ + return SQLITE_CORRUPT_BKPT; + } + if( nOrig==PENDING_BYTE_PAGE(pBt) ){ + nOrig--; + } + nFree = get4byte(&pBt->pPage1->aData[36]); + nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+pgsz/5)/(pgsz/5); + nFin = nOrig - nFree - nPtrmap; + if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){ + nFin--; + } + while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){ + nFin--; + } + } + + while( rc==SQLITE_OK ){ + rc = incrVacuumStep(pBt, nFin); + } + if( rc==SQLITE_DONE ){ + assert(nFin==0 || pBt->nTrunc==0 || nFin<=pBt->nTrunc); + rc = SQLITE_OK; + if( pBt->nTrunc ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[32], 0); + put4byte(&pBt->pPage1->aData[36], 0); + pBt->nTrunc = nFin; + } + } + if( rc!=SQLITE_OK ){ + sqlite3PagerRollback(pPager); + } + } + + if( rc==SQLITE_OK ){ + *pnTrunc = pBt->nTrunc; + pBt->nTrunc = 0; + } + assert( nRef==sqlite3PagerRefcount(pPager) ); + return rc; +} + +#endif + +/* +** This routine does the first phase of a two-phase commit. This routine +** causes a rollback journal to be created (if it does not already exist) +** and populated with enough information so that if a power loss occurs +** the database can be restored to its original state by playing back +** the journal. Then the contents of the journal are flushed out to +** the disk. After the journal is safely on oxide, the changes to the +** database are written into the database file and flushed to oxide. +** At the end of this call, the rollback journal still exists on the +** disk and we are still holding all locks, so the transaction has not +** committed. See sqlite3BtreeCommit() for the second phase of the +** commit process. +** +** This call is a no-op if no write-transaction is currently active on pBt. +** +** Otherwise, sync the database file for the btree pBt. zMaster points to +** the name of a master journal file that should be written into the +** individual journal file, or is NULL, indicating no master journal file +** (single database transaction). +** +** When this is called, the master journal should already have been +** created, populated with this journal pointer and synced to disk. +** +** Once this is routine has returned, the only thing required to commit +** the write-transaction for this database file is to delete the journal. +*/ +int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ + int rc = SQLITE_OK; + if( p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + Pgno nTrunc = 0; + sqlite3BtreeEnter(p); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + rc = autoVacuumCommit(pBt, &nTrunc); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + } +#endif + rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, nTrunc); + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** Commit the transaction currently in progress. +** +** This routine implements the second phase of a 2-phase commit. The +** sqlite3BtreeSync() routine does the first phase and should be invoked +** prior to calling this routine. The sqlite3BtreeSync() routine did +** all the work of writing information out to disk and flushing the +** contents so that they are written onto the disk platter. All this +** routine has to do is delete or truncate the rollback journal +** (which causes the transaction to commit) and drop locks. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +int sqlite3BtreeCommitPhaseTwo(Btree *p){ + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the handle has a write-transaction open, commit the shared-btrees + ** transaction and set the shared state to TRANS_READ. + */ + if( p->inTrans==TRANS_WRITE ){ + int rc; + assert( pBt->inTransaction==TRANS_WRITE ); + assert( pBt->nTransaction>0 ); + rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + pBt->inTransaction = TRANS_READ; + pBt->inStmt = 0; + } + unlockAllTables(p); + + /* If the handle has any kind of transaction open, decrement the transaction + ** count of the shared btree. If the transaction count reaches 0, set + ** the shared state to TRANS_NONE. The unlockBtreeIfUnused() call below + ** will unlock the pager. + */ + if( p->inTrans!=TRANS_NONE ){ + pBt->nTransaction--; + if( 0==pBt->nTransaction ){ + pBt->inTransaction = TRANS_NONE; + } + } + + /* Set the handles current transaction state to TRANS_NONE and unlock + ** the pager if this call closed the only read or write transaction. + */ + p->inTrans = TRANS_NONE; + unlockBtreeIfUnused(pBt); + + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Do both phases of a commit. +*/ +int sqlite3BtreeCommit(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + rc = sqlite3BtreeCommitPhaseOne(p, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeCommitPhaseTwo(p); + } + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef NDEBUG +/* +** Return the number of write-cursors open on this handle. This is for use +** in assert() expressions, so it is only compiled if NDEBUG is not +** defined. +** +** For the purposes of this routine, a write-cursor is any cursor that +** is capable of writing to the databse. That means the cursor was +** originally opened for writing and the cursor has not be disabled +** by having its state changed to CURSOR_FAULT. +*/ +static int countWriteCursors(BtShared *pBt){ + BtCursor *pCur; + int r = 0; + for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ + if( pCur->wrFlag && pCur->eState!=CURSOR_FAULT ) r++; + } + return r; +} +#endif + +/* +** This routine sets the state to CURSOR_FAULT and the error +** code to errCode for every cursor on BtShared that pBtree +** references. +** +** Every cursor is tripped, including cursors that belong +** to other database connections that happen to be sharing +** the cache with pBtree. +** +** This routine gets called when a rollback occurs. +** All cursors using the same cache must be tripped +** to prevent them from trying to use the btree after +** the rollback. The rollback may have deleted tables +** or moved root pages, so it is not sufficient to +** save the state of the cursor. The cursor must be +** invalidated. +*/ +void sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode){ + BtCursor *p; + sqlite3BtreeEnter(pBtree); + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + clearCursorPosition(p); + p->eState = CURSOR_FAULT; + p->skip = errCode; + } + sqlite3BtreeLeave(pBtree); +} + +/* +** Rollback the transaction in progress. All cursors will be +** invalided by this operation. Any attempt to use a cursor +** that was open at the beginning of this operation will result +** in an error. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +int sqlite3BtreeRollback(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + MemPage *pPage1; + + sqlite3BtreeEnter(p); + rc = saveAllCursors(pBt, 0, 0); +#ifndef SQLITE_OMIT_SHARED_CACHE + if( rc!=SQLITE_OK ){ + /* This is a horrible situation. An IO or malloc() error occured whilst + ** trying to save cursor positions. If this is an automatic rollback (as + ** the result of a constraint, malloc() failure or IO error) then + ** the cache may be internally inconsistent (not contain valid trees) so + ** we cannot simply return the error to the caller. Instead, abort + ** all queries that may be using any of the cursors that failed to save. + */ + sqlite3BtreeTripAllCursors(p, rc); + } +#endif + btreeIntegrity(p); + unlockAllTables(p); + + if( p->inTrans==TRANS_WRITE ){ + int rc2; + +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->nTrunc = 0; +#endif + + assert( TRANS_WRITE==pBt->inTransaction ); + rc2 = sqlite3PagerRollback(pBt->pPager); + if( rc2!=SQLITE_OK ){ + rc = rc2; + } + + /* The rollback may have destroyed the pPage1->aData value. So + ** call sqlite3BtreeGetPage() on page 1 again to make + ** sure pPage1->aData is set correctly. */ + if( sqlite3BtreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ + releasePage(pPage1); + } + assert( countWriteCursors(pBt)==0 ); + pBt->inTransaction = TRANS_READ; + } + + if( p->inTrans!=TRANS_NONE ){ + assert( pBt->nTransaction>0 ); + pBt->nTransaction--; + if( 0==pBt->nTransaction ){ + pBt->inTransaction = TRANS_NONE; + } + } + + p->inTrans = TRANS_NONE; + pBt->inStmt = 0; + unlockBtreeIfUnused(pBt); + + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Start a statement subtransaction. The subtransaction can +** can be rolled back independently of the main transaction. +** You must start a transaction before starting a subtransaction. +** The subtransaction is ended automatically if the main transaction +** commits or rolls back. +** +** Only one subtransaction may be active at a time. It is an error to try +** to start a new subtransaction if another subtransaction is already active. +** +** Statement subtransactions are used around individual SQL statements +** that are contained within a BEGIN...COMMIT block. If a constraint +** error occurs within the statement, the effect of that one statement +** can be rolled back without having to rollback the entire transaction. +*/ +int sqlite3BtreeBeginStmt(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( (p->inTrans!=TRANS_WRITE) || pBt->inStmt ){ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + }else{ + assert( pBt->inTransaction==TRANS_WRITE ); + rc = pBt->readOnly ? SQLITE_OK : sqlite3PagerStmtBegin(pBt->pPager); + pBt->inStmt = 1; + } + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** Commit the statment subtransaction currently in progress. If no +** subtransaction is active, this is a no-op. +*/ +int sqlite3BtreeCommitStmt(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->inStmt && !pBt->readOnly ){ + rc = sqlite3PagerStmtCommit(pBt->pPager); + }else{ + rc = SQLITE_OK; + } + pBt->inStmt = 0; + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Rollback the active statement subtransaction. If no subtransaction +** is active this routine is a no-op. +** +** All cursors will be invalidated by this operation. Any attempt +** to use a cursor that was open at the beginning of this operation +** will result in an error. +*/ +int sqlite3BtreeRollbackStmt(Btree *p){ + int rc = SQLITE_OK; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->inStmt && !pBt->readOnly ){ + rc = sqlite3PagerStmtRollback(pBt->pPager); + assert( countWriteCursors(pBt)==0 ); + pBt->inStmt = 0; + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Default key comparison function to be used if no comparison function +** is specified on the sqlite3BtreeCursor() call. +*/ +static int dfltCompare( + void *NotUsed, /* User data is not used */ + int n1, const void *p1, /* First key to compare */ + int n2, const void *p2 /* Second key to compare */ +){ + int c; + c = memcmp(p1, p2, n1pBt; + + assert( sqlite3BtreeHoldsMutex(p) ); + *ppCur = 0; + if( wrFlag ){ + if( pBt->readOnly ){ + return SQLITE_READONLY; + } + if( checkReadLocks(p, iTable, 0) ){ + return SQLITE_LOCKED; + } + } + + if( pBt->pPage1==0 ){ + rc = lockBtreeWithRetry(p); + if( rc!=SQLITE_OK ){ + return rc; + } + if( pBt->readOnly && wrFlag ){ + return SQLITE_READONLY; + } + } + pCur = sqlite3MallocZero( sizeof(*pCur) ); + if( pCur==0 ){ + rc = SQLITE_NOMEM; + goto create_cursor_exception; + } + pCur->pgnoRoot = (Pgno)iTable; + if( iTable==1 && sqlite3PagerPagecount(pBt->pPager)==0 ){ + rc = SQLITE_EMPTY; + goto create_cursor_exception; + } + rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->pPage, 0); + if( rc!=SQLITE_OK ){ + goto create_cursor_exception; + } + + /* Now that no other errors can occur, finish filling in the BtCursor + ** variables, link the cursor into the BtShared list and set *ppCur (the + ** output argument to this function). + */ + pCur->xCompare = xCmp ? xCmp : dfltCompare; + pCur->pArg = pArg; + pCur->pBtree = p; + pCur->pBt = pBt; + pCur->wrFlag = wrFlag; + pCur->pNext = pBt->pCursor; + if( pCur->pNext ){ + pCur->pNext->pPrev = pCur; + } + pBt->pCursor = pCur; + pCur->eState = CURSOR_INVALID; + *ppCur = pCur; + + return SQLITE_OK; + +create_cursor_exception: + if( pCur ){ + releasePage(pCur->pPage); + sqlite3_free(pCur); + } + unlockBtreeIfUnused(pBt); + return rc; +} +int sqlite3BtreeCursor( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + int (*xCmp)(void*,int,const void*,int,const void*), /* Key Comparison func */ + void *pArg, /* First arg to xCompare() */ + BtCursor **ppCur /* Write new cursor here */ +){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, xCmp, pArg, ppCur); + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** Close a cursor. The read lock on the database file is released +** when the last cursor is closed. +*/ +int sqlite3BtreeCloseCursor(BtCursor *pCur){ + BtShared *pBt = pCur->pBt; + Btree *pBtree = pCur->pBtree; + + sqlite3BtreeEnter(pBtree); + clearCursorPosition(pCur); + if( pCur->pPrev ){ + pCur->pPrev->pNext = pCur->pNext; + }else{ + pBt->pCursor = pCur->pNext; + } + if( pCur->pNext ){ + pCur->pNext->pPrev = pCur->pPrev; + } + releasePage(pCur->pPage); + unlockBtreeIfUnused(pBt); + invalidateOverflowCache(pCur); + sqlite3_free(pCur); + sqlite3BtreeLeave(pBtree); + return SQLITE_OK; +} + +/* +** Make a temporary cursor by filling in the fields of pTempCur. +** The temporary cursor is not on the cursor list for the Btree. +*/ +void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur){ + assert( cursorHoldsMutex(pCur) ); + memcpy(pTempCur, pCur, sizeof(*pCur)); + pTempCur->pNext = 0; + pTempCur->pPrev = 0; + if( pTempCur->pPage ){ + sqlite3PagerRef(pTempCur->pPage->pDbPage); + } +} + +/* +** Delete a temporary cursor such as was made by the CreateTemporaryCursor() +** function above. +*/ +void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + if( pCur->pPage ){ + sqlite3PagerUnref(pCur->pPage->pDbPage); + } +} + +/* +** Make sure the BtCursor* given in the argument has a valid +** BtCursor.info structure. If it is not already valid, call +** sqlite3BtreeParseCell() to fill it in. +** +** BtCursor.info is a cache of the information in the current cell. +** Using this cache reduces the number of calls to sqlite3BtreeParseCell(). +** +** 2007-06-25: There is a bug in some versions of MSVC that cause the +** compiler to crash when getCellInfo() is implemented as a macro. +** But there is a measureable speed advantage to using the macro on gcc +** (when less compiler optimizations like -Os or -O0 are used and the +** compiler is not doing agressive inlining.) So we use a real function +** for MSVC and a macro for everything else. Ticket #2457. +*/ +#ifndef NDEBUG + static void assertCellInfo(BtCursor *pCur){ + CellInfo info; + memset(&info, 0, sizeof(info)); + sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &info); + assert( memcmp(&info, &pCur->info, sizeof(info))==0 ); + } +#else + #define assertCellInfo(x) +#endif +#ifdef _MSC_VER + /* Use a real function in MSVC to work around bugs in that compiler. */ + static void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); + }else{ + assertCellInfo(pCur); + } + } +#else /* if not _MSC_VER */ + /* Use a macro in all other compilers so that the function is inlined */ +#define getCellInfo(pCur) \ + if( pCur->info.nSize==0 ){ \ + sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); \ + }else{ \ + assertCellInfo(pCur); \ + } +#endif /* _MSC_VER */ + +/* +** Set *pSize to the size of the buffer needed to hold the value of +** the key for the current entry. If the cursor is not pointing +** to a valid entry, *pSize is set to 0. +** +** For a table with the INTKEY flag set, this routine returns the key +** itself, not the number of bytes in the key. +*/ +int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID ); + if( pCur->eState==CURSOR_INVALID ){ + *pSize = 0; + }else{ + getCellInfo(pCur); + *pSize = pCur->info.nKey; + } + } + return rc; +} + +/* +** Set *pSize to the number of bytes of data in the entry the +** cursor currently points to. Always return SQLITE_OK. +** Failure is not possible. If the cursor is not currently +** pointing to an entry (which can happen, for example, if +** the database is empty) then *pSize is set to 0. +*/ +int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID ); + if( pCur->eState==CURSOR_INVALID ){ + /* Not pointing at a valid entry - set *pSize to 0. */ + *pSize = 0; + }else{ + getCellInfo(pCur); + *pSize = pCur->info.nData; + } + } + return rc; +} + +/* +** Given the page number of an overflow page in the database (parameter +** ovfl), this function finds the page number of the next page in the +** linked list of overflow pages. If possible, it uses the auto-vacuum +** pointer-map data instead of reading the content of page ovfl to do so. +** +** If an error occurs an SQLite error code is returned. Otherwise: +** +** Unless pPgnoNext is NULL, the page number of the next overflow +** page in the linked list is written to *pPgnoNext. If page ovfl +** is the last page in it's linked list, *pPgnoNext is set to zero. +** +** If ppPage is not NULL, *ppPage is set to the MemPage* handle +** for page ovfl. The underlying pager page may have been requested +** with the noContent flag set, so the page data accessable via +** this handle may not be trusted. +*/ +static int getOverflowPage( + BtShared *pBt, + Pgno ovfl, /* Overflow page */ + MemPage **ppPage, /* OUT: MemPage handle */ + Pgno *pPgnoNext /* OUT: Next overflow page number */ +){ + Pgno next = 0; + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + /* One of these must not be NULL. Otherwise, why call this function? */ + assert(ppPage || pPgnoNext); + + /* If pPgnoNext is NULL, then this function is being called to obtain + ** a MemPage* reference only. No page-data is required in this case. + */ + if( !pPgnoNext ){ + return sqlite3BtreeGetPage(pBt, ovfl, ppPage, 1); + } + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* Try to find the next page in the overflow list using the + ** autovacuum pointer-map pages. Guess that the next page in + ** the overflow list is page number (ovfl+1). If that guess turns + ** out to be wrong, fall back to loading the data of page + ** number ovfl to determine the next page number. + */ + if( pBt->autoVacuum ){ + Pgno pgno; + Pgno iGuess = ovfl+1; + u8 eType; + + while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ + iGuess++; + } + + if( iGuess<=sqlite3PagerPagecount(pBt->pPager) ){ + rc = ptrmapGet(pBt, iGuess, &eType, &pgno); + if( rc!=SQLITE_OK ){ + return rc; + } + if( eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ + next = iGuess; + } + } + } +#endif + + if( next==0 || ppPage ){ + MemPage *pPage = 0; + + rc = sqlite3BtreeGetPage(pBt, ovfl, &pPage, next!=0); + assert(rc==SQLITE_OK || pPage==0); + if( next==0 && rc==SQLITE_OK ){ + next = get4byte(pPage->aData); + } + + if( ppPage ){ + *ppPage = pPage; + }else{ + releasePage(pPage); + } + } + *pPgnoNext = next; + + return rc; +} + +/* +** Copy data from a buffer to a page, or from a page to a buffer. +** +** pPayload is a pointer to data stored on database page pDbPage. +** If argument eOp is false, then nByte bytes of data are copied +** from pPayload to the buffer pointed at by pBuf. If eOp is true, +** then sqlite3PagerWrite() is called on pDbPage and nByte bytes +** of data are copied from the buffer pBuf to pPayload. +** +** SQLITE_OK is returned on success, otherwise an error code. +*/ +static int copyPayload( + void *pPayload, /* Pointer to page data */ + void *pBuf, /* Pointer to buffer */ + int nByte, /* Number of bytes to copy */ + int eOp, /* 0 -> copy from page, 1 -> copy to page */ + DbPage *pDbPage /* Page containing pPayload */ +){ + if( eOp ){ + /* Copy data from buffer to page (a write operation) */ + int rc = sqlite3PagerWrite(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + memcpy(pPayload, pBuf, nByte); + }else{ + /* Copy data from page to buffer (a read operation) */ + memcpy(pBuf, pPayload, nByte); + } + return SQLITE_OK; +} + +/* +** This function is used to read or overwrite payload information +** for the entry that the pCur cursor is pointing to. If the eOp +** parameter is 0, this is a read operation (data copied into +** buffer pBuf). If it is non-zero, a write (data copied from +** buffer pBuf). +** +** A total of "amt" bytes are read or written beginning at "offset". +** Data is read to or from the buffer pBuf. +** +** This routine does not make a distinction between key and data. +** It just reads or writes bytes from the payload area. Data might +** appear on the main page or be scattered out on multiple overflow +** pages. +** +** If the BtCursor.isIncrblobHandle flag is set, and the current +** cursor entry uses one or more overflow pages, this function +** allocates space for and lazily popluates the overflow page-list +** cache array (BtCursor.aOverflow). Subsequent calls use this +** cache to make seeking to the supplied offset more efficient. +** +** Once an overflow page-list cache has been allocated, it may be +** invalidated if some other cursor writes to the same table, or if +** the cursor is moved to a different row. Additionally, in auto-vacuum +** mode, the following events may invalidate an overflow page-list cache. +** +** * An incremental vacuum, +** * A commit in auto_vacuum="full" mode, +** * Creating a table (may require moving an overflow page). +*/ +static int accessPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + int offset, /* Begin reading this far into payload */ + int amt, /* Read this many bytes */ + unsigned char *pBuf, /* Write the bytes into this buffer */ + int skipKey, /* offset begins at data if this is true */ + int eOp /* zero to read. non-zero to write. */ +){ + unsigned char *aPayload; + int rc = SQLITE_OK; + u32 nKey; + int iIdx = 0; + MemPage *pPage = pCur->pPage; /* Btree page of current cursor entry */ + BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ + + assert( pPage ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->idx>=0 && pCur->idxnCell ); + assert( offset>=0 ); + assert( cursorHoldsMutex(pCur) ); + + getCellInfo(pCur); + aPayload = pCur->info.pCell + pCur->info.nHeader; + nKey = (pPage->intKey ? 0 : pCur->info.nKey); + + if( skipKey ){ + offset += nKey; + } + if( offset+amt > nKey+pCur->info.nData ){ + /* Trying to read or write past the end of the data is an error */ + return SQLITE_ERROR; + } + + /* Check if data must be read/written to/from the btree page itself. */ + if( offsetinfo.nLocal ){ + int a = amt; + if( a+offset>pCur->info.nLocal ){ + a = pCur->info.nLocal - offset; + } + rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); + offset = 0; + pBuf += a; + amt -= a; + }else{ + offset -= pCur->info.nLocal; + } + + if( rc==SQLITE_OK && amt>0 ){ + const int ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ + Pgno nextPage; + + nextPage = get4byte(&aPayload[pCur->info.nLocal]); + +#ifndef SQLITE_OMIT_INCRBLOB + /* If the isIncrblobHandle flag is set and the BtCursor.aOverflow[] + ** has not been allocated, allocate it now. The array is sized at + ** one entry for each overflow page in the overflow chain. The + ** page number of the first overflow page is stored in aOverflow[0], + ** etc. A value of 0 in the aOverflow[] array means "not yet known" + ** (the cache is lazily populated). + */ + if( pCur->isIncrblobHandle && !pCur->aOverflow ){ + int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; + pCur->aOverflow = (Pgno *)sqlite3MallocZero(sizeof(Pgno)*nOvfl); + if( nOvfl && !pCur->aOverflow ){ + rc = SQLITE_NOMEM; + } + } + + /* If the overflow page-list cache has been allocated and the + ** entry for the first required overflow page is valid, skip + ** directly to it. + */ + if( pCur->aOverflow && pCur->aOverflow[offset/ovflSize] ){ + iIdx = (offset/ovflSize); + nextPage = pCur->aOverflow[iIdx]; + offset = (offset%ovflSize); + } +#endif + + for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){ + +#ifndef SQLITE_OMIT_INCRBLOB + /* If required, populate the overflow page-list cache. */ + if( pCur->aOverflow ){ + assert(!pCur->aOverflow[iIdx] || pCur->aOverflow[iIdx]==nextPage); + pCur->aOverflow[iIdx] = nextPage; + } +#endif + + if( offset>=ovflSize ){ + /* The only reason to read this page is to obtain the page + ** number for the next page in the overflow chain. The page + ** data is not required. So first try to lookup the overflow + ** page-list cache, if any, then fall back to the getOverflowPage() + ** function. + */ +#ifndef SQLITE_OMIT_INCRBLOB + if( pCur->aOverflow && pCur->aOverflow[iIdx+1] ){ + nextPage = pCur->aOverflow[iIdx+1]; + } else +#endif + rc = getOverflowPage(pBt, nextPage, 0, &nextPage); + offset -= ovflSize; + }else{ + /* Need to read this page properly. It contains some of the + ** range of data that is being read (eOp==0) or written (eOp!=0). + */ + DbPage *pDbPage; + int a = amt; + rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage); + if( rc==SQLITE_OK ){ + aPayload = sqlite3PagerGetData(pDbPage); + nextPage = get4byte(aPayload); + if( a + offset > ovflSize ){ + a = ovflSize - offset; + } + rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); + sqlite3PagerUnref(pDbPage); + offset = 0; + amt -= a; + pBuf += a; + } + } + } + } + + if( rc==SQLITE_OK && amt>0 ){ + return SQLITE_CORRUPT_BKPT; + } + return rc; +} + +/* +** Read part of the key associated with cursor pCur. Exactly +** "amt" bytes will be transfered into pBuf[]. The transfer +** begins at "offset". +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage!=0 ); + if( pCur->pPage->intKey ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pCur->pPage->intKey==0 ); + assert( pCur->idx>=0 && pCur->idxpPage->nCell ); + rc = accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0, 0); + } + return rc; +} + +/* +** Read part of the data associated with cursor pCur. Exactly +** "amt" bytes will be transfered into pBuf[]. The transfer +** begins at "offset". +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage!=0 ); + assert( pCur->idx>=0 && pCur->idxpPage->nCell ); + rc = accessPayload(pCur, offset, amt, pBuf, 1, 0); + } + return rc; +} + +/* +** Return a pointer to payload information from the entry that the +** pCur cursor is pointing to. The pointer is to the beginning of +** the key if skipKey==0 and it points to the beginning of data if +** skipKey==1. The number of bytes of available key/data is written +** into *pAmt. If *pAmt==0, then the value returned will not be +** a valid pointer. +** +** This routine is an optimization. It is common for the entire key +** and data to fit on the local page and for there to be no overflow +** pages. When that is so, this routine can be used to access the +** key and data without making a copy. If the key and/or data spills +** onto overflow pages, then accessPayload() must be used to reassembly +** the key/data and copy it into a preallocated buffer. +** +** The pointer returned by this routine looks directly into the cached +** page of the database. The data might change or move the next time +** any btree routine is called. +*/ +static const unsigned char *fetchPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + int *pAmt, /* Write the number of available bytes here */ + int skipKey /* read beginning at data if this is true */ +){ + unsigned char *aPayload; + MemPage *pPage; + u32 nKey; + int nLocal; + + assert( pCur!=0 && pCur->pPage!=0 ); + assert( pCur->eState==CURSOR_VALID ); + assert( cursorHoldsMutex(pCur) ); + pPage = pCur->pPage; + assert( pCur->idx>=0 && pCur->idxnCell ); + getCellInfo(pCur); + aPayload = pCur->info.pCell; + aPayload += pCur->info.nHeader; + if( pPage->intKey ){ + nKey = 0; + }else{ + nKey = pCur->info.nKey; + } + if( skipKey ){ + aPayload += nKey; + nLocal = pCur->info.nLocal - nKey; + }else{ + nLocal = pCur->info.nLocal; + if( nLocal>nKey ){ + nLocal = nKey; + } + } + *pAmt = nLocal; + return aPayload; +} + + +/* +** For the entry that cursor pCur is point to, return as +** many bytes of the key or data as are available on the local +** b-tree page. Write the number of available bytes into *pAmt. +** +** The pointer returned is ephemeral. The key/data may move +** or be destroyed on the next call to any Btree routine, +** including calls from other threads against the same cache. +** Hence, a mutex on the BtShared should be held prior to calling +** this routine. +** +** These routines is used to get quick access to key and data +** in the common case where no overflow pages are used. +*/ +const void *sqlite3BtreeKeyFetch(BtCursor *pCur, int *pAmt){ + assert( cursorHoldsMutex(pCur) ); + if( pCur->eState==CURSOR_VALID ){ + return (const void*)fetchPayload(pCur, pAmt, 0); + } + return 0; +} +const void *sqlite3BtreeDataFetch(BtCursor *pCur, int *pAmt){ + assert( cursorHoldsMutex(pCur) ); + if( pCur->eState==CURSOR_VALID ){ + return (const void*)fetchPayload(pCur, pAmt, 1); + } + return 0; +} + + +/* +** Move the cursor down to a new child page. The newPgno argument is the +** page number of the child page to move to. +*/ +static int moveToChild(BtCursor *pCur, u32 newPgno){ + int rc; + MemPage *pNewPage; + MemPage *pOldPage; + BtShared *pBt = pCur->pBt; + + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + rc = getAndInitPage(pBt, newPgno, &pNewPage, pCur->pPage); + if( rc ) return rc; + pNewPage->idxParent = pCur->idx; + pOldPage = pCur->pPage; + pOldPage->idxShift = 0; + releasePage(pOldPage); + pCur->pPage = pNewPage; + pCur->idx = 0; + pCur->info.nSize = 0; + if( pNewPage->nCell<1 ){ + return SQLITE_CORRUPT_BKPT; + } + return SQLITE_OK; +} + +/* +** Return true if the page is the virtual root of its table. +** +** The virtual root page is the root page for most tables. But +** for the table rooted on page 1, sometime the real root page +** is empty except for the right-pointer. In such cases the +** virtual root page is the page that the right-pointer of page +** 1 is pointing to. +*/ +int sqlite3BtreeIsRootPage(MemPage *pPage){ + MemPage *pParent; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pParent = pPage->pParent; + if( pParent==0 ) return 1; + if( pParent->pgno>1 ) return 0; + if( get2byte(&pParent->aData[pParent->hdrOffset+3])==0 ) return 1; + return 0; +} + +/* +** Move the cursor up to the parent page. +** +** pCur->idx is set to the cell index that contains the pointer +** to the page we are coming from. If we are coming from the +** right-most child page then pCur->idx is set to one more than +** the largest cell index. +*/ +void sqlite3BtreeMoveToParent(BtCursor *pCur){ + MemPage *pParent; + MemPage *pPage; + int idxParent; + + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + pPage = pCur->pPage; + assert( pPage!=0 ); + assert( !sqlite3BtreeIsRootPage(pPage) ); + pParent = pPage->pParent; + assert( pParent!=0 ); + idxParent = pPage->idxParent; + sqlite3PagerRef(pParent->pDbPage); + releasePage(pPage); + pCur->pPage = pParent; + pCur->info.nSize = 0; + assert( pParent->idxShift==0 ); + pCur->idx = idxParent; +} + +/* +** Move the cursor to the root page +*/ +static int moveToRoot(BtCursor *pCur){ + MemPage *pRoot; + int rc = SQLITE_OK; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + + assert( cursorHoldsMutex(pCur) ); + assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skip; + } + clearCursorPosition(pCur); + } + pRoot = pCur->pPage; + if( pRoot && pRoot->pgno==pCur->pgnoRoot ){ + assert( pRoot->isInit ); + }else{ + if( + SQLITE_OK!=(rc = getAndInitPage(pBt, pCur->pgnoRoot, &pRoot, 0)) + ){ + pCur->eState = CURSOR_INVALID; + return rc; + } + releasePage(pCur->pPage); + pCur->pPage = pRoot; + } + pCur->idx = 0; + pCur->info.nSize = 0; + if( pRoot->nCell==0 && !pRoot->leaf ){ + Pgno subpage; + assert( pRoot->pgno==1 ); + subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); + assert( subpage>0 ); + pCur->eState = CURSOR_VALID; + rc = moveToChild(pCur, subpage); + } + pCur->eState = ((pCur->pPage->nCell>0)?CURSOR_VALID:CURSOR_INVALID); + return rc; +} + +/* +** Move the cursor down to the left-most leaf entry beneath the +** entry to which it is currently pointing. +** +** The left-most leaf is the one with the smallest key - the first +** in ascending order. +*/ +static int moveToLeftmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage; + + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ + assert( pCur->idx>=0 && pCur->idxnCell ); + pgno = get4byte(findCell(pPage, pCur->idx)); + rc = moveToChild(pCur, pgno); + } + return rc; +} + +/* +** Move the cursor down to the right-most leaf entry beneath the +** page to which it is currently pointing. Notice the difference +** between moveToLeftmost() and moveToRightmost(). moveToLeftmost() +** finds the left-most entry beneath the *entry* whereas moveToRightmost() +** finds the right-most entry beneath the *page*. +** +** The right-most entry is the one with the largest key - the last +** key in ascending order. +*/ +static int moveToRightmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage; + + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ + pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + pCur->idx = pPage->nCell; + rc = moveToChild(pCur, pgno); + } + if( rc==SQLITE_OK ){ + pCur->idx = pPage->nCell - 1; + pCur->info.nSize = 0; + } + return SQLITE_OK; +} + +/* Move the cursor to the first entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + if( pCur->eState==CURSOR_INVALID ){ + assert( pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; + }else{ + assert( pCur->pPage->nCell>0 ); + *pRes = 0; + rc = moveToLeftmost(pCur); + } + } + return rc; +} + +/* Move the cursor to the last entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + if( CURSOR_INVALID==pCur->eState ){ + assert( pCur->pPage->nCell==0 ); + *pRes = 1; + }else{ + assert( pCur->eState==CURSOR_VALID ); + *pRes = 0; + rc = moveToRightmost(pCur); + } + } + return rc; +} + +/* Move the cursor so that it points to an entry near pKey/nKey. +** Return a success code. +** +** For INTKEY tables, only the nKey parameter is used. pKey is +** ignored. For other tables, nKey is the number of bytes of data +** in pKey. The comparison function specified when the cursor was +** created is used to compare keys. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** The result of comparing the key with the entry to which the +** cursor is written to *pRes if pRes!=NULL. The meaning of +** this value is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than pKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches pKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than pKey. +** +*/ +int sqlite3BtreeMoveto( + BtCursor *pCur, /* The cursor to be moved */ + const void *pKey, /* The key content for indices. Not used by tables */ + i64 nKey, /* Size of pKey. Or the key for tables */ + int biasRight, /* If true, bias the search to the high end */ + int *pRes /* Search result flag */ +){ + int rc; + + assert( cursorHoldsMutex(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); + rc = moveToRoot(pCur); + if( rc ){ + return rc; + } + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + if( pCur->eState==CURSOR_INVALID ){ + *pRes = -1; + assert( pCur->pPage->nCell==0 ); + return SQLITE_OK; + } + for(;;){ + int lwr, upr; + Pgno chldPg; + MemPage *pPage = pCur->pPage; + int c = -1; /* pRes return if table is empty must be -1 */ + lwr = 0; + upr = pPage->nCell-1; + if( !pPage->intKey && pKey==0 ){ + return SQLITE_CORRUPT_BKPT; + } + if( biasRight ){ + pCur->idx = upr; + }else{ + pCur->idx = (upr+lwr)/2; + } + if( lwr<=upr ) for(;;){ + void *pCellKey; + i64 nCellKey; + pCur->info.nSize = 0; + if( pPage->intKey ){ + u8 *pCell; + pCell = findCell(pPage, pCur->idx) + pPage->childPtrSize; + if( pPage->hasData ){ + u32 dummy; + pCell += getVarint32(pCell, &dummy); + } + getVarint(pCell, (u64 *)&nCellKey); + if( nCellKeynKey ){ + c = +1; + }else{ + c = 0; + } + }else{ + int available; + pCellKey = (void *)fetchPayload(pCur, &available, 0); + nCellKey = pCur->info.nKey; + if( available>=nCellKey ){ + c = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey); + }else{ + pCellKey = sqlite3_malloc( nCellKey ); + if( pCellKey==0 ) return SQLITE_NOMEM; + rc = sqlite3BtreeKey(pCur, 0, nCellKey, (void *)pCellKey); + c = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey); + sqlite3_free(pCellKey); + if( rc ){ + return rc; + } + } + } + if( c==0 ){ + if( pPage->leafData && !pPage->leaf ){ + lwr = pCur->idx; + upr = lwr - 1; + break; + }else{ + if( pRes ) *pRes = 0; + return SQLITE_OK; + } + } + if( c<0 ){ + lwr = pCur->idx+1; + }else{ + upr = pCur->idx-1; + } + if( lwr>upr ){ + break; + } + pCur->idx = (lwr+upr)/2; + } + assert( lwr==upr+1 ); + assert( pPage->isInit ); + if( pPage->leaf ){ + chldPg = 0; + }else if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + if( chldPg==0 ){ + assert( pCur->idx>=0 && pCur->idxpPage->nCell ); + if( pRes ) *pRes = c; + return SQLITE_OK; + } + pCur->idx = lwr; + pCur->info.nSize = 0; + rc = moveToChild(pCur, chldPg); + if( rc ){ + return rc; + } + } + /* NOT REACHED */ +} + + +/* +** Return TRUE if the cursor is not pointing at an entry of the table. +** +** TRUE will be returned after a call to sqlite3BtreeNext() moves +** past the last entry in the table or sqlite3BtreePrev() moves past +** the first entry. TRUE is also returned if the table is empty. +*/ +int sqlite3BtreeEof(BtCursor *pCur){ + /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries + ** have been deleted? This API will need to change to return an error code + ** as well as the boolean result value. + */ + return (CURSOR_VALID!=pCur->eState); +} + +/* +** Return the database connection handle for a cursor. +*/ +sqlite3 *sqlite3BtreeCursorDb(const BtCursor *pCur){ + assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); + return pCur->pBtree->pSqlite; +} + +/* +** Advance the cursor to the next entry in the database. If +** successful then set *pRes=0. If the cursor +** was already pointing to the last entry in the database before +** this routine was called, then set *pRes=1. +*/ +static int btreeNext(BtCursor *pCur, int *pRes){ + int rc; + MemPage *pPage; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pRes!=0 ); + pPage = pCur->pPage; + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } + if( pCur->skip>0 ){ + pCur->skip = 0; + *pRes = 0; + return SQLITE_OK; + } + pCur->skip = 0; + + assert( pPage->isInit ); + assert( pCur->idxnCell ); + + pCur->idx++; + pCur->info.nSize = 0; + if( pCur->idx>=pPage->nCell ){ + if( !pPage->leaf ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + if( rc ) return rc; + rc = moveToLeftmost(pCur); + *pRes = 0; + return rc; + } + do{ + if( sqlite3BtreeIsRootPage(pPage) ){ + *pRes = 1; + pCur->eState = CURSOR_INVALID; + return SQLITE_OK; + } + sqlite3BtreeMoveToParent(pCur); + pPage = pCur->pPage; + }while( pCur->idx>=pPage->nCell ); + *pRes = 0; + if( pPage->leafData ){ + rc = sqlite3BtreeNext(pCur, pRes); + }else{ + rc = SQLITE_OK; + } + return rc; + } + *pRes = 0; + if( pPage->leaf ){ + return SQLITE_OK; + } + rc = moveToLeftmost(pCur); + return rc; +} +int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ + int rc; + assert( cursorHoldsMutex(pCur) ); + rc = btreeNext(pCur, pRes); + return rc; +} + + +/* +** Step the cursor to the back to the previous entry in the database. If +** successful then set *pRes=0. If the cursor +** was already pointing to the first entry in the database before +** this routine was called, then set *pRes=1. +*/ +static int btreePrevious(BtCursor *pCur, int *pRes){ + int rc; + Pgno pgno; + MemPage *pPage; + + assert( cursorHoldsMutex(pCur) ); + rc = restoreOrClearCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } + if( pCur->skip<0 ){ + pCur->skip = 0; + *pRes = 0; + return SQLITE_OK; + } + pCur->skip = 0; + + pPage = pCur->pPage; + assert( pPage->isInit ); + assert( pCur->idx>=0 ); + if( !pPage->leaf ){ + pgno = get4byte( findCell(pPage, pCur->idx) ); + rc = moveToChild(pCur, pgno); + if( rc ){ + return rc; + } + rc = moveToRightmost(pCur); + }else{ + while( pCur->idx==0 ){ + if( sqlite3BtreeIsRootPage(pPage) ){ + pCur->eState = CURSOR_INVALID; + *pRes = 1; + return SQLITE_OK; + } + sqlite3BtreeMoveToParent(pCur); + pPage = pCur->pPage; + } + pCur->idx--; + pCur->info.nSize = 0; + if( pPage->leafData && !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, pRes); + }else{ + rc = SQLITE_OK; + } + } + *pRes = 0; + return rc; +} +int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ + int rc; + assert( cursorHoldsMutex(pCur) ); + rc = btreePrevious(pCur, pRes); + return rc; +} + +/* +** Allocate a new page from the database file. +** +** The new page is marked as dirty. (In other words, sqlite3PagerWrite() +** has already been called on the new page.) The new page has also +** been referenced and the calling routine is responsible for calling +** sqlite3PagerUnref() on the new page when it is done. +** +** SQLITE_OK is returned on success. Any other return value indicates +** an error. *ppPage and *pPgno are undefined in the event of an error. +** Do not invoke sqlite3PagerUnref() on *ppPage if an error is returned. +** +** If the "nearby" parameter is not 0, then a (feeble) effort is made to +** locate a page close to the page number "nearby". This can be used in an +** attempt to keep related pages close to each other in the database file, +** which in turn can make database access faster. +** +** If the "exact" parameter is not 0, and the page-number nearby exists +** anywhere on the free-list, then it is guarenteed to be returned. This +** is only used by auto-vacuum databases when allocating a new table. +*/ +static int allocateBtreePage( + BtShared *pBt, + MemPage **ppPage, + Pgno *pPgno, + Pgno nearby, + u8 exact +){ + MemPage *pPage1; + int rc; + int n; /* Number of pages on the freelist */ + int k; /* Number of leaves on the trunk of the freelist */ + MemPage *pTrunk = 0; + MemPage *pPrevTrunk = 0; + + assert( sqlite3_mutex_held(pBt->mutex) ); + pPage1 = pBt->pPage1; + n = get4byte(&pPage1->aData[36]); + if( n>0 ){ + /* There are pages on the freelist. Reuse one of those pages. */ + Pgno iTrunk; + u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ + + /* If the 'exact' parameter was true and a query of the pointer-map + ** shows that the page 'nearby' is somewhere on the free-list, then + ** the entire-list will be searched for that page. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( exact && nearby<=sqlite3PagerPagecount(pBt->pPager) ){ + u8 eType; + assert( nearby>0 ); + assert( pBt->autoVacuum ); + rc = ptrmapGet(pBt, nearby, &eType, 0); + if( rc ) return rc; + if( eType==PTRMAP_FREEPAGE ){ + searchList = 1; + } + *pPgno = nearby; + } +#endif + + /* Decrement the free-list count by 1. Set iTrunk to the index of the + ** first free-list trunk page. iPrevTrunk is initially 1. + */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + put4byte(&pPage1->aData[36], n-1); + + /* The code within this loop is run only once if the 'searchList' variable + ** is not true. Otherwise, it runs once for each trunk-page on the + ** free-list until the page 'nearby' is located. + */ + do { + pPrevTrunk = pTrunk; + if( pPrevTrunk ){ + iTrunk = get4byte(&pPrevTrunk->aData[0]); + }else{ + iTrunk = get4byte(&pPage1->aData[32]); + } + rc = sqlite3BtreeGetPage(pBt, iTrunk, &pTrunk, 0); + if( rc ){ + pTrunk = 0; + goto end_allocate_page; + } + + k = get4byte(&pTrunk->aData[4]); + if( k==0 && !searchList ){ + /* The trunk has no leaves and the list is not being searched. + ** So extract the trunk page itself and use it as the newly + ** allocated page */ + assert( pPrevTrunk==0 ); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + *pPgno = iTrunk; + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + *ppPage = pTrunk; + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + }else if( k>pBt->usableSize/4 - 8 ){ + /* Value of k is out of range. Database corruption */ + rc = SQLITE_CORRUPT_BKPT; + goto end_allocate_page; +#ifndef SQLITE_OMIT_AUTOVACUUM + }else if( searchList && nearby==iTrunk ){ + /* The list is being searched and this trunk page is the page + ** to allocate, regardless of whether it has leaves. + */ + assert( *pPgno==iTrunk ); + *ppPage = pTrunk; + searchList = 0; + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + if( k==0 ){ + if( !pPrevTrunk ){ + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + }else{ + memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); + } + }else{ + /* The trunk page is required by the caller but it contains + ** pointers to free-list leaves. The first leaf becomes a trunk + ** page in this case. + */ + MemPage *pNewTrunk; + Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); + rc = sqlite3BtreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + rc = sqlite3PagerWrite(pNewTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pNewTrunk); + goto end_allocate_page; + } + memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4); + put4byte(&pNewTrunk->aData[4], k-1); + memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4); + releasePage(pNewTrunk); + if( !pPrevTrunk ){ + put4byte(&pPage1->aData[32], iNewTrunk); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + put4byte(&pPrevTrunk->aData[0], iNewTrunk); + } + } + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); +#endif + }else{ + /* Extract a leaf from the trunk */ + int closest; + Pgno iPage; + unsigned char *aData = pTrunk->aData; + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + if( nearby>0 ){ + int i, dist; + closest = 0; + dist = get4byte(&aData[8]) - nearby; + if( dist<0 ) dist = -dist; + for(i=1; isqlite3PagerPagecount(pBt->pPager) ){ + /* Free page off the end of the file */ + return SQLITE_CORRUPT_BKPT; + } + TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d" + ": %d more free pages\n", + *pPgno, closest+1, k, pTrunk->pgno, n-1)); + if( closestpDbPage); + rc = sqlite3PagerWrite((*ppPage)->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + } + } + searchList = 0; + } + } + releasePage(pPrevTrunk); + pPrevTrunk = 0; + }while( searchList ); + }else{ + /* There are no pages on the freelist, so create a new page at the + ** end of the file */ + *pPgno = sqlite3PagerPagecount(pBt->pPager) + 1; + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->nTrunc ){ + /* An incr-vacuum has already run within this transaction. So the + ** page to allocate is not from the physical end of the file, but + ** at pBt->nTrunc. + */ + *pPgno = pBt->nTrunc+1; + if( *pPgno==PENDING_BYTE_PAGE(pBt) ){ + (*pPgno)++; + } + } + if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, *pPgno) ){ + /* If *pPgno refers to a pointer-map page, allocate two new pages + ** at the end of the file instead of one. The first allocated page + ** becomes a new pointer-map page, the second is used by the caller. + */ + TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", *pPgno)); + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + (*pPgno)++; + } + if( pBt->nTrunc ){ + pBt->nTrunc = *pPgno; + } +#endif + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + rc = sqlite3BtreeGetPage(pBt, *pPgno, ppPage, 0); + if( rc ) return rc; + rc = sqlite3PagerWrite((*ppPage)->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + } + TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); + } + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + +end_allocate_page: + releasePage(pTrunk); + releasePage(pPrevTrunk); + return rc; +} + +/* +** Add a page of the database file to the freelist. +** +** sqlite3PagerUnref() is NOT called for pPage. +*/ +static int freePage(MemPage *pPage){ + BtShared *pBt = pPage->pBt; + MemPage *pPage1 = pBt->pPage1; + int rc, n, k; + + /* Prepare the page for freeing */ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno>1 ); + pPage->isInit = 0; + releasePage(pPage->pParent); + pPage->pParent = 0; + + /* Increment the free page count on pPage1 */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + n = get4byte(&pPage1->aData[36]); + put4byte(&pPage1->aData[36], n+1); + +#ifdef SQLITE_SECURE_DELETE + /* If the SQLITE_SECURE_DELETE compile-time option is enabled, then + ** always fully overwrite deleted information with zeros. + */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + memset(pPage->aData, 0, pPage->pBt->pageSize); +#endif + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, write an entry in the pointer-map + ** to indicate that the page is free. + */ + if( pBt->autoVacuum ){ + rc = ptrmapPut(pBt, pPage->pgno, PTRMAP_FREEPAGE, 0); + if( rc ) return rc; + } +#endif + + if( n==0 ){ + /* This is the first free page */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + memset(pPage->aData, 0, 8); + put4byte(&pPage1->aData[32], pPage->pgno); + TRACE(("FREE-PAGE: %d first\n", pPage->pgno)); + }else{ + /* Other free pages already exist. Retrive the first trunk page + ** of the freelist and find out how many leaves it has. */ + MemPage *pTrunk; + rc = sqlite3BtreeGetPage(pBt, get4byte(&pPage1->aData[32]), &pTrunk, 0); + if( rc ) return rc; + k = get4byte(&pTrunk->aData[4]); + if( k>=pBt->usableSize/4 - 8 ){ + /* The trunk is full. Turn the page being freed into a new + ** trunk page with no leaves. */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(pPage->aData, pTrunk->pgno); + put4byte(&pPage->aData[4], 0); + put4byte(&pPage1->aData[32], pPage->pgno); + TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", + pPage->pgno, pTrunk->pgno)); + } + }else if( k<0 ){ + rc = SQLITE_CORRUPT; + }else{ + /* Add the newly freed page as a leaf on the current trunk */ + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pTrunk->aData[4], k+1); + put4byte(&pTrunk->aData[8+k*4], pPage->pgno); +#ifndef SQLITE_SECURE_DELETE + sqlite3PagerDontWrite(pPage->pDbPage); +#endif + } + TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); + } + releasePage(pTrunk); + } + return rc; +} + +/* +** Free any overflow pages associated with the given Cell. +*/ +static int clearCell(MemPage *pPage, unsigned char *pCell){ + BtShared *pBt = pPage->pBt; + CellInfo info; + Pgno ovflPgno; + int rc; + int nOvfl; + int ovflPageSize; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + if( info.iOverflow==0 ){ + return SQLITE_OK; /* No overflow pages. Return without doing anything */ + } + ovflPgno = get4byte(&pCell[info.iOverflow]); + ovflPageSize = pBt->usableSize - 4; + nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; + assert( ovflPgno==0 || nOvfl>0 ); + while( nOvfl-- ){ + MemPage *pOvfl; + if( ovflPgno==0 || ovflPgno>sqlite3PagerPagecount(pBt->pPager) ){ + return SQLITE_CORRUPT_BKPT; + } + + rc = getOverflowPage(pBt, ovflPgno, &pOvfl, (nOvfl==0)?0:&ovflPgno); + if( rc ) return rc; + rc = freePage(pOvfl); + sqlite3PagerUnref(pOvfl->pDbPage); + if( rc ) return rc; + } + return SQLITE_OK; +} + +/* +** Create the byte sequence used to represent a cell on page pPage +** and write that byte sequence into pCell[]. Overflow pages are +** allocated and filled in as necessary. The calling procedure +** is responsible for making sure sufficient space has been allocated +** for pCell[]. +** +** Note that pCell does not necessary need to point to the pPage->aData +** area. pCell might point to some temporary storage. The cell will +** be constructed in this temporary area then copied into pPage->aData +** later. +*/ +static int fillInCell( + MemPage *pPage, /* The page that contains the cell */ + unsigned char *pCell, /* Complete text of the cell */ + const void *pKey, i64 nKey, /* The key */ + const void *pData,int nData, /* The data */ + int nZero, /* Extra zero bytes to append to pData */ + int *pnSize /* Write cell size here */ +){ + int nPayload; + const u8 *pSrc; + int nSrc, n, rc; + int spaceLeft; + MemPage *pOvfl = 0; + MemPage *pToRelease = 0; + unsigned char *pPrior; + unsigned char *pPayload; + BtShared *pBt = pPage->pBt; + Pgno pgnoOvfl = 0; + int nHeader; + CellInfo info; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* Fill in the header. */ + nHeader = 0; + if( !pPage->leaf ){ + nHeader += 4; + } + if( pPage->hasData ){ + nHeader += putVarint(&pCell[nHeader], nData+nZero); + }else{ + nData = nZero = 0; + } + nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey); + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + assert( info.nHeader==nHeader ); + assert( info.nKey==nKey ); + assert( info.nData==nData+nZero ); + + /* Fill in the payload */ + nPayload = nData + nZero; + if( pPage->intKey ){ + pSrc = pData; + nSrc = nData; + nData = 0; + }else{ + nPayload += nKey; + pSrc = pKey; + nSrc = nKey; + } + *pnSize = info.nSize; + spaceLeft = info.nLocal; + pPayload = &pCell[nHeader]; + pPrior = &pCell[info.iOverflow]; + + while( nPayload>0 ){ + if( spaceLeft==0 ){ + int isExact = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ + if( pBt->autoVacuum ){ + do{ + pgnoOvfl++; + } while( + PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) + ); + if( pgnoOvfl>1 ){ + /* isExact = 1; */ + } + } +#endif + rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, isExact); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, and the second or subsequent + ** overflow page is being allocated, add an entry to the pointer-map + ** for that page now. + ** + ** If this is the first overflow page, then write a partial entry + ** to the pointer-map. If we write nothing to this pointer-map slot, + ** then the optimistic overflow chain processing in clearCell() + ** may misinterpret the uninitialised values and delete the + ** wrong pages from the database. + */ + if( pBt->autoVacuum && rc==SQLITE_OK ){ + u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); + rc = ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap); + if( rc ){ + releasePage(pOvfl); + } + } +#endif + if( rc ){ + releasePage(pToRelease); + return rc; + } + put4byte(pPrior, pgnoOvfl); + releasePage(pToRelease); + pToRelease = pOvfl; + pPrior = pOvfl->aData; + put4byte(pPrior, 0); + pPayload = &pOvfl->aData[4]; + spaceLeft = pBt->usableSize - 4; + } + n = nPayload; + if( n>spaceLeft ) n = spaceLeft; + if( nSrc>0 ){ + if( n>nSrc ) n = nSrc; + assert( pSrc ); + memcpy(pPayload, pSrc, n); + }else{ + memset(pPayload, 0, n); + } + nPayload -= n; + pPayload += n; + pSrc += n; + nSrc -= n; + spaceLeft -= n; + if( nSrc==0 ){ + nSrc = nData; + pSrc = pData; + } + } + releasePage(pToRelease); + return SQLITE_OK; +} + +/* +** Change the MemPage.pParent pointer on the page whose number is +** given in the second argument so that MemPage.pParent holds the +** pointer in the third argument. +*/ +static int reparentPage(BtShared *pBt, Pgno pgno, MemPage *pNewParent, int idx){ + MemPage *pThis; + DbPage *pDbPage; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pNewParent!=0 ); + if( pgno==0 ) return SQLITE_OK; + assert( pBt->pPager!=0 ); + pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); + if( pDbPage ){ + pThis = (MemPage *)sqlite3PagerGetExtra(pDbPage); + if( pThis->isInit ){ + assert( pThis->aData==sqlite3PagerGetData(pDbPage) ); + if( pThis->pParent!=pNewParent ){ + if( pThis->pParent ) sqlite3PagerUnref(pThis->pParent->pDbPage); + pThis->pParent = pNewParent; + sqlite3PagerRef(pNewParent->pDbPage); + } + pThis->idxParent = idx; + } + sqlite3PagerUnref(pDbPage); + } + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + return ptrmapPut(pBt, pgno, PTRMAP_BTREE, pNewParent->pgno); + } +#endif + return SQLITE_OK; +} + + + +/* +** Change the pParent pointer of all children of pPage to point back +** to pPage. +** +** In other words, for every child of pPage, invoke reparentPage() +** to make sure that each child knows that pPage is its parent. +** +** This routine gets called after you memcpy() one page into +** another. +*/ +static int reparentChildPages(MemPage *pPage){ + int i; + BtShared *pBt = pPage->pBt; + int rc = SQLITE_OK; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( pPage->leaf ) return SQLITE_OK; + + for(i=0; inCell; i++){ + u8 *pCell = findCell(pPage, i); + if( !pPage->leaf ){ + rc = reparentPage(pBt, get4byte(pCell), pPage, i); + if( rc!=SQLITE_OK ) return rc; + } + } + if( !pPage->leaf ){ + rc = reparentPage(pBt, get4byte(&pPage->aData[pPage->hdrOffset+8]), + pPage, i); + pPage->idxShift = 0; + } + return rc; +} + +/* +** Remove the i-th cell from pPage. This routine effects pPage only. +** The cell content is not freed or deallocated. It is assumed that +** the cell content has been copied someplace else. This routine just +** removes the reference to the cell from pPage. +** +** "sz" must be the number of bytes in the cell. +*/ +static void dropCell(MemPage *pPage, int idx, int sz){ + int i; /* Loop counter */ + int pc; /* Offset to cell content of cell being deleted */ + u8 *data; /* pPage->aData */ + u8 *ptr; /* Used to move bytes around within data[] */ + + assert( idx>=0 && idxnCell ); + assert( sz==cellSize(pPage, idx) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + data = pPage->aData; + ptr = &data[pPage->cellOffset + 2*idx]; + pc = get2byte(ptr); + assert( pc>10 && pc+sz<=pPage->pBt->usableSize ); + freeSpace(pPage, pc, sz); + for(i=idx+1; inCell; i++, ptr+=2){ + ptr[0] = ptr[2]; + ptr[1] = ptr[3]; + } + pPage->nCell--; + put2byte(&data[pPage->hdrOffset+3], pPage->nCell); + pPage->nFree += 2; + pPage->idxShift = 1; +} + +/* +** Insert a new cell on pPage at cell index "i". pCell points to the +** content of the cell. +** +** If the cell content will fit on the page, then put it there. If it +** will not fit, then make a copy of the cell content into pTemp if +** pTemp is not null. Regardless of pTemp, allocate a new entry +** in pPage->aOvfl[] and make it point to the cell content (either +** in pTemp or the original pCell) and also record its index. +** Allocating a new entry in pPage->aCell[] implies that +** pPage->nOverflow is incremented. +** +** If nSkip is non-zero, then do not copy the first nSkip bytes of the +** cell. The caller will overwrite them after this function returns. If +** nSkip is non-zero, then pCell may not point to an invalid memory location +** (but pCell+nSkip is always valid). +*/ +static int insertCell( + MemPage *pPage, /* Page into which we are copying */ + int i, /* New cell becomes the i-th cell of the page */ + u8 *pCell, /* Content of the new cell */ + int sz, /* Bytes of content in pCell */ + u8 *pTemp, /* Temp storage space for pCell, if needed */ + u8 nSkip /* Do not write the first nSkip bytes of the cell */ +){ + int idx; /* Where to write new cell content in data[] */ + int j; /* Loop counter */ + int top; /* First byte of content for any cell in data[] */ + int end; /* First byte past the last cell pointer in data[] */ + int ins; /* Index in data[] where new cell pointer is inserted */ + int hdr; /* Offset into data[] of the page header */ + int cellOffset; /* Address of first cell pointer in data[] */ + u8 *data; /* The content of the whole page */ + u8 *ptr; /* Used for moving information around in data[] */ + + assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); + assert( sz==cellSizePtr(pPage, pCell) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( pPage->nOverflow || sz+2>pPage->nFree ){ + if( pTemp ){ + memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip); + pCell = pTemp; + } + j = pPage->nOverflow++; + assert( jaOvfl)/sizeof(pPage->aOvfl[0]) ); + pPage->aOvfl[j].pCell = pCell; + pPage->aOvfl[j].idx = i; + pPage->nFree = 0; + }else{ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + data = pPage->aData; + hdr = pPage->hdrOffset; + top = get2byte(&data[hdr+5]); + cellOffset = pPage->cellOffset; + end = cellOffset + 2*pPage->nCell + 2; + ins = cellOffset + 2*i; + if( end > top - sz ){ + rc = defragmentPage(pPage); + if( rc!=SQLITE_OK ) return rc; + top = get2byte(&data[hdr+5]); + assert( end + sz <= top ); + } + idx = allocateSpace(pPage, sz); + assert( idx>0 ); + assert( end <= get2byte(&data[hdr+5]) ); + pPage->nCell++; + pPage->nFree -= 2; + memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip); + for(j=end-2, ptr=&data[j]; j>ins; j-=2, ptr-=2){ + ptr[0] = ptr[-2]; + ptr[1] = ptr[-1]; + } + put2byte(&data[ins], idx); + put2byte(&data[hdr+3], pPage->nCell); + pPage->idxShift = 1; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pPage->pBt->autoVacuum ){ + /* The cell may contain a pointer to an overflow page. If so, write + ** the entry for the overflow page into the pointer map. + */ + CellInfo info; + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload ); + if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){ + Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]); + rc = ptrmapPut(pPage->pBt, pgnoOvfl, PTRMAP_OVERFLOW1, pPage->pgno); + if( rc!=SQLITE_OK ) return rc; + } + } +#endif + } + + return SQLITE_OK; +} + +/* +** Add a list of cells to a page. The page should be initially empty. +** The cells are guaranteed to fit on the page. +*/ +static void assemblePage( + MemPage *pPage, /* The page to be assemblied */ + int nCell, /* The number of cells to add to this page */ + u8 **apCell, /* Pointers to cell bodies */ + int *aSize /* Sizes of the cells */ +){ + int i; /* Loop counter */ + int totalSize; /* Total size of all cells */ + int hdr; /* Index of page header */ + int cellptr; /* Address of next cell pointer */ + int cellbody; /* Address of next cell body */ + u8 *data; /* Data for the page */ + + assert( pPage->nOverflow==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + totalSize = 0; + for(i=0; inFree ); + assert( pPage->nCell==0 ); + cellptr = pPage->cellOffset; + data = pPage->aData; + hdr = pPage->hdrOffset; + put2byte(&data[hdr+3], nCell); + if( nCell ){ + cellbody = allocateSpace(pPage, totalSize); + assert( cellbody>0 ); + assert( pPage->nFree >= 2*nCell ); + pPage->nFree -= 2*nCell; + for(i=0; ipBt->usableSize ); + } + pPage->nCell = nCell; +} + +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB (NN*2+1) /* Total pages involved in the balance */ + +/* Forward reference */ +static int balance(MemPage*, int); + +#ifndef SQLITE_OMIT_QUICKBALANCE +/* +** This version of balance() handles the common special case where +** a new entry is being inserted on the extreme right-end of the +** tree, in other words, when the new entry will become the largest +** entry in the tree. +** +** Instead of trying balance the 3 right-most leaf pages, just add +** a new page to the right-hand side and put the one new entry in +** that page. This leaves the right side of the tree somewhat +** unbalanced. But odds are that we will be inserting new entries +** at the end soon afterwards so the nearly empty page will quickly +** fill up. On average. +** +** pPage is the leaf page which is the right-most page in the tree. +** pParent is its parent. pPage must have a single overflow entry +** which is also the right-most entry on the page. +*/ +static int balance_quick(MemPage *pPage, MemPage *pParent){ + int rc; + MemPage *pNew; + Pgno pgnoNew; + u8 *pCell; + int szCell; + CellInfo info; + BtShared *pBt = pPage->pBt; + int parentIdx = pParent->nCell; /* pParent new divider cell index */ + int parentSize; /* Size of new divider cell */ + u8 parentCell[64]; /* Space for the new divider cell */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* Allocate a new page. Insert the overflow cell from pPage + ** into it. Then remove the overflow cell from pPage. + */ + rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + pCell = pPage->aOvfl[0].pCell; + szCell = cellSizePtr(pPage, pCell); + zeroPage(pNew, pPage->aData[0]); + assemblePage(pNew, 1, &pCell, &szCell); + pPage->nOverflow = 0; + + /* Set the parent of the newly allocated page to pParent. */ + pNew->pParent = pParent; + sqlite3PagerRef(pParent->pDbPage); + + /* pPage is currently the right-child of pParent. Change this + ** so that the right-child is the new page allocated above and + ** pPage is the next-to-right child. + */ + assert( pPage->nCell>0 ); + pCell = findCell(pPage, pPage->nCell-1); + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + rc = fillInCell(pParent, parentCell, 0, info.nKey, 0, 0, 0, &parentSize); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( parentSize<64 ); + rc = insertCell(pParent, parentIdx, parentCell, parentSize, 0, 4); + if( rc!=SQLITE_OK ){ + return rc; + } + put4byte(findOverflowCell(pParent,parentIdx), pPage->pgno); + put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If this is an auto-vacuum database, update the pointer map + ** with entries for the new page, and any pointer from the + ** cell on the page to an overflow page. + */ + if( pBt->autoVacuum ){ + rc = ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno); + if( rc==SQLITE_OK ){ + rc = ptrmapPutOvfl(pNew, 0); + } + if( rc!=SQLITE_OK ){ + releasePage(pNew); + return rc; + } + } +#endif + + /* Release the reference to the new page and balance the parent page, + ** in case the divider cell inserted caused it to become overfull. + */ + releasePage(pNew); + return balance(pParent, 0); +} +#endif /* SQLITE_OMIT_QUICKBALANCE */ + +/* +** This routine redistributes Cells on pPage and up to NN*2 siblings +** of pPage so that all pages have about the same amount of free space. +** Usually NN siblings on either side of pPage is used in the balancing, +** though more siblings might come from one side if pPage is the first +** or last child of its parent. If pPage has fewer than 2*NN siblings +** (something which can only happen if pPage is the root page or a +** child of root) then all available siblings participate in the balancing. +** +** The number of siblings of pPage might be increased or decreased by one or +** two in an effort to keep pages nearly full but not over full. The root page +** is special and is allowed to be nearly empty. If pPage is +** the root page, then the depth of the tree might be increased +** or decreased by one, as necessary, to keep the root page from being +** overfull or completely empty. +** +** Note that when this routine is called, some of the Cells on pPage +** might not actually be stored in pPage->aData[]. This can happen +** if the page is overfull. Part of the job of this routine is to +** make sure all Cells for pPage once again fit in pPage->aData[]. +** +** In the course of balancing the siblings of pPage, the parent of pPage +** might become overfull or underfull. If that happens, then this routine +** is called recursively on the parent. +** +** If this routine fails for any reason, it might leave the database +** in a corrupted state. So if this routine fails, the database should +** be rolled back. +*/ +static int balance_nonroot(MemPage *pPage){ + MemPage *pParent; /* The parent of pPage */ + BtShared *pBt; /* The whole database */ + int nCell = 0; /* Number of cells in apCell[] */ + int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ + int nOld; /* Number of pages in apOld[] */ + int nNew; /* Number of pages in apNew[] */ + int nDiv; /* Number of cells in apDiv[] */ + int i, j, k; /* Loop counters */ + int idx; /* Index of pPage in pParent->aCell[] */ + int nxDiv; /* Next divider slot in pParent->aCell[] */ + int rc; /* The return code */ + int leafCorrection; /* 4 if pPage is a leaf. 0 if not */ + int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ + int usableSpace; /* Bytes in pPage beyond the header */ + int pageFlags; /* Value of pPage->aData[0] */ + int subtotal; /* Subtotal of bytes in cells on one page */ + int iSpace = 0; /* First unused byte of aSpace[] */ + MemPage *apOld[NB]; /* pPage and up to two siblings */ + Pgno pgnoOld[NB]; /* Page numbers for each page in apOld[] */ + MemPage *apCopy[NB]; /* Private copies of apOld[] pages */ + MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ + Pgno pgnoNew[NB+2]; /* Page numbers for each page in apNew[] */ + u8 *apDiv[NB]; /* Divider cells in pParent */ + int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */ + int szNew[NB+2]; /* Combined size of cells place on i-th page */ + u8 **apCell = 0; /* All cells begin balanced */ + int *szCell; /* Local size of all cells in apCell[] */ + u8 *aCopy[NB]; /* Space for holding data of apCopy[] */ + u8 *aSpace; /* Space to hold copies of dividers cells */ +#ifndef SQLITE_OMIT_AUTOVACUUM + u8 *aFrom = 0; +#endif + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* + ** Find the parent page. + */ + assert( pPage->isInit ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) || pPage->nOverflow==1 ); + pBt = pPage->pBt; + pParent = pPage->pParent; + assert( pParent ); + if( SQLITE_OK!=(rc = sqlite3PagerWrite(pParent->pDbPage)) ){ + return rc; + } + TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); + +#ifndef SQLITE_OMIT_QUICKBALANCE + /* + ** A special case: If a new entry has just been inserted into a + ** table (that is, a btree with integer keys and all data at the leaves) + ** and the new entry is the right-most entry in the tree (it has the + ** largest key) then use the special balance_quick() routine for + ** balancing. balance_quick() is much faster and results in a tighter + ** packing of data in the common case. + */ + if( pPage->leaf && + pPage->intKey && + pPage->leafData && + pPage->nOverflow==1 && + pPage->aOvfl[0].idx==pPage->nCell && + pPage->pParent->pgno!=1 && + get4byte(&pParent->aData[pParent->hdrOffset+8])==pPage->pgno + ){ + /* + ** TODO: Check the siblings to the left of pPage. It may be that + ** they are not full and no new page is required. + */ + return balance_quick(pPage, pParent); + } +#endif + + if( SQLITE_OK!=(rc = sqlite3PagerWrite(pPage->pDbPage)) ){ + return rc; + } + + /* + ** Find the cell in the parent page whose left child points back + ** to pPage. The "idx" variable is the index of that cell. If pPage + ** is the rightmost child of pParent then set idx to pParent->nCell + */ + if( pParent->idxShift ){ + Pgno pgno; + pgno = pPage->pgno; + assert( pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + for(idx=0; idxnCell; idx++){ + if( get4byte(findCell(pParent, idx))==pgno ){ + break; + } + } + assert( idxnCell + || get4byte(&pParent->aData[pParent->hdrOffset+8])==pgno ); + }else{ + idx = pPage->idxParent; + } + + /* + ** Initialize variables so that it will be safe to jump + ** directly to balance_cleanup at any moment. + */ + nOld = nNew = 0; + sqlite3PagerRef(pParent->pDbPage); + + /* + ** Find sibling pages to pPage and the cells in pParent that divide + ** the siblings. An attempt is made to find NN siblings on either + ** side of pPage. More siblings are taken from one side, however, if + ** pPage there are fewer than NN siblings on the other side. If pParent + ** has NB or fewer children then all children of pParent are taken. + */ + nxDiv = idx - NN; + if( nxDiv + NB > pParent->nCell ){ + nxDiv = pParent->nCell - NB + 1; + } + if( nxDiv<0 ){ + nxDiv = 0; + } + nDiv = 0; + for(i=0, k=nxDiv; inCell ){ + apDiv[i] = findCell(pParent, k); + nDiv++; + assert( !pParent->leaf ); + pgnoOld[i] = get4byte(apDiv[i]); + }else if( k==pParent->nCell ){ + pgnoOld[i] = get4byte(&pParent->aData[pParent->hdrOffset+8]); + }else{ + break; + } + rc = getAndInitPage(pBt, pgnoOld[i], &apOld[i], pParent); + if( rc ) goto balance_cleanup; + apOld[i]->idxParent = k; + apCopy[i] = 0; + assert( i==nOld ); + nOld++; + nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; + } + + /* Make nMaxCells a multiple of 2 in order to preserve 8-byte + ** alignment */ + nMaxCells = (nMaxCells + 1)&~1; + + /* + ** Allocate space for memory structures + */ + apCell = sqlite3_malloc( + nMaxCells*sizeof(u8*) /* apCell */ + + nMaxCells*sizeof(int) /* szCell */ + + ROUND8(sizeof(MemPage))*NB /* aCopy */ + + pBt->pageSize*(5+NB) /* aSpace */ + + (ISAUTOVACUUM ? nMaxCells : 0) /* aFrom */ + ); + if( apCell==0 ){ + rc = SQLITE_NOMEM; + goto balance_cleanup; + } + szCell = (int*)&apCell[nMaxCells]; + aCopy[0] = (u8*)&szCell[nMaxCells]; + assert( ((aCopy[0] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ + for(i=1; ipageSize+ROUND8(sizeof(MemPage))]; + assert( ((aCopy[i] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ + } + aSpace = &aCopy[NB-1][pBt->pageSize+ROUND8(sizeof(MemPage))]; + assert( ((aSpace - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + aFrom = &aSpace[5*pBt->pageSize]; + } +#endif + + /* + ** Make copies of the content of pPage and its siblings into aOld[]. + ** The rest of this function will use data from the copies rather + ** that the original pages since the original pages will be in the + ** process of being overwritten. + */ + for(i=0; iaData = (void*)&p[1]; + memcpy(p->aData, apOld[i]->aData, pBt->pageSize); + } + + /* + ** Load pointers to all cells on sibling pages and the divider cells + ** into the local apCell[] array. Make copies of the divider cells + ** into space obtained form aSpace[] and remove the the divider Cells + ** from pParent. + ** + ** If the siblings are on leaf pages, then the child pointers of the + ** divider cells are stripped from the cells before they are copied + ** into aSpace[]. In this way, all cells in apCell[] are without + ** child pointers. If siblings are not leaves, then all cell in + ** apCell[] include child pointers. Either way, all cells in apCell[] + ** are alike. + ** + ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. + ** leafData: 1 if pPage holds key+data and pParent holds only keys. + */ + nCell = 0; + leafCorrection = pPage->leaf*4; + leafData = pPage->leafData && pPage->leaf; + for(i=0; inCell+pOld->nOverflow; + for(j=0; jautoVacuum ){ + int a; + aFrom[nCell] = i; + for(a=0; anOverflow; a++){ + if( pOld->aOvfl[a].pCell==apCell[nCell] ){ + aFrom[nCell] = 0xFF; + break; + } + } + } +#endif + nCell++; + } + if( ipageSize*5 ); + memcpy(pTemp, apDiv[i], sz); + apCell[nCell] = pTemp+leafCorrection; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + aFrom[nCell] = 0xFF; + } +#endif + dropCell(pParent, nxDiv, sz); + szCell[nCell] -= leafCorrection; + assert( get4byte(pTemp)==pgnoOld[i] ); + if( !pOld->leaf ){ + assert( leafCorrection==0 ); + /* The right pointer of the child page pOld becomes the left + ** pointer of the divider cell */ + memcpy(apCell[nCell], &pOld->aData[pOld->hdrOffset+8], 4); + }else{ + assert( leafCorrection==4 ); + if( szCell[nCell]<4 ){ + /* Do not allow any cells smaller than 4 bytes. */ + szCell[nCell] = 4; + } + } + nCell++; + } + } + } + + /* + ** Figure out the number of pages needed to hold all nCell cells. + ** Store this number in "k". Also compute szNew[] which is the total + ** size of all cells on the i-th page and cntNew[] which is the index + ** in apCell[] of the cell that divides page i from page i+1. + ** cntNew[k] should equal nCell. + ** + ** Values computed by this block: + ** + ** k: The total number of sibling pages + ** szNew[i]: Spaced used on the i-th sibling page. + ** cntNew[i]: Index in apCell[] and szCell[] for the first cell to + ** the right of the i-th sibling page. + ** usableSpace: Number of bytes of space available on each sibling. + ** + */ + usableSpace = pBt->usableSize - 12 + leafCorrection; + for(subtotal=k=i=0; i usableSpace ){ + szNew[k] = subtotal - szCell[i]; + cntNew[k] = i; + if( leafData ){ i--; } + subtotal = 0; + k++; + } + } + szNew[k] = subtotal; + cntNew[k] = nCell; + k++; + + /* + ** The packing computed by the previous block is biased toward the siblings + ** on the left side. The left siblings are always nearly full, while the + ** right-most sibling might be nearly empty. This block of code attempts + ** to adjust the packing of siblings to get a better balance. + ** + ** This adjustment is more than an optimization. The packing above might + ** be so out of balance as to be illegal. For example, the right-most + ** sibling might be completely empty. This adjustment is not optional. + */ + for(i=k-1; i>0; i--){ + int szRight = szNew[i]; /* Size of sibling on the right */ + int szLeft = szNew[i-1]; /* Size of sibling on the left */ + int r; /* Index of right-most cell in left sibling */ + int d; /* Index of first cell to the left of right sibling */ + + r = cntNew[i-1] - 1; + d = r + 1 - leafData; + assert( d0) or we are the + ** a virtual root page. A virtual root page is when the real root + ** page is page 1 and we are the only child of that page. + */ + assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) ); + + /* + ** Allocate k new pages. Reuse old pages where possible. + */ + assert( pPage->pgno>1 ); + pageFlags = pPage->aData[0]; + for(i=0; ipDbPage); + nNew++; + if( rc ) goto balance_cleanup; + }else{ + assert( i>0 ); + rc = allocateBtreePage(pBt, &pNew, &pgnoNew[i], pgnoNew[i-1], 0); + if( rc ) goto balance_cleanup; + apNew[i] = pNew; + nNew++; + } + zeroPage(pNew, pageFlags); + } + + /* Free any old pages that were not reused as new pages. + */ + while( ii ){ + int t; + MemPage *pT; + t = pgnoNew[i]; + pT = apNew[i]; + pgnoNew[i] = pgnoNew[minI]; + apNew[i] = apNew[minI]; + pgnoNew[minI] = t; + apNew[minI] = pT; + } + } + TRACE(("BALANCE: old: %d %d %d new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n", + pgnoOld[0], + nOld>=2 ? pgnoOld[1] : 0, + nOld>=3 ? pgnoOld[2] : 0, + pgnoNew[0], szNew[0], + nNew>=2 ? pgnoNew[1] : 0, nNew>=2 ? szNew[1] : 0, + nNew>=3 ? pgnoNew[2] : 0, nNew>=3 ? szNew[2] : 0, + nNew>=4 ? pgnoNew[3] : 0, nNew>=4 ? szNew[3] : 0, + nNew>=5 ? pgnoNew[4] : 0, nNew>=5 ? szNew[4] : 0)); + + /* + ** Evenly distribute the data in apCell[] across the new pages. + ** Insert divider cells into pParent as necessary. + */ + j = 0; + for(i=0; ipgno==pgnoNew[i] ); + assemblePage(pNew, cntNew[i]-j, &apCell[j], &szCell[j]); + assert( pNew->nCell>0 || (nNew==1 && cntNew[0]==0) ); + assert( pNew->nOverflow==0 ); + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If this is an auto-vacuum database, update the pointer map entries + ** that point to the siblings that were rearranged. These can be: left + ** children of cells, the right-child of the page, or overflow pages + ** pointed to by cells. + */ + if( pBt->autoVacuum ){ + for(k=j; kpgno!=pNew->pgno ){ + rc = ptrmapPutOvfl(pNew, k-j); + if( rc!=SQLITE_OK ){ + goto balance_cleanup; + } + } + } + } +#endif + + j = cntNew[i]; + + /* If the sibling page assembled above was not the right-most sibling, + ** insert a divider cell into the parent page. + */ + if( ileaf ){ + memcpy(&pNew->aData[8], pCell, 4); + pTemp = 0; + }else if( leafData ){ + /* If the tree is a leaf-data tree, and the siblings are leaves, + ** then there is no divider cell in apCell[]. Instead, the divider + ** cell consists of the integer key for the right-most cell of + ** the sibling-page assembled above only. + */ + CellInfo info; + j--; + sqlite3BtreeParseCellPtr(pNew, apCell[j], &info); + pCell = &aSpace[iSpace]; + fillInCell(pParent, pCell, 0, info.nKey, 0, 0, 0, &sz); + iSpace += sz; + assert( iSpace<=pBt->pageSize*5 ); + pTemp = 0; + }else{ + pCell -= 4; + pTemp = &aSpace[iSpace]; + iSpace += sz; + assert( iSpace<=pBt->pageSize*5 ); + /* Obscure case for non-leaf-data trees: If the cell at pCell was + ** previously stored on a leaf node, and it's reported size was 4 + ** bytes, then it may actually be smaller than this + ** (see sqlite3BtreeParseCellPtr(), 4 bytes is the minimum size of + ** any cell). But it's important to pass the correct size to + ** insertCell(), so reparse the cell now. + ** + ** Note that this can never happen in an SQLite data file, as all + ** cells are at least 4 bytes. It only happens in b-trees used + ** to evaluate "IN (SELECT ...)" and similar clauses. + */ + if( szCell[j]==4 ){ + assert(leafCorrection==4); + sz = cellSizePtr(pParent, pCell); + } + } + rc = insertCell(pParent, nxDiv, pCell, sz, pTemp, 4); + if( rc!=SQLITE_OK ) goto balance_cleanup; + put4byte(findOverflowCell(pParent,nxDiv), pNew->pgno); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If this is an auto-vacuum database, and not a leaf-data tree, + ** then update the pointer map with an entry for the overflow page + ** that the cell just inserted points to (if any). + */ + if( pBt->autoVacuum && !leafData ){ + rc = ptrmapPutOvfl(pParent, nxDiv); + if( rc!=SQLITE_OK ){ + goto balance_cleanup; + } + } +#endif + j++; + nxDiv++; + } + } + assert( j==nCell ); + assert( nOld>0 ); + assert( nNew>0 ); + if( (pageFlags & PTF_LEAF)==0 ){ + memcpy(&apNew[nNew-1]->aData[8], &apCopy[nOld-1]->aData[8], 4); + } + if( nxDiv==pParent->nCell+pParent->nOverflow ){ + /* Right-most sibling is the right-most child of pParent */ + put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew[nNew-1]); + }else{ + /* Right-most sibling is the left child of the first entry in pParent + ** past the right-most divider entry */ + put4byte(findOverflowCell(pParent, nxDiv), pgnoNew[nNew-1]); + } + + /* + ** Reparent children of all cells. + */ + for(i=0; iisInit ); + rc = balance(pParent, 0); + + /* + ** Cleanup before returning. + */ +balance_cleanup: + sqlite3_free(apCell); + for(i=0; ipgno, nOld, nNew, nCell)); + return rc; +} + +/* +** This routine is called for the root page of a btree when the root +** page contains no cells. This is an opportunity to make the tree +** shallower by one level. +*/ +static int balance_shallower(MemPage *pPage){ + MemPage *pChild; /* The only child page of pPage */ + Pgno pgnoChild; /* Page number for pChild */ + int rc = SQLITE_OK; /* Return code from subprocedures */ + BtShared *pBt; /* The main BTree structure */ + int mxCellPerPage; /* Maximum number of cells per page */ + u8 **apCell; /* All cells from pages being balanced */ + int *szCell; /* Local size of all cells */ + + assert( pPage->pParent==0 ); + assert( pPage->nCell==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pBt = pPage->pBt; + mxCellPerPage = MX_CELL(pBt); + apCell = sqlite3_malloc( mxCellPerPage*(sizeof(u8*)+sizeof(int)) ); + if( apCell==0 ) return SQLITE_NOMEM; + szCell = (int*)&apCell[mxCellPerPage]; + if( pPage->leaf ){ + /* The table is completely empty */ + TRACE(("BALANCE: empty table %d\n", pPage->pgno)); + }else{ + /* The root page is empty but has one child. Transfer the + ** information from that one child into the root page if it + ** will fit. This reduces the depth of the tree by one. + ** + ** If the root page is page 1, it has less space available than + ** its child (due to the 100 byte header that occurs at the beginning + ** of the database fle), so it might not be able to hold all of the + ** information currently contained in the child. If this is the + ** case, then do not do the transfer. Leave page 1 empty except + ** for the right-pointer to the child page. The child page becomes + ** the virtual root of the tree. + */ + pgnoChild = get4byte(&pPage->aData[pPage->hdrOffset+8]); + assert( pgnoChild>0 ); + assert( pgnoChild<=sqlite3PagerPagecount(pPage->pBt->pPager) ); + rc = sqlite3BtreeGetPage(pPage->pBt, pgnoChild, &pChild, 0); + if( rc ) goto end_shallow_balance; + if( pPage->pgno==1 ){ + rc = sqlite3BtreeInitPage(pChild, pPage); + if( rc ) goto end_shallow_balance; + assert( pChild->nOverflow==0 ); + if( pChild->nFree>=100 ){ + /* The child information will fit on the root page, so do the + ** copy */ + int i; + zeroPage(pPage, pChild->aData[0]); + for(i=0; inCell; i++){ + apCell[i] = findCell(pChild,i); + szCell[i] = cellSizePtr(pChild, apCell[i]); + } + assemblePage(pPage, pChild->nCell, apCell, szCell); + /* Copy the right-pointer of the child to the parent. */ + put4byte(&pPage->aData[pPage->hdrOffset+8], + get4byte(&pChild->aData[pChild->hdrOffset+8])); + freePage(pChild); + TRACE(("BALANCE: child %d transfer to page 1\n", pChild->pgno)); + }else{ + /* The child has more information that will fit on the root. + ** The tree is already balanced. Do nothing. */ + TRACE(("BALANCE: child %d will not fit on page 1\n", pChild->pgno)); + } + }else{ + memcpy(pPage->aData, pChild->aData, pPage->pBt->usableSize); + pPage->isInit = 0; + pPage->pParent = 0; + rc = sqlite3BtreeInitPage(pPage, 0); + assert( rc==SQLITE_OK ); + freePage(pChild); + TRACE(("BALANCE: transfer child %d into root %d\n", + pChild->pgno, pPage->pgno)); + } + rc = reparentChildPages(pPage); + assert( pPage->nOverflow==0 ); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + int i; + for(i=0; inCell; i++){ + rc = ptrmapPutOvfl(pPage, i); + if( rc!=SQLITE_OK ){ + goto end_shallow_balance; + } + } + } +#endif + releasePage(pChild); + } +end_shallow_balance: + sqlite3_free(apCell); + return rc; +} + + +/* +** The root page is overfull +** +** When this happens, Create a new child page and copy the +** contents of the root into the child. Then make the root +** page an empty page with rightChild pointing to the new +** child. Finally, call balance_internal() on the new child +** to cause it to split. +*/ +static int balance_deeper(MemPage *pPage){ + int rc; /* Return value from subprocedures */ + MemPage *pChild; /* Pointer to a new child page */ + Pgno pgnoChild; /* Page number of the new child page */ + BtShared *pBt; /* The BTree */ + int usableSize; /* Total usable size of a page */ + u8 *data; /* Content of the parent page */ + u8 *cdata; /* Content of the child page */ + int hdr; /* Offset to page header in parent */ + int brk; /* Offset to content of first cell in parent */ + + assert( pPage->pParent==0 ); + assert( pPage->nOverflow>0 ); + pBt = pPage->pBt; + assert( sqlite3_mutex_held(pBt->mutex) ); + rc = allocateBtreePage(pBt, &pChild, &pgnoChild, pPage->pgno, 0); + if( rc ) return rc; + assert( sqlite3PagerIswriteable(pChild->pDbPage) ); + usableSize = pBt->usableSize; + data = pPage->aData; + hdr = pPage->hdrOffset; + brk = get2byte(&data[hdr+5]); + cdata = pChild->aData; + memcpy(cdata, &data[hdr], pPage->cellOffset+2*pPage->nCell-hdr); + memcpy(&cdata[brk], &data[brk], usableSize-brk); + assert( pChild->isInit==0 ); + rc = sqlite3BtreeInitPage(pChild, pPage); + if( rc ) goto balancedeeper_out; + memcpy(pChild->aOvfl, pPage->aOvfl, pPage->nOverflow*sizeof(pPage->aOvfl[0])); + pChild->nOverflow = pPage->nOverflow; + if( pChild->nOverflow ){ + pChild->nFree = 0; + } + assert( pChild->nCell==pPage->nCell ); + zeroPage(pPage, pChild->aData[0] & ~PTF_LEAF); + put4byte(&pPage->aData[pPage->hdrOffset+8], pgnoChild); + TRACE(("BALANCE: copy root %d into %d\n", pPage->pgno, pChild->pgno)); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + int i; + rc = ptrmapPut(pBt, pChild->pgno, PTRMAP_BTREE, pPage->pgno); + if( rc ) goto balancedeeper_out; + for(i=0; inCell; i++){ + rc = ptrmapPutOvfl(pChild, i); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } +#endif + rc = balance_nonroot(pChild); + +balancedeeper_out: + releasePage(pChild); + return rc; +} + +/* +** Decide if the page pPage needs to be balanced. If balancing is +** required, call the appropriate balancing routine. +*/ +static int balance(MemPage *pPage, int insert){ + int rc = SQLITE_OK; + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + if( pPage->pParent==0 ){ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc==SQLITE_OK && pPage->nOverflow>0 ){ + rc = balance_deeper(pPage); + } + if( rc==SQLITE_OK && pPage->nCell==0 ){ + rc = balance_shallower(pPage); + } + }else{ + if( pPage->nOverflow>0 || + (!insert && pPage->nFree>pPage->pBt->usableSize*2/3) ){ + rc = balance_nonroot(pPage); + } + } + return rc; +} + +/* +** This routine checks all cursors that point to table pgnoRoot. +** If any of those cursors were opened with wrFlag==0 in a different +** database connection (a database connection that shares the pager +** cache with the current connection) and that other connection +** is not in the ReadUncommmitted state, then this routine returns +** SQLITE_LOCKED. +** +** In addition to checking for read-locks (where a read-lock +** means a cursor opened with wrFlag==0) this routine also moves +** all write cursors so that they are pointing to the +** first Cell on the root page. This is necessary because an insert +** or delete might change the number of cells on a page or delete +** a page entirely and we do not want to leave any cursors +** pointing to non-existant pages or cells. +*/ +static int checkReadLocks(Btree *pBtree, Pgno pgnoRoot, BtCursor *pExclude){ + BtCursor *p; + BtShared *pBt = pBtree->pBt; + sqlite3 *db = pBtree->pSqlite; + assert( sqlite3BtreeHoldsMutex(pBtree) ); + for(p=pBt->pCursor; p; p=p->pNext){ + if( p==pExclude ) continue; + if( p->eState!=CURSOR_VALID ) continue; + if( p->pgnoRoot!=pgnoRoot ) continue; + if( p->wrFlag==0 ){ + sqlite3 *dbOther = p->pBtree->pSqlite; + if( dbOther==0 || + (dbOther!=db && (dbOther->flags & SQLITE_ReadUncommitted)==0) ){ + return SQLITE_LOCKED; + } + }else if( p->pPage->pgno!=p->pgnoRoot ){ + moveToRoot(p); + } + } + return SQLITE_OK; +} + +/* +** Insert a new record into the BTree. The key is given by (pKey,nKey) +** and the data is given by (pData,nData). The cursor is used only to +** define what table the record should be inserted into. The cursor +** is left pointing at a random location. +** +** For an INTKEY table, only the nKey value of the key is used. pKey is +** ignored. For a ZERODATA table, the pData and nData are both ignored. +*/ +int sqlite3BtreeInsert( + BtCursor *pCur, /* Insert data into the table of this cursor */ + const void *pKey, i64 nKey, /* The key of the new record */ + const void *pData, int nData, /* The data of the new record */ + int nZero, /* Number of extra 0 bytes to append to data */ + int appendBias /* True if this is likely an append */ +){ + int rc; + int loc; + int szNew; + MemPage *pPage; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + unsigned char *oldCell; + unsigned char *newCell = 0; + + assert( cursorHoldsMutex(pCur) ); + if( pBt->inTransaction!=TRANS_WRITE ){ + /* Must start a transaction before doing an insert */ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + return rc; + } + assert( !pBt->readOnly ); + if( !pCur->wrFlag ){ + return SQLITE_PERM; /* Cursor not open for writing */ + } + if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){ + return SQLITE_LOCKED; /* The table pCur points to has a read lock */ + } + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skip; + } + + /* Save the positions of any other cursors open on this table */ + clearCursorPosition(pCur); + if( + SQLITE_OK!=(rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur)) || + SQLITE_OK!=(rc = sqlite3BtreeMoveto(pCur, pKey, nKey, appendBias, &loc)) + ){ + return rc; + } + + pPage = pCur->pPage; + assert( pPage->intKey || nKey>=0 ); + assert( pPage->leaf || !pPage->leafData ); + TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", + pCur->pgnoRoot, nKey, nData, pPage->pgno, + loc==0 ? "overwrite" : "new entry")); + assert( pPage->isInit ); + newCell = sqlite3_malloc( MX_CELL_SIZE(pBt) ); + if( newCell==0 ) return SQLITE_NOMEM; + rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew); + if( rc ) goto end_insert; + assert( szNew==cellSizePtr(pPage, newCell) ); + assert( szNew<=MX_CELL_SIZE(pBt) ); + if( loc==0 && CURSOR_VALID==pCur->eState ){ + int szOld; + assert( pCur->idx>=0 && pCur->idxnCell ); + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ){ + goto end_insert; + } + oldCell = findCell(pPage, pCur->idx); + if( !pPage->leaf ){ + memcpy(newCell, oldCell, 4); + } + szOld = cellSizePtr(pPage, oldCell); + rc = clearCell(pPage, oldCell); + if( rc ) goto end_insert; + dropCell(pPage, pCur->idx, szOld); + }else if( loc<0 && pPage->nCell>0 ){ + assert( pPage->leaf ); + pCur->idx++; + pCur->info.nSize = 0; + }else{ + assert( pPage->leaf ); + } + rc = insertCell(pPage, pCur->idx, newCell, szNew, 0, 0); + if( rc!=SQLITE_OK ) goto end_insert; + rc = balance(pPage, 1); + /* sqlite3BtreePageDump(pCur->pBt, pCur->pgnoRoot, 1); */ + /* fflush(stdout); */ + if( rc==SQLITE_OK ){ + moveToRoot(pCur); + } +end_insert: + sqlite3_free(newCell); + return rc; +} + +/* +** Delete the entry that the cursor is pointing to. The cursor +** is left pointing at a random location. +*/ +int sqlite3BtreeDelete(BtCursor *pCur){ + MemPage *pPage = pCur->pPage; + unsigned char *pCell; + int rc; + Pgno pgnoChild = 0; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + + assert( cursorHoldsMutex(pCur) ); + assert( pPage->isInit ); + if( pBt->inTransaction!=TRANS_WRITE ){ + /* Must start a transaction before doing a delete */ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + return rc; + } + assert( !pBt->readOnly ); + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skip; + } + if( pCur->idx >= pPage->nCell ){ + return SQLITE_ERROR; /* The cursor is not pointing to anything */ + } + if( !pCur->wrFlag ){ + return SQLITE_PERM; /* Did not open this cursor for writing */ + } + if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){ + return SQLITE_LOCKED; /* The table pCur points to has a read lock */ + } + + /* Restore the current cursor position (a no-op if the cursor is not in + ** CURSOR_REQUIRESEEK state) and save the positions of any other cursors + ** open on the same table. Then call sqlite3PagerWrite() on the page + ** that the entry will be deleted from. + */ + if( + (rc = restoreOrClearCursorPosition(pCur))!=0 || + (rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur))!=0 || + (rc = sqlite3PagerWrite(pPage->pDbPage))!=0 + ){ + return rc; + } + + /* Locate the cell within it's page and leave pCell pointing to the + ** data. The clearCell() call frees any overflow pages associated with the + ** cell. The cell itself is still intact. + */ + pCell = findCell(pPage, pCur->idx); + if( !pPage->leaf ){ + pgnoChild = get4byte(pCell); + } + rc = clearCell(pPage, pCell); + if( rc ){ + return rc; + } + + if( !pPage->leaf ){ + /* + ** The entry we are about to delete is not a leaf so if we do not + ** do something we will leave a hole on an internal page. + ** We have to fill the hole by moving in a cell from a leaf. The + ** next Cell after the one to be deleted is guaranteed to exist and + ** to be a leaf so we can use it. + */ + BtCursor leafCur; + unsigned char *pNext; + int szNext; /* The compiler warning is wrong: szNext is always + ** initialized before use. Adding an extra initialization + ** to silence the compiler slows down the code. */ + int notUsed; + unsigned char *tempCell = 0; + assert( !pPage->leafData ); + sqlite3BtreeGetTempCursor(pCur, &leafCur); + rc = sqlite3BtreeNext(&leafCur, ¬Used); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(leafCur.pPage->pDbPage); + } + if( rc==SQLITE_OK ){ + TRACE(("DELETE: table=%d delete internal from %d replace from leaf %d\n", + pCur->pgnoRoot, pPage->pgno, leafCur.pPage->pgno)); + dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell)); + pNext = findCell(leafCur.pPage, leafCur.idx); + szNext = cellSizePtr(leafCur.pPage, pNext); + assert( MX_CELL_SIZE(pBt)>=szNext+4 ); + tempCell = sqlite3_malloc( MX_CELL_SIZE(pBt) ); + if( tempCell==0 ){ + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + rc = insertCell(pPage, pCur->idx, pNext-4, szNext+4, tempCell, 0); + } + if( rc==SQLITE_OK ){ + put4byte(findOverflowCell(pPage, pCur->idx), pgnoChild); + rc = balance(pPage, 0); + } + if( rc==SQLITE_OK ){ + dropCell(leafCur.pPage, leafCur.idx, szNext); + rc = balance(leafCur.pPage, 0); + } + sqlite3_free(tempCell); + sqlite3BtreeReleaseTempCursor(&leafCur); + }else{ + TRACE(("DELETE: table=%d delete from leaf %d\n", + pCur->pgnoRoot, pPage->pgno)); + dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell)); + rc = balance(pPage, 0); + } + if( rc==SQLITE_OK ){ + moveToRoot(pCur); + } + return rc; +} + +/* +** Create a new BTree table. Write into *piTable the page +** number for the root page of the new table. +** +** The type of type is determined by the flags parameter. Only the +** following values of flags are currently in use. Other values for +** flags might not work: +** +** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys +** BTREE_ZERODATA Used for SQL indices +*/ +static int btreeCreateTable(Btree *p, int *piTable, int flags){ + BtShared *pBt = p->pBt; + MemPage *pRoot; + Pgno pgnoRoot; + int rc; + + assert( sqlite3BtreeHoldsMutex(p) ); + if( pBt->inTransaction!=TRANS_WRITE ){ + /* Must start a transaction first */ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + return rc; + } + assert( !pBt->readOnly ); + +#ifdef SQLITE_OMIT_AUTOVACUUM + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ){ + return rc; + } +#else + if( pBt->autoVacuum ){ + Pgno pgnoMove; /* Move a page here to make room for the root-page */ + MemPage *pPageMove; /* The page to move to. */ + + /* Creating a new table may probably require moving an existing database + ** to make room for the new tables root page. In case this page turns + ** out to be an overflow page, delete all overflow page-map caches + ** held by open cursors. + */ + invalidateAllOverflowCache(pBt); + + /* Read the value of meta[3] from the database to determine where the + ** root page of the new table should go. meta[3] is the largest root-page + ** created so far, so the new root-page is (meta[3]+1). + */ + rc = sqlite3BtreeGetMeta(p, 4, &pgnoRoot); + if( rc!=SQLITE_OK ){ + return rc; + } + pgnoRoot++; + + /* The new root-page may not be allocated on a pointer-map page, or the + ** PENDING_BYTE page. + */ + if( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) || + pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ + pgnoRoot++; + } + assert( pgnoRoot>=3 ); + + /* Allocate a page. The page that currently resides at pgnoRoot will + ** be moved to the allocated page (unless the allocated page happens + ** to reside at pgnoRoot). + */ + rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, 1); + if( rc!=SQLITE_OK ){ + return rc; + } + + if( pgnoMove!=pgnoRoot ){ + /* pgnoRoot is the page that will be used for the root-page of + ** the new table (assuming an error did not occur). But we were + ** allocated pgnoMove. If required (i.e. if it was not allocated + ** by extending the file), the current page at position pgnoMove + ** is already journaled. + */ + u8 eType; + Pgno iPtrPage; + + releasePage(pPageMove); + + /* Move the page currently at pgnoRoot to pgnoMove. */ + rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); + if( rc!=SQLITE_OK || eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ + releasePage(pRoot); + return rc; + } + assert( eType!=PTRMAP_ROOTPAGE ); + assert( eType!=PTRMAP_FREEPAGE ); + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove); + releasePage(pRoot); + + /* Obtain the page at pgnoRoot */ + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + }else{ + pRoot = pPageMove; + } + + /* Update the pointer-map and meta-data with the new root-page number. */ + rc = ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0); + if( rc ){ + releasePage(pRoot); + return rc; + } + rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); + if( rc ){ + releasePage(pRoot); + return rc; + } + + }else{ + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ) return rc; + } +#endif + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + zeroPage(pRoot, flags | PTF_LEAF); + sqlite3PagerUnref(pRoot->pDbPage); + *piTable = (int)pgnoRoot; + return SQLITE_OK; +} +int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCreateTable(p, piTable, flags); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Erase the given database page and all its children. Return +** the page to the freelist. +*/ +static int clearDatabasePage( + BtShared *pBt, /* The BTree that contains the table */ + Pgno pgno, /* Page number to clear */ + MemPage *pParent, /* Parent page. NULL for the root */ + int freePageFlag /* Deallocate page if true */ +){ + MemPage *pPage = 0; + int rc; + unsigned char *pCell; + int i; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno>sqlite3PagerPagecount(pBt->pPager) ){ + return SQLITE_CORRUPT_BKPT; + } + + rc = getAndInitPage(pBt, pgno, &pPage, pParent); + if( rc ) goto cleardatabasepage_out; + for(i=0; inCell; i++){ + pCell = findCell(pPage, i); + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(pCell), pPage->pParent, 1); + if( rc ) goto cleardatabasepage_out; + } + rc = clearCell(pPage, pCell); + if( rc ) goto cleardatabasepage_out; + } + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), pPage->pParent, 1); + if( rc ) goto cleardatabasepage_out; + } + if( freePageFlag ){ + rc = freePage(pPage); + }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ + zeroPage(pPage, pPage->aData[0] | PTF_LEAF); + } + +cleardatabasepage_out: + releasePage(pPage); + return rc; +} + +/* +** Delete all information from a single table in the database. iTable is +** the page number of the root of the table. After this routine returns, +** the root page is empty, but still exists. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** read cursors on the table. Open write cursors are moved to the +** root of the table. +*/ +int sqlite3BtreeClearTable(Btree *p, int iTable){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( p->inTrans!=TRANS_WRITE ){ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + }else if( (rc = checkReadLocks(p, iTable, 0))!=SQLITE_OK ){ + /* nothing to do */ + }else if( SQLITE_OK!=(rc = saveAllCursors(pBt, iTable, 0)) ){ + /* nothing to do */ + }else{ + rc = clearDatabasePage(pBt, (Pgno)iTable, 0, 0); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Erase all information in a table and add the root of the table to +** the freelist. Except, the root of the principle table (the one on +** page 1) is never added to the freelist. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** cursors on the table. +** +** If AUTOVACUUM is enabled and the page at iTable is not the last +** root page in the database file, then the last root page +** in the database file is moved into the slot formerly occupied by +** iTable and that last slot formerly occupied by the last root page +** is added to the freelist instead of iTable. In this say, all +** root pages are kept at the beginning of the database file, which +** is necessary for AUTOVACUUM to work right. *piMoved is set to the +** page number that used to be the last root page in the file before +** the move. If no page gets moved, *piMoved is set to 0. +** The last root page is recorded in meta[3] and the value of +** meta[3] is updated by this procedure. +*/ +static int btreeDropTable(Btree *p, int iTable, int *piMoved){ + int rc; + MemPage *pPage = 0; + BtShared *pBt = p->pBt; + + assert( sqlite3BtreeHoldsMutex(p) ); + if( p->inTrans!=TRANS_WRITE ){ + return pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + } + + /* It is illegal to drop a table if any cursors are open on the + ** database. This is because in auto-vacuum mode the backend may + ** need to move another root-page to fill a gap left by the deleted + ** root page. If an open cursor was using this page a problem would + ** occur. + */ + if( pBt->pCursor ){ + return SQLITE_LOCKED; + } + + rc = sqlite3BtreeGetPage(pBt, (Pgno)iTable, &pPage, 0); + if( rc ) return rc; + rc = sqlite3BtreeClearTable(p, iTable); + if( rc ){ + releasePage(pPage); + return rc; + } + + *piMoved = 0; + + if( iTable>1 ){ +#ifdef SQLITE_OMIT_AUTOVACUUM + rc = freePage(pPage); + releasePage(pPage); +#else + if( pBt->autoVacuum ){ + Pgno maxRootPgno; + rc = sqlite3BtreeGetMeta(p, 4, &maxRootPgno); + if( rc!=SQLITE_OK ){ + releasePage(pPage); + return rc; + } + + if( iTable==maxRootPgno ){ + /* If the table being dropped is the table with the largest root-page + ** number in the database, put the root page on the free list. + */ + rc = freePage(pPage); + releasePage(pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + /* The table being dropped does not have the largest root-page + ** number in the database. So move the page that does into the + ** gap left by the deleted root-page. + */ + MemPage *pMove; + releasePage(pPage); + rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = freePage(pMove); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + *piMoved = maxRootPgno; + } + + /* Set the new 'max-root-page' value in the database header. This + ** is the old value less one, less one more if that happens to + ** be a root-page number, less one again if that is the + ** PENDING_BYTE_PAGE. + */ + maxRootPgno--; + if( maxRootPgno==PENDING_BYTE_PAGE(pBt) ){ + maxRootPgno--; + } + if( maxRootPgno==PTRMAP_PAGENO(pBt, maxRootPgno) ){ + maxRootPgno--; + } + assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + + rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); + }else{ + rc = freePage(pPage); + releasePage(pPage); + } +#endif + }else{ + /* If sqlite3BtreeDropTable was called on page 1. */ + zeroPage(pPage, PTF_INTKEY|PTF_LEAF ); + releasePage(pPage); + } + return rc; +} +int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeDropTable(p, iTable, piMoved); + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** Read the meta-information out of a database file. Meta[0] +** is the number of free pages currently in the database. Meta[1] +** through meta[15] are available for use by higher layers. Meta[0] +** is read-only, the others are read/write. +** +** The schema layer numbers meta values differently. At the schema +** layer (and the SetCookie and ReadCookie opcodes) the number of +** free pages is not visible. So Cookie[0] is the same as Meta[1]. +*/ +int sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ + DbPage *pDbPage; + int rc; + unsigned char *pP1; + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + + /* Reading a meta-data value requires a read-lock on page 1 (and hence + ** the sqlite_master table. We grab this lock regardless of whether or + ** not the SQLITE_ReadUncommitted flag is set (the table rooted at page + ** 1 is treated as a special case by queryTableLock() and lockTable()). + */ + rc = queryTableLock(p, 1, READ_LOCK); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + + assert( idx>=0 && idx<=15 ); + rc = sqlite3PagerGet(pBt->pPager, 1, &pDbPage); + if( rc ){ + sqlite3BtreeLeave(p); + return rc; + } + pP1 = (unsigned char *)sqlite3PagerGetData(pDbPage); + *pMeta = get4byte(&pP1[36 + idx*4]); + sqlite3PagerUnref(pDbPage); + + /* If autovacuumed is disabled in this build but we are trying to + ** access an autovacuumed database, then make the database readonly. + */ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( idx==4 && *pMeta>0 ) pBt->readOnly = 1; +#endif + + /* Grab the read-lock on page 1. */ + rc = lockTable(p, 1, READ_LOCK); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Write meta-information back into the database. Meta[0] is +** read-only and may not be written. +*/ +int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ + BtShared *pBt = p->pBt; + unsigned char *pP1; + int rc; + assert( idx>=1 && idx<=15 ); + sqlite3BtreeEnter(p); + if( p->inTrans!=TRANS_WRITE ){ + rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; + }else{ + assert( pBt->pPage1!=0 ); + pP1 = pBt->pPage1->aData; + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pP1[36 + idx*4], iMeta); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( idx==7 ){ + assert( pBt->autoVacuum || iMeta==0 ); + assert( iMeta==0 || iMeta==1 ); + pBt->incrVacuum = iMeta; + } +#endif + } + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Return the flag byte at the beginning of the page that the cursor +** is currently pointing to. +*/ +int sqlite3BtreeFlags(BtCursor *pCur){ + /* TODO: What about CURSOR_REQUIRESEEK state? Probably need to call + ** restoreOrClearCursorPosition() here. + */ + MemPage *pPage = pCur->pPage; + assert( cursorHoldsMutex(pCur) ); + assert( pPage->pBt==pCur->pBt ); + return pPage ? pPage->aData[pPage->hdrOffset] : 0; +} + + +/* +** Return the pager associated with a BTree. This routine is used for +** testing and debugging only. +*/ +Pager *sqlite3BtreePager(Btree *p){ + return p->pBt->pPager; +} + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Append a message to the error message string. +*/ +static void checkAppendMsg( + IntegrityCk *pCheck, + char *zMsg1, + const char *zFormat, + ... +){ + va_list ap; + char *zMsg2; + if( !pCheck->mxErr ) return; + pCheck->mxErr--; + pCheck->nErr++; + va_start(ap, zFormat); + zMsg2 = sqlite3VMPrintf(0, zFormat, ap); + va_end(ap); + if( zMsg1==0 ) zMsg1 = ""; + if( pCheck->zErrMsg ){ + char *zOld = pCheck->zErrMsg; + pCheck->zErrMsg = 0; + sqlite3SetString(&pCheck->zErrMsg, zOld, "\n", zMsg1, zMsg2, (char*)0); + sqlite3_free(zOld); + }else{ + sqlite3SetString(&pCheck->zErrMsg, zMsg1, zMsg2, (char*)0); + } + sqlite3_free(zMsg2); +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Add 1 to the reference count for page iPage. If this is the second +** reference to the page, add an error message to pCheck->zErrMsg. +** Return 1 if there are 2 ore more references to the page and 0 if +** if this is the first reference to the page. +** +** Also check that the page number is in bounds. +*/ +static int checkRef(IntegrityCk *pCheck, int iPage, char *zContext){ + if( iPage==0 ) return 1; + if( iPage>pCheck->nPage || iPage<0 ){ + checkAppendMsg(pCheck, zContext, "invalid page number %d", iPage); + return 1; + } + if( pCheck->anRef[iPage]==1 ){ + checkAppendMsg(pCheck, zContext, "2nd reference to page %d", iPage); + return 1; + } + return (pCheck->anRef[iPage]++)>1; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Check that the entry in the pointer-map for page iChild maps to +** page iParent, pointer type ptrType. If not, append an error message +** to pCheck. +*/ +static void checkPtrmap( + IntegrityCk *pCheck, /* Integrity check context */ + Pgno iChild, /* Child page number */ + u8 eType, /* Expected pointer map type */ + Pgno iParent, /* Expected pointer map parent page number */ + char *zContext /* Context description (used for error msg) */ +){ + int rc; + u8 ePtrmapType; + Pgno iPtrmapParent; + + rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); + if( rc!=SQLITE_OK ){ + checkAppendMsg(pCheck, zContext, "Failed to read ptrmap key=%d", iChild); + return; + } + + if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ + checkAppendMsg(pCheck, zContext, + "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + iChild, eType, iParent, ePtrmapType, iPtrmapParent); + } +} +#endif + +/* +** Check the integrity of the freelist or of an overflow page list. +** Verify that the number of pages on the list is N. +*/ +static void checkList( + IntegrityCk *pCheck, /* Integrity checking context */ + int isFreeList, /* True for a freelist. False for overflow page list */ + int iPage, /* Page number for first page in the list */ + int N, /* Expected number of pages in the list */ + char *zContext /* Context for error messages */ +){ + int i; + int expected = N; + int iFirst = iPage; + while( N-- > 0 && pCheck->mxErr ){ + DbPage *pOvflPage; + unsigned char *pOvflData; + if( iPage<1 ){ + checkAppendMsg(pCheck, zContext, + "%d of %d pages missing from overflow list starting at %d", + N+1, expected, iFirst); + break; + } + if( checkRef(pCheck, iPage, zContext) ) break; + if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage) ){ + checkAppendMsg(pCheck, zContext, "failed to get page %d", iPage); + break; + } + pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); + if( isFreeList ){ + int n = get4byte(&pOvflData[4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext); + } +#endif + if( n>pCheck->pBt->usableSize/4-8 ){ + checkAppendMsg(pCheck, zContext, + "freelist leaf count too big on page %d", iPage); + N--; + }else{ + for(i=0; ipBt->autoVacuum ){ + checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0, zContext); + } +#endif + checkRef(pCheck, iFreePage, zContext); + } + N -= n; + } + } +#ifndef SQLITE_OMIT_AUTOVACUUM + else{ + /* If this database supports auto-vacuum and iPage is not the last + ** page in this overflow list, check that the pointer-map entry for + ** the following page matches iPage. + */ + if( pCheck->pBt->autoVacuum && N>0 ){ + i = get4byte(pOvflData); + checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage, zContext); + } + } +#endif + iPage = get4byte(pOvflData); + sqlite3PagerUnref(pOvflPage); + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Do various sanity checks on a single page of a tree. Return +** the tree depth. Root pages return 0. Parents of root pages +** return 1, and so forth. +** +** These checks are done: +** +** 1. Make sure that cells and freeblocks do not overlap +** but combine to completely cover the page. +** NO 2. Make sure cell keys are in order. +** NO 3. Make sure no key is less than or equal to zLowerBound. +** NO 4. Make sure no key is greater than or equal to zUpperBound. +** 5. Check the integrity of overflow pages. +** 6. Recursively call checkTreePage on all children. +** 7. Verify that the depth of all children is the same. +** 8. Make sure this page is at least 33% full or else it is +** the root of the tree. +*/ +static int checkTreePage( + IntegrityCk *pCheck, /* Context for the sanity check */ + int iPage, /* Page number of the page to check */ + MemPage *pParent, /* Parent page */ + char *zParentContext /* Parent context */ +){ + MemPage *pPage; + int i, rc, depth, d2, pgno, cnt; + int hdr, cellStart; + int nCell; + u8 *data; + BtShared *pBt; + int usableSize; + char zContext[100]; + char *hit; + + sqlite3_snprintf(sizeof(zContext), zContext, "Page %d: ", iPage); + + /* Check that the page exists + */ + pBt = pCheck->pBt; + usableSize = pBt->usableSize; + if( iPage==0 ) return 0; + if( checkRef(pCheck, iPage, zParentContext) ) return 0; + if( (rc = sqlite3BtreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){ + checkAppendMsg(pCheck, zContext, + "unable to get the page. error code=%d", rc); + return 0; + } + if( (rc = sqlite3BtreeInitPage(pPage, pParent))!=0 ){ + checkAppendMsg(pCheck, zContext, + "sqlite3BtreeInitPage() returns error code %d", rc); + releasePage(pPage); + return 0; + } + + /* Check out all the cells. + */ + depth = 0; + for(i=0; inCell && pCheck->mxErr; i++){ + u8 *pCell; + int sz; + CellInfo info; + + /* Check payload overflow pages + */ + sqlite3_snprintf(sizeof(zContext), zContext, + "On tree page %d cell %d: ", iPage, i); + pCell = findCell(pPage,i); + sqlite3BtreeParseCellPtr(pPage, pCell, &info); + sz = info.nData; + if( !pPage->intKey ) sz += info.nKey; + assert( sz==info.nPayload ); + if( sz>info.nLocal ){ + int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4); + Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage, zContext); + } +#endif + checkList(pCheck, 0, pgnoOvfl, nPage, zContext); + } + + /* Check sanity of left child page. + */ + if( !pPage->leaf ){ + pgno = get4byte(pCell); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext); + } +#endif + d2 = checkTreePage(pCheck,pgno,pPage,zContext); + if( i>0 && d2!=depth ){ + checkAppendMsg(pCheck, zContext, "Child page depth differs"); + } + depth = d2; + } + } + if( !pPage->leaf ){ + pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + sqlite3_snprintf(sizeof(zContext), zContext, + "On page %d at right child: ", iPage); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, 0); + } +#endif + checkTreePage(pCheck, pgno, pPage, zContext); + } + + /* Check for complete coverage of the page + */ + data = pPage->aData; + hdr = pPage->hdrOffset; + hit = sqlite3MallocZero( usableSize ); + if( hit ){ + memset(hit, 1, get2byte(&data[hdr+5])); + nCell = get2byte(&data[hdr+3]); + cellStart = hdr + 12 - 4*pPage->leaf; + for(i=0; i=usableSize || pc<0 ){ + checkAppendMsg(pCheck, 0, + "Corruption detected in cell %d on page %d",i,iPage,0); + }else{ + for(j=pc+size-1; j>=pc; j--) hit[j]++; + } + } + for(cnt=0, i=get2byte(&data[hdr+1]); i>0 && i=usableSize || i<0 ){ + checkAppendMsg(pCheck, 0, + "Corruption detected in cell %d on page %d",i,iPage,0); + }else{ + for(j=i+size-1; j>=i; j--) hit[j]++; + } + i = get2byte(&data[i]); + } + for(i=cnt=0; i1 ){ + checkAppendMsg(pCheck, 0, + "Multiple uses for byte %d of page %d", i, iPage); + break; + } + } + if( cnt!=data[hdr+7] ){ + checkAppendMsg(pCheck, 0, + "Fragmented space is %d byte reported as %d on page %d", + cnt, data[hdr+7], iPage); + } + } + sqlite3_free(hit); + + releasePage(pPage); + return depth+1; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** This routine does a complete check of the given BTree file. aRoot[] is +** an array of pages numbers were each page number is the root page of +** a table. nRoot is the number of entries in aRoot. +** +** If everything checks out, this routine returns NULL. If something is +** amiss, an error message is written into memory obtained from malloc() +** and a pointer to that error message is returned. The calling function +** is responsible for freeing the error message when it is done. +*/ +char *sqlite3BtreeIntegrityCheck( + Btree *p, /* The btree to be checked */ + int *aRoot, /* An array of root pages numbers for individual trees */ + int nRoot, /* Number of entries in aRoot[] */ + int mxErr, /* Stop reporting errors after this many */ + int *pnErr /* Write number of errors seen to this variable */ +){ + int i; + int nRef; + IntegrityCk sCheck; + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + nRef = sqlite3PagerRefcount(pBt->pPager); + if( lockBtreeWithRetry(p)!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return sqlite3StrDup("Unable to acquire a read lock on the database"); + } + sCheck.pBt = pBt; + sCheck.pPager = pBt->pPager; + sCheck.nPage = sqlite3PagerPagecount(sCheck.pPager); + sCheck.mxErr = mxErr; + sCheck.nErr = 0; + *pnErr = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->nTrunc!=0 ){ + sCheck.nPage = pBt->nTrunc; + } +#endif + if( sCheck.nPage==0 ){ + unlockBtreeIfUnused(pBt); + sqlite3BtreeLeave(p); + return 0; + } + sCheck.anRef = sqlite3_malloc( (sCheck.nPage+1)*sizeof(sCheck.anRef[0]) ); + if( !sCheck.anRef ){ + unlockBtreeIfUnused(pBt); + *pnErr = 1; + sqlite3BtreeLeave(p); + return sqlite3MPrintf(p->pSqlite, "Unable to malloc %d bytes", + (sCheck.nPage+1)*sizeof(sCheck.anRef[0])); + } + for(i=0; i<=sCheck.nPage; i++){ sCheck.anRef[i] = 0; } + i = PENDING_BYTE_PAGE(pBt); + if( i<=sCheck.nPage ){ + sCheck.anRef[i] = 1; + } + sCheck.zErrMsg = 0; + + /* Check the integrity of the freelist + */ + checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), + get4byte(&pBt->pPage1->aData[36]), "Main freelist: "); + + /* Check all the tables. + */ + for(i=0; iautoVacuum && aRoot[i]>1 ){ + checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0, 0); + } +#endif + checkTreePage(&sCheck, aRoot[i], 0, "List of tree roots: "); + } + + /* Make sure every page in the file is referenced + */ + for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( sCheck.anRef[i]==0 ){ + checkAppendMsg(&sCheck, 0, "Page %d is never used", i); + } +#else + /* If the database supports auto-vacuum, make sure no tables contain + ** references to pointer-map pages. + */ + if( sCheck.anRef[i]==0 && + (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, 0, "Page %d is never used", i); + } + if( sCheck.anRef[i]!=0 && + (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, 0, "Pointer map page %d is referenced", i); + } +#endif + } + + /* Make sure this analysis did not leave any unref() pages + */ + unlockBtreeIfUnused(pBt); + if( nRef != sqlite3PagerRefcount(pBt->pPager) ){ + checkAppendMsg(&sCheck, 0, + "Outstanding page count goes from %d to %d during this analysis", + nRef, sqlite3PagerRefcount(pBt->pPager) + ); + } + + /* Clean up and report errors. + */ + sqlite3BtreeLeave(p); + sqlite3_free(sCheck.anRef); + *pnErr = sCheck.nErr; + return sCheck.zErrMsg; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** Return the full pathname of the underlying database file. +** +** The pager filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +const char *sqlite3BtreeGetFilename(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerFilename(p->pBt->pPager); +} + +/* +** Return the pathname of the directory that contains the database file. +** +** The pager directory name is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +const char *sqlite3BtreeGetDirname(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerDirname(p->pBt->pPager); +} + +/* +** Return the pathname of the journal file for this database. The return +** value of this routine is the same regardless of whether the journal file +** has been created or not. +** +** The pager journal filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +const char *sqlite3BtreeGetJournalname(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerJournalname(p->pBt->pPager); +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Copy the complete content of pBtFrom into pBtTo. A transaction +** must be active for both files. +** +** The size of file pBtFrom may be reduced by this operation. +** If anything goes wrong, the transaction on pBtFrom is rolled back. +*/ +static int btreeCopyFile(Btree *pTo, Btree *pFrom){ + int rc = SQLITE_OK; + Pgno i, nPage, nToPage, iSkip; + + BtShared *pBtTo = pTo->pBt; + BtShared *pBtFrom = pFrom->pBt; + + if( pTo->inTrans!=TRANS_WRITE || pFrom->inTrans!=TRANS_WRITE ){ + return SQLITE_ERROR; + } + if( pBtTo->pCursor ) return SQLITE_BUSY; + nToPage = sqlite3PagerPagecount(pBtTo->pPager); + nPage = sqlite3PagerPagecount(pBtFrom->pPager); + iSkip = PENDING_BYTE_PAGE(pBtTo); + for(i=1; rc==SQLITE_OK && i<=nPage; i++){ + DbPage *pDbPage; + if( i==iSkip ) continue; + rc = sqlite3PagerGet(pBtFrom->pPager, i, &pDbPage); + if( rc ) break; + rc = sqlite3PagerOverwrite(pBtTo->pPager, i, sqlite3PagerGetData(pDbPage)); + sqlite3PagerUnref(pDbPage); + } + + /* If the file is shrinking, journal the pages that are being truncated + ** so that they can be rolled back if the commit fails. + */ + for(i=nPage+1; rc==SQLITE_OK && i<=nToPage; i++){ + DbPage *pDbPage; + if( i==iSkip ) continue; + rc = sqlite3PagerGet(pBtTo->pPager, i, &pDbPage); + if( rc ) break; + rc = sqlite3PagerWrite(pDbPage); + sqlite3PagerDontWrite(pDbPage); + /* Yeah. It seems wierd to call DontWrite() right after Write(). But + ** that is because the names of those procedures do not exactly + ** represent what they do. Write() really means "put this page in the + ** rollback journal and mark it as dirty so that it will be written + ** to the database file later." DontWrite() undoes the second part of + ** that and prevents the page from being written to the database. The + ** page is still on the rollback journal, though. And that is the whole + ** point of this loop: to put pages on the rollback journal. */ + sqlite3PagerUnref(pDbPage); + } + if( !rc && nPagepPager, nPage); + } + + if( rc ){ + sqlite3BtreeRollback(pTo); + } + return rc; +} +int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ + int rc; + sqlite3BtreeEnter(pTo); + sqlite3BtreeEnter(pFrom); + rc = btreeCopyFile(pTo, pFrom); + sqlite3BtreeLeave(pFrom); + sqlite3BtreeLeave(pTo); + return rc; +} + +#endif /* SQLITE_OMIT_VACUUM */ + +/* +** Return non-zero if a transaction is active. +*/ +int sqlite3BtreeIsInTrans(Btree *p){ + assert( p==0 || sqlite3_mutex_held(p->pSqlite->mutex) ); + return (p && (p->inTrans==TRANS_WRITE)); +} + +/* +** Return non-zero if a statement transaction is active. +*/ +int sqlite3BtreeIsInStmt(Btree *p){ + assert( sqlite3BtreeHoldsMutex(p) ); + return (p->pBt && p->pBt->inStmt); +} + +/* +** Return non-zero if a read (or write) transaction is active. +*/ +int sqlite3BtreeIsInReadTrans(Btree *p){ + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + return (p && (p->inTrans!=TRANS_NONE)); +} + +/* +** This function returns a pointer to a blob of memory associated with +** a single shared-btree. The memory is used by client code for it's own +** purposes (for example, to store a high-level schema associated with +** the shared-btree). The btree layer manages reference counting issues. +** +** The first time this is called on a shared-btree, nBytes bytes of memory +** are allocated, zeroed, and returned to the caller. For each subsequent +** call the nBytes parameter is ignored and a pointer to the same blob +** of memory returned. +** +** Just before the shared-btree is closed, the function passed as the +** xFree argument when the memory allocation was made is invoked on the +** blob of allocated memory. This function should not call sqlite3_free() +** on the memory, the btree layer does that. +*/ +void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( !pBt->pSchema ){ + pBt->pSchema = sqlite3MallocZero(nBytes); + pBt->xFreeSchema = xFree; + } + sqlite3BtreeLeave(p); + return pBt->pSchema; +} + +/* +** Return true if another user of the same shared btree as the argument +** handle holds an exclusive lock on the sqlite_master table. +*/ +int sqlite3BtreeSchemaLocked(Btree *p){ + int rc; + assert( sqlite3_mutex_held(p->pSqlite->mutex) ); + sqlite3BtreeEnter(p); + rc = (queryTableLock(p, MASTER_ROOT, READ_LOCK)!=SQLITE_OK); + sqlite3BtreeLeave(p); + return rc; +} + + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Obtain a lock on the table whose root page is iTab. The +** lock is a write lock if isWritelock is true or a read lock +** if it is false. +*/ +int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ + int rc = SQLITE_OK; + u8 lockType = (isWriteLock?WRITE_LOCK:READ_LOCK); + sqlite3BtreeEnter(p); + rc = queryTableLock(p, iTab, lockType); + if( rc==SQLITE_OK ){ + rc = lockTable(p, iTab, lockType); + } + sqlite3BtreeLeave(p); + return rc; +} +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Argument pCsr must be a cursor opened for writing on an +** INTKEY table currently pointing at a valid table entry. +** This function modifies the data stored as part of that entry. +** Only the data content may only be modified, it is not possible +** to change the length of the data stored. +*/ +int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ + assert( cursorHoldsMutex(pCsr) ); + assert( sqlite3_mutex_held(pCsr->pBtree->pSqlite->mutex) ); + assert(pCsr->isIncrblobHandle); + if( pCsr->eState>=CURSOR_REQUIRESEEK ){ + if( pCsr->eState==CURSOR_FAULT ){ + return pCsr->skip; + }else{ + return SQLITE_ABORT; + } + } + + /* Check some preconditions: + ** (a) the cursor is open for writing, + ** (b) there is no read-lock on the table being modified and + ** (c) the cursor points at a valid row of an intKey table. + */ + if( !pCsr->wrFlag ){ + return SQLITE_READONLY; + } + assert( !pCsr->pBt->readOnly + && pCsr->pBt->inTransaction==TRANS_WRITE ); + if( checkReadLocks(pCsr->pBtree, pCsr->pgnoRoot, pCsr) ){ + return SQLITE_LOCKED; /* The table pCur points to has a read lock */ + } + if( pCsr->eState==CURSOR_INVALID || !pCsr->pPage->intKey ){ + return SQLITE_ERROR; + } + + return accessPayload(pCsr, offset, amt, (unsigned char *)z, 0, 1); +} + +/* +** Set a flag on this cursor to cache the locations of pages from the +** overflow list for the current row. This is used by cursors opened +** for incremental blob IO only. +** +** This function sets a flag only. The actual page location cache +** (stored in BtCursor.aOverflow[]) is allocated and used by function +** accessPayload() (the worker function for sqlite3BtreeData() and +** sqlite3BtreePutData()). +*/ +void sqlite3BtreeCacheOverflow(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); + assert(!pCur->isIncrblobHandle); + assert(!pCur->aOverflow); + pCur->isIncrblobHandle = 1; +} +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h new file mode 100644 index 0000000000..f7bc8e12d9 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h @@ -0,0 +1,204 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite B-Tree file +** subsystem. See comments in the source code for a detailed description +** of what each interface routine does. +** +** @(#) $Id: btree.h,v 1.93 2007/09/03 15:19:35 drh Exp $ +*/ +#ifndef _BTREE_H_ +#define _BTREE_H_ + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 10 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; +typedef struct BtreeMutexArray BtreeMutexArray; + +/* +** This structure records all of the Btrees that need to hold +** a mutex before we enter sqlite3VdbeExec(). The Btrees are +** are placed in aBtree[] in order of aBtree[]->pBt. That way, +** we can always lock and unlock them all quickly. +*/ +struct BtreeMutexArray { + int nMutex; + Btree *aBtree[SQLITE_MAX_ATTACHED+1]; +}; + + +int sqlite3BtreeOpen( + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not use journal. No argument */ +#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ +#define BTREE_MEMORY 4 /* In-memory DB. No argument */ +#define BTREE_READONLY 8 /* Open the database in read-only mode */ +#define BTREE_READWRITE 16 /* Open for both reading and writing */ +#define BTREE_CREATE 32 /* Create the database if it does not exist */ + +/* Additional values for the 4th argument of sqlite3BtreeOpen that +** are not associated with PAGER_ values. +*/ +#define BTREE_PRIVATE 64 /* Never share with other connections */ + +int sqlite3BtreeClose(Btree*); +int sqlite3BtreeSetBusyHandler(Btree*,BusyHandler*); +int sqlite3BtreeSetCacheSize(Btree*,int); +int sqlite3BtreeSetSafetyLevel(Btree*,int,int); +int sqlite3BtreeSyncDisabled(Btree*); +int sqlite3BtreeSetPageSize(Btree*,int,int); +int sqlite3BtreeGetPageSize(Btree*); +int sqlite3BtreeMaxPageCount(Btree*,int); +int sqlite3BtreeGetReserve(Btree*); +int sqlite3BtreeSetAutoVacuum(Btree *, int); +int sqlite3BtreeGetAutoVacuum(Btree *); +int sqlite3BtreeBeginTrans(Btree*,int); +int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); +int sqlite3BtreeCommitPhaseTwo(Btree*); +int sqlite3BtreeCommit(Btree*); +int sqlite3BtreeRollback(Btree*); +int sqlite3BtreeBeginStmt(Btree*); +int sqlite3BtreeCommitStmt(Btree*); +int sqlite3BtreeRollbackStmt(Btree*); +int sqlite3BtreeCreateTable(Btree*, int*, int flags); +int sqlite3BtreeIsInTrans(Btree*); +int sqlite3BtreeIsInStmt(Btree*); +int sqlite3BtreeIsInReadTrans(Btree*); +void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +int sqlite3BtreeSchemaLocked(Btree *); +int sqlite3BtreeLockTable(Btree *, int, u8); + +const char *sqlite3BtreeGetFilename(Btree *); +const char *sqlite3BtreeGetDirname(Btree *); +const char *sqlite3BtreeGetJournalname(Btree *); +int sqlite3BtreeCopyFile(Btree *, Btree *); + +int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the following flags: +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_ZERODATA 2 /* Table has keys only - no data */ +#define BTREE_LEAFDATA 4 /* Data stored in leaves only. Implies INTKEY */ + +int sqlite3BtreeDropTable(Btree*, int, int*); +int sqlite3BtreeClearTable(Btree*, int); +int sqlite3BtreeGetMeta(Btree*, int idx, u32 *pValue); +int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); +void sqlite3BtreeTripAllCursors(Btree*, int); + +int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + int iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + int(*)(void*,int,const void*,int,const void*), /* Key comparison function */ + void*, /* First argument to compare function */ + BtCursor **ppCursor /* Returned cursor */ +); + +int sqlite3BtreeCloseCursor(BtCursor*); +int sqlite3BtreeMoveto(BtCursor*,const void *pKey,i64 nKey,int bias,int *pRes); +int sqlite3BtreeDelete(BtCursor*); +int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, + const void *pData, int nData, + int nZero, int bias); +int sqlite3BtreeFirst(BtCursor*, int *pRes); +int sqlite3BtreeLast(BtCursor*, int *pRes); +int sqlite3BtreeNext(BtCursor*, int *pRes); +int sqlite3BtreeEof(BtCursor*); +int sqlite3BtreeFlags(BtCursor*); +int sqlite3BtreePrevious(BtCursor*, int *pRes); +int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); +int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); +sqlite3 *sqlite3BtreeCursorDb(const BtCursor*); +const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); +const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); +int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); +int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); + +char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +struct Pager *sqlite3BtreePager(Btree*); + +int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +void sqlite3BtreeCacheOverflow(BtCursor *); + +#ifdef SQLITE_TEST +int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +void sqlite3BtreeCursorList(Btree*); +int sqlite3BtreePageDump(Btree*, int, int recursive); +#endif + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE + void sqlite3BtreeEnter(Btree*); + void sqlite3BtreeLeave(Btree*); + int sqlite3BtreeHoldsMutex(Btree*); + void sqlite3BtreeEnterCursor(BtCursor*); + void sqlite3BtreeLeaveCursor(BtCursor*); + void sqlite3BtreeEnterAll(sqlite3*); + void sqlite3BtreeLeaveAll(sqlite3*); + int sqlite3BtreeHoldsAllMutexes(sqlite3*); + void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); + void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); + void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeEnterAll(X) +# define sqlite3BtreeLeaveAll(X) +# define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3BtreeMutexArrayEnter(X) +# define sqlite3BtreeMutexArrayLeave(X) +# define sqlite3BtreeMutexArrayInsert(X,Y) +#endif + + +#endif /* _BTREE_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h b/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h new file mode 100644 index 0000000000..09f1474239 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h @@ -0,0 +1,648 @@ +/* +** 2004 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** $Id: btreeInt.h,v 1.13 2007/08/30 01:19:59 drh Exp $ +** +** This file implements a external (disk-based) database using BTrees. +** For a detailed discussion of BTrees, refer to +** +** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: +** "Sorting And Searching", pages 473-480. Addison-Wesley +** Publishing Company, Reading, Massachusetts. +** +** The basic idea is that each page of the file contains N database +** entries and N+1 pointers to subpages. +** +** ---------------------------------------------------------------- +** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) | +** ---------------------------------------------------------------- +** +** All of the keys on the page that Ptr(0) points to have values less +** than Key(0). All of the keys on page Ptr(1) and its subpages have +** values greater than Key(0) and less than Key(1). All of the keys +** on Ptr(N) and its subpages have values greater than Key(N-1). And +** so forth. +** +** Finding a particular key requires reading O(log(M)) pages from the +** disk where M is the number of entries in the tree. +** +** In this implementation, a single file can hold one or more separate +** BTrees. Each BTree is identified by the index of its root page. The +** key and data for any entry are combined to form the "payload". A +** fixed amount of payload can be carried directly on the database +** page. If the payload is larger than the preset amount then surplus +** bytes are stored on overflow pages. The payload for an entry +** and the preceding pointer are combined to form a "Cell". Each +** page has a small header which contains the Ptr(N) pointer and other +** information such as the size of key and data. +** +** FORMAT DETAILS +** +** The file is divided into pages. The first page is called page 1, +** the second is page 2, and so forth. A page number of zero indicates +** "no such page". The page size can be anything between 512 and 65536. +** Each page can be either a btree page, a freelist page or an overflow +** page. +** +** The first page is always a btree page. The first 100 bytes of the first +** page contain a special header (the "file header") that describes the file. +** The format of the file header is as follows: +** +** OFFSET SIZE DESCRIPTION +** 0 16 Header string: "SQLite format 3\000" +** 16 2 Page size in bytes. +** 18 1 File format write version +** 19 1 File format read version +** 20 1 Bytes of unused space at the end of each page +** 21 1 Max embedded payload fraction +** 22 1 Min embedded payload fraction +** 23 1 Min leaf payload fraction +** 24 4 File change counter +** 28 4 Reserved for future use +** 32 4 First freelist page +** 36 4 Number of freelist pages in the file +** 40 60 15 4-byte meta values passed to higher layers +** +** All of the integer values are big-endian (most significant byte first). +** +** The file change counter is incremented when the database is changed +** This counter allows other processes to know when the file has changed +** and thus when they need to flush their cache. +** +** The max embedded payload fraction is the amount of the total usable +** space in a page that can be consumed by a single cell for standard +** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default +** is to limit the maximum cell size so that at least 4 cells will fit +** on one page. Thus the default max embedded payload fraction is 64. +** +** If the payload for a cell is larger than the max payload, then extra +** payload is spilled to overflow pages. Once an overflow page is allocated, +** as many bytes as possible are moved into the overflow pages without letting +** the cell size drop below the min embedded payload fraction. +** +** The min leaf payload fraction is like the min embedded payload fraction +** except that it applies to leaf nodes in a LEAFDATA tree. The maximum +** payload fraction for a LEAFDATA tree is always 100% (or 255) and it +** not specified in the header. +** +** Each btree pages is divided into three sections: The header, the +** cell pointer array, and the cell content area. Page 1 also has a 100-byte +** file header that occurs before the page header. +** +** |----------------| +** | file header | 100 bytes. Page 1 only. +** |----------------| +** | page header | 8 bytes for leaves. 12 bytes for interior nodes +** |----------------| +** | cell pointer | | 2 bytes per cell. Sorted order. +** | array | | Grows downward +** | | v +** |----------------| +** | unallocated | +** | space | +** |----------------| ^ Grows upwards +** | cell content | | Arbitrary order interspersed with freeblocks. +** | area | | and free space fragments. +** |----------------| +** +** The page headers looks like this: +** +** OFFSET SIZE DESCRIPTION +** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf +** 1 2 byte offset to the first freeblock +** 3 2 number of cells on this page +** 5 2 first byte of the cell content area +** 7 1 number of fragmented free bytes +** 8 4 Right child (the Ptr(N) value). Omitted on leaves. +** +** The flags define the format of this btree page. The leaf flag means that +** this page has no children. The zerodata flag means that this page carries +** only keys and no data. The intkey flag means that the key is a integer +** which is stored in the key size entry of the cell header rather than in +** the payload area. +** +** The cell pointer array begins on the first byte after the page header. +** The cell pointer array contains zero or more 2-byte numbers which are +** offsets from the beginning of the page to the cell content in the cell +** content area. The cell pointers occur in sorted order. The system strives +** to keep free space after the last cell pointer so that new cells can +** be easily added without having to defragment the page. +** +** Cell content is stored at the very end of the page and grows toward the +** beginning of the page. +** +** Unused space within the cell content area is collected into a linked list of +** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset +** to the first freeblock is given in the header. Freeblocks occur in +** increasing order. Because a freeblock must be at least 4 bytes in size, +** any group of 3 or fewer unused bytes in the cell content area cannot +** exist on the freeblock chain. A group of 3 or fewer free bytes is called +** a fragment. The total number of bytes in all fragments is recorded. +** in the page header at offset 7. +** +** SIZE DESCRIPTION +** 2 Byte offset of the next freeblock +** 2 Bytes in this freeblock +** +** Cells are of variable length. Cells are stored in the cell content area at +** the end of the page. Pointers to the cells are in the cell pointer array +** that immediately follows the page header. Cells is not necessarily +** contiguous or in order, but cell pointers are contiguous and in order. +** +** Cell content makes use of variable length integers. A variable +** length integer is 1 to 9 bytes where the lower 7 bits of each +** byte are used. The integer consists of all bytes that have bit 8 set and +** the first byte with bit 8 clear. The most significant byte of the integer +** appears first. A variable-length integer may not be more than 9 bytes long. +** As a special case, all 8 bytes of the 9th byte are used as data. This +** allows a 64-bit integer to be encoded in 9 bytes. +** +** 0x00 becomes 0x00000000 +** 0x7f becomes 0x0000007f +** 0x81 0x00 becomes 0x00000080 +** 0x82 0x00 becomes 0x00000100 +** 0x80 0x7f becomes 0x0000007f +** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 +** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 +** +** Variable length integers are used for rowids and to hold the number of +** bytes of key and data in a btree cell. +** +** The content of a cell looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of the left child. Omitted if leaf flag is set. +** var Number of bytes of data. Omitted if the zerodata flag is set. +** var Number of bytes of key. Or the key itself if intkey flag is set. +** * Payload +** 4 First page of the overflow chain. Omitted if no overflow +** +** Overflow pages form a linked list. Each page except the last is completely +** filled with data (pagesize - 4 bytes). The last page can have as little +** as 1 byte of data. +** +** SIZE DESCRIPTION +** 4 Page number of next overflow page +** * Data +** +** Freelist pages come in two subtypes: trunk pages and leaf pages. The +** file header points to the first in a linked list of trunk page. Each trunk +** page points to multiple leaf pages. The content of a leaf page is +** unspecified. A trunk page looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of next trunk page +** 4 Number of leaf pointers on this page +** * zero or more pages numbers of leaves +*/ +#include "sqliteInt.h" +#include "pager.h" +#include "btree.h" +#include "os.h" +#include + +/* Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +*/ +#define ROUND8(x) ((x+7)&~7) + + +/* The following value is the maximum cell size assuming a maximum page +** size give above. +*/ +#define MX_CELL_SIZE(pBt) (pBt->pageSize-8) + +/* The maximum number of cells on a single page of the database. This +** assumes a minimum cell size of 3 bytes. Such small cells will be +** exceedingly rare, but they are possible. +*/ +#define MX_CELL(pBt) ((pBt->pageSize-8)/3) + +/* Forward declarations */ +typedef struct MemPage MemPage; +typedef struct BtLock BtLock; + +/* +** This is a magic string that appears at the beginning of every +** SQLite database in order to identify the file as a real database. +** +** You can change this value at compile-time by specifying a +** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The +** header must be exactly 16 bytes including the zero-terminator so +** the string itself should be 15 characters long. If you change +** the header, then your custom library will not be able to read +** databases generated by the standard tools and the standard tools +** will not be able to read databases created by your custom library. +*/ +#ifndef SQLITE_FILE_HEADER /* 123456789 123456 */ +# define SQLITE_FILE_HEADER "SQLite format 3" +#endif + +/* +** Page type flags. An ORed combination of these flags appear as the +** first byte of on-disk image of every BTree page. +*/ +#define PTF_INTKEY 0x01 +#define PTF_ZERODATA 0x02 +#define PTF_LEAFDATA 0x04 +#define PTF_LEAF 0x08 + +/* +** As each page of the file is loaded into memory, an instance of the following +** structure is appended and initialized to zero. This structure stores +** information about the page that is decoded from the raw file page. +** +** The pParent field points back to the parent page. This allows us to +** walk up the BTree from any leaf to the root. Care must be taken to +** unref() the parent page pointer when this page is no longer referenced. +** The pageDestructor() routine handles that chore. +** +** Access to all fields of this structure is controlled by the mutex +** stored in MemPage.pBt->mutex. +*/ +struct MemPage { + u8 isInit; /* True if previously initialized. MUST BE FIRST! */ + u8 idxShift; /* True if Cell indices have changed */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u8 intKey; /* True if intkey flag is set */ + u8 leaf; /* True if leaf flag is set */ + u8 zeroData; /* True if table stores keys only */ + u8 leafData; /* True if tables stores data on leaves only */ + u8 hasData; /* True if this page stores data */ + u8 hdrOffset; /* 100 for page 1. 0 otherwise */ + u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ + u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ + u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ + u16 cellOffset; /* Index in aData of first cell pointer */ + u16 idxParent; /* Index in parent of this node */ + u16 nFree; /* Number of free bytes on the page */ + u16 nCell; /* Number of cells on this page, local and ovfl */ + struct _OvflCell { /* Cells that will not fit on aData[] */ + u8 *pCell; /* Pointers to the body of the overflow cell */ + u16 idx; /* Insert this cell before idx-th non-overflow cell */ + } aOvfl[5]; + BtShared *pBt; /* Pointer to BtShared that this page is part of */ + u8 *aData; /* Pointer to disk image of the page data */ + DbPage *pDbPage; /* Pager page handle */ + Pgno pgno; /* Page number for this page */ + MemPage *pParent; /* The parent of this page. NULL for root */ +}; + +/* +** The in-memory image of a disk page has the auxiliary information appended +** to the end. EXTRA_SIZE is the number of bytes of space needed to hold +** that extra information. +*/ +#define EXTRA_SIZE sizeof(MemPage) + +/* A Btree handle +** +** A database connection contains a pointer to an instance of +** this object for every database file that it has open. This structure +** is opaque to the database connection. The database connection cannot +** see the internals of this structure and only deals with pointers to +** this structure. +** +** For some database files, the same underlying database cache might be +** shared between multiple connections. In that case, each contection +** has it own pointer to this object. But each instance of this object +** points to the same BtShared object. The database cache and the +** schema associated with the database file are all contained within +** the BtShared object. +** +** All fields in this structure are accessed under sqlite3.mutex. +** The pBt pointer itself may not be changed while there exists cursors +** in the referenced BtShared that point back to this Btree since those +** cursors have to do go through this Btree to find their BtShared and +** they often do so without holding sqlite3.mutex. +*/ +struct Btree { + sqlite3 *pSqlite; /* The database connection holding this btree */ + BtShared *pBt; /* Sharable content of this btree */ + u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ + u8 sharable; /* True if we can share pBt with other pSqlite */ + u8 locked; /* True if pSqlite currently has pBt locked */ + int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ + Btree *pNext; /* List of other sharable Btrees from the same pSqlite */ + Btree *pPrev; /* Back pointer of the same list */ +}; + +/* +** Btree.inTrans may take one of the following values. +** +** If the shared-data extension is enabled, there may be multiple users +** of the Btree structure. At most one of these may open a write transaction, +** but any number may have active read transactions. +*/ +#define TRANS_NONE 0 +#define TRANS_READ 1 +#define TRANS_WRITE 2 + +/* +** An instance of this object represents a single database file. +** +** A single database file can be in use as the same time by two +** or more database connections. When two or more connections are +** sharing the same database file, each connection has it own +** private Btree object for the file and each of those Btrees points +** to this one BtShared object. BtShared.nRef is the number of +** connections currently sharing this database file. +** +** Fields in this structure are accessed under the BtShared.mutex +** mutex, except for nRef and pNext which are accessed under the +** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field +** may not be modified once it is initially set as long as nRef>0. +** The pSchema field may be set once under BtShared.mutex and +** thereafter is unchanged as long as nRef>0. +*/ +struct BtShared { + Pager *pPager; /* The page cache */ + BtCursor *pCursor; /* A list of all open cursors */ + MemPage *pPage1; /* First page of the database */ + u8 inStmt; /* True if we are in a statement subtransaction */ + u8 readOnly; /* True if the underlying file is readonly */ + u8 maxEmbedFrac; /* Maximum payload as % of total page size */ + u8 minEmbedFrac; /* Minimum payload as % of total page size */ + u8 minLeafFrac; /* Minimum leaf payload as % of total page size */ + u8 pageSizeFixed; /* True if the page size can no longer be changed */ +#ifndef SQLITE_OMIT_AUTOVACUUM + u8 autoVacuum; /* True if auto-vacuum is enabled */ + u8 incrVacuum; /* True if incr-vacuum is enabled */ + Pgno nTrunc; /* Non-zero if the db will be truncated (incr vacuum) */ +#endif + u16 pageSize; /* Total number of bytes on a page */ + u16 usableSize; /* Number of usable bytes on each page */ + int maxLocal; /* Maximum local payload in non-LEAFDATA tables */ + int minLocal; /* Minimum local payload in non-LEAFDATA tables */ + int maxLeaf; /* Maximum local payload in a LEAFDATA table */ + int minLeaf; /* Minimum local payload in a LEAFDATA table */ + BusyHandler *pBusyHandler; /* Callback for when there is lock contention */ + u8 inTransaction; /* Transaction state */ + int nTransaction; /* Number of open transactions (read + write) */ + void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */ + void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */ + sqlite3_mutex *mutex; /* Non-recursive mutex required to access this struct */ +#ifndef SQLITE_OMIT_SHARED_CACHE + int nRef; /* Number of references to this structure */ + BtShared *pNext; /* Next on a list of sharable BtShared structs */ + BtLock *pLock; /* List of locks held on this shared-btree struct */ +#endif +}; + +/* +** An instance of the following structure is used to hold information +** about a cell. The parseCellPtr() function fills in this structure +** based on information extract from the raw disk page. +*/ +typedef struct CellInfo CellInfo; +struct CellInfo { + u8 *pCell; /* Pointer to the start of cell content */ + i64 nKey; /* The key for INTKEY tables, or number of bytes in key */ + u32 nData; /* Number of bytes of data */ + u32 nPayload; /* Total amount of payload */ + u16 nHeader; /* Size of the cell content header in bytes */ + u16 nLocal; /* Amount of payload held locally */ + u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */ + u16 nSize; /* Size of the cell content on the main b-tree page */ +}; + +/* +** A cursor is a pointer to a particular entry within a particular +** b-tree within a database file. +** +** The entry is identified by its MemPage and the index in +** MemPage.aCell[] of the entry. +** +** When a single database file can shared by two more database connections, +** but cursors cannot be shared. Each cursor is associated with a +** particular database connection identified BtCursor.pBtree.pSqlite. +** +** Fields in this structure are accessed under the BtShared.mutex +** found at self->pBt->mutex. +*/ +struct BtCursor { + Btree *pBtree; /* The Btree to which this cursor belongs */ + BtShared *pBt; /* The BtShared this cursor points to */ + BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */ + int (*xCompare)(void*,int,const void*,int,const void*); /* Key comp func */ + void *pArg; /* First arg to xCompare() */ + Pgno pgnoRoot; /* The root page of this tree */ + MemPage *pPage; /* Page that contains the entry */ + int idx; /* Index of the entry in pPage->aCell[] */ + CellInfo info; /* A parse of the cell we are pointing at */ + u8 wrFlag; /* True if writable */ + u8 eState; /* One of the CURSOR_XXX constants (see below) */ + void *pKey; /* Saved key that was cursor's last known position */ + i64 nKey; /* Size of pKey, or last integer key */ + int skip; /* (skip<0) -> Prev() is a no-op. (skip>0) -> Next() is */ +#ifndef SQLITE_OMIT_INCRBLOB + u8 isIncrblobHandle; /* True if this cursor is an incr. io handle */ + Pgno *aOverflow; /* Cache of overflow page locations */ +#endif +}; + +/* +** Potential values for BtCursor.eState. +** +** CURSOR_VALID: +** Cursor points to a valid entry. getPayload() etc. may be called. +** +** CURSOR_INVALID: +** Cursor does not point to a valid entry. This can happen (for example) +** because the table is empty or because BtreeCursorFirst() has not been +** called. +** +** CURSOR_REQUIRESEEK: +** The table that this cursor was opened on still exists, but has been +** modified since the cursor was last used. The cursor position is saved +** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in +** this state, restoreOrClearCursorPosition() can be called to attempt to +** seek the cursor to the saved position. +** +** CURSOR_FAULT: +** A unrecoverable error (an I/O error or a malloc failure) has occurred +** on a different connection that shares the BtShared cache with this +** cursor. The error has left the cache in an inconsistent state. +** Do nothing else with this cursor. Any attempt to use the cursor +** should return the error code stored in BtCursor.skip +*/ +#define CURSOR_INVALID 0 +#define CURSOR_VALID 1 +#define CURSOR_REQUIRESEEK 2 +#define CURSOR_FAULT 3 + +/* +** The TRACE macro will print high-level status information about the +** btree operation when the global variable sqlite3_btree_trace is +** enabled. +*/ +#if SQLITE_TEST +# define TRACE(X) if( sqlite3_btree_trace ){ printf X; fflush(stdout); } +#else +# define TRACE(X) +#endif + +/* +** Routines to read and write variable-length integers. These used to +** be defined locally, but now we use the varint routines in the util.c +** file. +*/ +#define getVarint sqlite3GetVarint +#define getVarint32(A,B) ((*B=*(A))<=0x7f?1:sqlite3GetVarint32(A,B)) +#define putVarint sqlite3PutVarint + +/* The database page the PENDING_BYTE occupies. This page is never used. +** TODO: This macro is very similary to PAGER_MJ_PGNO() in pager.c. They +** should possibly be consolidated (presumably in pager.h). +** +** If disk I/O is omitted (meaning that the database is stored purely +** in memory) then there is no pending byte. +*/ +#ifdef SQLITE_OMIT_DISKIO +# define PENDING_BYTE_PAGE(pBt) 0x7fffffff +#else +# define PENDING_BYTE_PAGE(pBt) ((PENDING_BYTE/(pBt)->pageSize)+1) +#endif + +/* +** A linked list of the following structures is stored at BtShared.pLock. +** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor +** is opened on the table with root page BtShared.iTable. Locks are removed +** from this list when a transaction is committed or rolled back, or when +** a btree handle is closed. +*/ +struct BtLock { + Btree *pBtree; /* Btree handle holding this lock */ + Pgno iTable; /* Root page of table */ + u8 eLock; /* READ_LOCK or WRITE_LOCK */ + BtLock *pNext; /* Next in BtShared.pLock list */ +}; + +/* Candidate values for BtLock.eLock */ +#define READ_LOCK 1 +#define WRITE_LOCK 2 + +/* +** These macros define the location of the pointer-map entry for a +** database page. The first argument to each is the number of usable +** bytes on each page of the database (often 1024). The second is the +** page number to look up in the pointer map. +** +** PTRMAP_PAGENO returns the database page number of the pointer-map +** page that stores the required pointer. PTRMAP_PTROFFSET returns +** the offset of the requested map entry. +** +** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page, +** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be +** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements +** this test. +*/ +#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno) +#define PTRMAP_PTROFFSET(pBt, pgno) (5*(pgno-ptrmapPageno(pBt, pgno)-1)) +#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno)) + +/* +** The pointer map is a lookup table that identifies the parent page for +** each child page in the database file. The parent page is the page that +** contains a pointer to the child. Every page in the database contains +** 0 or 1 parent pages. (In this context 'database page' refers +** to any page that is not part of the pointer map itself.) Each pointer map +** entry consists of a single byte 'type' and a 4 byte parent page number. +** The PTRMAP_XXX identifiers below are the valid types. +** +** The purpose of the pointer map is to facility moving pages from one +** position in the file to another as part of autovacuum. When a page +** is moved, the pointer in its parent must be updated to point to the +** new location. The pointer map is used to locate the parent page quickly. +** +** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not +** used in this case. +** +** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number +** is not used in this case. +** +** PTRMAP_OVERFLOW1: The database page is the first page in a list of +** overflow pages. The page number identifies the page that +** contains the cell with a pointer to this overflow page. +** +** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of +** overflow pages. The page-number identifies the previous +** page in the overflow page list. +** +** PTRMAP_BTREE: The database page is a non-root btree page. The page number +** identifies the parent page in the btree. +*/ +#define PTRMAP_ROOTPAGE 1 +#define PTRMAP_FREEPAGE 2 +#define PTRMAP_OVERFLOW1 3 +#define PTRMAP_OVERFLOW2 4 +#define PTRMAP_BTREE 5 + +/* A bunch of assert() statements to check the transaction state variables +** of handle p (type Btree*) are internally consistent. +*/ +#define btreeIntegrity(p) \ + assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ + assert( p->pBt->inTransaction>=p->inTrans ); + + +/* +** The ISAUTOVACUUM macro is used within balance_nonroot() to determine +** if the database supports auto-vacuum or not. Because it is used +** within an expression that is an argument to another macro +** (sqliteMallocRaw), it is not possible to use conditional compilation. +** So, this macro is defined instead. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define ISAUTOVACUUM (pBt->autoVacuum) +#else +#define ISAUTOVACUUM 0 +#endif + + +/* +** This structure is passed around through all the sanity checking routines +** in order to keep track of some global state information. +*/ +typedef struct IntegrityCk IntegrityCk; +struct IntegrityCk { + BtShared *pBt; /* The tree being checked out */ + Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ + int nPage; /* Number of pages in the database */ + int *anRef; /* Number of times each page is referenced */ + int mxErr; /* Stop accumulating errors when this reaches zero */ + char *zErrMsg; /* An error message. NULL if no errors seen. */ + int nErr; /* Number of messages written to zErrMsg so far */ +}; + +/* +** Read or write a two- and four-byte big-endian integer values. +*/ +#define get2byte(x) ((x)[0]<<8 | (x)[1]) +#define put2byte(p,v) ((p)[0] = (v)>>8, (p)[1] = (v)) +#define get4byte sqlite3Get4byte +#define put4byte sqlite3Put4byte + +/* +** Internal routines that should be accessed by the btree layer only. +*/ +int sqlite3BtreeGetPage(BtShared*, Pgno, MemPage**, int); +int sqlite3BtreeInitPage(MemPage *pPage, MemPage *pParent); +void sqlite3BtreeParseCellPtr(MemPage*, u8*, CellInfo*); +void sqlite3BtreeParseCell(MemPage*, int, CellInfo*); +#ifdef SQLITE_TEST +u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell); +#endif +int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur); +void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur); +void sqlite3BtreeReleaseTempCursor(BtCursor *pCur); +int sqlite3BtreeIsRootPage(MemPage *pPage); +void sqlite3BtreeMoveToParent(BtCursor *pCur); diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/build.c b/libraries/sqlite/unix/sqlite-3.5.1/src/build.c new file mode 100644 index 0000000000..f46d28ee1e --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/build.c @@ -0,0 +1,3409 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains C code routines that are called by the SQLite parser +** when syntax rules are reduced. The routines in this file handle the +** following kinds of SQL syntax: +** +** CREATE TABLE +** DROP TABLE +** CREATE INDEX +** DROP INDEX +** creating ID lists +** BEGIN TRANSACTION +** COMMIT +** ROLLBACK +** +** $Id: build.c,v 1.444 2007/09/03 15:19:35 drh Exp $ +*/ +#include "sqliteInt.h" +#include + +/* +** This routine is called when a new SQL statement is beginning to +** be parsed. Initialize the pParse structure as needed. +*/ +void sqlite3BeginParse(Parse *pParse, int explainFlag){ + pParse->explain = explainFlag; + pParse->nVar = 0; +} + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** The TableLock structure is only used by the sqlite3TableLock() and +** codeTableLocks() functions. +*/ +struct TableLock { + int iDb; /* The database containing the table to be locked */ + int iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zName; /* Name of the table */ +}; + +/* +** Record the fact that we want to lock a table at run-time. +** +** The table to be locked has root page iTab and is found in database iDb. +** A read or a write lock can be taken depending on isWritelock. +** +** This routine just records the fact that the lock is desired. The +** code to make the lock occur is generated by a later call to +** codeTableLocks() which occurs during sqlite3FinishCoding(). +*/ +void sqlite3TableLock( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database containing the table to lock */ + int iTab, /* Root page number of the table to be locked */ + u8 isWriteLock, /* True for a write lock */ + const char *zName /* Name of the table to be locked */ +){ + int i; + int nBytes; + TableLock *p; + + if( iDb<0 ){ + return; + } + + for(i=0; inTableLock; i++){ + p = &pParse->aTableLock[i]; + if( p->iDb==iDb && p->iTab==iTab ){ + p->isWriteLock = (p->isWriteLock || isWriteLock); + return; + } + } + + nBytes = sizeof(TableLock) * (pParse->nTableLock+1); + pParse->aTableLock = + sqlite3DbReallocOrFree(pParse->db, pParse->aTableLock, nBytes); + if( pParse->aTableLock ){ + p = &pParse->aTableLock[pParse->nTableLock++]; + p->iDb = iDb; + p->iTab = iTab; + p->isWriteLock = isWriteLock; + p->zName = zName; + }else{ + pParse->nTableLock = 0; + pParse->db->mallocFailed = 1; + } +} + +/* +** Code an OP_TableLock instruction for each table locked by the +** statement (configured by calls to sqlite3TableLock()). +*/ +static void codeTableLocks(Parse *pParse){ + int i; + Vdbe *pVdbe; + + if( 0==(pVdbe = sqlite3GetVdbe(pParse)) ){ + return; + } + + for(i=0; inTableLock; i++){ + TableLock *p = &pParse->aTableLock[i]; + int p1 = p->iDb; + if( p->isWriteLock ){ + p1 = -1*(p1+1); + } + sqlite3VdbeOp3(pVdbe, OP_TableLock, p1, p->iTab, p->zName, P3_STATIC); + } +} +#else + #define codeTableLocks(x) +#endif + +/* +** This routine is called after a single SQL statement has been +** parsed and a VDBE program to execute that statement has been +** prepared. This routine puts the finishing touches on the +** VDBE program and resets the pParse structure for the next +** parse. +** +** Note that if an error occurred, it might be the case that +** no VDBE code was generated. +*/ +void sqlite3FinishCoding(Parse *pParse){ + sqlite3 *db; + Vdbe *v; + + db = pParse->db; + if( db->mallocFailed ) return; + if( pParse->nested ) return; + if( !pParse->pVdbe ){ + if( pParse->rc==SQLITE_OK && pParse->nErr ){ + pParse->rc = SQLITE_ERROR; + return; + } + } + + /* Begin by generating some termination code at the end of the + ** vdbe program + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp(v, OP_Halt, 0, 0); + + /* The cookie mask contains one bit for each database file open. + ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are + ** set for each database that is used. Generate code to start a + ** transaction on each used database and to verify the schema cookie + ** on each used database. + */ + if( pParse->cookieGoto>0 ){ + u32 mask; + int iDb; + sqlite3VdbeJumpHere(v, pParse->cookieGoto-1); + for(iDb=0, mask=1; iDbnDb; mask<<=1, iDb++){ + if( (mask & pParse->cookieMask)==0 ) continue; + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp(v, OP_Transaction, iDb, (mask & pParse->writeMask)!=0); + sqlite3VdbeAddOp(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb]); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pParse->pVirtualLock ){ + char *vtab = (char *)pParse->pVirtualLock->pVtab; + sqlite3VdbeOp3(v, OP_VBegin, 0, 0, vtab, P3_VTAB); + } +#endif + + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the + ** shared-cache feature is enabled. + */ + codeTableLocks(pParse); + sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto); + } + +#ifndef SQLITE_OMIT_TRACE + /* Add a No-op that contains the complete text of the compiled SQL + ** statement as its P3 argument. This does not change the functionality + ** of the program. + ** + ** This is used to implement sqlite3_trace(). + */ + sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail-pParse->zSql); +#endif /* SQLITE_OMIT_TRACE */ + } + + + /* Get the VDBE program ready for execution + */ + if( v && pParse->nErr==0 && !db->mallocFailed ){ +#ifdef SQLITE_DEBUG + FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0; + sqlite3VdbeTrace(v, trace); +#endif + sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem+3, + pParse->nTab+3, pParse->explain); + pParse->rc = SQLITE_DONE; + pParse->colNamesSet = 0; + }else if( pParse->rc==SQLITE_OK ){ + pParse->rc = SQLITE_ERROR; + } + pParse->nTab = 0; + pParse->nMem = 0; + pParse->nSet = 0; + pParse->nVar = 0; + pParse->cookieMask = 0; + pParse->cookieGoto = 0; +} + +/* +** Run the parser and code generator recursively in order to generate +** code for the SQL statement given onto the end of the pParse context +** currently under construction. When the parser is run recursively +** this way, the final OP_Halt is not appended and other initialization +** and finalization steps are omitted because those are handling by the +** outermost parser. +** +** Not everything is nestable. This facility is designed to permit +** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use +** care if you decide to try to use this routine for some other purposes. +*/ +void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ + va_list ap; + char *zSql; +# define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar)) + char saveBuf[SAVE_SZ]; + + if( pParse->nErr ) return; + assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ + va_start(ap, zFormat); + zSql = sqlite3VMPrintf(pParse->db, zFormat, ap); + va_end(ap); + if( zSql==0 ){ + pParse->db->mallocFailed = 1; + return; /* A malloc must have failed */ + } + pParse->nested++; + memcpy(saveBuf, &pParse->nVar, SAVE_SZ); + memset(&pParse->nVar, 0, SAVE_SZ); + sqlite3RunParser(pParse, zSql, 0); + sqlite3_free(zSql); + memcpy(&pParse->nVar, saveBuf, SAVE_SZ); + pParse->nested--; +} + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the table and the +** first matching table is returned. (No checking for duplicate table +** names is done.) The search order is TEMP first, then MAIN, then any +** auxiliary databases added using the ATTACH command. +** +** See also sqlite3LocateTable(). +*/ +Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ + Table *p = 0; + int i; + assert( zName!=0 ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, strlen(zName)+1); + if( p ) break; + } + return p; +} + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. Also leave an +** error message in pParse->zErrMsg. +** +** The difference between this routine and sqlite3FindTable() is that this +** routine leaves an error message in pParse->zErrMsg where +** sqlite3FindTable() does not. +*/ +Table *sqlite3LocateTable(Parse *pParse, const char *zName, const char *zDbase){ + Table *p; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return 0; + } + + p = sqlite3FindTable(pParse->db, zName, zDbase); + if( p==0 ){ + if( zDbase ){ + sqlite3ErrorMsg(pParse, "no such table: %s.%s", zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "no such table: %s", zName); + } + pParse->checkSchema = 1; + } + return p; +} + +/* +** Locate the in-memory structure that describes +** a particular index given the name of that index +** and the name of the database that contains the index. +** Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the +** table and the first matching index is returned. (No checking +** for duplicate index names is done.) The search order is +** TEMP first, then MAIN, then any auxiliary databases added +** using the ATTACH command. +*/ +Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ + Index *p = 0; + int i; + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + Schema *pSchema = db->aDb[j].pSchema; + if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; + assert( pSchema || (j==1 && !db->aDb[1].pBt) ); + if( pSchema ){ + p = sqlite3HashFind(&pSchema->idxHash, zName, strlen(zName)+1); + } + if( p ) break; + } + return p; +} + +/* +** Reclaim the memory used by an index +*/ +static void freeIndex(Index *p){ + sqlite3_free(p->zColAff); + sqlite3_free(p); +} + +/* +** Remove the given index from the index hash table, and free +** its memory structures. +** +** The index is removed from the database hash tables but +** it is not unlinked from the Table that it indexes. +** Unlinking from the Table must be done by the calling function. +*/ +static void sqliteDeleteIndex(Index *p){ + Index *pOld; + const char *zName = p->zName; + + pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen( zName)+1, 0); + assert( pOld==0 || pOld==p ); + freeIndex(p); +} + +/* +** For the index called zIdxName which is found in the database iDb, +** unlike that index from its Table then remove the index from +** the index hash table and free all memory structures associated +** with the index. +*/ +void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ + Index *pIndex; + int len; + Hash *pHash = &db->aDb[iDb].pSchema->idxHash; + + len = strlen(zIdxName); + pIndex = sqlite3HashInsert(pHash, zIdxName, len+1, 0); + if( pIndex ){ + if( pIndex->pTable->pIndex==pIndex ){ + pIndex->pTable->pIndex = pIndex->pNext; + }else{ + Index *p; + for(p=pIndex->pTable->pIndex; p && p->pNext!=pIndex; p=p->pNext){} + if( p && p->pNext==pIndex ){ + p->pNext = pIndex->pNext; + } + } + freeIndex(pIndex); + } + db->flags |= SQLITE_InternChanges; +} + +/* +** Erase all schema information from the in-memory hash tables of +** a single database. This routine is called to reclaim memory +** before the database closes. It is also called during a rollback +** if there were schema changes during the transaction or if a +** schema-cookie mismatch occurs. +** +** If iDb<=0 then reset the internal schema tables for all database +** files. If iDb>=2 then reset the internal schema for only the +** single file indicated. +*/ +void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ + int i, j; + + assert( iDb>=0 && iDbnDb ); + for(i=iDb; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pSchema ){ + sqlite3SchemaFree(pDb->pSchema); + } + if( iDb>0 ) return; + } + assert( iDb==0 ); + db->flags &= ~SQLITE_InternChanges; + + /* If one or more of the auxiliary database files has been closed, + ** then remove them from the auxiliary database list. We take the + ** opportunity to do this here since we have just deleted all of the + ** schema hash tables and therefore do not have to make any changes + ** to any of those tables. + */ + for(i=0; inDb; i++){ + struct Db *pDb = &db->aDb[i]; + if( pDb->pBt==0 ){ + if( pDb->pAux && pDb->xFreeAux ) pDb->xFreeAux(pDb->pAux); + pDb->pAux = 0; + } + } + for(i=j=2; inDb; i++){ + struct Db *pDb = &db->aDb[i]; + if( pDb->pBt==0 ){ + sqlite3_free(pDb->zName); + pDb->zName = 0; + continue; + } + if( jaDb[j] = db->aDb[i]; + } + j++; + } + memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j])); + db->nDb = j; + if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ + memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); + sqlite3_free(db->aDb); + db->aDb = db->aDbStatic; + } +} + +/* +** This routine is called when a commit occurs. +*/ +void sqlite3CommitInternalChanges(sqlite3 *db){ + db->flags &= ~SQLITE_InternChanges; +} + +/* +** Clear the column names from a table or view. +*/ +static void sqliteResetColumnNames(Table *pTable){ + int i; + Column *pCol; + assert( pTable!=0 ); + if( (pCol = pTable->aCol)!=0 ){ + for(i=0; inCol; i++, pCol++){ + sqlite3_free(pCol->zName); + sqlite3ExprDelete(pCol->pDflt); + sqlite3_free(pCol->zType); + sqlite3_free(pCol->zColl); + } + sqlite3_free(pTable->aCol); + } + pTable->aCol = 0; + pTable->nCol = 0; +} + +/* +** Remove the memory data structures associated with the given +** Table. No changes are made to disk by this routine. +** +** This routine just deletes the data structure. It does not unlink +** the table data structure from the hash table. Nor does it remove +** foreign keys from the sqlite.aFKey hash table. But it does destroy +** memory structures of the indices and foreign keys associated with +** the table. +*/ +void sqlite3DeleteTable(Table *pTable){ + Index *pIndex, *pNext; + FKey *pFKey, *pNextFKey; + + if( pTable==0 ) return; + + /* Do not delete the table until the reference count reaches zero. */ + pTable->nRef--; + if( pTable->nRef>0 ){ + return; + } + assert( pTable->nRef==0 ); + + /* Delete all indices associated with this table + */ + for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ + pNext = pIndex->pNext; + assert( pIndex->pSchema==pTable->pSchema ); + sqliteDeleteIndex(pIndex); + } + +#ifndef SQLITE_OMIT_FOREIGN_KEY + /* Delete all foreign keys associated with this table. The keys + ** should have already been unlinked from the pSchema->aFKey hash table + */ + for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){ + pNextFKey = pFKey->pNextFrom; + assert( sqlite3HashFind(&pTable->pSchema->aFKey, + pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey ); + sqlite3_free(pFKey); + } +#endif + + /* Delete the Table structure itself. + */ + sqliteResetColumnNames(pTable); + sqlite3_free(pTable->zName); + sqlite3_free(pTable->zColAff); + sqlite3SelectDelete(pTable->pSelect); +#ifndef SQLITE_OMIT_CHECK + sqlite3ExprDelete(pTable->pCheck); +#endif + sqlite3VtabClear(pTable); + sqlite3_free(pTable); +} + +/* +** Unlink the given table from the hash tables and the delete the +** table structure with all its indices and foreign keys. +*/ +void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ + Table *p; + FKey *pF1, *pF2; + Db *pDb; + + assert( db!=0 ); + assert( iDb>=0 && iDbnDb ); + assert( zTabName && zTabName[0] ); + pDb = &db->aDb[iDb]; + p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, strlen(zTabName)+1,0); + if( p ){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){ + int nTo = strlen(pF1->zTo) + 1; + pF2 = sqlite3HashFind(&pDb->pSchema->aFKey, pF1->zTo, nTo); + if( pF2==pF1 ){ + sqlite3HashInsert(&pDb->pSchema->aFKey, pF1->zTo, nTo, pF1->pNextTo); + }else{ + while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; } + if( pF2 ){ + pF2->pNextTo = pF1->pNextTo; + } + } + } +#endif + sqlite3DeleteTable(p); + } + db->flags |= SQLITE_InternChanges; +} + +/* +** Given a token, return a string that consists of the text of that +** token with any quotations removed. Space to hold the returned string +** is obtained from sqliteMalloc() and must be freed by the calling +** function. +** +** Tokens are often just pointers into the original SQL text and so +** are not \000 terminated and are not persistent. The returned string +** is \000 terminated and is persistent. +*/ +char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ + char *zName; + if( pName ){ + zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n); + sqlite3Dequote(zName); + }else{ + zName = 0; + } + return zName; +} + +/* +** Open the sqlite_master table stored in database number iDb for +** writing. The table is opened using cursor 0. +*/ +void sqlite3OpenMasterTable(Parse *p, int iDb){ + Vdbe *v = sqlite3GetVdbe(p); + sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb)); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + sqlite3VdbeAddOp(v, OP_OpenWrite, 0, MASTER_ROOT); + sqlite3VdbeAddOp(v, OP_SetNumColumns, 0, 5); /* sqlite_master has 5 columns */ +} + +/* +** The token *pName contains the name of a database (either "main" or +** "temp" or the name of an attached db). This routine returns the +** index of the named database in db->aDb[], or -1 if the named db +** does not exist. +*/ +int sqlite3FindDb(sqlite3 *db, Token *pName){ + int i = -1; /* Database number */ + int n; /* Number of characters in the name */ + Db *pDb; /* A database whose name space is being searched */ + char *zName; /* Name we are searching for */ + + zName = sqlite3NameFromToken(db, pName); + if( zName ){ + n = strlen(zName); + for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ + if( (!OMIT_TEMPDB || i!=1 ) && n==strlen(pDb->zName) && + 0==sqlite3StrICmp(pDb->zName, zName) ){ + break; + } + } + sqlite3_free(zName); + } + return i; +} + +/* The table or view or trigger name is passed to this routine via tokens +** pName1 and pName2. If the table name was fully qualified, for example: +** +** CREATE TABLE xxx.yyy (...); +** +** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if +** the table name is not fully qualified, i.e.: +** +** CREATE TABLE yyy(...); +** +** Then pName1 is set to "yyy" and pName2 is "". +** +** This routine sets the *ppUnqual pointer to point at the token (pName1 or +** pName2) that stores the unqualified table name. The index of the +** database "xxx" is returned. +*/ +int sqlite3TwoPartName( + Parse *pParse, /* Parsing and code generating context */ + Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */ + Token *pName2, /* The "yyy" in the name "xxx.yyy" */ + Token **pUnqual /* Write the unqualified object name here */ +){ + int iDb; /* Database holding the object */ + sqlite3 *db = pParse->db; + + if( pName2 && pName2->n>0 ){ + assert( !db->init.busy ); + *pUnqual = pName2; + iDb = sqlite3FindDb(db, pName1); + if( iDb<0 ){ + sqlite3ErrorMsg(pParse, "unknown database %T", pName1); + pParse->nErr++; + return -1; + } + }else{ + assert( db->init.iDb==0 || db->init.busy ); + iDb = db->init.iDb; + *pUnqual = pName1; + } + return iDb; +} + +/* +** This routine is used to check if the UTF-8 string zName is a legal +** unqualified name for a new schema object (table, index, view or +** trigger). All names are legal except those that begin with the string +** "sqlite_" (in upper, lower or mixed case). This portion of the namespace +** is reserved for internal use. +*/ +int sqlite3CheckObjectName(Parse *pParse, const char *zName){ + if( !pParse->db->init.busy && pParse->nested==0 + && (pParse->db->flags & SQLITE_WriteSchema)==0 + && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +/* +** Begin constructing a new table representation in memory. This is +** the first of several action routines that get called in response +** to a CREATE TABLE statement. In particular, this routine is called +** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp +** flag is true if the table should be stored in the auxiliary database +** file instead of in the main database file. This is normally the case +** when the "TEMP" or "TEMPORARY" keyword occurs in between +** CREATE and TABLE. +** +** The new table record is initialized and put in pParse->pNewTable. +** As more of the CREATE TABLE statement is parsed, additional action +** routines will be called to add more information to this record. +** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine +** is called to complete the construction of the new table record. +*/ +void sqlite3StartTable( + Parse *pParse, /* Parser context */ + Token *pName1, /* First part of the name of the table or view */ + Token *pName2, /* Second part of the name of the table or view */ + int isTemp, /* True if this is a TEMP table */ + int isView, /* True if this is a VIEW */ + int isVirtual, /* True if this is a VIRTUAL table */ + int noErr /* Do nothing if table already exists */ +){ + Table *pTable; + char *zName = 0; /* The name of the new table */ + sqlite3 *db = pParse->db; + Vdbe *v; + int iDb; /* Database number to create the table in */ + Token *pName; /* Unqualified name of the table to create */ + + /* The table or view name to create is passed to this routine via tokens + ** pName1 and pName2. If the table name was fully qualified, for example: + ** + ** CREATE TABLE xxx.yyy (...); + ** + ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if + ** the table name is not fully qualified, i.e.: + ** + ** CREATE TABLE yyy(...); + ** + ** Then pName1 is set to "yyy" and pName2 is "". + ** + ** The call below sets the pName pointer to point at the token (pName1 or + ** pName2) that stores the unqualified table name. The variable iDb is + ** set to the index of the database that the table or view is to be + ** created in. + */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) return; + if( !OMIT_TEMPDB && isTemp && iDb>1 ){ + /* If creating a temp table, the name may not be qualified */ + sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); + return; + } + if( !OMIT_TEMPDB && isTemp ) iDb = 1; + + pParse->sNameToken = *pName; + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ) return; + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto begin_table_error; + } + if( db->init.iDb==1 ) isTemp = 1; +#ifndef SQLITE_OMIT_AUTHORIZATION + assert( (isTemp & 1)==isTemp ); + { + int code; + char *zDb = db->aDb[iDb].zName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + goto begin_table_error; + } + if( isView ){ + if( !OMIT_TEMPDB && isTemp ){ + code = SQLITE_CREATE_TEMP_VIEW; + }else{ + code = SQLITE_CREATE_VIEW; + } + }else{ + if( !OMIT_TEMPDB && isTemp ){ + code = SQLITE_CREATE_TEMP_TABLE; + }else{ + code = SQLITE_CREATE_TABLE; + } + } + if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){ + goto begin_table_error; + } + } +#endif + + /* Make sure the new table name does not collide with an existing + ** index or table name in the same database. Issue an error message if + ** it does. The exception is if the statement being parsed was passed + ** to an sqlite3_declare_vtab() call. In that case only the column names + ** and types will be used, so there is no need to test for namespace + ** collisions. + */ + if( !IN_DECLARE_VTAB ){ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto begin_table_error; + } + pTable = sqlite3FindTable(db, zName, db->aDb[iDb].zName); + if( pTable ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "table %T already exists", pName); + } + goto begin_table_error; + } + if( sqlite3FindIndex(db, zName, 0)!=0 && (iDb==0 || !db->init.busy) ){ + sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); + goto begin_table_error; + } + } + + pTable = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTable==0 ){ + db->mallocFailed = 1; + pParse->rc = SQLITE_NOMEM; + pParse->nErr++; + goto begin_table_error; + } + pTable->zName = zName; + pTable->iPKey = -1; + pTable->pSchema = db->aDb[iDb].pSchema; + pTable->nRef = 1; + if( pParse->pNewTable ) sqlite3DeleteTable(pParse->pNewTable); + pParse->pNewTable = pTable; + + /* If this is the magic sqlite_sequence table used by autoincrement, + ** then record a pointer to this table in the main database structure + ** so that INSERT can find the table easily. + */ +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){ + pTable->pSchema->pSeqTab = pTable; + } +#endif + + /* Begin generating the code that will insert the table record into + ** the SQLITE_MASTER table. Note in particular that we must go ahead + ** and allocate the record number for the table entry now. Before any + ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause + ** indices to be created and the table record must come before the + ** indices. Hence, the record number for the table must be allocated + ** now. + */ + if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ + int lbl; + int fileFormat; + sqlite3BeginWriteOperation(pParse, 0, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( isVirtual ){ + sqlite3VdbeAddOp(v, OP_VBegin, 0, 0); + } +#endif + + /* If the file format and encoding in the database have not been set, + ** set them now. + */ + sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1); /* file_format */ + sqlite3VdbeUsesBtree(v, iDb); + lbl = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp(v, OP_If, 0, lbl); + fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? + 1 : SQLITE_MAX_FILE_FORMAT; + sqlite3VdbeAddOp(v, OP_Integer, fileFormat, 0); + sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1); + sqlite3VdbeAddOp(v, OP_Integer, ENC(db), 0); + sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 4); + sqlite3VdbeResolveLabel(v, lbl); + + /* This just creates a place-holder record in the sqlite_master table. + ** The record created does not contain anything yet. It will be replaced + ** by the real entry in code generated at sqlite3EndTable(). + ** + ** The rowid for the new entry is left on the top of the stack. + ** The rowid value is needed by the code that sqlite3EndTable will + ** generate. + */ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( isView || isVirtual ){ + sqlite3VdbeAddOp(v, OP_Integer, 0, 0); + }else +#endif + { + sqlite3VdbeAddOp(v, OP_CreateTable, iDb, 0); + } + sqlite3OpenMasterTable(pParse, iDb); + sqlite3VdbeAddOp(v, OP_NewRowid, 0, 0); + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + sqlite3VdbeAddOp(v, OP_Insert, 0, OPFLAG_APPEND); + sqlite3VdbeAddOp(v, OP_Close, 0, 0); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + } + + /* Normal (non-error) return. */ + return; + + /* If an error occurs, we jump here */ +begin_table_error: + sqlite3_free(zName); + return; +} + +/* +** This macro is used to compare two strings in a case-insensitive manner. +** It is slightly faster than calling sqlite3StrICmp() directly, but +** produces larger code. +** +** WARNING: This macro is not compatible with the strcmp() family. It +** returns true if the two strings are equal, otherwise false. +*/ +#define STRICMP(x, y) (\ +sqlite3UpperToLower[*(unsigned char *)(x)]== \ +sqlite3UpperToLower[*(unsigned char *)(y)] \ +&& sqlite3StrICmp((x)+1,(y)+1)==0 ) + +/* +** Add a new column to the table currently being constructed. +** +** The parser calls this routine once for each column declaration +** in a CREATE TABLE statement. sqlite3StartTable() gets called +** first to get things going. Then this routine is called for each +** column. +*/ +void sqlite3AddColumn(Parse *pParse, Token *pName){ + Table *p; + int i; + char *z; + Column *pCol; + if( (p = pParse->pNewTable)==0 ) return; + if( p->nCol+1>SQLITE_MAX_COLUMN ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); + return; + } + z = sqlite3NameFromToken(pParse->db, pName); + if( z==0 ) return; + for(i=0; inCol; i++){ + if( STRICMP(z, p->aCol[i].zName) ){ + sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); + sqlite3_free(z); + return; + } + } + if( (p->nCol & 0x7)==0 ){ + Column *aNew; + aNew = sqlite3DbRealloc(pParse->db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0])); + if( aNew==0 ){ + sqlite3_free(z); + return; + } + p->aCol = aNew; + } + pCol = &p->aCol[p->nCol]; + memset(pCol, 0, sizeof(p->aCol[0])); + pCol->zName = z; + + /* If there is no type specified, columns have the default affinity + ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will + ** be called next to set pCol->affinity correctly. + */ + pCol->affinity = SQLITE_AFF_NONE; + p->nCol++; +} + +/* +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. A "NOT NULL" constraint has +** been seen on a column. This routine sets the notNull flag on +** the column currently under construction. +*/ +void sqlite3AddNotNull(Parse *pParse, int onError){ + Table *p; + int i; + if( (p = pParse->pNewTable)==0 ) return; + i = p->nCol-1; + if( i>=0 ) p->aCol[i].notNull = onError; +} + +/* +** Scan the column type name zType (length nType) and return the +** associated affinity type. +** +** This routine does a case-independent search of zType for the +** substrings in the following table. If one of the substrings is +** found, the corresponding affinity is returned. If zType contains +** more than one of the substrings, entries toward the top of +** the table take priority. For example, if zType is 'BLOBINT', +** SQLITE_AFF_INTEGER is returned. +** +** Substring | Affinity +** -------------------------------- +** 'INT' | SQLITE_AFF_INTEGER +** 'CHAR' | SQLITE_AFF_TEXT +** 'CLOB' | SQLITE_AFF_TEXT +** 'TEXT' | SQLITE_AFF_TEXT +** 'BLOB' | SQLITE_AFF_NONE +** 'REAL' | SQLITE_AFF_REAL +** 'FLOA' | SQLITE_AFF_REAL +** 'DOUB' | SQLITE_AFF_REAL +** +** If none of the substrings in the above table are found, +** SQLITE_AFF_NUMERIC is returned. +*/ +char sqlite3AffinityType(const Token *pType){ + u32 h = 0; + char aff = SQLITE_AFF_NUMERIC; + const unsigned char *zIn = pType->z; + const unsigned char *zEnd = &pType->z[pType->n]; + + while( zIn!=zEnd ){ + h = (h<<8) + sqlite3UpperToLower[*zIn]; + zIn++; + if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ + && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ + aff = SQLITE_AFF_NONE; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; +#endif + }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */ + aff = SQLITE_AFF_INTEGER; + break; + } + } + + return aff; +} + +/* +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. The pFirst token is the first +** token in the sequence of tokens that describe the type of the +** column currently under construction. pLast is the last token +** in the sequence. Use this information to construct a string +** that contains the typename of the column and store that string +** in zType. +*/ +void sqlite3AddColumnType(Parse *pParse, Token *pType){ + Table *p; + int i; + Column *pCol; + + if( (p = pParse->pNewTable)==0 ) return; + i = p->nCol-1; + if( i<0 ) return; + pCol = &p->aCol[i]; + sqlite3_free(pCol->zType); + pCol->zType = sqlite3NameFromToken(pParse->db, pType); + pCol->affinity = sqlite3AffinityType(pType); +} + +/* +** The expression is the default value for the most recently added column +** of the table currently under construction. +** +** Default value expressions must be constant. Raise an exception if this +** is not the case. +** +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. +*/ +void sqlite3AddDefaultValue(Parse *pParse, Expr *pExpr){ + Table *p; + Column *pCol; + if( (p = pParse->pNewTable)!=0 ){ + pCol = &(p->aCol[p->nCol-1]); + if( !sqlite3ExprIsConstantOrFunction(pExpr) ){ + sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", + pCol->zName); + }else{ + Expr *pCopy; + sqlite3 *db = pParse->db; + sqlite3ExprDelete(pCol->pDflt); + pCol->pDflt = pCopy = sqlite3ExprDup(db, pExpr); + if( pCopy ){ + sqlite3TokenCopy(db, &pCopy->span, &pExpr->span); + } + } + } + sqlite3ExprDelete(pExpr); +} + +/* +** Designate the PRIMARY KEY for the table. pList is a list of names +** of columns that form the primary key. If pList is NULL, then the +** most recently added column of the table is the primary key. +** +** A table can have at most one primary key. If the table already has +** a primary key (and this is the second primary key) then create an +** error. +** +** If the PRIMARY KEY is on a single column whose datatype is INTEGER, +** then we will try to use that column as the rowid. Set the Table.iPKey +** field of the table under construction to be the index of the +** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is +** no INTEGER PRIMARY KEY. +** +** If the key is not an INTEGER PRIMARY KEY, then create a unique +** index for the key. No index is created for INTEGER PRIMARY KEYs. +*/ +void sqlite3AddPrimaryKey( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List of field names to be indexed */ + int onError, /* What to do with a uniqueness conflict */ + int autoInc, /* True if the AUTOINCREMENT keyword is present */ + int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ +){ + Table *pTab = pParse->pNewTable; + char *zType = 0; + int iCol = -1, i; + if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit; + if( pTab->hasPrimKey ){ + sqlite3ErrorMsg(pParse, + "table \"%s\" has more than one primary key", pTab->zName); + goto primary_key_exit; + } + pTab->hasPrimKey = 1; + if( pList==0 ){ + iCol = pTab->nCol - 1; + pTab->aCol[iCol].isPrimKey = 1; + }else{ + for(i=0; inExpr; i++){ + for(iCol=0; iColnCol; iCol++){ + if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){ + break; + } + } + if( iColnCol ){ + pTab->aCol[iCol].isPrimKey = 1; + } + } + if( pList->nExpr>1 ) iCol = -1; + } + if( iCol>=0 && iColnCol ){ + zType = pTab->aCol[iCol].zType; + } + if( zType && sqlite3StrICmp(zType, "INTEGER")==0 + && sortOrder==SQLITE_SO_ASC ){ + pTab->iPKey = iCol; + pTab->keyConf = onError; + pTab->autoInc = autoInc; + }else if( autoInc ){ +#ifndef SQLITE_OMIT_AUTOINCREMENT + sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " + "INTEGER PRIMARY KEY"); +#endif + }else{ + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0); + pList = 0; + } + +primary_key_exit: + sqlite3ExprListDelete(pList); + return; +} + +/* +** Add a new CHECK constraint to the table currently under construction. +*/ +void sqlite3AddCheckConstraint( + Parse *pParse, /* Parsing context */ + Expr *pCheckExpr /* The check expression */ +){ +#ifndef SQLITE_OMIT_CHECK + Table *pTab = pParse->pNewTable; + sqlite3 *db = pParse->db; + if( pTab && !IN_DECLARE_VTAB ){ + /* The CHECK expression must be duplicated so that tokens refer + ** to malloced space and not the (ephemeral) text of the CREATE TABLE + ** statement */ + pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, + sqlite3ExprDup(db, pCheckExpr)); + } +#endif + sqlite3ExprDelete(pCheckExpr); +} + +/* +** Set the collation function of the most recently parsed table column +** to the CollSeq given. +*/ +void sqlite3AddCollateType(Parse *pParse, const char *zType, int nType){ + Table *p; + int i; + + if( (p = pParse->pNewTable)==0 ) return; + i = p->nCol-1; + + if( sqlite3LocateCollSeq(pParse, zType, nType) ){ + Index *pIdx; + p->aCol[i].zColl = sqlite3DbStrNDup(pParse->db, zType, nType); + + /* If the column is declared as " PRIMARY KEY COLLATE ", + ** then an index may have been created on this column before the + ** collation type was added. Correct this if it is the case. + */ + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nColumn==1 ); + if( pIdx->aiColumn[0]==i ){ + pIdx->azColl[0] = p->aCol[i].zColl; + } + } + } +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName, length nName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +*/ +CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, nName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(db, pColl, zName, nName); + if( !pColl ){ + if( nName<0 ){ + nName = strlen(zName); + } + sqlite3ErrorMsg(pParse, "no such collation sequence: %.*s", nName, zName); + pColl = 0; + } + } + + return pColl; +} + + +/* +** Generate code that will increment the schema cookie. +** +** The schema cookie is used to determine when the schema for the +** database changes. After each schema change, the cookie value +** changes. When a process first reads the schema it records the +** cookie. Thereafter, whenever it goes to access the database, +** it checks the cookie to make sure the schema has not changed +** since it was last read. +** +** This plan is not completely bullet-proof. It is possible for +** the schema to change multiple times and for the cookie to be +** set back to prior value. But schema changes are infrequent +** and the probability of hitting the same cookie value is only +** 1 chance in 2^32. So we're safe enough. +*/ +void sqlite3ChangeCookie(sqlite3 *db, Vdbe *v, int iDb){ + sqlite3VdbeAddOp(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, 0); + sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 0); +} + +/* +** Measure the number of characters needed to output the given +** identifier. The number returned includes any quotes used +** but does not include the null terminator. +** +** The estimate is conservative. It might be larger that what is +** really needed. +*/ +static int identLength(const char *z){ + int n; + for(n=0; *z; n++, z++){ + if( *z=='"' ){ n++; } + } + return n + 2; +} + +/* +** Write an identifier onto the end of the given string. Add +** quote characters as needed. +*/ +static void identPut(char *z, int *pIdx, char *zSignedIdent){ + unsigned char *zIdent = (unsigned char*)zSignedIdent; + int i, j, needQuote; + i = *pIdx; + for(j=0; zIdent[j]; j++){ + if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break; + } + needQuote = zIdent[j]!=0 || isdigit(zIdent[0]) + || sqlite3KeywordCode(zIdent, j)!=TK_ID; + if( needQuote ) z[i++] = '"'; + for(j=0; zIdent[j]; j++){ + z[i++] = zIdent[j]; + if( zIdent[j]=='"' ) z[i++] = '"'; + } + if( needQuote ) z[i++] = '"'; + z[i] = 0; + *pIdx = i; +} + +/* +** Generate a CREATE TABLE statement appropriate for the given +** table. Memory to hold the text of the statement is obtained +** from sqliteMalloc() and must be freed by the calling function. +*/ +static char *createTableStmt(Table *p, int isTemp){ + int i, k, n; + char *zStmt; + char *zSep, *zSep2, *zEnd, *z; + Column *pCol; + n = 0; + for(pCol = p->aCol, i=0; inCol; i++, pCol++){ + n += identLength(pCol->zName); + z = pCol->zType; + if( z ){ + n += (strlen(z) + 1); + } + } + n += identLength(p->zName); + if( n<50 ){ + zSep = ""; + zSep2 = ","; + zEnd = ")"; + }else{ + zSep = "\n "; + zSep2 = ",\n "; + zEnd = "\n)"; + } + n += 35 + 6*p->nCol; + zStmt = sqlite3_malloc( n ); + if( zStmt==0 ) return 0; + sqlite3_snprintf(n, zStmt, + !OMIT_TEMPDB&&isTemp ? "CREATE TEMP TABLE ":"CREATE TABLE "); + k = strlen(zStmt); + identPut(zStmt, &k, p->zName); + zStmt[k++] = '('; + for(pCol=p->aCol, i=0; inCol; i++, pCol++){ + sqlite3_snprintf(n-k, &zStmt[k], zSep); + k += strlen(&zStmt[k]); + zSep = zSep2; + identPut(zStmt, &k, pCol->zName); + if( (z = pCol->zType)!=0 ){ + zStmt[k++] = ' '; + assert( strlen(z)+k+1<=n ); + sqlite3_snprintf(n-k, &zStmt[k], "%s", z); + k += strlen(z); + } + } + sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); + return zStmt; +} + +/* +** This routine is called to report the final ")" that terminates +** a CREATE TABLE statement. +** +** The table structure that other action routines have been building +** is added to the internal hash tables, assuming no errors have +** occurred. +** +** An entry for the table is made in the master table on disk, unless +** this is a temporary table or db->init.busy==1. When db->init.busy==1 +** it means we are reading the sqlite_master table because we just +** connected to the database or because the sqlite_master table has +** recently changed, so the entry for this table already exists in +** the sqlite_master table. We do not want to create it again. +** +** If the pSelect argument is not NULL, it means that this routine +** was called to create a table generated from a +** "CREATE TABLE ... AS SELECT ..." statement. The column names of +** the new table will match the result set of the SELECT. +*/ +void sqlite3EndTable( + Parse *pParse, /* Parse context */ + Token *pCons, /* The ',' token after the last column defn. */ + Token *pEnd, /* The final ')' token in the CREATE TABLE */ + Select *pSelect /* Select from a "CREATE ... AS SELECT" */ +){ + Table *p; + sqlite3 *db = pParse->db; + int iDb; + + if( (pEnd==0 && pSelect==0) || pParse->nErr || db->mallocFailed ) { + return; + } + p = pParse->pNewTable; + if( p==0 ) return; + + assert( !db->init.busy || !pSelect ); + + iDb = sqlite3SchemaToIndex(db, p->pSchema); + +#ifndef SQLITE_OMIT_CHECK + /* Resolve names in all CHECK constraint expressions. + */ + if( p->pCheck ){ + SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ + NameContext sNC; /* Name context for pParse->pNewTable */ + + memset(&sNC, 0, sizeof(sNC)); + memset(&sSrc, 0, sizeof(sSrc)); + sSrc.nSrc = 1; + sSrc.a[0].zName = p->zName; + sSrc.a[0].pTab = p; + sSrc.a[0].iCursor = -1; + sNC.pParse = pParse; + sNC.pSrcList = &sSrc; + sNC.isCheck = 1; + if( sqlite3ExprResolveNames(&sNC, p->pCheck) ){ + return; + } + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* If the db->init.busy is 1 it means we are reading the SQL off the + ** "sqlite_master" or "sqlite_temp_master" table on the disk. + ** So do not write to the disk again. Extract the root page number + ** for the table from the db->init.newTnum field. (The page number + ** should have been put there by the sqliteOpenCb routine.) + */ + if( db->init.busy ){ + p->tnum = db->init.newTnum; + } + + /* If not initializing, then create a record for the new table + ** in the SQLITE_MASTER table of the database. The record number + ** for the new table entry should already be on the stack. + ** + ** If this is a TEMPORARY table, write the entry into the auxiliary + ** file instead of into the main database file. + */ + if( !db->init.busy ){ + int n; + Vdbe *v; + char *zType; /* "view" or "table" */ + char *zType2; /* "VIEW" or "TABLE" */ + char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + + sqlite3VdbeAddOp(v, OP_Close, 0, 0); + + /* Create the rootpage for the new table and push it onto the stack. + ** A view has no rootpage, so just push a zero onto the stack for + ** views. Initialize zType at the same time. + */ + if( p->pSelect==0 ){ + /* A regular table */ + zType = "table"; + zType2 = "TABLE"; +#ifndef SQLITE_OMIT_VIEW + }else{ + /* A view */ + zType = "view"; + zType2 = "VIEW"; +#endif + } + + /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT + ** statement to populate the new table. The root-page number for the + ** new table is on the top of the vdbe stack. + ** + ** Once the SELECT has been coded by sqlite3Select(), it is in a + ** suitable state to query for the column names and types to be used + ** by the new table. + ** + ** A shared-cache write-lock is not required to write to the new table, + ** as a schema-lock must have already been obtained to create it. Since + ** a schema-lock excludes all other database users, the write-lock would + ** be redundant. + */ + if( pSelect ){ + Table *pSelTab; + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + sqlite3VdbeAddOp(v, OP_OpenWrite, 1, 0); + pParse->nTab = 2; + sqlite3Select(pParse, pSelect, SRT_Table, 1, 0, 0, 0, 0); + sqlite3VdbeAddOp(v, OP_Close, 1, 0); + if( pParse->nErr==0 ){ + pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSelect); + if( pSelTab==0 ) return; + assert( p->aCol==0 ); + p->nCol = pSelTab->nCol; + p->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(pSelTab); + } + } + + /* Compute the complete text of the CREATE statement */ + if( pSelect ){ + zStmt = createTableStmt(p, p->pSchema==db->aDb[1].pSchema); + }else{ + n = pEnd->z - pParse->sNameToken.z + 1; + zStmt = sqlite3MPrintf(db, + "CREATE %s %.*s", zType2, n, pParse->sNameToken.z + ); + } + + /* A slot for the record has already been allocated in the + ** SQLITE_MASTER table. We just need to update that slot with all + ** the information we've collected. The rowid for the preallocated + ** slot is the 2nd item on the stack. The top of the stack is the + ** root page for the new table (or a 0 if this is a view). + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s " + "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#0, sql=%Q " + "WHERE rowid=#1", + db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + zType, + p->zName, + p->zName, + zStmt + ); + sqlite3_free(zStmt); + sqlite3ChangeCookie(db, v, iDb); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Check to see if we need to create an sqlite_sequence table for + ** keeping track of autoincrement keys. + */ + if( p->autoInc ){ + Db *pDb = &db->aDb[iDb]; + if( pDb->pSchema->pSeqTab==0 ){ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.sqlite_sequence(name,seq)", + pDb->zName + ); + } + } +#endif + + /* Reparse everything to update our internal data structures */ + sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, + sqlite3MPrintf(db, "tbl_name='%q'",p->zName), P3_DYNAMIC); + } + + + /* Add the table to the in-memory representation of the database. + */ + if( db->init.busy && pParse->nErr==0 ){ + Table *pOld; + FKey *pFKey; + Schema *pSchema = p->pSchema; + pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, strlen(p->zName)+1,p); + if( pOld ){ + assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ + db->mallocFailed = 1; + return; + } +#ifndef SQLITE_OMIT_FOREIGN_KEY + for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + void *data; + int nTo = strlen(pFKey->zTo) + 1; + pFKey->pNextTo = sqlite3HashFind(&pSchema->aFKey, pFKey->zTo, nTo); + data = sqlite3HashInsert(&pSchema->aFKey, pFKey->zTo, nTo, pFKey); + if( data==(void *)pFKey ){ + db->mallocFailed = 1; + } + } +#endif + pParse->pNewTable = 0; + db->nTable++; + db->flags |= SQLITE_InternChanges; + +#ifndef SQLITE_OMIT_ALTERTABLE + if( !p->pSelect ){ + const char *zName = (const char *)pParse->sNameToken.z; + int nName; + assert( !pSelect && pCons && pEnd ); + if( pCons->z==0 ){ + pCons = pEnd; + } + nName = (const char *)pCons->z - zName; + p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName); + } +#endif + } +} + +#ifndef SQLITE_OMIT_VIEW +/* +** The parser calls this routine in order to create a new VIEW +*/ +void sqlite3CreateView( + Parse *pParse, /* The parsing context */ + Token *pBegin, /* The CREATE token that begins the statement */ + Token *pName1, /* The token that holds the name of the view */ + Token *pName2, /* The token that holds the name of the view */ + Select *pSelect, /* A SELECT statement that will become the new view */ + int isTemp, /* TRUE for a TEMPORARY view */ + int noErr /* Suppress error messages if VIEW already exists */ +){ + Table *p; + int n; + const unsigned char *z; + Token sEnd; + DbFixer sFix; + Token *pName; + int iDb; + sqlite3 *db = pParse->db; + + if( pParse->nVar>0 ){ + sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); + sqlite3SelectDelete(pSelect); + return; + } + sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); + p = pParse->pNewTable; + if( p==0 || pParse->nErr ){ + sqlite3SelectDelete(pSelect); + return; + } + sqlite3TwoPartName(pParse, pName1, pName2, &pName); + iDb = sqlite3SchemaToIndex(db, p->pSchema); + if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName) + && sqlite3FixSelect(&sFix, pSelect) + ){ + sqlite3SelectDelete(pSelect); + return; + } + + /* Make a copy of the entire SELECT statement that defines the view. + ** This will force all the Expr.token.z values to be dynamically + ** allocated rather than point to the input string - which means that + ** they will persist after the current sqlite3_exec() call returns. + */ + p->pSelect = sqlite3SelectDup(db, pSelect); + sqlite3SelectDelete(pSelect); + if( db->mallocFailed ){ + return; + } + if( !db->init.busy ){ + sqlite3ViewGetColumnNames(pParse, p); + } + + /* Locate the end of the CREATE VIEW statement. Make sEnd point to + ** the end. + */ + sEnd = pParse->sLastToken; + if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){ + sEnd.z += sEnd.n; + } + sEnd.n = 0; + n = sEnd.z - pBegin->z; + z = (const unsigned char*)pBegin->z; + while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; } + sEnd.z = &z[n-1]; + sEnd.n = 1; + + /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ + sqlite3EndTable(pParse, 0, &sEnd, 0); + return; +} +#endif /* SQLITE_OMIT_VIEW */ + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** The Table structure pTable is really a VIEW. Fill in the names of +** the columns of the view in the pTable structure. Return the number +** of errors. If an error is seen leave an error message in pParse->zErrMsg. +*/ +int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ + Table *pSelTab; /* A fake table from which we get the result set */ + Select *pSel; /* Copy of the SELECT that implements the view */ + int nErr = 0; /* Number of errors encountered */ + int n; /* Temporarily holds the number of cursors assigned */ + sqlite3 *db = pParse->db; /* Database connection for malloc errors */ + + assert( pTable ); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3VtabCallConnect(pParse, pTable) ){ + return SQLITE_ERROR; + } + if( IsVirtual(pTable) ) return 0; +#endif + +#ifndef SQLITE_OMIT_VIEW + /* A positive nCol means the columns names for this view are + ** already known. + */ + if( pTable->nCol>0 ) return 0; + + /* A negative nCol is a special marker meaning that we are currently + ** trying to compute the column names. If we enter this routine with + ** a negative nCol, it means two or more views form a loop, like this: + ** + ** CREATE VIEW one AS SELECT * FROM two; + ** CREATE VIEW two AS SELECT * FROM one; + ** + ** Actually, this error is caught previously and so the following test + ** should always fail. But we will leave it in place just to be safe. + */ + if( pTable->nCol<0 ){ + sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); + return 1; + } + assert( pTable->nCol>=0 ); + + /* If we get this far, it means we need to compute the table names. + ** Note that the call to sqlite3ResultSetOfSelect() will expand any + ** "*" elements in the results set of the view and will assign cursors + ** to the elements of the FROM clause. But we do not want these changes + ** to be permanent. So the computation is done on a copy of the SELECT + ** statement that defines the view. + */ + assert( pTable->pSelect ); + pSel = sqlite3SelectDup(db, pTable->pSelect); + if( pSel ){ + n = pParse->nTab; + sqlite3SrcListAssignCursors(pParse, pSel->pSrc); + pTable->nCol = -1; + pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSel); + pParse->nTab = n; + if( pSelTab ){ + assert( pTable->aCol==0 ); + pTable->nCol = pSelTab->nCol; + pTable->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(pSelTab); + pTable->pSchema->flags |= DB_UnresetViews; + }else{ + pTable->nCol = 0; + nErr++; + } + sqlite3SelectDelete(pSel); + } else { + nErr++; + } +#endif /* SQLITE_OMIT_VIEW */ + return nErr; +} +#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifndef SQLITE_OMIT_VIEW +/* +** Clear the column names from every VIEW in database idx. +*/ +static void sqliteViewResetAll(sqlite3 *db, int idx){ + HashElem *i; + if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; + for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + if( pTab->pSelect ){ + sqliteResetColumnNames(pTab); + } + } + DbClearProperty(db, idx, DB_UnresetViews); +} +#else +# define sqliteViewResetAll(A,B) +#endif /* SQLITE_OMIT_VIEW */ + +/* +** This function is called by the VDBE to adjust the internal schema +** used by SQLite when the btree layer moves a table root page. The +** root-page of a table or index in database iDb has changed from iFrom +** to iTo. +** +** Ticket #1728: The symbol table might still contain information +** on tables and/or indices that are the process of being deleted. +** If you are unlucky, one of those deleted indices or tables might +** have the same rootpage number as the real table or index that is +** being moved. So we cannot stop searching after the first match +** because the first match might be for one of the deleted indices +** or tables and not the table/index that is actually being moved. +** We must continue looping until all tables and indices with +** rootpage==iFrom have been converted to have a rootpage of iTo +** in order to be certain that we got the right one. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){ + HashElem *pElem; + Hash *pHash; + + pHash = &pDb->pSchema->tblHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + if( pTab->tnum==iFrom ){ + pTab->tnum = iTo; + } + } + pHash = &pDb->pSchema->idxHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Index *pIdx = sqliteHashData(pElem); + if( pIdx->tnum==iFrom ){ + pIdx->tnum = iTo; + } + } +} +#endif + +/* +** Write code to erase the table with root-page iTable from database iDb. +** Also write code to modify the sqlite_master table and internal schema +** if a root-page of another table is moved by the btree-layer whilst +** erasing iTable (this can happen with an auto-vacuum database). +*/ +static void destroyRootPage(Parse *pParse, int iTable, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeAddOp(v, OP_Destroy, iTable, iDb); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* OP_Destroy pushes an integer onto the stack. If this integer + ** is non-zero, then it is the root page number of a table moved to + ** location iTable. The following code modifies the sqlite_master table to + ** reflect this. + ** + ** The "#0" in the SQL is a special constant that means whatever value + ** is on the top of the stack. See sqlite3RegisterExpr(). + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET rootpage=%d WHERE #0 AND rootpage=#0", + pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable); +#endif +} + +/* +** Write VDBE code to erase table pTab and all associated indices on disk. +** Code to update the sqlite_master tables and internal schema definitions +** in case a root-page belonging to another table is moved by the btree layer +** is also added (this can happen with an auto-vacuum database). +*/ +static void destroyTable(Parse *pParse, Table *pTab){ +#ifdef SQLITE_OMIT_AUTOVACUUM + Index *pIdx; + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + destroyRootPage(pParse, pTab->tnum, iDb); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + destroyRootPage(pParse, pIdx->tnum, iDb); + } +#else + /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM + ** is not defined), then it is important to call OP_Destroy on the + ** table and index root-pages in order, starting with the numerically + ** largest root-page number. This guarantees that none of the root-pages + ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the + ** following were coded: + ** + ** OP_Destroy 4 0 + ** ... + ** OP_Destroy 5 0 + ** + ** and root page 5 happened to be the largest root-page number in the + ** database, then root page 5 would be moved to page 4 by the + ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit + ** a free-list page. + */ + int iTab = pTab->tnum; + int iDestroyed = 0; + + while( 1 ){ + Index *pIdx; + int iLargest = 0; + + if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ + int iIdx = pIdx->tnum; + assert( pIdx->pSchema==pTab->pSchema ); + if( (iDestroyed==0 || (iIdxiLargest ){ + iLargest = iIdx; + } + } + if( iLargest==0 ){ + return; + }else{ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + destroyRootPage(pParse, iLargest, iDb); + iDestroyed = iLargest; + } + } +#endif +} + +/* +** This routine is called to do the work of a DROP TABLE statement. +** pName is the name of the table to be dropped. +*/ +void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ + Table *pTab; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( pParse->nErr || db->mallocFailed ){ + goto exit_drop_table; + } + assert( pName->nSrc==1 ); + pTab = sqlite3LocateTable(pParse, pName->a[0].zName, pName->a[0].zDatabase); + + if( pTab==0 ){ + if( noErr ){ + sqlite3ErrorClear(pParse); + } + goto exit_drop_table; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbnDb ); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code; + const char *zTab = SCHEMA_TABLE(iDb); + const char *zDb = db->aDb[iDb].zName; + const char *zArg2 = 0; + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ + goto exit_drop_table; + } + if( isView ){ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_VIEW; + }else{ + code = SQLITE_DROP_VIEW; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( IsVirtual(pTab) ){ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_drop_table; + } + code = SQLITE_DROP_VTABLE; + zArg2 = pTab->pMod->zName; +#endif + }else{ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_TABLE; + }else{ + code = SQLITE_DROP_TABLE; + } + } + if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ + goto exit_drop_table; + } + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto exit_drop_table; + } + } +#endif + if( pTab->readOnly || pTab==db->aDb[iDb].pSchema->pSeqTab ){ + sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); + goto exit_drop_table; + } + +#ifndef SQLITE_OMIT_VIEW + /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used + ** on a table. + */ + if( isView && pTab->pSelect==0 ){ + sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); + goto exit_drop_table; + } + if( !isView && pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); + goto exit_drop_table; + } +#endif + + /* Generate code to remove the table from the master table + ** on disk. + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + Trigger *pTrigger; + Db *pDb = &db->aDb[iDb]; + sqlite3BeginWriteOperation(pParse, 0, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp(v, OP_VBegin, 0, 0); + } + } +#endif + + /* Drop all triggers associated with the table being dropped. Code + ** is generated to remove entries from sqlite_master and/or + ** sqlite_temp_master if required. + */ + pTrigger = pTab->pTrigger; + while( pTrigger ){ + assert( pTrigger->pSchema==pTab->pSchema || + pTrigger->pSchema==db->aDb[1].pSchema ); + sqlite3DropTriggerPtr(pParse, pTrigger); + pTrigger = pTrigger->pNext; + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Remove any entries of the sqlite_sequence table associated with + ** the table being dropped. This is done before the table is dropped + ** at the btree level, in case the sqlite_sequence table needs to + ** move as a result of the drop (can happen in auto-vacuum mode). + */ + if( pTab->autoInc ){ + sqlite3NestedParse(pParse, + "DELETE FROM %s.sqlite_sequence WHERE name=%Q", + pDb->zName, pTab->zName + ); + } +#endif + + /* Drop all SQLITE_MASTER table and index entries that refer to the + ** table. The program name loops through the master table and deletes + ** every row that refers to a table of the same name as the one being + ** dropped. Triggers are handled seperately because a trigger can be + ** created in the temp database that refers to a table in another + ** database. + */ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", + pDb->zName, SCHEMA_TABLE(iDb), pTab->zName); + if( !isView && !IsVirtual(pTab) ){ + destroyTable(pParse, pTab); + } + + /* Remove the table entry from SQLite's internal schema and modify + ** the schema cookie. + */ + if( IsVirtual(pTab) ){ + sqlite3VdbeOp3(v, OP_VDestroy, iDb, 0, pTab->zName, 0); + } + sqlite3VdbeOp3(v, OP_DropTable, iDb, 0, pTab->zName, 0); + sqlite3ChangeCookie(db, v, iDb); + } + sqliteViewResetAll(db, iDb); + +exit_drop_table: + sqlite3SrcListDelete(pName); +} + +/* +** This routine is called to create a new foreign key on the table +** currently under construction. pFromCol determines which columns +** in the current table point to the foreign key. If pFromCol==0 then +** connect the key to the last column inserted. pTo is the name of +** the table referred to. pToCol is a list of tables in the other +** pTo table that the foreign key points to. flags contains all +** information about the conflict resolution algorithms specified +** in the ON DELETE, ON UPDATE and ON INSERT clauses. +** +** An FKey structure is created and added to the table currently +** under construction in the pParse->pNewTable field. The new FKey +** is not linked into db->aFKey at this point - that does not happen +** until sqlite3EndTable(). +** +** The foreign key is set for IMMEDIATE processing. A subsequent call +** to sqlite3DeferForeignKey() might change this to DEFERRED. +*/ +void sqlite3CreateForeignKey( + Parse *pParse, /* Parsing context */ + ExprList *pFromCol, /* Columns in this table that point to other table */ + Token *pTo, /* Name of the other table */ + ExprList *pToCol, /* Columns in the other table */ + int flags /* Conflict resolution algorithms. */ +){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + FKey *pFKey = 0; + Table *p = pParse->pNewTable; + int nByte; + int i; + int nCol; + char *z; + + assert( pTo!=0 ); + if( p==0 || pParse->nErr || IN_DECLARE_VTAB ) goto fk_end; + if( pFromCol==0 ){ + int iCol = p->nCol-1; + if( iCol<0 ) goto fk_end; + if( pToCol && pToCol->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "foreign key on %s" + " should reference only one column of table %T", + p->aCol[iCol].zName, pTo); + goto fk_end; + } + nCol = 1; + }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){ + sqlite3ErrorMsg(pParse, + "number of columns in foreign key does not match the number of " + "columns in the referenced table"); + goto fk_end; + }else{ + nCol = pFromCol->nExpr; + } + nByte = sizeof(*pFKey) + nCol*sizeof(pFKey->aCol[0]) + pTo->n + 1; + if( pToCol ){ + for(i=0; inExpr; i++){ + nByte += strlen(pToCol->a[i].zName) + 1; + } + } + pFKey = sqlite3DbMallocZero(pParse->db, nByte ); + if( pFKey==0 ){ + goto fk_end; + } + pFKey->pFrom = p; + pFKey->pNextFrom = p->pFKey; + z = (char*)&pFKey[1]; + pFKey->aCol = (struct sColMap*)z; + z += sizeof(struct sColMap)*nCol; + pFKey->zTo = z; + memcpy(z, pTo->z, pTo->n); + z[pTo->n] = 0; + z += pTo->n+1; + pFKey->pNextTo = 0; + pFKey->nCol = nCol; + if( pFromCol==0 ){ + pFKey->aCol[0].iFrom = p->nCol-1; + }else{ + for(i=0; inCol; j++){ + if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){ + pFKey->aCol[i].iFrom = j; + break; + } + } + if( j>=p->nCol ){ + sqlite3ErrorMsg(pParse, + "unknown column \"%s\" in foreign key definition", + pFromCol->a[i].zName); + goto fk_end; + } + } + } + if( pToCol ){ + for(i=0; ia[i].zName); + pFKey->aCol[i].zCol = z; + memcpy(z, pToCol->a[i].zName, n); + z[n] = 0; + z += n+1; + } + } + pFKey->isDeferred = 0; + pFKey->deleteConf = flags & 0xff; + pFKey->updateConf = (flags >> 8 ) & 0xff; + pFKey->insertConf = (flags >> 16 ) & 0xff; + + /* Link the foreign key to the table as the last step. + */ + p->pFKey = pFKey; + pFKey = 0; + +fk_end: + sqlite3_free(pFKey); +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + sqlite3ExprListDelete(pFromCol); + sqlite3ExprListDelete(pToCol); +} + +/* +** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED +** clause is seen as part of a foreign key definition. The isDeferred +** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. +** The behavior of the most recently created foreign key is adjusted +** accordingly. +*/ +void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + Table *pTab; + FKey *pFKey; + if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return; + pFKey->isDeferred = isDeferred; +#endif +} + +/* +** Generate code that will erase and refill index *pIdx. This is +** used to initialize a newly created index or to recompute the +** content of an index in response to a REINDEX command. +** +** if memRootPage is not negative, it means that the index is newly +** created. The memory cell specified by memRootPage contains the +** root page number of the index. If memRootPage is negative, then +** the index already exists and must be cleared before being refilled and +** the root page number of the index is taken from pIndex->tnum. +*/ +static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ + Table *pTab = pIndex->pTable; /* The table that is indexed */ + int iTab = pParse->nTab; /* Btree cursor used for pTab */ + int iIdx = pParse->nTab+1; /* Btree cursor used for pIndex */ + int addr1; /* Address of top of loop */ + int tnum; /* Root page of index */ + Vdbe *v; /* Generate code into this virtual machine */ + KeyInfo *pKey; /* KeyInfo for index */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, + db->aDb[iDb].zName ) ){ + return; + } +#endif + + /* Require a write-lock on the table to perform this operation */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + if( memRootPage>=0 ){ + sqlite3VdbeAddOp(v, OP_MemLoad, memRootPage, 0); + tnum = 0; + }else{ + tnum = pIndex->tnum; + sqlite3VdbeAddOp(v, OP_Clear, tnum, iDb); + } + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + pKey = sqlite3IndexKeyinfo(pParse, pIndex); + sqlite3VdbeOp3(v, OP_OpenWrite, iIdx, tnum, (char *)pKey, P3_KEYINFO_HANDOFF); + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iTab, 0); + sqlite3GenerateIndexKey(v, pIndex, iTab); + if( pIndex->onError!=OE_None ){ + int curaddr = sqlite3VdbeCurrentAddr(v); + int addr2 = curaddr+4; + sqlite3VdbeChangeP2(v, curaddr-1, addr2); + sqlite3VdbeAddOp(v, OP_Rowid, iTab, 0); + sqlite3VdbeAddOp(v, OP_AddImm, 1, 0); + sqlite3VdbeAddOp(v, OP_IsUnique, iIdx, addr2); + sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, OE_Abort, + "indexed columns are not unique", P3_STATIC); + assert( db->mallocFailed || addr2==sqlite3VdbeCurrentAddr(v) ); + } + sqlite3VdbeAddOp(v, OP_IdxInsert, iIdx, 0); + sqlite3VdbeAddOp(v, OP_Next, iTab, addr1+1); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp(v, OP_Close, iTab, 0); + sqlite3VdbeAddOp(v, OP_Close, iIdx, 0); +} + +/* +** Create a new index for an SQL table. pName1.pName2 is the name of the index +** and pTblList is the name of the table that is to be indexed. Both will +** be NULL for a primary key or an index that is created to satisfy a +** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable +** as the table to be indexed. pParse->pNewTable is a table that is +** currently being constructed by a CREATE TABLE statement. +** +** pList is a list of columns to be indexed. pList will be NULL if this +** is a primary key or unique-constraint on the most recent column added +** to the table currently under construction. +*/ +void sqlite3CreateIndex( + Parse *pParse, /* All information about this parse */ + Token *pName1, /* First part of index name. May be NULL */ + Token *pName2, /* Second part of index name. May be NULL */ + SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */ + ExprList *pList, /* A list of columns to be indexed */ + int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + Token *pStart, /* The CREATE token that begins this statement */ + Token *pEnd, /* The ")" that closes the CREATE INDEX statement */ + int sortOrder, /* Sort order of primary key when pList==NULL */ + int ifNotExist /* Omit error if index already exists */ +){ + Table *pTab = 0; /* Table to be indexed */ + Index *pIndex = 0; /* The index to be created */ + char *zName = 0; /* Name of the index */ + int nName; /* Number of characters in zName */ + int i, j; + Token nullId; /* Fake token for an empty ID list */ + DbFixer sFix; /* For assigning database names to pTable */ + int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */ + sqlite3 *db = pParse->db; + Db *pDb; /* The specific table containing the indexed database */ + int iDb; /* Index of the database that is being written */ + Token *pName = 0; /* Unqualified name of the index to create */ + struct ExprList_item *pListItem; /* For looping over pList */ + int nCol; + int nExtra = 0; + char *zExtra; + + if( pParse->nErr || db->mallocFailed || IN_DECLARE_VTAB ){ + goto exit_create_index; + } + + /* + ** Find the table that is to be indexed. Return early if not found. + */ + if( pTblName!=0 ){ + + /* Use the two-part index name to determine the database + ** to search for the table. 'Fix' the table name to this db + ** before looking up the table. + */ + assert( pName1 && pName2 ); + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) goto exit_create_index; + +#ifndef SQLITE_OMIT_TEMPDB + /* If the index name was unqualified, check if the the table + ** is a temp table. If so, set the database to 1. + */ + pTab = sqlite3SrcListLookup(pParse, pTblName); + if( pName2 && pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } +#endif + + if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) && + sqlite3FixSrcList(&sFix, pTblName) + ){ + /* Because the parser constructs pTblName from a single identifier, + ** sqlite3FixSrcList can never fail. */ + assert(0); + } + pTab = sqlite3LocateTable(pParse, pTblName->a[0].zName, + pTblName->a[0].zDatabase); + if( !pTab ) goto exit_create_index; + assert( db->aDb[iDb].pSchema==pTab->pSchema ); + }else{ + assert( pName==0 ); + pTab = pParse->pNewTable; + if( !pTab ) goto exit_create_index; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + } + pDb = &db->aDb[iDb]; + + if( pTab==0 || pParse->nErr ) goto exit_create_index; + if( pTab->readOnly ){ + sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); + goto exit_create_index; + } +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "views may not be indexed"); + goto exit_create_index; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); + goto exit_create_index; + } +#endif + + /* + ** Find the name of the index. Make sure there is not already another + ** index or table with the same name. + ** + ** Exception: If we are reading the names of permanent indices from the + ** sqlite_master table (because some other process changed the schema) and + ** one of the index names collides with the name of a temporary table or + ** index, then we will continue to process this index. + ** + ** If pName==0 it means that we are + ** dealing with a primary key or UNIQUE constraint. We have to invent our + ** own name. + */ + if( pName ){ + zName = sqlite3NameFromToken(db, pName); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index; + if( zName==0 ) goto exit_create_index; + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + goto exit_create_index; + } + if( !db->init.busy ){ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index; + if( sqlite3FindTable(db, zName, 0)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); + goto exit_create_index; + } + } + if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){ + if( !ifNotExist ){ + sqlite3ErrorMsg(pParse, "index %s already exists", zName); + } + goto exit_create_index; + } + }else{ + char zBuf[30]; + int n; + Index *pLoop; + for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){} + sqlite3_snprintf(sizeof(zBuf),zBuf,"_%d",n); + zName = 0; + sqlite3SetString(&zName, "sqlite_autoindex_", pTab->zName, zBuf, (char*)0); + if( zName==0 ){ + db->mallocFailed = 1; + goto exit_create_index; + } + } + + /* Check for authorization to create an index. + */ +#ifndef SQLITE_OMIT_AUTHORIZATION + { + const char *zDb = pDb->zName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ + goto exit_create_index; + } + i = SQLITE_CREATE_INDEX; + if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){ + goto exit_create_index; + } + } +#endif + + /* If pList==0, it means this routine was called to make a primary + ** key out of the last column added to the table under construction. + ** So create a fake list to simulate this. + */ + if( pList==0 ){ + nullId.z = (u8*)pTab->aCol[pTab->nCol-1].zName; + nullId.n = strlen((char*)nullId.z); + pList = sqlite3ExprListAppend(pParse, 0, 0, &nullId); + if( pList==0 ) goto exit_create_index; + pList->a[0].sortOrder = sortOrder; + } + + /* Figure out how many bytes of space are required to store explicitly + ** specified collation sequence names. + */ + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + if( pExpr ){ + nExtra += (1 + strlen(pExpr->pColl->zName)); + } + } + + /* + ** Allocate the index structure. + */ + nName = strlen(zName); + nCol = pList->nExpr; + pIndex = sqlite3DbMallocZero(db, + sizeof(Index) + /* Index structure */ + sizeof(int)*nCol + /* Index.aiColumn */ + sizeof(int)*(nCol+1) + /* Index.aiRowEst */ + sizeof(char *)*nCol + /* Index.azColl */ + sizeof(u8)*nCol + /* Index.aSortOrder */ + nName + 1 + /* Index.zName */ + nExtra /* Collation sequence names */ + ); + if( db->mallocFailed ){ + goto exit_create_index; + } + pIndex->azColl = (char**)(&pIndex[1]); + pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]); + pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]); + pIndex->aSortOrder = (u8 *)(&pIndex->aiRowEst[nCol+1]); + pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]); + zExtra = (char *)(&pIndex->zName[nName+1]); + memcpy(pIndex->zName, zName, nName+1); + pIndex->pTable = pTab; + pIndex->nColumn = pList->nExpr; + pIndex->onError = onError; + pIndex->autoIndex = pName==0; + pIndex->pSchema = db->aDb[iDb].pSchema; + + /* Check to see if we should honor DESC requests on index columns + */ + if( pDb->pSchema->file_format>=4 ){ + sortOrderMask = -1; /* Honor DESC */ + }else{ + sortOrderMask = 0; /* Ignore DESC */ + } + + /* Scan the names of the columns of the table to be indexed and + ** load the column indices into the Index structure. Report an error + ** if any column is not found. + */ + for(i=0, pListItem=pList->a; inExpr; i++, pListItem++){ + const char *zColName = pListItem->zName; + Column *pTabCol; + int requestedSortOrder; + char *zColl; /* Collation sequence name */ + + for(j=0, pTabCol=pTab->aCol; jnCol; j++, pTabCol++){ + if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break; + } + if( j>=pTab->nCol ){ + sqlite3ErrorMsg(pParse, "table %s has no column named %s", + pTab->zName, zColName); + goto exit_create_index; + } + /* TODO: Add a test to make sure that the same column is not named + ** more than once within the same index. Only the first instance of + ** the column will ever be used by the optimizer. Note that using the + ** same column more than once cannot be an error because that would + ** break backwards compatibility - it needs to be a warning. + */ + pIndex->aiColumn[i] = j; + if( pListItem->pExpr ){ + assert( pListItem->pExpr->pColl ); + zColl = zExtra; + sqlite3_snprintf(nExtra, zExtra, "%s", pListItem->pExpr->pColl->zName); + zExtra += (strlen(zColl) + 1); + }else{ + zColl = pTab->aCol[j].zColl; + if( !zColl ){ + zColl = db->pDfltColl->zName; + } + } + if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl, -1) ){ + goto exit_create_index; + } + pIndex->azColl[i] = zColl; + requestedSortOrder = pListItem->sortOrder & sortOrderMask; + pIndex->aSortOrder[i] = requestedSortOrder; + } + sqlite3DefaultRowEst(pIndex); + + if( pTab==pParse->pNewTable ){ + /* This routine has been called to create an automatic index as a + ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or + ** a PRIMARY KEY or UNIQUE clause following the column definitions. + ** i.e. one of: + ** + ** CREATE TABLE t(x PRIMARY KEY, y); + ** CREATE TABLE t(x, y, UNIQUE(x, y)); + ** + ** Either way, check to see if the table already has such an index. If + ** so, don't bother creating this one. This only applies to + ** automatically created indices. Users can do as they wish with + ** explicit indices. + */ + Index *pIdx; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int k; + assert( pIdx->onError!=OE_None ); + assert( pIdx->autoIndex ); + assert( pIndex->onError!=OE_None ); + + if( pIdx->nColumn!=pIndex->nColumn ) continue; + for(k=0; knColumn; k++){ + const char *z1 = pIdx->azColl[k]; + const char *z2 = pIndex->azColl[k]; + if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; + if( pIdx->aSortOrder[k]!=pIndex->aSortOrder[k] ) break; + if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break; + } + if( k==pIdx->nColumn ){ + if( pIdx->onError!=pIndex->onError ){ + /* This constraint creates the same index as a previous + ** constraint specified somewhere in the CREATE TABLE statement. + ** However the ON CONFLICT clauses are different. If both this + ** constraint and the previous equivalent constraint have explicit + ** ON CONFLICT clauses this is an error. Otherwise, use the + ** explicitly specified behaviour for the index. + */ + if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ + sqlite3ErrorMsg(pParse, + "conflicting ON CONFLICT clauses specified", 0); + } + if( pIdx->onError==OE_Default ){ + pIdx->onError = pIndex->onError; + } + } + goto exit_create_index; + } + } + } + + /* Link the new Index structure to its table and to the other + ** in-memory database structures. + */ + if( db->init.busy ){ + Index *p; + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + pIndex->zName, strlen(pIndex->zName)+1, pIndex); + if( p ){ + assert( p==pIndex ); /* Malloc must have failed */ + db->mallocFailed = 1; + goto exit_create_index; + } + db->flags |= SQLITE_InternChanges; + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + } + } + + /* If the db->init.busy is 0 then create the index on disk. This + ** involves writing the index into the master table and filling in the + ** index with the current table contents. + ** + ** The db->init.busy is 0 when the user first enters a CREATE INDEX + ** command. db->init.busy is 1 when a database is opened and + ** CREATE INDEX statements are read out of the master table. In + ** the latter case the index already exists on disk, which is why + ** we don't want to recreate it. + ** + ** If pTblName==0 it means this index is generated as a primary key + ** or UNIQUE constraint of a CREATE TABLE statement. Since the table + ** has just been created, it contains no data and the index initialization + ** step can be skipped. + */ + else if( db->init.busy==0 ){ + Vdbe *v; + char *zStmt; + int iMem = pParse->nMem++; + + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto exit_create_index; + + + /* Create the rootpage for the index + */ + sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3VdbeAddOp(v, OP_CreateIndex, iDb, 0); + sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0); + + /* Gather the complete text of the CREATE INDEX statement into + ** the zStmt variable + */ + if( pStart && pEnd ){ + /* A named index with an explicit CREATE INDEX statement */ + zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", + onError==OE_None ? "" : " UNIQUE", + pEnd->z - pName->z + 1, + pName->z); + }else{ + /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */ + /* zStmt = sqlite3MPrintf(""); */ + zStmt = 0; + } + + /* Add an entry in sqlite_master for this index + */ + sqlite3NestedParse(pParse, + "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#0,%Q);", + db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + pIndex->zName, + pTab->zName, + zStmt + ); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3_free(zStmt); + + /* Fill the index with data and reparse the schema. Code an OP_Expire + ** to invalidate all pre-compiled statements. + */ + if( pTblName ){ + sqlite3RefillIndex(pParse, pIndex, iMem); + sqlite3ChangeCookie(db, v, iDb); + sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, + sqlite3MPrintf(db, "name='%q'", pIndex->zName), P3_DYNAMIC); + sqlite3VdbeAddOp(v, OP_Expire, 0, 0); + } + } + + /* When adding an index to the list of indices for a table, make + ** sure all indices labeled OE_Replace come after all those labeled + ** OE_Ignore. This is necessary for the correct operation of UPDATE + ** and INSERT. + */ + if( db->init.busy || pTblName==0 ){ + if( onError!=OE_Replace || pTab->pIndex==0 + || pTab->pIndex->onError==OE_Replace){ + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; + }else{ + Index *pOther = pTab->pIndex; + while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){ + pOther = pOther->pNext; + } + pIndex->pNext = pOther->pNext; + pOther->pNext = pIndex; + } + pIndex = 0; + } + + /* Clean up before exiting */ +exit_create_index: + if( pIndex ){ + freeIndex(pIndex); + } + sqlite3ExprListDelete(pList); + sqlite3SrcListDelete(pTblName); + sqlite3_free(zName); + return; +} + +/* +** Generate code to make sure the file format number is at least minFormat. +** The generated code will increase the file format number if necessary. +*/ +void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){ + Vdbe *v; + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1); + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0); + sqlite3VdbeAddOp(v, OP_Ge, 0, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0); + sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1); + } +} + +/* +** Fill the Index.aiRowEst[] array with default information - information +** to be used when we have not run the ANALYZE command. +** +** aiRowEst[0] is suppose to contain the number of elements in the index. +** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the +** number of rows in the table that match any particular value of the +** first column of the index. aiRowEst[2] is an estimate of the number +** of rows that match any particular combiniation of the first 2 columns +** of the index. And so forth. It must always be the case that +* +** aiRowEst[N]<=aiRowEst[N-1] +** aiRowEst[N]>=1 +** +** Apart from that, we have little to go on besides intuition as to +** how aiRowEst[] should be initialized. The numbers generated here +** are based on typical values found in actual indices. +*/ +void sqlite3DefaultRowEst(Index *pIdx){ + unsigned *a = pIdx->aiRowEst; + int i; + assert( a!=0 ); + a[0] = 1000000; + for(i=pIdx->nColumn; i>=5; i--){ + a[i] = 5; + } + while( i>=1 ){ + a[i] = 11 - i; + i--; + } + if( pIdx->onError!=OE_None ){ + a[pIdx->nColumn] = 1; + } +} + +/* +** This routine will drop an existing named index. This routine +** implements the DROP INDEX statement. +*/ +void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ + Index *pIndex; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( pParse->nErr || db->mallocFailed ){ + goto exit_drop_index; + } + assert( pName->nSrc==1 ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_drop_index; + } + pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); + if( pIndex==0 ){ + if( !ifExists ){ + sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0); + } + pParse->checkSchema = 1; + goto exit_drop_index; + } + if( pIndex->autoIndex ){ + sqlite3ErrorMsg(pParse, "index associated with UNIQUE " + "or PRIMARY KEY constraint cannot be dropped", 0); + goto exit_drop_index; + } + iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_INDEX; + Table *pTab = pIndex->pTable; + const char *zDb = db->aDb[iDb].zName; + const char *zTab = SCHEMA_TABLE(iDb); + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto exit_drop_index; + } + if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ + goto exit_drop_index; + } + } +#endif + + /* Generate code to remove the index and from the master table */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q", + db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + pIndex->zName + ); + sqlite3ChangeCookie(db, v, iDb); + destroyRootPage(pParse, pIndex->tnum, iDb); + sqlite3VdbeOp3(v, OP_DropIndex, iDb, 0, pIndex->zName, 0); + } + +exit_drop_index: + sqlite3SrcListDelete(pName); +} + +/* +** pArray is a pointer to an array of objects. Each object in the +** array is szEntry bytes in size. This routine allocates a new +** object on the end of the array. +** +** *pnEntry is the number of entries already in use. *pnAlloc is +** the previously allocated size of the array. initSize is the +** suggested initial array size allocation. +** +** The index of the new entry is returned in *pIdx. +** +** This routine returns a pointer to the array of objects. This +** might be the same as the pArray parameter or it might be a different +** pointer if the array was resized. +*/ +void *sqlite3ArrayAllocate( + sqlite3 *db, /* Connection to notify of malloc failures */ + void *pArray, /* Array of objects. Might be reallocated */ + int szEntry, /* Size of each object in the array */ + int initSize, /* Suggested initial allocation, in elements */ + int *pnEntry, /* Number of objects currently in use */ + int *pnAlloc, /* Current size of the allocation, in elements */ + int *pIdx /* Write the index of a new slot here */ +){ + char *z; + if( *pnEntry >= *pnAlloc ){ + void *pNew; + int newSize; + newSize = (*pnAlloc)*2 + initSize; + pNew = sqlite3DbRealloc(db, pArray, newSize*szEntry); + if( pNew==0 ){ + *pIdx = -1; + return pArray; + } + *pnAlloc = newSize; + pArray = pNew; + } + z = (char*)pArray; + memset(&z[*pnEntry * szEntry], 0, szEntry); + *pIdx = *pnEntry; + ++*pnEntry; + return pArray; +} + +/* +** Append a new element to the given IdList. Create a new IdList if +** need be. +** +** A new IdList is returned, or NULL if malloc() fails. +*/ +IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){ + int i; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(IdList) ); + if( pList==0 ) return 0; + pList->nAlloc = 0; + } + pList->a = sqlite3ArrayAllocate( + db, + pList->a, + sizeof(pList->a[0]), + 5, + &pList->nId, + &pList->nAlloc, + &i + ); + if( i<0 ){ + sqlite3IdListDelete(pList); + return 0; + } + pList->a[i].zName = sqlite3NameFromToken(db, pToken); + return pList; +} + +/* +** Delete an IdList. +*/ +void sqlite3IdListDelete(IdList *pList){ + int i; + if( pList==0 ) return; + for(i=0; inId; i++){ + sqlite3_free(pList->a[i].zName); + } + sqlite3_free(pList->a); + sqlite3_free(pList); +} + +/* +** Return the index in pList of the identifier named zId. Return -1 +** if not found. +*/ +int sqlite3IdListIndex(IdList *pList, const char *zName){ + int i; + if( pList==0 ) return -1; + for(i=0; inId; i++){ + if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; + } + return -1; +} + +/* +** Append a new table name to the given SrcList. Create a new SrcList if +** need be. A new entry is created in the SrcList even if pToken is NULL. +** +** A new SrcList is returned, or NULL if malloc() fails. +** +** If pDatabase is not null, it means that the table has an optional +** database name prefix. Like this: "database.table". The pDatabase +** points to the table name and the pTable points to the database name. +** The SrcList.a[].zName field is filled with the table name which might +** come from pTable (if pDatabase is NULL) or from pDatabase. +** SrcList.a[].zDatabase is filled with the database name from pTable, +** or with NULL if no database is specified. +** +** In other words, if call like this: +** +** sqlite3SrcListAppend(D,A,B,0); +** +** Then B is a table name and the database name is unspecified. If called +** like this: +** +** sqlite3SrcListAppend(D,A,B,C); +** +** Then C is the table name and B is the database name. +*/ +SrcList *sqlite3SrcListAppend( + sqlite3 *db, /* Connection to notify of malloc failures */ + SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ + Token *pTable, /* Table to append */ + Token *pDatabase /* Database of the table */ +){ + struct SrcList_item *pItem; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(SrcList) ); + if( pList==0 ) return 0; + pList->nAlloc = 1; + } + if( pList->nSrc>=pList->nAlloc ){ + SrcList *pNew; + pList->nAlloc *= 2; + pNew = sqlite3DbRealloc(db, pList, + sizeof(*pList) + (pList->nAlloc-1)*sizeof(pList->a[0]) ); + if( pNew==0 ){ + sqlite3SrcListDelete(pList); + return 0; + } + pList = pNew; + } + pItem = &pList->a[pList->nSrc]; + memset(pItem, 0, sizeof(pList->a[0])); + if( pDatabase && pDatabase->z==0 ){ + pDatabase = 0; + } + if( pDatabase && pTable ){ + Token *pTemp = pDatabase; + pDatabase = pTable; + pTable = pTemp; + } + pItem->zName = sqlite3NameFromToken(db, pTable); + pItem->zDatabase = sqlite3NameFromToken(db, pDatabase); + pItem->iCursor = -1; + pItem->isPopulated = 0; + pList->nSrc++; + return pList; +} + +/* +** Assign cursors to all tables in a SrcList +*/ +void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ + int i; + struct SrcList_item *pItem; + assert(pList || pParse->db->mallocFailed ); + if( pList ){ + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pItem->iCursor>=0 ) break; + pItem->iCursor = pParse->nTab++; + if( pItem->pSelect ){ + sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); + } + } + } +} + +/* +** Delete an entire SrcList including all its substructure. +*/ +void sqlite3SrcListDelete(SrcList *pList){ + int i; + struct SrcList_item *pItem; + if( pList==0 ) return; + for(pItem=pList->a, i=0; inSrc; i++, pItem++){ + sqlite3_free(pItem->zDatabase); + sqlite3_free(pItem->zName); + sqlite3_free(pItem->zAlias); + sqlite3DeleteTable(pItem->pTab); + sqlite3SelectDelete(pItem->pSelect); + sqlite3ExprDelete(pItem->pOn); + sqlite3IdListDelete(pItem->pUsing); + } + sqlite3_free(pList); +} + +/* +** This routine is called by the parser to add a new term to the +** end of a growing FROM clause. The "p" parameter is the part of +** the FROM clause that has already been constructed. "p" is NULL +** if this is the first term of the FROM clause. pTable and pDatabase +** are the name of the table and database named in the FROM clause term. +** pDatabase is NULL if the database name qualifier is missing - the +** usual case. If the term has a alias, then pAlias points to the +** alias token. If the term is a subquery, then pSubquery is the +** SELECT statement that the subquery encodes. The pTable and +** pDatabase parameters are NULL for subqueries. The pOn and pUsing +** parameters are the content of the ON and USING clauses. +** +** Return a new SrcList which encodes is the FROM with the new +** term added. +*/ +SrcList *sqlite3SrcListAppendFromTerm( + Parse *pParse, /* Parsing context */ + SrcList *p, /* The left part of the FROM clause already seen */ + Token *pTable, /* Name of the table to add to the FROM clause */ + Token *pDatabase, /* Name of the database containing pTable */ + Token *pAlias, /* The right-hand side of the AS subexpression */ + Select *pSubquery, /* A subquery used in place of a table name */ + Expr *pOn, /* The ON clause of a join */ + IdList *pUsing /* The USING clause of a join */ +){ + struct SrcList_item *pItem; + sqlite3 *db = pParse->db; + p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + if( p==0 || p->nSrc==0 ){ + sqlite3ExprDelete(pOn); + sqlite3IdListDelete(pUsing); + sqlite3SelectDelete(pSubquery); + return p; + } + pItem = &p->a[p->nSrc-1]; + if( pAlias && pAlias->n ){ + pItem->zAlias = sqlite3NameFromToken(db, pAlias); + } + pItem->pSelect = pSubquery; + pItem->pOn = pOn; + pItem->pUsing = pUsing; + return p; +} + +/* +** When building up a FROM clause in the parser, the join operator +** is initially attached to the left operand. But the code generator +** expects the join operator to be on the right operand. This routine +** Shifts all join operators from left to right for an entire FROM +** clause. +** +** Example: Suppose the join is like this: +** +** A natural cross join B +** +** The operator is "natural cross join". The A and B operands are stored +** in p->a[0] and p->a[1], respectively. The parser initially stores the +** operator with A. This routine shifts that operator over to B. +*/ +void sqlite3SrcListShiftJoinType(SrcList *p){ + if( p && p->a ){ + int i; + for(i=p->nSrc-1; i>0; i--){ + p->a[i].jointype = p->a[i-1].jointype; + } + p->a[0].jointype = 0; + } +} + +/* +** Begin a transaction +*/ +void sqlite3BeginTransaction(Parse *pParse, int type){ + sqlite3 *db; + Vdbe *v; + int i; + + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; + if( pParse->nErr || db->mallocFailed ) return; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return; + + v = sqlite3GetVdbe(pParse); + if( !v ) return; + if( type!=TK_DEFERRED ){ + for(i=0; inDb; i++){ + sqlite3VdbeAddOp(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1); + sqlite3VdbeUsesBtree(v, i); + } + } + sqlite3VdbeAddOp(v, OP_AutoCommit, 0, 0); +} + +/* +** Commit a transaction +*/ +void sqlite3CommitTransaction(Parse *pParse){ + sqlite3 *db; + Vdbe *v; + + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; + if( pParse->nErr || db->mallocFailed ) return; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return; + + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 0); + } +} + +/* +** Rollback a transaction +*/ +void sqlite3RollbackTransaction(Parse *pParse){ + sqlite3 *db; + Vdbe *v; + + if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; + if( pParse->nErr || db->mallocFailed ) return; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return; + + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 1); + } +} + +/* +** Make sure the TEMP database is open and available for use. Return +** the number of errors. Leave any error messages in the pParse structure. +*/ +int sqlite3OpenTempDatabase(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt==0 && !pParse->explain ){ + int rc; + static const int flags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TEMP_DB; + + rc = sqlite3BtreeFactory(db, 0, 0, SQLITE_DEFAULT_CACHE_SIZE, flags, + &db->aDb[1].pBt); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "unable to open a temporary database " + "file for storing temporary tables"); + pParse->rc = rc; + return 1; + } + if( db->flags & !db->autoCommit ){ + rc = sqlite3BtreeBeginTrans(db->aDb[1].pBt, 1); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "unable to get a write lock on " + "the temporary database file"); + pParse->rc = rc; + return 1; + } + } + assert( db->aDb[1].pSchema ); + } + return 0; +} + +/* +** Generate VDBE code that will verify the schema cookie and start +** a read-transaction for all named database files. +** +** It is important that all schema cookies be verified and all +** read transactions be started before anything else happens in +** the VDBE program. But this routine can be called after much other +** code has been generated. So here is what we do: +** +** The first time this routine is called, we code an OP_Goto that +** will jump to a subroutine at the end of the program. Then we +** record every database that needs its schema verified in the +** pParse->cookieMask field. Later, after all other code has been +** generated, the subroutine that does the cookie verifications and +** starts the transactions will be coded and the OP_Goto P2 value +** will be made to point to that subroutine. The generation of the +** cookie verification subroutine code happens in sqlite3FinishCoding(). +** +** If iDb<0 then code the OP_Goto only - don't set flag to verify the +** schema on any databases. This can be used to position the OP_Goto +** early in the code, before we know if any database tables will be used. +*/ +void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ + sqlite3 *db; + Vdbe *v; + int mask; + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; /* This only happens if there was a prior error */ + db = pParse->db; + if( pParse->cookieGoto==0 ){ + pParse->cookieGoto = sqlite3VdbeAddOp(v, OP_Goto, 0, 0)+1; + } + if( iDb>=0 ){ + assert( iDbnDb ); + assert( db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDbcookieMask & mask)==0 ){ + pParse->cookieMask |= mask; + pParse->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; + if( !OMIT_TEMPDB && iDb==1 ){ + sqlite3OpenTempDatabase(pParse); + } + } + } +} + +/* +** Generate VDBE code that prepares for doing an operation that +** might change the database. +** +** This routine starts a new transaction if we are not already within +** a transaction. If we are already within a transaction, then a checkpoint +** is set if the setStatement parameter is true. A checkpoint should +** be set for operations that might fail (due to a constraint) part of +** the way through and which will need to undo some writes without having to +** rollback the whole transaction. For operations where all constraints +** can be checked before any changes are made to the database, it is never +** necessary to undo a write and the checkpoint should not be set. +** +** Only database iDb and the temp database are made writable by this call. +** If iDb==0, then the main and temp databases are made writable. If +** iDb==1 then only the temp database is made writable. If iDb>1 then the +** specified auxiliary database and the temp database are made writable. +*/ +void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + sqlite3CodeVerifySchema(pParse, iDb); + pParse->writeMask |= 1<nested==0 ){ + sqlite3VdbeAddOp(v, OP_Statement, iDb, 0); + } + if( (OMIT_TEMPDB || iDb!=1) && pParse->db->aDb[1].pBt!=0 ){ + sqlite3BeginWriteOperation(pParse, setStatement, 1); + } +} + +/* +** Check to see if pIndex uses the collating sequence pColl. Return +** true if it does and false if it does not. +*/ +#ifndef SQLITE_OMIT_REINDEX +static int collationMatch(const char *zColl, Index *pIndex){ + int i; + for(i=0; inColumn; i++){ + const char *z = pIndex->azColl[i]; + if( z==zColl || (z && zColl && 0==sqlite3StrICmp(z, zColl)) ){ + return 1; + } + } + return 0; +} +#endif + +/* +** Recompute all indices of pTab that use the collating sequence pColl. +** If pColl==0 then recompute all indices of pTab. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ + Index *pIndex; /* An index associated with pTab */ + + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } + } +} +#endif + +/* +** Recompute all indices of all tables in all databases where the +** indices use the collating sequence pColl. If pColl==0 then recompute +** all indices everywhere. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexDatabases(Parse *pParse, char const *zColl){ + Db *pDb; /* A single database */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + HashElem *k; /* For looping over tables in pDb */ + Table *pTab; /* A table in the database */ + + for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ + assert( pDb!=0 ); + for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + reindexTable(pParse, pTab, zColl); + } + } +} +#endif + +/* +** Generate code for the REINDEX command. +** +** REINDEX -- 1 +** REINDEX -- 2 +** REINDEX ?.? -- 3 +** REINDEX ?.? -- 4 +** +** Form 1 causes all indices in all attached databases to be rebuilt. +** Form 2 rebuilds all indices in all databases that use the named +** collating function. Forms 3 and 4 rebuild the named index or all +** indices associated with the named table. +*/ +#ifndef SQLITE_OMIT_REINDEX +void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ + CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */ + char *z; /* Name of a table or index */ + const char *zDb; /* Name of the database */ + Table *pTab; /* A table in the database */ + Index *pIndex; /* An index associated with pTab */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + Token *pObjName; /* Name of the table or index to be reindexed */ + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + if( pName1==0 || pName1->z==0 ){ + reindexDatabases(pParse, 0); + return; + }else if( pName2==0 || pName2->z==0 ){ + assert( pName1->z ); + pColl = sqlite3FindCollSeq(db, ENC(db), (char*)pName1->z, pName1->n, 0); + if( pColl ){ + char *zColl = sqlite3DbStrNDup(db, (const char *)pName1->z, pName1->n); + if( zColl ){ + reindexDatabases(pParse, zColl); + sqlite3_free(zColl); + } + return; + } + } + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); + if( iDb<0 ) return; + z = sqlite3NameFromToken(db, pObjName); + if( z==0 ) return; + zDb = db->aDb[iDb].zName; + pTab = sqlite3FindTable(db, z, zDb); + if( pTab ){ + reindexTable(pParse, pTab, 0); + sqlite3_free(z); + return; + } + pIndex = sqlite3FindIndex(db, z, zDb); + sqlite3_free(z); + if( pIndex ){ + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + return; + } + sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed"); +} +#endif + +/* +** Return a dynamicly allocated KeyInfo structure that can be used +** with OP_OpenRead or OP_OpenWrite to access database index pIdx. +** +** If successful, a pointer to the new structure is returned. In this case +** the caller is responsible for calling sqlite3_free() on the returned +** pointer. If an error occurs (out of memory or missing collation +** sequence), NULL is returned and the state of pParse updated to reflect +** the error. +*/ +KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){ + int i; + int nCol = pIdx->nColumn; + int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol; + KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(pParse->db, nBytes); + + if( pKey ){ + pKey->db = pParse->db; + pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]); + assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) ); + for(i=0; iazColl[i]; + assert( zColl ); + pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl, -1); + pKey->aSortOrder[i] = pIdx->aSortOrder[i]; + } + pKey->nField = nCol; + } + + if( pParse->nErr ){ + sqlite3_free(pKey); + pKey = 0; + } + return pKey; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c b/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c new file mode 100644 index 0000000000..009cfd740e --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c @@ -0,0 +1,378 @@ +/* +** 2005 May 23 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains functions used to access the internal hash tables +** of user defined functions and collation sequences. +** +** $Id: callback.c,v 1.23 2007/08/29 12:31:26 danielk1977 Exp $ +*/ + +#include "sqliteInt.h" + +/* +** Invoke the 'collation needed' callback to request a collation sequence +** in the database text encoding of name zName, length nName. +** If the collation sequence +*/ +static void callCollNeeded(sqlite3 *db, const char *zName, int nName){ + assert( !db->xCollNeeded || !db->xCollNeeded16 ); + if( nName<0 ) nName = strlen(zName); + if( db->xCollNeeded ){ + char *zExternal = sqlite3DbStrNDup(db, zName, nName); + if( !zExternal ) return; + db->xCollNeeded(db->pCollNeededArg, db, (int)ENC(db), zExternal); + sqlite3_free(zExternal); + } +#ifndef SQLITE_OMIT_UTF16 + if( db->xCollNeeded16 ){ + char const *zExternal; + sqlite3_value *pTmp = sqlite3ValueNew(db); + sqlite3ValueSetStr(pTmp, nName, zName, SQLITE_UTF8, SQLITE_STATIC); + zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); + if( zExternal ){ + db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); + } + sqlite3ValueFree(pTmp); + } +#endif +} + +/* +** This routine is called if the collation factory fails to deliver a +** collation function in the best encoding but there may be other versions +** of this collation function (for other text encodings) available. Use one +** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if +** possible. +*/ +static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ + CollSeq *pColl2; + char *z = pColl->zName; + int n = strlen(z); + int i; + static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; + for(i=0; i<3; i++){ + pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, n, 0); + if( pColl2->xCmp!=0 ){ + memcpy(pColl, pColl2, sizeof(CollSeq)); + pColl->xDel = 0; /* Do not copy the destructor */ + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the database native +** encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. +*/ +CollSeq *sqlite3GetCollSeq( + sqlite3* db, + CollSeq *pColl, + const char *zName, + int nName +){ + CollSeq *p; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, zName, nName); + p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + return p; +} + +/* +** This routine is called on a collation sequence before it is used to +** check that it is defined. An undefined collation sequence exists when +** a database is loaded that contains references to collation sequences +** that have not been defined by sqlite3_create_collation() etc. +** +** If required, this routine calls the 'collation needed' callback to +** request a definition of the collating sequence. If this doesn't work, +** an equivalent collating sequence that uses a text encoding different +** from the main database is substituted, if one is available. +*/ +int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ + if( pColl ){ + const char *zName = pColl->zName; + CollSeq *p = sqlite3GetCollSeq(pParse->db, pColl, zName, -1); + if( !p ){ + if( pParse->nErr==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + } + pParse->nErr++; + return SQLITE_ERROR; + } + assert( p==pColl ); + } + return SQLITE_OK; +} + + + +/* +** Locate and return an entry from the db.aCollSeq hash table. If the entry +** specified by zName and nName is not found and parameter 'create' is +** true, then create a new entry. Otherwise return NULL. +** +** Each pointer stored in the sqlite3.aCollSeq hash table contains an +** array of three CollSeq structures. The first is the collation sequence +** prefferred for UTF-8, the second UTF-16le, and the third UTF-16be. +** +** Stored immediately after the three collation sequences is a copy of +** the collation sequence name. A pointer to this string is stored in +** each collation sequence structure. +*/ +static CollSeq *findCollSeqEntry( + sqlite3 *db, + const char *zName, + int nName, + int create +){ + CollSeq *pColl; + if( nName<0 ) nName = strlen(zName); + pColl = sqlite3HashFind(&db->aCollSeq, zName, nName); + + if( 0==pColl && create ){ + pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName + 1 ); + if( pColl ){ + CollSeq *pDel = 0; + pColl[0].zName = (char*)&pColl[3]; + pColl[0].enc = SQLITE_UTF8; + pColl[1].zName = (char*)&pColl[3]; + pColl[1].enc = SQLITE_UTF16LE; + pColl[2].zName = (char*)&pColl[3]; + pColl[2].enc = SQLITE_UTF16BE; + memcpy(pColl[0].zName, zName, nName); + pColl[0].zName[nName] = 0; + pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, nName, pColl); + + /* If a malloc() failure occured in sqlite3HashInsert(), it will + ** return the pColl pointer to be deleted (because it wasn't added + ** to the hash table). + */ + assert( pDel==0 || pDel==pColl ); + if( pDel!=0 ){ + db->mallocFailed = 1; + sqlite3_free(pDel); + pColl = 0; + } + } + } + return pColl; +} + +/* +** Parameter zName points to a UTF-8 encoded string nName bytes long. +** Return the CollSeq* pointer for the collation sequence named zName +** for the encoding 'enc' from the database 'db'. +** +** If the entry specified is not found and 'create' is true, then create a +** new entry. Otherwise return NULL. +** +** A separate function sqlite3LocateCollSeq() is a wrapper around +** this routine. sqlite3LocateCollSeq() invokes the collation factory +** if necessary and generates an error message if the collating sequence +** cannot be found. +*/ +CollSeq *sqlite3FindCollSeq( + sqlite3 *db, + u8 enc, + const char *zName, + int nName, + int create +){ + CollSeq *pColl; + if( zName ){ + pColl = findCollSeqEntry(db, zName, nName, create); + }else{ + pColl = db->pDfltColl; + } + assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); + if( pColl ) pColl += enc-1; + return pColl; +} + +/* +** Locate a user function given a name, a number of arguments and a flag +** indicating whether the function prefers UTF-16 over UTF-8. Return a +** pointer to the FuncDef structure that defines that function, or return +** NULL if the function does not exist. +** +** If the createFlag argument is true, then a new (blank) FuncDef +** structure is created and liked into the "db" structure if a +** no matching function previously existed. When createFlag is true +** and the nArg parameter is -1, then only a function that accepts +** any number of arguments will be returned. +** +** If createFlag is false and nArg is -1, then the first valid +** function found is returned. A function is valid if either xFunc +** or xStep is non-zero. +** +** If createFlag is false, then a function with the required name and +** number of arguments may be returned even if the eTextRep flag does not +** match that requested. +*/ +FuncDef *sqlite3FindFunction( + sqlite3 *db, /* An open database */ + const char *zName, /* Name of the function. Not null-terminated */ + int nName, /* Number of characters in the name */ + int nArg, /* Number of arguments. -1 means any number */ + u8 enc, /* Preferred text encoding */ + int createFlag /* Create new entry if true and does not otherwise exist */ +){ + FuncDef *p; /* Iterator variable */ + FuncDef *pFirst; /* First function with this name */ + FuncDef *pBest = 0; /* Best match found so far */ + int bestmatch = 0; + + + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + if( nArg<-1 ) nArg = -1; + + pFirst = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName); + for(p=pFirst; p; p=p->pNext){ + /* During the search for the best function definition, bestmatch is set + ** as follows to indicate the quality of the match with the definition + ** pointed to by pBest: + ** + ** 0: pBest is NULL. No match has been found. + ** 1: A variable arguments function that prefers UTF-8 when a UTF-16 + ** encoding is requested, or vice versa. + ** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is + ** requested, or vice versa. + ** 3: A variable arguments function using the same text encoding. + ** 4: A function with the exact number of arguments requested that + ** prefers UTF-8 when a UTF-16 encoding is requested, or vice versa. + ** 5: A function with the exact number of arguments requested that + ** prefers UTF-16LE when UTF-16BE is requested, or vice versa. + ** 6: An exact match. + ** + ** A larger value of 'matchqual' indicates a more desirable match. + */ + if( p->nArg==-1 || p->nArg==nArg || nArg==-1 ){ + int match = 1; /* Quality of this match */ + if( p->nArg==nArg || nArg==-1 ){ + match = 4; + } + if( enc==p->iPrefEnc ){ + match += 2; + } + else if( (enc==SQLITE_UTF16LE && p->iPrefEnc==SQLITE_UTF16BE) || + (enc==SQLITE_UTF16BE && p->iPrefEnc==SQLITE_UTF16LE) ){ + match += 1; + } + + if( match>bestmatch ){ + pBest = p; + bestmatch = match; + } + } + } + + /* If the createFlag parameter is true, and the seach did not reveal an + ** exact match for the name, number of arguments and encoding, then add a + ** new entry to the hash table and return it. + */ + if( createFlag && bestmatch<6 && + (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName))!=0 ){ + pBest->nArg = nArg; + pBest->pNext = pFirst; + pBest->iPrefEnc = enc; + memcpy(pBest->zName, zName, nName); + pBest->zName[nName] = 0; + if( pBest==sqlite3HashInsert(&db->aFunc,pBest->zName,nName,(void*)pBest) ){ + db->mallocFailed = 1; + sqlite3_free(pBest); + return 0; + } + } + + if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){ + return pBest; + } + return 0; +} + +/* +** Free all resources held by the schema structure. The void* argument points +** at a Schema struct. This function does not call sqlite3_free() on the +** pointer itself, it just cleans up subsiduary resources (i.e. the contents +** of the schema hash tables). +*/ +void sqlite3SchemaFree(void *p){ + Hash temp1; + Hash temp2; + HashElem *pElem; + Schema *pSchema = (Schema *)p; + + temp1 = pSchema->tblHash; + temp2 = pSchema->trigHash; + sqlite3HashInit(&pSchema->trigHash, SQLITE_HASH_STRING, 0); + sqlite3HashClear(&pSchema->aFKey); + sqlite3HashClear(&pSchema->idxHash); + for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ + sqlite3DeleteTrigger((Trigger*)sqliteHashData(pElem)); + } + sqlite3HashClear(&temp2); + sqlite3HashInit(&pSchema->tblHash, SQLITE_HASH_STRING, 0); + for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + sqlite3DeleteTable(pTab); + } + sqlite3HashClear(&temp1); + pSchema->pSeqTab = 0; + pSchema->flags &= ~DB_SchemaLoaded; +} + +/* +** Find and return the schema associated with a BTree. Create +** a new one if necessary. +*/ +Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ + Schema * p; + if( pBt ){ + p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaFree); + }else{ + p = (Schema *)sqlite3MallocZero(sizeof(Schema)); + } + if( !p ){ + db->mallocFailed = 1; + }else if ( 0==p->file_format ){ + sqlite3HashInit(&p->tblHash, SQLITE_HASH_STRING, 0); + sqlite3HashInit(&p->idxHash, SQLITE_HASH_STRING, 0); + sqlite3HashInit(&p->trigHash, SQLITE_HASH_STRING, 0); + sqlite3HashInit(&p->aFKey, SQLITE_HASH_STRING, 1); + p->enc = SQLITE_UTF8; + } + return p; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c b/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c new file mode 100644 index 0000000000..ae61d8ab06 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c @@ -0,0 +1,271 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that implements the sqlite3_complete() API. +** This code used to be part of the tokenizer.c source file. But by +** separating it out, the code will be automatically omitted from +** static links that do not use it. +** +** $Id: complete.c,v 1.6 2007/08/27 23:26:59 drh Exp $ +*/ +#include "sqliteInt.h" +#ifndef SQLITE_OMIT_COMPLETE + +/* +** This is defined in tokenize.c. We just have to import the definition. +*/ +#ifndef SQLITE_AMALGAMATION +#ifdef SQLITE_ASCII +extern const char sqlite3IsAsciiIdChar[]; +#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && sqlite3IsAsciiIdChar[c-0x20])) +#endif +#ifdef SQLITE_EBCDIC +extern const char sqlite3IsEbcdicIdChar[]; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif +#endif /* SQLITE_AMALGAMATION */ + + +/* +** Token types used by the sqlite3_complete() routine. See the header +** comments on that procedure for additional information. +*/ +#define tkSEMI 0 +#define tkWS 1 +#define tkOTHER 2 +#define tkEXPLAIN 3 +#define tkCREATE 4 +#define tkTEMP 5 +#define tkTRIGGER 6 +#define tkEND 7 + +/* +** Return TRUE if the given SQL string ends in a semicolon. +** +** Special handling is require for CREATE TRIGGER statements. +** Whenever the CREATE TRIGGER keywords are seen, the statement +** must end with ";END;". +** +** This implementation uses a state machine with 7 states: +** +** (0) START At the beginning or end of an SQL statement. This routine +** returns 1 if it ends in the START state and 0 if it ends +** in any other state. +** +** (1) NORMAL We are in the middle of statement which ends with a single +** semicolon. +** +** (2) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** a statement. +** +** (3) CREATE The keyword CREATE has been seen at the beginning of a +** statement, possibly preceeded by EXPLAIN and/or followed by +** TEMP or TEMPORARY +** +** (4) TRIGGER We are in the middle of a trigger definition that must be +** ended by a semicolon, the keyword END, and another semicolon. +** +** (5) SEMI We've seen the first semicolon in the ";END;" that occurs at +** the end of a trigger definition. +** +** (6) END We've seen the ";END" of the ";END;" that occurs at the end +** of a trigger difinition. +** +** Transitions between states above are determined by tokens extracted +** from the input. The following tokens are significant: +** +** (0) tkSEMI A semicolon. +** (1) tkWS Whitespace +** (2) tkOTHER Any other SQL token. +** (3) tkEXPLAIN The "explain" keyword. +** (4) tkCREATE The "create" keyword. +** (5) tkTEMP The "temp" or "temporary" keyword. +** (6) tkTRIGGER The "trigger" keyword. +** (7) tkEND The "end" keyword. +** +** Whitespace never causes a state transition and is always ignored. +** +** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed +** to recognize the end of a trigger can be omitted. All we have to do +** is look for a semicolon that is not part of an string or comment. +*/ +int sqlite3_complete(const char *zSql){ + u8 state = 0; /* Current state, using numbers defined in header comment */ + u8 token; /* Value of the next token */ + +#ifndef SQLITE_OMIT_TRIGGER + /* A complex statement machine used to detect the end of a CREATE TRIGGER + ** statement. This is the normal case. + */ + static const u8 trans[7][8] = { + /* Token: */ + /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ + /* 0 START: */ { 0, 0, 1, 2, 3, 1, 1, 1, }, + /* 1 NORMAL: */ { 0, 1, 1, 1, 1, 1, 1, 1, }, + /* 2 EXPLAIN: */ { 0, 2, 1, 1, 3, 1, 1, 1, }, + /* 3 CREATE: */ { 0, 3, 1, 1, 1, 3, 4, 1, }, + /* 4 TRIGGER: */ { 5, 4, 4, 4, 4, 4, 4, 4, }, + /* 5 SEMI: */ { 5, 5, 4, 4, 4, 4, 4, 6, }, + /* 6 END: */ { 0, 6, 4, 4, 4, 4, 4, 4, }, + }; +#else + /* If triggers are not suppored by this compile then the statement machine + ** used to detect the end of a statement is much simplier + */ + static const u8 trans[2][3] = { + /* Token: */ + /* State: ** SEMI WS OTHER */ + /* 0 START: */ { 0, 0, 1, }, + /* 1 NORMAL: */ { 0, 1, 1, }, + }; +#endif /* SQLITE_OMIT_TRIGGER */ + + while( *zSql ){ + switch( *zSql ){ + case ';': { /* A semicolon */ + token = tkSEMI; + break; + } + case ' ': + case '\r': + case '\t': + case '\n': + case '\f': { /* White space is ignored */ + token = tkWS; + break; + } + case '/': { /* C-style comments */ + if( zSql[1]!='*' ){ + token = tkOTHER; + break; + } + zSql += 2; + while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } + if( zSql[0]==0 ) return 0; + zSql++; + token = tkWS; + break; + } + case '-': { /* SQL-style comments from "--" to end of line */ + if( zSql[1]!='-' ){ + token = tkOTHER; + break; + } + while( *zSql && *zSql!='\n' ){ zSql++; } + if( *zSql==0 ) return state==0; + token = tkWS; + break; + } + case '[': { /* Microsoft-style identifiers in [...] */ + zSql++; + while( *zSql && *zSql!=']' ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + case '`': /* Grave-accent quoted symbols used by MySQL */ + case '"': /* single- and double-quoted strings */ + case '\'': { + int c = *zSql; + zSql++; + while( *zSql && *zSql!=c ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + default: { + int c; + if( IdChar((u8)*zSql) ){ + /* Keywords and unquoted identifiers */ + int nId; + for(nId=1; IdChar(zSql[nId]); nId++){} +#ifdef SQLITE_OMIT_TRIGGER + token = tkOTHER; +#else + switch( *zSql ){ + case 'c': case 'C': { + if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ + token = tkCREATE; + }else{ + token = tkOTHER; + } + break; + } + case 't': case 'T': { + if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ + token = tkTRIGGER; + }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ + token = tkTEMP; + }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ + token = tkTEMP; + }else{ + token = tkOTHER; + } + break; + } + case 'e': case 'E': { + if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ + token = tkEND; + }else +#ifndef SQLITE_OMIT_EXPLAIN + if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ + token = tkEXPLAIN; + }else +#endif + { + token = tkOTHER; + } + break; + } + default: { + token = tkOTHER; + break; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ + zSql += nId-1; + }else{ + /* Operators and special symbols */ + token = tkOTHER; + } + break; + } + } + state = trans[state][token]; + zSql++; + } + return state==0; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine is the same as the sqlite3_complete() routine described +** above, except that the parameter is required to be UTF-16 encoded, not +** UTF-8. +*/ +int sqlite3_complete16(const void *zSql){ + sqlite3_value *pVal; + char const *zSql8; + int rc = SQLITE_NOMEM; + + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zSql8 ){ + rc = sqlite3_complete(zSql8); + } + sqlite3ValueFree(pVal); + return sqlite3ApiExit(0, rc); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_COMPLETE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/date.c b/libraries/sqlite/unix/sqlite-3.5.1/src/date.c new file mode 100644 index 0000000000..ce1c6c7b39 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/date.c @@ -0,0 +1,1045 @@ +/* +** 2003 October 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement date and time +** functions for SQLite. +** +** There is only one exported symbol in this file - the function +** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. +** All other code has file scope. +** +** $Id: date.c,v 1.73 2007/09/12 17:01:45 danielk1977 Exp $ +** +** SQLite processes all times and dates as Julian Day numbers. The +** dates and times are stored as the number of days since noon +** in Greenwich on November 24, 4714 B.C. according to the Gregorian +** calendar system. +** +** 1970-01-01 00:00:00 is JD 2440587.5 +** 2000-01-01 00:00:00 is JD 2451544.5 +** +** This implemention requires years to be expressed as a 4-digit number +** which means that only dates between 0000-01-01 and 9999-12-31 can +** be represented, even though julian day numbers allow a much wider +** range of dates. +** +** The Gregorian calendar system is used for all dates and times, +** even those that predate the Gregorian calendar. Historians usually +** use the Julian calendar for dates prior to 1582-10-15 and for some +** dates afterwards, depending on locale. Beware of this difference. +** +** The conversion algorithms are implemented based on descriptions +** in the following text: +** +** Jean Meeus +** Astronomical Algorithms, 2nd Edition, 1998 +** ISBM 0-943396-61-1 +** Willmann-Bell, Inc +** Richmond, Virginia (USA) +*/ +#include "sqliteInt.h" +#include +#include +#include +#include + +#ifndef SQLITE_OMIT_DATETIME_FUNCS + +/* +** A structure for holding a single date and time. +*/ +typedef struct DateTime DateTime; +struct DateTime { + double rJD; /* The julian day number */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validYMD; /* True if Y,M,D are valid */ + char validHMS; /* True if h,m,s are valid */ + char validJD; /* True if rJD is valid */ + char validTZ; /* True if tz is valid */ +}; + + +/* +** Convert zDate into one or more integers. Additional arguments +** come in groups of 5 as follows: +** +** N number of digits in the integer +** min minimum allowed value of the integer +** max maximum allowed value of the integer +** nextC first character after the integer +** pVal where to write the integers value. +** +** Conversions continue until one with nextC==0 is encountered. +** The function returns the number of successful conversions. +*/ +static int getDigits(const char *zDate, ...){ + va_list ap; + int val; + int N; + int min; + int max; + int nextC; + int *pVal; + int cnt = 0; + va_start(ap, zDate); + do{ + N = va_arg(ap, int); + min = va_arg(ap, int); + max = va_arg(ap, int); + nextC = va_arg(ap, int); + pVal = va_arg(ap, int*); + val = 0; + while( N-- ){ + if( !isdigit(*(u8*)zDate) ){ + goto end_getDigits; + } + val = val*10 + *zDate - '0'; + zDate++; + } + if( valmax || (nextC!=0 && nextC!=*zDate) ){ + goto end_getDigits; + } + *pVal = val; + zDate++; + cnt++; + }while( nextC ); +end_getDigits: + va_end(ap); + return cnt; +} + +/* +** Read text from z[] and convert into a floating point number. Return +** the number of digits converted. +*/ +#define getValue sqlite3AtoF + +/* +** Parse a timezone extension on the end of a date-time. +** The extension is of the form: +** +** (+/-)HH:MM +** +** If the parse is successful, write the number of minutes +** of change in *pnMin and return 0. If a parser error occurs, +** return 0. +** +** A missing specifier is not considered an error. +*/ +static int parseTimezone(const char *zDate, DateTime *p){ + int sgn = 0; + int nHr, nMn; + while( isspace(*(u8*)zDate) ){ zDate++; } + p->tz = 0; + if( *zDate=='-' ){ + sgn = -1; + }else if( *zDate=='+' ){ + sgn = +1; + }else{ + return *zDate!=0; + } + zDate++; + if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){ + return 1; + } + zDate += 5; + p->tz = sgn*(nMn + nHr*60); + while( isspace(*(u8*)zDate) ){ zDate++; } + return *zDate!=0; +} + +/* +** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. +** The HH, MM, and SS must each be exactly 2 digits. The +** fractional seconds FFFF can be one or more digits. +** +** Return 1 if there is a parsing error and 0 on success. +*/ +static int parseHhMmSs(const char *zDate, DateTime *p){ + int h, m, s; + double ms = 0.0; + if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){ + return 1; + } + zDate += 5; + if( *zDate==':' ){ + zDate++; + if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){ + return 1; + } + zDate += 2; + if( *zDate=='.' && isdigit((u8)zDate[1]) ){ + double rScale = 1.0; + zDate++; + while( isdigit(*(u8*)zDate) ){ + ms = ms*10.0 + *zDate - '0'; + rScale *= 10.0; + zDate++; + } + ms /= rScale; + } + }else{ + s = 0; + } + p->validJD = 0; + p->validHMS = 1; + p->h = h; + p->m = m; + p->s = s + ms; + if( parseTimezone(zDate, p) ) return 1; + p->validTZ = p->tz!=0; + return 0; +} + +/* +** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume +** that the YYYY-MM-DD is according to the Gregorian calendar. +** +** Reference: Meeus page 61 +*/ +static void computeJD(DateTime *p){ + int Y, M, D, A, B, X1, X2; + + if( p->validJD ) return; + if( p->validYMD ){ + Y = p->Y; + M = p->M; + D = p->D; + }else{ + Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ + M = 1; + D = 1; + } + if( M<=2 ){ + Y--; + M += 12; + } + A = Y/100; + B = 2 - A + (A/4); + X1 = 365.25*(Y+4716); + X2 = 30.6001*(M+1); + p->rJD = X1 + X2 + D + B - 1524.5; + p->validJD = 1; + if( p->validHMS ){ + p->rJD += (p->h*3600.0 + p->m*60.0 + p->s)/86400.0; + if( p->validTZ ){ + p->rJD -= p->tz*60/86400.0; + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; + } + } +} + +/* +** Parse dates of the form +** +** YYYY-MM-DD HH:MM:SS.FFF +** YYYY-MM-DD HH:MM:SS +** YYYY-MM-DD HH:MM +** YYYY-MM-DD +** +** Write the result into the DateTime structure and return 0 +** on success and 1 if the input string is not a well-formed +** date. +*/ +static int parseYyyyMmDd(const char *zDate, DateTime *p){ + int Y, M, D, neg; + + if( zDate[0]=='-' ){ + zDate++; + neg = 1; + }else{ + neg = 0; + } + if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){ + return 1; + } + zDate += 10; + while( isspace(*(u8*)zDate) || 'T'==*(u8*)zDate ){ zDate++; } + if( parseHhMmSs(zDate, p)==0 ){ + /* We got the time */ + }else if( *zDate==0 ){ + p->validHMS = 0; + }else{ + return 1; + } + p->validJD = 0; + p->validYMD = 1; + p->Y = neg ? -Y : Y; + p->M = M; + p->D = D; + if( p->validTZ ){ + computeJD(p); + } + return 0; +} + +/* +** Attempt to parse the given string into a Julian Day Number. Return +** the number of errors. +** +** The following are acceptable forms for the input string: +** +** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM +** DDDD.DD +** now +** +** In the first form, the +/-HH:MM is always optional. The fractional +** seconds extension (the ".FFF") is optional. The seconds portion +** (":SS.FFF") is option. The year and date can be omitted as long +** as there is a time string. The time string can be omitted as long +** as there is a year and date. +*/ +static int parseDateOrTime( + sqlite3_context *context, + const char *zDate, + DateTime *p +){ + memset(p, 0, sizeof(*p)); + if( parseYyyyMmDd(zDate,p)==0 ){ + return 0; + }else if( parseHhMmSs(zDate, p)==0 ){ + return 0; + }else if( sqlite3StrICmp(zDate,"now")==0){ + double r; + sqlite3OsCurrentTime((sqlite3_vfs *)sqlite3_user_data(context), &r); + p->rJD = r; + p->validJD = 1; + return 0; + }else if( sqlite3IsNumber(zDate, 0, SQLITE_UTF8) ){ + getValue(zDate, &p->rJD); + p->validJD = 1; + return 0; + } + return 1; +} + +/* +** Compute the Year, Month, and Day from the julian day number. +*/ +static void computeYMD(DateTime *p){ + int Z, A, B, C, D, E, X1; + if( p->validYMD ) return; + if( !p->validJD ){ + p->Y = 2000; + p->M = 1; + p->D = 1; + }else{ + Z = p->rJD + 0.5; + A = (Z - 1867216.25)/36524.25; + A = Z + 1 + A - (A/4); + B = A + 1524; + C = (B - 122.1)/365.25; + D = 365.25*C; + E = (B-D)/30.6001; + X1 = 30.6001*E; + p->D = B - D - X1; + p->M = E<14 ? E-1 : E-13; + p->Y = p->M>2 ? C - 4716 : C - 4715; + } + p->validYMD = 1; +} + +/* +** Compute the Hour, Minute, and Seconds from the julian day number. +*/ +static void computeHMS(DateTime *p){ + int Z, s; + if( p->validHMS ) return; + computeJD(p); + Z = p->rJD + 0.5; + s = (p->rJD + 0.5 - Z)*86400000.0 + 0.5; + p->s = 0.001*s; + s = p->s; + p->s -= s; + p->h = s/3600; + s -= p->h*3600; + p->m = s/60; + p->s += s - p->m*60; + p->validHMS = 1; +} + +/* +** Compute both YMD and HMS +*/ +static void computeYMD_HMS(DateTime *p){ + computeYMD(p); + computeHMS(p); +} + +/* +** Clear the YMD and HMS and the TZ +*/ +static void clearYMD_HMS_TZ(DateTime *p){ + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; +} + +/* +** Compute the difference (in days) between localtime and UTC (a.k.a. GMT) +** for the time value p where p is in UTC. +*/ +static double localtimeOffset(DateTime *p){ + DateTime x, y; + time_t t; + x = *p; + computeYMD_HMS(&x); + if( x.Y<1971 || x.Y>=2038 ){ + x.Y = 2000; + x.M = 1; + x.D = 1; + x.h = 0; + x.m = 0; + x.s = 0.0; + } else { + int s = x.s + 0.5; + x.s = s; + } + x.tz = 0; + x.validJD = 0; + computeJD(&x); + t = (x.rJD-2440587.5)*86400.0 + 0.5; +#ifdef HAVE_LOCALTIME_R + { + struct tm sLocal; + localtime_r(&t, &sLocal); + y.Y = sLocal.tm_year + 1900; + y.M = sLocal.tm_mon + 1; + y.D = sLocal.tm_mday; + y.h = sLocal.tm_hour; + y.m = sLocal.tm_min; + y.s = sLocal.tm_sec; + } +#else + { + struct tm *pTm; + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + pTm = localtime(&t); + y.Y = pTm->tm_year + 1900; + y.M = pTm->tm_mon + 1; + y.D = pTm->tm_mday; + y.h = pTm->tm_hour; + y.m = pTm->tm_min; + y.s = pTm->tm_sec; + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + } +#endif + y.validYMD = 1; + y.validHMS = 1; + y.validJD = 0; + y.validTZ = 0; + computeJD(&y); + return y.rJD - x.rJD; +} + +/* +** Process a modifier to a date-time stamp. The modifiers are +** as follows: +** +** NNN days +** NNN hours +** NNN minutes +** NNN.NNNN seconds +** NNN months +** NNN years +** start of month +** start of year +** start of week +** start of day +** weekday N +** unixepoch +** localtime +** utc +** +** Return 0 on success and 1 if there is any kind of error. +*/ +static int parseModifier(const char *zMod, DateTime *p){ + int rc = 1; + int n; + double r; + char *z, zBuf[30]; + z = zBuf; + for(n=0; nrJD += localtimeOffset(p); + clearYMD_HMS_TZ(p); + rc = 0; + } + break; + } + case 'u': { + /* + ** unixepoch + ** + ** Treat the current value of p->rJD as the number of + ** seconds since 1970. Convert to a real julian day number. + */ + if( strcmp(z, "unixepoch")==0 && p->validJD ){ + p->rJD = p->rJD/86400.0 + 2440587.5; + clearYMD_HMS_TZ(p); + rc = 0; + }else if( strcmp(z, "utc")==0 ){ + double c1; + computeJD(p); + c1 = localtimeOffset(p); + p->rJD -= c1; + clearYMD_HMS_TZ(p); + p->rJD += c1 - localtimeOffset(p); + rc = 0; + } + break; + } + case 'w': { + /* + ** weekday N + ** + ** Move the date to the same time on the next occurrence of + ** weekday N where 0==Sunday, 1==Monday, and so forth. If the + ** date is already on the appropriate weekday, this is a no-op. + */ + if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0 + && (n=r)==r && n>=0 && r<7 ){ + int Z; + computeYMD_HMS(p); + p->validTZ = 0; + p->validJD = 0; + computeJD(p); + Z = p->rJD + 1.5; + Z %= 7; + if( Z>n ) Z -= 7; + p->rJD += n - Z; + clearYMD_HMS_TZ(p); + rc = 0; + } + break; + } + case 's': { + /* + ** start of TTTTT + ** + ** Move the date backwards to the beginning of the current day, + ** or month or year. + */ + if( strncmp(z, "start of ", 9)!=0 ) break; + z += 9; + computeYMD(p); + p->validHMS = 1; + p->h = p->m = 0; + p->s = 0.0; + p->validTZ = 0; + p->validJD = 0; + if( strcmp(z,"month")==0 ){ + p->D = 1; + rc = 0; + }else if( strcmp(z,"year")==0 ){ + computeYMD(p); + p->M = 1; + p->D = 1; + rc = 0; + }else if( strcmp(z,"day")==0 ){ + rc = 0; + } + break; + } + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + n = getValue(z, &r); + assert( n>=1 ); + if( z[n]==':' ){ + /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the + ** specified number of hours, minutes, seconds, and fractional seconds + ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be + ** omitted. + */ + const char *z2 = z; + DateTime tx; + int day; + if( !isdigit(*(u8*)z2) ) z2++; + memset(&tx, 0, sizeof(tx)); + if( parseHhMmSs(z2, &tx) ) break; + computeJD(&tx); + tx.rJD -= 0.5; + day = (int)tx.rJD; + tx.rJD -= day; + if( z[0]=='-' ) tx.rJD = -tx.rJD; + computeJD(p); + clearYMD_HMS_TZ(p); + p->rJD += tx.rJD; + rc = 0; + break; + } + z += n; + while( isspace(*(u8*)z) ) z++; + n = strlen(z); + if( n>10 || n<3 ) break; + if( z[n-1]=='s' ){ z[n-1] = 0; n--; } + computeJD(p); + rc = 0; + if( n==3 && strcmp(z,"day")==0 ){ + p->rJD += r; + }else if( n==4 && strcmp(z,"hour")==0 ){ + p->rJD += r/24.0; + }else if( n==6 && strcmp(z,"minute")==0 ){ + p->rJD += r/(24.0*60.0); + }else if( n==6 && strcmp(z,"second")==0 ){ + p->rJD += r/(24.0*60.0*60.0); + }else if( n==5 && strcmp(z,"month")==0 ){ + int x, y; + computeYMD_HMS(p); + p->M += r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + computeJD(p); + y = r; + if( y!=r ){ + p->rJD += (r - y)*30.0; + } + }else if( n==4 && strcmp(z,"year")==0 ){ + computeYMD_HMS(p); + p->Y += r; + p->validJD = 0; + computeJD(p); + }else{ + rc = 1; + } + clearYMD_HMS_TZ(p); + break; + } + default: { + break; + } + } + return rc; +} + +/* +** Process time function arguments. argv[0] is a date-time stamp. +** argv[1] and following are modifiers. Parse them all and write +** the resulting time into the DateTime structure p. Return 0 +** on success and 1 if there are any errors. +*/ +static int isDate( + sqlite3_context *context, + int argc, + sqlite3_value **argv, + DateTime *p +){ + int i; + const unsigned char *z; + if( argc==0 ) return 1; + z = sqlite3_value_text(argv[0]); + if( !z || parseDateOrTime(context, (char*)z, p) ){ + return 1; + } + for(i=1; iSQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + return; + }else{ + z = sqlite3_malloc( n ); + if( z==0 ) return; + } + computeJD(&x); + computeYMD_HMS(&x); + for(i=j=0; zFmt[i]; i++){ + if( zFmt[i]!='%' ){ + z[j++] = zFmt[i]; + }else{ + i++; + switch( zFmt[i] ){ + case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; + case 'f': { + double s = x.s; + if( s>59.999 ) s = 59.999; + sqlite3_snprintf(7, &z[j],"%06.3f", s); + j += strlen(&z[j]); + break; + } + case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; + case 'W': /* Fall thru */ + case 'j': { + int nDay; /* Number of days since 1st day of year */ + DateTime y = x; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = x.rJD - y.rJD + 0.5; + if( zFmt[i]=='W' ){ + int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ + wd = ((int)(x.rJD+0.5)) % 7; + sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); + j += 2; + }else{ + sqlite3_snprintf(4, &z[j],"%03d",nDay+1); + j += 3; + } + break; + } + case 'J': { + sqlite3_snprintf(20, &z[j],"%.16g",x.rJD); + j+=strlen(&z[j]); + break; + } + case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; + case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; + case 's': { + sqlite3_snprintf(30,&z[j],"%d", + (int)((x.rJD-2440587.5)*86400.0 + 0.5)); + j += strlen(&z[j]); + break; + } + case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; + case 'w': z[j++] = (((int)(x.rJD+1.5)) % 7) + '0'; break; + case 'Y': sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=strlen(&z[j]);break; + case '%': z[j++] = '%'; break; + } + } + } + z[j] = 0; + sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); + if( z!=zBuf ){ + sqlite3_free(z); + } +} + +/* +** current_time() +** +** This function returns the same value as time('now'). +*/ +static void ctimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_value *pVal = sqlite3ValueNew(0); + if( pVal ){ + sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); + timeFunc(context, 1, &pVal); + sqlite3ValueFree(pVal); + } +} + +/* +** current_date() +** +** This function returns the same value as date('now'). +*/ +static void cdateFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_value *pVal = sqlite3ValueNew(0); + if( pVal ){ + sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); + dateFunc(context, 1, &pVal); + sqlite3ValueFree(pVal); + } +} + +/* +** current_timestamp() +** +** This function returns the same value as datetime('now'). +*/ +static void ctimestampFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_value *pVal = sqlite3ValueNew(0); + if( pVal ){ + sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); + datetimeFunc(context, 1, &pVal); + sqlite3ValueFree(pVal); + } +} +#endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */ + +#ifdef SQLITE_OMIT_DATETIME_FUNCS +/* +** If the library is compiled to omit the full-scale date and time +** handling (to get a smaller binary), the following minimal version +** of the functions current_time(), current_date() and current_timestamp() +** are included instead. This is to support column declarations that +** include "DEFAULT CURRENT_TIME" etc. +** +** This function uses the C-library functions time(), gmtime() +** and strftime(). The format string to pass to strftime() is supplied +** as the user-data for the function. +*/ +static void currentTimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + time_t t; + char *zFormat = (char *)sqlite3_user_data(context); + char zBuf[20]; + + time(&t); +#ifdef SQLITE_TEST + { + extern int sqlite3_current_time; /* See os_XXX.c */ + if( sqlite3_current_time ){ + t = sqlite3_current_time; + } + } +#endif + +#ifdef HAVE_GMTIME_R + { + struct tm sNow; + gmtime_r(&t, &sNow); + strftime(zBuf, 20, zFormat, &sNow); + } +#else + { + struct tm *pTm; + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + pTm = gmtime(&t); + strftime(zBuf, 20, zFormat, pTm); + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + } +#endif + + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); +} +#endif + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +void sqlite3RegisterDateTimeFunctions(sqlite3 *db){ +#ifndef SQLITE_OMIT_DATETIME_FUNCS + static const struct { + char *zName; + int nArg; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aFuncs[] = { + { "julianday", -1, juliandayFunc }, + { "date", -1, dateFunc }, + { "time", -1, timeFunc }, + { "datetime", -1, datetimeFunc }, + { "strftime", -1, strftimeFunc }, + { "current_time", 0, ctimeFunc }, + { "current_timestamp", 0, ctimestampFunc }, + { "current_date", 0, cdateFunc }, + }; + int i; + + for(i=0; ipVfs), aFuncs[i].xFunc, 0, 0); + } +#else + static const struct { + char *zName; + char *zFormat; + } aFuncs[] = { + { "current_time", "%H:%M:%S" }, + { "current_date", "%Y-%m-%d" }, + { "current_timestamp", "%Y-%m-%d %H:%M:%S" } + }; + int i; + + for(i=0; izErrMsg and return NULL. If all tables +** are found, return a pointer to the last table. +*/ +Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ + Table *pTab = 0; + int i; + struct SrcList_item *pItem; + for(i=0, pItem=pSrc->a; inSrc; i++, pItem++){ + pTab = sqlite3LocateTable(pParse, pItem->zName, pItem->zDatabase); + sqlite3DeleteTable(pItem->pTab); + pItem->pTab = pTab; + if( pTab ){ + pTab->nRef++; + } + } + return pTab; +} + +/* +** Check to make sure the given table is writable. If it is not +** writable, generate an error message and return 1. If it is +** writable return 0; +*/ +int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ + if( (pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0 + && pParse->nested==0) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || (pTab->pMod && pTab->pMod->pModule->xUpdate==0) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); + return 1; + } +#ifndef SQLITE_OMIT_VIEW + if( !viewOk && pTab->pSelect ){ + sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); + return 1; + } +#endif + return 0; +} + +/* +** Generate code that will open a table for reading. +*/ +void sqlite3OpenTable( + Parse *p, /* Generate code into this VDBE */ + int iCur, /* The cursor number of the table */ + int iDb, /* The database index in sqlite3.aDb[] */ + Table *pTab, /* The table to be opened */ + int opcode /* OP_OpenRead or OP_OpenWrite */ +){ + Vdbe *v; + if( IsVirtual(pTab) ) return; + v = sqlite3GetVdbe(p); + assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); + sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite), pTab->zName); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + VdbeComment((v, "# %s", pTab->zName)); + sqlite3VdbeAddOp(v, opcode, iCur, pTab->tnum); + sqlite3VdbeAddOp(v, OP_SetNumColumns, iCur, pTab->nCol); +} + + +/* +** Generate code for a DELETE FROM statement. +** +** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; +** \________/ \________________/ +** pTabList pWhere +*/ +void sqlite3DeleteFrom( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table from which we should delete things */ + Expr *pWhere /* The WHERE clause. May be null */ +){ + Vdbe *v; /* The virtual database engine */ + Table *pTab; /* The table from which records will be deleted */ + const char *zDb; /* Name of database holding pTab */ + int end, addr = 0; /* A couple addresses of generated code */ + int i; /* Loop counter */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Index *pIdx; /* For looping over indices of the table */ + int iCur; /* VDBE Cursor number for pTab */ + sqlite3 *db; /* Main database structure */ + AuthContext sContext; /* Authorization context */ + int oldIdx = -1; /* Cursor for the OLD table of AFTER triggers */ + NameContext sNC; /* Name context to resolve expressions in */ + int iDb; /* Database number */ + int memCnt = 0; /* Memory cell used for change counting */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to delete from a view */ + int triggers_exist = 0; /* True if any triggers exist */ +#endif + + sContext.pParse = 0; + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto delete_from_cleanup; + } + assert( pTabList->nSrc==1 ); + + /* Locate the table which we want to delete. This table has to be + ** put in an SrcList structure because some of the subroutines we + ** will be calling are designed to work with multiple tables and expect + ** an SrcList* parameter instead of just a Table* parameter. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto delete_from_cleanup; + + /* Figure out if we have any triggers and if the table being + ** deleted from is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0); + isView = pTab->pSelect!=0; +#else +# define triggers_exist 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + + if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){ + goto delete_from_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + zDb = db->aDb[iDb].zName; + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto delete_from_cleanup; + } + + /* If pTab is really a view, make sure it has been initialized. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto delete_from_cleanup; + } + + /* Allocate a cursor used to store the old.* data for a trigger. + */ + if( triggers_exist ){ + oldIdx = pParse->nTab++; + } + + /* Resolve the column names in the WHERE clause. + */ + assert( pTabList->nSrc==1 ); + iCur = pTabList->a[0].iCursor = pParse->nTab++; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + if( sqlite3ExprResolveNames(&sNC, pWhere) ){ + goto delete_from_cleanup; + } + + /* Start the view context + */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* Begin generating code. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto delete_from_cleanup; + } + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, triggers_exist, iDb); + + /* If we are trying to delete from a view, realize that view into + ** a ephemeral table. + */ + if( isView ){ + Select *pView = sqlite3SelectDup(db, pTab->pSelect); + sqlite3Select(pParse, pView, SRT_EphemTab, iCur, 0, 0, 0, 0); + sqlite3SelectDelete(pView); + } + + /* Initialize the counter of the number of rows deleted, if + ** we are counting rows. + */ + if( db->flags & SQLITE_CountRows ){ + memCnt = pParse->nMem++; + sqlite3VdbeAddOp(v, OP_MemInt, 0, memCnt); + } + + /* Special case: A DELETE without a WHERE clause deletes everything. + ** It is easier just to erase the whole table. Note, however, that + ** this means that the row change count will be incorrect. + */ + if( pWhere==0 && !triggers_exist && !IsVirtual(pTab) ){ + if( db->flags & SQLITE_CountRows ){ + /* If counting rows deleted, just count the total number of + ** entries in the table. */ + int endOfLoop = sqlite3VdbeMakeLabel(v); + int addr2; + if( !isView ){ + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); + } + sqlite3VdbeAddOp(v, OP_Rewind, iCur, sqlite3VdbeCurrentAddr(v)+2); + addr2 = sqlite3VdbeAddOp(v, OP_MemIncr, 1, memCnt); + sqlite3VdbeAddOp(v, OP_Next, iCur, addr2); + sqlite3VdbeResolveLabel(v, endOfLoop); + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } + if( !isView ){ + sqlite3VdbeAddOp(v, OP_Clear, pTab->tnum, iDb); + if( !pParse->nested ){ + sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + } + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp(v, OP_Clear, pIdx->tnum, iDb); + } + } + } + /* The usual case: There is a WHERE clause so we have to scan through + ** the table and pick which records to delete. + */ + else{ + /* Begin the database scan + */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0); + if( pWInfo==0 ) goto delete_from_cleanup; + + /* Remember the rowid of every item to be deleted. + */ + sqlite3VdbeAddOp(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, 0); + sqlite3VdbeAddOp(v, OP_FifoWrite, 0, 0); + if( db->flags & SQLITE_CountRows ){ + sqlite3VdbeAddOp(v, OP_MemIncr, 1, memCnt); + } + + /* End the database scan loop. + */ + sqlite3WhereEnd(pWInfo); + + /* Open the pseudo-table used to store OLD if there are triggers. + */ + if( triggers_exist ){ + sqlite3VdbeAddOp(v, OP_OpenPseudo, oldIdx, 0); + sqlite3VdbeAddOp(v, OP_SetNumColumns, oldIdx, pTab->nCol); + } + + /* Delete every item whose key was written to the list during the + ** database scan. We have to delete items after the scan is complete + ** because deleting an item can change the scan order. + */ + end = sqlite3VdbeMakeLabel(v); + + /* This is the beginning of the delete loop when there are + ** row triggers. + */ + if( triggers_exist ){ + addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); + if( !isView ){ + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); + } + sqlite3VdbeAddOp(v, OP_MoveGe, iCur, 0); + sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); + sqlite3VdbeAddOp(v, OP_RowData, iCur, 0); + sqlite3VdbeAddOp(v, OP_Insert, oldIdx, 0); + if( !isView ){ + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } + + (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_BEFORE, pTab, + -1, oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, + addr); + } + + if( !isView ){ + /* Open cursors for the table we are deleting from and all its + ** indices. If there are row triggers, this happens inside the + ** OP_FifoRead loop because the cursor have to all be closed + ** before the trigger fires. If there are no row triggers, the + ** cursors are opened only once on the outside the loop. + */ + sqlite3OpenTableAndIndices(pParse, pTab, iCur, OP_OpenWrite); + + /* This is the beginning of the delete loop when there are no + ** row triggers */ + if( !triggers_exist ){ + addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); + } + + /* Delete the row */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + pParse->pVirtualLock = pTab; + sqlite3VdbeOp3(v, OP_VUpdate, 0, 1, (const char*)pTab->pVtab, P3_VTAB); + }else +#endif + { + sqlite3GenerateRowDelete(db, v, pTab, iCur, pParse->nested==0); + } + } + + /* If there are row triggers, close all cursors then invoke + ** the AFTER triggers + */ + if( triggers_exist ){ + if( !isView ){ + for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + sqlite3VdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); + } + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } + (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_AFTER, pTab, -1, + oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, + addr); + } + + /* End of the delete loop */ + sqlite3VdbeAddOp(v, OP_Goto, 0, addr); + sqlite3VdbeResolveLabel(v, end); + + /* Close the cursors after the loop if there are no row triggers */ + if( !triggers_exist && !IsVirtual(pTab) ){ + for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + sqlite3VdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); + } + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } + } + + /* + ** Return the number of rows that were deleted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){ + sqlite3VdbeAddOp(v, OP_MemLoad, memCnt, 0); + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", P3_STATIC); + } + +delete_from_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3SrcListDelete(pTabList); + sqlite3ExprDelete(pWhere); + return; +} + +/* +** This routine generates VDBE code that causes a single row of a +** single table to be deleted. +** +** The VDBE must be in a particular state when this routine is called. +** These are the requirements: +** +** 1. A read/write cursor pointing to pTab, the table containing the row +** to be deleted, must be opened as cursor number "base". +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number base+i for the i-th index. +** +** 3. The record number of the row to be deleted must be on the top +** of the stack. +** +** This routine pops the top of the stack to remove the record number +** and then generates code to remove both the table record and all index +** entries that point to that record. +*/ +void sqlite3GenerateRowDelete( + sqlite3 *db, /* The database containing the index */ + Vdbe *v, /* Generate code into this VDBE */ + Table *pTab, /* Table containing the row to be deleted */ + int iCur, /* Cursor number for the table */ + int count /* Increment the row change counter */ +){ + int addr; + addr = sqlite3VdbeAddOp(v, OP_NotExists, iCur, 0); + sqlite3GenerateRowIndexDelete(v, pTab, iCur, 0); + sqlite3VdbeAddOp(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0)); + if( count ){ + sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + } + sqlite3VdbeJumpHere(v, addr); +} + +/* +** This routine generates VDBE code that causes the deletion of all +** index entries associated with a single row of a single table. +** +** The VDBE must be in a particular state when this routine is called. +** These are the requirements: +** +** 1. A read/write cursor pointing to pTab, the table containing the row +** to be deleted, must be opened as cursor number "iCur". +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iCur+i for the i-th index. +** +** 3. The "iCur" cursor must be pointing to the row that is to be +** deleted. +*/ +void sqlite3GenerateRowIndexDelete( + Vdbe *v, /* Generate code into this VDBE */ + Table *pTab, /* Table containing the row to be deleted */ + int iCur, /* Cursor number for the table */ + char *aIdxUsed /* Only delete if aIdxUsed!=0 && aIdxUsed[i]!=0 */ +){ + int i; + Index *pIdx; + + for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + if( aIdxUsed!=0 && aIdxUsed[i-1]==0 ) continue; + sqlite3GenerateIndexKey(v, pIdx, iCur); + sqlite3VdbeAddOp(v, OP_IdxDelete, iCur+i, 0); + } +} + +/* +** Generate code that will assemble an index key and put it on the top +** of the tack. The key with be for index pIdx which is an index on pTab. +** iCur is the index of a cursor open on the pTab table and pointing to +** the entry that needs indexing. +*/ +void sqlite3GenerateIndexKey( + Vdbe *v, /* Generate code into this VDBE */ + Index *pIdx, /* The index for which to generate a key */ + int iCur /* Cursor number for the pIdx->pTable table */ +){ + int j; + Table *pTab = pIdx->pTable; + + sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); + for(j=0; jnColumn; j++){ + int idx = pIdx->aiColumn[j]; + if( idx==pTab->iPKey ){ + sqlite3VdbeAddOp(v, OP_Dup, j, 0); + }else{ + sqlite3VdbeAddOp(v, OP_Column, iCur, idx); + sqlite3ColumnDefault(v, pTab, idx); + } + } + sqlite3VdbeAddOp(v, OP_MakeIdxRec, pIdx->nColumn, 0); + sqlite3IndexAffinityStr(v, pIdx); +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt b/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt new file mode 100644 index 0000000000..55560ef057 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt @@ -0,0 +1,2267 @@ +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** 2003 September 6 +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** The author disclaims copyright to this source code. In place of +1.1 (drh 06-Sep-03): ** a legal notice, here is a blessing: +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** May you do good and not evil. +1.1 (drh 06-Sep-03): ** May you find forgiveness for yourself and forgive others. +1.1 (drh 06-Sep-03): ** May you share freely, never taking more than you give. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ************************************************************************* +1.1 (drh 06-Sep-03): ** This file contains code used for creating, destroying, and populating +1.65 (danielk1 26-May-04): ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) Prior +1.1 (drh 06-Sep-03): ** to version 2.8.7, all this code was combined into the vdbe.c source file. +1.1 (drh 06-Sep-03): ** But that file was getting too big so this subroutines were split out. +1.1 (drh 06-Sep-03): */ +1.1 (drh 06-Sep-03): #include "sqliteInt.h" +1.1 (drh 06-Sep-03): #include +1.1 (drh 06-Sep-03): #include "vdbeInt.h" +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): +1.311 (drh 27-Aug-07): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** When debugging the code generator in a symbolic debugger, one can +1.24 (danielk1 10-May-04): ** set the sqlite3_vdbe_addop_trace to 1 and all opcodes will be printed +1.1 (drh 06-Sep-03): ** as they are added to the instruction stream. +1.1 (drh 06-Sep-03): */ +1.182 (drh 14-Jun-05): #ifdef SQLITE_DEBUG +1.24 (danielk1 10-May-04): int sqlite3_vdbe_addop_trace = 0; +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Create a new virtual database engine. +1.1 (drh 06-Sep-03): */ +1.140 (drh 06-Sep-04): Vdbe *sqlite3VdbeCreate(sqlite3 *db){ +1.1 (drh 06-Sep-03): Vdbe *p; +1.299 (drh 16-Aug-07): p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); +1.1 (drh 06-Sep-03): if( p==0 ) return 0; +1.1 (drh 06-Sep-03): p->db = db; +1.1 (drh 06-Sep-03): if( db->pVdbe ){ +1.1 (drh 06-Sep-03): db->pVdbe->pPrev = p; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): p->pNext = db->pVdbe; +1.1 (drh 06-Sep-03): p->pPrev = 0; +1.1 (drh 06-Sep-03): db->pVdbe = p; +1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_INIT; +1.1 (drh 06-Sep-03): return p; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.268 (drh 09-Nov-06): ** Remember the SQL string for a prepared statement. +1.268 (drh 09-Nov-06): */ +1.268 (drh 09-Nov-06): void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n){ +1.268 (drh 09-Nov-06): if( p==0 ) return; +1.268 (drh 09-Nov-06): assert( p->zSql==0 ); +1.299 (drh 16-Aug-07): p->zSql = sqlite3DbStrNDup(p->db, z, n); +1.268 (drh 09-Nov-06): } +1.268 (drh 09-Nov-06): +1.268 (drh 09-Nov-06): /* +1.268 (drh 09-Nov-06): ** Return the SQL associated with a prepared statement +1.268 (drh 09-Nov-06): */ +1.268 (drh 09-Nov-06): const char *sqlite3VdbeGetSql(Vdbe *p){ +1.268 (drh 09-Nov-06): return p->zSql; +1.268 (drh 09-Nov-06): } +1.268 (drh 09-Nov-06): +1.268 (drh 09-Nov-06): /* +1.269 (drh 08-Jan-07): ** Swap all content between two VDBE structures. +1.268 (drh 09-Nov-06): */ +1.269 (drh 08-Jan-07): void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ +1.269 (drh 08-Jan-07): Vdbe tmp, *pTmp; +1.269 (drh 08-Jan-07): char *zTmp; +1.269 (drh 08-Jan-07): int nTmp; +1.269 (drh 08-Jan-07): tmp = *pA; +1.269 (drh 08-Jan-07): *pA = *pB; +1.269 (drh 08-Jan-07): *pB = tmp; +1.269 (drh 08-Jan-07): pTmp = pA->pNext; +1.269 (drh 08-Jan-07): pA->pNext = pB->pNext; +1.269 (drh 08-Jan-07): pB->pNext = pTmp; +1.269 (drh 08-Jan-07): pTmp = pA->pPrev; +1.269 (drh 08-Jan-07): pA->pPrev = pB->pPrev; +1.269 (drh 08-Jan-07): pB->pPrev = pTmp; +1.269 (drh 08-Jan-07): zTmp = pA->zSql; +1.269 (drh 08-Jan-07): pA->zSql = pB->zSql; +1.269 (drh 08-Jan-07): pB->zSql = zTmp; +1.269 (drh 08-Jan-07): nTmp = pA->nSql; +1.269 (drh 08-Jan-07): pA->nSql = pB->nSql; +1.269 (drh 08-Jan-07): pB->nSql = nTmp; +1.268 (drh 09-Nov-06): } +1.268 (drh 09-Nov-06): +1.287 (drh 08-May-07): #ifdef SQLITE_DEBUG +1.268 (drh 09-Nov-06): /* +1.1 (drh 06-Sep-03): ** Turn tracing on or off +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeTrace(Vdbe *p, FILE *trace){ +1.1 (drh 06-Sep-03): p->trace = trace; +1.1 (drh 06-Sep-03): } +1.287 (drh 08-May-07): #endif +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.146 (drh 24-Sep-04): ** Resize the Vdbe.aOp array so that it contains at least N +1.170 (danielk1 28-Mar-05): ** elements. If the Vdbe is in VDBE_MAGIC_RUN state, then +1.235 (danielk1 26-Jan-06): ** the Vdbe.aOp array will be sized to contain exactly N +1.235 (danielk1 26-Jan-06): ** elements. Vdbe.nOpAlloc is set to reflect the new size of +1.235 (danielk1 26-Jan-06): ** the array. +1.235 (danielk1 26-Jan-06): ** +1.235 (danielk1 26-Jan-06): ** If an out-of-memory error occurs while resizing the array, +1.235 (danielk1 26-Jan-06): ** Vdbe.aOp and Vdbe.nOpAlloc remain unchanged (this is so that +1.235 (danielk1 26-Jan-06): ** any opcodes already allocated can be correctly deallocated +1.235 (danielk1 26-Jan-06): ** along with the rest of the Vdbe). +1.146 (drh 24-Sep-04): */ +1.146 (drh 24-Sep-04): static void resizeOpArray(Vdbe *p, int N){ +1.199 (drh 16-Sep-05): int runMode = p->magic==VDBE_MAGIC_RUN; +1.199 (drh 16-Sep-05): if( runMode || p->nOpAllocnOpAlloc; +1.315 (danielk1 29-Aug-07): pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op)); +1.198 (drh 16-Sep-05): if( pNew ){ +1.199 (drh 16-Sep-05): p->nOpAlloc = nNew; +1.198 (drh 16-Sep-05): p->aOp = pNew; +1.199 (drh 16-Sep-05): if( nNew>oldSize ){ +1.199 (drh 16-Sep-05): memset(&p->aOp[oldSize], 0, (nNew-oldSize)*sizeof(Op)); +1.199 (drh 16-Sep-05): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): +1.146 (drh 24-Sep-04): /* +1.1 (drh 06-Sep-03): ** Add a new instruction to the list of instructions current in the +1.1 (drh 06-Sep-03): ** VDBE. Return the address of the new instruction. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** Parameters: +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** p Pointer to the VDBE +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** op The opcode for this instruction +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** p1, p2 First two of the three possible operands. +1.1 (drh 06-Sep-03): ** +1.19 (danielk1 08-May-04): ** Use the sqlite3VdbeResolveLabel() function to fix an address and +1.19 (danielk1 08-May-04): ** the sqlite3VdbeChangeP3() function to change the value of the P3 +1.1 (drh 06-Sep-03): ** operand. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeAddOp(Vdbe *p, int op, int p1, int p2){ +1.1 (drh 06-Sep-03): int i; +1.18 (drh 22-Feb-04): VdbeOp *pOp; +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): i = p->nOp; +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.241 (drh 15-Mar-06): if( p->nOpAlloc<=i ){ +1.241 (drh 15-Mar-06): resizeOpArray(p, i+1); +1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ +1.241 (drh 15-Mar-06): return 0; +1.241 (drh 15-Mar-06): } +1.1 (drh 06-Sep-03): } +1.282 (danielk1 18-Apr-07): p->nOp++; +1.18 (drh 22-Feb-04): pOp = &p->aOp[i]; +1.18 (drh 22-Feb-04): pOp->opcode = op; +1.18 (drh 22-Feb-04): pOp->p1 = p1; +1.18 (drh 22-Feb-04): pOp->p2 = p2; +1.18 (drh 22-Feb-04): pOp->p3 = 0; +1.18 (drh 22-Feb-04): pOp->p3type = P3_NOTUSED; +1.185 (drh 14-Aug-05): p->expired = 0; +1.156 (danielk1 12-Jan-05): #ifdef SQLITE_DEBUG +1.24 (danielk1 10-May-04): if( sqlite3_vdbe_addop_trace ) sqlite3VdbePrintOp(0, i, &p->aOp[i]); +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): return i; +1.1 (drh 06-Sep-03): } +1.18 (drh 22-Feb-04): +1.18 (drh 22-Feb-04): /* +1.18 (drh 22-Feb-04): ** Add an opcode that includes the p3 value. +1.18 (drh 22-Feb-04): */ +1.69 (drh 27-May-04): int sqlite3VdbeOp3(Vdbe *p, int op, int p1, int p2, const char *zP3,int p3type){ +1.19 (danielk1 08-May-04): int addr = sqlite3VdbeAddOp(p, op, p1, p2); +1.19 (danielk1 08-May-04): sqlite3VdbeChangeP3(p, addr, zP3, p3type); +1.18 (drh 22-Feb-04): return addr; +1.18 (drh 22-Feb-04): } +1.18 (drh 22-Feb-04): +1.18 (drh 22-Feb-04): /* +1.1 (drh 06-Sep-03): ** Create a new symbolic label for an instruction that has yet to be +1.1 (drh 06-Sep-03): ** coded. The symbolic label is really just a negative number. The +1.1 (drh 06-Sep-03): ** label can be used as the P2 value of an operation. Later, when +1.1 (drh 06-Sep-03): ** the label is resolved to a specific address, the VDBE will scan +1.1 (drh 06-Sep-03): ** through its operation list and change all values of P2 which match +1.1 (drh 06-Sep-03): ** the label into the resolved address. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** The VDBE knows that a P2 value is a label because labels are +1.1 (drh 06-Sep-03): ** always negative and P2 values are suppose to be non-negative. +1.1 (drh 06-Sep-03): ** Hence, a negative P2 value is a label that has yet to be resolved. +1.129 (danielk1 26-Jun-04): ** +1.129 (danielk1 26-Jun-04): ** Zero is returned if a malloc() fails. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeMakeLabel(Vdbe *p){ +1.1 (drh 06-Sep-03): int i; +1.1 (drh 06-Sep-03): i = p->nLabel++; +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.1 (drh 06-Sep-03): if( i>=p->nLabelAlloc ){ +1.1 (drh 06-Sep-03): p->nLabelAlloc = p->nLabelAlloc*2 + 10; +1.300 (danielk1 16-Aug-07): p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, +1.273 (drh 27-Mar-07): p->nLabelAlloc*sizeof(p->aLabel[0])); +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): if( p->aLabel ){ +1.146 (drh 24-Sep-04): p->aLabel[i] = -1; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): return -1-i; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Resolve label "x" to be the address of the next instruction to +1.1 (drh 06-Sep-03): ** be inserted. The parameter "x" must have been obtained from +1.19 (danielk1 08-May-04): ** a prior call to sqlite3VdbeMakeLabel(). +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeResolveLabel(Vdbe *p, int x){ +1.146 (drh 24-Sep-04): int j = -1-x; +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.146 (drh 24-Sep-04): assert( j>=0 && jnLabel ); +1.146 (drh 24-Sep-04): if( p->aLabel ){ +1.146 (drh 24-Sep-04): p->aLabel[j] = p->nOp; +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): +1.146 (drh 24-Sep-04): /* +1.171 (danielk1 29-Mar-05): ** Return non-zero if opcode 'op' is guarenteed not to push more values +1.171 (danielk1 29-Mar-05): ** onto the VDBE stack than it pops off. +1.171 (danielk1 29-Mar-05): */ +1.172 (danielk1 29-Mar-05): static int opcodeNoPush(u8 op){ +1.172 (danielk1 29-Mar-05): /* The 10 NOPUSH_MASK_n constants are defined in the automatically +1.171 (danielk1 29-Mar-05): ** generated header file opcodes.h. Each is a 16-bit bitmask, one +1.171 (danielk1 29-Mar-05): ** bit corresponding to each opcode implemented by the virtual +1.172 (danielk1 29-Mar-05): ** machine in vdbe.c. The bit is true if the word "no-push" appears +1.171 (danielk1 29-Mar-05): ** in a comment on the same line as the "case OP_XXX:" in +1.171 (danielk1 29-Mar-05): ** sqlite3VdbeExec() in vdbe.c. +1.171 (danielk1 29-Mar-05): ** +1.171 (danielk1 29-Mar-05): ** If the bit is true, then the corresponding opcode is guarenteed not +1.171 (danielk1 29-Mar-05): ** to grow the stack when it is executed. Otherwise, it may grow the +1.171 (danielk1 29-Mar-05): ** stack by at most one entry. +1.171 (danielk1 29-Mar-05): ** +1.172 (danielk1 29-Mar-05): ** NOPUSH_MASK_0 corresponds to opcodes 0 to 15. NOPUSH_MASK_1 contains +1.171 (danielk1 29-Mar-05): ** one bit for opcodes 16 to 31, and so on. +1.171 (danielk1 29-Mar-05): ** +1.171 (danielk1 29-Mar-05): ** 16-bit bitmasks (rather than 32-bit) are specified in opcodes.h +1.171 (danielk1 29-Mar-05): ** because the file is generated by an awk program. Awk manipulates +1.171 (danielk1 29-Mar-05): ** all numbers as floating-point and we don't want to risk a rounding +1.171 (danielk1 29-Mar-05): ** error if someone builds with an awk that uses (for example) 32-bit +1.171 (danielk1 29-Mar-05): ** IEEE floats. +1.171 (danielk1 29-Mar-05): */ +1.173 (drh 31-Mar-05): static const u32 masks[5] = { +1.238 (drh 24-Feb-06): NOPUSH_MASK_0 + (((unsigned)NOPUSH_MASK_1)<<16), +1.238 (drh 24-Feb-06): NOPUSH_MASK_2 + (((unsigned)NOPUSH_MASK_3)<<16), +1.238 (drh 24-Feb-06): NOPUSH_MASK_4 + (((unsigned)NOPUSH_MASK_5)<<16), +1.238 (drh 24-Feb-06): NOPUSH_MASK_6 + (((unsigned)NOPUSH_MASK_7)<<16), +1.238 (drh 24-Feb-06): NOPUSH_MASK_8 + (((unsigned)NOPUSH_MASK_9)<<16) +1.171 (danielk1 29-Mar-05): }; +1.206 (drh 29-Nov-05): assert( op<32*5 ); +1.171 (danielk1 29-Mar-05): return (masks[op>>5] & (1<<(op&0x1F))); +1.171 (danielk1 29-Mar-05): } +1.171 (danielk1 29-Mar-05): +1.171 (danielk1 29-Mar-05): #ifndef NDEBUG +1.172 (danielk1 29-Mar-05): int sqlite3VdbeOpcodeNoPush(u8 op){ +1.172 (danielk1 29-Mar-05): return opcodeNoPush(op); +1.171 (danielk1 29-Mar-05): } +1.171 (danielk1 29-Mar-05): #endif +1.171 (danielk1 29-Mar-05): +1.171 (danielk1 29-Mar-05): /* +1.146 (drh 24-Sep-04): ** Loop through the program looking for P2 values that are negative. +1.146 (drh 24-Sep-04): ** Each such value is a label. Resolve the label by setting the P2 +1.146 (drh 24-Sep-04): ** value to its correct non-zero value. +1.146 (drh 24-Sep-04): ** +1.146 (drh 24-Sep-04): ** This routine is called once after all opcodes have been inserted. +1.170 (danielk1 28-Mar-05): ** +1.195 (drh 07-Sep-05): ** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument +1.247 (danielk1 14-Jun-06): ** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by +1.170 (danielk1 28-Mar-05): ** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array. +1.171 (danielk1 29-Mar-05): ** +1.171 (danielk1 29-Mar-05): ** The integer *pMaxStack is set to the maximum number of vdbe stack +1.171 (danielk1 29-Mar-05): ** entries that static analysis reveals this program might need. +1.180 (drh 07-Jun-05): ** +1.180 (drh 07-Jun-05): ** This routine also does the following optimization: It scans for +1.180 (drh 07-Jun-05): ** Halt instructions where P1==SQLITE_CONSTRAINT or P2==OE_Abort or for +1.181 (drh 12-Jun-05): ** IdxInsert instructions where P2!=0. If no such instruction is +1.180 (drh 07-Jun-05): ** found, then every Statement instruction is changed to a Noop. In +1.180 (drh 07-Jun-05): ** this way, we avoid creating the statement journal file unnecessarily. +1.146 (drh 24-Sep-04): */ +1.171 (danielk1 29-Mar-05): static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs, int *pMaxStack){ +1.146 (drh 24-Sep-04): int i; +1.171 (danielk1 29-Mar-05): int nMaxArgs = 0; +1.171 (danielk1 29-Mar-05): int nMaxStack = p->nOp; +1.146 (drh 24-Sep-04): Op *pOp; +1.146 (drh 24-Sep-04): int *aLabel = p->aLabel; +1.180 (drh 07-Jun-05): int doesStatementRollback = 0; +1.180 (drh 07-Jun-05): int hasStatementBegin = 0; +1.146 (drh 24-Sep-04): for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ +1.170 (danielk1 28-Mar-05): u8 opcode = pOp->opcode; +1.170 (danielk1 28-Mar-05): +1.251 (danielk1 20-Jun-06): if( opcode==OP_Function || opcode==OP_AggStep +1.247 (danielk1 14-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE +1.251 (danielk1 20-Jun-06): || opcode==OP_VUpdate +1.247 (danielk1 14-Jun-06): #endif +1.247 (danielk1 14-Jun-06): ){ +1.171 (danielk1 29-Mar-05): if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; +1.294 (danielk1 27-Jun-07): } +1.294 (danielk1 27-Jun-07): if( opcode==OP_Halt ){ +1.180 (drh 07-Jun-05): if( pOp->p1==SQLITE_CONSTRAINT && pOp->p2==OE_Abort ){ +1.180 (drh 07-Jun-05): doesStatementRollback = 1; +1.180 (drh 07-Jun-05): } +1.180 (drh 07-Jun-05): }else if( opcode==OP_Statement ){ +1.180 (drh 07-Jun-05): hasStatementBegin = 1; +1.294 (danielk1 27-Jun-07): #ifndef SQLITE_OMIT_VIRTUALTABLE +1.294 (danielk1 27-Jun-07): }else if( opcode==OP_VUpdate || opcode==OP_VRename ){ +1.294 (danielk1 27-Jun-07): doesStatementRollback = 1; +1.246 (drh 13-Jun-06): }else if( opcode==OP_VFilter ){ +1.246 (drh 13-Jun-06): int n; +1.246 (drh 13-Jun-06): assert( p->nOp - i >= 3 ); +1.246 (drh 13-Jun-06): assert( pOp[-2].opcode==OP_Integer ); +1.246 (drh 13-Jun-06): n = pOp[-2].p1; +1.246 (drh 13-Jun-06): if( n>nMaxArgs ) nMaxArgs = n; +1.294 (danielk1 27-Jun-07): #endif +1.171 (danielk1 29-Mar-05): } +1.172 (danielk1 29-Mar-05): if( opcodeNoPush(opcode) ){ +1.171 (danielk1 29-Mar-05): nMaxStack--; +1.170 (danielk1 28-Mar-05): } +1.170 (danielk1 28-Mar-05): +1.146 (drh 24-Sep-04): if( pOp->p2>=0 ) continue; +1.146 (drh 24-Sep-04): assert( -1-pOp->p2nLabel ); +1.146 (drh 24-Sep-04): pOp->p2 = aLabel[-1-pOp->p2]; +1.1 (drh 06-Sep-03): } +1.299 (drh 16-Aug-07): sqlite3_free(p->aLabel); +1.146 (drh 24-Sep-04): p->aLabel = 0; +1.171 (danielk1 29-Mar-05): +1.171 (danielk1 29-Mar-05): *pMaxFuncArgs = nMaxArgs; +1.171 (danielk1 29-Mar-05): *pMaxStack = nMaxStack; +1.180 (drh 07-Jun-05): +1.180 (drh 07-Jun-05): /* If we never rollback a statement transaction, then statement +1.180 (drh 07-Jun-05): ** transactions are not needed. So change every OP_Statement +1.218 (drh 06-Jan-06): ** opcode into an OP_Noop. This avoid a call to sqlite3OsOpenExclusive() +1.180 (drh 07-Jun-05): ** which can be expensive on some platforms. +1.180 (drh 07-Jun-05): */ +1.180 (drh 07-Jun-05): if( hasStatementBegin && !doesStatementRollback ){ +1.180 (drh 07-Jun-05): for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ +1.180 (drh 07-Jun-05): if( pOp->opcode==OP_Statement ){ +1.180 (drh 07-Jun-05): pOp->opcode = OP_Noop; +1.180 (drh 07-Jun-05): } +1.180 (drh 07-Jun-05): } +1.180 (drh 07-Jun-05): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Return the address of the next instruction to be inserted. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeCurrentAddr(Vdbe *p){ +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.1 (drh 06-Sep-03): return p->nOp; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Add a whole list of operations to the operation stack. Return the +1.1 (drh 06-Sep-03): ** address of the first operation added. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ +1.1 (drh 06-Sep-03): int addr; +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.146 (drh 24-Sep-04): resizeOpArray(p, p->nOp + nOp); +1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ +1.146 (drh 24-Sep-04): return 0; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): addr = p->nOp; +1.1 (drh 06-Sep-03): if( nOp>0 ){ +1.1 (drh 06-Sep-03): int i; +1.16 (drh 21-Feb-04): VdbeOpList const *pIn = aOp; +1.16 (drh 21-Feb-04): for(i=0; ip2; +1.16 (drh 21-Feb-04): VdbeOp *pOut = &p->aOp[i+addr]; +1.16 (drh 21-Feb-04): pOut->opcode = pIn->opcode; +1.16 (drh 21-Feb-04): pOut->p1 = pIn->p1; +1.16 (drh 21-Feb-04): pOut->p2 = p2<0 ? addr + ADDR(p2) : p2; +1.16 (drh 21-Feb-04): pOut->p3 = pIn->p3; +1.16 (drh 21-Feb-04): pOut->p3type = pIn->p3 ? P3_STATIC : P3_NOTUSED; +1.156 (danielk1 12-Jan-05): #ifdef SQLITE_DEBUG +1.24 (danielk1 10-May-04): if( sqlite3_vdbe_addop_trace ){ +1.19 (danielk1 08-May-04): sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): p->nOp += nOp; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): return addr; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Change the value of the P1 operand for a specific instruction. +1.1 (drh 06-Sep-03): ** This routine is useful when a large program is loaded from a +1.19 (danielk1 08-May-04): ** static array using sqlite3VdbeAddOpList but we want to make a +1.1 (drh 06-Sep-03): ** few minor changes to the program. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ +1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); +1.1 (drh 06-Sep-03): if( p && addr>=0 && p->nOp>addr && p->aOp ){ +1.1 (drh 06-Sep-03): p->aOp[addr].p1 = val; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Change the value of the P2 operand for a specific instruction. +1.1 (drh 06-Sep-03): ** This routine is useful for setting a jump destination. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ +1.1 (drh 06-Sep-03): assert( val>=0 ); +1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); +1.1 (drh 06-Sep-03): if( p && addr>=0 && p->nOp>addr && p->aOp ){ +1.1 (drh 06-Sep-03): p->aOp[addr].p2 = val; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.202 (drh 20-Sep-05): /* +1.242 (drh 17-Mar-06): ** Change the P2 operand of instruction addr so that it points to +1.202 (drh 20-Sep-05): ** the address of the next instruction to be coded. +1.202 (drh 20-Sep-05): */ +1.202 (drh 20-Sep-05): void sqlite3VdbeJumpHere(Vdbe *p, int addr){ +1.202 (drh 20-Sep-05): sqlite3VdbeChangeP2(p, addr, p->nOp); +1.202 (drh 20-Sep-05): } +1.198 (drh 16-Sep-05): +1.257 (drh 08-Jul-06): +1.257 (drh 08-Jul-06): /* +1.257 (drh 08-Jul-06): ** If the input FuncDef structure is ephemeral, then free it. If +1.257 (drh 08-Jul-06): ** the FuncDef is not ephermal, then do nothing. +1.257 (drh 08-Jul-06): */ +1.257 (drh 08-Jul-06): static void freeEphemeralFunction(FuncDef *pDef){ +1.257 (drh 08-Jul-06): if( pDef && (pDef->flags & SQLITE_FUNC_EPHEM)!=0 ){ +1.299 (drh 16-Aug-07): sqlite3_free(pDef); +1.257 (drh 08-Jul-06): } +1.257 (drh 08-Jul-06): } +1.257 (drh 08-Jul-06): +1.198 (drh 16-Sep-05): /* +1.198 (drh 16-Sep-05): ** Delete a P3 value if necessary. +1.198 (drh 16-Sep-05): */ +1.198 (drh 16-Sep-05): static void freeP3(int p3type, void *p3){ +1.198 (drh 16-Sep-05): if( p3 ){ +1.201 (drh 17-Sep-05): switch( p3type ){ +1.201 (drh 17-Sep-05): case P3_DYNAMIC: +1.201 (drh 17-Sep-05): case P3_KEYINFO: +1.201 (drh 17-Sep-05): case P3_KEYINFO_HANDOFF: { +1.299 (drh 16-Aug-07): sqlite3_free(p3); +1.201 (drh 17-Sep-05): break; +1.201 (drh 17-Sep-05): } +1.246 (drh 13-Jun-06): case P3_MPRINTF: { +1.246 (drh 13-Jun-06): sqlite3_free(p3); +1.246 (drh 13-Jun-06): break; +1.246 (drh 13-Jun-06): } +1.201 (drh 17-Sep-05): case P3_VDBEFUNC: { +1.201 (drh 17-Sep-05): VdbeFunc *pVdbeFunc = (VdbeFunc *)p3; +1.257 (drh 08-Jul-06): freeEphemeralFunction(pVdbeFunc->pFunc); +1.201 (drh 17-Sep-05): sqlite3VdbeDeleteAuxData(pVdbeFunc, 0); +1.299 (drh 16-Aug-07): sqlite3_free(pVdbeFunc); +1.201 (drh 17-Sep-05): break; +1.201 (drh 17-Sep-05): } +1.257 (drh 08-Jul-06): case P3_FUNCDEF: { +1.257 (drh 08-Jul-06): freeEphemeralFunction((FuncDef*)p3); +1.257 (drh 08-Jul-06): break; +1.257 (drh 08-Jul-06): } +1.201 (drh 17-Sep-05): case P3_MEM: { +1.201 (drh 17-Sep-05): sqlite3ValueFree((sqlite3_value*)p3); +1.201 (drh 17-Sep-05): break; +1.201 (drh 17-Sep-05): } +1.198 (drh 16-Sep-05): } +1.198 (drh 16-Sep-05): } +1.198 (drh 16-Sep-05): } +1.198 (drh 16-Sep-05): +1.198 (drh 16-Sep-05): +1.1 (drh 06-Sep-03): /* +1.242 (drh 17-Mar-06): ** Change N opcodes starting at addr to No-ops. +1.242 (drh 17-Mar-06): */ +1.242 (drh 17-Mar-06): void sqlite3VdbeChangeToNoop(Vdbe *p, int addr, int N){ +1.285 (danielk1 04-May-07): if( p && p->aOp ){ +1.285 (danielk1 04-May-07): VdbeOp *pOp = &p->aOp[addr]; +1.285 (danielk1 04-May-07): while( N-- ){ +1.285 (danielk1 04-May-07): freeP3(pOp->p3type, pOp->p3); +1.285 (danielk1 04-May-07): memset(pOp, 0, sizeof(pOp[0])); +1.285 (danielk1 04-May-07): pOp->opcode = OP_Noop; +1.285 (danielk1 04-May-07): pOp++; +1.285 (danielk1 04-May-07): } +1.242 (drh 17-Mar-06): } +1.242 (drh 17-Mar-06): } +1.242 (drh 17-Mar-06): +1.242 (drh 17-Mar-06): /* +1.1 (drh 06-Sep-03): ** Change the value of the P3 operand for a specific instruction. +1.1 (drh 06-Sep-03): ** This routine is useful when a large program is loaded from a +1.19 (danielk1 08-May-04): ** static array using sqlite3VdbeAddOpList but we want to make a +1.1 (drh 06-Sep-03): ** few minor changes to the program. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** If n>=0 then the P3 operand is dynamic, meaning that a copy of +1.299 (drh 16-Aug-07): ** the string is made into memory obtained from sqlite3_malloc(). +1.1 (drh 06-Sep-03): ** A value of n==0 means copy bytes of zP3 up to and including the +1.1 (drh 06-Sep-03): ** first null byte. If n>0 then copy n+1 bytes of zP3. +1.1 (drh 06-Sep-03): ** +1.176 (danielk1 19-May-05): ** If n==P3_KEYINFO it means that zP3 is a pointer to a KeyInfo structure. +1.176 (danielk1 19-May-05): ** A copy is made of the KeyInfo structure into memory obtained from +1.299 (drh 16-Aug-07): ** sqlite3_malloc, to be freed when the Vdbe is finalized. +1.176 (danielk1 19-May-05): ** n==P3_KEYINFO_HANDOFF indicates that zP3 points to a KeyInfo structure +1.299 (drh 16-Aug-07): ** stored in memory that the caller has obtained from sqlite3_malloc. The +1.176 (danielk1 19-May-05): ** caller should not free the allocation, it will be freed when the Vdbe is +1.176 (danielk1 19-May-05): ** finalized. +1.176 (danielk1 19-May-05): ** +1.176 (danielk1 19-May-05): ** Other values of n (P3_STATIC, P3_COLLSEQ etc.) indicate that zP3 points +1.176 (danielk1 19-May-05): ** to a string or structure that is guaranteed to exist for the lifetime of +1.176 (danielk1 19-May-05): ** the Vdbe. In these cases we can just copy the pointer. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** If addr<0 then change P3 on the most recently inserted instruction. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP3(Vdbe *p, int addr, const char *zP3, int n){ +1.1 (drh 06-Sep-03): Op *pOp; +1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); +1.299 (drh 16-Aug-07): if( p==0 || p->aOp==0 || p->db->mallocFailed ){ +1.208 (danielk1 06-Dec-05): if (n != P3_KEYINFO) { +1.208 (danielk1 06-Dec-05): freeP3(n, (void*)*(char**)&zP3); +1.208 (danielk1 06-Dec-05): } +1.168 (danielk1 16-Mar-05): return; +1.168 (danielk1 16-Mar-05): } +1.1 (drh 06-Sep-03): if( addr<0 || addr>=p->nOp ){ +1.1 (drh 06-Sep-03): addr = p->nOp - 1; +1.1 (drh 06-Sep-03): if( addr<0 ) return; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): pOp = &p->aOp[addr]; +1.198 (drh 16-Sep-05): freeP3(pOp->p3type, pOp->p3); +1.198 (drh 16-Sep-05): pOp->p3 = 0; +1.1 (drh 06-Sep-03): if( zP3==0 ){ +1.1 (drh 06-Sep-03): pOp->p3 = 0; +1.1 (drh 06-Sep-03): pOp->p3type = P3_NOTUSED; +1.50 (drh 20-May-04): }else if( n==P3_KEYINFO ){ +1.50 (drh 20-May-04): KeyInfo *pKeyInfo; +1.50 (drh 20-May-04): int nField, nByte; +1.192 (drh 01-Sep-05): +1.50 (drh 20-May-04): nField = ((KeyInfo*)zP3)->nField; +1.211 (drh 16-Dec-05): nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo->aColl[0]) + nField; +1.299 (drh 16-Aug-07): pKeyInfo = sqlite3_malloc( nByte ); +1.50 (drh 20-May-04): pOp->p3 = (char*)pKeyInfo; +1.50 (drh 20-May-04): if( pKeyInfo ){ +1.226 (danielk1 16-Jan-06): unsigned char *aSortOrder; +1.50 (drh 20-May-04): memcpy(pKeyInfo, zP3, nByte); +1.211 (drh 16-Dec-05): aSortOrder = pKeyInfo->aSortOrder; +1.211 (drh 16-Dec-05): if( aSortOrder ){ +1.226 (danielk1 16-Jan-06): pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo->aColl[nField]; +1.211 (drh 16-Dec-05): memcpy(pKeyInfo->aSortOrder, aSortOrder, nField); +1.211 (drh 16-Dec-05): } +1.50 (drh 20-May-04): pOp->p3type = P3_KEYINFO; +1.50 (drh 20-May-04): }else{ +1.299 (drh 16-Aug-07): p->db->mallocFailed = 1; +1.50 (drh 20-May-04): pOp->p3type = P3_NOTUSED; +1.50 (drh 20-May-04): } +1.51 (drh 21-May-04): }else if( n==P3_KEYINFO_HANDOFF ){ +1.51 (drh 21-May-04): pOp->p3 = (char*)zP3; +1.51 (drh 21-May-04): pOp->p3type = P3_KEYINFO; +1.1 (drh 06-Sep-03): }else if( n<0 ){ +1.1 (drh 06-Sep-03): pOp->p3 = (char*)zP3; +1.1 (drh 06-Sep-03): pOp->p3type = n; +1.1 (drh 06-Sep-03): }else{ +1.147 (drh 25-Sep-04): if( n==0 ) n = strlen(zP3); +1.299 (drh 16-Aug-07): pOp->p3 = sqlite3DbStrNDup(p->db, zP3, n); +1.1 (drh 06-Sep-03): pOp->p3type = P3_DYNAMIC; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.144 (drh 19-Sep-04): #ifndef NDEBUG +1.144 (drh 19-Sep-04): /* +1.144 (drh 19-Sep-04): ** Replace the P3 field of the most recently coded instruction with +1.144 (drh 19-Sep-04): ** comment text. +1.144 (drh 19-Sep-04): */ +1.144 (drh 19-Sep-04): void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){ +1.144 (drh 19-Sep-04): va_list ap; +1.282 (danielk1 18-Apr-07): assert( p->nOp>0 || p->aOp==0 ); +1.299 (drh 16-Aug-07): assert( p->aOp==0 || p->aOp[p->nOp-1].p3==0 || p->db->mallocFailed ); +1.144 (drh 19-Sep-04): va_start(ap, zFormat); +1.300 (danielk1 16-Aug-07): sqlite3VdbeChangeP3(p, -1, sqlite3VMPrintf(p->db, zFormat, ap), P3_DYNAMIC); +1.144 (drh 19-Sep-04): va_end(ap); +1.144 (drh 19-Sep-04): } +1.144 (drh 19-Sep-04): #endif +1.144 (drh 19-Sep-04): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Return the opcode for a given address. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.299 (drh 16-Aug-07): assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); +1.282 (danielk1 18-Apr-07): return ((addr>=0 && addrnOp)?(&p->aOp[addr]):0); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.151 (drh 31-Oct-04): #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ +1.151 (drh 31-Oct-04): || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +1.1 (drh 06-Sep-03): /* +1.50 (drh 20-May-04): ** Compute a string that describes the P3 parameter for an opcode. +1.50 (drh 20-May-04): ** Use zTemp for any required temporary buffer space. +1.50 (drh 20-May-04): */ +1.50 (drh 20-May-04): static char *displayP3(Op *pOp, char *zTemp, int nTemp){ +1.50 (drh 20-May-04): char *zP3; +1.50 (drh 20-May-04): assert( nTemp>=20 ); +1.50 (drh 20-May-04): switch( pOp->p3type ){ +1.50 (drh 20-May-04): case P3_KEYINFO: { +1.50 (drh 20-May-04): int i, j; +1.50 (drh 20-May-04): KeyInfo *pKeyInfo = (KeyInfo*)pOp->p3; +1.286 (drh 04-May-07): sqlite3_snprintf(nTemp, zTemp, "keyinfo(%d", pKeyInfo->nField); +1.50 (drh 20-May-04): i = strlen(zTemp); +1.50 (drh 20-May-04): for(j=0; jnField; j++){ +1.50 (drh 20-May-04): CollSeq *pColl = pKeyInfo->aColl[j]; +1.50 (drh 20-May-04): if( pColl ){ +1.50 (drh 20-May-04): int n = strlen(pColl->zName); +1.50 (drh 20-May-04): if( i+n>nTemp-6 ){ +1.286 (drh 04-May-07): memcpy(&zTemp[i],",...",4); +1.50 (drh 20-May-04): break; +1.50 (drh 20-May-04): } +1.50 (drh 20-May-04): zTemp[i++] = ','; +1.51 (drh 21-May-04): if( pKeyInfo->aSortOrder && pKeyInfo->aSortOrder[j] ){ +1.50 (drh 20-May-04): zTemp[i++] = '-'; +1.50 (drh 20-May-04): } +1.286 (drh 04-May-07): memcpy(&zTemp[i], pColl->zName,n+1); +1.50 (drh 20-May-04): i += n; +1.50 (drh 20-May-04): }else if( i+4p3; +1.286 (drh 04-May-07): sqlite3_snprintf(nTemp, zTemp, "collseq(%.20s)", pColl->zName); +1.50 (drh 20-May-04): zP3 = zTemp; +1.50 (drh 20-May-04): break; +1.50 (drh 20-May-04): } +1.67 (drh 26-May-04): case P3_FUNCDEF: { +1.67 (drh 26-May-04): FuncDef *pDef = (FuncDef*)pOp->p3; +1.244 (drh 13-Jun-06): sqlite3_snprintf(nTemp, zTemp, "%s(%d)", pDef->zName, pDef->nArg); +1.244 (drh 13-Jun-06): zP3 = zTemp; +1.244 (drh 13-Jun-06): break; +1.244 (drh 13-Jun-06): } +1.244 (drh 13-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE +1.244 (drh 13-Jun-06): case P3_VTAB: { +1.244 (drh 13-Jun-06): sqlite3_vtab *pVtab = (sqlite3_vtab*)pOp->p3; +1.256 (drh 26-Jun-06): sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule); +1.67 (drh 26-May-04): zP3 = zTemp; +1.67 (drh 26-May-04): break; +1.67 (drh 26-May-04): } +1.244 (drh 13-Jun-06): #endif +1.50 (drh 20-May-04): default: { +1.50 (drh 20-May-04): zP3 = pOp->p3; +1.135 (drh 24-Jul-04): if( zP3==0 || pOp->opcode==OP_Noop ){ +1.50 (drh 20-May-04): zP3 = ""; +1.50 (drh 20-May-04): } +1.50 (drh 20-May-04): } +1.50 (drh 20-May-04): } +1.249 (drh 15-Jun-06): assert( zP3!=0 ); +1.50 (drh 20-May-04): return zP3; +1.50 (drh 20-May-04): } +1.151 (drh 31-Oct-04): #endif +1.50 (drh 20-May-04): +1.312 (drh 28-Aug-07): /* +1.313 (drh 28-Aug-07): ** Declare to the Vdbe that the BTree object at db->aDb[i] is used. +1.313 (drh 28-Aug-07): ** +1.312 (drh 28-Aug-07): */ +1.317 (drh 30-Aug-07): void sqlite3VdbeUsesBtree(Vdbe *p, int i){ +1.317 (drh 30-Aug-07): int mask; +1.313 (drh 28-Aug-07): assert( i>=0 && idb->nDb ); +1.313 (drh 28-Aug-07): assert( ibtreeMask)*8 ); +1.317 (drh 30-Aug-07): mask = 1<btreeMask & mask)==0 ){ +1.317 (drh 30-Aug-07): p->btreeMask |= mask; +1.317 (drh 30-Aug-07): sqlite3BtreeMutexArrayInsert(&p->aMutex, p->db->aDb[i].pBt); +1.317 (drh 30-Aug-07): } +1.312 (drh 28-Aug-07): } +1.312 (drh 28-Aug-07): +1.50 (drh 20-May-04): +1.156 (danielk1 12-Jan-05): #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Print a single opcode. This routine is used for debugging only. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ +1.1 (drh 06-Sep-03): char *zP3; +1.50 (drh 20-May-04): char zPtr[50]; +1.50 (drh 20-May-04): static const char *zFormat1 = "%4d %-13s %4d %4d %s\n"; +1.1 (drh 06-Sep-03): if( pOut==0 ) pOut = stdout; +1.50 (drh 20-May-04): zP3 = displayP3(pOp, zPtr, sizeof(zPtr)); +1.50 (drh 20-May-04): fprintf(pOut, zFormat1, +1.311 (drh 27-Aug-07): pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, zP3); +1.1 (drh 06-Sep-03): fflush(pOut); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.146 (drh 24-Sep-04): ** Release an array of N Mem elements +1.146 (drh 24-Sep-04): */ +1.146 (drh 24-Sep-04): static void releaseMemArray(Mem *p, int N){ +1.146 (drh 24-Sep-04): if( p ){ +1.146 (drh 24-Sep-04): while( N-->0 ){ +1.307 (drh 21-Aug-07): assert( N<2 || p[0].db==p[1].db ); +1.146 (drh 24-Sep-04): sqlite3VdbeMemRelease(p++); +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): } +1.146 (drh 24-Sep-04): +1.151 (drh 31-Oct-04): #ifndef SQLITE_OMIT_EXPLAIN +1.146 (drh 24-Sep-04): /* +1.1 (drh 06-Sep-03): ** Give a listing of the program in the virtual machine. +1.1 (drh 06-Sep-03): ** +1.19 (danielk1 08-May-04): ** The interface is the same as sqlite3VdbeExec(). But instead of +1.1 (drh 06-Sep-03): ** running the code, it invokes the callback once for each instruction. +1.1 (drh 06-Sep-03): ** This feature is used to implement "EXPLAIN". +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeList( +1.1 (drh 06-Sep-03): Vdbe *p /* The VDBE */ +1.1 (drh 06-Sep-03): ){ +1.140 (drh 06-Sep-04): sqlite3 *db = p->db; +1.1 (drh 06-Sep-03): int i; +1.14 (drh 14-Feb-04): int rc = SQLITE_OK; +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): assert( p->explain ); +1.155 (drh 11-Jan-05): if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE; +1.155 (drh 11-Jan-05): assert( db->magic==SQLITE_MAGIC_BUSY ); +1.155 (drh 11-Jan-05): assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY ); +1.56 (danielk1 22-May-04): +1.56 (danielk1 22-May-04): /* Even though this opcode does not put dynamic strings onto the +1.56 (danielk1 22-May-04): ** the stack, they may become dynamic if the user calls +1.68 (drh 26-May-04): ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. +1.56 (danielk1 22-May-04): */ +1.56 (danielk1 22-May-04): if( p->pTos==&p->aStack[4] ){ +1.146 (drh 24-Sep-04): releaseMemArray(p->aStack, 5); +1.56 (danielk1 22-May-04): } +1.56 (danielk1 22-May-04): p->resOnStack = 0; +1.56 (danielk1 22-May-04): +1.197 (drh 10-Sep-05): do{ +1.197 (drh 10-Sep-05): i = p->pc++; +1.197 (drh 10-Sep-05): }while( inOp && p->explain==2 && p->aOp[i].opcode!=OP_Explain ); +1.14 (drh 14-Feb-04): if( i>=p->nOp ){ +1.14 (drh 14-Feb-04): p->rc = SQLITE_OK; +1.14 (drh 14-Feb-04): rc = SQLITE_DONE; +1.259 (drh 26-Jul-06): }else if( db->u1.isInterrupted ){ +1.155 (drh 11-Jan-05): p->rc = SQLITE_INTERRUPT; +1.14 (drh 14-Feb-04): rc = SQLITE_ERROR; +1.89 (danielk1 31-May-04): sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(p->rc), (char*)0); +1.14 (drh 14-Feb-04): }else{ +1.50 (drh 20-May-04): Op *pOp = &p->aOp[i]; +1.69 (drh 27-May-04): Mem *pMem = p->aStack; +1.69 (drh 27-May-04): pMem->flags = MEM_Int; +1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; +1.276 (drh 30-Mar-07): pMem->u.i = i; /* Program counter */ +1.69 (drh 27-May-04): pMem++; +1.69 (drh 27-May-04): +1.69 (drh 27-May-04): pMem->flags = MEM_Static|MEM_Str|MEM_Term; +1.311 (drh 27-Aug-07): pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ +1.249 (drh 15-Jun-06): assert( pMem->z!=0 ); +1.69 (drh 27-May-04): pMem->n = strlen(pMem->z); +1.88 (drh 31-May-04): pMem->type = SQLITE_TEXT; +1.104 (danielk1 12-Jun-04): pMem->enc = SQLITE_UTF8; +1.69 (drh 27-May-04): pMem++; +1.69 (drh 27-May-04): +1.69 (drh 27-May-04): pMem->flags = MEM_Int; +1.276 (drh 30-Mar-07): pMem->u.i = pOp->p1; /* P1 */ +1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; +1.69 (drh 27-May-04): pMem++; +1.69 (drh 27-May-04): +1.69 (drh 27-May-04): pMem->flags = MEM_Int; +1.276 (drh 30-Mar-07): pMem->u.i = pOp->p2; /* P2 */ +1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; +1.69 (drh 27-May-04): pMem++; +1.69 (drh 27-May-04): +1.239 (drh 03-Mar-06): pMem->flags = MEM_Ephem|MEM_Str|MEM_Term; /* P3 */ +1.69 (drh 27-May-04): pMem->z = displayP3(pOp, pMem->zShort, sizeof(pMem->zShort)); +1.249 (drh 15-Jun-06): assert( pMem->z!=0 ); +1.239 (drh 03-Mar-06): pMem->n = strlen(pMem->z); +1.88 (drh 31-May-04): pMem->type = SQLITE_TEXT; +1.104 (danielk1 12-Jun-04): pMem->enc = SQLITE_UTF8; +1.69 (drh 27-May-04): +1.197 (drh 10-Sep-05): p->nResColumn = 5 - 2*(p->explain-1); +1.69 (drh 27-May-04): p->pTos = pMem; +1.14 (drh 14-Feb-04): p->rc = SQLITE_OK; +1.56 (danielk1 22-May-04): p->resOnStack = 1; +1.14 (drh 14-Feb-04): rc = SQLITE_ROW; +1.1 (drh 06-Sep-03): } +1.14 (drh 14-Feb-04): return rc; +1.1 (drh 06-Sep-03): } +1.151 (drh 31-Oct-04): #endif /* SQLITE_OMIT_EXPLAIN */ +1.1 (drh 06-Sep-03): +1.281 (drh 05-Apr-07): #ifdef SQLITE_DEBUG +1.1 (drh 06-Sep-03): /* +1.135 (drh 24-Jul-04): ** Print the SQL that was used to generate a VDBE program. +1.135 (drh 24-Jul-04): */ +1.135 (drh 24-Jul-04): void sqlite3VdbePrintSql(Vdbe *p){ +1.135 (drh 24-Jul-04): int nOp = p->nOp; +1.135 (drh 24-Jul-04): VdbeOp *pOp; +1.142 (drh 15-Sep-04): if( nOp<1 ) return; +1.142 (drh 15-Sep-04): pOp = &p->aOp[nOp-1]; +1.135 (drh 24-Jul-04): if( pOp->opcode==OP_Noop && pOp->p3!=0 ){ +1.135 (drh 24-Jul-04): const char *z = pOp->p3; +1.136 (drh 08-Aug-04): while( isspace(*(u8*)z) ) z++; +1.135 (drh 24-Jul-04): printf("SQL: [%s]\n", z); +1.135 (drh 24-Jul-04): } +1.281 (drh 05-Apr-07): } +1.135 (drh 24-Jul-04): #endif +1.135 (drh 24-Jul-04): +1.271 (drh 01-Mar-07): #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +1.271 (drh 01-Mar-07): /* +1.271 (drh 01-Mar-07): ** Print an IOTRACE message showing SQL content. +1.271 (drh 01-Mar-07): */ +1.271 (drh 01-Mar-07): void sqlite3VdbeIOTraceSql(Vdbe *p){ +1.271 (drh 01-Mar-07): int nOp = p->nOp; +1.271 (drh 01-Mar-07): VdbeOp *pOp; +1.271 (drh 01-Mar-07): if( sqlite3_io_trace==0 ) return; +1.271 (drh 01-Mar-07): if( nOp<1 ) return; +1.271 (drh 01-Mar-07): pOp = &p->aOp[nOp-1]; +1.271 (drh 01-Mar-07): if( pOp->opcode==OP_Noop && pOp->p3!=0 ){ +1.271 (drh 01-Mar-07): int i, j; +1.297 (drh 13-Aug-07): char z[1000]; +1.297 (drh 13-Aug-07): sqlite3_snprintf(sizeof(z), z, "%s", pOp->p3); +1.288 (danielk1 16-May-07): for(i=0; isspace((unsigned char)z[i]); i++){} +1.271 (drh 01-Mar-07): for(j=0; z[i]; i++){ +1.288 (danielk1 16-May-07): if( isspace((unsigned char)z[i]) ){ +1.271 (drh 01-Mar-07): if( z[i-1]!=' ' ){ +1.271 (drh 01-Mar-07): z[j++] = ' '; +1.271 (drh 01-Mar-07): } +1.271 (drh 01-Mar-07): }else{ +1.271 (drh 01-Mar-07): z[j++] = z[i]; +1.271 (drh 01-Mar-07): } +1.271 (drh 01-Mar-07): } +1.271 (drh 01-Mar-07): z[j] = 0; +1.271 (drh 01-Mar-07): sqlite3_io_trace("SQL %s\n", z); +1.271 (drh 01-Mar-07): } +1.271 (drh 01-Mar-07): } +1.271 (drh 01-Mar-07): #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ +1.271 (drh 01-Mar-07): +1.271 (drh 01-Mar-07): +1.135 (drh 24-Jul-04): /* +1.1 (drh 06-Sep-03): ** Prepare a virtual machine for execution. This involves things such +1.1 (drh 06-Sep-03): ** as allocating stack space and initializing the program counter. +1.1 (drh 06-Sep-03): ** After the VDBE has be prepped, it can be executed by one or more +1.19 (danielk1 08-May-04): ** calls to sqlite3VdbeExec(). +1.139 (drh 02-Sep-04): ** +1.139 (drh 02-Sep-04): ** This is the only way to move a VDBE from VDBE_MAGIC_INIT to +1.139 (drh 02-Sep-04): ** VDBE_MAGIC_RUN. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeMakeReady( +1.1 (drh 06-Sep-03): Vdbe *p, /* The VDBE */ +1.2 (drh 06-Sep-03): int nVar, /* Number of '?' see in the SQL statement */ +1.138 (drh 21-Aug-04): int nMem, /* Number of memory cells to allocate */ +1.138 (drh 21-Aug-04): int nCursor, /* Number of cursors to allocate */ +1.1 (drh 06-Sep-03): int isExplain /* True if the EXPLAIN keywords is present */ +1.1 (drh 06-Sep-03): ){ +1.1 (drh 06-Sep-03): int n; +1.300 (danielk1 16-Aug-07): sqlite3 *db = p->db; +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): assert( p!=0 ); +1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); +1.1 (drh 06-Sep-03): +1.142 (drh 15-Sep-04): /* There should be at least one opcode. +1.1 (drh 06-Sep-03): */ +1.142 (drh 15-Sep-04): assert( p->nOp>0 ); +1.1 (drh 06-Sep-03): +1.170 (danielk1 28-Mar-05): /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. This +1.170 (danielk1 28-Mar-05): * is because the call to resizeOpArray() below may shrink the +1.170 (danielk1 28-Mar-05): * p->aOp[] array to save memory if called when in VDBE_MAGIC_RUN +1.170 (danielk1 28-Mar-05): * state. +1.170 (danielk1 28-Mar-05): */ +1.170 (danielk1 28-Mar-05): p->magic = VDBE_MAGIC_RUN; +1.170 (danielk1 28-Mar-05): +1.1 (drh 06-Sep-03): /* No instruction ever pushes more than a single element onto the +1.1 (drh 06-Sep-03): ** stack. And the stack never grows on successive executions of the +1.1 (drh 06-Sep-03): ** same loop. So the total number of instructions is an upper bound +1.180 (drh 07-Jun-05): ** on the maximum stack depth required. (Added later:) The +1.180 (drh 07-Jun-05): ** resolveP2Values() call computes a tighter upper bound on the +1.180 (drh 07-Jun-05): ** stack size. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** Allocation all the stack space we will ever need. +1.1 (drh 06-Sep-03): */ +1.3 (drh 06-Sep-03): if( p->aStack==0 ){ +1.170 (danielk1 28-Mar-05): int nArg; /* Maximum number of args passed to a user function. */ +1.171 (danielk1 29-Mar-05): int nStack; /* Maximum number of stack entries required */ +1.171 (danielk1 29-Mar-05): resolveP2Values(p, &nArg, &nStack); +1.170 (danielk1 28-Mar-05): resizeOpArray(p, p->nOp); +1.3 (drh 06-Sep-03): assert( nVar>=0 ); +1.171 (danielk1 29-Mar-05): assert( nStacknOp ); +1.261 (drh 08-Aug-06): if( isExplain ){ +1.261 (drh 08-Aug-06): nStack = 10; +1.261 (drh 08-Aug-06): } +1.300 (danielk1 16-Aug-07): p->aStack = sqlite3DbMallocZero(db, +1.171 (danielk1 29-Mar-05): nStack*sizeof(p->aStack[0]) /* aStack */ +1.170 (danielk1 28-Mar-05): + nArg*sizeof(Mem*) /* apArg */ +1.149 (drh 05-Oct-04): + nVar*sizeof(Mem) /* aVar */ +1.149 (drh 05-Oct-04): + nVar*sizeof(char*) /* azVar */ +1.149 (drh 05-Oct-04): + nMem*sizeof(Mem) /* aMem */ +1.149 (drh 05-Oct-04): + nCursor*sizeof(Cursor*) /* apCsr */ +1.3 (drh 06-Sep-03): ); +1.299 (drh 16-Aug-07): if( !db->mallocFailed ){ +1.171 (danielk1 29-Mar-05): p->aMem = &p->aStack[nStack]; +1.149 (drh 05-Oct-04): p->nMem = nMem; +1.149 (drh 05-Oct-04): p->aVar = &p->aMem[nMem]; +1.149 (drh 05-Oct-04): p->nVar = nVar; +1.138 (drh 21-Aug-04): p->okVar = 0; +1.149 (drh 05-Oct-04): p->apArg = (Mem**)&p->aVar[nVar]; +1.170 (danielk1 28-Mar-05): p->azVar = (char**)&p->apArg[nArg]; +1.149 (drh 05-Oct-04): p->apCsr = (Cursor**)&p->azVar[nVar]; +1.138 (drh 21-Aug-04): p->nCursor = nCursor; +1.138 (drh 21-Aug-04): for(n=0; naVar[n].flags = MEM_Null; +1.307 (drh 21-Aug-07): p->aVar[n].db = db; +1.307 (drh 21-Aug-07): } +1.307 (drh 21-Aug-07): for(n=0; naStack[n].db = db; +1.138 (drh 21-Aug-04): } +1.42 (danielk1 19-May-04): } +1.3 (drh 06-Sep-03): } +1.166 (danielk1 29-Jan-05): for(n=0; nnMem; n++){ +1.166 (danielk1 29-Jan-05): p->aMem[n].flags = MEM_Null; +1.307 (drh 21-Aug-07): p->aMem[n].db = db; +1.166 (danielk1 29-Jan-05): } +1.1 (drh 06-Sep-03): +1.10 (drh 31-Jan-04): p->pTos = &p->aStack[-1]; +1.85 (danielk1 31-May-04): p->pc = -1; +1.1 (drh 06-Sep-03): p->rc = SQLITE_OK; +1.1 (drh 06-Sep-03): p->uniqueCnt = 0; +1.1 (drh 06-Sep-03): p->returnDepth = 0; +1.1 (drh 06-Sep-03): p->errorAction = OE_Abort; +1.1 (drh 06-Sep-03): p->popStack = 0; +1.1 (drh 06-Sep-03): p->explain |= isExplain; +1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_RUN; +1.121 (danielk1 21-Jun-04): p->nChange = 0; +1.219 (drh 07-Jan-06): p->cacheCtr = 1; +1.215 (drh 29-Dec-05): p->minWriteFileFormat = 255; +1.294 (danielk1 27-Jun-07): p->openedStatement = 0; +1.1 (drh 06-Sep-03): #ifdef VDBE_PROFILE +1.6 (drh 31-Dec-03): { +1.6 (drh 31-Dec-03): int i; +1.6 (drh 31-Dec-03): for(i=0; inOp; i++){ +1.6 (drh 31-Dec-03): p->aOp[i].cnt = 0; +1.6 (drh 31-Dec-03): p->aOp[i].cycles = 0; +1.6 (drh 31-Dec-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.316 (drh 29-Aug-07): ** Close a VDBE cursor and release all the resources that cursor happens +1.1 (drh 06-Sep-03): ** to hold. +1.1 (drh 06-Sep-03): */ +1.252 (danielk1 23-Jun-06): void sqlite3VdbeFreeCursor(Vdbe *p, Cursor *pCx){ +1.106 (drh 12-Jun-04): if( pCx==0 ){ +1.106 (drh 12-Jun-04): return; +1.106 (drh 12-Jun-04): } +1.1 (drh 06-Sep-03): if( pCx->pCursor ){ +1.19 (danielk1 08-May-04): sqlite3BtreeCloseCursor(pCx->pCursor); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): if( pCx->pBt ){ +1.19 (danielk1 08-May-04): sqlite3BtreeClose(pCx->pBt); +1.1 (drh 06-Sep-03): } +1.243 (drh 12-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE +1.243 (drh 12-Jun-06): if( pCx->pVtabCursor ){ +1.243 (drh 12-Jun-06): sqlite3_vtab_cursor *pVtabCursor = pCx->pVtabCursor; +1.252 (danielk1 23-Jun-06): const sqlite3_module *pModule = pCx->pModule; +1.252 (danielk1 23-Jun-06): p->inVtabMethod = 1; +1.258 (danielk1 25-Jul-06): sqlite3SafetyOff(p->db); +1.243 (drh 12-Jun-06): pModule->xClose(pVtabCursor); +1.258 (danielk1 25-Jul-06): sqlite3SafetyOn(p->db); +1.252 (danielk1 23-Jun-06): p->inVtabMethod = 0; +1.243 (drh 12-Jun-06): } +1.243 (drh 12-Jun-06): #endif +1.299 (drh 16-Aug-07): sqlite3_free(pCx->pData); +1.299 (drh 16-Aug-07): sqlite3_free(pCx->aType); +1.299 (drh 16-Aug-07): sqlite3_free(pCx); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.316 (drh 29-Aug-07): ** Close all cursors except for VTab cursors that are currently +1.316 (drh 29-Aug-07): ** in use. +1.1 (drh 06-Sep-03): */ +1.316 (drh 29-Aug-07): static void closeAllCursorsExceptActiveVtabs(Vdbe *p){ +1.1 (drh 06-Sep-03): int i; +1.138 (drh 21-Aug-04): if( p->apCsr==0 ) return; +1.1 (drh 06-Sep-03): for(i=0; inCursor; i++){ +1.316 (drh 29-Aug-07): Cursor *pC = p->apCsr[i]; +1.316 (drh 29-Aug-07): if( pC && (!p->inVtabMethod || !pC->pVtabCursor) ){ +1.316 (drh 29-Aug-07): sqlite3VdbeFreeCursor(p, pC); +1.253 (danielk1 23-Jun-06): p->apCsr[i] = 0; +1.252 (danielk1 23-Jun-06): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Clean up the VM after execution. +1.1 (drh 06-Sep-03): ** +1.1 (drh 06-Sep-03): ** This routine will automatically close any cursors, lists, and/or +1.1 (drh 06-Sep-03): ** sorters that were left open. It also deletes the values of +1.43 (drh 19-May-04): ** variables in the aVar[] array. +1.1 (drh 06-Sep-03): */ +1.1 (drh 06-Sep-03): static void Cleanup(Vdbe *p){ +1.1 (drh 06-Sep-03): int i; +1.10 (drh 31-Jan-04): if( p->aStack ){ +1.146 (drh 24-Sep-04): releaseMemArray(p->aStack, 1 + (p->pTos - p->aStack)); +1.146 (drh 24-Sep-04): p->pTos = &p->aStack[-1]; +1.10 (drh 31-Jan-04): } +1.316 (drh 29-Aug-07): closeAllCursorsExceptActiveVtabs(p); +1.146 (drh 24-Sep-04): releaseMemArray(p->aMem, p->nMem); +1.183 (drh 08-Jul-05): sqlite3VdbeFifoClear(&p->sFifo); +1.146 (drh 24-Sep-04): if( p->contextStack ){ +1.146 (drh 24-Sep-04): for(i=0; icontextStackTop; i++){ +1.183 (drh 08-Jul-05): sqlite3VdbeFifoClear(&p->contextStack[i].sFifo); +1.146 (drh 24-Sep-04): } +1.299 (drh 16-Aug-07): sqlite3_free(p->contextStack); +1.143 (drh 19-Sep-04): } +1.17 (drh 21-Feb-04): p->contextStack = 0; +1.143 (drh 19-Sep-04): p->contextStackDepth = 0; +1.143 (drh 19-Sep-04): p->contextStackTop = 0; +1.299 (drh 16-Aug-07): sqlite3_free(p->zErrMsg); +1.1 (drh 06-Sep-03): p->zErrMsg = 0; +1.293 (drh 20-Jun-07): p->resOnStack = 0; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.64 (danielk1 25-May-04): ** Set the number of result columns that will be returned by this SQL +1.64 (danielk1 25-May-04): ** statement. This is now set at compile time, rather than during +1.64 (danielk1 25-May-04): ** execution of the vdbe program so that sqlite3_column_count() can +1.64 (danielk1 25-May-04): ** be called on an SQL statement before sqlite3_step(). +1.64 (danielk1 25-May-04): */ +1.64 (danielk1 25-May-04): void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ +1.146 (drh 24-Sep-04): Mem *pColName; +1.146 (drh 24-Sep-04): int n; +1.308 (drh 23-Aug-07): +1.236 (danielk1 10-Feb-06): releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); +1.299 (drh 16-Aug-07): sqlite3_free(p->aColName); +1.236 (danielk1 10-Feb-06): n = nResColumn*COLNAME_N; +1.64 (danielk1 25-May-04): p->nResColumn = nResColumn; +1.300 (danielk1 16-Aug-07): p->aColName = pColName = (Mem*)sqlite3DbMallocZero(p->db, sizeof(Mem)*n ); +1.146 (drh 24-Sep-04): if( p->aColName==0 ) return; +1.146 (drh 24-Sep-04): while( n-- > 0 ){ +1.308 (drh 23-Aug-07): pColName->flags = MEM_Null; +1.309 (drh 24-Aug-07): pColName->db = p->db; +1.308 (drh 23-Aug-07): pColName++; +1.146 (drh 24-Sep-04): } +1.66 (danielk1 26-May-04): } +1.66 (danielk1 26-May-04): +1.66 (danielk1 26-May-04): /* +1.66 (danielk1 26-May-04): ** Set the name of the idx'th column to be returned by the SQL statement. +1.66 (danielk1 26-May-04): ** zName must be a pointer to a nul terminated string. +1.66 (danielk1 26-May-04): ** +1.66 (danielk1 26-May-04): ** This call must be made after a call to sqlite3VdbeSetNumCols(). +1.66 (danielk1 26-May-04): ** +1.105 (danielk1 12-Jun-04): ** If N==P3_STATIC it means that zName is a pointer to a constant static +1.105 (danielk1 12-Jun-04): ** string and we can just copy the pointer. If it is P3_DYNAMIC, then +1.299 (drh 16-Aug-07): ** the string is freed using sqlite3_free() when the vdbe is finished with +1.105 (danielk1 12-Jun-04): ** it. Otherwise, N bytes of zName are copied. +1.66 (danielk1 26-May-04): */ +1.236 (danielk1 10-Feb-06): int sqlite3VdbeSetColName(Vdbe *p, int idx, int var, const char *zName, int N){ +1.66 (danielk1 26-May-04): int rc; +1.66 (danielk1 26-May-04): Mem *pColName; +1.236 (danielk1 10-Feb-06): assert( idxnResColumn ); +1.236 (danielk1 10-Feb-06): assert( vardb->mallocFailed ) return SQLITE_NOMEM; +1.146 (drh 24-Sep-04): assert( p->aColName!=0 ); +1.236 (danielk1 10-Feb-06): pColName = &(p->aColName[idx+var*p->nResColumn]); +1.105 (danielk1 12-Jun-04): if( N==P3_DYNAMIC || N==P3_STATIC ){ +1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, SQLITE_STATIC); +1.66 (danielk1 26-May-04): }else{ +1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemSetStr(pColName, zName, N, SQLITE_UTF8,SQLITE_TRANSIENT); +1.66 (danielk1 26-May-04): } +1.66 (danielk1 26-May-04): if( rc==SQLITE_OK && N==P3_DYNAMIC ){ +1.66 (danielk1 26-May-04): pColName->flags = (pColName->flags&(~MEM_Static))|MEM_Dyn; +1.105 (danielk1 12-Jun-04): pColName->xDel = 0; +1.66 (danielk1 26-May-04): } +1.66 (danielk1 26-May-04): return rc; +1.64 (danielk1 25-May-04): } +1.64 (danielk1 25-May-04): +1.91 (danielk1 03-Jun-04): /* +1.91 (danielk1 03-Jun-04): ** A read or write transaction may or may not be active on database handle +1.91 (danielk1 03-Jun-04): ** db. If a transaction is active, commit it. If there is a +1.91 (danielk1 03-Jun-04): ** write-transaction spanning more than one database file, this routine +1.91 (danielk1 03-Jun-04): ** takes care of the master journal trickery. +1.91 (danielk1 03-Jun-04): */ +1.140 (drh 06-Sep-04): static int vdbeCommit(sqlite3 *db){ +1.91 (danielk1 03-Jun-04): int i; +1.91 (danielk1 03-Jun-04): int nTrans = 0; /* Number of databases with an active write-transaction */ +1.91 (danielk1 03-Jun-04): int rc = SQLITE_OK; +1.91 (danielk1 03-Jun-04): int needXcommit = 0; +1.91 (danielk1 03-Jun-04): +1.258 (danielk1 25-Jul-06): /* Before doing anything else, call the xSync() callback for any +1.258 (danielk1 25-Jul-06): ** virtual module tables written in this transaction. This has to +1.258 (danielk1 25-Jul-06): ** be done before determining whether a master journal file is +1.258 (danielk1 25-Jul-06): ** required, as an xSync() callback may add an attached database +1.258 (danielk1 25-Jul-06): ** to the transaction. +1.258 (danielk1 25-Jul-06): */ +1.258 (danielk1 25-Jul-06): rc = sqlite3VtabSync(db, rc); +1.258 (danielk1 25-Jul-06): if( rc!=SQLITE_OK ){ +1.258 (danielk1 25-Jul-06): return rc; +1.258 (danielk1 25-Jul-06): } +1.258 (danielk1 25-Jul-06): +1.258 (danielk1 25-Jul-06): /* This loop determines (a) if the commit hook should be invoked and +1.258 (danielk1 25-Jul-06): ** (b) how many database files have open write transactions, not +1.258 (danielk1 25-Jul-06): ** including the temp database. (b) is important because if more than +1.258 (danielk1 25-Jul-06): ** one database file has an open write transaction, a master journal +1.258 (danielk1 25-Jul-06): ** file is required for an atomic commit. +1.258 (danielk1 25-Jul-06): */ +1.91 (danielk1 03-Jun-04): for(i=0; inDb; i++){ +1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; +1.313 (drh 28-Aug-07): if( sqlite3BtreeIsInTrans(pBt) ){ +1.91 (danielk1 03-Jun-04): needXcommit = 1; +1.91 (danielk1 03-Jun-04): if( i!=1 ) nTrans++; +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* If there are any write-transactions at all, invoke the commit hook */ +1.91 (danielk1 03-Jun-04): if( needXcommit && db->xCommitCallback ){ +1.139 (drh 02-Sep-04): sqlite3SafetyOff(db); +1.139 (drh 02-Sep-04): rc = db->xCommitCallback(db->pCommitArg); +1.139 (drh 02-Sep-04): sqlite3SafetyOn(db); +1.139 (drh 02-Sep-04): if( rc ){ +1.91 (danielk1 03-Jun-04): return SQLITE_CONSTRAINT; +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.128 (danielk1 26-Jun-04): /* The simple case - no more than one database file (not counting the +1.128 (danielk1 26-Jun-04): ** TEMP database) has a transaction active. There is no need for the +1.94 (drh 07-Jun-04): ** master-journal. +1.99 (drh 09-Jun-04): ** +1.128 (danielk1 26-Jun-04): ** If the return value of sqlite3BtreeGetFilename() is a zero length +1.128 (danielk1 26-Jun-04): ** string, it means the main database is :memory:. In that case we do +1.128 (danielk1 26-Jun-04): ** not support atomic multi-file commits, so use the simple case then +1.99 (drh 09-Jun-04): ** too. +1.91 (danielk1 03-Jun-04): */ +1.128 (danielk1 26-Jun-04): if( 0==strlen(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans<=1 ){ +1.94 (drh 07-Jun-04): for(i=0; rc==SQLITE_OK && inDb; i++){ +1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; +1.91 (danielk1 03-Jun-04): if( pBt ){ +1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseOne(pBt, 0); +1.94 (drh 07-Jun-04): } +1.94 (drh 07-Jun-04): } +1.94 (drh 07-Jun-04): +1.277 (drh 30-Mar-07): /* Do the commit only if all databases successfully complete phase 1. +1.277 (drh 30-Mar-07): ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an +1.277 (drh 30-Mar-07): ** IO error while deleting or truncating a journal file. It is unlikely, +1.277 (drh 30-Mar-07): ** but could happen. In this case abandon processing and return the error. +1.274 (danielk1 27-Mar-07): */ +1.274 (danielk1 27-Mar-07): for(i=0; rc==SQLITE_OK && inDb; i++){ +1.274 (danielk1 27-Mar-07): Btree *pBt = db->aDb[i].pBt; +1.274 (danielk1 27-Mar-07): if( pBt ){ +1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseTwo(pBt); +1.274 (danielk1 27-Mar-07): } +1.274 (danielk1 27-Mar-07): } +1.94 (drh 07-Jun-04): if( rc==SQLITE_OK ){ +1.250 (danielk1 16-Jun-06): sqlite3VtabCommit(db); +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* The complex case - There is a multi-file write-transaction active. +1.91 (danielk1 03-Jun-04): ** This requires a master journal file to ensure the transaction is +1.91 (danielk1 03-Jun-04): ** committed atomicly. +1.91 (danielk1 03-Jun-04): */ +1.179 (danielk1 27-May-05): #ifndef SQLITE_OMIT_DISKIO +1.91 (danielk1 03-Jun-04): else{ +1.302 (danielk1 17-Aug-07): sqlite3_vfs *pVfs = db->pVfs; +1.188 (drh 27-Aug-05): int needSync = 0; +1.91 (danielk1 03-Jun-04): char *zMaster = 0; /* File-name for the master journal */ +1.91 (danielk1 03-Jun-04): char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); +1.302 (danielk1 17-Aug-07): sqlite3_file *pMaster = 0; +1.298 (danielk1 15-Aug-07): i64 offset = 0; +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* Select a master journal file name */ +1.91 (danielk1 03-Jun-04): do { +1.98 (drh 09-Jun-04): u32 random; +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.91 (danielk1 03-Jun-04): sqlite3Randomness(sizeof(random), &random); +1.300 (danielk1 16-Aug-07): zMaster = sqlite3MPrintf(db, "%s-mj%08X", zMainFile, random&0x7fffffff); +1.91 (danielk1 03-Jun-04): if( !zMaster ){ +1.91 (danielk1 03-Jun-04): return SQLITE_NOMEM; +1.91 (danielk1 03-Jun-04): } +1.302 (danielk1 17-Aug-07): }while( sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS) ); +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* Open the master journal. */ +1.303 (danielk1 18-Aug-07): rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, +1.303 (danielk1 18-Aug-07): SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| +1.305 (danielk1 20-Aug-07): SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 +1.303 (danielk1 18-Aug-07): ); +1.91 (danielk1 03-Jun-04): if( rc!=SQLITE_OK ){ +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.91 (danielk1 03-Jun-04): return rc; +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* Write the name of each database file in the transaction into the new +1.91 (danielk1 03-Jun-04): ** master journal file. If an error occurs at this point close +1.91 (danielk1 03-Jun-04): ** and delete the master journal file. All the individual journal files +1.91 (danielk1 03-Jun-04): ** still have 'null' as the master journal pointer, so they will roll +1.157 (danielk1 13-Jan-05): ** back independently if a failure occurs. +1.91 (danielk1 03-Jun-04): */ +1.300 (danielk1 16-Aug-07): for(i=0; inDb; i++){ +1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; +1.99 (drh 09-Jun-04): if( i==1 ) continue; /* Ignore the TEMP database */ +1.313 (drh 28-Aug-07): if( sqlite3BtreeIsInTrans(pBt) ){ +1.109 (danielk1 14-Jun-04): char const *zFile = sqlite3BtreeGetJournalname(pBt); +1.99 (drh 09-Jun-04): if( zFile[0]==0 ) continue; /* Ignore :memory: databases */ +1.188 (drh 27-Aug-05): if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){ +1.188 (drh 27-Aug-05): needSync = 1; +1.188 (drh 27-Aug-05): } +1.302 (danielk1 17-Aug-07): rc = sqlite3OsWrite(pMaster, zFile, strlen(zFile)+1, offset); +1.298 (danielk1 15-Aug-07): offset += strlen(zFile)+1; +1.91 (danielk1 03-Jun-04): if( rc!=SQLITE_OK ){ +1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); +1.303 (danielk1 18-Aug-07): sqlite3OsDelete(pVfs, zMaster, 0); +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.91 (danielk1 03-Jun-04): return rc; +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.310 (danielk1 24-Aug-07): /* Sync the master journal file. If the IOCAP_SEQUENTIAL device +1.310 (danielk1 24-Aug-07): ** flag is set this is not required. +1.310 (danielk1 24-Aug-07): */ +1.109 (danielk1 14-Jun-04): zMainFile = sqlite3BtreeGetDirname(db->aDb[0].pBt); +1.304 (danielk1 20-Aug-07): if( (needSync +1.310 (danielk1 24-Aug-07): && (0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL)) +1.304 (danielk1 20-Aug-07): && (rc=sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL))!=SQLITE_OK) ){ +1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); +1.303 (danielk1 18-Aug-07): sqlite3OsDelete(pVfs, zMaster, 0); +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.109 (danielk1 14-Jun-04): return rc; +1.109 (danielk1 14-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* Sync all the db files involved in the transaction. The same call +1.91 (danielk1 03-Jun-04): ** sets the master journal pointer in each individual journal. If +1.91 (danielk1 03-Jun-04): ** an error occurs here, do not delete the master journal file. +1.91 (danielk1 03-Jun-04): ** +1.277 (drh 30-Mar-07): ** If the error occurs during the first call to +1.277 (drh 30-Mar-07): ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the +1.277 (drh 30-Mar-07): ** master journal file will be orphaned. But we cannot delete it, +1.277 (drh 30-Mar-07): ** in case the master journal file name was written into the journal +1.277 (drh 30-Mar-07): ** file before the failure occured. +1.91 (danielk1 03-Jun-04): */ +1.258 (danielk1 25-Jul-06): for(i=0; rc==SQLITE_OK && inDb; i++){ +1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; +1.313 (drh 28-Aug-07): if( pBt ){ +1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); +1.258 (danielk1 25-Jul-06): if( rc!=SQLITE_OK ){ +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.258 (danielk1 25-Jul-06): return rc; +1.258 (danielk1 25-Jul-06): } +1.91 (danielk1 03-Jun-04): +1.110 (danielk1 14-Jun-04): /* Delete the master journal file. This commits the transaction. After +1.110 (danielk1 14-Jun-04): ** doing this the directory is synced again before any individual +1.110 (danielk1 14-Jun-04): ** transaction files are deleted. +1.110 (danielk1 14-Jun-04): */ +1.303 (danielk1 18-Aug-07): rc = sqlite3OsDelete(pVfs, zMaster, 1); +1.299 (drh 16-Aug-07): sqlite3_free(zMaster); +1.278 (drh 30-Mar-07): zMaster = 0; +1.263 (drh 13-Aug-06): if( rc ){ +1.263 (drh 13-Aug-06): return rc; +1.263 (drh 13-Aug-06): } +1.91 (danielk1 03-Jun-04): +1.91 (danielk1 03-Jun-04): /* All files and directories have already been synced, so the following +1.277 (drh 30-Mar-07): ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and +1.277 (drh 30-Mar-07): ** deleting or truncating journals. If something goes wrong while +1.277 (drh 30-Mar-07): ** this is happening we don't really care. The integrity of the +1.277 (drh 30-Mar-07): ** transaction is already guaranteed, but some stray 'cold' journals +1.277 (drh 30-Mar-07): ** may be lying around. Returning an error code won't help matters. +1.91 (danielk1 03-Jun-04): */ +1.274 (danielk1 27-Mar-07): disable_simulated_io_errors(); +1.91 (danielk1 03-Jun-04): for(i=0; inDb; i++){ +1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; +1.91 (danielk1 03-Jun-04): if( pBt ){ +1.277 (drh 30-Mar-07): sqlite3BtreeCommitPhaseTwo(pBt); +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): } +1.274 (danielk1 27-Mar-07): enable_simulated_io_errors(); +1.274 (danielk1 27-Mar-07): +1.250 (danielk1 16-Jun-06): sqlite3VtabCommit(db); +1.91 (danielk1 03-Jun-04): } +1.179 (danielk1 27-May-05): #endif +1.112 (danielk1 14-Jun-04): +1.94 (drh 07-Jun-04): return rc; +1.91 (danielk1 03-Jun-04): } +1.91 (danielk1 03-Jun-04): +1.85 (danielk1 31-May-04): /* +1.85 (danielk1 31-May-04): ** This routine checks that the sqlite3.activeVdbeCnt count variable +1.85 (danielk1 31-May-04): ** matches the number of vdbe's in the list sqlite3.pVdbe that are +1.85 (danielk1 31-May-04): ** currently active. An assertion fails if the two counts do not match. +1.139 (drh 02-Sep-04): ** This is an internal self-check only - it is not an essential processing +1.139 (drh 02-Sep-04): ** step. +1.85 (danielk1 31-May-04): ** +1.85 (danielk1 31-May-04): ** This is a no-op if NDEBUG is defined. +1.85 (danielk1 31-May-04): */ +1.85 (danielk1 31-May-04): #ifndef NDEBUG +1.140 (drh 06-Sep-04): static void checkActiveVdbeCnt(sqlite3 *db){ +1.85 (danielk1 31-May-04): Vdbe *p; +1.85 (danielk1 31-May-04): int cnt = 0; +1.85 (danielk1 31-May-04): p = db->pVdbe; +1.85 (danielk1 31-May-04): while( p ){ +1.139 (drh 02-Sep-04): if( p->magic==VDBE_MAGIC_RUN && p->pc>=0 ){ +1.85 (danielk1 31-May-04): cnt++; +1.85 (danielk1 31-May-04): } +1.85 (danielk1 31-May-04): p = p->pNext; +1.85 (danielk1 31-May-04): } +1.85 (danielk1 31-May-04): assert( cnt==db->activeVdbeCnt ); +1.85 (danielk1 31-May-04): } +1.85 (danielk1 31-May-04): #else +1.85 (danielk1 31-May-04): #define checkActiveVdbeCnt(x) +1.85 (danielk1 31-May-04): #endif +1.85 (danielk1 31-May-04): +1.64 (danielk1 25-May-04): /* +1.317 (drh 30-Aug-07): ** For every Btree that in database connection db which +1.317 (drh 30-Aug-07): ** has been modified, "trip" or invalidate each cursor in +1.317 (drh 30-Aug-07): ** that Btree might have been modified so that the cursor +1.317 (drh 30-Aug-07): ** can never be used again. This happens when a rollback +1.317 (drh 30-Aug-07): *** occurs. We have to trip all the other cursors, even +1.317 (drh 30-Aug-07): ** cursor from other VMs in different database connections, +1.317 (drh 30-Aug-07): ** so that none of them try to use the data at which they +1.317 (drh 30-Aug-07): ** were pointing and which now may have been changed due +1.317 (drh 30-Aug-07): ** to the rollback. +1.317 (drh 30-Aug-07): ** +1.317 (drh 30-Aug-07): ** Remember that a rollback can delete tables complete and +1.317 (drh 30-Aug-07): ** reorder rootpages. So it is not sufficient just to save +1.317 (drh 30-Aug-07): ** the state of the cursor. We have to invalidate the cursor +1.317 (drh 30-Aug-07): ** so that it is never used again. +1.317 (drh 30-Aug-07): */ +1.317 (drh 30-Aug-07): void invalidateCursorsOnModifiedBtrees(sqlite3 *db){ +1.317 (drh 30-Aug-07): int i; +1.317 (drh 30-Aug-07): for(i=0; inDb; i++){ +1.317 (drh 30-Aug-07): Btree *p = db->aDb[i].pBt; +1.317 (drh 30-Aug-07): if( p && sqlite3BtreeIsInTrans(p) ){ +1.317 (drh 30-Aug-07): sqlite3BtreeTripAllCursors(p, SQLITE_ABORT); +1.317 (drh 30-Aug-07): } +1.252 (danielk1 23-Jun-06): } +1.252 (danielk1 23-Jun-06): } +1.252 (danielk1 23-Jun-06): +1.252 (danielk1 23-Jun-06): /* +1.139 (drh 02-Sep-04): ** This routine is called the when a VDBE tries to halt. If the VDBE +1.139 (drh 02-Sep-04): ** has made changes and is in autocommit mode, then commit those +1.139 (drh 02-Sep-04): ** changes. If a rollback is needed, then do the rollback. +1.139 (drh 02-Sep-04): ** +1.139 (drh 02-Sep-04): ** This routine is the only way to move the state of a VM from +1.316 (drh 29-Aug-07): ** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to +1.316 (drh 29-Aug-07): ** call this on a VM that is in the SQLITE_MAGIC_HALT state. +1.1 (drh 06-Sep-03): ** +1.139 (drh 02-Sep-04): ** Return an error code. If the commit could not complete because of +1.139 (drh 02-Sep-04): ** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it +1.139 (drh 02-Sep-04): ** means the close did not happen and needs to be repeated. +1.1 (drh 06-Sep-03): */ +1.316 (drh 29-Aug-07): int sqlite3VdbeHalt(Vdbe *p){ +1.140 (drh 06-Sep-04): sqlite3 *db = p->db; +1.1 (drh 06-Sep-03): int i; +1.85 (danielk1 31-May-04): int (*xFunc)(Btree *pBt) = 0; /* Function to call on each btree backend */ +1.228 (danielk1 20-Jan-06): int isSpecialError; /* Set to true if SQLITE_NOMEM or IOERR */ +1.228 (danielk1 20-Jan-06): +1.228 (danielk1 20-Jan-06): /* This function contains the logic that determines if a statement or +1.228 (danielk1 20-Jan-06): ** transaction will be committed or rolled back as a result of the +1.228 (danielk1 20-Jan-06): ** execution of this virtual machine. +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** Special errors: +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** If an SQLITE_NOMEM error has occured in a statement that writes to +1.228 (danielk1 20-Jan-06): ** the database, then either a statement or transaction must be rolled +1.228 (danielk1 20-Jan-06): ** back to ensure the tree-structures are in a consistent state. A +1.228 (danielk1 20-Jan-06): ** statement transaction is rolled back if one is open, otherwise the +1.228 (danielk1 20-Jan-06): ** entire transaction must be rolled back. +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** If an SQLITE_IOERR error has occured in a statement that writes to +1.228 (danielk1 20-Jan-06): ** the database, then the entire transaction must be rolled back. The +1.228 (danielk1 20-Jan-06): ** I/O error may have caused garbage to be written to the journal +1.228 (danielk1 20-Jan-06): ** file. Were the transaction to continue and eventually be rolled +1.228 (danielk1 20-Jan-06): ** back that garbage might end up in the database file. +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** In both of the above cases, the Vdbe.errorAction variable is +1.228 (danielk1 20-Jan-06): ** ignored. If the sqlite3.autoCommit flag is false and a transaction +1.228 (danielk1 20-Jan-06): ** is rolled back, it will be set to true. +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** Other errors: +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** No error: +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): */ +1.1 (drh 06-Sep-03): +1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ +1.208 (danielk1 06-Dec-05): p->rc = SQLITE_NOMEM; +1.208 (danielk1 06-Dec-05): } +1.316 (drh 29-Aug-07): closeAllCursorsExceptActiveVtabs(p); +1.139 (drh 02-Sep-04): if( p->magic!=VDBE_MAGIC_RUN ){ +1.139 (drh 02-Sep-04): return SQLITE_OK; +1.1 (drh 06-Sep-03): } +1.85 (danielk1 31-May-04): checkActiveVdbeCnt(db); +1.208 (danielk1 06-Dec-05): +1.228 (danielk1 20-Jan-06): /* No commit or rollback needed if the program never started */ +1.228 (danielk1 20-Jan-06): if( p->pc>=0 ){ +1.266 (drh 23-Sep-06): int mrc; /* Primary error code from p->rc */ +1.316 (drh 29-Aug-07): +1.316 (drh 29-Aug-07): /* Lock all btrees used by the statement */ +1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayEnter(&p->aMutex); +1.316 (drh 29-Aug-07): +1.228 (danielk1 20-Jan-06): /* Check for one of the special errors - SQLITE_NOMEM or SQLITE_IOERR */ +1.266 (drh 23-Sep-06): mrc = p->rc & 0xff; +1.291 (danielk1 13-Jun-07): isSpecialError = ( +1.291 (danielk1 13-Jun-07): (mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR || mrc==SQLITE_INTERRUPT)?1:0); +1.228 (danielk1 20-Jan-06): if( isSpecialError ){ +1.208 (danielk1 06-Dec-05): /* This loop does static analysis of the query to see which of the +1.208 (danielk1 06-Dec-05): ** following three categories it falls into: +1.208 (danielk1 06-Dec-05): ** +1.208 (danielk1 06-Dec-05): ** Read-only +1.228 (danielk1 20-Jan-06): ** Query with statement journal +1.228 (danielk1 20-Jan-06): ** Query without statement journal +1.208 (danielk1 06-Dec-05): ** +1.208 (danielk1 06-Dec-05): ** We could do something more elegant than this static analysis (i.e. +1.208 (danielk1 06-Dec-05): ** store the type of query as part of the compliation phase), but +1.228 (danielk1 20-Jan-06): ** handling malloc() or IO failure is a fairly obscure edge case so +1.228 (danielk1 20-Jan-06): ** this is probably easier. Todo: Might be an opportunity to reduce +1.228 (danielk1 20-Jan-06): ** code size a very small amount though... +1.208 (danielk1 06-Dec-05): */ +1.208 (danielk1 06-Dec-05): int isReadOnly = 1; +1.208 (danielk1 06-Dec-05): int isStatement = 0; +1.208 (danielk1 06-Dec-05): assert(p->aOp || p->nOp==0); +1.208 (danielk1 06-Dec-05): for(i=0; inOp; i++){ +1.208 (danielk1 06-Dec-05): switch( p->aOp[i].opcode ){ +1.208 (danielk1 06-Dec-05): case OP_Transaction: +1.292 (danielk1 15-Jun-07): /* This is a bit strange. If we hit a malloc() or IO error and +1.292 (danielk1 15-Jun-07): ** the statement did not open a statement transaction, we will +1.292 (danielk1 15-Jun-07): ** rollback any active transaction and abort all other active +1.292 (danielk1 15-Jun-07): ** statements. Or, if this is an SQLITE_INTERRUPT error, we +1.292 (danielk1 15-Jun-07): ** will only rollback if the interrupted statement was a write. +1.292 (danielk1 15-Jun-07): ** +1.292 (danielk1 15-Jun-07): ** It could be argued that read-only statements should never +1.292 (danielk1 15-Jun-07): ** rollback anything. But careful analysis is required before +1.292 (danielk1 15-Jun-07): ** making this change +1.292 (danielk1 15-Jun-07): */ +1.292 (danielk1 15-Jun-07): if( p->aOp[i].p2 || mrc!=SQLITE_INTERRUPT ){ +1.292 (danielk1 15-Jun-07): isReadOnly = 0; +1.292 (danielk1 15-Jun-07): } +1.208 (danielk1 06-Dec-05): break; +1.208 (danielk1 06-Dec-05): case OP_Statement: +1.208 (danielk1 06-Dec-05): isStatement = 1; +1.208 (danielk1 06-Dec-05): break; +1.208 (danielk1 06-Dec-05): } +1.208 (danielk1 06-Dec-05): } +1.316 (drh 29-Aug-07): +1.316 (drh 29-Aug-07): +1.228 (danielk1 20-Jan-06): /* If the query was read-only, we need do no rollback at all. Otherwise, +1.228 (danielk1 20-Jan-06): ** proceed with the special handling. +1.228 (danielk1 20-Jan-06): */ +1.228 (danielk1 20-Jan-06): if( !isReadOnly ){ +1.290 (danielk1 13-Jun-07): if( p->rc==SQLITE_IOERR_BLOCKED && isStatement ){ +1.290 (danielk1 13-Jun-07): xFunc = sqlite3BtreeRollbackStmt; +1.290 (danielk1 13-Jun-07): p->rc = SQLITE_BUSY; +1.290 (danielk1 13-Jun-07): } else if( p->rc==SQLITE_NOMEM && isStatement ){ +1.228 (danielk1 20-Jan-06): xFunc = sqlite3BtreeRollbackStmt; +1.228 (danielk1 20-Jan-06): }else{ +1.228 (danielk1 20-Jan-06): /* We are forced to roll back the active transaction. Before doing +1.228 (danielk1 20-Jan-06): ** so, abort any other statements this handle currently has active. +1.228 (danielk1 20-Jan-06): */ +1.317 (drh 30-Aug-07): invalidateCursorsOnModifiedBtrees(db); +1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); +1.228 (danielk1 20-Jan-06): db->autoCommit = 1; +1.228 (danielk1 20-Jan-06): } +1.208 (danielk1 06-Dec-05): } +1.208 (danielk1 06-Dec-05): } +1.228 (danielk1 20-Jan-06): +1.228 (danielk1 20-Jan-06): /* If the auto-commit flag is set and this is the only active vdbe, then +1.228 (danielk1 20-Jan-06): ** we do either a commit or rollback of the current transaction. +1.228 (danielk1 20-Jan-06): ** +1.228 (danielk1 20-Jan-06): ** Note: This block also runs if one of the special errors handled +1.228 (danielk1 20-Jan-06): ** above has occured. +1.228 (danielk1 20-Jan-06): */ +1.228 (danielk1 20-Jan-06): if( db->autoCommit && db->activeVdbeCnt==1 ){ +1.228 (danielk1 20-Jan-06): if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ +1.296 (drh 07-Aug-07): /* The auto-commit flag is true, and the vdbe program was +1.228 (danielk1 20-Jan-06): ** successful or hit an 'OR FAIL' constraint. This means a commit +1.228 (danielk1 20-Jan-06): ** is required. +1.228 (danielk1 20-Jan-06): */ +1.228 (danielk1 20-Jan-06): int rc = vdbeCommit(db); +1.228 (danielk1 20-Jan-06): if( rc==SQLITE_BUSY ){ +1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayLeave(&p->aMutex); +1.228 (danielk1 20-Jan-06): return SQLITE_BUSY; +1.228 (danielk1 20-Jan-06): }else if( rc!=SQLITE_OK ){ +1.228 (danielk1 20-Jan-06): p->rc = rc; +1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); +1.228 (danielk1 20-Jan-06): }else{ +1.228 (danielk1 20-Jan-06): sqlite3CommitInternalChanges(db); +1.228 (danielk1 20-Jan-06): } +1.228 (danielk1 20-Jan-06): }else{ +1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); +1.228 (danielk1 20-Jan-06): } +1.228 (danielk1 20-Jan-06): }else if( !xFunc ){ +1.228 (danielk1 20-Jan-06): if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ +1.294 (danielk1 27-Jun-07): if( p->openedStatement ){ +1.294 (danielk1 27-Jun-07): xFunc = sqlite3BtreeCommitStmt; +1.294 (danielk1 27-Jun-07): } +1.228 (danielk1 20-Jan-06): }else if( p->errorAction==OE_Abort ){ +1.228 (danielk1 20-Jan-06): xFunc = sqlite3BtreeRollbackStmt; +1.228 (danielk1 20-Jan-06): }else{ +1.317 (drh 30-Aug-07): invalidateCursorsOnModifiedBtrees(db); +1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); +1.228 (danielk1 20-Jan-06): db->autoCommit = 1; +1.228 (danielk1 20-Jan-06): } +1.228 (danielk1 20-Jan-06): } +1.228 (danielk1 20-Jan-06): +1.228 (danielk1 20-Jan-06): /* If xFunc is not NULL, then it is one of sqlite3BtreeRollbackStmt or +1.228 (danielk1 20-Jan-06): ** sqlite3BtreeCommitStmt. Call it once on each backend. If an error occurs +1.228 (danielk1 20-Jan-06): ** and the return code is still SQLITE_OK, set the return code to the new +1.228 (danielk1 20-Jan-06): ** error value. +1.228 (danielk1 20-Jan-06): */ +1.228 (danielk1 20-Jan-06): assert(!xFunc || +1.228 (danielk1 20-Jan-06): xFunc==sqlite3BtreeCommitStmt || +1.228 (danielk1 20-Jan-06): xFunc==sqlite3BtreeRollbackStmt +1.228 (danielk1 20-Jan-06): ); +1.228 (danielk1 20-Jan-06): for(i=0; xFunc && inDb; i++){ +1.228 (danielk1 20-Jan-06): int rc; +1.228 (danielk1 20-Jan-06): Btree *pBt = db->aDb[i].pBt; +1.228 (danielk1 20-Jan-06): if( pBt ){ +1.228 (danielk1 20-Jan-06): rc = xFunc(pBt); +1.231 (danielk1 23-Jan-06): if( rc && (p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT) ){ +1.231 (danielk1 23-Jan-06): p->rc = rc; +1.231 (danielk1 23-Jan-06): sqlite3SetString(&p->zErrMsg, 0); +1.231 (danielk1 23-Jan-06): } +1.228 (danielk1 20-Jan-06): } +1.85 (danielk1 31-May-04): } +1.228 (danielk1 20-Jan-06): +1.228 (danielk1 20-Jan-06): /* If this was an INSERT, UPDATE or DELETE and the statement was committed, +1.228 (danielk1 20-Jan-06): ** set the change counter. +1.228 (danielk1 20-Jan-06): */ +1.228 (danielk1 20-Jan-06): if( p->changeCntOn && p->pc>=0 ){ +1.228 (danielk1 20-Jan-06): if( !xFunc || xFunc==sqlite3BtreeCommitStmt ){ +1.228 (danielk1 20-Jan-06): sqlite3VdbeSetChanges(db, p->nChange); +1.228 (danielk1 20-Jan-06): }else{ +1.228 (danielk1 20-Jan-06): sqlite3VdbeSetChanges(db, 0); +1.228 (danielk1 20-Jan-06): } +1.228 (danielk1 20-Jan-06): p->nChange = 0; +1.87 (danielk1 31-May-04): } +1.228 (danielk1 20-Jan-06): +1.228 (danielk1 20-Jan-06): /* Rollback or commit any schema changes that occurred. */ +1.228 (danielk1 20-Jan-06): if( p->rc!=SQLITE_OK && db->flags&SQLITE_InternChanges ){ +1.228 (danielk1 20-Jan-06): sqlite3ResetInternalSchema(db, 0); +1.228 (danielk1 20-Jan-06): db->flags = (db->flags | SQLITE_InternChanges); +1.121 (danielk1 21-Jun-04): } +1.316 (drh 29-Aug-07): +1.316 (drh 29-Aug-07): /* Release the locks */ +1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayLeave(&p->aMutex); +1.1 (drh 06-Sep-03): } +1.85 (danielk1 31-May-04): +1.254 (danielk1 24-Jun-06): /* We have successfully halted and closed the VM. Record this fact. */ +1.254 (danielk1 24-Jun-06): if( p->pc>=0 ){ +1.85 (danielk1 31-May-04): db->activeVdbeCnt--; +1.1 (drh 06-Sep-03): } +1.139 (drh 02-Sep-04): p->magic = VDBE_MAGIC_HALT; +1.139 (drh 02-Sep-04): checkActiveVdbeCnt(db); +1.316 (drh 29-Aug-07): if( p->db->mallocFailed ){ +1.316 (drh 29-Aug-07): p->rc = SQLITE_NOMEM; +1.316 (drh 29-Aug-07): } +1.316 (drh 29-Aug-07): checkActiveVdbeCnt(db); +1.139 (drh 02-Sep-04): +1.139 (drh 02-Sep-04): return SQLITE_OK; +1.139 (drh 02-Sep-04): } +1.314 (drh 28-Aug-07): +1.139 (drh 02-Sep-04): +1.139 (drh 02-Sep-04): /* +1.270 (drh 09-Jan-07): ** Each VDBE holds the result of the most recent sqlite3_step() call +1.270 (drh 09-Jan-07): ** in p->rc. This routine sets that result back to SQLITE_OK. +1.270 (drh 09-Jan-07): */ +1.270 (drh 09-Jan-07): void sqlite3VdbeResetStepResult(Vdbe *p){ +1.270 (drh 09-Jan-07): p->rc = SQLITE_OK; +1.270 (drh 09-Jan-07): } +1.270 (drh 09-Jan-07): +1.270 (drh 09-Jan-07): /* +1.139 (drh 02-Sep-04): ** Clean up a VDBE after execution but do not delete the VDBE just yet. +1.139 (drh 02-Sep-04): ** Write any error messages into *pzErrMsg. Return the result code. +1.139 (drh 02-Sep-04): ** +1.139 (drh 02-Sep-04): ** After this routine is run, the VDBE should be ready to be executed +1.139 (drh 02-Sep-04): ** again. +1.139 (drh 02-Sep-04): ** +1.139 (drh 02-Sep-04): ** To look at it another way, this routine resets the state of the +1.139 (drh 02-Sep-04): ** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to +1.139 (drh 02-Sep-04): ** VDBE_MAGIC_INIT. +1.139 (drh 02-Sep-04): */ +1.139 (drh 02-Sep-04): int sqlite3VdbeReset(Vdbe *p){ +1.265 (drh 15-Sep-06): sqlite3 *db; +1.265 (drh 15-Sep-06): db = p->db; +1.85 (danielk1 31-May-04): +1.139 (drh 02-Sep-04): /* If the VM did not run to completion or if it encountered an +1.139 (drh 02-Sep-04): ** error, then it might not have been halted properly. So halt +1.139 (drh 02-Sep-04): ** it now. +1.139 (drh 02-Sep-04): */ +1.265 (drh 15-Sep-06): sqlite3SafetyOn(db); +1.139 (drh 02-Sep-04): sqlite3VdbeHalt(p); +1.265 (drh 15-Sep-06): sqlite3SafetyOff(db); +1.139 (drh 02-Sep-04): +1.162 (drh 24-Jan-05): /* If the VDBE has be run even partially, then transfer the error code +1.162 (drh 24-Jan-05): ** and error message from the VDBE into the main database structure. But +1.162 (drh 24-Jan-05): ** if the VDBE has just been set to run but has not actually executed any +1.162 (drh 24-Jan-05): ** instructions yet, leave the main database error information unchanged. +1.139 (drh 02-Sep-04): */ +1.162 (drh 24-Jan-05): if( p->pc>=0 ){ +1.162 (drh 24-Jan-05): if( p->zErrMsg ){ +1.307 (drh 21-Aug-07): sqlite3ValueSetStr(db->pErr,-1,p->zErrMsg,SQLITE_UTF8,sqlite3_free); +1.229 (danielk1 20-Jan-06): db->errCode = p->rc; +1.162 (drh 24-Jan-05): p->zErrMsg = 0; +1.162 (drh 24-Jan-05): }else if( p->rc ){ +1.265 (drh 15-Sep-06): sqlite3Error(db, p->rc, 0); +1.162 (drh 24-Jan-05): }else{ +1.265 (drh 15-Sep-06): sqlite3Error(db, SQLITE_OK, 0); +1.162 (drh 24-Jan-05): } +1.163 (danielk1 24-Jan-05): }else if( p->rc && p->expired ){ +1.163 (danielk1 24-Jan-05): /* The expired flag was set on the VDBE before the first call +1.163 (danielk1 24-Jan-05): ** to sqlite3_step(). For consistency (since sqlite3_step() was +1.163 (danielk1 24-Jan-05): ** called), set the database error in this case as well. +1.163 (danielk1 24-Jan-05): */ +1.265 (drh 15-Sep-06): sqlite3Error(db, p->rc, 0); +1.139 (drh 02-Sep-04): } +1.139 (drh 02-Sep-04): +1.139 (drh 02-Sep-04): /* Reclaim all memory used by the VDBE +1.139 (drh 02-Sep-04): */ +1.139 (drh 02-Sep-04): Cleanup(p); +1.139 (drh 02-Sep-04): +1.139 (drh 02-Sep-04): /* Save profiling information from this VDBE run. +1.139 (drh 02-Sep-04): */ +1.208 (danielk1 06-Dec-05): assert( p->pTos<&p->aStack[p->pc<0?0:p->pc] || !p->aStack ); +1.1 (drh 06-Sep-03): #ifdef VDBE_PROFILE +1.1 (drh 06-Sep-03): { +1.1 (drh 06-Sep-03): FILE *out = fopen("vdbe_profile.out", "a"); +1.1 (drh 06-Sep-03): if( out ){ +1.1 (drh 06-Sep-03): int i; +1.1 (drh 06-Sep-03): fprintf(out, "---- "); +1.1 (drh 06-Sep-03): for(i=0; inOp; i++){ +1.1 (drh 06-Sep-03): fprintf(out, "%02x", p->aOp[i].opcode); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): fprintf(out, "\n"); +1.1 (drh 06-Sep-03): for(i=0; inOp; i++){ +1.1 (drh 06-Sep-03): fprintf(out, "%6d %10lld %8lld ", +1.1 (drh 06-Sep-03): p->aOp[i].cnt, +1.1 (drh 06-Sep-03): p->aOp[i].cycles, +1.1 (drh 06-Sep-03): p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 +1.1 (drh 06-Sep-03): ); +1.19 (danielk1 08-May-04): sqlite3VdbePrintOp(out, i, &p->aOp[i]); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): fclose(out); +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): #endif +1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_INIT; +1.133 (drh 30-Jun-04): p->aborted = 0; +1.265 (drh 15-Sep-06): return p->rc & db->errMask; +1.1 (drh 06-Sep-03): } +1.139 (drh 02-Sep-04): +1.1 (drh 06-Sep-03): /* +1.1 (drh 06-Sep-03): ** Clean up and delete a VDBE after execution. Return an integer which is +1.1 (drh 06-Sep-03): ** the result code. Write any error message text into *pzErrMsg. +1.1 (drh 06-Sep-03): */ +1.122 (danielk1 21-Jun-04): int sqlite3VdbeFinalize(Vdbe *p){ +1.129 (danielk1 26-Jun-04): int rc = SQLITE_OK; +1.129 (danielk1 26-Jun-04): if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){ +1.129 (danielk1 26-Jun-04): rc = sqlite3VdbeReset(p); +1.265 (drh 15-Sep-06): assert( (rc & p->db->errMask)==rc ); +1.129 (danielk1 26-Jun-04): }else if( p->magic!=VDBE_MAGIC_INIT ){ +1.1 (drh 06-Sep-03): return SQLITE_MISUSE; +1.1 (drh 06-Sep-03): } +1.19 (danielk1 08-May-04): sqlite3VdbeDelete(p); +1.1 (drh 06-Sep-03): return rc; +1.42 (danielk1 19-May-04): } +1.1 (drh 06-Sep-03): +1.1 (drh 06-Sep-03): /* +1.120 (drh 19-Jun-04): ** Call the destructor for each auxdata entry in pVdbeFunc for which +1.123 (danielk1 21-Jun-04): ** the corresponding bit in mask is clear. Auxdata entries beyond 31 +1.120 (drh 19-Jun-04): ** are always destroyed. To destroy all auxdata entries, call this +1.123 (danielk1 21-Jun-04): ** routine with mask==0. +1.120 (drh 19-Jun-04): */ +1.120 (drh 19-Jun-04): void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){ +1.120 (drh 19-Jun-04): int i; +1.120 (drh 19-Jun-04): for(i=0; inAux; i++){ +1.120 (drh 19-Jun-04): struct AuxData *pAux = &pVdbeFunc->apAux[i]; +1.120 (drh 19-Jun-04): if( (i>31 || !(mask&(1<pAux ){ +1.120 (drh 19-Jun-04): if( pAux->xDelete ){ +1.120 (drh 19-Jun-04): pAux->xDelete(pAux->pAux); +1.120 (drh 19-Jun-04): } +1.120 (drh 19-Jun-04): pAux->pAux = 0; +1.120 (drh 19-Jun-04): } +1.120 (drh 19-Jun-04): } +1.120 (drh 19-Jun-04): } +1.120 (drh 19-Jun-04): +1.120 (drh 19-Jun-04): /* +1.1 (drh 06-Sep-03): ** Delete an entire VDBE. +1.1 (drh 06-Sep-03): */ +1.19 (danielk1 08-May-04): void sqlite3VdbeDelete(Vdbe *p){ +1.1 (drh 06-Sep-03): int i; +1.1 (drh 06-Sep-03): if( p==0 ) return; +1.1 (drh 06-Sep-03): Cleanup(p); +1.1 (drh 06-Sep-03): if( p->pPrev ){ +1.1 (drh 06-Sep-03): p->pPrev->pNext = p->pNext; +1.1 (drh 06-Sep-03): }else{ +1.1 (drh 06-Sep-03): assert( p->db->pVdbe==p ); +1.1 (drh 06-Sep-03): p->db->pVdbe = p->pNext; +1.1 (drh 06-Sep-03): } +1.1 (drh 06-Sep-03): if( p->pNext ){ +1.1 (drh 06-Sep-03): p->pNext->pPrev = p->pPrev; +1.1 (drh 06-Sep-03): } +1.146 (drh 24-Sep-04): if( p->aOp ){ +1.146 (drh 24-Sep-04): for(i=0; inOp; i++){ +1.146 (drh 24-Sep-04): Op *pOp = &p->aOp[i]; +1.198 (drh 16-Sep-05): freeP3(pOp->p3type, pOp->p3); +1.92 (danielk1 05-Jun-04): } +1.299 (drh 16-Aug-07): sqlite3_free(p->aOp); +1.2 (drh 06-Sep-03): } +1.146 (drh 24-Sep-04): releaseMemArray(p->aVar, p->nVar); +1.299 (drh 16-Aug-07): sqlite3_free(p->aLabel); +1.299 (drh 16-Aug-07): sqlite3_free(p->aStack); +1.236 (danielk1 10-Feb-06): releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); +1.299 (drh 16-Aug-07): sqlite3_free(p->aColName); +1.299 (drh 16-Aug-07): sqlite3_free(p->zSql); +1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_DEAD; +1.299 (drh 16-Aug-07): sqlite3_free(p); +1.1 (drh 06-Sep-03): } +1.7 (drh 07-Jan-04): +1.7 (drh 07-Jan-04): /* +1.7 (drh 07-Jan-04): ** If a MoveTo operation is pending on the given cursor, then do that +1.7 (drh 07-Jan-04): ** MoveTo now. Return an error code. If no MoveTo is pending, this +1.7 (drh 07-Jan-04): ** routine does nothing and returns SQLITE_OK. +1.7 (drh 07-Jan-04): */ +1.19 (danielk1 08-May-04): int sqlite3VdbeCursorMoveto(Cursor *p){ +1.7 (drh 07-Jan-04): if( p->deferredMoveto ){ +1.165 (drh 26-Jan-05): int res, rc; +1.264 (adamd 14-Sep-06): #ifdef SQLITE_TEST +1.24 (danielk1 10-May-04): extern int sqlite3_search_count; +1.264 (adamd 14-Sep-06): #endif +1.181 (drh 12-Jun-05): assert( p->isTable ); +1.280 (drh 04-Apr-07): rc = sqlite3BtreeMoveto(p->pCursor, 0, p->movetoTarget, 0, &res); +1.165 (drh 26-Jan-05): if( rc ) return rc; +1.50 (drh 20-May-04): *p->pIncrKey = 0; +1.181 (drh 12-Jun-05): p->lastRowid = keyToInt(p->movetoTarget); +1.181 (drh 12-Jun-05): p->rowidIsValid = res==0; +1.7 (drh 07-Jan-04): if( res<0 ){ +1.165 (drh 26-Jan-05): rc = sqlite3BtreeNext(p->pCursor, &res); +1.165 (drh 26-Jan-05): if( rc ) return rc; +1.7 (drh 07-Jan-04): } +1.262 (drh 08-Aug-06): #ifdef SQLITE_TEST +1.24 (danielk1 10-May-04): sqlite3_search_count++; +1.262 (drh 08-Aug-06): #endif +1.7 (drh 07-Jan-04): p->deferredMoveto = 0; +1.219 (drh 07-Jan-06): p->cacheStatus = CACHE_STALE; +1.7 (drh 07-Jan-04): } +1.7 (drh 07-Jan-04): return SQLITE_OK; +1.7 (drh 07-Jan-04): } +1.19 (danielk1 08-May-04): +1.20 (drh 08-May-04): /* +1.28 (danielk1 12-May-04): ** The following functions: +1.23 (danielk1 10-May-04): ** +1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialType() +1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialTypeLen() +1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialRead() +1.23 (danielk1 10-May-04): ** sqlite3VdbeSerialLen() +1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialWrite() +1.23 (danielk1 10-May-04): ** +1.23 (danielk1 10-May-04): ** encapsulate the code that serializes values for storage in SQLite +1.28 (danielk1 12-May-04): ** data and index records. Each serialized value consists of a +1.28 (danielk1 12-May-04): ** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned +1.28 (danielk1 12-May-04): ** integer, stored as a varint. +1.23 (danielk1 10-May-04): ** +1.28 (danielk1 12-May-04): ** In an SQLite index record, the serial type is stored directly before +1.28 (danielk1 12-May-04): ** the blob of data that it corresponds to. In a table record, all serial +1.28 (danielk1 12-May-04): ** types are stored at the start of the record, and the blobs of data at +1.28 (danielk1 12-May-04): ** the end. Hence these functions allow the caller to handle the +1.28 (danielk1 12-May-04): ** serial-type and data blob seperately. +1.28 (danielk1 12-May-04): ** +1.28 (danielk1 12-May-04): ** The following table describes the various storage classes for data: +1.28 (danielk1 12-May-04): ** +1.28 (danielk1 12-May-04): ** serial type bytes of data type +1.23 (danielk1 10-May-04): ** -------------- --------------- --------------- +1.84 (drh 30-May-04): ** 0 0 NULL +1.23 (danielk1 10-May-04): ** 1 1 signed integer +1.23 (danielk1 10-May-04): ** 2 2 signed integer +1.84 (drh 30-May-04): ** 3 3 signed integer +1.84 (drh 30-May-04): ** 4 4 signed integer +1.84 (drh 30-May-04): ** 5 6 signed integer +1.84 (drh 30-May-04): ** 6 8 signed integer +1.84 (drh 30-May-04): ** 7 8 IEEE float +1.215 (drh 29-Dec-05): ** 8 0 Integer constant 0 +1.215 (drh 29-Dec-05): ** 9 0 Integer constant 1 +1.215 (drh 29-Dec-05): ** 10,11 reserved for expansion +1.23 (danielk1 10-May-04): ** N>=12 and even (N-12)/2 BLOB +1.23 (danielk1 10-May-04): ** N>=13 and odd (N-13)/2 text +1.23 (danielk1 10-May-04): ** +1.217 (drh 02-Jan-06): ** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions +1.217 (drh 02-Jan-06): ** of SQLite will not understand those serial types. +1.23 (danielk1 10-May-04): */ +1.23 (danielk1 10-May-04): +1.23 (danielk1 10-May-04): /* +1.28 (danielk1 12-May-04): ** Return the serial-type for the value stored in pMem. +1.22 (danielk1 10-May-04): */ +1.215 (drh 29-Dec-05): u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ +1.28 (danielk1 12-May-04): int flags = pMem->flags; +1.283 (drh 02-May-07): int n; +1.28 (danielk1 12-May-04): +1.28 (danielk1 12-May-04): if( flags&MEM_Null ){ +1.84 (drh 30-May-04): return 0; +1.23 (danielk1 10-May-04): } +1.28 (danielk1 12-May-04): if( flags&MEM_Int ){ +1.158 (drh 20-Jan-05): /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ +1.175 (drh 15-Apr-05): # define MAX_6BYTE ((((i64)0x00001000)<<32)-1) +1.276 (drh 30-Mar-07): i64 i = pMem->u.i; +1.215 (drh 29-Dec-05): u64 u; +1.215 (drh 29-Dec-05): if( file_format>=4 && (i&1)==i ){ +1.215 (drh 29-Dec-05): return 8+i; +1.215 (drh 29-Dec-05): } +1.215 (drh 29-Dec-05): u = i<0 ? -i : i; +1.164 (drh 26-Jan-05): if( u<=127 ) return 1; +1.164 (drh 26-Jan-05): if( u<=32767 ) return 2; +1.164 (drh 26-Jan-05): if( u<=8388607 ) return 3; +1.164 (drh 26-Jan-05): if( u<=2147483647 ) return 4; +1.164 (drh 26-Jan-05): if( u<=MAX_6BYTE ) return 5; +1.84 (drh 30-May-04): return 6; +1.28 (danielk1 12-May-04): } +1.28 (danielk1 12-May-04): if( flags&MEM_Real ){ +1.84 (drh 30-May-04): return 7; +1.23 (danielk1 10-May-04): } +1.283 (drh 02-May-07): assert( flags&(MEM_Str|MEM_Blob) ); +1.283 (drh 02-May-07): n = pMem->n; +1.283 (drh 02-May-07): if( flags & MEM_Zero ){ +1.283 (drh 02-May-07): n += pMem->u.i; +1.23 (danielk1 10-May-04): } +1.283 (drh 02-May-07): assert( n>=0 ); +1.283 (drh 02-May-07): return ((n*2) + 12 + ((flags&MEM_Str)!=0)); +1.22 (danielk1 10-May-04): } +1.22 (danielk1 10-May-04): +1.22 (danielk1 10-May-04): /* +1.28 (danielk1 12-May-04): ** Return the length of the data corresponding to the supplied serial-type. +1.22 (danielk1 10-May-04): */ +1.75 (drh 28-May-04): int sqlite3VdbeSerialTypeLen(u32 serial_type){ +1.84 (drh 30-May-04): if( serial_type>=12 ){ +1.79 (drh 28-May-04): return (serial_type-12)/2; +1.79 (drh 28-May-04): }else{ +1.150 (drh 06-Oct-04): static const u8 aSize[] = { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 }; +1.79 (drh 28-May-04): return aSize[serial_type]; +1.79 (drh 28-May-04): } +1.28 (danielk1 12-May-04): } +1.23 (danielk1 10-May-04): +1.28 (danielk1 12-May-04): /* +1.284 (drh 04-May-07): ** If we are on an architecture with mixed-endian floating +1.289 (drh 23-May-07): ** points (ex: ARM7) then swap the lower 4 bytes with the +1.284 (drh 04-May-07): ** upper 4 bytes. Return the result. +1.284 (drh 04-May-07): ** +1.289 (drh 23-May-07): ** For most architectures, this is a no-op. +1.289 (drh 23-May-07): ** +1.289 (drh 23-May-07): ** (later): It is reported to me that the mixed-endian problem +1.289 (drh 23-May-07): ** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems +1.289 (drh 23-May-07): ** that early versions of GCC stored the two words of a 64-bit +1.289 (drh 23-May-07): ** float in the wrong order. And that error has been propagated +1.289 (drh 23-May-07): ** ever since. The blame is not necessarily with GCC, though. +1.289 (drh 23-May-07): ** GCC might have just copying the problem from a prior compiler. +1.289 (drh 23-May-07): ** I am also told that newer versions of GCC that follow a different +1.289 (drh 23-May-07): ** ABI get the byte order right. +1.289 (drh 23-May-07): ** +1.289 (drh 23-May-07): ** Developers using SQLite on an ARM7 should compile and run their +1.289 (drh 23-May-07): ** application using -DSQLITE_DEBUG=1 at least once. With DEBUG +1.289 (drh 23-May-07): ** enabled, some asserts below will ensure that the byte order of +1.289 (drh 23-May-07): ** floating point values is correct. +1.318 (drh 30-Aug-07): ** +1.318 (drh 30-Aug-07): ** (2007-08-30) Frank van Vugt has studied this problem closely +1.318 (drh 30-Aug-07): ** and has send his findings to the SQLite developers. Frank +1.318 (drh 30-Aug-07): ** writes that some Linux kernels offer floating point hardware +1.318 (drh 30-Aug-07): ** emulation that uses only 32-bit mantissas instead of a full +1.318 (drh 30-Aug-07): ** 48-bits as required by the IEEE standard. (This is the +1.318 (drh 30-Aug-07): ** CONFIG_FPE_FASTFPE option.) On such systems, floating point +1.318 (drh 30-Aug-07): ** byte swapping becomes very complicated. To avoid problems, +1.318 (drh 30-Aug-07): ** the necessary byte swapping is carried out using a 64-bit integer +1.318 (drh 30-Aug-07): ** rather than a 64-bit float. Frank assures us that the code here +1.318 (drh 30-Aug-07): ** works for him. We, the developers, have no way to independently +1.318 (drh 30-Aug-07): ** verify this, but Frank seems to know what he is talking about +1.318 (drh 30-Aug-07): ** so we trust him. +1.284 (drh 04-May-07): */ +1.284 (drh 04-May-07): #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +1.318 (drh 30-Aug-07): static u64 floatSwap(u64 in){ +1.284 (drh 04-May-07): union { +1.318 (drh 30-Aug-07): u64 r; +1.284 (drh 04-May-07): u32 i[2]; +1.284 (drh 04-May-07): } u; +1.284 (drh 04-May-07): u32 t; +1.284 (drh 04-May-07): +1.284 (drh 04-May-07): u.r = in; +1.284 (drh 04-May-07): t = u.i[0]; +1.284 (drh 04-May-07): u.i[0] = u.i[1]; +1.284 (drh 04-May-07): u.i[1] = t; +1.284 (drh 04-May-07): return u.r; +1.284 (drh 04-May-07): } +1.284 (drh 04-May-07): # define swapMixedEndianFloat(X) X = floatSwap(X) +1.284 (drh 04-May-07): #else +1.284 (drh 04-May-07): # define swapMixedEndianFloat(X) +1.284 (drh 04-May-07): #endif +1.284 (drh 04-May-07): +1.284 (drh 04-May-07): /* +1.28 (danielk1 12-May-04): ** Write the serialized data blob for the value stored in pMem into +1.28 (danielk1 12-May-04): ** buf. It is assumed that the caller has allocated sufficient space. +1.28 (danielk1 12-May-04): ** Return the number of bytes written. +1.283 (drh 02-May-07): ** +1.283 (drh 02-May-07): ** nBuf is the amount of space left in buf[]. nBuf must always be +1.283 (drh 02-May-07): ** large enough to hold the entire field. Except, if the field is +1.283 (drh 02-May-07): ** a blob with a zero-filled tail, then buf[] might be just the right +1.283 (drh 02-May-07): ** size to hold everything except for the zero-filled tail. If buf[] +1.283 (drh 02-May-07): ** is only big enough to hold the non-zero prefix, then only write that +1.283 (drh 02-May-07): ** prefix into buf[]. But if buf[] is large enough to hold both the +1.283 (drh 02-May-07): ** prefix and the tail then write the prefix and set the tail to all +1.283 (drh 02-May-07): ** zeros. +1.283 (drh 02-May-07): ** +1.283 (drh 02-May-07): ** Return the number of bytes actually written into buf[]. The number +1.283 (drh 02-May-07): ** of bytes in the zero-filled tail is included in the return value only +1.283 (drh 02-May-07): ** if those bytes were zeroed in buf[]. +1.28 (danielk1 12-May-04): */ +1.283 (drh 02-May-07): int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ +1.215 (drh 29-Dec-05): u32 serial_type = sqlite3VdbeSerialType(pMem, file_format); +1.28 (danielk1 12-May-04): int len; +1.30 (danielk1 13-May-04): +1.54 (drh 21-May-04): /* Integer and Real */ +1.215 (drh 29-Dec-05): if( serial_type<=7 && serial_type>0 ){ +1.54 (drh 21-May-04): u64 v; +1.54 (drh 21-May-04): int i; +1.84 (drh 30-May-04): if( serial_type==7 ){ +1.272 (drh 26-Mar-07): assert( sizeof(v)==sizeof(pMem->r) ); +1.272 (drh 26-Mar-07): memcpy(&v, &pMem->r, sizeof(v)); +1.318 (drh 30-Aug-07): swapMixedEndianFloat(v); +1.54 (drh 21-May-04): }else{ +1.276 (drh 30-Mar-07): v = pMem->u.i; +1.54 (drh 21-May-04): } +1.54 (drh 21-May-04): len = i = sqlite3VdbeSerialTypeLen(serial_type); +1.283 (drh 02-May-07): assert( len<=nBuf ); +1.54 (drh 21-May-04): while( i-- ){ +1.54 (drh 21-May-04): buf[i] = (v&0xFF); +1.54 (drh 21-May-04): v >>= 8; +1.54 (drh 21-May-04): } +1.54 (drh 21-May-04): return len; +1.28 (danielk1 12-May-04): } +1.215 (drh 29-Dec-05): +1.28 (danielk1 12-May-04): /* String or blob */ +1.215 (drh 29-Dec-05): if( serial_type>=12 ){ +1.283 (drh 02-May-07): assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.i:0) +1.283 (drh 02-May-07): == sqlite3VdbeSerialTypeLen(serial_type) ); +1.283 (drh 02-May-07): assert( pMem->n<=nBuf ); +1.283 (drh 02-May-07): len = pMem->n; +1.215 (drh 29-Dec-05): memcpy(buf, pMem->z, len); +1.283 (drh 02-May-07): if( pMem->flags & MEM_Zero ){ +1.283 (drh 02-May-07): len += pMem->u.i; +1.283 (drh 02-May-07): if( len>nBuf ){ +1.283 (drh 02-May-07): len = nBuf; +1.283 (drh 02-May-07): } +1.283 (drh 02-May-07): memset(&buf[pMem->n], 0, len-pMem->n); +1.283 (drh 02-May-07): } +1.215 (drh 29-Dec-05): return len; +1.215 (drh 29-Dec-05): } +1.215 (drh 29-Dec-05): +1.215 (drh 29-Dec-05): /* NULL or constants 0 or 1 */ +1.215 (drh 29-Dec-05): return 0; +1.22 (danielk1 10-May-04): } +1.22 (danielk1 10-May-04): +1.22 (danielk1 10-May-04): /* +1.28 (danielk1 12-May-04): ** Deserialize the data blob pointed to by buf as serial type serial_type +1.28 (danielk1 12-May-04): ** and store the result in pMem. Return the number of bytes read. +1.28 (danielk1 12-May-04): */ +1.55 (danielk1 22-May-04): int sqlite3VdbeSerialGet( +1.58 (danielk1 23-May-04): const unsigned char *buf, /* Buffer to deserialize from */ +1.75 (drh 28-May-04): u32 serial_type, /* Serial type to deserialize */ +1.75 (drh 28-May-04): Mem *pMem /* Memory cell to write value into */ +1.55 (danielk1 22-May-04): ){ +1.177 (drh 21-May-05): switch( serial_type ){ +1.177 (drh 21-May-05): case 10: /* Reserved for future use */ +1.177 (drh 21-May-05): case 11: /* Reserved for future use */ +1.177 (drh 21-May-05): case 0: { /* NULL */ +1.177 (drh 21-May-05): pMem->flags = MEM_Null; +1.177 (drh 21-May-05): break; +1.177 (drh 21-May-05): } +1.177 (drh 21-May-05): case 1: { /* 1-byte signed integer */ +1.276 (drh 30-Mar-07): pMem->u.i = (signed char)buf[0]; +1.177 (drh 21-May-05): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): return 1; +1.177 (drh 21-May-05): } +1.177 (drh 21-May-05): case 2: { /* 2-byte signed integer */ +1.276 (drh 30-Mar-07): pMem->u.i = (((signed char)buf[0])<<8) | buf[1]; +1.177 (drh 21-May-05): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): return 2; +1.177 (drh 21-May-05): } +1.177 (drh 21-May-05): case 3: { /* 3-byte signed integer */ +1.276 (drh 30-Mar-07): pMem->u.i = (((signed char)buf[0])<<16) | (buf[1]<<8) | buf[2]; +1.177 (drh 21-May-05): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): return 3; +1.177 (drh 21-May-05): } +1.177 (drh 21-May-05): case 4: { /* 4-byte signed integer */ +1.276 (drh 30-Mar-07): pMem->u.i = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; +1.177 (drh 21-May-05): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): return 4; +1.177 (drh 21-May-05): } +1.177 (drh 21-May-05): case 5: { /* 6-byte signed integer */ +1.177 (drh 21-May-05): u64 x = (((signed char)buf[0])<<8) | buf[1]; +1.177 (drh 21-May-05): u32 y = (buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5]; +1.177 (drh 21-May-05): x = (x<<32) | y; +1.276 (drh 30-Mar-07): pMem->u.i = *(i64*)&x; +1.83 (drh 30-May-04): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): return 6; +1.177 (drh 21-May-05): } +1.186 (drh 18-Aug-05): case 6: /* 8-byte signed integer */ +1.177 (drh 21-May-05): case 7: { /* IEEE floating point */ +1.193 (drh 05-Sep-05): u64 x; +1.193 (drh 05-Sep-05): u32 y; +1.232 (drh 23-Jan-06): #if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT) +1.189 (drh 28-Aug-05): /* Verify that integers and floating point values use the same +1.284 (drh 04-May-07): ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is +1.284 (drh 04-May-07): ** defined that 64-bit floating point values really are mixed +1.284 (drh 04-May-07): ** endian. +1.190 (drh 28-Aug-05): */ +1.189 (drh 28-Aug-05): static const u64 t1 = ((u64)0x3ff00000)<<32; +1.272 (drh 26-Mar-07): static const double r1 = 1.0; +1.318 (drh 30-Aug-07): u64 t2 = t1; +1.318 (drh 30-Aug-07): swapMixedEndianFloat(t2); +1.318 (drh 30-Aug-07): assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); +1.189 (drh 28-Aug-05): #endif +1.190 (drh 28-Aug-05): +1.193 (drh 05-Sep-05): x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; +1.193 (drh 05-Sep-05): y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7]; +1.177 (drh 21-May-05): x = (x<<32) | y; +1.177 (drh 21-May-05): if( serial_type==6 ){ +1.276 (drh 30-Mar-07): pMem->u.i = *(i64*)&x; +1.177 (drh 21-May-05): pMem->flags = MEM_Int; +1.177 (drh 21-May-05): }else{ +1.272 (drh 26-Mar-07): assert( sizeof(x)==8 && sizeof(pMem->r)==8 ); +1.318 (drh 30-Aug-07): swapMixedEndianFloat(x); +1.272 (drh 26-Mar-07): memcpy(&pMem->r, &x, sizeof(x)); +1.177 (drh 21-May-05): pMem->flags = MEM_Real; +1.83 (drh 30-May-04): } +1.177 (drh 21-May-05): return 8; +1.177 (drh 21-May-05): } +1.215 (drh 29-Dec-05): case 8: /* Integer 0 */ +1.215 (drh 29-Dec-05): case 9: { /* Integer 1 */ +1.276 (drh 30-Mar-07): pMem->u.i = serial_type-8; +1.215 (drh 29-Dec-05): pMem->flags = MEM_Int; +1.215 (drh 29-Dec-05): return 0; +1.215 (drh 29-Dec-05): } +1.177 (drh 21-May-05): default: { +1.177 (drh 21-May-05): int len = (serial_type-12)/2; +1.177 (drh 21-May-05): pMem->z = (char *)buf; +1.177 (drh 21-May-05): pMem->n = len; +1.177 (drh 21-May-05): pMem->xDel = 0; +1.177 (drh 21-May-05): if( serial_type&0x01 ){ +1.177 (drh 21-May-05): pMem->flags = MEM_Str | MEM_Ephem; +1.83 (drh 30-May-04): }else{ +1.177 (drh 21-May-05): pMem->flags = MEM_Blob | MEM_Ephem; +1.83 (drh 30-May-04): } +1.177 (drh 21-May-05): return len; +1.81 (drh 30-May-04): } +1.23 (danielk1 10-May-04): } +1.177 (drh 21-May-05): return 0; +1.22 (danielk1 10-May-04): } +1.22 (danielk1 10-May-04): +1.22 (danielk1 10-May-04): /* +1.223 (drh 12-Jan-06): ** The header of a record consists of a sequence variable-length integers. +1.223 (drh 12-Jan-06): ** These integers are almost always small and are encoded as a single byte. +1.223 (drh 12-Jan-06): ** The following macro takes advantage this fact to provide a fast decode +1.223 (drh 12-Jan-06): ** of the integers in a record header. It is faster for the common case +1.223 (drh 12-Jan-06): ** where the integer is a single byte. It is a little slower when the +1.223 (drh 12-Jan-06): ** integer is two or more bytes. But overall it is faster. +1.223 (drh 12-Jan-06): ** +1.223 (drh 12-Jan-06): ** The following expressions are equivalent: +1.223 (drh 12-Jan-06): ** +1.223 (drh 12-Jan-06): ** x = sqlite3GetVarint32( A, &B ); +1.223 (drh 12-Jan-06): ** +1.223 (drh 12-Jan-06): ** x = GetVarint( A, B ); +1.223 (drh 12-Jan-06): ** +1.223 (drh 12-Jan-06): */ +1.223 (drh 12-Jan-06): #define GetVarint(A,B) ((B = *(A))<=0x7f ? 1 : sqlite3GetVarint32(A, &B)) +1.223 (drh 12-Jan-06): +1.223 (drh 12-Jan-06): /* +1.90 (drh 02-Jun-04): ** This function compares the two table rows or index records specified by +1.38 (danielk1 18-May-04): ** {nKey1, pKey1} and {nKey2, pKey2}, returning a negative, zero +1.38 (danielk1 18-May-04): ** or positive integer if {nKey1, pKey1} is less than, equal to or +1.90 (drh 02-Jun-04): ** greater than {nKey2, pKey2}. Both Key1 and Key2 must be byte strings +1.90 (drh 02-Jun-04): ** composed by the OP_MakeRecord opcode of the VDBE. +1.38 (danielk1 18-May-04): */ +1.90 (drh 02-Jun-04): int sqlite3VdbeRecordCompare( +1.38 (danielk1 18-May-04): void *userData, +1.38 (danielk1 18-May-04): int nKey1, const void *pKey1, +1.38 (danielk1 18-May-04): int nKey2, const void *pKey2 +1.38 (danielk1 18-May-04): ){ +1.50 (drh 20-May-04): KeyInfo *pKeyInfo = (KeyInfo*)userData; +1.73 (drh 27-May-04): u32 d1, d2; /* Offset into aKey[] of next data element */ +1.73 (drh 27-May-04): u32 idx1, idx2; /* Offset into aKey[] of next header element */ +1.73 (drh 27-May-04): u32 szHdr1, szHdr2; /* Number of bytes in header */ +1.73 (drh 27-May-04): int i = 0; +1.73 (drh 27-May-04): int nField; +1.73 (drh 27-May-04): int rc = 0; +1.38 (danielk1 18-May-04): const unsigned char *aKey1 = (const unsigned char *)pKey1; +1.38 (danielk1 18-May-04): const unsigned char *aKey2 = (const unsigned char *)pKey2; +1.96 (danielk1 09-Jun-04): +1.96 (danielk1 09-Jun-04): Mem mem1; +1.96 (danielk1 09-Jun-04): Mem mem2; +1.96 (danielk1 09-Jun-04): mem1.enc = pKeyInfo->enc; +1.307 (drh 21-Aug-07): mem1.db = pKeyInfo->db; +1.96 (danielk1 09-Jun-04): mem2.enc = pKeyInfo->enc; +1.307 (drh 21-Aug-07): mem2.db = pKeyInfo->db; +1.73 (drh 27-May-04): +1.223 (drh 12-Jan-06): idx1 = GetVarint(aKey1, szHdr1); +1.73 (drh 27-May-04): d1 = szHdr1; +1.223 (drh 12-Jan-06): idx2 = GetVarint(aKey2, szHdr2); +1.73 (drh 27-May-04): d2 = szHdr2; +1.73 (drh 27-May-04): nField = pKeyInfo->nField; +1.76 (drh 28-May-04): while( idx1=nKey1 && sqlite3VdbeSerialTypeLen(serial_type1)>0 ) break; +1.223 (drh 12-Jan-06): idx2 += GetVarint( aKey2+idx2, serial_type2 ); +1.76 (drh 28-May-04): if( d2>=nKey2 && sqlite3VdbeSerialTypeLen(serial_type2)>0 ) break; +1.39 (danielk1 18-May-04): +1.267 (drh 27-Oct-06): /* Extract the values to be compared. +1.39 (danielk1 18-May-04): */ +1.75 (drh 28-May-04): d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); +1.75 (drh 28-May-04): d2 += sqlite3VdbeSerialGet(&aKey2[d2], serial_type2, &mem2); +1.39 (danielk1 18-May-04): +1.267 (drh 27-Oct-06): /* Do the comparison +1.267 (drh 27-Oct-06): */ +1.76 (drh 28-May-04): rc = sqlite3MemCompare(&mem1, &mem2, iaColl[i] : 0); +1.177 (drh 21-May-05): if( mem1.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem1); +1.177 (drh 21-May-05): if( mem2.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem2); +1.39 (danielk1 18-May-04): if( rc!=0 ){ +1.73 (drh 27-May-04): break; +1.39 (danielk1 18-May-04): } +1.73 (drh 27-May-04): i++; +1.73 (drh 27-May-04): } +1.73 (drh 27-May-04): +1.73 (drh 27-May-04): /* One of the keys ran out of fields, but all the fields up to that point +1.73 (drh 27-May-04): ** were equal. If the incrKey flag is true, then the second key is +1.73 (drh 27-May-04): ** treated as larger. +1.73 (drh 27-May-04): */ +1.73 (drh 27-May-04): if( rc==0 ){ +1.73 (drh 27-May-04): if( pKeyInfo->incrKey ){ +1.73 (drh 27-May-04): rc = -1; +1.73 (drh 27-May-04): }else if( d1aSortOrder && inField +1.214 (drh 21-Dec-05): && pKeyInfo->aSortOrder[i] ){ +1.73 (drh 27-May-04): rc = -rc; +1.39 (danielk1 18-May-04): } +1.39 (danielk1 18-May-04): +1.73 (drh 27-May-04): return rc; +1.38 (danielk1 18-May-04): } +1.76 (drh 28-May-04): +1.76 (drh 28-May-04): /* +1.90 (drh 02-Jun-04): ** The argument is an index entry composed using the OP_MakeRecord opcode. +1.90 (drh 02-Jun-04): ** The last entry in this record should be an integer (specifically +1.90 (drh 02-Jun-04): ** an integer rowid). This routine returns the number of bytes in +1.90 (drh 02-Jun-04): ** that integer. +1.76 (drh 28-May-04): */ +1.237 (drh 24-Feb-06): int sqlite3VdbeIdxRowidLen(const u8 *aKey){ +1.76 (drh 28-May-04): u32 szHdr; /* Size of the header */ +1.76 (drh 28-May-04): u32 typeRowid; /* Serial type of the rowid */ +1.76 (drh 28-May-04): +1.76 (drh 28-May-04): sqlite3GetVarint32(aKey, &szHdr); +1.76 (drh 28-May-04): sqlite3GetVarint32(&aKey[szHdr-1], &typeRowid); +1.76 (drh 28-May-04): return sqlite3VdbeSerialTypeLen(typeRowid); +1.76 (drh 28-May-04): } +1.38 (danielk1 18-May-04): +1.30 (danielk1 13-May-04): +1.30 (danielk1 13-May-04): /* +1.90 (drh 02-Jun-04): ** pCur points at an index entry created using the OP_MakeRecord opcode. +1.90 (drh 02-Jun-04): ** Read the rowid (the last field in the record) and store it in *rowid. +1.90 (drh 02-Jun-04): ** Return SQLITE_OK if everything works, or an error code otherwise. +1.30 (danielk1 13-May-04): */ +1.307 (drh 21-Aug-07): int sqlite3VdbeIdxRowid(BtCursor *pCur, i64 *rowid){ +1.279 (drh 01-Apr-07): i64 nCellKey = 0; +1.30 (danielk1 13-May-04): int rc; +1.76 (drh 28-May-04): u32 szHdr; /* Size of the header */ +1.76 (drh 28-May-04): u32 typeRowid; /* Serial type of the rowid */ +1.76 (drh 28-May-04): u32 lenRowid; /* Size of the rowid */ +1.76 (drh 28-May-04): Mem m, v; +1.30 (danielk1 13-May-04): +1.76 (drh 28-May-04): sqlite3BtreeKeySize(pCur, &nCellKey); +1.76 (drh 28-May-04): if( nCellKey<=0 ){ +1.200 (drh 17-Sep-05): return SQLITE_CORRUPT_BKPT; +1.76 (drh 28-May-04): } +1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemFromBtree(pCur, 0, nCellKey, 1, &m); +1.76 (drh 28-May-04): if( rc ){ +1.30 (danielk1 13-May-04): return rc; +1.30 (danielk1 13-May-04): } +1.210 (drh 09-Dec-05): sqlite3GetVarint32((u8*)m.z, &szHdr); +1.210 (drh 09-Dec-05): sqlite3GetVarint32((u8*)&m.z[szHdr-1], &typeRowid); +1.76 (drh 28-May-04): lenRowid = sqlite3VdbeSerialTypeLen(typeRowid); +1.210 (drh 09-Dec-05): sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v); +1.276 (drh 30-Mar-07): *rowid = v.u.i; +1.105 (danielk1 12-Jun-04): sqlite3VdbeMemRelease(&m); +1.30 (danielk1 13-May-04): return SQLITE_OK; +1.30 (danielk1 13-May-04): } +1.30 (danielk1 13-May-04): +1.44 (drh 19-May-04): /* +1.50 (drh 20-May-04): ** Compare the key of the index entry that cursor pC is point to against +1.44 (drh 19-May-04): ** the key string in pKey (of length nKey). Write into *pRes a number +1.44 (drh 19-May-04): ** that is negative, zero, or positive if pC is less than, equal to, +1.44 (drh 19-May-04): ** or greater than pKey. Return SQLITE_OK on success. +1.50 (drh 20-May-04): ** +1.76 (drh 28-May-04): ** pKey is either created without a rowid or is truncated so that it +1.76 (drh 28-May-04): ** omits the rowid at the end. The rowid at the end of the index entry +1.76 (drh 28-May-04): ** is ignored as well. +1.44 (drh 19-May-04): */ +1.30 (danielk1 13-May-04): int sqlite3VdbeIdxKeyCompare( +1.44 (drh 19-May-04): Cursor *pC, /* The cursor to compare against */ +1.44 (drh 19-May-04): int nKey, const u8 *pKey, /* The key to compare */ +1.44 (drh 19-May-04): int *res /* Write the comparison result here */ +1.30 (danielk1 13-May-04): ){ +1.279 (drh 01-Apr-07): i64 nCellKey = 0; +1.30 (danielk1 13-May-04): int rc; +1.31 (danielk1 14-May-04): BtCursor *pCur = pC->pCursor; +1.76 (drh 28-May-04): int lenRowid; +1.76 (drh 28-May-04): Mem m; +1.30 (danielk1 13-May-04): +1.30 (danielk1 13-May-04): sqlite3BtreeKeySize(pCur, &nCellKey); +1.30 (danielk1 13-May-04): if( nCellKey<=0 ){ +1.30 (danielk1 13-May-04): *res = 0; +1.30 (danielk1 13-May-04): return SQLITE_OK; +1.30 (danielk1 13-May-04): } +1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, nCellKey, 1, &m); +1.76 (drh 28-May-04): if( rc ){ +1.76 (drh 28-May-04): return rc; +1.30 (danielk1 13-May-04): } +1.237 (drh 24-Feb-06): lenRowid = sqlite3VdbeIdxRowidLen((u8*)m.z); +1.90 (drh 02-Jun-04): *res = sqlite3VdbeRecordCompare(pC->pKeyInfo, m.n-lenRowid, m.z, nKey, pKey); +1.105 (danielk1 12-Jun-04): sqlite3VdbeMemRelease(&m); +1.30 (danielk1 13-May-04): return SQLITE_OK; +1.62 (danielk1 25-May-04): } +1.121 (danielk1 21-Jun-04): +1.121 (danielk1 21-Jun-04): /* +1.121 (danielk1 21-Jun-04): ** This routine sets the value to be returned by subsequent calls to +1.121 (danielk1 21-Jun-04): ** sqlite3_changes() on the database handle 'db'. +1.121 (danielk1 21-Jun-04): */ +1.121 (danielk1 21-Jun-04): void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ +1.307 (drh 21-Aug-07): assert( sqlite3_mutex_held(db->mutex) ); +1.121 (danielk1 21-Jun-04): db->nChange = nChange; +1.121 (danielk1 21-Jun-04): db->nTotalChange += nChange; +1.121 (danielk1 21-Jun-04): } +1.121 (danielk1 21-Jun-04): +1.121 (danielk1 21-Jun-04): /* +1.121 (danielk1 21-Jun-04): ** Set a flag in the vdbe to update the change counter when it is finalised +1.121 (danielk1 21-Jun-04): ** or reset. +1.121 (danielk1 21-Jun-04): */ +1.152 (drh 05-Nov-04): void sqlite3VdbeCountChanges(Vdbe *v){ +1.152 (drh 05-Nov-04): v->changeCntOn = 1; +1.121 (danielk1 21-Jun-04): } +1.159 (drh 22-Jan-05): +1.159 (drh 22-Jan-05): /* +1.159 (drh 22-Jan-05): ** Mark every prepared statement associated with a database connection +1.159 (drh 22-Jan-05): ** as expired. +1.159 (drh 22-Jan-05): ** +1.159 (drh 22-Jan-05): ** An expired statement means that recompilation of the statement is +1.159 (drh 22-Jan-05): ** recommend. Statements expire when things happen that make their +1.159 (drh 22-Jan-05): ** programs obsolete. Removing user-defined functions or collating +1.159 (drh 22-Jan-05): ** sequences, or changing an authorization function are the types of +1.159 (drh 22-Jan-05): ** things that make prepared statements obsolete. +1.159 (drh 22-Jan-05): */ +1.159 (drh 22-Jan-05): void sqlite3ExpirePreparedStatements(sqlite3 *db){ +1.159 (drh 22-Jan-05): Vdbe *p; +1.159 (drh 22-Jan-05): for(p = db->pVdbe; p; p=p->pNext){ +1.159 (drh 22-Jan-05): p->expired = 1; +1.159 (drh 22-Jan-05): } +1.159 (drh 22-Jan-05): } +1.167 (danielk1 09-Mar-05): +1.167 (danielk1 09-Mar-05): /* +1.167 (danielk1 09-Mar-05): ** Return the database associated with the Vdbe. +1.167 (danielk1 09-Mar-05): */ +1.167 (danielk1 09-Mar-05): sqlite3 *sqlite3VdbeDb(Vdbe *v){ +1.167 (danielk1 09-Mar-05): return v->db; +1.167 (danielk1 09-Mar-05): } diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c b/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c new file mode 100644 index 0000000000..0a7091a09d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c @@ -0,0 +1,2617 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains routines used for analyzing expressions and +** for generating VDBE code that evaluates expressions in SQLite. +** +** $Id: expr.c,v 1.313 2007/09/18 15:55:07 drh Exp $ +*/ +#include "sqliteInt.h" +#include + +/* +** Return the 'affinity' of the expression pExpr if any. +** +** If pExpr is a column, a reference to a column via an 'AS' alias, +** or a sub-select with a column as the return value, then the +** affinity of that column is returned. Otherwise, 0x00 is returned, +** indicating no affinity for the expression. +** +** i.e. the WHERE clause expresssions in the following statements all +** have an affinity: +** +** CREATE TABLE t1(a); +** SELECT * FROM t1 WHERE a; +** SELECT a AS b FROM t1 WHERE b; +** SELECT * FROM t1 WHERE (select a from t1); +*/ +char sqlite3ExprAffinity(Expr *pExpr){ + int op = pExpr->op; + if( op==TK_SELECT ){ + return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr); + } +#ifndef SQLITE_OMIT_CAST + if( op==TK_CAST ){ + return sqlite3AffinityType(&pExpr->token); + } +#endif + return pExpr->affinity; +} + +/* +** Set the collating sequence for expression pExpr to be the collating +** sequence named by pToken. Return a pointer to the revised expression. +** The collating sequence is marked as "explicit" using the EP_ExpCollate +** flag. An explicit collating sequence will override implicit +** collating sequences. +*/ +Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pName){ + CollSeq *pColl; + if( pExpr==0 ) return 0; + pColl = sqlite3LocateCollSeq(pParse, (char*)pName->z, pName->n); + if( pColl ){ + pExpr->pColl = pColl; + pExpr->flags |= EP_ExpCollate; + } + return pExpr; +} + +/* +** Return the default collation sequence for the expression pExpr. If +** there is no default collation type, return 0. +*/ +CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ + CollSeq *pColl = 0; + if( pExpr ){ + int op; + pColl = pExpr->pColl; + op = pExpr->op; + if( (op==TK_CAST || op==TK_UPLUS) && !pColl ){ + return sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + } + if( sqlite3CheckCollSeq(pParse, pColl) ){ + pColl = 0; + } + return pColl; +} + +/* +** pExpr is an operand of a comparison operator. aff2 is the +** type affinity of the other operand. This routine returns the +** type affinity that should be used for the comparison operator. +*/ +char sqlite3CompareAffinity(Expr *pExpr, char aff2){ + char aff1 = sqlite3ExprAffinity(pExpr); + if( aff1 && aff2 ){ + /* Both sides of the comparison are columns. If one has numeric + ** affinity, use that. Otherwise use no affinity. + */ + if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ + return SQLITE_AFF_NUMERIC; + }else{ + return SQLITE_AFF_NONE; + } + }else if( !aff1 && !aff2 ){ + /* Neither side of the comparison is a column. Compare the + ** results directly. + */ + return SQLITE_AFF_NONE; + }else{ + /* One side is a column, the other is not. Use the columns affinity. */ + assert( aff1==0 || aff2==0 ); + return (aff1 + aff2); + } +} + +/* +** pExpr is a comparison operator. Return the type affinity that should +** be applied to both operands prior to doing the comparison. +*/ +static char comparisonAffinity(Expr *pExpr){ + char aff; + assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || + pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || + pExpr->op==TK_NE ); + assert( pExpr->pLeft ); + aff = sqlite3ExprAffinity(pExpr->pLeft); + if( pExpr->pRight ){ + aff = sqlite3CompareAffinity(pExpr->pRight, aff); + } + else if( pExpr->pSelect ){ + aff = sqlite3CompareAffinity(pExpr->pSelect->pEList->a[0].pExpr, aff); + } + else if( !aff ){ + aff = SQLITE_AFF_NONE; + } + return aff; +} + +/* +** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. +** idx_affinity is the affinity of an indexed column. Return true +** if the index with affinity idx_affinity may be used to implement +** the comparison in pExpr. +*/ +int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ + char aff = comparisonAffinity(pExpr); + switch( aff ){ + case SQLITE_AFF_NONE: + return 1; + case SQLITE_AFF_TEXT: + return idx_affinity==SQLITE_AFF_TEXT; + default: + return sqlite3IsNumericAffinity(idx_affinity); + } +} + +/* +** Return the P1 value that should be used for a binary comparison +** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. +** If jumpIfNull is true, then set the low byte of the returned +** P1 value to tell the opcode to jump if either expression +** evaluates to NULL. +*/ +static int binaryCompareP1(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){ + char aff = sqlite3ExprAffinity(pExpr2); + return ((int)sqlite3CompareAffinity(pExpr1, aff))+(jumpIfNull?0x100:0); +} + +/* +** Return a pointer to the collation sequence that should be used by +** a binary comparison operator comparing pLeft and pRight. +** +** If the left hand expression has a collating sequence type, then it is +** used. Otherwise the collation sequence for the right hand expression +** is used, or the default (BINARY) if neither expression has a collating +** type. +** +** Argument pRight (but not pLeft) may be a null pointer. In this case, +** it is not considered. +*/ +CollSeq *sqlite3BinaryCompareCollSeq( + Parse *pParse, + Expr *pLeft, + Expr *pRight +){ + CollSeq *pColl; + assert( pLeft ); + if( pLeft->flags & EP_ExpCollate ){ + assert( pLeft->pColl ); + pColl = pLeft->pColl; + }else if( pRight && pRight->flags & EP_ExpCollate ){ + assert( pRight->pColl ); + pColl = pRight->pColl; + }else{ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + if( !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + } + } + return pColl; +} + +/* +** Generate code for a comparison operator. +*/ +static int codeCompare( + Parse *pParse, /* The parsing (and code generating) context */ + Expr *pLeft, /* The left operand */ + Expr *pRight, /* The right operand */ + int opcode, /* The comparison opcode */ + int dest, /* Jump here if true. */ + int jumpIfNull /* If true, jump if either operand is NULL */ +){ + int p1 = binaryCompareP1(pLeft, pRight, jumpIfNull); + CollSeq *p3 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + return sqlite3VdbeOp3(pParse->pVdbe, opcode, p1, dest, (void*)p3, P3_COLLSEQ); +} + +/* +** Construct a new expression node and return a pointer to it. Memory +** for this node is obtained from sqlite3_malloc(). The calling function +** is responsible for making sure the node eventually gets freed. +*/ +Expr *sqlite3Expr( + sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ + int op, /* Expression opcode */ + Expr *pLeft, /* Left operand */ + Expr *pRight, /* Right operand */ + const Token *pToken /* Argument token */ +){ + Expr *pNew; + pNew = sqlite3DbMallocZero(db, sizeof(Expr)); + if( pNew==0 ){ + /* When malloc fails, delete pLeft and pRight. Expressions passed to + ** this function must always be allocated with sqlite3Expr() for this + ** reason. + */ + sqlite3ExprDelete(pLeft); + sqlite3ExprDelete(pRight); + return 0; + } + pNew->op = op; + pNew->pLeft = pLeft; + pNew->pRight = pRight; + pNew->iAgg = -1; + if( pToken ){ + assert( pToken->dyn==0 ); + pNew->span = pNew->token = *pToken; + }else if( pLeft ){ + if( pRight ){ + sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span); + if( pRight->flags & EP_ExpCollate ){ + pNew->flags |= EP_ExpCollate; + pNew->pColl = pRight->pColl; + } + } + if( pLeft->flags & EP_ExpCollate ){ + pNew->flags |= EP_ExpCollate; + pNew->pColl = pLeft->pColl; + } + } + + sqlite3ExprSetHeight(pNew); + return pNew; +} + +/* +** Works like sqlite3Expr() except that it takes an extra Parse* +** argument and notifies the associated connection object if malloc fails. +*/ +Expr *sqlite3PExpr( + Parse *pParse, /* Parsing context */ + int op, /* Expression opcode */ + Expr *pLeft, /* Left operand */ + Expr *pRight, /* Right operand */ + const Token *pToken /* Argument token */ +){ + return sqlite3Expr(pParse->db, op, pLeft, pRight, pToken); +} + +/* +** When doing a nested parse, you can include terms in an expression +** that look like this: #0 #1 #2 ... These terms refer to elements +** on the stack. "#0" means the top of the stack. +** "#1" means the next down on the stack. And so forth. +** +** This routine is called by the parser to deal with on of those terms. +** It immediately generates code to store the value in a memory location. +** The returns an expression that will code to extract the value from +** that memory location as needed. +*/ +Expr *sqlite3RegisterExpr(Parse *pParse, Token *pToken){ + Vdbe *v = pParse->pVdbe; + Expr *p; + int depth; + if( pParse->nested==0 ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken); + return sqlite3PExpr(pParse, TK_NULL, 0, 0, 0); + } + if( v==0 ) return 0; + p = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, pToken); + if( p==0 ){ + return 0; /* Malloc failed */ + } + depth = atoi((char*)&pToken->z[1]); + p->iTable = pParse->nMem++; + sqlite3VdbeAddOp(v, OP_Dup, depth, 0); + sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1); + return p; +} + +/* +** Join two expressions using an AND operator. If either expression is +** NULL, then just return the other expression. +*/ +Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ + if( pLeft==0 ){ + return pRight; + }else if( pRight==0 ){ + return pLeft; + }else{ + return sqlite3Expr(db, TK_AND, pLeft, pRight, 0); + } +} + +/* +** Set the Expr.span field of the given expression to span all +** text between the two given tokens. +*/ +void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ + assert( pRight!=0 ); + assert( pLeft!=0 ); + if( pExpr && pRight->z && pLeft->z ){ + assert( pLeft->dyn==0 || pLeft->z[pLeft->n]==0 ); + if( pLeft->dyn==0 && pRight->dyn==0 ){ + pExpr->span.z = pLeft->z; + pExpr->span.n = pRight->n + (pRight->z - pLeft->z); + }else{ + pExpr->span.z = 0; + } + } +} + +/* +** Construct a new expression node for a function with multiple +** arguments. +*/ +Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ + Expr *pNew; + assert( pToken ); + pNew = sqlite3DbMallocZero(pParse->db, sizeof(Expr) ); + if( pNew==0 ){ + sqlite3ExprListDelete(pList); /* Avoid leaking memory when malloc fails */ + return 0; + } + pNew->op = TK_FUNCTION; + pNew->pList = pList; + assert( pToken->dyn==0 ); + pNew->token = *pToken; + pNew->span = pNew->token; + + sqlite3ExprSetHeight(pNew); + return pNew; +} + +/* +** Assign a variable number to an expression that encodes a wildcard +** in the original SQL statement. +** +** Wildcards consisting of a single "?" are assigned the next sequential +** variable number. +** +** Wildcards of the form "?nnn" are assigned the number "nnn". We make +** sure "nnn" is not too be to avoid a denial of service attack when +** the SQL statement comes from an external source. +** +** Wildcards of the form ":aaa" or "$aaa" are assigned the same number +** as the previous instance of the same wildcard. Or if this is the first +** instance of the wildcard, the next sequenial variable number is +** assigned. +*/ +void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ + Token *pToken; + sqlite3 *db = pParse->db; + + if( pExpr==0 ) return; + pToken = &pExpr->token; + assert( pToken->n>=1 ); + assert( pToken->z!=0 ); + assert( pToken->z[0]!=0 ); + if( pToken->n==1 ){ + /* Wildcard of the form "?". Assign the next variable number */ + pExpr->iTable = ++pParse->nVar; + }else if( pToken->z[0]=='?' ){ + /* Wildcard of the form "?nnn". Convert "nnn" to an integer and + ** use it as the variable number */ + int i; + pExpr->iTable = i = atoi((char*)&pToken->z[1]); + if( i<1 || i>SQLITE_MAX_VARIABLE_NUMBER ){ + sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", + SQLITE_MAX_VARIABLE_NUMBER); + } + if( i>pParse->nVar ){ + pParse->nVar = i; + } + }else{ + /* Wildcards of the form ":aaa" or "$aaa". Reuse the same variable + ** number as the prior appearance of the same name, or if the name + ** has never appeared before, reuse the same variable number + */ + int i, n; + n = pToken->n; + for(i=0; inVarExpr; i++){ + Expr *pE; + if( (pE = pParse->apVarExpr[i])!=0 + && pE->token.n==n + && memcmp(pE->token.z, pToken->z, n)==0 ){ + pExpr->iTable = pE->iTable; + break; + } + } + if( i>=pParse->nVarExpr ){ + pExpr->iTable = ++pParse->nVar; + if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){ + pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10; + pParse->apVarExpr = + sqlite3DbReallocOrFree( + db, + pParse->apVarExpr, + pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0]) + ); + } + if( !db->mallocFailed ){ + assert( pParse->apVarExpr!=0 ); + pParse->apVarExpr[pParse->nVarExpr++] = pExpr; + } + } + } + if( !pParse->nErr && pParse->nVar>SQLITE_MAX_VARIABLE_NUMBER ){ + sqlite3ErrorMsg(pParse, "too many SQL variables"); + } +} + +/* +** Recursively delete an expression tree. +*/ +void sqlite3ExprDelete(Expr *p){ + if( p==0 ) return; + if( p->span.dyn ) sqlite3_free((char*)p->span.z); + if( p->token.dyn ) sqlite3_free((char*)p->token.z); + sqlite3ExprDelete(p->pLeft); + sqlite3ExprDelete(p->pRight); + sqlite3ExprListDelete(p->pList); + sqlite3SelectDelete(p->pSelect); + sqlite3_free(p); +} + +/* +** The Expr.token field might be a string literal that is quoted. +** If so, remove the quotation marks. +*/ +void sqlite3DequoteExpr(sqlite3 *db, Expr *p){ + if( ExprHasAnyProperty(p, EP_Dequoted) ){ + return; + } + ExprSetProperty(p, EP_Dequoted); + if( p->token.dyn==0 ){ + sqlite3TokenCopy(db, &p->token, &p->token); + } + sqlite3Dequote((char*)p->token.z); +} + + +/* +** The following group of routines make deep copies of expressions, +** expression lists, ID lists, and select statements. The copies can +** be deleted (by being passed to their respective ...Delete() routines) +** without effecting the originals. +** +** The expression list, ID, and source lists return by sqlite3ExprListDup(), +** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded +** by subsequent calls to sqlite*ListAppend() routines. +** +** Any tables that the SrcList might point to are not duplicated. +*/ +Expr *sqlite3ExprDup(sqlite3 *db, Expr *p){ + Expr *pNew; + if( p==0 ) return 0; + pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); + if( pNew==0 ) return 0; + memcpy(pNew, p, sizeof(*pNew)); + if( p->token.z!=0 ){ + pNew->token.z = (u8*)sqlite3DbStrNDup(db, (char*)p->token.z, p->token.n); + pNew->token.dyn = 1; + }else{ + assert( pNew->token.z==0 ); + } + pNew->span.z = 0; + pNew->pLeft = sqlite3ExprDup(db, p->pLeft); + pNew->pRight = sqlite3ExprDup(db, p->pRight); + pNew->pList = sqlite3ExprListDup(db, p->pList); + pNew->pSelect = sqlite3SelectDup(db, p->pSelect); + return pNew; +} +void sqlite3TokenCopy(sqlite3 *db, Token *pTo, Token *pFrom){ + if( pTo->dyn ) sqlite3_free((char*)pTo->z); + if( pFrom->z ){ + pTo->n = pFrom->n; + pTo->z = (u8*)sqlite3DbStrNDup(db, (char*)pFrom->z, pFrom->n); + pTo->dyn = 1; + }else{ + pTo->z = 0; + } +} +ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p){ + ExprList *pNew; + struct ExprList_item *pItem, *pOldItem; + int i; + if( p==0 ) return 0; + pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); + if( pNew==0 ) return 0; + pNew->iECursor = 0; + pNew->nExpr = pNew->nAlloc = p->nExpr; + pNew->a = pItem = sqlite3DbMallocRaw(db, p->nExpr*sizeof(p->a[0]) ); + if( pItem==0 ){ + sqlite3_free(pNew); + return 0; + } + pOldItem = p->a; + for(i=0; inExpr; i++, pItem++, pOldItem++){ + Expr *pNewExpr, *pOldExpr; + pItem->pExpr = pNewExpr = sqlite3ExprDup(db, pOldExpr = pOldItem->pExpr); + if( pOldExpr->span.z!=0 && pNewExpr ){ + /* Always make a copy of the span for top-level expressions in the + ** expression list. The logic in SELECT processing that determines + ** the names of columns in the result set needs this information */ + sqlite3TokenCopy(db, &pNewExpr->span, &pOldExpr->span); + } + assert( pNewExpr==0 || pNewExpr->span.z!=0 + || pOldExpr->span.z==0 + || db->mallocFailed ); + pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pItem->sortOrder = pOldItem->sortOrder; + pItem->isAgg = pOldItem->isAgg; + pItem->done = 0; + } + return pNew; +} + +/* +** If cursors, triggers, views and subqueries are all omitted from +** the build, then none of the following routines, except for +** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes +** called with a NULL argument. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ + || !defined(SQLITE_OMIT_SUBQUERY) +SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p){ + SrcList *pNew; + int i; + int nByte; + if( p==0 ) return 0; + nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); + pNew = sqlite3DbMallocRaw(db, nByte ); + if( pNew==0 ) return 0; + pNew->nSrc = pNew->nAlloc = p->nSrc; + for(i=0; inSrc; i++){ + struct SrcList_item *pNewItem = &pNew->a[i]; + struct SrcList_item *pOldItem = &p->a[i]; + Table *pTab; + pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); + pNewItem->jointype = pOldItem->jointype; + pNewItem->iCursor = pOldItem->iCursor; + pNewItem->isPopulated = pOldItem->isPopulated; + pTab = pNewItem->pTab = pOldItem->pTab; + if( pTab ){ + pTab->nRef++; + } + pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect); + pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn); + pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); + pNewItem->colUsed = pOldItem->colUsed; + } + return pNew; +} +IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ + IdList *pNew; + int i; + if( p==0 ) return 0; + pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); + if( pNew==0 ) return 0; + pNew->nId = pNew->nAlloc = p->nId; + pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) ); + if( pNew->a==0 ){ + sqlite3_free(pNew); + return 0; + } + for(i=0; inId; i++){ + struct IdList_item *pNewItem = &pNew->a[i]; + struct IdList_item *pOldItem = &p->a[i]; + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->idx = pOldItem->idx; + } + return pNew; +} +Select *sqlite3SelectDup(sqlite3 *db, Select *p){ + Select *pNew; + if( p==0 ) return 0; + pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); + if( pNew==0 ) return 0; + pNew->isDistinct = p->isDistinct; + pNew->pEList = sqlite3ExprListDup(db, p->pEList); + pNew->pSrc = sqlite3SrcListDup(db, p->pSrc); + pNew->pWhere = sqlite3ExprDup(db, p->pWhere); + pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy); + pNew->pHaving = sqlite3ExprDup(db, p->pHaving); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy); + pNew->op = p->op; + pNew->pPrior = sqlite3SelectDup(db, p->pPrior); + pNew->pLimit = sqlite3ExprDup(db, p->pLimit); + pNew->pOffset = sqlite3ExprDup(db, p->pOffset); + pNew->iLimit = -1; + pNew->iOffset = -1; + pNew->isResolved = p->isResolved; + pNew->isAgg = p->isAgg; + pNew->usesEphm = 0; + pNew->disallowOrderBy = 0; + pNew->pRightmost = 0; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->addrOpenEphm[2] = -1; + return pNew; +} +#else +Select *sqlite3SelectDup(sqlite3 *db, Select *p){ + assert( p==0 ); + return 0; +} +#endif + + +/* +** Add a new element to the end of an expression list. If pList is +** initially NULL, then create a new expression list. +*/ +ExprList *sqlite3ExprListAppend( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + Expr *pExpr, /* Expression to be appended */ + Token *pName /* AS keyword for the expression */ +){ + sqlite3 *db = pParse->db; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(ExprList) ); + if( pList==0 ){ + goto no_mem; + } + assert( pList->nAlloc==0 ); + } + if( pList->nAlloc<=pList->nExpr ){ + struct ExprList_item *a; + int n = pList->nAlloc*2 + 4; + a = sqlite3DbRealloc(db, pList->a, n*sizeof(pList->a[0])); + if( a==0 ){ + goto no_mem; + } + pList->a = a; + pList->nAlloc = n; + } + assert( pList->a!=0 ); + if( pExpr || pName ){ + struct ExprList_item *pItem = &pList->a[pList->nExpr++]; + memset(pItem, 0, sizeof(*pItem)); + pItem->zName = sqlite3NameFromToken(db, pName); + pItem->pExpr = pExpr; + } + return pList; + +no_mem: + /* Avoid leaking memory if malloc has failed. */ + sqlite3ExprDelete(pExpr); + sqlite3ExprListDelete(pList); + return 0; +} + +/* +** If the expression list pEList contains more than iLimit elements, +** leave an error message in pParse. +*/ +void sqlite3ExprListCheckLength( + Parse *pParse, + ExprList *pEList, + int iLimit, + const char *zObject +){ + if( pEList && pEList->nExpr>iLimit ){ + sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); + } +} + + +#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 +/* The following three functions, heightOfExpr(), heightOfExprList() +** and heightOfSelect(), are used to determine the maximum height +** of any expression tree referenced by the structure passed as the +** first argument. +** +** If this maximum height is greater than the current value pointed +** to by pnHeight, the second parameter, then set *pnHeight to that +** value. +*/ +static void heightOfExpr(Expr *p, int *pnHeight){ + if( p ){ + if( p->nHeight>*pnHeight ){ + *pnHeight = p->nHeight; + } + } +} +static void heightOfExprList(ExprList *p, int *pnHeight){ + if( p ){ + int i; + for(i=0; inExpr; i++){ + heightOfExpr(p->a[i].pExpr, pnHeight); + } + } +} +static void heightOfSelect(Select *p, int *pnHeight){ + if( p ){ + heightOfExpr(p->pWhere, pnHeight); + heightOfExpr(p->pHaving, pnHeight); + heightOfExpr(p->pLimit, pnHeight); + heightOfExpr(p->pOffset, pnHeight); + heightOfExprList(p->pEList, pnHeight); + heightOfExprList(p->pGroupBy, pnHeight); + heightOfExprList(p->pOrderBy, pnHeight); + heightOfSelect(p->pPrior, pnHeight); + } +} + +/* +** Set the Expr.nHeight variable in the structure passed as an +** argument. An expression with no children, Expr.pList or +** Expr.pSelect member has a height of 1. Any other expression +** has a height equal to the maximum height of any other +** referenced Expr plus one. +*/ +void sqlite3ExprSetHeight(Expr *p){ + int nHeight = 0; + heightOfExpr(p->pLeft, &nHeight); + heightOfExpr(p->pRight, &nHeight); + heightOfExprList(p->pList, &nHeight); + heightOfSelect(p->pSelect, &nHeight); + p->nHeight = nHeight + 1; +} + +/* +** Return the maximum height of any expression tree referenced +** by the select statement passed as an argument. +*/ +int sqlite3SelectExprHeight(Select *p){ + int nHeight = 0; + heightOfSelect(p, &nHeight); + return nHeight; +} +#endif + +/* +** Delete an entire expression list. +*/ +void sqlite3ExprListDelete(ExprList *pList){ + int i; + struct ExprList_item *pItem; + if( pList==0 ) return; + assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) ); + assert( pList->nExpr<=pList->nAlloc ); + for(pItem=pList->a, i=0; inExpr; i++, pItem++){ + sqlite3ExprDelete(pItem->pExpr); + sqlite3_free(pItem->zName); + } + sqlite3_free(pList->a); + sqlite3_free(pList); +} + +/* +** Walk an expression tree. Call xFunc for each node visited. +** +** The return value from xFunc determines whether the tree walk continues. +** 0 means continue walking the tree. 1 means do not walk children +** of the current node but continue with siblings. 2 means abandon +** the tree walk completely. +** +** The return value from this routine is 1 to abandon the tree walk +** and 0 to continue. +** +** NOTICE: This routine does *not* descend into subqueries. +*/ +static int walkExprList(ExprList *, int (*)(void *, Expr*), void *); +static int walkExprTree(Expr *pExpr, int (*xFunc)(void*,Expr*), void *pArg){ + int rc; + if( pExpr==0 ) return 0; + rc = (*xFunc)(pArg, pExpr); + if( rc==0 ){ + if( walkExprTree(pExpr->pLeft, xFunc, pArg) ) return 1; + if( walkExprTree(pExpr->pRight, xFunc, pArg) ) return 1; + if( walkExprList(pExpr->pList, xFunc, pArg) ) return 1; + } + return rc>1; +} + +/* +** Call walkExprTree() for every expression in list p. +*/ +static int walkExprList(ExprList *p, int (*xFunc)(void *, Expr*), void *pArg){ + int i; + struct ExprList_item *pItem; + if( !p ) return 0; + for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){ + if( walkExprTree(pItem->pExpr, xFunc, pArg) ) return 1; + } + return 0; +} + +/* +** Call walkExprTree() for every expression in Select p, not including +** expressions that are part of sub-selects in any FROM clause or the LIMIT +** or OFFSET expressions.. +*/ +static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){ + walkExprList(p->pEList, xFunc, pArg); + walkExprTree(p->pWhere, xFunc, pArg); + walkExprList(p->pGroupBy, xFunc, pArg); + walkExprTree(p->pHaving, xFunc, pArg); + walkExprList(p->pOrderBy, xFunc, pArg); + if( p->pPrior ){ + walkSelectExpr(p->pPrior, xFunc, pArg); + } + return 0; +} + + +/* +** This routine is designed as an xFunc for walkExprTree(). +** +** pArg is really a pointer to an integer. If we can tell by looking +** at pExpr that the expression that contains pExpr is not a constant +** expression, then set *pArg to 0 and return 2 to abandon the tree walk. +** If pExpr does does not disqualify the expression from being a constant +** then do nothing. +** +** After walking the whole tree, if no nodes are found that disqualify +** the expression as constant, then we assume the whole expression +** is constant. See sqlite3ExprIsConstant() for additional information. +*/ +static int exprNodeIsConstant(void *pArg, Expr *pExpr){ + int *pN = (int*)pArg; + + /* If *pArg is 3 then any term of the expression that comes from + ** the ON or USING clauses of a join disqualifies the expression + ** from being considered constant. */ + if( (*pN)==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){ + *pN = 0; + return 2; + } + + switch( pExpr->op ){ + /* Consider functions to be constant if all their arguments are constant + ** and *pArg==2 */ + case TK_FUNCTION: + if( (*pN)==2 ) return 0; + /* Fall through */ + case TK_ID: + case TK_COLUMN: + case TK_DOT: + case TK_AGG_FUNCTION: + case TK_AGG_COLUMN: +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: + case TK_EXISTS: +#endif + *pN = 0; + return 2; + case TK_IN: + if( pExpr->pSelect ){ + *pN = 0; + return 2; + } + default: + return 0; + } +} + +/* +** Walk an expression tree. Return 1 if the expression is constant +** and 0 if it involves variables or function calls. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +int sqlite3ExprIsConstant(Expr *p){ + int isConst = 1; + walkExprTree(p, exprNodeIsConstant, &isConst); + return isConst; +} + +/* +** Walk an expression tree. Return 1 if the expression is constant +** that does no originate from the ON or USING clauses of a join. +** Return 0 if it involves variables or function calls or terms from +** an ON or USING clause. +*/ +int sqlite3ExprIsConstantNotJoin(Expr *p){ + int isConst = 3; + walkExprTree(p, exprNodeIsConstant, &isConst); + return isConst!=0; +} + +/* +** Walk an expression tree. Return 1 if the expression is constant +** or a function call with constant arguments. Return and 0 if there +** are any variables. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +int sqlite3ExprIsConstantOrFunction(Expr *p){ + int isConst = 2; + walkExprTree(p, exprNodeIsConstant, &isConst); + return isConst!=0; +} + +/* +** If the expression p codes a constant integer that is small enough +** to fit in a 32-bit integer, return 1 and put the value of the integer +** in *pValue. If the expression is not an integer or if it is too big +** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. +*/ +int sqlite3ExprIsInteger(Expr *p, int *pValue){ + switch( p->op ){ + case TK_INTEGER: { + if( sqlite3GetInt32((char*)p->token.z, pValue) ){ + return 1; + } + break; + } + case TK_UPLUS: { + return sqlite3ExprIsInteger(p->pLeft, pValue); + } + case TK_UMINUS: { + int v; + if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + *pValue = -v; + return 1; + } + break; + } + default: break; + } + return 0; +} + +/* +** Return TRUE if the given string is a row-id column name. +*/ +int sqlite3IsRowid(const char *z){ + if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; + if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; + if( sqlite3StrICmp(z, "OID")==0 ) return 1; + return 0; +} + +/* +** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up +** that name in the set of source tables in pSrcList and make the pExpr +** expression node refer back to that source column. The following changes +** are made to pExpr: +** +** pExpr->iDb Set the index in db->aDb[] of the database holding +** the table. +** pExpr->iTable Set to the cursor number for the table obtained +** from pSrcList. +** pExpr->iColumn Set to the column number within the table. +** pExpr->op Set to TK_COLUMN. +** pExpr->pLeft Any expression this points to is deleted +** pExpr->pRight Any expression this points to is deleted. +** +** The pDbToken is the name of the database (the "X"). This value may be +** NULL meaning that name is of the form Y.Z or Z. Any available database +** can be used. The pTableToken is the name of the table (the "Y"). This +** value can be NULL if pDbToken is also NULL. If pTableToken is NULL it +** means that the form of the name is Z and that columns from any table +** can be used. +** +** If the name cannot be resolved unambiguously, leave an error message +** in pParse and return non-zero. Return zero on success. +*/ +static int lookupName( + Parse *pParse, /* The parsing context */ + Token *pDbToken, /* Name of the database containing table, or NULL */ + Token *pTableToken, /* Name of table containing column, or NULL */ + Token *pColumnToken, /* Name of the column. */ + NameContext *pNC, /* The name context used to resolve the name */ + Expr *pExpr /* Make this EXPR node point to the selected column */ +){ + char *zDb = 0; /* Name of the database. The "X" in X.Y.Z */ + char *zTab = 0; /* Name of the table. The "Y" in X.Y.Z or Y.Z */ + char *zCol = 0; /* Name of the column. The "Z" */ + int i, j; /* Loop counters */ + int cnt = 0; /* Number of matching column names */ + int cntTab = 0; /* Number of matching table names */ + sqlite3 *db = pParse->db; /* The database */ + struct SrcList_item *pItem; /* Use for looping over pSrcList items */ + struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ + NameContext *pTopNC = pNC; /* First namecontext in the list */ + Schema *pSchema = 0; /* Schema of the expression */ + + assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */ + zDb = sqlite3NameFromToken(db, pDbToken); + zTab = sqlite3NameFromToken(db, pTableToken); + zCol = sqlite3NameFromToken(db, pColumnToken); + if( db->mallocFailed ){ + goto lookupname_end; + } + + pExpr->iTable = -1; + while( pNC && cnt==0 ){ + ExprList *pEList; + SrcList *pSrcList = pNC->pSrcList; + + if( pSrcList ){ + for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ + Table *pTab; + int iDb; + Column *pCol; + + pTab = pItem->pTab; + assert( pTab!=0 ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( pTab->nCol>0 ); + if( zTab ){ + if( pItem->zAlias ){ + char *zTabName = pItem->zAlias; + if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue; + }else{ + char *zTabName = pTab->zName; + if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue; + if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){ + continue; + } + } + } + if( 0==(cntTab++) ){ + pExpr->iTable = pItem->iCursor; + pSchema = pTab->pSchema; + pMatch = pItem; + } + for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ + if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ + const char *zColl = pTab->aCol[j].zColl; + IdList *pUsing; + cnt++; + pExpr->iTable = pItem->iCursor; + pMatch = pItem; + pSchema = pTab->pSchema; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : j; + pExpr->affinity = pTab->aCol[j].affinity; + if( (pExpr->flags & EP_ExpCollate)==0 ){ + pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0); + } + if( inSrc-1 ){ + if( pItem[1].jointype & JT_NATURAL ){ + /* If this match occurred in the left table of a natural join, + ** then skip the right table to avoid a duplicate match */ + pItem++; + i++; + }else if( (pUsing = pItem[1].pUsing)!=0 ){ + /* If this match occurs on a column that is in the USING clause + ** of a join, skip the search of the right table of the join + ** to avoid a duplicate match there. */ + int k; + for(k=0; knId; k++){ + if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){ + pItem++; + i++; + break; + } + } + } + } + break; + } + } + } + } + +#ifndef SQLITE_OMIT_TRIGGER + /* If we have not already resolved the name, then maybe + ** it is a new.* or old.* trigger argument reference + */ + if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){ + TriggerStack *pTriggerStack = pParse->trigStack; + Table *pTab = 0; + if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){ + pExpr->iTable = pTriggerStack->newIdx; + assert( pTriggerStack->pTab ); + pTab = pTriggerStack->pTab; + }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab)==0 ){ + pExpr->iTable = pTriggerStack->oldIdx; + assert( pTriggerStack->pTab ); + pTab = pTriggerStack->pTab; + } + + if( pTab ){ + int iCol; + Column *pCol = pTab->aCol; + + pSchema = pTab->pSchema; + cntTab++; + for(iCol=0; iCol < pTab->nCol; iCol++, pCol++) { + if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ + const char *zColl = pTab->aCol[iCol].zColl; + cnt++; + pExpr->iColumn = iCol==pTab->iPKey ? -1 : iCol; + pExpr->affinity = pTab->aCol[iCol].affinity; + if( (pExpr->flags & EP_ExpCollate)==0 ){ + pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0); + } + pExpr->pTab = pTab; + break; + } + } + } + } +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ + + /* + ** Perhaps the name is a reference to the ROWID + */ + if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ + cnt = 1; + pExpr->iColumn = -1; + pExpr->affinity = SQLITE_AFF_INTEGER; + } + + /* + ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z + ** might refer to an result-set alias. This happens, for example, when + ** we are resolving names in the WHERE clause of the following command: + ** + ** SELECT a+b AS x FROM table WHERE x<10; + ** + ** In cases like this, replace pExpr with a copy of the expression that + ** forms the result set entry ("a+b" in the example) and return immediately. + ** Note that the expression in the result set should have already been + ** resolved by the time the WHERE clause is resolved. + */ + if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){ + for(j=0; jnExpr; j++){ + char *zAs = pEList->a[j].zName; + if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + Expr *pDup, *pOrig; + assert( pExpr->pLeft==0 && pExpr->pRight==0 ); + assert( pExpr->pList==0 ); + assert( pExpr->pSelect==0 ); + pOrig = pEList->a[j].pExpr; + if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); + sqlite3_free(zCol); + return 2; + } + pDup = sqlite3ExprDup(db, pOrig); + if( pExpr->flags & EP_ExpCollate ){ + pDup->pColl = pExpr->pColl; + pDup->flags |= EP_ExpCollate; + } + if( pExpr->span.dyn ) sqlite3_free((char*)pExpr->span.z); + if( pExpr->token.dyn ) sqlite3_free((char*)pExpr->token.z); + memcpy(pExpr, pDup, sizeof(*pExpr)); + sqlite3_free(pDup); + cnt = 1; + pMatch = 0; + assert( zTab==0 && zDb==0 ); + goto lookupname_end_2; + } + } + } + + /* Advance to the next name context. The loop will exit when either + ** we have a match (cnt>0) or when we run out of name contexts. + */ + if( cnt==0 ){ + pNC = pNC->pNext; + } + } + + /* + ** If X and Y are NULL (in other words if only the column name Z is + ** supplied) and the value of Z is enclosed in double-quotes, then + ** Z is a string literal if it doesn't match any column names. In that + ** case, we need to return right away and not make any changes to + ** pExpr. + ** + ** Because no reference was made to outer contexts, the pNC->nRef + ** fields are not changed in any context. + */ + if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){ + sqlite3_free(zCol); + return 0; + } + + /* + ** cnt==0 means there was not match. cnt>1 means there were two or + ** more matches. Either way, we have an error. + */ + if( cnt!=1 ){ + char *z = 0; + char *zErr; + zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s"; + if( zDb ){ + sqlite3SetString(&z, zDb, ".", zTab, ".", zCol, (char*)0); + }else if( zTab ){ + sqlite3SetString(&z, zTab, ".", zCol, (char*)0); + }else{ + z = sqlite3StrDup(zCol); + } + if( z ){ + sqlite3ErrorMsg(pParse, zErr, z); + sqlite3_free(z); + pTopNC->nErr++; + }else{ + db->mallocFailed = 1; + } + } + + /* If a column from a table in pSrcList is referenced, then record + ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes + ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the + ** column number is greater than the number of bits in the bitmask + ** then set the high-order bit of the bitmask. + */ + if( pExpr->iColumn>=0 && pMatch!=0 ){ + int n = pExpr->iColumn; + if( n>=sizeof(Bitmask)*8 ){ + n = sizeof(Bitmask)*8-1; + } + assert( pMatch->iCursor==pExpr->iTable ); + pMatch->colUsed |= ((Bitmask)1)<pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(pExpr->pRight); + pExpr->pRight = 0; + pExpr->op = TK_COLUMN; +lookupname_end_2: + sqlite3_free(zCol); + if( cnt==1 ){ + assert( pNC!=0 ); + sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); + if( pMatch && !pMatch->pSelect ){ + pExpr->pTab = pMatch->pTab; + } + /* Increment the nRef value on all name contexts from TopNC up to + ** the point where the name matched. */ + for(;;){ + assert( pTopNC!=0 ); + pTopNC->nRef++; + if( pTopNC==pNC ) break; + pTopNC = pTopNC->pNext; + } + return 0; + } else { + return 1; + } +} + +/* +** This routine is designed as an xFunc for walkExprTree(). +** +** Resolve symbolic names into TK_COLUMN operators for the current +** node in the expression tree. Return 0 to continue the search down +** the tree or 2 to abort the tree walk. +** +** This routine also does error checking and name resolution for +** function names. The operator for aggregate functions is changed +** to TK_AGG_FUNCTION. +*/ +static int nameResolverStep(void *pArg, Expr *pExpr){ + NameContext *pNC = (NameContext*)pArg; + Parse *pParse; + + if( pExpr==0 ) return 1; + assert( pNC!=0 ); + pParse = pNC->pParse; + + if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return 1; + ExprSetProperty(pExpr, EP_Resolved); +#ifndef NDEBUG + if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ + SrcList *pSrcList = pNC->pSrcList; + int i; + for(i=0; ipSrcList->nSrc; i++){ + assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursornTab); + } + } +#endif + switch( pExpr->op ){ + /* Double-quoted strings (ex: "abc") are used as identifiers if + ** possible. Otherwise they remain as strings. Single-quoted + ** strings (ex: 'abc') are always string literals. + */ + case TK_STRING: { + if( pExpr->token.z[0]=='\'' ) break; + /* Fall thru into the TK_ID case if this is a double-quoted string */ + } + /* A lone identifier is the name of a column. + */ + case TK_ID: { + lookupName(pParse, 0, 0, &pExpr->token, pNC, pExpr); + return 1; + } + + /* A table name and column name: ID.ID + ** Or a database, table and column: ID.ID.ID + */ + case TK_DOT: { + Token *pColumn; + Token *pTable; + Token *pDb; + Expr *pRight; + + /* if( pSrcList==0 ) break; */ + pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + pDb = 0; + pTable = &pExpr->pLeft->token; + pColumn = &pRight->token; + }else{ + assert( pRight->op==TK_DOT ); + pDb = &pExpr->pLeft->token; + pTable = &pRight->pLeft->token; + pColumn = &pRight->pRight->token; + } + lookupName(pParse, pDb, pTable, pColumn, pNC, pExpr); + return 1; + } + + /* Resolve function names + */ + case TK_CONST_FUNC: + case TK_FUNCTION: { + ExprList *pList = pExpr->pList; /* The argument list */ + int n = pList ? pList->nExpr : 0; /* Number of arguments */ + int no_such_func = 0; /* True if no such function exists */ + int wrong_num_args = 0; /* True if wrong number of arguments */ + int is_agg = 0; /* True if is an aggregate function */ + int i; + int auth; /* Authorization to use the function */ + int nId; /* Number of characters in function name */ + const char *zId; /* The function name. */ + FuncDef *pDef; /* Information about the function */ + int enc = ENC(pParse->db); /* The database encoding */ + + zId = (char*)pExpr->token.z; + nId = pExpr->token.n; + pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); + if( pDef==0 ){ + pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0); + if( pDef==0 ){ + no_such_func = 1; + }else{ + wrong_num_args = 1; + } + }else{ + is_agg = pDef->xFunc==0; + } +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pDef ){ + auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); + if( auth!=SQLITE_OK ){ + if( auth==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized to use function: %s", + pDef->zName); + pNC->nErr++; + } + pExpr->op = TK_NULL; + return 1; + } + } +#endif + if( is_agg && !pNC->allowAgg ){ + sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); + pNC->nErr++; + is_agg = 0; + }else if( no_such_func ){ + sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); + pNC->nErr++; + }else if( wrong_num_args ){ + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", + nId, zId); + pNC->nErr++; + } + if( is_agg ){ + pExpr->op = TK_AGG_FUNCTION; + pNC->hasAgg = 1; + } + if( is_agg ) pNC->allowAgg = 0; + for(i=0; pNC->nErr==0 && ia[i].pExpr, nameResolverStep, pNC); + } + if( is_agg ) pNC->allowAgg = 1; + /* FIX ME: Compute pExpr->affinity based on the expected return + ** type of the function + */ + return is_agg; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: + case TK_EXISTS: +#endif + case TK_IN: { + if( pExpr->pSelect ){ + int nRef = pNC->nRef; +#ifndef SQLITE_OMIT_CHECK + if( pNC->isCheck ){ + sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints"); + } +#endif + sqlite3SelectResolve(pParse, pExpr->pSelect, pNC); + assert( pNC->nRef>=nRef ); + if( nRef!=pNC->nRef ){ + ExprSetProperty(pExpr, EP_VarSelect); + } + } + break; + } +#ifndef SQLITE_OMIT_CHECK + case TK_VARIABLE: { + if( pNC->isCheck ){ + sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints"); + } + break; + } +#endif + } + return 0; +} + +/* +** This routine walks an expression tree and resolves references to +** table columns. Nodes of the form ID.ID or ID resolve into an +** index to the table in the table list and a column offset. The +** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable +** value is changed to the index of the referenced table in pTabList +** plus the "base" value. The base value will ultimately become the +** VDBE cursor number for a cursor that is pointing into the referenced +** table. The Expr.iColumn value is changed to the index of the column +** of the referenced table. The Expr.iColumn value for the special +** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an +** alias for ROWID. +** +** Also resolve function names and check the functions for proper +** usage. Make sure all function names are recognized and all functions +** have the correct number of arguments. Leave an error message +** in pParse->zErrMsg if anything is amiss. Return the number of errors. +** +** If the expression contains aggregate functions then set the EP_Agg +** property on the expression. +*/ +int sqlite3ExprResolveNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + Expr *pExpr /* The expression to be analyzed. */ +){ + int savedHasAgg; + if( pExpr==0 ) return 0; +#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 + if( (pExpr->nHeight+pNC->pParse->nHeight)>SQLITE_MAX_EXPR_DEPTH ){ + sqlite3ErrorMsg(pNC->pParse, + "Expression tree is too large (maximum depth %d)", + SQLITE_MAX_EXPR_DEPTH + ); + return 1; + } + pNC->pParse->nHeight += pExpr->nHeight; +#endif + savedHasAgg = pNC->hasAgg; + pNC->hasAgg = 0; + walkExprTree(pExpr, nameResolverStep, pNC); +#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 + pNC->pParse->nHeight -= pExpr->nHeight; +#endif + if( pNC->nErr>0 ){ + ExprSetProperty(pExpr, EP_Error); + } + if( pNC->hasAgg ){ + ExprSetProperty(pExpr, EP_Agg); + }else if( savedHasAgg ){ + pNC->hasAgg = 1; + } + return ExprHasProperty(pExpr, EP_Error); +} + +/* +** A pointer instance of this structure is used to pass information +** through walkExprTree into codeSubqueryStep(). +*/ +typedef struct QueryCoder QueryCoder; +struct QueryCoder { + Parse *pParse; /* The parsing context */ + NameContext *pNC; /* Namespace of first enclosing query */ +}; + + +/* +** Generate code for scalar subqueries used as an expression +** and IN operators. Examples: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** x IN (4,5,11) -- IN operator with list on right-hand side +** x IN (SELECT a FROM b) -- IN operator with subquery on the right +** +** The pExpr parameter describes the expression that contains the IN +** operator or subquery. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int testAddr = 0; /* One-time test address */ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + + + /* This code must be run in its entirety every time it is encountered + ** if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->trigStack ){ + int mem = pParse->nMem++; + sqlite3VdbeAddOp(v, OP_MemLoad, mem, 0); + testAddr = sqlite3VdbeAddOp(v, OP_If, 0, 0); + assert( testAddr>0 || pParse->db->mallocFailed ); + sqlite3VdbeAddOp(v, OP_MemInt, 1, mem); + } + + switch( pExpr->op ){ + case TK_IN: { + char affinity; + KeyInfo keyInfo; + int addr; /* Address of OP_OpenEphemeral instruction */ + + affinity = sqlite3ExprAffinity(pExpr->pLeft); + + /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' + ** expression it is handled the same way. A virtual table is + ** filled with single-field index keys representing the results + ** from the SELECT or the . + ** + ** If the 'x' expression is a column value, or the SELECT... + ** statement returns a column value, then the affinity of that + ** column is used to build the index keys. If both 'x' and the + ** SELECT... statement are columns, then numeric affinity is used + ** if either column has NUMERIC or INTEGER affinity. If neither + ** 'x' nor the SELECT... statement are columns, then numeric affinity + ** is used. + */ + pExpr->iTable = pParse->nTab++; + addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, pExpr->iTable, 0); + memset(&keyInfo, 0, sizeof(keyInfo)); + keyInfo.nField = 1; + sqlite3VdbeAddOp(v, OP_SetNumColumns, pExpr->iTable, 1); + + if( pExpr->pSelect ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + int iParm = pExpr->iTable + (((int)affinity)<<16); + ExprList *pEList; + assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); + if( sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0, 0) ){ + return; + } + pEList = pExpr->pSelect->pEList; + if( pEList && pEList->nExpr>0 ){ + keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, + pEList->a[0].pExpr); + } + }else if( pExpr->pList ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + int i; + ExprList *pList = pExpr->pList; + struct ExprList_item *pItem; + + if( !affinity ){ + affinity = SQLITE_AFF_NONE; + } + keyInfo.aColl[0] = pExpr->pLeft->pColl; + + /* Loop through each expression in . */ + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( testAddr>0 && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, testAddr-1, 3); + testAddr = 0; + } + + /* Evaluate the expression and insert it into the temp table */ + sqlite3ExprCode(pParse, pE2); + sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1); + sqlite3VdbeAddOp(v, OP_IdxInsert, pExpr->iTable, 0); + } + } + sqlite3VdbeChangeP3(v, addr, (void *)&keyInfo, P3_KEYINFO); + break; + } + + case TK_EXISTS: + case TK_SELECT: { + /* This has to be a scalar SELECT. Generate code to put the + ** value of this select in a memory cell and record the number + ** of the memory cell in iColumn. + */ + static const Token one = { (u8*)"1", 0, 1 }; + Select *pSel; + int iMem; + int sop; + + pExpr->iColumn = iMem = pParse->nMem++; + pSel = pExpr->pSelect; + if( pExpr->op==TK_SELECT ){ + sop = SRT_Mem; + sqlite3VdbeAddOp(v, OP_MemNull, iMem, 0); + VdbeComment((v, "# Init subquery result")); + }else{ + sop = SRT_Exists; + sqlite3VdbeAddOp(v, OP_MemInt, 0, iMem); + VdbeComment((v, "# Init EXISTS result")); + } + sqlite3ExprDelete(pSel->pLimit); + pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &one); + if( sqlite3Select(pParse, pSel, sop, iMem, 0, 0, 0, 0) ){ + return; + } + break; + } + } + + if( testAddr ){ + sqlite3VdbeJumpHere(v, testAddr); + } + + return; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate an instruction that will put the integer describe by +** text z[0..n-1] on the stack. +*/ +static void codeInteger(Vdbe *v, const char *z, int n){ + assert( z || v==0 || sqlite3VdbeDb(v)->mallocFailed ); + if( z ){ + int i; + if( sqlite3GetInt32(z, &i) ){ + sqlite3VdbeAddOp(v, OP_Integer, i, 0); + }else if( sqlite3FitsIn64Bits(z) ){ + sqlite3VdbeOp3(v, OP_Int64, 0, 0, z, n); + }else{ + sqlite3VdbeOp3(v, OP_Real, 0, 0, z, n); + } + } +} + + +/* +** Generate code that will extract the iColumn-th column from +** table pTab and push that column value on the stack. There +** is an open cursor to pTab in iTable. If iColumn<0 then +** code is generated that extracts the rowid. +*/ +void sqlite3ExprCodeGetColumn(Vdbe *v, Table *pTab, int iColumn, int iTable){ + if( iColumn<0 ){ + int op = (pTab && IsVirtual(pTab)) ? OP_VRowid : OP_Rowid; + sqlite3VdbeAddOp(v, op, iTable, 0); + }else if( pTab==0 ){ + sqlite3VdbeAddOp(v, OP_Column, iTable, iColumn); + }else{ + int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; + sqlite3VdbeAddOp(v, op, iTable, iColumn); + sqlite3ColumnDefault(v, pTab, iColumn); +#ifndef SQLITE_OMIT_FLOATING_POINT + if( pTab->aCol[iColumn].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp(v, OP_RealAffinity, 0, 0); + } +#endif + } +} + +/* +** Generate code into the current Vdbe to evaluate the given +** expression and leave the result on the top of stack. +** +** This code depends on the fact that certain token values (ex: TK_EQ) +** are the same as opcode values (ex: OP_Eq) that implement the corresponding +** operation. Special comments in vdbe.c and the mkopcodeh.awk script in +** the make process cause these values to align. Assert()s in the code +** below verify that the numbers are aligned correctly. +*/ +void sqlite3ExprCode(Parse *pParse, Expr *pExpr){ + Vdbe *v = pParse->pVdbe; + int op; + int stackChng = 1; /* Amount of change to stack depth */ + + if( v==0 ) return; + if( pExpr==0 ){ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + return; + } + op = pExpr->op; + switch( op ){ + case TK_AGG_COLUMN: { + AggInfo *pAggInfo = pExpr->pAggInfo; + struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; + if( !pAggInfo->directMode ){ + sqlite3VdbeAddOp(v, OP_MemLoad, pCol->iMem, 0); + break; + }else if( pAggInfo->useSortingIdx ){ + sqlite3VdbeAddOp(v, OP_Column, pAggInfo->sortingIdx, + pCol->iSorterColumn); + break; + } + /* Otherwise, fall thru into the TK_COLUMN case */ + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + assert( pParse->ckOffset>0 ); + sqlite3VdbeAddOp(v, OP_Dup, pParse->ckOffset-pExpr->iColumn-1, 1); + }else{ + sqlite3ExprCodeGetColumn(v, pExpr->pTab, pExpr->iColumn, pExpr->iTable); + } + break; + } + case TK_INTEGER: { + codeInteger(v, (char*)pExpr->token.z, pExpr->token.n); + break; + } + case TK_FLOAT: + case TK_STRING: { + assert( TK_FLOAT==OP_Real ); + assert( TK_STRING==OP_String8 ); + sqlite3DequoteExpr(pParse->db, pExpr); + sqlite3VdbeOp3(v, op, 0, 0, (char*)pExpr->token.z, pExpr->token.n); + break; + } + case TK_NULL: { + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + int n; + const char *z; + assert( TK_BLOB==OP_HexBlob ); + n = pExpr->token.n - 3; + z = (char*)pExpr->token.z + 2; + assert( n>=0 ); + if( n==0 ){ + z = ""; + } + sqlite3VdbeOp3(v, op, 0, 0, z, n); + break; + } +#endif + case TK_VARIABLE: { + sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0); + if( pExpr->token.n>1 ){ + sqlite3VdbeChangeP3(v, -1, (char*)pExpr->token.z, pExpr->token.n); + } + break; + } + case TK_REGISTER: { + sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iTable, 0); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + int aff, to_op; + sqlite3ExprCode(pParse, pExpr->pLeft); + aff = sqlite3AffinityType(&pExpr->token); + to_op = aff - SQLITE_AFF_TEXT + OP_ToText; + assert( to_op==OP_ToText || aff!=SQLITE_AFF_TEXT ); + assert( to_op==OP_ToBlob || aff!=SQLITE_AFF_NONE ); + assert( to_op==OP_ToNumeric || aff!=SQLITE_AFF_NUMERIC ); + assert( to_op==OP_ToInt || aff!=SQLITE_AFF_INTEGER ); + assert( to_op==OP_ToReal || aff!=SQLITE_AFF_REAL ); + sqlite3VdbeAddOp(v, to_op, 0, 0); + stackChng = 0; + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + assert( TK_LT==OP_Lt ); + assert( TK_LE==OP_Le ); + assert( TK_GT==OP_Gt ); + assert( TK_GE==OP_Ge ); + assert( TK_EQ==OP_Eq ); + assert( TK_NE==OP_Ne ); + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3ExprCode(pParse, pExpr->pRight); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 0, 0); + stackChng = -1; + break; + } + case TK_AND: + case TK_OR: + case TK_PLUS: + case TK_STAR: + case TK_MINUS: + case TK_REM: + case TK_BITAND: + case TK_BITOR: + case TK_SLASH: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: { + assert( TK_AND==OP_And ); + assert( TK_OR==OP_Or ); + assert( TK_PLUS==OP_Add ); + assert( TK_MINUS==OP_Subtract ); + assert( TK_REM==OP_Remainder ); + assert( TK_BITAND==OP_BitAnd ); + assert( TK_BITOR==OP_BitOr ); + assert( TK_SLASH==OP_Divide ); + assert( TK_LSHIFT==OP_ShiftLeft ); + assert( TK_RSHIFT==OP_ShiftRight ); + assert( TK_CONCAT==OP_Concat ); + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3ExprCode(pParse, pExpr->pRight); + sqlite3VdbeAddOp(v, op, 0, 0); + stackChng = -1; + break; + } + case TK_UMINUS: { + Expr *pLeft = pExpr->pLeft; + assert( pLeft ); + if( pLeft->op==TK_FLOAT || pLeft->op==TK_INTEGER ){ + Token *p = &pLeft->token; + char *z = sqlite3MPrintf(pParse->db, "-%.*s", p->n, p->z); + if( pLeft->op==TK_FLOAT ){ + sqlite3VdbeOp3(v, OP_Real, 0, 0, z, p->n+1); + }else{ + codeInteger(v, z, p->n+1); + } + sqlite3_free(z); + break; + } + /* Fall through into TK_NOT */ + } + case TK_BITNOT: + case TK_NOT: { + assert( TK_BITNOT==OP_BitNot ); + assert( TK_NOT==OP_Not ); + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3VdbeAddOp(v, op, 0, 0); + stackChng = 0; + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + int dest; + assert( TK_ISNULL==OP_IsNull ); + assert( TK_NOTNULL==OP_NotNull ); + sqlite3VdbeAddOp(v, OP_Integer, 1, 0); + sqlite3ExprCode(pParse, pExpr->pLeft); + dest = sqlite3VdbeCurrentAddr(v) + 2; + sqlite3VdbeAddOp(v, op, 1, dest); + sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); + stackChng = 0; + break; + } + case TK_AGG_FUNCTION: { + AggInfo *pInfo = pExpr->pAggInfo; + if( pInfo==0 ){ + sqlite3ErrorMsg(pParse, "misuse of aggregate: %T", + &pExpr->span); + }else{ + sqlite3VdbeAddOp(v, OP_MemLoad, pInfo->aFunc[pExpr->iAgg].iMem, 0); + } + break; + } + case TK_CONST_FUNC: + case TK_FUNCTION: { + ExprList *pList = pExpr->pList; + int nExpr = pList ? pList->nExpr : 0; + FuncDef *pDef; + int nId; + const char *zId; + int constMask = 0; + int i; + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + CollSeq *pColl = 0; + + zId = (char*)pExpr->token.z; + nId = pExpr->token.n; + pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, enc, 0); + assert( pDef!=0 ); + nExpr = sqlite3ExprCodeExprList(pParse, pList); +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Possibly overload the function if the first argument is + ** a virtual table column. + ** + ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the + ** second argument, not the first, as the argument to test to + ** see if it is a column in a virtual table. This is done because + ** the left operand of infix functions (the operand we want to + ** control overloading) ends up as the second argument to the + ** function. The expression "A glob B" is equivalent to + ** "glob(B,A). We want to use the A in "A glob B" to test + ** for function overloading. But we use the B term in "glob(B,A)". + */ + if( nExpr>=2 && (pExpr->flags & EP_InfixFunc) ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[1].pExpr); + }else if( nExpr>0 ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[0].pExpr); + } +#endif + for(i=0; ia[i].pExpr) ){ + constMask |= (1<needCollSeq && !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr); + } + } + if( pDef->needCollSeq ){ + if( !pColl ) pColl = pParse->db->pDfltColl; + sqlite3VdbeOp3(v, OP_CollSeq, 0, 0, (char *)pColl, P3_COLLSEQ); + } + sqlite3VdbeOp3(v, OP_Function, constMask, nExpr, (char*)pDef, P3_FUNCDEF); + stackChng = 1-nExpr; + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: + case TK_SELECT: { + if( pExpr->iColumn==0 ){ + sqlite3CodeSubselect(pParse, pExpr); + } + sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); + VdbeComment((v, "# load subquery result")); + break; + } + case TK_IN: { + int addr; + char affinity; + int ckOffset = pParse->ckOffset; + sqlite3CodeSubselect(pParse, pExpr); + + /* Figure out the affinity to use to create a key from the results + ** of the expression. affinityStr stores a static string suitable for + ** P3 of OP_MakeRecord. + */ + affinity = comparisonAffinity(pExpr); + + sqlite3VdbeAddOp(v, OP_Integer, 1, 0); + pParse->ckOffset = (ckOffset ? (ckOffset+1) : 0); + + /* Code the from " IN (...)". The temporary table + ** pExpr->iTable contains the values that make up the (...) set. + */ + sqlite3ExprCode(pParse, pExpr->pLeft); + addr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4); /* addr + 0 */ + sqlite3VdbeAddOp(v, OP_Pop, 2, 0); + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, addr+7); + sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1); /* addr + 4 */ + sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+7); + sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); /* addr + 6 */ + + break; + } +#endif + case TK_BETWEEN: { + Expr *pLeft = pExpr->pLeft; + struct ExprList_item *pLItem = pExpr->pList->a; + Expr *pRight = pLItem->pExpr; + sqlite3ExprCode(pParse, pLeft); + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3ExprCode(pParse, pRight); + codeCompare(pParse, pLeft, pRight, OP_Ge, 0, 0); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + pLItem++; + pRight = pLItem->pExpr; + sqlite3ExprCode(pParse, pRight); + codeCompare(pParse, pLeft, pRight, OP_Le, 0, 0); + sqlite3VdbeAddOp(v, OP_And, 0, 0); + break; + } + case TK_UPLUS: { + sqlite3ExprCode(pParse, pExpr->pLeft); + stackChng = 0; + break; + } + case TK_CASE: { + int expr_end_label; + int jumpInst; + int nExpr; + int i; + ExprList *pEList; + struct ExprList_item *aListelem; + + assert(pExpr->pList); + assert((pExpr->pList->nExpr % 2) == 0); + assert(pExpr->pList->nExpr > 0); + pEList = pExpr->pList; + aListelem = pEList->a; + nExpr = pEList->nExpr; + expr_end_label = sqlite3VdbeMakeLabel(v); + if( pExpr->pLeft ){ + sqlite3ExprCode(pParse, pExpr->pLeft); + } + for(i=0; ipLeft ){ + sqlite3VdbeAddOp(v, OP_Dup, 1, 1); + jumpInst = codeCompare(pParse, pExpr->pLeft, aListelem[i].pExpr, + OP_Ne, 0, 1); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + }else{ + jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0); + } + sqlite3ExprCode(pParse, aListelem[i+1].pExpr); + sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label); + sqlite3VdbeJumpHere(v, jumpInst); + } + if( pExpr->pLeft ){ + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + } + if( pExpr->pRight ){ + sqlite3ExprCode(pParse, pExpr->pRight); + }else{ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + } + sqlite3VdbeResolveLabel(v, expr_end_label); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + if( !pParse->trigStack ){ + sqlite3ErrorMsg(pParse, + "RAISE() may only be used within a trigger-program"); + return; + } + if( pExpr->iColumn!=OE_Ignore ){ + assert( pExpr->iColumn==OE_Rollback || + pExpr->iColumn == OE_Abort || + pExpr->iColumn == OE_Fail ); + sqlite3DequoteExpr(pParse->db, pExpr); + sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn, + (char*)pExpr->token.z, pExpr->token.n); + } else { + assert( pExpr->iColumn == OE_Ignore ); + sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); + VdbeComment((v, "# raise(IGNORE)")); + } + stackChng = 0; + break; + } +#endif + } + + if( pParse->ckOffset ){ + pParse->ckOffset += stackChng; + assert( pParse->ckOffset ); + } +} + +#ifndef SQLITE_OMIT_TRIGGER +/* +** Generate code that evalutes the given expression and leaves the result +** on the stack. See also sqlite3ExprCode(). +** +** This routine might also cache the result and modify the pExpr tree +** so that it will make use of the cached result on subsequent evaluations +** rather than evaluate the whole expression again. Trivial expressions are +** not cached. If the expression is cached, its result is stored in a +** memory location. +*/ +void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr){ + Vdbe *v = pParse->pVdbe; + int iMem; + int addr1, addr2; + if( v==0 ) return; + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3ExprCode(pParse, pExpr); + addr2 = sqlite3VdbeCurrentAddr(v); + if( addr2>addr1+1 || sqlite3VdbeGetOp(v, addr1)->opcode==OP_Function ){ + iMem = pExpr->iTable = pParse->nMem++; + sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0); + pExpr->op = TK_REGISTER; + } +} +#endif + +/* +** Generate code that pushes the value of every element of the given +** expression list onto the stack. +** +** Return the number of elements pushed onto the stack. +*/ +int sqlite3ExprCodeExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList /* The expression list to be coded */ +){ + struct ExprList_item *pItem; + int i, n; + if( pList==0 ) return 0; + n = pList->nExpr; + for(pItem=pList->a, i=n; i>0; i--, pItem++){ + sqlite3ExprCode(pParse, pItem->pExpr); + } + return n; +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is true but execution +** continues straight thru if the expression is false. +** +** If the expression evaluates to NULL (neither true nor false), then +** take the jump if the jumpIfNull flag is true. +** +** This code depends on the fact that certain token values (ex: TK_EQ) +** are the same as opcode values (ex: OP_Eq) that implement the corresponding +** operation. Special comments in vdbe.c and the mkopcodeh.awk script in +** the make process cause these values to align. Assert()s in the code +** below verify that the numbers are aligned correctly. +*/ +void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int ckOffset = pParse->ckOffset; + if( v==0 || pExpr==0 ) return; + op = pExpr->op; + switch( op ){ + case TK_AND: { + int d2 = sqlite3VdbeMakeLabel(v); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + break; + } + case TK_OR: { + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + break; + } + case TK_NOT: { + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + assert( TK_LT==OP_Lt ); + assert( TK_LE==OP_Le ); + assert( TK_GT==OP_Gt ); + assert( TK_GE==OP_Ge ); + assert( TK_EQ==OP_Eq ); + assert( TK_NE==OP_Ne ); + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3ExprCode(pParse, pExpr->pRight); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, dest, jumpIfNull); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + assert( TK_ISNULL==OP_IsNull ); + assert( TK_NOTNULL==OP_NotNull ); + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3VdbeAddOp(v, op, 1, dest); + break; + } + case TK_BETWEEN: { + /* The expression "x BETWEEN y AND z" is implemented as: + ** + ** 1 IF (x < y) GOTO 3 + ** 2 IF (x <= z) GOTO + ** 3 ... + */ + int addr; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pList->a[0].pExpr; + sqlite3ExprCode(pParse, pLeft); + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3ExprCode(pParse, pRight); + addr = codeCompare(pParse, pLeft, pRight, OP_Lt, 0, !jumpIfNull); + + pRight = pExpr->pList->a[1].pExpr; + sqlite3ExprCode(pParse, pRight); + codeCompare(pParse, pLeft, pRight, OP_Le, dest, jumpIfNull); + + sqlite3VdbeAddOp(v, OP_Integer, 0, 0); + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + break; + } + default: { + sqlite3ExprCode(pParse, pExpr); + sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest); + break; + } + } + pParse->ckOffset = ckOffset; +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is false but execution +** continues straight thru if the expression is true. +** +** If the expression evaluates to NULL (neither true nor false) then +** jump if jumpIfNull is true or fall through if jumpIfNull is false. +*/ +void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int ckOffset = pParse->ckOffset; + if( v==0 || pExpr==0 ) return; + + /* The value of pExpr->op and op are related as follows: + ** + ** pExpr->op op + ** --------- ---------- + ** TK_ISNULL OP_NotNull + ** TK_NOTNULL OP_IsNull + ** TK_NE OP_Eq + ** TK_EQ OP_Ne + ** TK_GT OP_Le + ** TK_LE OP_Gt + ** TK_GE OP_Lt + ** TK_LT OP_Ge + ** + ** For other values of pExpr->op, op is undefined and unused. + ** The value of TK_ and OP_ constants are arranged such that we + ** can compute the mapping above using the following expression. + ** Assert()s verify that the computation is correct. + */ + op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); + + /* Verify correct alignment of TK_ and OP_ constants + */ + assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); + assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); + assert( pExpr->op!=TK_NE || op==OP_Eq ); + assert( pExpr->op!=TK_EQ || op==OP_Ne ); + assert( pExpr->op!=TK_LT || op==OP_Ge ); + assert( pExpr->op!=TK_LE || op==OP_Gt ); + assert( pExpr->op!=TK_GT || op==OP_Le ); + assert( pExpr->op!=TK_GE || op==OP_Lt ); + + switch( pExpr->op ){ + case TK_AND: { + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + break; + } + case TK_OR: { + int d2 = sqlite3VdbeMakeLabel(v); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + break; + } + case TK_NOT: { + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3ExprCode(pParse, pExpr->pRight); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, dest, jumpIfNull); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + sqlite3ExprCode(pParse, pExpr->pLeft); + sqlite3VdbeAddOp(v, op, 1, dest); + break; + } + case TK_BETWEEN: { + /* The expression is "x BETWEEN y AND z". It is implemented as: + ** + ** 1 IF (x >= y) GOTO 3 + ** 2 GOTO + ** 3 IF (x > z) GOTO + */ + int addr; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pList->a[0].pExpr; + sqlite3ExprCode(pParse, pLeft); + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + sqlite3ExprCode(pParse, pRight); + addr = sqlite3VdbeCurrentAddr(v); + codeCompare(pParse, pLeft, pRight, OP_Ge, addr+3, !jumpIfNull); + + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, dest); + pRight = pExpr->pList->a[1].pExpr; + sqlite3ExprCode(pParse, pRight); + codeCompare(pParse, pLeft, pRight, OP_Gt, dest, jumpIfNull); + break; + } + default: { + sqlite3ExprCode(pParse, pExpr); + sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest); + break; + } + } + pParse->ckOffset = ckOffset; +} + +/* +** Do a deep comparison of two expression trees. Return TRUE (non-zero) +** if they are identical and return FALSE if they differ in any way. +** +** Sometimes this routine will return FALSE even if the two expressions +** really are equivalent. If we cannot prove that the expressions are +** identical, we return FALSE just to be safe. So if this routine +** returns false, then you do not really know for certain if the two +** expressions are the same. But if you get a TRUE return, then you +** can be sure the expressions are the same. In the places where +** this routine is used, it does not hurt to get an extra FALSE - that +** just might result in some slightly slower code. But returning +** an incorrect TRUE could lead to a malfunction. +*/ +int sqlite3ExprCompare(Expr *pA, Expr *pB){ + int i; + if( pA==0||pB==0 ){ + return pB==pA; + } + if( pA->op!=pB->op ) return 0; + if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 0; + if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0; + if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0; + if( pA->pList ){ + if( pB->pList==0 ) return 0; + if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; + for(i=0; ipList->nExpr; i++){ + if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ + return 0; + } + } + }else if( pB->pList ){ + return 0; + } + if( pA->pSelect || pB->pSelect ) return 0; + if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; + if( pA->op!=TK_COLUMN && pA->token.z ){ + if( pB->token.z==0 ) return 0; + if( pB->token.n!=pA->token.n ) return 0; + if( sqlite3StrNICmp((char*)pA->token.z,(char*)pB->token.z,pB->token.n)!=0 ){ + return 0; + } + } + return 1; +} + + +/* +** Add a new element to the pAggInfo->aCol[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aCol = sqlite3ArrayAllocate( + db, + pInfo->aCol, + sizeof(pInfo->aCol[0]), + 3, + &pInfo->nColumn, + &pInfo->nColumnAlloc, + &i + ); + return i; +} + +/* +** Add a new element to the pAggInfo->aFunc[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aFunc = sqlite3ArrayAllocate( + db, + pInfo->aFunc, + sizeof(pInfo->aFunc[0]), + 3, + &pInfo->nFunc, + &pInfo->nFuncAlloc, + &i + ); + return i; +} + +/* +** This is an xFunc for walkExprTree() used to implement +** sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates +** for additional information. +** +** This routine analyzes the aggregate function at pExpr. +*/ +static int analyzeAggregate(void *pArg, Expr *pExpr){ + int i; + NameContext *pNC = (NameContext *)pArg; + Parse *pParse = pNC->pParse; + SrcList *pSrcList = pNC->pSrcList; + AggInfo *pAggInfo = pNC->pAggInfo; + + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + /* Check to see if the column is in one of the tables in the FROM + ** clause of the aggregate query */ + if( pSrcList ){ + struct SrcList_item *pItem = pSrcList->a; + for(i=0; inSrc; i++, pItem++){ + struct AggInfo_col *pCol; + if( pExpr->iTable==pItem->iCursor ){ + /* If we reach this point, it means that pExpr refers to a table + ** that is in the FROM clause of the aggregate query. + ** + ** Make an entry for the column in pAggInfo->aCol[] if there + ** is not an entry there already. + */ + int k; + pCol = pAggInfo->aCol; + for(k=0; knColumn; k++, pCol++){ + if( pCol->iTable==pExpr->iTable && + pCol->iColumn==pExpr->iColumn ){ + break; + } + } + if( (k>=pAggInfo->nColumn) + && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 + ){ + pCol = &pAggInfo->aCol[k]; + pCol->pTab = pExpr->pTab; + pCol->iTable = pExpr->iTable; + pCol->iColumn = pExpr->iColumn; + pCol->iMem = pParse->nMem++; + pCol->iSorterColumn = -1; + pCol->pExpr = pExpr; + if( pAggInfo->pGroupBy ){ + int j, n; + ExprList *pGB = pAggInfo->pGroupBy; + struct ExprList_item *pTerm = pGB->a; + n = pGB->nExpr; + for(j=0; jpExpr; + if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && + pE->iColumn==pExpr->iColumn ){ + pCol->iSorterColumn = j; + break; + } + } + } + if( pCol->iSorterColumn<0 ){ + pCol->iSorterColumn = pAggInfo->nSortingColumn++; + } + } + /* There is now an entry for pExpr in pAggInfo->aCol[] (either + ** because it was there before or because we just created it). + ** Convert the pExpr to be a TK_AGG_COLUMN referring to that + ** pAggInfo->aCol[] entry. + */ + pExpr->pAggInfo = pAggInfo; + pExpr->op = TK_AGG_COLUMN; + pExpr->iAgg = k; + break; + } /* endif pExpr->iTable==pItem->iCursor */ + } /* end loop over pSrcList */ + } + return 1; + } + case TK_AGG_FUNCTION: { + /* The pNC->nDepth==0 test causes aggregate functions in subqueries + ** to be ignored */ + if( pNC->nDepth==0 ){ + /* Check to see if pExpr is a duplicate of another aggregate + ** function that is already in the pAggInfo structure + */ + struct AggInfo_func *pItem = pAggInfo->aFunc; + for(i=0; inFunc; i++, pItem++){ + if( sqlite3ExprCompare(pItem->pExpr, pExpr) ){ + break; + } + } + if( i>=pAggInfo->nFunc ){ + /* pExpr is original. Make a new entry in pAggInfo->aFunc[] + */ + u8 enc = ENC(pParse->db); + i = addAggInfoFunc(pParse->db, pAggInfo); + if( i>=0 ){ + pItem = &pAggInfo->aFunc[i]; + pItem->pExpr = pExpr; + pItem->iMem = pParse->nMem++; + pItem->pFunc = sqlite3FindFunction(pParse->db, + (char*)pExpr->token.z, pExpr->token.n, + pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0); + if( pExpr->flags & EP_Distinct ){ + pItem->iDistinct = pParse->nTab++; + }else{ + pItem->iDistinct = -1; + } + } + } + /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry + */ + pExpr->iAgg = i; + pExpr->pAggInfo = pAggInfo; + return 1; + } + } + } + + /* Recursively walk subqueries looking for TK_COLUMN nodes that need + ** to be changed to TK_AGG_COLUMN. But increment nDepth so that + ** TK_AGG_FUNCTION nodes in subqueries will be unchanged. + */ + if( pExpr->pSelect ){ + pNC->nDepth++; + walkSelectExpr(pExpr->pSelect, analyzeAggregate, pNC); + pNC->nDepth--; + } + return 0; +} + +/* +** Analyze the given expression looking for aggregate functions and +** for variables that need to be added to the pParse->aAgg[] array. +** Make additional entries to the pParse->aAgg[] array as necessary. +** +** This routine should only be called after the expression has been +** analyzed by sqlite3ExprResolveNames(). +** +** If errors are seen, leave an error message in zErrMsg and return +** the number of errors. +*/ +int sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ + int nErr = pNC->pParse->nErr; + walkExprTree(pExpr, analyzeAggregate, pNC); + return pNC->pParse->nErr - nErr; +} + +/* +** Call sqlite3ExprAnalyzeAggregates() for every expression in an +** expression list. Return the number of errors. +** +** If an error is found, the analysis is cut short. +*/ +int sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ + struct ExprList_item *pItem; + int i; + int nErr = 0; + if( pList ){ + for(pItem=pList->a, i=0; nErr==0 && inExpr; i++, pItem++){ + nErr += sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); + } + } + return nErr; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/func.c b/libraries/sqlite/unix/sqlite-3.5.1/src/func.c new file mode 100644 index 0000000000..1760626ff2 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/func.c @@ -0,0 +1,1509 @@ +/* +** 2002 February 23 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement various SQL +** functions of SQLite. +** +** There is only one exported symbol in this file - the function +** sqliteRegisterBuildinFunctions() found at the bottom of the file. +** All other code has file scope. +** +** $Id: func.c,v 1.174 2007/09/03 11:04:22 danielk1977 Exp $ +*/ +#include "sqliteInt.h" +#include +#include +#include +#include "vdbeInt.h" + + +/* +** Return the collating function associated with a function. +*/ +static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ + return context->pColl; +} + +/* +** Implementation of the non-aggregate min() and max() functions +*/ +static void minmaxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int mask; /* 0 for min() or 0xffffffff for max() */ + int iBest; + CollSeq *pColl; + + if( argc==0 ) return; + mask = sqlite3_user_data(context)==0 ? 0 : -1; + pColl = sqlite3GetFuncCollSeq(context); + assert( pColl ); + assert( mask==-1 || mask==0 ); + iBest = 0; + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + for(i=1; i=0 ){ + iBest = i; + } + } + sqlite3_result_value(context, argv[iBest]); +} + +/* +** Return the type of the argument. +*/ +static void typeofFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *z = 0; + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_NULL: z = "null"; break; + case SQLITE_INTEGER: z = "integer"; break; + case SQLITE_TEXT: z = "text"; break; + case SQLITE_FLOAT: z = "real"; break; + case SQLITE_BLOB: z = "blob"; break; + } + sqlite3_result_text(context, z, -1, SQLITE_STATIC); +} + + +/* +** Implementation of the length() function +*/ +static void lengthFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int len; + + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_BLOB: + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); + break; + } + case SQLITE_TEXT: { + const unsigned char *z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + while( *z ){ + len++; + SQLITE_SKIP_UTF8(z); + } + sqlite3_result_int(context, len); + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +/* +** Implementation of the abs() function +*/ +static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + if( iVal<0 ){ + if( (iVal<<1)==0 ){ + sqlite3_result_error(context, "integer overflow", -1); + return; + } + iVal = -iVal; + } + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + double rVal = sqlite3_value_double(argv[0]); + if( rVal<0 ) rVal = -rVal; + sqlite3_result_double(context, rVal); + break; + } + } +} + +/* +** Implementation of the substr() function. +** +** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. +** p1 is 1-indexed. So substr(x,1,1) returns the first character +** of x. If x is text, then we actually count UTF-8 characters. +** If x is a blob, then we count bytes. +** +** If p1 is negative, then we begin abs(p1) from the end of x[]. +*/ +static void substrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z; + const unsigned char *z2; + int len; + int p0type; + i64 p1, p2; + + assert( argc==3 ); + p0type = sqlite3_value_type(argv[0]); + if( p0type==SQLITE_BLOB ){ + len = sqlite3_value_bytes(argv[0]); + z = sqlite3_value_blob(argv[0]); + if( z==0 ) return; + assert( len==sqlite3_value_bytes(argv[0]) ); + }else{ + z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + for(z2=z; *z2; len++){ + SQLITE_SKIP_UTF8(z2); + } + } + p1 = sqlite3_value_int(argv[1]); + p2 = sqlite3_value_int(argv[2]); + if( p1<0 ){ + p1 += len; + if( p1<0 ){ + p2 += p1; + p1 = 0; + } + }else if( p1>0 ){ + p1--; + } + if( p1+p2>len ){ + p2 = len-p1; + } + if( p0type!=SQLITE_BLOB ){ + while( *z && p1 ){ + SQLITE_SKIP_UTF8(z); + p1--; + } + for(z2=z; *z2 && p2; p2--){ + SQLITE_SKIP_UTF8(z2); + } + sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT); + }else{ + if( p2<0 ) p2 = 0; + sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT); + } +} + +/* +** Implementation of the round() function +*/ +static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int n = 0; + double r; + char zBuf[500]; /* larger than the %f representation of the largest double */ + assert( argc==1 || argc==2 ); + if( argc==2 ){ + if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; + n = sqlite3_value_int(argv[1]); + if( n>30 ) n = 30; + if( n<0 ) n = 0; + } + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + r = sqlite3_value_double(argv[0]); + sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r); + sqlite3AtoF(zBuf, &r); + sqlite3_result_double(context, r); +} + +/* +** Allocate nByte bytes of space using sqlite3_malloc(). If the +** allocation fails, call sqlite3_result_error_nomem() to notify +** the database handle that malloc() has failed. +*/ +static void *contextMalloc(sqlite3_context *context, int nByte){ + char *z = sqlite3_malloc(nByte); + if( !z && nByte>0 ){ + sqlite3_result_error_nomem(context); + } + return z; +} + +/* +** Implementation of the upper() and lower() SQL functions. +*/ +static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char *z1; + const char *z2; + int i, n; + if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; + z2 = (char*)sqlite3_value_text(argv[0]); + n = sqlite3_value_bytes(argv[0]); + /* Verify that the call to _bytes() does not invalidate the _text() pointer */ + assert( z2==(char*)sqlite3_value_text(argv[0]) ); + if( z2 ){ + z1 = contextMalloc(context, n+1); + if( z1 ){ + memcpy(z1, z2, n+1); + for(i=0; z1[i]; i++){ + z1[i] = toupper(z1[i]); + } + sqlite3_result_text(context, z1, -1, sqlite3_free); + } + } +} +static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char *z1; + const char *z2; + int i, n; + if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; + z2 = (char*)sqlite3_value_text(argv[0]); + n = sqlite3_value_bytes(argv[0]); + /* Verify that the call to _bytes() does not invalidate the _text() pointer */ + assert( z2==(char*)sqlite3_value_text(argv[0]) ); + if( z2 ){ + z1 = contextMalloc(context, n+1); + if( z1 ){ + memcpy(z1, z2, n+1); + for(i=0; z1[i]; i++){ + z1[i] = tolower(z1[i]); + } + sqlite3_result_text(context, z1, -1, sqlite3_free); + } + } +} + +/* +** Implementation of the IFNULL(), NVL(), and COALESCE() functions. +** All three do the same thing. They return the first non-NULL +** argument. +*/ +static void ifnullFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + for(i=0; iSQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + return; + } + p = contextMalloc(context, n); + if( p ){ + sqlite3Randomness(n, p); + sqlite3_result_blob(context, (char*)p, n, sqlite3_free); + } +} + +/* +** Implementation of the last_insert_rowid() SQL function. The return +** value is the same as the sqlite3_last_insert_rowid() API function. +*/ +static void last_insert_rowid( + sqlite3_context *context, + int arg, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_user_data(context); + sqlite3_result_int64(context, sqlite3_last_insert_rowid(db)); +} + +/* +** Implementation of the changes() SQL function. The return value is the +** same as the sqlite3_changes() API function. +*/ +static void changes( + sqlite3_context *context, + int arg, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_user_data(context); + sqlite3_result_int(context, sqlite3_changes(db)); +} + +/* +** Implementation of the total_changes() SQL function. The return value is +** the same as the sqlite3_total_changes() API function. +*/ +static void total_changes( + sqlite3_context *context, + int arg, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_user_data(context); + sqlite3_result_int(context, sqlite3_total_changes(db)); +} + +/* +** A structure defining how to do GLOB-style comparisons. +*/ +struct compareInfo { + u8 matchAll; + u8 matchOne; + u8 matchSet; + u8 noCase; +}; + +static const struct compareInfo globInfo = { '*', '?', '[', 0 }; +/* The correct SQL-92 behavior is for the LIKE operator to ignore +** case. Thus 'a' LIKE 'A' would be true. */ +static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 }; +/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator +** is case sensitive causing 'a' LIKE 'A' to be false */ +static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; + +/* +** Compare two UTF-8 strings for equality where the first string can +** potentially be a "glob" expression. Return true (1) if they +** are the same and false (0) if they are different. +** +** Globbing rules: +** +** '*' Matches any sequence of zero or more characters. +** +** '?' Matches exactly one character. +** +** [...] Matches one character from the enclosed list of +** characters. +** +** [^...] Matches one character not in the enclosed list. +** +** With the [...] and [^...] matching, a ']' character can be included +** in the list by making it the first character after '[' or '^'. A +** range of characters can be specified using '-'. Example: +** "[a-z]" matches any single lower-case letter. To match a '-', make +** it the last character in the list. +** +** This routine is usually quick, but can be N**2 in the worst case. +** +** Hints: to match '*' or '?', put them in "[]". Like this: +** +** abc[*]xyz Matches "abc*xyz" only +*/ +static int patternCompare( + const u8 *zPattern, /* The glob pattern */ + const u8 *zString, /* The string to compare against the glob */ + const struct compareInfo *pInfo, /* Information about how to do the compare */ + const int esc /* The escape character */ +){ + int c, c2; + int invert; + int seen; + u8 matchOne = pInfo->matchOne; + u8 matchAll = pInfo->matchAll; + u8 matchSet = pInfo->matchSet; + u8 noCase = pInfo->noCase; + int prevEscape = 0; /* True if the previous character was 'escape' */ + + while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){ + if( !prevEscape && c==matchAll ){ + while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll + || c == matchOne ){ + if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){ + return 0; + } + } + if( c==0 ){ + return 1; + }else if( c==esc ){ + c = sqlite3Utf8Read(zPattern, 0, &zPattern); + if( c==0 ){ + return 0; + } + }else if( c==matchSet ){ + assert( esc==0 ); /* This is GLOB, not LIKE */ + assert( matchSet<0x80 ); /* '[' is a single-byte character */ + while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){ + SQLITE_SKIP_UTF8(zString); + } + return *zString!=0; + } + while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){ + if( noCase ){ + c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2; + c = c<0x80 ? sqlite3UpperToLower[c] : c; + while( c2 != 0 && c2 != c ){ + c2 = sqlite3Utf8Read(zString, 0, &zString); + if( c2<0x80 ) c2 = sqlite3UpperToLower[c2]; + } + }else{ + while( c2 != 0 && c2 != c ){ + c2 = sqlite3Utf8Read(zString, 0, &zString); + } + } + if( c2==0 ) return 0; + if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; + } + return 0; + }else if( !prevEscape && c==matchOne ){ + if( sqlite3Utf8Read(zString, 0, &zString)==0 ){ + return 0; + } + }else if( c==matchSet ){ + int prior_c = 0; + assert( esc==0 ); /* This only occurs for GLOB, not LIKE */ + seen = 0; + invert = 0; + c = sqlite3Utf8Read(zString, 0, &zString); + if( c==0 ) return 0; + c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + if( c2=='^' ){ + invert = 1; + c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + } + if( c2==']' ){ + if( c==']' ) seen = 1; + c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + } + while( c2 && c2!=']' ){ + if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ + c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + if( c>=prior_c && c<=c2 ) seen = 1; + prior_c = 0; + }else{ + if( c==c2 ){ + seen = 1; + } + prior_c = c2; + } + c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); + } + if( c2==0 || (seen ^ invert)==0 ){ + return 0; + } + }else if( esc==c && !prevEscape ){ + prevEscape = 1; + }else{ + c2 = sqlite3Utf8Read(zString, 0, &zString); + if( noCase ){ + c = c<0x80 ? sqlite3UpperToLower[c] : c; + c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2; + } + if( c!=c2 ){ + return 0; + } + prevEscape = 0; + } + } + return *zString==0; +} + +/* +** Count the number of times that the LIKE operator (or GLOB which is +** just a variation of LIKE) gets called. This is used for testing +** only. +*/ +#ifdef SQLITE_TEST +int sqlite3_like_count = 0; +#endif + + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B,A). +** +** This same function (with a different compareInfo structure) computes +** the GLOB operator. +*/ +static void likeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA, *zB; + int escape = 0; + + zB = sqlite3_value_text(argv[0]); + zA = sqlite3_value_text(argv[1]); + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + const unsigned char *zEsc = sqlite3_value_text(argv[2]); + if( zEsc==0 ) return; + if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + escape = sqlite3Utf8Read(zEsc, 0, &zEsc); + } + if( zA && zB ){ + struct compareInfo *pInfo = sqlite3_user_data(context); +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + + sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); + } +} + +/* +** Implementation of the NULLIF(x,y) function. The result is the first +** argument if the arguments are different. The result is NULL if the +** arguments are equal to each other. +*/ +static void nullifFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ + sqlite3_result_value(context, argv[0]); + } +} + +/* +** Implementation of the VERSION(*) function. The result is the version +** of the SQLite library that is running. +*/ +static void versionFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); +} + +/* Array for converting from half-bytes (nybbles) into ASCII hex +** digits. */ +static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +/* +** EXPERIMENTAL - This is not an official function. The interface may +** change. This function may disappear. Do not write code that depends +** on this function. +** +** Implementation of the QUOTE() function. This function takes a single +** argument. If the argument is numeric, the return value is the same as +** the argument. If the argument is NULL, the return value is the string +** "NULL". Otherwise, the argument is enclosed in single quotes with +** single-quote escapes. +*/ +static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + if( argc<1 ) return; + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_NULL: { + sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); + break; + } + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + sqlite3_result_value(context, argv[0]); + break; + } + case SQLITE_BLOB: { + char *zText = 0; + char const *zBlob = sqlite3_value_blob(argv[0]); + int nBlob = sqlite3_value_bytes(argv[0]); + assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + + if( 2*nBlob+4>SQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + return; + } + zText = (char *)contextMalloc(context, (2*nBlob)+4); + if( zText ){ + int i; + for(i=0; i>4)&0x0F]; + zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; + } + zText[(nBlob*2)+2] = '\''; + zText[(nBlob*2)+3] = '\0'; + zText[0] = 'X'; + zText[1] = '\''; + sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); + sqlite3_free(zText); + } + break; + } + case SQLITE_TEXT: { + int i,j; + u64 n; + const unsigned char *zArg = sqlite3_value_text(argv[0]); + char *z; + + if( zArg==0 ) return; + for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } + if( i+n+3>SQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + return; + } + z = contextMalloc(context, i+n+3); + if( z ){ + z[0] = '\''; + for(i=0, j=1; zArg[i]; i++){ + z[j++] = zArg[i]; + if( zArg[i]=='\'' ){ + z[j++] = '\''; + } + } + z[j++] = '\''; + z[j] = 0; + sqlite3_result_text(context, z, j, sqlite3_free); + } + } + } +} + +/* +** The hex() function. Interpret the argument as a blob. Return +** a hexadecimal rendering as text. +*/ +static void hexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i, n; + const unsigned char *pBlob; + char *zHex, *z; + assert( argc==1 ); + pBlob = sqlite3_value_blob(argv[0]); + n = sqlite3_value_bytes(argv[0]); + if( n*2+1>SQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + return; + } + assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + z = zHex = contextMalloc(context, n*2 + 1); + if( zHex ){ + for(i=0; i>4)&0xf]; + *(z++) = hexdigits[c&0xf]; + } + *z = 0; + sqlite3_result_text(context, zHex, n*2, sqlite3_free); + } +} + +/* +** The zeroblob(N) function returns a zero-filled blob of size N bytes. +*/ +static void zeroblobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + i64 n; + assert( argc==1 ); + n = sqlite3_value_int64(argv[0]); + if( n>SQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + }else{ + sqlite3_result_zeroblob(context, n); + } +} + +/* +** The replace() function. Three arguments are all strings: call +** them A, B, and C. The result is also a string which is derived +** from A by replacing every occurance of B with C. The match +** must be exact. Collating sequences are not used. +*/ +static void replaceFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zStr; /* The input string A */ + const unsigned char *zPattern; /* The pattern string B */ + const unsigned char *zRep; /* The replacement string C */ + unsigned char *zOut; /* The output */ + int nStr; /* Size of zStr */ + int nPattern; /* Size of zPattern */ + int nRep; /* Size of zRep */ + i64 nOut; /* Maximum size of zOut */ + int loopLimit; /* Last zStr[] that might match zPattern[] */ + int i, j; /* Loop counters */ + + assert( argc==3 ); + zStr = sqlite3_value_text(argv[0]); + if( zStr==0 ) return; + nStr = sqlite3_value_bytes(argv[0]); + assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ + zPattern = sqlite3_value_text(argv[1]); + if( zPattern==0 || zPattern[0]==0 ) return; + nPattern = sqlite3_value_bytes(argv[1]); + assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ + zRep = sqlite3_value_text(argv[2]); + if( zRep==0 ) return; + nRep = sqlite3_value_bytes(argv[2]); + assert( zRep==sqlite3_value_text(argv[2]) ); + nOut = nStr + 1; + assert( nOut=SQLITE_MAX_LENGTH ){ + sqlite3_result_error_toobig(context); + sqlite3_free(zOut); + return; + } + zOld = zOut; + zOut = sqlite3_realloc(zOut, (int)nOut); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + sqlite3_free(zOld); + return; + } + memcpy(&zOut[j], zRep, nRep); + j += nRep; + i += nPattern-1; + } + } + assert( j+nStr-i+1==nOut ); + memcpy(&zOut[j], &zStr[i], nStr-i); + j += nStr - i; + assert( j<=nOut ); + zOut[j] = 0; + sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); +} + +/* +** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. +** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. +*/ +static void trimFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zIn; /* Input string */ + const unsigned char *zCharSet; /* Set of characters to trim */ + int nIn; /* Number of bytes in input */ + int flags; /* 1: trimleft 2: trimright 3: trim */ + int i; /* Loop counter */ + unsigned char *aLen; /* Length of each character in zCharSet */ + const unsigned char **azChar; /* Individual characters in zCharSet */ + int nChar; /* Number of characters in zCharSet */ + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + return; + } + zIn = sqlite3_value_text(argv[0]); + if( zIn==0 ) return; + nIn = sqlite3_value_bytes(argv[0]); + assert( zIn==sqlite3_value_text(argv[0]) ); + if( argc==1 ){ + static const unsigned char lenOne[] = { 1 }; + static const unsigned char *azOne[] = { (u8*)" " }; + nChar = 1; + aLen = (u8*)lenOne; + azChar = azOne; + zCharSet = 0; + }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ + return; + }else{ + const unsigned char *z; + for(z=zCharSet, nChar=0; *z; nChar++){ + SQLITE_SKIP_UTF8(z); + } + if( nChar>0 ){ + azChar = contextMalloc(context, nChar*(sizeof(char*)+1)); + if( azChar==0 ){ + return; + } + aLen = (unsigned char*)&azChar[nChar]; + for(z=zCharSet, nChar=0; *z; nChar++){ + azChar[nChar] = z; + SQLITE_SKIP_UTF8(z); + aLen[nChar] = z - azChar[nChar]; + } + } + } + if( nChar>0 ){ + flags = (int)sqlite3_user_data(context); + if( flags & 1 ){ + while( nIn>0 ){ + int len; + for(i=0; i=nChar ) break; + zIn += len; + nIn -= len; + } + } + if( flags & 2 ){ + while( nIn>0 ){ + int len; + for(i=0; i=nChar ) break; + nIn -= len; + } + } + if( zCharSet ){ + sqlite3_free(azChar); + } + } + sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); +} + +#ifdef SQLITE_SOUNDEX +/* +** Compute the soundex encoding of a word. +*/ +static void soundexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + char zResult[8]; + const u8 *zIn; + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + assert( argc==1 ); + zIn = (u8*)sqlite3_value_text(argv[0]); + if( zIn==0 ) zIn = (u8*)""; + for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} + if( zIn[i] ){ + u8 prevcode = iCode[zIn[i]&0x7f]; + zResult[0] = toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + if( code!=prevcode ){ + prevcode = code; + zResult[j++] = code + '0'; + } + }else{ + prevcode = 0; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); + } +} +#endif + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** A function that loads a shared-library extension then returns NULL. +*/ +static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zFile = (const char *)sqlite3_value_text(argv[0]); + const char *zProc; + sqlite3 *db = sqlite3_user_data(context); + char *zErrMsg = 0; + + if( argc==2 ){ + zProc = (const char *)sqlite3_value_text(argv[1]); + }else{ + zProc = 0; + } + if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ + sqlite3_result_error(context, zErrMsg, -1); + sqlite3_free(zErrMsg); + } +} +#endif + +#ifdef SQLITE_TEST +/* +** This function generates a string of random characters. Used for +** generating test data. +*/ +static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){ + static const unsigned char zSrc[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + ".-!,:*^+=_|?/<> "; + int iMin, iMax, n, r, i; + unsigned char zBuf[1000]; + + /* It used to be possible to call randstr() with any number of arguments, + ** but now it is registered with SQLite as requiring exactly 2. + */ + assert(argc==2); + + iMin = sqlite3_value_int(argv[0]); + if( iMin<0 ) iMin = 0; + if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1; + iMax = sqlite3_value_int(argv[1]); + if( iMax=sizeof(zBuf) ) iMax = sizeof(zBuf)-1; + n = iMin; + if( iMax>iMin ){ + sqlite3Randomness(sizeof(r), &r); + r &= 0x7fffffff; + n += r%(iMax + 1 - iMin); + } + assert( ncnt++; + if( type==SQLITE_INTEGER ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum += v; + if( (p->approx|p->overflow)==0 ){ + i64 iNewSum = p->iSum + v; + int s1 = p->iSum >> (sizeof(i64)*8-1); + int s2 = v >> (sizeof(i64)*8-1); + int s3 = iNewSum >> (sizeof(i64)*8-1); + p->overflow = (s1&s2&~s3) | (~s1&~s2&s3); + p->iSum = iNewSum; + } + }else{ + p->rSum += sqlite3_value_double(argv[0]); + p->approx = 1; + } + } +} +static void sumFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + if( p->overflow ){ + sqlite3_result_error(context,"integer overflow",-1); + }else if( p->approx ){ + sqlite3_result_double(context, p->rSum); + }else{ + sqlite3_result_int64(context, p->iSum); + } + } +} +static void avgFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + sqlite3_result_double(context, p->rSum/(double)p->cnt); + } +} +static void totalFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + sqlite3_result_double(context, p ? p->rSum : 0.0); +} + +/* +** The following structure keeps track of state information for the +** count() aggregate function. +*/ +typedef struct CountCtx CountCtx; +struct CountCtx { + i64 n; +}; + +/* +** Routines to implement the count() aggregate function. +*/ +static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(context, sizeof(*p)); + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ + p->n++; + } +} +static void countFinalize(sqlite3_context *context){ + CountCtx *p; + p = sqlite3_aggregate_context(context, 0); + sqlite3_result_int64(context, p ? p->n : 0); +} + +/* +** Routines to implement min() and max() aggregate functions. +*/ +static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + Mem *pArg = (Mem *)argv[0]; + Mem *pBest; + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); + if( !pBest ) return; + + if( pBest->flags ){ + int max; + int cmp; + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + /* This step function is used for both the min() and max() aggregates, + ** the only difference between the two being that the sense of the + ** comparison is inverted. For the max() aggregate, the + ** sqlite3_user_data() function returns (void *)-1. For min() it + ** returns (void *)db, where db is the sqlite3* database pointer. + ** Therefore the next statement sets variable 'max' to 1 for the max() + ** aggregate, or 0 for min(). + */ + max = sqlite3_user_data(context)!=0; + cmp = sqlite3MemCompare(pBest, pArg, pColl); + if( (max && cmp<0) || (!max && cmp>0) ){ + sqlite3VdbeMemCopy(pBest, pArg); + } + }else{ + sqlite3VdbeMemCopy(pBest, pArg); + } +} +static void minMaxFinalize(sqlite3_context *context){ + sqlite3_value *pRes; + pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); + if( pRes ){ + if( pRes->flags ){ + sqlite3_result_value(context, pRes); + } + sqlite3VdbeMemRelease(pRes); + } +} + + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ + static const struct { + char *zName; + signed char nArg; + u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */ + u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */ + u8 needCollSeq; + void (*xFunc)(sqlite3_context*,int,sqlite3_value **); + } aFuncs[] = { + { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc }, + { "min", 0, 0, SQLITE_UTF8, 1, 0 }, + { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc }, + { "max", 0, 1, SQLITE_UTF8, 1, 0 }, + { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc }, + { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc }, + { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc }, + { "abs", 1, 0, SQLITE_UTF8, 0, absFunc }, + { "round", 1, 0, SQLITE_UTF8, 0, roundFunc }, + { "round", 2, 0, SQLITE_UTF8, 0, roundFunc }, + { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc }, + { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc }, + { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc }, + { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 }, + { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 }, + { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc }, + { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc }, + { "random", -1, 0, SQLITE_UTF8, 0, randomFunc }, + { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob }, + { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc }, + { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc}, + { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc }, + { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid }, + { "changes", 0, 0xff, SQLITE_UTF8, 0, changes }, + { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes }, + { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc }, + { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc }, + { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc }, + { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc }, + { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc }, + { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc }, + { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc }, + { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc }, +#ifdef SQLITE_SOUNDEX + { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc}, +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt }, + { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt }, +#endif +#ifdef SQLITE_TEST + { "randstr", 2, 0, SQLITE_UTF8, 0, randStr }, + { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor}, + { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count}, + { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata}, + { "test_error", 1, 0, SQLITE_UTF8, 0, test_error}, +#endif + }; + static const struct { + char *zName; + signed char nArg; + u8 argType; + u8 needCollSeq; + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinalize)(sqlite3_context*); + } aAggs[] = { + { "min", 1, 0, 1, minmaxStep, minMaxFinalize }, + { "max", 1, 1, 1, minmaxStep, minMaxFinalize }, + { "sum", 1, 0, 0, sumStep, sumFinalize }, + { "total", 1, 0, 0, sumStep, totalFinalize }, + { "avg", 1, 0, 0, sumStep, avgFinalize }, + { "count", 0, 0, 0, countStep, countFinalize }, + { "count", 1, 0, 0, countStep, countFinalize }, + }; + int i; + + for(i=0; ineedCollSeq = 1; + } + } + } +#ifndef SQLITE_OMIT_ALTERTABLE + sqlite3AlterFunctions(db); +#endif +#ifndef SQLITE_OMIT_PARSER + sqlite3AttachFunctions(db); +#endif + for(i=0; ineedCollSeq = 1; + } + } + } + sqlite3RegisterDateTimeFunctions(db); + if( !db->mallocFailed ){ + int rc = sqlite3_overload_function(db, "MATCH", 2); + assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); + if( rc==SQLITE_NOMEM ){ + db->mallocFailed = 1; + } + } +#ifdef SQLITE_SSE + (void)sqlite3SseFunctions(db); +#endif +#ifdef SQLITE_CASE_SENSITIVE_LIKE + sqlite3RegisterLikeFunctions(db, 1); +#else + sqlite3RegisterLikeFunctions(db, 0); +#endif +} + +/* +** Set the LIKEOPT flag on the 2-argument function with the given name. +*/ +static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){ + FuncDef *pDef; + pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0); + if( pDef ){ + pDef->flags = flagVal; + } +} + +/* +** Register the built-in LIKE and GLOB functions. The caseSensitive +** parameter determines whether or not the LIKE operator is case +** sensitive. GLOB is always case sensitive. +*/ +void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ + struct compareInfo *pInfo; + if( caseSensitive ){ + pInfo = (struct compareInfo*)&likeInfoAlt; + }else{ + pInfo = (struct compareInfo*)&likeInfoNorm; + } + sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0); + sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0); + sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8, + (struct compareInfo*)&globInfo, likeFunc, 0,0); + setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE); + setLikeOptFlag(db, "like", + caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE); +} + +/* +** pExpr points to an expression which implements a function. If +** it is appropriate to apply the LIKE optimization to that function +** then set aWc[0] through aWc[2] to the wildcard characters and +** return TRUE. If the function is not a LIKE-style function then +** return FALSE. +*/ +int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ + FuncDef *pDef; + if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){ + return 0; + } + if( pExpr->pList->nExpr!=2 ){ + return 0; + } + pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2, + SQLITE_UTF8, 0); + if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){ + return 0; + } + + /* The memcpy() statement assumes that the wildcard characters are + ** the first three statements in the compareInfo structure. The + ** asserts() that follow verify that assumption + */ + memcpy(aWc, pDef->pUserData, 3); + assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); + assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); + assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); + *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0; + return 1; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c new file mode 100644 index 0000000000..a88d16b06b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c @@ -0,0 +1,418 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of generic hash-tables +** used in SQLite. +** +** $Id: hash.c,v 1.24 2007/09/04 14:31:47 danielk1977 Exp $ +*/ +#include "sqliteInt.h" +#include + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants SQLITE_HASH_INT, SQLITE_HASH_POINTER, +** SQLITE_HASH_BINARY, or SQLITE_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. CopyKey only makes +** sense for SQLITE_HASH_STRING and SQLITE_HASH_BINARY and is ignored +** for other key classes. +*/ +void sqlite3HashInit(Hash *pNew, int keyClass, int copyKey){ + assert( pNew!=0 ); + assert( keyClass>=SQLITE_HASH_STRING && keyClass<=SQLITE_HASH_BINARY ); + pNew->keyClass = keyClass; +#if 0 + if( keyClass==SQLITE_HASH_POINTER || keyClass==SQLITE_HASH_INT ) copyKey = 0; +#endif + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +void sqlite3HashClear(Hash *pH){ + HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + if( pH->ht ) sqlite3_free(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + sqlite3_free(elem->pKey); + } + sqlite3_free(elem); + elem = next_elem; + } + pH->count = 0; +} + +#if 0 /* NOT USED */ +/* +** Hash and comparison functions when the mode is SQLITE_HASH_INT +*/ +static int intHash(const void *pKey, int nKey){ + return nKey ^ (nKey<<8) ^ (nKey>>8); +} +static int intCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + return n2 - n1; +} +#endif + +#if 0 /* NOT USED */ +/* +** Hash and comparison functions when the mode is SQLITE_HASH_POINTER +*/ +static int ptrHash(const void *pKey, int nKey){ + uptr x = Addr(pKey); + return x ^ (x<<8) ^ (x>>8); +} +static int ptrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( pKey1==pKey2 ) return 0; + if( pKey1 0 ){ + h = (h<<3) ^ h ^ sqlite3UpperToLower[(unsigned char)*z++]; + nKey--; + } + return h & 0x7fffffff; +} +static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return sqlite3StrNICmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is SQLITE_HASH_BINARY +*/ +static int binHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "hashFunction". The function takes a +** single parameter "keyClass". The return value of hashFunction() +** is a pointer to another function. Specifically, the return value +** of hashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*hashFunction(int keyClass))(const void*,int){ +#if 0 /* HASH_INT and HASH_POINTER are never used */ + switch( keyClass ){ + case SQLITE_HASH_INT: return &intHash; + case SQLITE_HASH_POINTER: return &ptrHash; + case SQLITE_HASH_STRING: return &strHash; + case SQLITE_HASH_BINARY: return &binHash;; + default: break; + } + return 0; +#else + if( keyClass==SQLITE_HASH_STRING ){ + return &strHash; + }else{ + assert( keyClass==SQLITE_HASH_BINARY ); + return &binHash; + } +#endif +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ +#if 0 /* HASH_INT and HASH_POINTER are never used */ + switch( keyClass ){ + case SQLITE_HASH_INT: return &intCompare; + case SQLITE_HASH_POINTER: return &ptrCompare; + case SQLITE_HASH_STRING: return &strCompare; + case SQLITE_HASH_BINARY: return &binCompare; + default: break; + } + return 0; +#else + if( keyClass==SQLITE_HASH_STRING ){ + return &strCompare; + }else{ + assert( keyClass==SQLITE_HASH_BINARY ); + return &binCompare; + } +#endif +} + +/* Link an element into the hash table +*/ +static void insertElement( + Hash *pH, /* The complete hash table */ + struct _ht *pEntry, /* The entry into which pNew is inserted */ + HashElem *pNew /* The element to be inserted */ +){ + HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqlite3_malloc() fails. +*/ +static void rehash(Hash *pH, int new_size){ + struct _ht *new_ht; /* The new hash table */ + HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + + /* There is a call to sqlite3_malloc() inside rehash(). If there is + ** already an allocation at pH->ht, then if this malloc() fails it + ** is benign (since failing to resize a hash table is a performance + ** hit only, not a fatal error). + */ + sqlite3MallocBenignFailure(pH->htsize>0); + + new_ht = (struct _ht *)sqlite3MallocZero( new_size*sizeof(struct _ht) ); + if( new_ht==0 ) return; + if( pH->ht ) sqlite3_free(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = hashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static HashElem *findElementGivenHash( + const Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = compareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + Hash *pH, /* The pH containing "elem" */ + HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey ){ + sqlite3_free(elem->pKey); + } + sqlite3_free( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + sqlite3HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return a pointer to the corresponding +** HashElem structure for this element if it is found, or NULL +** otherwise. +*/ +HashElem *sqlite3HashFindElem(const Hash *pH, const void *pKey, int nKey){ + int h; /* A hash on key */ + HashElem *elem; /* The element that matches key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); + return elem; +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +void *sqlite3HashFind(const Hash *pH, const void *pKey, int nKey){ + HashElem *elem; /* The element that matches key */ + elem = sqlite3HashFindElem(pH, pKey, nKey); + return elem ? elem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +void *sqlite3HashInsert(Hash *pH, const void *pKey, int nKey, void *data){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + HashElem *elem; /* Used to loop thru the element list */ + HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = hashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = findElementGivenHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + if( !pH->copyKey ){ + elem->pKey = (void *)pKey; + } + assert(nKey==elem->nKey); + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (HashElem*)sqlite3_malloc( sizeof(HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = sqlite3_malloc( nKey ); + if( new_elem->pKey==0 ){ + sqlite3_free(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + if( pH->htsize==0 ){ + rehash(pH,8); + if( pH->htsize==0 ){ + pH->count = 0; + if( pH->copyKey ){ + sqlite3_free(new_elem->pKey); + } + sqlite3_free(new_elem); + return data; + } + } + if( pH->count > pH->htsize ){ + rehash(pH,pH->htsize*2); + } + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + insertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h new file mode 100644 index 0000000000..e3274e9e44 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h @@ -0,0 +1,110 @@ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. +** +** $Id: hash.h,v 1.11 2007/09/04 14:31:47 danielk1977 Exp $ +*/ +#ifndef _SQLITE_HASH_H_ +#define _SQLITE_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct Hash { + char keyClass; /* SQLITE_HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + int htsize; /* Number of buckets in the hash table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 4 different modes of operation for a hash table: +** +** SQLITE_HASH_INT nKey is used as the key and pKey is ignored. +** +** SQLITE_HASH_POINTER pKey is used as the key and nKey is ignored. +** +** SQLITE_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is ignored in comparisons. +** +** SQLITE_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made for SQLITE_HASH_STRING and SQLITE_HASH_BINARY +** if the copyKey parameter to HashInit is 1. +*/ +/* #define SQLITE_HASH_INT 1 // NOT USED */ +/* #define SQLITE_HASH_POINTER 2 // NOT USED */ +#define SQLITE_HASH_STRING 3 +#define SQLITE_HASH_BINARY 4 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +void sqlite3HashInit(Hash*, int keytype, int copyKey); +void *sqlite3HashInsert(Hash*, const void *pKey, int nKey, void *pData); +void *sqlite3HashFind(const Hash*, const void *pKey, int nKey); +HashElem *sqlite3HashFindElem(const Hash*, const void *pKey, int nKey); +void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +#define sqliteHashKey(E) ((E)->pKey) +#define sqliteHashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define sqliteHashCount(H) ((H)->count) + +#endif /* _SQLITE_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c b/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c new file mode 100644 index 0000000000..9d68c9539a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c @@ -0,0 +1,1605 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains C code routines that are called by the parser +** to handle INSERT statements in SQLite. +** +** $Id: insert.c,v 1.192 2007/09/03 17:30:07 danielk1977 Exp $ +*/ +#include "sqliteInt.h" + +/* +** Set P3 of the most recently inserted opcode to a column affinity +** string for index pIdx. A column affinity string has one character +** for each column in the table, according to the affinity of the column: +** +** Character Column affinity +** ------------------------------ +** 'a' TEXT +** 'b' NONE +** 'c' NUMERIC +** 'd' INTEGER +** 'e' REAL +*/ +void sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ + if( !pIdx->zColAff ){ + /* The first time a column affinity string for a particular index is + ** required, it is allocated and populated here. It is then stored as + ** a member of the Index structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqliteDeleteIndex() when the Index structure itself is cleaned + ** up. + */ + int n; + Table *pTab = pIdx->pTable; + sqlite3 *db = sqlite3VdbeDb(v); + pIdx->zColAff = (char *)sqlite3DbMallocZero(db, pIdx->nColumn+1); + if( !pIdx->zColAff ){ + return; + } + for(n=0; nnColumn; n++){ + pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity; + } + pIdx->zColAff[pIdx->nColumn] = '\0'; + } + + sqlite3VdbeChangeP3(v, -1, pIdx->zColAff, 0); +} + +/* +** Set P3 of the most recently inserted opcode to a column affinity +** string for table pTab. A column affinity string has one character +** for each column indexed by the index, according to the affinity of the +** column: +** +** Character Column affinity +** ------------------------------ +** 'a' TEXT +** 'b' NONE +** 'c' NUMERIC +** 'd' INTEGER +** 'e' REAL +*/ +void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ + /* The first time a column affinity string for a particular table + ** is required, it is allocated and populated here. It is then + ** stored as a member of the Table structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqlite3DeleteTable() when the Table structure itself is cleaned up. + */ + if( !pTab->zColAff ){ + char *zColAff; + int i; + sqlite3 *db = sqlite3VdbeDb(v); + + zColAff = (char *)sqlite3DbMallocZero(db, pTab->nCol+1); + if( !zColAff ){ + return; + } + + for(i=0; inCol; i++){ + zColAff[i] = pTab->aCol[i].affinity; + } + zColAff[pTab->nCol] = '\0'; + + pTab->zColAff = zColAff; + } + + sqlite3VdbeChangeP3(v, -1, pTab->zColAff, 0); +} + +/* +** Return non-zero if SELECT statement p opens the table with rootpage +** iTab in database iDb. This is used to see if a statement of the form +** "INSERT INTO SELECT ..." can run without using temporary +** table for the results of the SELECT. +** +** No checking is done for sub-selects that are part of expressions. +*/ +static int selectReadsTable(Select *p, Schema *pSchema, int iTab){ + int i; + struct SrcList_item *pItem; + if( p->pSrc==0 ) return 0; + for(i=0, pItem=p->pSrc->a; ipSrc->nSrc; i++, pItem++){ + if( pItem->pSelect ){ + if( selectReadsTable(pItem->pSelect, pSchema, iTab) ) return 1; + }else{ + if( pItem->pTab->pSchema==pSchema && pItem->pTab->tnum==iTab ) return 1; + } + } + return 0; +} + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* +** Write out code to initialize the autoincrement logic. This code +** looks up the current autoincrement value in the sqlite_sequence +** table and stores that value in a memory cell. Code generated by +** autoIncStep() will keep that memory cell holding the largest +** rowid value. Code generated by autoIncEnd() will write the new +** largest value of the counter back into the sqlite_sequence table. +** +** This routine returns the index of the mem[] cell that contains +** the maximum rowid counter. +** +** Two memory cells are allocated. The next memory cell after the +** one returned holds the rowid in sqlite_sequence where we will +** write back the revised maximum rowid. +*/ +static int autoIncBegin( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database holding pTab */ + Table *pTab /* The table we are writing to */ +){ + int memId = 0; + if( pTab->autoInc ){ + Vdbe *v = pParse->pVdbe; + Db *pDb = &pParse->db->aDb[iDb]; + int iCur = pParse->nTab; + int addr; + assert( v ); + addr = sqlite3VdbeCurrentAddr(v); + memId = pParse->nMem+1; + pParse->nMem += 2; + sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenRead); + sqlite3VdbeAddOp(v, OP_Rewind, iCur, addr+13); + sqlite3VdbeAddOp(v, OP_Column, iCur, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); + sqlite3VdbeAddOp(v, OP_Ne, 0x100, addr+12); + sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); + sqlite3VdbeAddOp(v, OP_MemStore, memId-1, 1); + sqlite3VdbeAddOp(v, OP_Column, iCur, 1); + sqlite3VdbeAddOp(v, OP_MemStore, memId, 1); + sqlite3VdbeAddOp(v, OP_Goto, 0, addr+13); + sqlite3VdbeAddOp(v, OP_Next, iCur, addr+4); + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } + return memId; +} + +/* +** Update the maximum rowid for an autoincrement calculation. +** +** This routine should be called when the top of the stack holds a +** new rowid that is about to be inserted. If that new rowid is +** larger than the maximum rowid in the memId memory cell, then the +** memory cell is updated. The stack is unchanged. +*/ +static void autoIncStep(Parse *pParse, int memId){ + if( memId>0 ){ + sqlite3VdbeAddOp(pParse->pVdbe, OP_MemMax, memId, 0); + } +} + +/* +** After doing one or more inserts, the maximum rowid is stored +** in mem[memId]. Generate code to write this value back into the +** the sqlite_sequence table. +*/ +static void autoIncEnd( + Parse *pParse, /* The parsing context */ + int iDb, /* Index of the database holding pTab */ + Table *pTab, /* Table we are inserting into */ + int memId /* Memory cell holding the maximum rowid */ +){ + if( pTab->autoInc ){ + int iCur = pParse->nTab; + Vdbe *v = pParse->pVdbe; + Db *pDb = &pParse->db->aDb[iDb]; + int addr; + assert( v ); + addr = sqlite3VdbeCurrentAddr(v); + sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); + sqlite3VdbeAddOp(v, OP_MemLoad, memId-1, 0); + sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+7); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_NewRowid, iCur, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); + sqlite3VdbeAddOp(v, OP_MemLoad, memId, 0); + sqlite3VdbeAddOp(v, OP_MakeRecord, 2, 0); + sqlite3VdbeAddOp(v, OP_Insert, iCur, OPFLAG_APPEND); + sqlite3VdbeAddOp(v, OP_Close, iCur, 0); + } +} +#else +/* +** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines +** above are all no-ops +*/ +# define autoIncBegin(A,B,C) (0) +# define autoIncStep(A,B) +# define autoIncEnd(A,B,C,D) +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + + +/* Forward declaration */ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +); + +/* +** This routine is call to handle SQL of the following forms: +** +** insert into TABLE (IDLIST) values(EXPRLIST) +** insert into TABLE (IDLIST) select +** +** The IDLIST following the table name is always optional. If omitted, +** then a list of all columns for the table is substituted. The IDLIST +** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted. +** +** The pList parameter holds EXPRLIST in the first form of the INSERT +** statement above, and pSelect is NULL. For the second form, pList is +** NULL and pSelect is a pointer to the select statement used to generate +** data for the insert. +** +** The code generated follows one of four templates. For a simple +** select with data coming from a VALUES clause, the code executes +** once straight down through. The template looks like this: +** +** open write cursor to
      and its indices +** puts VALUES clause expressions onto the stack +** write the resulting record into
      +** cleanup +** +** The three remaining templates assume the statement is of the form +** +** INSERT INTO
      SELECT ... +** +** If the SELECT clause is of the restricted form "SELECT * FROM " - +** in other words if the SELECT pulls all columns from a single table +** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and +** if and are distinct tables but have identical +** schemas, including all the same indices, then a special optimization +** is invoked that copies raw records from over to . +** See the xferOptimization() function for the implementation of this +** template. This is the second template. +** +** open a write cursor to
      +** open read cursor on +** transfer all records in over to
      +** close cursors +** foreach index on
      +** open a write cursor on the
      index +** open a read cursor on the corresponding index +** transfer all records from the read to the write cursors +** close cursors +** end foreach +** +** The third template is for when the second template does not apply +** and the SELECT clause does not read from
      at any time. +** The generated code follows this template: +** +** goto B +** A: setup for the SELECT +** loop over the rows in the SELECT +** gosub C +** end loop +** cleanup after the SELECT +** goto D +** B: open write cursor to
      and its indices +** goto A +** C: insert the select result into
      +** return +** D: cleanup +** +** The fourth template is used if the insert statement takes its +** values from a SELECT but the data is being inserted into a table +** that is also read as part of the SELECT. In the third form, +** we have to use a intermediate table to store the results of +** the select. The template is like this: +** +** goto B +** A: setup for the SELECT +** loop over the tables in the SELECT +** gosub C +** end loop +** cleanup after the SELECT +** goto D +** C: insert the select result into the intermediate table +** return +** B: open a cursor to an intermediate table +** goto A +** D: open write cursor to
      and its indices +** loop over the intermediate table +** transfer values form intermediate table into
      +** end the loop +** cleanup +*/ +void sqlite3Insert( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* Name of table into which we are inserting */ + ExprList *pList, /* List of values to be inserted */ + Select *pSelect, /* A SELECT statement to use as the data source */ + IdList *pColumn, /* Column names corresponding to IDLIST. */ + int onError /* How to handle constraint errors */ +){ + Table *pTab; /* The table to insert into */ + char *zTab; /* Name of the table into which we are inserting */ + const char *zDb; /* Name of the database holding this table */ + int i, j, idx; /* Loop counters */ + Vdbe *v; /* Generate code into this virtual machine */ + Index *pIdx; /* For looping over indices of the table */ + int nColumn; /* Number of columns in the data */ + int base = 0; /* VDBE Cursor number for pTab */ + int iCont=0,iBreak=0; /* Beginning and end of the loop over srcTab */ + sqlite3 *db; /* The main database structure */ + int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ + int endOfLoop; /* Label for the end of the insertion loop */ + int useTempTable = 0; /* Store SELECT results in intermediate table */ + int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ + int iSelectLoop = 0; /* Address of code that implements the SELECT */ + int iCleanup = 0; /* Address of the cleanup code */ + int iInsertBlock = 0; /* Address of the subroutine used to insert data */ + int iCntMem = 0; /* Memory cell used for the row counter */ + int newIdx = -1; /* Cursor for the NEW table */ + Db *pDb; /* The database containing table being inserted into */ + int counterMem = 0; /* Memory cell holding AUTOINCREMENT counter */ + int appendFlag = 0; /* True if the insert is likely to be an append */ + int iDb; + + int nHidden = 0; + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to insert into a view */ + int triggers_exist = 0; /* True if there are FOR EACH ROW triggers */ +#endif + + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto insert_cleanup; + } + + /* Locate the table into which we will be inserting new information. + */ + assert( pTabList->nSrc==1 ); + zTab = pTabList->a[0].zName; + if( zTab==0 ) goto insert_cleanup; + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ){ + goto insert_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + pDb = &db->aDb[iDb]; + zDb = pDb->zName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ + goto insert_cleanup; + } + + /* Figure out if we have any triggers and if the table being + ** inserted into is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0); + isView = pTab->pSelect!=0; +#else +# define triggers_exist 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + + /* Ensure that: + * (a) the table is not read-only, + * (b) that if it is a view then ON INSERT triggers exist + */ + if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){ + goto insert_cleanup; + } + assert( pTab!=0 ); + + /* If pTab is really a view, make sure it has been initialized. + ** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual + ** module table). + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto insert_cleanup; + } + + /* Allocate a VDBE + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto insert_cleanup; + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pSelect || triggers_exist, iDb); + + /* if there are row triggers, allocate a temp table for new.* references. */ + if( triggers_exist ){ + newIdx = pParse->nTab++; + } + +#ifndef SQLITE_OMIT_XFER_OPT + /* If the statement is of the form + ** + ** INSERT INTO SELECT * FROM ; + ** + ** Then special optimizations can be applied that make the transfer + ** very fast and which reduce fragmentation of indices. + */ + if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ + assert( !triggers_exist ); + assert( pList==0 ); + goto insert_cleanup; + } +#endif /* SQLITE_OMIT_XFER_OPT */ + + /* If this is an AUTOINCREMENT table, look up the sequence number in the + ** sqlite_sequence table and store it in memory cell counterMem. Also + ** remember the rowid of the sqlite_sequence table entry in memory cell + ** counterRowid. + */ + counterMem = autoIncBegin(pParse, iDb, pTab); + + /* Figure out how many columns of data are supplied. If the data + ** is coming from a SELECT statement, then this step also generates + ** all the code to implement the SELECT statement and invoke a subroutine + ** to process each row of the result. (Template 2.) If the SELECT + ** statement uses the the table that is being inserted into, then the + ** subroutine is also coded here. That subroutine stores the SELECT + ** results in a temporary table. (Template 3.) + */ + if( pSelect ){ + /* Data is coming from a SELECT. Generate code to implement that SELECT + */ + int rc, iInitCode; + iInitCode = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); + iSelectLoop = sqlite3VdbeCurrentAddr(v); + iInsertBlock = sqlite3VdbeMakeLabel(v); + + /* Resolve the expressions in the SELECT statement and execute it. */ + rc = sqlite3Select(pParse, pSelect, SRT_Subroutine, iInsertBlock,0,0,0,0); + if( rc || pParse->nErr || db->mallocFailed ){ + goto insert_cleanup; + } + + iCleanup = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp(v, OP_Goto, 0, iCleanup); + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + + /* Set useTempTable to TRUE if the result of the SELECT statement + ** should be written into a temporary table. Set to FALSE if each + ** row of the SELECT can be written directly into the result table. + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. + */ + if( triggers_exist || selectReadsTable(pSelect,pTab->pSchema,pTab->tnum) ){ + useTempTable = 1; + } + + if( useTempTable ){ + /* Generate the subroutine that SELECT calls to process each row of + ** the result. Store the result in a temporary table + */ + srcTab = pParse->nTab++; + sqlite3VdbeResolveLabel(v, iInsertBlock); + sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); + sqlite3VdbeAddOp(v, OP_NewRowid, srcTab, 0); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + sqlite3VdbeAddOp(v, OP_Insert, srcTab, OPFLAG_APPEND); + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + + /* The following code runs first because the GOTO at the very top + ** of the program jumps to it. Create the temporary table, then jump + ** back up and execute the SELECT code above. + */ + sqlite3VdbeJumpHere(v, iInitCode); + sqlite3VdbeAddOp(v, OP_OpenEphemeral, srcTab, 0); + sqlite3VdbeAddOp(v, OP_SetNumColumns, srcTab, nColumn); + sqlite3VdbeAddOp(v, OP_Goto, 0, iSelectLoop); + sqlite3VdbeResolveLabel(v, iCleanup); + }else{ + sqlite3VdbeJumpHere(v, iInitCode); + } + }else{ + /* This is the case if the data for the INSERT is coming from a VALUES + ** clause + */ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + srcTab = -1; + useTempTable = 0; + nColumn = pList ? pList->nExpr : 0; + for(i=0; ia[i].pExpr) ){ + goto insert_cleanup; + } + } + } + + /* Make sure the number of columns in the source data matches the number + ** of columns to be inserted into the table. + */ + if( IsVirtual(pTab) ){ + for(i=0; inCol; i++){ + nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + } + } + if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ + sqlite3ErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList, 0, pTab->nCol, nColumn); + goto insert_cleanup; + } + if( pColumn!=0 && nColumn!=pColumn->nId ){ + sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); + goto insert_cleanup; + } + + /* If the INSERT statement included an IDLIST term, then make sure + ** all elements of the IDLIST really are columns of the table and + ** remember the column indices. + ** + ** If the table has an INTEGER PRIMARY KEY column and that column + ** is named in the IDLIST, then record in the keyColumn variable + ** the index into IDLIST of the primary key column. keyColumn is + ** the index of the primary key as it appears in IDLIST, not as + ** is appears in the original table. (The index of the primary + ** key in the original table is pTab->iPKey.) + */ + if( pColumn ){ + for(i=0; inId; i++){ + pColumn->a[i].idx = -1; + } + for(i=0; inId; i++){ + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ + pColumn->a[i].idx = j; + if( j==pTab->iPKey ){ + keyColumn = i; + } + break; + } + } + if( j>=pTab->nCol ){ + if( sqlite3IsRowid(pColumn->a[i].zName) ){ + keyColumn = i; + }else{ + sqlite3ErrorMsg(pParse, "table %S has no column named %s", + pTabList, 0, pColumn->a[i].zName); + pParse->nErr++; + goto insert_cleanup; + } + } + } + } + + /* If there is no IDLIST term but the table has an integer primary + ** key, the set the keyColumn variable to the primary key column index + ** in the original table definition. + */ + if( pColumn==0 && nColumn>0 ){ + keyColumn = pTab->iPKey; + } + + /* Open the temp table for FOR EACH ROW triggers + */ + if( triggers_exist ){ + sqlite3VdbeAddOp(v, OP_OpenPseudo, newIdx, 0); + sqlite3VdbeAddOp(v, OP_SetNumColumns, newIdx, pTab->nCol); + } + + /* Initialize the count of rows to be inserted + */ + if( db->flags & SQLITE_CountRows ){ + iCntMem = pParse->nMem++; + sqlite3VdbeAddOp(v, OP_MemInt, 0, iCntMem); + } + + /* Open tables and indices if there are no row triggers */ + if( !triggers_exist ){ + base = pParse->nTab; + sqlite3OpenTableAndIndices(pParse, pTab, base, OP_OpenWrite); + } + + /* If the data source is a temporary table, then we have to create + ** a loop because there might be multiple rows of data. If the data + ** source is a subroutine call from the SELECT statement, then we need + ** to launch the SELECT statement processing. + */ + if( useTempTable ){ + iBreak = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp(v, OP_Rewind, srcTab, iBreak); + iCont = sqlite3VdbeCurrentAddr(v); + }else if( pSelect ){ + sqlite3VdbeAddOp(v, OP_Goto, 0, iSelectLoop); + sqlite3VdbeResolveLabel(v, iInsertBlock); + } + + /* Run the BEFORE and INSTEAD OF triggers, if there are any + */ + endOfLoop = sqlite3VdbeMakeLabel(v); + if( triggers_exist & TRIGGER_BEFORE ){ + + /* build the NEW.* reference row. Note that if there is an INTEGER + ** PRIMARY KEY into which a NULL is being inserted, that NULL will be + ** translated into a unique ID for the row. But on a BEFORE trigger, + ** we do not know what the unique ID will be (because the insert has + ** not happened yet) so we substitute a rowid of -1 + */ + if( keyColumn<0 ){ + sqlite3VdbeAddOp(v, OP_Integer, -1, 0); + }else if( useTempTable ){ + sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); + sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_Integer, -1, 0); + sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); + } + + /* Cannot have triggers on a virtual table. If it were possible, + ** this block would have to account for hidden column. + */ + assert(!IsVirtual(pTab)); + + /* Create the new column data + */ + for(i=0; inCol; i++){ + if( pColumn==0 ){ + j = i; + }else{ + for(j=0; jnId; j++){ + if( pColumn->a[j].idx==i ) break; + } + } + if( pColumn && j>=pColumn->nId ){ + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); + }else if( useTempTable ){ + sqlite3VdbeAddOp(v, OP_Column, srcTab, j); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr); + } + } + sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + + /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, + ** do not attempt any conversions before assembling the record. + ** If this is a real table, attempt conversions as required by the + ** table column affinities. + */ + if( !isView ){ + sqlite3TableAffinityStr(v, pTab); + } + sqlite3VdbeAddOp(v, OP_Insert, newIdx, 0); + + /* Fire BEFORE or INSTEAD OF triggers */ + if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_BEFORE, pTab, + newIdx, -1, onError, endOfLoop) ){ + goto insert_cleanup; + } + } + + /* If any triggers exists, the opening of tables and indices is deferred + ** until now. + */ + if( triggers_exist && !isView ){ + base = pParse->nTab; + sqlite3OpenTableAndIndices(pParse, pTab, base, OP_OpenWrite); + } + + /* Push the record number for the new entry onto the stack. The + ** record number is a randomly generate integer created by NewRowid + ** except when the table has an INTEGER PRIMARY KEY column, in which + ** case the record number is the same as that column. + */ + if( !isView ){ + if( IsVirtual(pTab) ){ + /* The row that the VUpdate opcode will delete: none */ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + } + if( keyColumn>=0 ){ + if( useTempTable ){ + sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); + }else if( pSelect ){ + sqlite3VdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1); + }else{ + VdbeOp *pOp; + sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); + pOp = sqlite3VdbeGetOp(v, sqlite3VdbeCurrentAddr(v) - 1); + if( pOp && pOp->opcode==OP_Null ){ + appendFlag = 1; + pOp->opcode = OP_NewRowid; + pOp->p1 = base; + pOp->p2 = counterMem; + } + } + /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid + ** to generate a unique primary key value. + */ + if( !appendFlag ){ + sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem); + sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); + } + }else if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + }else{ + sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem); + appendFlag = 1; + } + autoIncStep(pParse, counterMem); + + /* Push onto the stack, data for all columns of the new entry, beginning + ** with the first column. + */ + nHidden = 0; + for(i=0; inCol; i++){ + if( i==pTab->iPKey ){ + /* The value of the INTEGER PRIMARY KEY column is always a NULL. + ** Whenever this column is read, the record number will be substituted + ** in its place. So will fill this column with a NULL to avoid + ** taking up data space with information that will never be used. */ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + continue; + } + if( pColumn==0 ){ + if( IsHiddenColumn(&pTab->aCol[i]) ){ + assert( IsVirtual(pTab) ); + j = -1; + nHidden++; + }else{ + j = i - nHidden; + } + }else{ + for(j=0; jnId; j++){ + if( pColumn->a[j].idx==i ) break; + } + } + if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); + }else if( useTempTable ){ + sqlite3VdbeAddOp(v, OP_Column, srcTab, j); + }else if( pSelect ){ + sqlite3VdbeAddOp(v, OP_Dup, i+nColumn-j+IsVirtual(pTab), 1); + }else{ + sqlite3ExprCode(pParse, pList->a[j].pExpr); + } + } + + /* Generate code to check constraints and generate index keys and + ** do the insertion. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + pParse->pVirtualLock = pTab; + sqlite3VdbeOp3(v, OP_VUpdate, 1, pTab->nCol+2, + (const char*)pTab->pVtab, P3_VTAB); + }else +#endif + { + sqlite3GenerateConstraintChecks(pParse, pTab, base, 0, keyColumn>=0, + 0, onError, endOfLoop); + sqlite3CompleteInsertion(pParse, pTab, base, 0,0,0, + (triggers_exist & TRIGGER_AFTER)!=0 ? newIdx : -1, + appendFlag); + } + } + + /* Update the count of rows that are inserted + */ + if( (db->flags & SQLITE_CountRows)!=0 ){ + sqlite3VdbeAddOp(v, OP_MemIncr, 1, iCntMem); + } + + if( triggers_exist ){ + /* Close all tables opened */ + if( !isView ){ + sqlite3VdbeAddOp(v, OP_Close, base, 0); + for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ + sqlite3VdbeAddOp(v, OP_Close, idx+base, 0); + } + } + + /* Code AFTER triggers */ + if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_AFTER, pTab, + newIdx, -1, onError, endOfLoop) ){ + goto insert_cleanup; + } + } + + /* The bottom of the loop, if the data source is a SELECT statement + */ + sqlite3VdbeResolveLabel(v, endOfLoop); + if( useTempTable ){ + sqlite3VdbeAddOp(v, OP_Next, srcTab, iCont); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp(v, OP_Close, srcTab, 0); + }else if( pSelect ){ + sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + sqlite3VdbeResolveLabel(v, iCleanup); + } + + if( !triggers_exist && !IsVirtual(pTab) ){ + /* Close all tables opened */ + sqlite3VdbeAddOp(v, OP_Close, base, 0); + for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ + sqlite3VdbeAddOp(v, OP_Close, idx+base, 0); + } + } + + /* Update the sqlite_sequence table by storing the content of the + ** counter value in memory counterMem back into the sqlite_sequence + ** table. + */ + autoIncEnd(pParse, iDb, pTab, counterMem); + + /* + ** Return the number of rows inserted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){ + sqlite3VdbeAddOp(v, OP_MemLoad, iCntMem, 0); + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", P3_STATIC); + } + +insert_cleanup: + sqlite3SrcListDelete(pTabList); + sqlite3ExprListDelete(pList); + sqlite3SelectDelete(pSelect); + sqlite3IdListDelete(pColumn); +} + +/* +** Generate code to do a constraint check prior to an INSERT or an UPDATE. +** +** When this routine is called, the stack contains (from bottom to top) +** the following values: +** +** 1. The rowid of the row to be updated before the update. This +** value is omitted unless we are doing an UPDATE that involves a +** change to the record number. +** +** 2. The rowid of the row after the update. +** +** 3. The data in the first column of the entry after the update. +** +** i. Data from middle columns... +** +** N. The data in the last column of the entry after the update. +** +** The old rowid shown as entry (1) above is omitted unless both isUpdate +** and rowidChng are 1. isUpdate is true for UPDATEs and false for +** INSERTs and rowidChng is true if the record number is being changed. +** +** The code generated by this routine pushes additional entries onto +** the stack which are the keys for new index entries for the new record. +** The order of index keys is the same as the order of the indices on +** the pTable->pIndex list. A key is only created for index i if +** aIdxUsed!=0 and aIdxUsed[i]!=0. +** +** This routine also generates code to check constraints. NOT NULL, +** CHECK, and UNIQUE constraints are all checked. If a constraint fails, +** then the appropriate action is performed. There are five possible +** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. +** +** Constraint type Action What Happens +** --------------- ---------- ---------------------------------------- +** any ROLLBACK The current transaction is rolled back and +** sqlite3_exec() returns immediately with a +** return code of SQLITE_CONSTRAINT. +** +** any ABORT Back out changes from the current command +** only (do not do a complete rollback) then +** cause sqlite3_exec() to return immediately +** with SQLITE_CONSTRAINT. +** +** any FAIL Sqlite_exec() returns immediately with a +** return code of SQLITE_CONSTRAINT. The +** transaction is not rolled back and any +** prior changes are retained. +** +** any IGNORE The record number and data is popped from +** the stack and there is an immediate jump +** to label ignoreDest. +** +** NOT NULL REPLACE The NULL value is replace by the default +** value for that column. If the default value +** is NULL, the action is the same as ABORT. +** +** UNIQUE REPLACE The other row that conflicts with the row +** being inserted is removed. +** +** CHECK REPLACE Illegal. The results in an exception. +** +** Which action to take is determined by the overrideError parameter. +** Or if overrideError==OE_Default, then the pParse->onError parameter +** is used. Or if pParse->onError==OE_Default then the onError value +** for the constraint is used. +** +** The calling routine must open a read/write cursor for pTab with +** cursor number "base". All indices of pTab must also have open +** read/write cursors with cursor number base+i for the i-th cursor. +** Except, if there is no possibility of a REPLACE action then +** cursors do not need to be open for indices where aIdxUsed[i]==0. +** +** If the isUpdate flag is true, it means that the "base" cursor is +** initially pointing to an entry that is being updated. The isUpdate +** flag causes extra code to be generated so that the "base" cursor +** is still pointing at the same entry after the routine returns. +** Without the isUpdate flag, the "base" cursor might be moved. +*/ +void sqlite3GenerateConstraintChecks( + Parse *pParse, /* The parser context */ + Table *pTab, /* the table into which we are inserting */ + int base, /* Index of a read/write cursor pointing at pTab */ + char *aIdxUsed, /* Which indices are used. NULL means all are used */ + int rowidChng, /* True if the record number will change */ + int isUpdate, /* True for UPDATE, False for INSERT */ + int overrideError, /* Override onError to this if not OE_Default */ + int ignoreDest /* Jump to this label on an OE_Ignore resolution */ +){ + int i; + Vdbe *v; + int nCol; + int onError; + int addr; + int extra; + int iCur; + Index *pIdx; + int seenReplace = 0; + int jumpInst1=0, jumpInst2; + int hasTwoRowids = (isUpdate && rowidChng); + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + nCol = pTab->nCol; + + /* Test all NOT NULL constraints. + */ + for(i=0; iiPKey ){ + continue; + } + onError = pTab->aCol[i].notNull; + if( onError==OE_None ) continue; + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ + onError = OE_Abort; + } + sqlite3VdbeAddOp(v, OP_Dup, nCol-1-i, 1); + addr = sqlite3VdbeAddOp(v, OP_NotNull, 1, 0); + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + switch( onError ){ + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + char *zMsg = 0; + sqlite3VdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); + sqlite3SetString(&zMsg, pTab->zName, ".", pTab->aCol[i].zName, + " may not be NULL", (char*)0); + sqlite3VdbeChangeP3(v, -1, zMsg, P3_DYNAMIC); + break; + } + case OE_Ignore: { + sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); + break; + } + case OE_Replace: { + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); + sqlite3VdbeAddOp(v, OP_Push, nCol-i, 0); + break; + } + } + sqlite3VdbeJumpHere(v, addr); + } + + /* Test all CHECK constraints + */ +#ifndef SQLITE_OMIT_CHECK + if( pTab->pCheck && (pParse->db->flags & SQLITE_IgnoreChecks)==0 ){ + int allOk = sqlite3VdbeMakeLabel(v); + assert( pParse->ckOffset==0 ); + pParse->ckOffset = nCol; + sqlite3ExprIfTrue(pParse, pTab->pCheck, allOk, 1); + assert( pParse->ckOffset==nCol ); + pParse->ckOffset = 0; + onError = overrideError!=OE_Default ? overrideError : OE_Abort; + if( onError==OE_Ignore ){ + sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); + }else{ + sqlite3VdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); + } + sqlite3VdbeResolveLabel(v, allOk); + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* If we have an INTEGER PRIMARY KEY, make sure the primary key + ** of the new record does not previously exist. Except, if this + ** is an UPDATE and the primary key is not changing, that is OK. + */ + if( rowidChng ){ + onError = pTab->keyConf; + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + if( isUpdate ){ + sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); + sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); + jumpInst1 = sqlite3VdbeAddOp(v, OP_Eq, 0, 0); + } + sqlite3VdbeAddOp(v, OP_Dup, nCol, 1); + jumpInst2 = sqlite3VdbeAddOp(v, OP_NotExists, base, 0); + switch( onError ){ + default: { + onError = OE_Abort; + /* Fall thru into the next case */ + } + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, + "PRIMARY KEY must be unique", P3_STATIC); + break; + } + case OE_Replace: { + sqlite3GenerateRowIndexDelete(v, pTab, base, 0); + if( isUpdate ){ + sqlite3VdbeAddOp(v, OP_Dup, nCol+hasTwoRowids, 1); + sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); + } + seenReplace = 1; + break; + } + case OE_Ignore: { + assert( seenReplace==0 ); + sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); + break; + } + } + sqlite3VdbeJumpHere(v, jumpInst2); + if( isUpdate ){ + sqlite3VdbeJumpHere(v, jumpInst1); + sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); + sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); + } + } + + /* Test all UNIQUE constraints by creating entries for each UNIQUE + ** index and making sure that duplicate entries do not already exist. + ** Add the new records to the indices as we go. + */ + extra = -1; + for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){ + if( aIdxUsed && aIdxUsed[iCur]==0 ) continue; /* Skip unused indices */ + extra++; + + /* Create a key for accessing the index entry */ + sqlite3VdbeAddOp(v, OP_Dup, nCol+extra, 1); + for(i=0; inColumn; i++){ + int idx = pIdx->aiColumn[i]; + if( idx==pTab->iPKey ){ + sqlite3VdbeAddOp(v, OP_Dup, i+extra+nCol+1, 1); + }else{ + sqlite3VdbeAddOp(v, OP_Dup, i+extra+nCol-idx, 1); + } + } + jumpInst1 = sqlite3VdbeAddOp(v, OP_MakeIdxRec, pIdx->nColumn, 0); + sqlite3IndexAffinityStr(v, pIdx); + + /* Find out what action to take in case there is an indexing conflict */ + onError = pIdx->onError; + if( onError==OE_None ) continue; /* pIdx is not a UNIQUE index */ + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( seenReplace ){ + if( onError==OE_Ignore ) onError = OE_Replace; + else if( onError==OE_Fail ) onError = OE_Abort; + } + + + /* Check to see if the new index entry will be unique */ + sqlite3VdbeAddOp(v, OP_Dup, extra+nCol+1+hasTwoRowids, 1); + jumpInst2 = sqlite3VdbeAddOp(v, OP_IsUnique, base+iCur+1, 0); + + /* Generate code that executes if the new index entry is not unique */ + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + switch( onError ){ + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + int j, n1, n2; + char zErrMsg[200]; + sqlite3_snprintf(sizeof(zErrMsg), zErrMsg, + pIdx->nColumn>1 ? "columns " : "column "); + n1 = strlen(zErrMsg); + for(j=0; jnColumn && n1aCol[pIdx->aiColumn[j]].zName; + n2 = strlen(zCol); + if( j>0 ){ + sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], ", "); + n1 += 2; + } + if( n1+n2>sizeof(zErrMsg)-30 ){ + sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "..."); + n1 += 3; + break; + }else{ + sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "%s", zCol); + n1 += n2; + } + } + sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], + pIdx->nColumn>1 ? " are not unique" : " is not unique"); + sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, zErrMsg, 0); + break; + } + case OE_Ignore: { + assert( seenReplace==0 ); + sqlite3VdbeAddOp(v, OP_Pop, nCol+extra+3+hasTwoRowids, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); + break; + } + case OE_Replace: { + sqlite3GenerateRowDelete(pParse->db, v, pTab, base, 0); + if( isUpdate ){ + sqlite3VdbeAddOp(v, OP_Dup, nCol+extra+1+hasTwoRowids, 1); + sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); + } + seenReplace = 1; + break; + } + } +#if NULL_DISTINCT_FOR_UNIQUE + sqlite3VdbeJumpHere(v, jumpInst1); +#endif + sqlite3VdbeJumpHere(v, jumpInst2); + } +} + +/* +** This routine generates code to finish the INSERT or UPDATE operation +** that was started by a prior call to sqlite3GenerateConstraintChecks. +** The stack must contain keys for all active indices followed by data +** and the rowid for the new entry. This routine creates the new +** entries in all indices and in the main table. +** +** The arguments to this routine should be the same as the first six +** arguments to sqlite3GenerateConstraintChecks. +*/ +void sqlite3CompleteInsertion( + Parse *pParse, /* The parser context */ + Table *pTab, /* the table into which we are inserting */ + int base, /* Index of a read/write cursor pointing at pTab */ + char *aIdxUsed, /* Which indices are used. NULL means all are used */ + int rowidChng, /* True if the record number will change */ + int isUpdate, /* True for UPDATE, False for INSERT */ + int newIdx, /* Index of NEW table for triggers. -1 if none */ + int appendBias /* True if this is likely to be an append */ +){ + int i; + Vdbe *v; + int nIdx; + Index *pIdx; + int pik_flags; + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){} + for(i=nIdx-1; i>=0; i--){ + if( aIdxUsed && aIdxUsed[i]==0 ) continue; + sqlite3VdbeAddOp(v, OP_IdxInsert, base+i+1, 0); + } + sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); + sqlite3TableAffinityStr(v, pTab); +#ifndef SQLITE_OMIT_TRIGGER + if( newIdx>=0 ){ + sqlite3VdbeAddOp(v, OP_Dup, 1, 0); + sqlite3VdbeAddOp(v, OP_Dup, 1, 0); + sqlite3VdbeAddOp(v, OP_Insert, newIdx, 0); + } +#endif + if( pParse->nested ){ + pik_flags = 0; + }else{ + pik_flags = OPFLAG_NCHANGE; + pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID); + } + if( appendBias ){ + pik_flags |= OPFLAG_APPEND; + } + sqlite3VdbeAddOp(v, OP_Insert, base, pik_flags); + if( !pParse->nested ){ + sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); + } + + if( isUpdate && rowidChng ){ + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + } +} + +/* +** Generate code that will open cursors for a table and for all +** indices of that table. The "base" parameter is the cursor number used +** for the table. Indices are opened on subsequent cursors. +*/ +void sqlite3OpenTableAndIndices( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table to be opened */ + int base, /* Cursor number assigned to the table */ + int op /* OP_OpenRead or OP_OpenWrite */ +){ + int i; + int iDb; + Index *pIdx; + Vdbe *v; + + if( IsVirtual(pTab) ) return; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + sqlite3OpenTable(pParse, base, iDb, pTab, op); + for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + VdbeComment((v, "# %s", pIdx->zName)); + sqlite3VdbeOp3(v, op, i+base, pIdx->tnum, (char*)pKey, P3_KEYINFO_HANDOFF); + } + if( pParse->nTab<=base+i ){ + pParse->nTab = base+i; + } +} + + +#ifdef SQLITE_TEST +/* +** The following global variable is incremented whenever the +** transfer optimization is used. This is used for testing +** purposes only - to make sure the transfer optimization really +** is happening when it is suppose to. +*/ +int sqlite3_xferopt_count; +#endif /* SQLITE_TEST */ + + +#ifndef SQLITE_OMIT_XFER_OPT +/* +** Check to collation names to see if they are compatible. +*/ +static int xferCompatibleCollation(const char *z1, const char *z2){ + if( z1==0 ){ + return z2==0; + } + if( z2==0 ){ + return 0; + } + return sqlite3StrICmp(z1, z2)==0; +} + + +/* +** Check to see if index pSrc is compatible as a source of data +** for index pDest in an insert transfer optimization. The rules +** for a compatible index: +** +** * The index is over the same set of columns +** * The same DESC and ASC markings occurs on all columns +** * The same onError processing (OE_Abort, OE_Ignore, etc) +** * The same collating sequence on each column +*/ +static int xferCompatibleIndex(Index *pDest, Index *pSrc){ + int i; + assert( pDest && pSrc ); + assert( pDest->pTable!=pSrc->pTable ); + if( pDest->nColumn!=pSrc->nColumn ){ + return 0; /* Different number of columns */ + } + if( pDest->onError!=pSrc->onError ){ + return 0; /* Different conflict resolution strategies */ + } + for(i=0; inColumn; i++){ + if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ + return 0; /* Different columns indexed */ + } + if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ + return 0; /* Different sort orders */ + } + if( pSrc->azColl[i]!=pDest->azColl[i] ){ + return 0; /* Different sort orders */ + } + } + + /* If no test above fails then the indices must be compatible */ + return 1; +} + +/* +** Attempt the transfer optimization on INSERTs of the form +** +** INSERT INTO tab1 SELECT * FROM tab2; +** +** This optimization is only attempted if +** +** (1) tab1 and tab2 have identical schemas including all the +** same indices and constraints +** +** (2) tab1 and tab2 are different tables +** +** (3) There must be no triggers on tab1 +** +** (4) The result set of the SELECT statement is "*" +** +** (5) The SELECT statement has no WHERE, HAVING, ORDER BY, GROUP BY, +** or LIMIT clause. +** +** (6) The SELECT statement is a simple (not a compound) select that +** contains only tab2 in its FROM clause +** +** This method for implementing the INSERT transfers raw records from +** tab2 over to tab1. The columns are not decoded. Raw records from +** the indices of tab2 are transfered to tab1 as well. In so doing, +** the resulting tab1 has much less fragmentation. +** +** This routine returns TRUE if the optimization is attempted. If any +** of the conditions above fail so that the optimization should not +** be attempted, then this routine returns FALSE. +*/ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +){ + ExprList *pEList; /* The result set of the SELECT */ + Table *pSrc; /* The table in the FROM clause of SELECT */ + Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ + struct SrcList_item *pItem; /* An element of pSelect->pSrc */ + int i; /* Loop counter */ + int iDbSrc; /* The database of pSrc */ + int iSrc, iDest; /* Cursors from source and destination */ + int addr1, addr2; /* Loop addresses */ + int emptyDestTest; /* Address of test for empty pDest */ + int emptySrcTest; /* Address of test for empty pSrc */ + Vdbe *v; /* The VDBE we are building */ + KeyInfo *pKey; /* Key information for an index */ + int counterMem; /* Memory register used by AUTOINC */ + int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ + + if( pSelect==0 ){ + return 0; /* Must be of the form INSERT INTO ... SELECT ... */ + } + if( pDest->pTrigger ){ + return 0; /* tab1 must not have triggers */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pDest->isVirtual ){ + return 0; /* tab1 must not be a virtual table */ + } +#endif + if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError!=OE_Abort && onError!=OE_Rollback ){ + return 0; /* Cannot do OR REPLACE or OR IGNORE or OR FAIL */ + } + assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ + if( pSelect->pSrc->nSrc!=1 ){ + return 0; /* FROM clause must have exactly one term */ + } + if( pSelect->pSrc->a[0].pSelect ){ + return 0; /* FROM clause cannot contain a subquery */ + } + if( pSelect->pWhere ){ + return 0; /* SELECT may not have a WHERE clause */ + } + if( pSelect->pOrderBy ){ + return 0; /* SELECT may not have an ORDER BY clause */ + } + /* Do not need to test for a HAVING clause. If HAVING is present but + ** there is no ORDER BY, we will get an error. */ + if( pSelect->pGroupBy ){ + return 0; /* SELECT may not have a GROUP BY clause */ + } + if( pSelect->pLimit ){ + return 0; /* SELECT may not have a LIMIT clause */ + } + assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */ + if( pSelect->pPrior ){ + return 0; /* SELECT may not be a compound query */ + } + if( pSelect->isDistinct ){ + return 0; /* SELECT may not be DISTINCT */ + } + pEList = pSelect->pEList; + assert( pEList!=0 ); + if( pEList->nExpr!=1 ){ + return 0; /* The result set must have exactly one column */ + } + assert( pEList->a[0].pExpr ); + if( pEList->a[0].pExpr->op!=TK_ALL ){ + return 0; /* The result set must be the special operator "*" */ + } + + /* At this point we have established that the statement is of the + ** correct syntactic form to participate in this optimization. Now + ** we have to check the semantics. + */ + pItem = pSelect->pSrc->a; + pSrc = sqlite3LocateTable(pParse, pItem->zName, pItem->zDatabase); + if( pSrc==0 ){ + return 0; /* FROM clause does not contain a real table */ + } + if( pSrc==pDest ){ + return 0; /* tab1 and tab2 may not be the same table */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pSrc->isVirtual ){ + return 0; /* tab2 must not be a virtual table */ + } +#endif + if( pSrc->pSelect ){ + return 0; /* tab2 may not be a view */ + } + if( pDest->nCol!=pSrc->nCol ){ + return 0; /* Number of columns must be the same in tab1 and tab2 */ + } + if( pDest->iPKey!=pSrc->iPKey ){ + return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ + } + for(i=0; inCol; i++){ + if( pDest->aCol[i].affinity!=pSrc->aCol[i].affinity ){ + return 0; /* Affinity must be the same on all columns */ + } + if( !xferCompatibleCollation(pDest->aCol[i].zColl, pSrc->aCol[i].zColl) ){ + return 0; /* Collating sequence must be the same on all columns */ + } + if( pDest->aCol[i].notNull && !pSrc->aCol[i].notNull ){ + return 0; /* tab2 must be NOT NULL if tab1 is */ + } + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + if( pDestIdx->onError!=OE_None ){ + destHasUniqueIdx = 1; + } + for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + if( pSrcIdx==0 ){ + return 0; /* pDestIdx has no corresponding index in pSrc */ + } + } +#ifndef SQLITE_OMIT_CHECK + if( pDest->pCheck && !sqlite3ExprCompare(pSrc->pCheck, pDest->pCheck) ){ + return 0; /* Tables have different CHECK constraints. Ticket #2252 */ + } +#endif + + /* If we get this far, it means either: + ** + ** * We can always do the transfer if the table contains an + ** an integer primary key + ** + ** * We can conditionally do the transfer if the destination + ** table is empty. + */ +#ifdef SQLITE_TEST + sqlite3_xferopt_count++; +#endif + iDbSrc = sqlite3SchemaToIndex(pParse->db, pSrc->pSchema); + v = sqlite3GetVdbe(pParse); + sqlite3CodeVerifySchema(pParse, iDbSrc); + iSrc = pParse->nTab++; + iDest = pParse->nTab++; + counterMem = autoIncBegin(pParse, iDbDest, pDest); + sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); + if( (pDest->iPKey<0 && pDest->pIndex!=0) || destHasUniqueIdx ){ + /* If tables do not have an INTEGER PRIMARY KEY and there + ** are indices to be copied and the destination is not empty, + ** we have to disallow the transfer optimization because the + ** the rowids might change which will mess up indexing. + ** + ** Or if the destination has a UNIQUE index and is not empty, + ** we also disallow the transfer optimization because we cannot + ** insure that all entries in the union of DEST and SRC will be + ** unique. + */ + addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iDest, 0); + emptyDestTest = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); + sqlite3VdbeJumpHere(v, addr1); + }else{ + emptyDestTest = 0; + } + sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); + emptySrcTest = sqlite3VdbeAddOp(v, OP_Rewind, iSrc, 0); + if( pDest->iPKey>=0 ){ + addr1 = sqlite3VdbeAddOp(v, OP_Rowid, iSrc, 0); + sqlite3VdbeAddOp(v, OP_Dup, 0, 0); + addr2 = sqlite3VdbeAddOp(v, OP_NotExists, iDest, 0); + sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, + "PRIMARY KEY must be unique", P3_STATIC); + sqlite3VdbeJumpHere(v, addr2); + autoIncStep(pParse, counterMem); + }else if( pDest->pIndex==0 ){ + addr1 = sqlite3VdbeAddOp(v, OP_NewRowid, iDest, 0); + }else{ + addr1 = sqlite3VdbeAddOp(v, OP_Rowid, iSrc, 0); + assert( pDest->autoInc==0 ); + } + sqlite3VdbeAddOp(v, OP_RowData, iSrc, 0); + sqlite3VdbeOp3(v, OP_Insert, iDest, + OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND, + pDest->zName, 0); + sqlite3VdbeAddOp(v, OP_Next, iSrc, addr1); + autoIncEnd(pParse, iDbDest, pDest, counterMem); + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + assert( pSrcIdx ); + sqlite3VdbeAddOp(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp(v, OP_Close, iDest, 0); + sqlite3VdbeAddOp(v, OP_Integer, iDbSrc, 0); + pKey = sqlite3IndexKeyinfo(pParse, pSrcIdx); + VdbeComment((v, "# %s", pSrcIdx->zName)); + sqlite3VdbeOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, + (char*)pKey, P3_KEYINFO_HANDOFF); + sqlite3VdbeAddOp(v, OP_Integer, iDbDest, 0); + pKey = sqlite3IndexKeyinfo(pParse, pDestIdx); + VdbeComment((v, "# %s", pDestIdx->zName)); + sqlite3VdbeOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, + (char*)pKey, P3_KEYINFO_HANDOFF); + addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iSrc, 0); + sqlite3VdbeAddOp(v, OP_RowKey, iSrc, 0); + sqlite3VdbeAddOp(v, OP_IdxInsert, iDest, 1); + sqlite3VdbeAddOp(v, OP_Next, iSrc, addr1+1); + sqlite3VdbeJumpHere(v, addr1); + } + sqlite3VdbeJumpHere(v, emptySrcTest); + sqlite3VdbeAddOp(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp(v, OP_Close, iDest, 0); + if( emptyDestTest ){ + sqlite3VdbeAddOp(v, OP_Halt, SQLITE_OK, 0); + sqlite3VdbeJumpHere(v, emptyDestTest); + sqlite3VdbeAddOp(v, OP_Close, iDest, 0); + return 0; + }else{ + return 1; + } +} +#endif /* SQLITE_OMIT_XFER_OPT */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c b/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c new file mode 100644 index 0000000000..7cbe5bc9ff --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c @@ -0,0 +1,238 @@ +/* +** 2007 August 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** @(#) $Id: journal.c,v 1.7 2007/09/06 13:49:37 drh Exp $ +*/ + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + +/* +** This file implements a special kind of sqlite3_file object used +** by SQLite to create journal files if the atomic-write optimization +** is enabled. +** +** The distinctive characteristic of this sqlite3_file is that the +** actual on disk file is created lazily. When the file is created, +** the caller specifies a buffer size for an in-memory buffer to +** be used to service read() and write() requests. The actual file +** on disk is not created or populated until either: +** +** 1) The in-memory representation grows too large for the allocated +** buffer, or +** 2) The xSync() method is called. +*/ + +#include "sqliteInt.h" + + +/* +** A JournalFile object is a subclass of sqlite3_file used by +** as an open file handle for journal files. +*/ +struct JournalFile { + sqlite3_io_methods *pMethod; /* I/O methods on journal files */ + int nBuf; /* Size of zBuf[] in bytes */ + char *zBuf; /* Space to buffer journal writes */ + int iSize; /* Amount of zBuf[] currently used */ + int flags; /* xOpen flags */ + sqlite3_vfs *pVfs; /* The "real" underlying VFS */ + sqlite3_file *pReal; /* The "real" underlying file descriptor */ + const char *zJournal; /* Name of the journal file */ +}; +typedef struct JournalFile JournalFile; + +/* +** If it does not already exists, create and populate the on-disk file +** for JournalFile p. +*/ +static int createFile(JournalFile *p){ + int rc = SQLITE_OK; + if( !p->pReal ){ + sqlite3_file *pReal = (sqlite3_file *)&p[1]; + rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0); + if( rc==SQLITE_OK ){ + p->pReal = pReal; + if( p->iSize>0 ){ + assert(p->iSize<=p->nBuf); + rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0); + } + } + } + return rc; +} + +/* +** Close the file. +*/ +static int jrnlClose(sqlite3_file *pJfd){ + JournalFile *p = (JournalFile *)pJfd; + if( p->pReal ){ + sqlite3OsClose(p->pReal); + } + sqlite3_free(p->zBuf); + return SQLITE_OK; +} + +/* +** Read data from the file. +*/ +static int jrnlRead( + sqlite3_file *pJfd, /* The journal file from which to read */ + void *zBuf, /* Put the results here */ + int iAmt, /* Number of bytes to read */ + sqlite_int64 iOfst /* Begin reading at this offset */ +){ + int rc = SQLITE_OK; + JournalFile *p = (JournalFile *)pJfd; + if( p->pReal ){ + rc = sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst); + }else{ + assert( iAmt+iOfst<=p->iSize ); + memcpy(zBuf, &p->zBuf[iOfst], iAmt); + } + return rc; +} + +/* +** Write data to the file. +*/ +static int jrnlWrite( + sqlite3_file *pJfd, /* The journal file into which to write */ + const void *zBuf, /* Take data to be written from here */ + int iAmt, /* Number of bytes to write */ + sqlite_int64 iOfst /* Begin writing at this offset into the file */ +){ + int rc = SQLITE_OK; + JournalFile *p = (JournalFile *)pJfd; + if( !p->pReal && (iOfst+iAmt)>p->nBuf ){ + rc = createFile(p); + } + if( rc==SQLITE_OK ){ + if( p->pReal ){ + rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst); + }else{ + memcpy(&p->zBuf[iOfst], zBuf, iAmt); + if( p->iSize<(iOfst+iAmt) ){ + p->iSize = (iOfst+iAmt); + } + } + } + return rc; +} + +/* +** Truncate the file. +*/ +static int jrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ + int rc = SQLITE_OK; + JournalFile *p = (JournalFile *)pJfd; + if( p->pReal ){ + rc = sqlite3OsTruncate(p->pReal, size); + }else if( sizeiSize ){ + p->iSize = size; + } + return rc; +} + +/* +** Sync the file. +*/ +static int jrnlSync(sqlite3_file *pJfd, int flags){ + int rc; + JournalFile *p = (JournalFile *)pJfd; + rc = createFile(p); + if( rc==SQLITE_OK ){ + rc = sqlite3OsSync(p->pReal, flags); + } + return rc; +} + +/* +** Query the size of the file in bytes. +*/ +static int jrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ + int rc = SQLITE_OK; + JournalFile *p = (JournalFile *)pJfd; + if( p->pReal ){ + rc = sqlite3OsFileSize(p->pReal, pSize); + }else{ + *pSize = (sqlite_int64) p->iSize; + } + return rc; +} + +/* +** Table of methods for JournalFile sqlite3_file object. +*/ +static struct sqlite3_io_methods JournalFileMethods = { + 1, /* iVersion */ + jrnlClose, /* xClose */ + jrnlRead, /* xRead */ + jrnlWrite, /* xWrite */ + jrnlTruncate, /* xTruncate */ + jrnlSync, /* xSync */ + jrnlFileSize, /* xFileSize */ + 0, /* xLock */ + 0, /* xUnlock */ + 0, /* xCheckReservedLock */ + 0, /* xFileControl */ + 0, /* xSectorSize */ + 0 /* xDeviceCharacteristics */ +}; + +/* +** Open a journal file. +*/ +int sqlite3JournalOpen( + sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ + const char *zName, /* Name of the journal file */ + sqlite3_file *pJfd, /* Preallocated, blank file handle */ + int flags, /* Opening flags */ + int nBuf /* Bytes buffered before opening the file */ +){ + JournalFile *p = (JournalFile *)pJfd; + memset(p, 0, sqlite3JournalSize(pVfs)); + if( nBuf>0 ){ + p->zBuf = sqlite3MallocZero(nBuf); + if( !p->zBuf ){ + return SQLITE_NOMEM; + } + }else{ + return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); + } + p->pMethod = &JournalFileMethods; + p->nBuf = nBuf; + p->flags = flags; + p->zJournal = zName; + p->pVfs = pVfs; + return SQLITE_OK; +} + +/* +** If the argument p points to a JournalFile structure, and the underlying +** file has not yet been created, create it now. +*/ +int sqlite3JournalCreate(sqlite3_file *p){ + if( p->pMethods!=&JournalFileMethods ){ + return SQLITE_OK; + } + return createFile((JournalFile *)p); +} + +/* +** Return the number of bytes required to store a JournalFile that uses vfs +** pVfs to create the underlying on-disk files. +*/ +int sqlite3JournalSize(sqlite3_vfs *pVfs){ + return (pVfs->szOsFile+sizeof(JournalFile)); +} +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c b/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c new file mode 100644 index 0000000000..c004b89e1d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c @@ -0,0 +1,134 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +** +** $Id: legacy.c,v 1.22 2007/08/29 12:31:26 danielk1977 Exp $ +*/ + +#include "sqliteInt.h" +#include + +/* +** Execute SQL code. Return one of the SQLITE_ success/failure +** codes. Also write an error message into memory obtained from +** malloc() and make *pzErrMsg point to that message. +** +** If the SQL is a query, then for each row in the query result +** the xCallback() function is called. pArg becomes the first +** argument to xCallback(). If xCallback=NULL then no callback +** is invoked, even for queries. +*/ +int sqlite3_exec( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + sqlite3_callback xCallback, /* Invoke this callback routine */ + void *pArg, /* First argument to xCallback() */ + char **pzErrMsg /* Write error messages here */ +){ + int rc = SQLITE_OK; + const char *zLeftover; + sqlite3_stmt *pStmt = 0; + char **azCols = 0; + + int nRetry = 0; + int nCallback; + + if( zSql==0 ) return SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){ + int nCol; + char **azVals = 0; + + pStmt = 0; + rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover); + assert( rc==SQLITE_OK || pStmt==0 ); + if( rc!=SQLITE_OK ){ + continue; + } + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + continue; + } + + nCallback = 0; + + nCol = sqlite3_column_count(pStmt); + azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char *) + 1); + if( azCols==0 ){ + goto exec_out; + } + + while( 1 ){ + int i; + rc = sqlite3_step(pStmt); + + /* Invoke the callback function if required */ + if( xCallback && (SQLITE_ROW==rc || + (SQLITE_DONE==rc && !nCallback && db->flags&SQLITE_NullCallback)) ){ + if( 0==nCallback ){ + for(i=0; ierrMask)==rc ); + sqlite3_mutex_leave(db->mutex); + return rc; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c b/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c new file mode 100644 index 0000000000..dc6056299b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c @@ -0,0 +1,516 @@ +/* +** 2006 June 7 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to dynamically load extensions into +** the SQLite library. +*/ +#ifndef SQLITE_OMIT_LOAD_EXTENSION + +#define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ +#include "sqlite3ext.h" +#include "sqliteInt.h" +#include +#include + +/* +** Some API routines are omitted when various features are +** excluded from a build of SQLite. Substitute a NULL pointer +** for any missing APIs. +*/ +#ifndef SQLITE_ENABLE_COLUMN_METADATA +# define sqlite3_column_database_name 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name 0 +# define sqlite3_column_origin_name16 0 +# define sqlite3_table_column_metadata 0 +#endif + +#ifdef SQLITE_OMIT_AUTHORIZATION +# define sqlite3_set_authorizer 0 +#endif + +#ifdef SQLITE_OMIT_UTF16 +# define sqlite3_bind_text16 0 +# define sqlite3_collation_needed16 0 +# define sqlite3_column_decltype16 0 +# define sqlite3_column_name16 0 +# define sqlite3_column_text16 0 +# define sqlite3_complete16 0 +# define sqlite3_create_collation16 0 +# define sqlite3_create_function16 0 +# define sqlite3_errmsg16 0 +# define sqlite3_open16 0 +# define sqlite3_prepare16 0 +# define sqlite3_prepare16_v2 0 +# define sqlite3_result_error16 0 +# define sqlite3_result_text16 0 +# define sqlite3_result_text16be 0 +# define sqlite3_result_text16le 0 +# define sqlite3_value_text16 0 +# define sqlite3_value_text16be 0 +# define sqlite3_value_text16le 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_COMPLETE +# define sqlite3_complete 0 +# define sqlite3_complete16 0 +#endif + +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK +# define sqlite3_progress_handler 0 +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3_create_module 0 +# define sqlite3_create_module_v2 0 +# define sqlite3_declare_vtab 0 +#endif + +#ifdef SQLITE_OMIT_SHARED_CACHE +# define sqlite3_enable_shared_cache 0 +#endif + +#ifdef SQLITE_OMIT_TRACE +# define sqlite3_profile 0 +# define sqlite3_trace 0 +#endif + +#ifdef SQLITE_OMIT_GET_TABLE +# define sqlite3_free_table 0 +# define sqlite3_get_table 0 +#endif + +#ifdef SQLITE_OMIT_INCRBLOB +#define sqlite3_bind_zeroblob 0 +#define sqlite3_blob_bytes 0 +#define sqlite3_blob_close 0 +#define sqlite3_blob_open 0 +#define sqlite3_blob_read 0 +#define sqlite3_blob_write 0 +#endif + +/* +** The following structure contains pointers to all SQLite API routines. +** A pointer to this structure is passed into extensions when they are +** loaded so that the extension can make calls back into the SQLite +** library. +** +** When adding new APIs, add them to the bottom of this structure +** in order to preserve backwards compatibility. +** +** Extensions that use newer APIs should first call the +** sqlite3_libversion_number() to make sure that the API they +** intend to use is supported by the library. Extensions should +** also check to make sure that the pointer to the function is +** not NULL before calling it. +*/ +const sqlite3_api_routines sqlite3_apis = { + sqlite3_aggregate_context, + sqlite3_aggregate_count, + sqlite3_bind_blob, + sqlite3_bind_double, + sqlite3_bind_int, + sqlite3_bind_int64, + sqlite3_bind_null, + sqlite3_bind_parameter_count, + sqlite3_bind_parameter_index, + sqlite3_bind_parameter_name, + sqlite3_bind_text, + sqlite3_bind_text16, + sqlite3_bind_value, + sqlite3_busy_handler, + sqlite3_busy_timeout, + sqlite3_changes, + sqlite3_close, + sqlite3_collation_needed, + sqlite3_collation_needed16, + sqlite3_column_blob, + sqlite3_column_bytes, + sqlite3_column_bytes16, + sqlite3_column_count, + sqlite3_column_database_name, + sqlite3_column_database_name16, + sqlite3_column_decltype, + sqlite3_column_decltype16, + sqlite3_column_double, + sqlite3_column_int, + sqlite3_column_int64, + sqlite3_column_name, + sqlite3_column_name16, + sqlite3_column_origin_name, + sqlite3_column_origin_name16, + sqlite3_column_table_name, + sqlite3_column_table_name16, + sqlite3_column_text, + sqlite3_column_text16, + sqlite3_column_type, + sqlite3_column_value, + sqlite3_commit_hook, + sqlite3_complete, + sqlite3_complete16, + sqlite3_create_collation, + sqlite3_create_collation16, + sqlite3_create_function, + sqlite3_create_function16, + sqlite3_create_module, + sqlite3_data_count, + sqlite3_db_handle, + sqlite3_declare_vtab, + sqlite3_enable_shared_cache, + sqlite3_errcode, + sqlite3_errmsg, + sqlite3_errmsg16, + sqlite3_exec, + sqlite3_expired, + sqlite3_finalize, + sqlite3_free, + sqlite3_free_table, + sqlite3_get_autocommit, + sqlite3_get_auxdata, + sqlite3_get_table, + 0, /* Was sqlite3_global_recover(), but that function is deprecated */ + sqlite3_interrupt, + sqlite3_last_insert_rowid, + sqlite3_libversion, + sqlite3_libversion_number, + sqlite3_malloc, + sqlite3_mprintf, + sqlite3_open, + sqlite3_open16, + sqlite3_prepare, + sqlite3_prepare16, + sqlite3_profile, + sqlite3_progress_handler, + sqlite3_realloc, + sqlite3_reset, + sqlite3_result_blob, + sqlite3_result_double, + sqlite3_result_error, + sqlite3_result_error16, + sqlite3_result_int, + sqlite3_result_int64, + sqlite3_result_null, + sqlite3_result_text, + sqlite3_result_text16, + sqlite3_result_text16be, + sqlite3_result_text16le, + sqlite3_result_value, + sqlite3_rollback_hook, + sqlite3_set_authorizer, + sqlite3_set_auxdata, + sqlite3_snprintf, + sqlite3_step, + sqlite3_table_column_metadata, + sqlite3_thread_cleanup, + sqlite3_total_changes, + sqlite3_trace, + sqlite3_transfer_bindings, + sqlite3_update_hook, + sqlite3_user_data, + sqlite3_value_blob, + sqlite3_value_bytes, + sqlite3_value_bytes16, + sqlite3_value_double, + sqlite3_value_int, + sqlite3_value_int64, + sqlite3_value_numeric_type, + sqlite3_value_text, + sqlite3_value_text16, + sqlite3_value_text16be, + sqlite3_value_text16le, + sqlite3_value_type, + sqlite3_vmprintf, + /* + ** The original API set ends here. All extensions can call any + ** of the APIs above provided that the pointer is not NULL. But + ** before calling APIs that follow, extension should check the + ** sqlite3_libversion_number() to make sure they are dealing with + ** a library that is new enough to support that API. + ************************************************************************* + */ + sqlite3_overload_function, + + /* + ** Added after 3.3.13 + */ + sqlite3_prepare_v2, + sqlite3_prepare16_v2, + sqlite3_clear_bindings, + + /* + ** Added for 3.4.1 + */ + sqlite3_create_module_v2, + + /* + ** Added for 3.5.0 + */ + sqlite3_bind_zeroblob, + sqlite3_blob_bytes, + sqlite3_blob_close, + sqlite3_blob_open, + sqlite3_blob_read, + sqlite3_blob_write, + sqlite3_create_collation_v2, + sqlite3_file_control, + sqlite3_memory_highwater, + sqlite3_memory_used, +#ifdef SQLITE_MUTEX_NOOP + 0, + 0, + 0, + 0, + 0, +#else + sqlite3_mutex_alloc, + sqlite3_mutex_enter, + sqlite3_mutex_free, + sqlite3_mutex_leave, + sqlite3_mutex_try, +#endif + sqlite3_open_v2, + sqlite3_release_memory, + sqlite3_result_error_nomem, + sqlite3_result_error_toobig, + sqlite3_sleep, + sqlite3_soft_heap_limit, + sqlite3_vfs_find, + sqlite3_vfs_register, + sqlite3_vfs_unregister, +}; + +/* +** Attempt to load an SQLite extension library contained in the file +** zFile. The entry point is zProc. zProc may be 0 in which case a +** default entry point name (sqlite3_extension_init) is used. Use +** of the default name is recommended. +** +** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. +** +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** error message text. The calling function should free this memory +** by calling sqlite3_free(). +*/ +static int sqlite3LoadExtension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + sqlite3_vfs *pVfs = db->pVfs; + void *handle; + int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); + char *zErrmsg = 0; + void **aHandle; + + /* Ticket #1863. To avoid a creating security problems for older + ** applications that relink against newer versions of SQLite, the + ** ability to run load_extension is turned off by default. One + ** must call sqlite3_enable_load_extension() to turn on extension + ** loading. Otherwise you get the following error. + */ + if( (db->flags & SQLITE_LoadExtension)==0 ){ + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("not authorized"); + } + return SQLITE_ERROR; + } + + if( zProc==0 ){ + zProc = "sqlite3_extension_init"; + } + + handle = sqlite3OsDlOpen(pVfs, zFile); + if( handle==0 ){ + if( pzErrMsg ){ + char zErr[256]; + zErr[sizeof(zErr)-1] = '\0'; + sqlite3_snprintf(sizeof(zErr)-1, zErr, + "unable to open shared library [%s]", zFile); + sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr); + *pzErrMsg = sqlite3DbStrDup(db, zErr); + } + return SQLITE_ERROR; + } + xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) + sqlite3OsDlSym(pVfs, handle, zProc); + if( xInit==0 ){ + if( pzErrMsg ){ + char zErr[256]; + zErr[sizeof(zErr)-1] = '\0'; + sqlite3_snprintf(sizeof(zErr)-1, zErr, + "no entry point [%s] in shared library [%s]", zProc,zFile); + sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr); + *pzErrMsg = sqlite3DbStrDup(db, zErr); + sqlite3OsDlClose(pVfs, handle); + } + return SQLITE_ERROR; + }else if( xInit(db, &zErrmsg, &sqlite3_apis) ){ + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); + } + sqlite3_free(zErrmsg); + sqlite3OsDlClose(pVfs, handle); + return SQLITE_ERROR; + } + + /* Append the new shared library handle to the db->aExtension array. */ + db->nExtension++; + aHandle = sqlite3DbMallocZero(db, sizeof(handle)*db->nExtension); + if( aHandle==0 ){ + return SQLITE_NOMEM; + } + if( db->nExtension>0 ){ + memcpy(aHandle, db->aExtension, sizeof(handle)*(db->nExtension-1)); + } + sqlite3_free(db->aExtension); + db->aExtension = aHandle; + + db->aExtension[db->nExtension-1] = handle; + return SQLITE_OK; +} +int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + int rc; + sqlite3_mutex_enter(db->mutex); + rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Call this routine when the database connection is closing in order +** to clean up loaded extensions +*/ +void sqlite3CloseExtensions(sqlite3 *db){ + int i; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inExtension; i++){ + sqlite3OsDlClose(db->pVfs, db->aExtension[i]); + } + sqlite3_free(db->aExtension); +} + +/* +** Enable or disable extension loading. Extension loading is disabled by +** default so as not to open security holes in older applications. +*/ +int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ + sqlite3_mutex_enter(db->mutex); + if( onoff ){ + db->flags |= SQLITE_LoadExtension; + }else{ + db->flags &= ~SQLITE_LoadExtension; + } + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** The following object holds the list of automatically loaded +** extensions. +** +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER +** mutex must be held while accessing this list. +*/ +static struct { + int nExt; /* Number of entries in aExt[] */ + void **aExt; /* Pointers to the extension init functions */ +} autoext = { 0, 0 }; + + +/* +** Register a statically linked extension that is automatically +** loaded by every new database connection. +*/ +int sqlite3_auto_extension(void *xInit){ + int i; + int rc = SQLITE_OK; + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(mutex); + for(i=0; i=autoext.nExt ){ + xInit = 0; + go = 0; + }else{ + xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) + autoext.aExt[i]; + } + sqlite3_mutex_leave(mutex); + if( xInit && xInit(db, &zErrmsg, &sqlite3_apis) ){ + sqlite3Error(db, SQLITE_ERROR, + "automatic extension loading failed: %s", zErrmsg); + go = 0; + rc = SQLITE_ERROR; + sqlite3_free(zErrmsg); + } + } + return rc; +} + +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/main.c b/libraries/sqlite/unix/sqlite-3.5.1/src/main.c new file mode 100644 index 0000000000..f61fe80b25 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/main.c @@ -0,0 +1,1485 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +** +** $Id: main.c,v 1.406 2007/10/03 21:10:58 drh Exp $ +*/ +#include "sqliteInt.h" +#include + +/* +** The version of the library +*/ +const char sqlite3_version[] = SQLITE_VERSION; +const char *sqlite3_libversion(void){ return sqlite3_version; } +int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } +int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } + +/* +** If the following function pointer is not NULL and if +** SQLITE_ENABLE_IOTRACE is enabled, then messages describing +** I/O active are written using this function. These messages +** are intended for debugging activity only. +*/ +void (*sqlite3_io_trace)(const char*, ...) = 0; + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** temporary files. +** +** See also the "PRAGMA temp_store_directory" SQL command. +*/ +char *sqlite3_temp_directory = 0; + + +/* +** This is the default collating function named "BINARY" which is always +** available. +*/ +static int binCollFunc( + void *NotUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int rc, n; + n = nKey1lastRowid; +} + +/* +** Return the number of changes in the most recent call to sqlite3_exec(). +*/ +int sqlite3_changes(sqlite3 *db){ + return db->nChange; +} + +/* +** Return the number of changes since the database handle was opened. +*/ +int sqlite3_total_changes(sqlite3 *db){ + return db->nTotalChange; +} + +/* +** Close an existing SQLite database +*/ +int sqlite3_close(sqlite3 *db){ + HashElem *i; + int j; + + if( !db ){ + return SQLITE_OK; + } + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + +#ifdef SQLITE_SSE + { + extern void sqlite3SseCleanup(sqlite3*); + sqlite3SseCleanup(db); + } +#endif + + sqlite3ResetInternalSchema(db, 0); + + /* If a transaction is open, the ResetInternalSchema() call above + ** will not have called the xDisconnect() method on any virtual + ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() + ** call will do so. We need to do this before the check for active + ** SQL statements below, as the v-table implementation may be storing + ** some prepared statements internally. + */ + sqlite3VtabRollback(db); + + /* If there are any outstanding VMs, return SQLITE_BUSY. */ + if( db->pVdbe ){ + sqlite3Error(db, SQLITE_BUSY, + "Unable to close due to unfinalised statements"); + sqlite3_mutex_leave(db->mutex); + return SQLITE_BUSY; + } + assert( !sqlite3SafetyCheck(db) ); + + /* FIX ME: db->magic may be set to SQLITE_MAGIC_CLOSED if the database + ** cannot be opened for some reason. So this routine needs to run in + ** that case. But maybe there should be an extra magic value for the + ** "failed to open" state. + ** + ** TODO: Coverage tests do not test the case where this condition is + ** true. It's hard to see how to cause it without messing with threads. + */ + if( db->magic!=SQLITE_MAGIC_CLOSED && sqlite3SafetyOn(db) ){ + /* printf("DID NOT CLOSE\n"); fflush(stdout); */ + sqlite3_mutex_leave(db->mutex); + return SQLITE_ERROR; + } + + for(j=0; jnDb; j++){ + struct Db *pDb = &db->aDb[j]; + if( pDb->pBt ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + if( j!=1 ){ + pDb->pSchema = 0; + } + } + } + sqlite3ResetInternalSchema(db, 0); + assert( db->nDb<=2 ); + assert( db->aDb==db->aDbStatic ); + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ + FuncDef *pFunc, *pNext; + for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){ + pNext = pFunc->pNext; + sqlite3_free(pFunc); + } + } + + for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(i); + /* Invoke any destructors registered for collation sequence user data. */ + for(j=0; j<3; j++){ + if( pColl[j].xDel ){ + pColl[j].xDel(pColl[j].pUser); + } + } + sqlite3_free(pColl); + } + sqlite3HashClear(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ + Module *pMod = (Module *)sqliteHashData(i); + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + sqlite3_free(pMod); + } + sqlite3HashClear(&db->aModule); +#endif + + sqlite3HashClear(&db->aFunc); + sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */ + if( db->pErr ){ + sqlite3ValueFree(db->pErr); + } + sqlite3CloseExtensions(db); + + db->magic = SQLITE_MAGIC_ERROR; + + /* The temp-database schema is allocated differently from the other schema + ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). + ** So it needs to be freed here. Todo: Why not roll the temp schema into + ** the same sqliteMalloc() as the one that allocates the database + ** structure? + */ + sqlite3_free(db->aDb[1].pSchema); + sqlite3_mutex_leave(db->mutex); + sqlite3_mutex_free(db->mutex); + sqlite3_free(db); + return SQLITE_OK; +} + +/* +** Rollback all database files. +*/ +void sqlite3RollbackAll(sqlite3 *db){ + int i; + int inTrans = 0; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3MallocEnterBenignBlock(1); /* Enter benign region */ + for(i=0; inDb; i++){ + if( db->aDb[i].pBt ){ + if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){ + inTrans = 1; + } + sqlite3BtreeRollback(db->aDb[i].pBt); + db->aDb[i].inTrans = 0; + } + } + sqlite3VtabRollback(db); + sqlite3MallocLeaveBenignBlock(); /* Leave benign region */ + + if( db->flags&SQLITE_InternChanges ){ + sqlite3ExpirePreparedStatements(db); + sqlite3ResetInternalSchema(db, 0); + } + + /* If one has been configured, invoke the rollback-hook callback */ + if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ + db->xRollbackCallback(db->pRollbackArg); + } +} + +/* +** Return a static string that describes the kind of error specified in the +** argument. +*/ +const char *sqlite3ErrStr(int rc){ + const char *z; + switch( rc & 0xff ){ + case SQLITE_ROW: + case SQLITE_DONE: + case SQLITE_OK: z = "not an error"; break; + case SQLITE_ERROR: z = "SQL logic error or missing database"; break; + case SQLITE_PERM: z = "access permission denied"; break; + case SQLITE_ABORT: z = "callback requested query abort"; break; + case SQLITE_BUSY: z = "database is locked"; break; + case SQLITE_LOCKED: z = "database table is locked"; break; + case SQLITE_NOMEM: z = "out of memory"; break; + case SQLITE_READONLY: z = "attempt to write a readonly database"; break; + case SQLITE_INTERRUPT: z = "interrupted"; break; + case SQLITE_IOERR: z = "disk I/O error"; break; + case SQLITE_CORRUPT: z = "database disk image is malformed"; break; + case SQLITE_FULL: z = "database or disk is full"; break; + case SQLITE_CANTOPEN: z = "unable to open database file"; break; + case SQLITE_EMPTY: z = "table contains no data"; break; + case SQLITE_SCHEMA: z = "database schema has changed"; break; + case SQLITE_TOOBIG: z = "String or BLOB exceeded size limit"; break; + case SQLITE_CONSTRAINT: z = "constraint failed"; break; + case SQLITE_MISMATCH: z = "datatype mismatch"; break; + case SQLITE_MISUSE: z = "library routine called out of sequence";break; + case SQLITE_NOLFS: z = "kernel lacks large file support"; break; + case SQLITE_AUTH: z = "authorization denied"; break; + case SQLITE_FORMAT: z = "auxiliary database format error"; break; + case SQLITE_RANGE: z = "bind or column index out of range"; break; + case SQLITE_NOTADB: z = "file is encrypted or is not a database";break; + default: z = "unknown error"; break; + } + return z; +} + +/* +** This routine implements a busy callback that sleeps and tries +** again until a timeout value is reached. The timeout value is +** an integer number of milliseconds passed in as the first +** argument. +*/ +static int sqliteDefaultBusyCallback( + void *ptr, /* Database connection */ + int count /* Number of times table has been busy */ +){ +#if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP) + static const u8 delays[] = + { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; + static const u8 totals[] = + { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; +# define NDELAY (sizeof(delays)/sizeof(delays[0])) + sqlite3 *db = (sqlite3 *)ptr; + int timeout = db->busyTimeout; + int delay, prior; + + assert( count>=0 ); + if( count < NDELAY ){ + delay = delays[count]; + prior = totals[count]; + }else{ + delay = delays[NDELAY-1]; + prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); + } + if( prior + delay > timeout ){ + delay = timeout - prior; + if( delay<=0 ) return 0; + } + sqlite3OsSleep(db->pVfs, delay*1000); + return 1; +#else + sqlite3 *db = (sqlite3 *)ptr; + int timeout = ((sqlite3 *)ptr)->busyTimeout; + if( (count+1)*1000 > timeout ){ + return 0; + } + sqlite3OsSleep(db->pVfs, 1000000); + return 1; +#endif +} + +/* +** Invoke the given busy handler. +** +** This routine is called when an operation failed with a lock. +** If this routine returns non-zero, the lock is retried. If it +** returns 0, the operation aborts with an SQLITE_BUSY error. +*/ +int sqlite3InvokeBusyHandler(BusyHandler *p){ + int rc; + if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0; + rc = p->xFunc(p->pArg, p->nBusy); + if( rc==0 ){ + p->nBusy = -1; + }else{ + p->nBusy++; + } + return rc; +} + +/* +** This routine sets the busy callback for an Sqlite database to the +** given callback function with the given argument. +*/ +int sqlite3_busy_handler( + sqlite3 *db, + int (*xBusy)(void*,int), + void *pArg +){ + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + db->busyHandler.xFunc = xBusy; + db->busyHandler.pArg = pArg; + db->busyHandler.nBusy = 0; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** This routine sets the progress callback for an Sqlite database to the +** given callback function with the given argument. The progress callback will +** be invoked every nOps opcodes. +*/ +void sqlite3_progress_handler( + sqlite3 *db, + int nOps, + int (*xProgress)(void*), + void *pArg +){ + if( !sqlite3SafetyCheck(db) ){ + sqlite3_mutex_enter(db->mutex); + if( nOps>0 ){ + db->xProgress = xProgress; + db->nProgressOps = nOps; + db->pProgressArg = pArg; + }else{ + db->xProgress = 0; + db->nProgressOps = 0; + db->pProgressArg = 0; + } + sqlite3_mutex_leave(db->mutex); + } +} +#endif + + +/* +** This routine installs a default busy handler that waits for the +** specified number of milliseconds before returning 0. +*/ +int sqlite3_busy_timeout(sqlite3 *db, int ms){ + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + if( ms>0 ){ + db->busyTimeout = ms; + sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); + }else{ + sqlite3_busy_handler(db, 0, 0); + } + return SQLITE_OK; +} + +/* +** Cause any pending operation to stop at its earliest opportunity. +*/ +void sqlite3_interrupt(sqlite3 *db){ + if( db && (db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_BUSY) ){ + db->u1.isInterrupted = 1; + } +} + + +/* +** This function is exactly the same as sqlite3_create_function(), except +** that it is designed to be called by internal code. The difference is +** that if a malloc() fails in sqlite3_create_function(), an error code +** is returned and the mallocFailed flag cleared. +*/ +int sqlite3CreateFunc( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int enc, + void *pUserData, + void (*xFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*) +){ + FuncDef *p; + int nName; + + assert( sqlite3_mutex_held(db->mutex) ); + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + if( zFunctionName==0 || + (xFunc && (xFinal || xStep)) || + (!xFunc && (xFinal && !xStep)) || + (!xFunc && (!xFinal && xStep)) || + (nArg<-1 || nArg>127) || + (255<(nName = strlen(zFunctionName))) ){ + sqlite3Error(db, SQLITE_ERROR, "bad parameters"); + return SQLITE_ERROR; + } + +#ifndef SQLITE_OMIT_UTF16 + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + ** + ** If SQLITE_ANY is specified, add three versions of the function + ** to the hash table. + */ + if( enc==SQLITE_UTF16 ){ + enc = SQLITE_UTF16NATIVE; + }else if( enc==SQLITE_ANY ){ + int rc; + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8, + pUserData, xFunc, xStep, xFinal); + if( rc==SQLITE_OK ){ + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE, + pUserData, xFunc, xStep, xFinal); + } + if( rc!=SQLITE_OK ){ + return rc; + } + enc = SQLITE_UTF16BE; + } +#else + enc = SQLITE_UTF8; +#endif + + /* Check if an existing function is being overridden or deleted. If so, + ** and there are active VMs, then return SQLITE_BUSY. If a function + ** is being overridden/deleted but there are no active VMs, allow the + ** operation to continue but invalidate all precompiled statements. + */ + p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0); + if( p && p->iPrefEnc==enc && p->nArg==nArg ){ + if( db->activeVdbeCnt ){ + sqlite3Error(db, SQLITE_BUSY, + "Unable to delete/modify user-function due to active statements"); + assert( !db->mallocFailed ); + return SQLITE_BUSY; + }else{ + sqlite3ExpirePreparedStatements(db); + } + } + + p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1); + assert(p || db->mallocFailed); + if( !p ){ + return SQLITE_NOMEM; + } + p->flags = 0; + p->xFunc = xFunc; + p->xStep = xStep; + p->xFinalize = xFinal; + p->pUserData = pUserData; + p->nArg = nArg; + return SQLITE_OK; +} + +/* +** Create new user functions. +*/ +int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int enc, + void *p, + void (*xFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*) +){ + int rc; + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *p, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +){ + int rc; + char *zFunc8; + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1); + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal); + sqlite3_free(zFunc8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif + + +/* +** Declare that a function has been overloaded by a virtual table. +** +** If the function already exists as a regular global function, then +** this routine is a no-op. If the function does not exist, then create +** a new one that always throws a run-time error. +** +** When virtual tables intend to provide an overloaded function, they +** should call this routine to make sure the global function exists. +** A global function must exist in order for name resolution to work +** properly. +*/ +int sqlite3_overload_function( + sqlite3 *db, + const char *zName, + int nArg +){ + int nName = strlen(zName); + int rc; + sqlite3_mutex_enter(db->mutex); + if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ + sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, + 0, sqlite3InvalidFunction, 0, 0); + } + rc = sqlite3ApiExit(db, SQLITE_OK); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Register a trace function. The pArg from the previously registered trace +** is returned. +** +** A NULL trace function means that no tracing is executes. A non-NULL +** trace is a pointer to a function that is invoked at the start of each +** SQL statement. +*/ +void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){ + void *pOld; + sqlite3_mutex_enter(db->mutex); + pOld = db->pTraceArg; + db->xTrace = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +/* +** Register a profile function. The pArg from the previously registered +** profile function is returned. +** +** A NULL profile function means that no profiling is executes. A non-NULL +** profile is a pointer to a function that is invoked at the conclusion of +** each SQL statement that is run. +*/ +void *sqlite3_profile( + sqlite3 *db, + void (*xProfile)(void*,const char*,sqlite_uint64), + void *pArg +){ + void *pOld; + sqlite3_mutex_enter(db->mutex); + pOld = db->pProfileArg; + db->xProfile = xProfile; + db->pProfileArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_TRACE */ + +/*** EXPERIMENTAL *** +** +** Register a function to be invoked when a transaction comments. +** If the invoked function returns non-zero, then the commit becomes a +** rollback. +*/ +void *sqlite3_commit_hook( + sqlite3 *db, /* Attach the hook to this database */ + int (*xCallback)(void*), /* Function to invoke on each commit */ + void *pArg /* Argument to the function */ +){ + void *pOld; + sqlite3_mutex_enter(db->mutex); + pOld = db->pCommitArg; + db->xCommitCallback = xCallback; + db->pCommitArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} + +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +void *sqlite3_update_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), + void *pArg /* Argument to the function */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pUpdateArg; + db->xUpdateCallback = xCallback; + db->pUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +/* +** Register a callback to be invoked each time a transaction is rolled +** back by this database connection. +*/ +void *sqlite3_rollback_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*), /* Callback function */ + void *pArg /* Argument to the function */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pRollbackArg; + db->xRollbackCallback = xCallback; + db->pRollbackArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +/* +** This routine is called to create a connection to a database BTree +** driver. If zFilename is the name of a file, then that file is +** opened and used. If zFilename is the magic name ":memory:" then +** the database is stored in memory (and is thus forgotten as soon as +** the connection is closed.) If zFilename is NULL then the database +** is a "virtual" database for transient use only and is deleted as +** soon as the connection is closed. +** +** A virtual database can be either a disk file (that is automatically +** deleted when the file is closed) or it an be held entirely in memory, +** depending on the values of the TEMP_STORE compile-time macro and the +** db->temp_store variable, according to the following chart: +** +** TEMP_STORE db->temp_store Location of temporary database +** ---------- -------------- ------------------------------ +** 0 any file +** 1 1 file +** 1 2 memory +** 1 0 file +** 2 1 file +** 2 2 memory +** 2 0 memory +** 3 any memory +*/ +int sqlite3BtreeFactory( + const sqlite3 *db, /* Main database when opening aux otherwise 0 */ + const char *zFilename, /* Name of the file containing the BTree database */ + int omitJournal, /* if TRUE then do not journal this file */ + int nCache, /* How many pages in the page cache */ + int vfsFlags, /* Flags passed through to vfsOpen */ + Btree **ppBtree /* Pointer to new Btree object written here */ +){ + int btFlags = 0; + int rc; + + assert( sqlite3_mutex_held(db->mutex) ); + assert( ppBtree != 0); + if( omitJournal ){ + btFlags |= BTREE_OMIT_JOURNAL; + } + if( db->flags & SQLITE_NoReadlock ){ + btFlags |= BTREE_NO_READLOCK; + } + if( zFilename==0 ){ +#if TEMP_STORE==0 + /* Do nothing */ +#endif +#ifndef SQLITE_OMIT_MEMORYDB +#if TEMP_STORE==1 + if( db->temp_store==2 ) zFilename = ":memory:"; +#endif +#if TEMP_STORE==2 + if( db->temp_store!=1 ) zFilename = ":memory:"; +#endif +#if TEMP_STORE==3 + zFilename = ":memory:"; +#endif +#endif /* SQLITE_OMIT_MEMORYDB */ + } + + if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){ + vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; + } + rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags); + if( rc==SQLITE_OK ){ + sqlite3BtreeSetBusyHandler(*ppBtree, (void*)&db->busyHandler); + sqlite3BtreeSetCacheSize(*ppBtree, nCache); + } + return rc; +} + +/* +** Return UTF-8 encoded English language explanation of the most recent +** error. +*/ +const char *sqlite3_errmsg(sqlite3 *db){ + const char *z; + if( !db ){ + return sqlite3ErrStr(SQLITE_NOMEM); + } + if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){ + return sqlite3ErrStr(SQLITE_MISUSE); + } + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + z = (char*)sqlite3_value_text(db->pErr); + if( z==0 ){ + z = sqlite3ErrStr(db->errCode); + } + sqlite3_mutex_leave(db->mutex); + return z; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Return UTF-16 encoded English language explanation of the most recent +** error. +*/ +const void *sqlite3_errmsg16(sqlite3 *db){ + /* Because all the characters in the string are in the unicode + ** range 0x00-0xFF, if we pad the big-endian string with a + ** zero byte, we can obtain the little-endian string with + ** &big_endian[1]. + */ + static const char outOfMemBe[] = { + 0, 'o', 0, 'u', 0, 't', 0, ' ', + 0, 'o', 0, 'f', 0, ' ', + 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0 + }; + static const char misuseBe [] = { + 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ', + 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ', + 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', + 0, 'o', 0, 'u', 0, 't', 0, ' ', + 0, 'o', 0, 'f', 0, ' ', + 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0 + }; + + const void *z; + if( !db ){ + return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + } + if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){ + return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + } + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + z = sqlite3_value_text16(db->pErr); + if( z==0 ){ + sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode), + SQLITE_UTF8, SQLITE_STATIC); + z = sqlite3_value_text16(db->pErr); + } + sqlite3ApiExit(0, 0); + sqlite3_mutex_leave(db->mutex); + return z; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the most recent error code generated by an SQLite routine. If NULL is +** passed to this function, we assume a malloc() failed during sqlite3_open(). +*/ +int sqlite3_errcode(sqlite3 *db){ + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM; + } + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + return db->errCode & db->errMask; +} + +/* +** Create a new collating function for database "db". The name is zName +** and the encoding is enc. +*/ +static int createCollation( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + CollSeq *pColl; + int enc2; + + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + assert( sqlite3_mutex_held(db->mutex) ); + + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + */ + enc2 = enc & ~SQLITE_UTF16_ALIGNED; + if( enc2==SQLITE_UTF16 ){ + enc2 = SQLITE_UTF16NATIVE; + } + + if( (enc2&~3)!=0 ){ + sqlite3Error(db, SQLITE_ERROR, "unknown encoding"); + return SQLITE_ERROR; + } + + /* Check if this call is removing or replacing an existing collation + ** sequence. If so, and there are active VMs, return busy. If there + ** are no active VMs, invalidate any pre-compiled statements. + */ + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0); + if( pColl && pColl->xCmp ){ + if( db->activeVdbeCnt ){ + sqlite3Error(db, SQLITE_BUSY, + "Unable to delete/modify collation sequence due to active statements"); + return SQLITE_BUSY; + } + sqlite3ExpirePreparedStatements(db); + + /* If collation sequence pColl was created directly by a call to + ** sqlite3_create_collation, and not generated by synthCollSeq(), + ** then any copies made by synthCollSeq() need to be invalidated. + ** Also, collation destructor - CollSeq.xDel() - function may need + ** to be called. + */ + if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName)); + int j; + for(j=0; j<3; j++){ + CollSeq *p = &aColl[j]; + if( p->enc==pColl->enc ){ + if( p->xDel ){ + p->xDel(p->pUser); + } + p->xCmp = 0; + } + } + } + } + + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1); + if( pColl ){ + pColl->xCmp = xCompare; + pColl->pUser = pCtx; + pColl->xDel = xDel; + pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED); + } + sqlite3Error(db, SQLITE_OK, 0); + return SQLITE_OK; +} + + +/* +** This routine does the work of opening a database on behalf of +** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" +** is UTF-8 encoded. +*/ +static int openDatabase( + const char *zFilename, /* Database filename UTF-8 encoded */ + sqlite3 **ppDb, /* OUT: Returned database handle */ + unsigned flags, /* Operational flags */ + const char *zVfs /* Name of the VFS to use */ +){ + sqlite3 *db; + int rc; + CollSeq *pColl; + + /* Allocate the sqlite data structure */ + db = sqlite3MallocZero( sizeof(sqlite3) ); + if( db==0 ) goto opendb_out; + db->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); + if( db->mutex==0 ){ + sqlite3_free(db); + db = 0; + goto opendb_out; + } + sqlite3_mutex_enter(db->mutex); + db->errMask = 0xff; + db->priorNewRowid = 0; + db->nDb = 2; + db->magic = SQLITE_MAGIC_BUSY; + db->aDb = db->aDbStatic; + db->autoCommit = 1; + db->flags |= SQLITE_ShortColNames +#if SQLITE_DEFAULT_FILE_FORMAT<4 + | SQLITE_LegacyFileFmt +#endif +#ifdef SQLITE_ENABLE_LOAD_EXTENSION + | SQLITE_LoadExtension +#endif + ; + sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0); + sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0); +#endif + + db->pVfs = sqlite3_vfs_find(zVfs); + if( !db->pVfs ){ + rc = SQLITE_ERROR; + db->magic = SQLITE_MAGIC_CLOSED; + sqlite3Error(db, rc, "no such vfs: %s", (zVfs?zVfs:"(null)")); + goto opendb_out; + } + + /* Add the default collation sequence BINARY. BINARY works for both UTF-8 + ** and UTF-16, so add a version for each to avoid any unnecessary + ** conversions. The only error that can occur here is a malloc() failure. + */ + if( createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0) || + createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0) || + createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0) || + (db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0 + ){ + assert( db->mallocFailed ); + db->magic = SQLITE_MAGIC_CLOSED; + goto opendb_out; + } + + /* Also add a UTF-8 case-insensitive collation sequence. */ + createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); + + /* Set flags on the built-in collating sequences */ + db->pDfltColl->type = SQLITE_COLL_BINARY; + pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0); + if( pColl ){ + pColl->type = SQLITE_COLL_NOCASE; + } + + /* Open the backend database driver */ + db->openFlags = flags; + rc = sqlite3BtreeFactory(db, zFilename, 0, SQLITE_DEFAULT_CACHE_SIZE, + flags | SQLITE_OPEN_MAIN_DB, + &db->aDb[0].pBt); + if( rc!=SQLITE_OK ){ + sqlite3Error(db, rc, 0); + db->magic = SQLITE_MAGIC_CLOSED; + goto opendb_out; + } + db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); + db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); + + + /* The default safety_level for the main database is 'full'; for the temp + ** database it is 'NONE'. This matches the pager layer defaults. + */ + db->aDb[0].zName = "main"; + db->aDb[0].safety_level = 3; +#ifndef SQLITE_OMIT_TEMPDB + db->aDb[1].zName = "temp"; + db->aDb[1].safety_level = 1; +#endif + + db->magic = SQLITE_MAGIC_OPEN; + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Register all built-in functions, but do not attempt to read the + ** database schema yet. This is delayed until the first time the database + ** is accessed. + */ + sqlite3Error(db, SQLITE_OK, 0); + sqlite3RegisterBuiltinFunctions(db); + + /* Load automatic extensions - extensions that have been registered + ** using the sqlite3_automatic_extension() API. + */ + (void)sqlite3AutoLoadExtensions(db); + if( sqlite3_errcode(db)!=SQLITE_OK ){ + goto opendb_out; + } + +#ifdef SQLITE_ENABLE_FTS1 + if( !db->mallocFailed ){ + extern int sqlite3Fts1Init(sqlite3*); + rc = sqlite3Fts1Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_FTS2 + if( !db->mallocFailed && rc==SQLITE_OK ){ + extern int sqlite3Fts2Init(sqlite3*); + rc = sqlite3Fts2Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_FTS3 + if( !db->mallocFailed && rc==SQLITE_OK ){ + extern int sqlite3Fts3Init(sqlite3*); + rc = sqlite3Fts3Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_ICU + if( !db->mallocFailed && rc==SQLITE_OK ){ + extern int sqlite3IcuInit(sqlite3*); + rc = sqlite3IcuInit(db); + } +#endif + sqlite3Error(db, rc, 0); + + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking + ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking + ** mode. Doing nothing at all also makes NORMAL the default. + */ +#ifdef SQLITE_DEFAULT_LOCKING_MODE + db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), + SQLITE_DEFAULT_LOCKING_MODE); +#endif + +opendb_out: + if( db && db->mutex ){ + sqlite3_mutex_leave(db->mutex); + } + if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){ + sqlite3_close(db); + db = 0; + } + *ppDb = db; + return sqlite3ApiExit(0, rc); +} + +/* +** Open a new database handle. +*/ +int sqlite3_open( + const char *zFilename, + sqlite3 **ppDb +){ + return openDatabase(zFilename, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); +} +int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +){ + return openDatabase(filename, ppDb, flags, zVfs); +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Open a new database handle. +*/ +int sqlite3_open16( + const void *zFilename, + sqlite3 **ppDb +){ + char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ + sqlite3_value *pVal; + int rc = SQLITE_NOMEM; + + assert( zFilename ); + assert( ppDb ); + *ppDb = 0; + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zFilename8 ){ + rc = openDatabase(zFilename8, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); + if( rc==SQLITE_OK && *ppDb ){ + rc = sqlite3_exec(*ppDb, "PRAGMA encoding = 'UTF-16'", 0, 0, 0); + if( rc!=SQLITE_OK ){ + sqlite3_close(*ppDb); + *ppDb = 0; + } + } + } + sqlite3ValueFree(pVal); + + return sqlite3ApiExit(0, rc); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a new collation sequence with the database handle db. +*/ +int sqlite3_create_collation( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + int rc; + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + rc = createCollation(db, zName, enc, pCtx, xCompare, 0); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Register a new collation sequence with the database handle db. +*/ +int sqlite3_create_collation_v2( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + int rc; + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + rc = createCollation(db, zName, enc, pCtx, xCompare, xDel); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a new collation sequence with the database handle db. +*/ +int sqlite3_create_collation16( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + int rc = SQLITE_OK; + char *zName8; + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zName8 = sqlite3Utf16to8(db, zName, -1); + if( zName8 ){ + rc = createCollation(db, zName8, enc, pCtx, xCompare, 0); + sqlite3_free(zName8); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +int sqlite3_collation_needed( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) +){ + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = xCollNeeded; + db->xCollNeeded16 = 0; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +int sqlite3_collation_needed16( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) +){ + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = 0; + db->xCollNeeded16 = xCollNeeded16; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_GLOBALRECOVER +/* +** This function is now an anachronism. It used to be used to recover from a +** malloc() failure, but SQLite now does this automatically. +*/ +int sqlite3_global_recover(){ + return SQLITE_OK; +} +#endif + +/* +** Test to see whether or not the database connection is in autocommit +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on +** by default. Autocommit is disabled by a BEGIN statement and reenabled +** by the next COMMIT or ROLLBACK. +** +******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ****** +*/ +int sqlite3_get_autocommit(sqlite3 *db){ + return db->autoCommit; +} + +#ifdef SQLITE_DEBUG +/* +** The following routine is subtituted for constant SQLITE_CORRUPT in +** debugging builds. This provides a way to set a breakpoint for when +** corruption is first detected. +*/ +int sqlite3Corrupt(void){ + return SQLITE_CORRUPT; +} +#endif + +/* +** This is a convenience routine that makes sure that all thread-specific +** data for this thread has been deallocated. +** +** SQLite no longer uses thread-specific data so this routine is now a +** no-op. It is retained for historical compatibility. +*/ +void sqlite3_thread_cleanup(void){ +} + +/* +** Return meta information about a specific column of a database table. +** See comment in sqlite3.h (sqlite.h.in) for details. +*/ +#ifdef SQLITE_ENABLE_COLUMN_METADATA +int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if colums is auto-increment */ +){ + int rc; + char *zErrMsg = 0; + Table *pTab = 0; + Column *pCol = 0; + int iCol; + + char const *zDataType = 0; + char const *zCollSeq = 0; + int notnull = 0; + int primarykey = 0; + int autoinc = 0; + + /* Ensure the database schema has been loaded */ + if( sqlite3SafetyOn(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + rc = sqlite3Init(db, &zErrMsg); + if( SQLITE_OK!=rc ){ + goto error_out; + } + + /* Locate the table in question */ + pTab = sqlite3FindTable(db, zTableName, zDbName); + if( !pTab || pTab->pSelect ){ + pTab = 0; + goto error_out; + } + + /* Find the column for which info is requested */ + if( sqlite3IsRowid(zColumnName) ){ + iCol = pTab->iPKey; + if( iCol>=0 ){ + pCol = &pTab->aCol[iCol]; + } + }else{ + for(iCol=0; iColnCol; iCol++){ + pCol = &pTab->aCol[iCol]; + if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ + break; + } + } + if( iCol==pTab->nCol ){ + pTab = 0; + goto error_out; + } + } + + /* The following block stores the meta information that will be returned + ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey + ** and autoinc. At this point there are two possibilities: + ** + ** 1. The specified column name was rowid", "oid" or "_rowid_" + ** and there is no explicitly declared IPK column. + ** + ** 2. The table is not a view and the column name identified an + ** explicitly declared column. Copy meta information from *pCol. + */ + if( pCol ){ + zDataType = pCol->zType; + zCollSeq = pCol->zColl; + notnull = (pCol->notNull?1:0); + primarykey = (pCol->isPrimKey?1:0); + autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0); + }else{ + zDataType = "INTEGER"; + primarykey = 1; + } + if( !zCollSeq ){ + zCollSeq = "BINARY"; + } + +error_out: + if( sqlite3SafetyOff(db) ){ + rc = SQLITE_MISUSE; + } + + /* Whether the function call succeeded or failed, set the output parameters + ** to whatever their local counterparts contain. If an error did occur, + ** this has the effect of zeroing all output parameters. + */ + if( pzDataType ) *pzDataType = zDataType; + if( pzCollSeq ) *pzCollSeq = zCollSeq; + if( pNotNull ) *pNotNull = notnull; + if( pPrimaryKey ) *pPrimaryKey = primarykey; + if( pAutoinc ) *pAutoinc = autoinc; + + if( SQLITE_OK==rc && !pTab ){ + sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".", + zColumnName, 0); + rc = SQLITE_ERROR; + } + sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg); + sqlite3_free(zErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +int sqlite3_sleep(int ms){ + sqlite3_vfs *pVfs; + int rc; + pVfs = sqlite3_vfs_find(0); + + /* This function works in milliseconds, but the underlying OsSleep() + ** API uses microseconds. Hence the 1000's. + */ + rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); + return rc; +} + +/* +** Enable or disable the extended result codes. +*/ +int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ + sqlite3_mutex_enter(db->mutex); + db->errMask = onoff ? 0xffffffff : 0xff; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Invoke the xFileControl method on a particular database. +*/ +int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ + int rc = SQLITE_ERROR; + int iDb; + sqlite3_mutex_enter(db->mutex); + if( zDbName==0 ){ + iDb = 0; + }else{ + for(iDb=0; iDbnDb; iDb++){ + if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break; + } + } + if( iDbnDb ){ + Btree *pBtree = db->aDb[iDb].pBt; + if( pBtree ){ + Pager *pPager; + sqlite3BtreeEnter(pBtree); + pPager = sqlite3BtreePager(pBtree); + if( pPager ){ + sqlite3_file *fd = sqlite3PagerFile(pPager); + if( fd ){ + rc = sqlite3OsFileControl(fd, op, pArg); + } + } + sqlite3BtreeLeave(pBtree); + } + } + sqlite3_mutex_leave(db->mutex); + return rc; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c b/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c new file mode 100644 index 0000000000..bc321ab9ae --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c @@ -0,0 +1,240 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Memory allocation functions used throughout sqlite. +** +** +** $Id: malloc.c,v 1.13 2007/08/29 14:06:23 danielk1977 Exp $ +*/ +#include "sqliteInt.h" +#include +#include + +/* +** This routine runs when the memory allocator sees that the +** total memory allocation is about to exceed the soft heap +** limit. +*/ +static void softHeapLimitEnforcer( + void *NotUsed, + sqlite3_int64 inUse, + int allocSize +){ + sqlite3_release_memory(allocSize); +} + +/* +** Set the soft heap-size limit for the current thread. Passing a +** zero or negative value indicates no limit. +*/ +void sqlite3_soft_heap_limit(int n){ + sqlite3_uint64 iLimit; + int overage; + if( n<0 ){ + iLimit = 0; + }else{ + iLimit = n; + } + if( iLimit>0 ){ + sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit); + }else{ + sqlite3_memory_alarm(0, 0, 0); + } + overage = sqlite3_memory_used() - n; + if( overage>0 ){ + sqlite3_release_memory(overage); + } +} + +/* +** Release memory held by SQLite instances created by the current thread. +*/ +int sqlite3_release_memory(int n){ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + return sqlite3PagerReleaseMemory(n); +#else + return SQLITE_OK; +#endif +} + + +/* +** Allocate and zero memory. +*/ +void *sqlite3MallocZero(unsigned n){ + void *p = sqlite3_malloc(n); + if( p ){ + memset(p, 0, n); + } + return p; +} + +/* +** Allocate and zero memory. If the allocation fails, make +** the mallocFailed flag in the connection pointer. +*/ +void *sqlite3DbMallocZero(sqlite3 *db, unsigned n){ + void *p = sqlite3DbMallocRaw(db, n); + if( p ){ + memset(p, 0, n); + } + return p; +} + +/* +** Allocate and zero memory. If the allocation fails, make +** the mallocFailed flag in the connection pointer. +*/ +void *sqlite3DbMallocRaw(sqlite3 *db, unsigned n){ + void *p = 0; + if( !db || db->mallocFailed==0 ){ + p = sqlite3_malloc(n); + if( !p && db ){ + db->mallocFailed = 1; + } + } + return p; +} + +/* +** Resize the block of memory pointed to by p to n bytes. If the +** resize fails, set the mallocFailed flag inthe connection object. +*/ +void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){ + void *pNew = 0; + if( db->mallocFailed==0 ){ + pNew = sqlite3_realloc(p, n); + if( !pNew ){ + db->mallocFailed = 1; + } + } + return pNew; +} + +/* +** Attempt to reallocate p. If the reallocation fails, then free p +** and set the mallocFailed flag in the database connection. +*/ +void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){ + void *pNew; + pNew = sqlite3DbRealloc(db, p, n); + if( !pNew ){ + sqlite3_free(p); + } + return pNew; +} + +/* +** Make a copy of a string in memory obtained from sqliteMalloc(). These +** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This +** is because when memory debugging is turned on, these two functions are +** called via macros that record the current file and line number in the +** ThreadData structure. +*/ +char *sqlite3StrDup(const char *z){ + char *zNew; + int n; + if( z==0 ) return 0; + n = strlen(z)+1; + zNew = sqlite3_malloc(n); + if( zNew ) memcpy(zNew, z, n); + return zNew; +} +char *sqlite3StrNDup(const char *z, int n){ + char *zNew; + if( z==0 ) return 0; + zNew = sqlite3_malloc(n+1); + if( zNew ){ + memcpy(zNew, z, n); + zNew[n] = 0; + } + return zNew; +} + +char *sqlite3DbStrDup(sqlite3 *db, const char *z){ + char *zNew = sqlite3StrDup(z); + if( z && !zNew ){ + db->mallocFailed = 1; + } + return zNew; +} +char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){ + char *zNew = sqlite3StrNDup(z, n); + if( z && !zNew ){ + db->mallocFailed = 1; + } + return zNew; +} + +/* +** Create a string from the 2nd and subsequent arguments (up to the +** first NULL argument), store the string in memory obtained from +** sqliteMalloc() and make the pointer indicated by the 1st argument +** point to that string. The 1st argument must either be NULL or +** point to memory obtained from sqliteMalloc(). +*/ +void sqlite3SetString(char **pz, ...){ + va_list ap; + int nByte; + const char *z; + char *zResult; + + assert( pz!=0 ); + nByte = 1; + va_start(ap, pz); + while( (z = va_arg(ap, const char*))!=0 ){ + nByte += strlen(z); + } + va_end(ap); + sqlite3_free(*pz); + *pz = zResult = sqlite3_malloc(nByte); + if( zResult==0 ){ + return; + } + *zResult = 0; + va_start(ap, pz); + while( (z = va_arg(ap, const char*))!=0 ){ + int n = strlen(z); + memcpy(zResult, z, n); + zResult += n; + } + zResult[0] = 0; + va_end(ap); +} + + +/* +** This function must be called before exiting any API function (i.e. +** returning control to the user) that has called sqlite3_malloc or +** sqlite3_realloc. +** +** The returned value is normally a copy of the second argument to this +** function. However, if a malloc() failure has occured since the previous +** invocation SQLITE_NOMEM is returned instead. +** +** If the first argument, db, is not NULL and a malloc() error has occured, +** then the connection error-code (the value returned by sqlite3_errcode()) +** is set to SQLITE_NOMEM. +*/ +int sqlite3ApiExit(sqlite3* db, int rc){ + /* If the db handle is not NULL, then we must hold the connection handle + ** mutex here. Otherwise the read (and possible write) of db->mallocFailed + ** is unsafe, as is the call to sqlite3Error(). + */ + assert( !db || sqlite3_mutex_held(db->mutex) ); + if( db && db->mallocFailed ){ + sqlite3Error(db, SQLITE_NOMEM, 0); + db->mallocFailed = 0; + rc = SQLITE_NOMEM; + } + return rc & (db ? db->errMask : 0xff); +} + diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c new file mode 100644 index 0000000000..1e9fcfa145 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c @@ -0,0 +1,229 @@ +/* +** 2007 August 14 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement a memory +** allocation subsystem for use by SQLite. +** +** $Id: mem1.c,v 1.10 2007/09/02 17:50:35 drh Exp $ +*/ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#if !defined(SQLITE_MEMDEBUG) && !defined(SQLITE_OMIT_MEMORY_ALLOCATION) + +/* +** We will eventually construct multiple memory allocation subsystems +** suitable for use in various contexts: +** +** * Normal multi-threaded builds +** * Normal single-threaded builds +** * Debugging builds +** +** This initial version is suitable for use in normal multi-threaded +** builds. We envision that alternative versions will be stored in +** separate source files. #ifdefs will be used to select the code from +** one of the various memN.c source files for use in any given build. +*/ +#include "sqliteInt.h" + +/* +** All of the static variables used by this module are collected +** into a single structure named "mem". This is to keep the +** static variables organized and to reduce namespace pollution +** when this module is combined with other in the amalgamation. +*/ +static struct { + /* + ** The alarm callback and its arguments. The mem.mutex lock will + ** be held while the callback is running. Recursive calls into + ** the memory subsystem are allowed, but no new callbacks will be + ** issued. The alarmBusy variable is set to prevent recursive + ** callbacks. + */ + sqlite3_int64 alarmThreshold; + void (*alarmCallback)(void*, sqlite3_int64,int); + void *alarmArg; + int alarmBusy; + + /* + ** Mutex to control access to the memory allocation subsystem. + */ + sqlite3_mutex *mutex; + + /* + ** Current allocation and high-water mark. + */ + sqlite3_int64 nowUsed; + sqlite3_int64 mxUsed; + + +} mem; + +/* +** Enter the mutex mem.mutex. Allocate it if it is not already allocated. +*/ +static void enterMem(void){ + if( mem.mutex==0 ){ + mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); + } + sqlite3_mutex_enter(mem.mutex); +} + +/* +** Return the amount of memory currently checked out. +*/ +sqlite3_int64 sqlite3_memory_used(void){ + sqlite3_int64 n; + enterMem(); + n = mem.nowUsed; + sqlite3_mutex_leave(mem.mutex); + return n; +} + +/* +** Return the maximum amount of memory that has ever been +** checked out since either the beginning of this process +** or since the most recent reset. +*/ +sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ + sqlite3_int64 n; + enterMem(); + n = mem.mxUsed; + if( resetFlag ){ + mem.mxUsed = mem.nowUsed; + } + sqlite3_mutex_leave(mem.mutex); + return n; +} + +/* +** Change the alarm callback +*/ +int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used,int N), + void *pArg, + sqlite3_int64 iThreshold +){ + enterMem(); + mem.alarmCallback = xCallback; + mem.alarmArg = pArg; + mem.alarmThreshold = iThreshold; + sqlite3_mutex_leave(mem.mutex); + return SQLITE_OK; +} + +/* +** Trigger the alarm +*/ +static void sqlite3MemsysAlarm(int nByte){ + void (*xCallback)(void*,sqlite3_int64,int); + sqlite3_int64 nowUsed; + void *pArg; + if( mem.alarmCallback==0 || mem.alarmBusy ) return; + mem.alarmBusy = 1; + xCallback = mem.alarmCallback; + nowUsed = mem.nowUsed; + pArg = mem.alarmArg; + sqlite3_mutex_leave(mem.mutex); + xCallback(pArg, nowUsed, nByte); + sqlite3_mutex_enter(mem.mutex); + mem.alarmBusy = 0; +} + +/* +** Allocate nBytes of memory +*/ +void *sqlite3_malloc(int nBytes){ + sqlite3_int64 *p = 0; + if( nBytes>0 ){ + enterMem(); + if( mem.alarmCallback!=0 && mem.nowUsed+nBytes>=mem.alarmThreshold ){ + sqlite3MemsysAlarm(nBytes); + } + p = malloc(nBytes+8); + if( p==0 ){ + sqlite3MemsysAlarm(nBytes); + p = malloc(nBytes+8); + } + if( p ){ + p[0] = nBytes; + p++; + mem.nowUsed += nBytes; + if( mem.nowUsed>mem.mxUsed ){ + mem.mxUsed = mem.nowUsed; + } + } + sqlite3_mutex_leave(mem.mutex); + } + return (void*)p; +} + +/* +** Free memory. +*/ +void sqlite3_free(void *pPrior){ + sqlite3_int64 *p; + int nByte; + if( pPrior==0 ){ + return; + } + assert( mem.mutex!=0 ); + p = pPrior; + p--; + nByte = (int)*p; + sqlite3_mutex_enter(mem.mutex); + mem.nowUsed -= nByte; + free(p); + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Change the size of an existing memory allocation +*/ +void *sqlite3_realloc(void *pPrior, int nBytes){ + int nOld; + sqlite3_int64 *p; + if( pPrior==0 ){ + return sqlite3_malloc(nBytes); + } + if( nBytes<=0 ){ + sqlite3_free(pPrior); + return 0; + } + p = pPrior; + p--; + nOld = (int)p[0]; + assert( mem.mutex!=0 ); + sqlite3_mutex_enter(mem.mutex); + if( mem.nowUsed+nBytes-nOld>=mem.alarmThreshold ){ + sqlite3MemsysAlarm(nBytes-nOld); + } + p = realloc(p, nBytes+8); + if( p==0 ){ + sqlite3MemsysAlarm(nBytes); + p = realloc(p, nBytes+8); + } + if( p ){ + p[0] = nBytes; + p++; + mem.nowUsed += nBytes-nOld; + if( mem.nowUsed>mem.mxUsed ){ + mem.mxUsed = mem.nowUsed; + } + } + sqlite3_mutex_leave(mem.mutex); + return (void*)p; +} + +#endif /* !SQLITE_MEMDEBUG && !SQLITE_OMIT_MEMORY_ALLOCATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c new file mode 100644 index 0000000000..7c509fff49 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c @@ -0,0 +1,546 @@ +/* +** 2007 August 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement a memory +** allocation subsystem for use by SQLite. +** +** $Id: mem2.c,v 1.14 2007/10/03 08:46:45 danielk1977 Exp $ +*/ + +/* +** This version of the memory allocator is used only if the +** SQLITE_MEMDEBUG macro is defined and SQLITE_OMIT_MEMORY_ALLOCATION +** is not defined. +*/ +#if defined(SQLITE_MEMDEBUG) && !defined(SQLITE_OMIT_MEMORY_ALLOCATION) + +/* +** We will eventually construct multiple memory allocation subsystems +** suitable for use in various contexts: +** +** * Normal multi-threaded builds +** * Normal single-threaded builds +** * Debugging builds +** +** This version is suitable for use in debugging builds. +** +** Features: +** +** * Every allocate has guards at both ends. +** * New allocations are initialized with randomness +** * Allocations are overwritten with randomness when freed +** * Optional logs of malloc activity generated +** * Summary of outstanding allocations with backtraces to the +** point of allocation. +** * The ability to simulate memory allocation failure +*/ +#include "sqliteInt.h" +#include + +/* +** The backtrace functionality is only available with GLIBC +*/ +#ifdef __GLIBC__ + extern int backtrace(void**,int); + extern void backtrace_symbols_fd(void*const*,int,int); +#else +# define backtrace(A,B) 0 +# define backtrace_symbols_fd(A,B,C) +#endif + +/* +** Each memory allocation looks like this: +** +** ------------------------------------------------------------------------ +** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard | +** ------------------------------------------------------------------------ +** +** The application code sees only a pointer to the allocation. We have +** to back up from the allocation pointer to find the MemBlockHdr. The +** MemBlockHdr tells us the size of the allocation and the number of +** backtrace pointers. There is also a guard word at the end of the +** MemBlockHdr. +*/ +struct MemBlockHdr { + struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */ + int iSize; /* Size of this allocation */ + char nBacktrace; /* Number of backtraces on this alloc */ + char nBacktraceSlots; /* Available backtrace slots */ + short nTitle; /* Bytes of title; includes '\0' */ + int iForeGuard; /* Guard word for sanity */ +}; + +/* +** Guard words +*/ +#define FOREGUARD 0x80F5E153 +#define REARGUARD 0xE4676B53 + +/* +** All of the static variables used by this module are collected +** into a single structure named "mem". This is to keep the +** static variables organized and to reduce namespace pollution +** when this module is combined with other in the amalgamation. +*/ +static struct { + /* + ** The alarm callback and its arguments. The mem.mutex lock will + ** be held while the callback is running. Recursive calls into + ** the memory subsystem are allowed, but no new callbacks will be + ** issued. The alarmBusy variable is set to prevent recursive + ** callbacks. + */ + sqlite3_int64 alarmThreshold; + void (*alarmCallback)(void*, sqlite3_int64, int); + void *alarmArg; + int alarmBusy; + + /* + ** Mutex to control access to the memory allocation subsystem. + */ + sqlite3_mutex *mutex; + + /* + ** Current allocation and high-water mark. + */ + sqlite3_int64 nowUsed; + sqlite3_int64 mxUsed; + + /* + ** Head and tail of a linked list of all outstanding allocations + */ + struct MemBlockHdr *pFirst; + struct MemBlockHdr *pLast; + + /* + ** The number of levels of backtrace to save in new allocations. + */ + int nBacktrace; + + /* + ** Title text to insert in front of each block + */ + int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ + char zTitle[100]; /* The title text */ + + /* + ** These values are used to simulate malloc failures. When + ** iFail is 1, simulate a malloc failures and reset the value + ** to iReset. + */ + int iFail; /* Decrement and fail malloc when this is 1 */ + int iReset; /* When malloc fails set iiFail to this value */ + int iFailCnt; /* Number of failures */ + int iBenignFailCnt; /* Number of benign failures */ + int iNextIsBenign; /* True if the next call to malloc may fail benignly */ + int iIsBenign; /* All malloc calls may fail benignly */ + + /* + ** sqlite3MallocDisallow() increments the following counter. + ** sqlite3MallocAllow() decrements it. + */ + int disallow; /* Do not allow memory allocation */ + + +} mem; + + +/* +** Enter the mutex mem.mutex. Allocate it if it is not already allocated. +*/ +static void enterMem(void){ + if( mem.mutex==0 ){ + mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); + } + sqlite3_mutex_enter(mem.mutex); +} + +/* +** Return the amount of memory currently checked out. +*/ +sqlite3_int64 sqlite3_memory_used(void){ + sqlite3_int64 n; + enterMem(); + n = mem.nowUsed; + sqlite3_mutex_leave(mem.mutex); + return n; +} + +/* +** Return the maximum amount of memory that has ever been +** checked out since either the beginning of this process +** or since the most recent reset. +*/ +sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ + sqlite3_int64 n; + enterMem(); + n = mem.mxUsed; + if( resetFlag ){ + mem.mxUsed = mem.nowUsed; + } + sqlite3_mutex_leave(mem.mutex); + return n; +} + +/* +** Change the alarm callback +*/ +int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used, int N), + void *pArg, + sqlite3_int64 iThreshold +){ + enterMem(); + mem.alarmCallback = xCallback; + mem.alarmArg = pArg; + mem.alarmThreshold = iThreshold; + sqlite3_mutex_leave(mem.mutex); + return SQLITE_OK; +} + +/* +** Trigger the alarm +*/ +static void sqlite3MemsysAlarm(int nByte){ + void (*xCallback)(void*,sqlite3_int64,int); + sqlite3_int64 nowUsed; + void *pArg; + if( mem.alarmCallback==0 || mem.alarmBusy ) return; + mem.alarmBusy = 1; + xCallback = mem.alarmCallback; + nowUsed = mem.nowUsed; + pArg = mem.alarmArg; + sqlite3_mutex_leave(mem.mutex); + xCallback(pArg, nowUsed, nByte); + sqlite3_mutex_enter(mem.mutex); + mem.alarmBusy = 0; +} + +/* +** Given an allocation, find the MemBlockHdr for that allocation. +** +** This routine checks the guards at either end of the allocation and +** if they are incorrect it asserts. +*/ +static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ + struct MemBlockHdr *p; + int *pInt; + + p = (struct MemBlockHdr*)pAllocation; + p--; + assert( p->iForeGuard==FOREGUARD ); + assert( (p->iSize & 3)==0 ); + pInt = (int*)pAllocation; + assert( pInt[p->iSize/sizeof(int)]==REARGUARD ); + return p; +} + +/* +** This routine is called once the first time a simulated memory +** failure occurs. The sole purpose of this routine is to provide +** a convenient place to set a debugger breakpoint when debugging +** errors related to malloc() failures. +*/ +static void sqlite3MemsysFailed(void){ + mem.iFailCnt = 0; + mem.iBenignFailCnt = 0; +} + +/* +** Allocate nByte bytes of memory. +*/ +void *sqlite3_malloc(int nByte){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + int *pInt; + void *p = 0; + int totalSize; + + if( nByte>0 ){ + enterMem(); + assert( mem.disallow==0 ); + if( mem.alarmCallback!=0 && mem.nowUsed+nByte>=mem.alarmThreshold ){ + sqlite3MemsysAlarm(nByte); + } + nByte = (nByte+3)&~3; + totalSize = nByte + sizeof(*pHdr) + sizeof(int) + + mem.nBacktrace*sizeof(void*) + mem.nTitle; + if( mem.iFail>0 ){ + if( mem.iFail==1 ){ + p = 0; + mem.iFail = mem.iReset; + if( mem.iFailCnt==0 ){ + sqlite3MemsysFailed(); /* A place to set a breakpoint */ + } + mem.iFailCnt++; + if( mem.iNextIsBenign || mem.iIsBenign ){ + mem.iBenignFailCnt++; + } + }else{ + p = malloc(totalSize); + mem.iFail--; + } + }else{ + p = malloc(totalSize); + if( p==0 ){ + sqlite3MemsysAlarm(nByte); + p = malloc(totalSize); + } + } + if( p ){ + z = p; + pBt = (void**)&z[mem.nTitle]; + pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace]; + pHdr->pNext = 0; + pHdr->pPrev = mem.pLast; + if( mem.pLast ){ + mem.pLast->pNext = pHdr; + }else{ + mem.pFirst = pHdr; + } + mem.pLast = pHdr; + pHdr->iForeGuard = FOREGUARD; + pHdr->nBacktraceSlots = mem.nBacktrace; + pHdr->nTitle = mem.nTitle; + if( mem.nBacktrace ){ + void *aAddr[40]; + pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1; + memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*)); + }else{ + pHdr->nBacktrace = 0; + } + if( mem.nTitle ){ + memcpy(z, mem.zTitle, mem.nTitle); + } + pHdr->iSize = nByte; + pInt = (int*)&pHdr[1]; + pInt[nByte/sizeof(int)] = REARGUARD; + memset(pInt, 0x65, nByte); + mem.nowUsed += nByte; + if( mem.nowUsed>mem.mxUsed ){ + mem.mxUsed = mem.nowUsed; + } + p = (void*)pInt; + } + sqlite3_mutex_leave(mem.mutex); + } + mem.iNextIsBenign = 0; + return p; +} + +/* +** Free memory. +*/ +void sqlite3_free(void *pPrior){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + if( pPrior==0 ){ + return; + } + assert( mem.mutex!=0 ); + pHdr = sqlite3MemsysGetHeader(pPrior); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + sqlite3_mutex_enter(mem.mutex); + mem.nowUsed -= pHdr->iSize; + if( pHdr->pPrev ){ + assert( pHdr->pPrev->pNext==pHdr ); + pHdr->pPrev->pNext = pHdr->pNext; + }else{ + assert( mem.pFirst==pHdr ); + mem.pFirst = pHdr->pNext; + } + if( pHdr->pNext ){ + assert( pHdr->pNext->pPrev==pHdr ); + pHdr->pNext->pPrev = pHdr->pPrev; + }else{ + assert( mem.pLast==pHdr ); + mem.pLast = pHdr->pPrev; + } + z = (char*)pBt; + z -= pHdr->nTitle; + memset(z, 0x2b, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + + pHdr->iSize + sizeof(int) + pHdr->nTitle); + free(z); + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Change the size of an existing memory allocation. +** +** For this debugging implementation, we *always* make a copy of the +** allocation into a new place in memory. In this way, if the +** higher level code is using pointer to the old allocation, it is +** much more likely to break and we are much more liking to find +** the error. +*/ +void *sqlite3_realloc(void *pPrior, int nByte){ + struct MemBlockHdr *pOldHdr; + void *pNew; + if( pPrior==0 ){ + return sqlite3_malloc(nByte); + } + if( nByte<=0 ){ + sqlite3_free(pPrior); + return 0; + } + assert( mem.disallow==0 ); + pOldHdr = sqlite3MemsysGetHeader(pPrior); + pNew = sqlite3_malloc(nByte); + if( pNew ){ + memcpy(pNew, pPrior, nByteiSize ? nByte : pOldHdr->iSize); + if( nByte>pOldHdr->iSize ){ + memset(&((char*)pNew)[pOldHdr->iSize], 0x2b, nByte - pOldHdr->iSize); + } + sqlite3_free(pPrior); + } + return pNew; +} + +/* +** Set the number of backtrace levels kept for each allocation. +** A value of zero turns of backtracing. The number is always rounded +** up to a multiple of 2. +*/ +void sqlite3_memdebug_backtrace(int depth){ + if( depth<0 ){ depth = 0; } + if( depth>20 ){ depth = 20; } + depth = (depth+1)&0xfe; + mem.nBacktrace = depth; +} + +/* +** Set the title string for subsequent allocations. +*/ +void sqlite3_memdebug_settitle(const char *zTitle){ + int n = strlen(zTitle) + 1; + enterMem(); + if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1; + memcpy(mem.zTitle, zTitle, n); + mem.zTitle[n] = 0; + mem.nTitle = (n+3)&~3; + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +void sqlite3_memdebug_dump(const char *zFilename){ + FILE *out; + struct MemBlockHdr *pHdr; + void **pBt; + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + char *z = (char*)pHdr; + z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; + fprintf(out, "**** %d bytes at %p from %s ****\n", + pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); + if( pHdr->nBacktrace ){ + fflush(out); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out)); + fprintf(out, "\n"); + } + } + fclose(out); +} + +/* +** This routine is used to simulate malloc failures. +** +** After calling this routine, there will be iFail successful +** memory allocations and then a failure. If iRepeat is 1 +** all subsequent memory allocations will fail. If iRepeat is +** 0, only a single allocation will fail. If iRepeat is negative +** then the previous setting for iRepeat is unchanged. +** +** Each call to this routine overrides the previous. To disable +** the simulated allocation failure mechanism, set iFail to -1. +** +** This routine returns the number of simulated failures that have +** occurred since the previous call. +*/ +int sqlite3_memdebug_fail(int iFail, int iRepeat, int *piBenign){ + int n = mem.iFailCnt; + if( piBenign ){ + *piBenign = mem.iBenignFailCnt; + } + mem.iFail = iFail+1; + if( iRepeat>=0 ){ + mem.iReset = iRepeat; + } + mem.iFailCnt = 0; + mem.iBenignFailCnt = 0; + return n; +} + +int sqlite3_memdebug_pending(){ + return (mem.iFail-1); +} + +/* +** The following three functions are used to indicate to the test +** infrastructure which malloc() calls may fail benignly without +** affecting functionality. This can happen when resizing hash tables +** (failing to resize a hash-table is a performance hit, but not an +** error) or sometimes during a rollback operation. +** +** If the argument is true, sqlite3MallocBenignFailure() indicates that the +** next call to allocate memory may fail benignly. +** +** If sqlite3MallocEnterBenignBlock() is called with a non-zero argument, +** then all memory allocations requested before the next call to +** sqlite3MallocLeaveBenignBlock() may fail benignly. +*/ +void sqlite3MallocBenignFailure(int isBenign){ + if( isBenign ){ + mem.iNextIsBenign = 1; + } +} +void sqlite3MallocEnterBenignBlock(int isBenign){ + if( isBenign ){ + mem.iIsBenign = 1; + } +} +void sqlite3MallocLeaveBenignBlock(){ + mem.iIsBenign = 0; +} + +/* +** The following two routines are used to assert that no memory +** allocations occur between one call and the next. The use of +** these routines does not change the computed results in any way. +** These routines are like asserts. +*/ +void sqlite3MallocDisallow(void){ + assert( mem.mutex!=0 ); + sqlite3_mutex_enter(mem.mutex); + mem.disallow++; + sqlite3_mutex_leave(mem.mutex); +} +void sqlite3MallocAllow(void){ + assert( mem.mutex ); + sqlite3_mutex_enter(mem.mutex); + assert( mem.disallow>0 ); + mem.disallow--; + sqlite3_mutex_leave(mem.mutex); +} + +#endif /* SQLITE_MEMDEBUG && !SQLITE_OMIT_MEMORY_ALLOCATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c new file mode 100644 index 0000000000..5815ff2169 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c @@ -0,0 +1,126 @@ +/* +** 2007 August 14 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement mutexes. +** +** The implementation in this file does not provide any mutual +** exclusion and is thus suitable for use only in applications +** that use SQLite in a single thread. But this implementation +** does do a lot of error checking on mutexes to make sure they +** are called correctly and at appropriate times. Hence, this +** implementation is suitable for testing. +** debugging purposes +** +** $Id: mutex.c,v 1.16 2007/09/10 16:13:00 danielk1977 Exp $ +*/ +#include "sqliteInt.h" + +#ifdef SQLITE_MUTEX_NOOP_DEBUG +/* +** In this implementation, mutexes do not provide any mutual exclusion. +** But the error checking is provided. This implementation is useful +** for test purposes. +*/ + +/* +** The mutex object +*/ +struct sqlite3_mutex { + int id; /* The mutex type */ + int cnt; /* Number of entries without a matching leave */ +}; + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int id){ + static sqlite3_mutex aStatic[5]; + sqlite3_mutex *pNew = 0; + switch( id ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + pNew = sqlite3_malloc(sizeof(*pNew)); + if( pNew ){ + pNew->id = id; + pNew->cnt = 0; + } + break; + } + default: { + assert( id-2 >= 0 ); + assert( id-2 < sizeof(aStatic)/sizeof(aStatic[0]) ); + pNew = &aStatic[id-2]; + pNew->id = id; + break; + } + } + return pNew; +} + +/* +** This routine deallocates a previously allocated mutex. +*/ +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->cnt==0 ); + assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + sqlite3_free(p); +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +void sqlite3_mutex_enter(sqlite3_mutex *p){ + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + p->cnt++; +} +int sqlite3_mutex_try(sqlite3_mutex *p){ + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + p->cnt++; + return SQLITE_OK; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +void sqlite3_mutex_leave(sqlite3_mutex *p){ + assert( p ); + assert( sqlite3_mutex_held(p) ); + p->cnt--; + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); +} + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +int sqlite3_mutex_held(sqlite3_mutex *p){ + return p==0 || p->cnt>0; +} +int sqlite3_mutex_notheld(sqlite3_mutex *p){ + return p==0 || p->cnt==0; +} +#endif /* SQLITE_MUTEX_NOOP_DEBUG */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h new file mode 100644 index 0000000000..e7ec9d204f --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h @@ -0,0 +1,82 @@ +/* +** 2007 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** NOTE: source files should *not* #include this header file directly. +** Source files should #include the sqliteInt.h file and let that file +** include this one indirectly. +** +** $Id: mutex.h,v 1.2 2007/08/30 14:10:30 drh Exp $ +*/ + + +#ifdef SQLITE_MUTEX_APPDEF +/* +** If SQLITE_MUTEX_APPDEF is defined, then this whole module is +** omitted and equivalent functionality must be provided by the +** application that links against the SQLite library. +*/ +#else +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_NOOP For single-threaded applications that +** do not desire error checking. +** +** SQLITE_MUTEX_NOOP_DEBUG For single-threaded applications with +** error checking to help verify that mutexes +** are being used correctly even though they +** are not needed. Used when SQLITE_DEBUG is +** defined on single-threaded builds. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +** +** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. +*/ +#define SQLITE_MUTEX_NOOP 1 /* The default */ +#if defined(SQLITE_DEBUG) && !SQLITE_THREADSAFE +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_NOOP_DEBUG +#endif +#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_UNIX +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_PTHREADS +#endif +#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_WIN +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_W32 +#endif +#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_OS2 +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_OS2 +#endif + +#ifdef SQLITE_MUTEX_NOOP +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) 1 +#define sqlite3_mutex_notheld(X) 1 +#endif + +#endif /* SQLITE_MUTEX_APPDEF */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c new file mode 100644 index 0000000000..e0258c7563 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c @@ -0,0 +1,236 @@ +/* +** 2007 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement mutexes for OS/2 +** +** $Id: mutex_os2.c,v 1.3 2007/10/02 19:56:04 pweilbacher Exp $ +*/ +#include "sqliteInt.h" + +/* +** The code in this file is only used if SQLITE_MUTEX_OS2 is defined. +** See the mutex.h file for details. +*/ +#ifdef SQLITE_MUTEX_OS2 + +/********************** OS/2 Mutex Implementation ********************** +** +** This implementation of mutexes is built using the OS/2 API. +*/ + +/* +** The mutex object +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + PSZ mutexName; /* Mutex name controlling the lock */ + HMTX mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ + int nRef; /* Number of references */ + TID owner; /* Thread holding this mutex */ +}; + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. +** SQLite will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST 0 +**
      • SQLITE_MUTEX_RECURSIVE 1 +**
      • SQLITE_MUTEX_STATIC_MASTER 2 +**
      • SQLITE_MUTEX_STATIC_MEM 3 +**
      • SQLITE_MUTEX_STATIC_PRNG 4 +**
      +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Three static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int iType){ + PSZ mutex_name = "\\SEM32\\SQLITE\\MUTEX"; + int mutex_name_len = strlen(mutex_name) + 1; /* name length + null byte */ + sqlite3_mutex *p; + + switch( iType ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->mutexName = (PSZ)malloc(mutex_name_len); + sqlite3_snprintf(mutex_name_len, p->mutexName, "%s", mutex_name); + p->id = iType; + DosCreateMutexSem(p->mutexName, &p->mutex, 0, FALSE); + DosOpenMutexSem(p->mutexName, &p->mutex); + } + break; + } + default: { + static sqlite3_mutex staticMutexes[5]; + static int isInit = 0; + while( !isInit ) { + static long lock = 0; + DosEnterCritSec(); + lock++; + if( lock == 1 ) { + DosExitCritSec(); + int i; + for(i = 0; i < sizeof(staticMutexes)/sizeof(staticMutexes[0]); i++) { + staticMutexes[i].mutexName = (PSZ)malloc(mutex_name_len + 1); + sqlite3_snprintf(mutex_name_len + 1, /* one more for the number */ + staticMutexes[i].mutexName, "%s%1d", mutex_name, i); + DosCreateMutexSem(staticMutexes[i].mutexName, + &staticMutexes[i].mutex, 0, FALSE); + DosOpenMutexSem(staticMutexes[i].mutexName, + &staticMutexes[i].mutex); + } + isInit = 1; + } else { + DosExitCritSec(); + DosSleep(1); + } + } + assert( iType-2 >= 0 ); + assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); + p = &staticMutexes[iType-2]; + p->id = iType; + break; + } + } + return p; +} + + +/* +** This routine deallocates a previously allocated mutex. +** SQLite is careful to deallocate every mutex that it allocates. +*/ +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 ); + assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + DosCloseMutexSem(p->mutex); + free(p->mutexName); + sqlite3_free(p); +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +void sqlite3_mutex_enter(sqlite3_mutex *p){ + TID tid; + PID holder1; + ULONG holder2; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT); + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + p->owner = tid; + p->nRef++; +} +int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc; + TID tid; + PID holder1; + ULONG holder2; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) { + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + p->owner = tid; + p->nRef++; + rc = SQLITE_OK; + } else { + rc = SQLITE_BUSY; + } + + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +void sqlite3_mutex_leave(sqlite3_mutex *p){ + TID tid; + PID holder1; + ULONG holder2; + assert( p->nRef>0 ); + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + assert( p->owner==tid ); + p->nRef--; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + DosReleaseMutexSem(p->mutex); +} + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +int sqlite3_mutex_held(sqlite3_mutex *p){ + TID tid; + PID pid; + ULONG ulCount; + PTIB ptib; + if( p!=0 ) { + DosQueryMutexSem(p->mutex, &pid, &tid, &ulCount); + } else { + DosGetInfoBlocks(&ptib, NULL); + tid = ptib->tib_ptib2->tib2_ultid; + } + return p==0 || (p->nRef!=0 && p->owner==tid); +} +int sqlite3_mutex_notheld(sqlite3_mutex *p){ + TID tid; + PID pid; + ULONG ulCount; + PTIB ptib; + if( p!= 0 ) { + DosQueryMutexSem(p->mutex, &pid, &tid, &ulCount); + } else { + DosGetInfoBlocks(&ptib, NULL); + tid = ptib->tib_ptib2->tib2_ultid; + } + return p==0 || p->nRef==0 || p->owner!=tid; +} +#endif /* SQLITE_MUTEX_OS2 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c new file mode 100644 index 0000000000..ff088fb531 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c @@ -0,0 +1,223 @@ +/* +** 2007 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement mutexes for pthreads +** +** $Id: mutex_unix.c,v 1.2 2007/08/28 22:24:35 drh Exp $ +*/ +#include "sqliteInt.h" + +/* +** The code in this file is only used if we are compiling threadsafe +** under unix with pthreads. +** +** Note that this implementation requires a version of pthreads that +** supports recursive mutexes. +*/ +#ifdef SQLITE_MUTEX_PTHREADS + +#include + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + pthread_mutex_t mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ + int nRef; /* Number of entrances */ + pthread_t owner; /* Thread that is within this mutex */ +#ifdef SQLITE_DEBUG + int trace; /* True to trace changes */ +#endif +}; + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. SQLite +** will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_MEM2 +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Three static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int iType){ + static sqlite3_mutex staticMutexes[] = { + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, + }; + sqlite3_mutex *p; + switch( iType ){ + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + pthread_mutexattr_t recursiveAttr; + pthread_mutexattr_init(&recursiveAttr); + pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&p->mutex, &recursiveAttr); + pthread_mutexattr_destroy(&recursiveAttr); + p->id = iType; + } + break; + } + case SQLITE_MUTEX_FAST: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; + pthread_mutex_init(&p->mutex, 0); + } + break; + } + default: { + assert( iType-2 >= 0 ); + assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); + p = &staticMutexes[iType-2]; + p->id = iType; + break; + } + } + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 ); + assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + pthread_mutex_destroy(&p->mutex); + sqlite3_free(p); +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +void sqlite3_mutex_enter(sqlite3_mutex *p){ + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + pthread_mutex_lock(&p->mutex); + p->owner = pthread_self(); + p->nRef++; +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} +int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + if( pthread_mutex_trylock(&p->mutex)==0 ){ + p->owner = pthread_self(); + p->nRef++; + rc = SQLITE_OK; +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif + }else{ + rc = SQLITE_BUSY; + } + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +void sqlite3_mutex_leave(sqlite3_mutex *p){ + assert( p ); + assert( sqlite3_mutex_held(p) ); + p->nRef--; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif + pthread_mutex_unlock(&p->mutex); +} + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. On some platforms, +** there might be race conditions that can cause these routines to +** deliver incorrect results. In particular, if pthread_equal() is +** not an atomic operation, then these routines might delivery +** incorrect results. On most platforms, pthread_equal() is a +** comparison of two integers and is therefore atomic. But we are +** told that HPUX is not such a platform. If so, then these routines +** will not always work correctly on HPUX. +** +** On those platforms where pthread_equal() is not atomic, SQLite +** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to +** make sure no assert() statements are evaluated and hence these +** routines are never called. +*/ +#ifndef NDEBUG +int sqlite3_mutex_held(sqlite3_mutex *p){ + return p==0 || (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); +} +int sqlite3_mutex_notheld(sqlite3_mutex *p){ + return p==0 || p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; +} +#endif +#endif /* SQLITE_MUTEX_PTHREAD */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c new file mode 100644 index 0000000000..ee5a4088dd --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c @@ -0,0 +1,208 @@ +/* +** 2007 August 14 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement mutexes for win32 +** +** $Id: mutex_w32.c,v 1.4 2007/09/05 14:30:42 drh Exp $ +*/ +#include "sqliteInt.h" + +/* +** The code in this file is only used if we are compiling multithreaded +** on a win32 system. +*/ +#ifdef SQLITE_MUTEX_W32 + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + CRITICAL_SECTION mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ + int nRef; /* Number of enterances */ + DWORD owner; /* Thread holding this mutex */ +}; + +/* +** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, +** or WinCE. Return false (zero) for Win95, Win98, or WinME. +** +** Here is an interesting observation: Win95, Win98, and WinME lack +** the LockFileEx() API. But we can still statically link against that +** API as long as we don't call it win running Win95/98/ME. A call to +** this routine is used to determine if the host is Win95/98/ME or +** WinNT/2K/XP so that we will know whether or not we can safely call +** the LockFileEx() API. +*/ +#if OS_WINCE +# define mutexIsNT() (1) +#else + static int mutexIsNT(void){ + static int osType = 0; + if( osType==0 ){ + OSVERSIONINFO sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + GetVersionEx(&sInfo); + osType = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; + } + return osType==2; + } +#endif /* OS_WINCE */ + + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. SQLite +** will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST 0 +**
      • SQLITE_MUTEX_RECURSIVE 1 +**
      • SQLITE_MUTEX_STATIC_MASTER 2 +**
      • SQLITE_MUTEX_STATIC_MEM 3 +**
      • SQLITE_MUTEX_STATIC_PRNG 4 +**
      +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Three static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int iType){ + sqlite3_mutex *p; + + switch( iType ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; + InitializeCriticalSection(&p->mutex); + } + break; + } + default: { + static sqlite3_mutex staticMutexes[5]; + static int isInit = 0; + while( !isInit ){ + static long lock = 0; + if( InterlockedIncrement(&lock)==1 ){ + int i; + for(i=0; i= 0 ); + assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); + p = &staticMutexes[iType-2]; + p->id = iType; + break; + } + } + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 ); + assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + DeleteCriticalSection(&p->mutex); + sqlite3_free(p); +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +void sqlite3_mutex_enter(sqlite3_mutex *p){ + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + EnterCriticalSection(&p->mutex); + p->owner = GetCurrentThreadId(); + p->nRef++; +} +int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); + if( mutexIsNT() && TryEnterCriticalSection(&p->mutex) ){ + p->owner = GetCurrentThreadId(); + p->nRef++; + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +void sqlite3_mutex_leave(sqlite3_mutex *p){ + assert( p->nRef>0 ); + assert( p->owner==GetCurrentThreadId() ); + p->nRef--; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + LeaveCriticalSection(&p->mutex); +} + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. +*/ +int sqlite3_mutex_held(sqlite3_mutex *p){ + return p==0 || (p->nRef!=0 && p->owner==GetCurrentThreadId()); +} +int sqlite3_mutex_notheld(sqlite3_mutex *p){ + return p==0 || p->nRef==0 || p->owner!=GetCurrentThreadId(); +} +#endif /* SQLITE_MUTEX_W32 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os.c new file mode 100644 index 0000000000..3b6ca7bcaf --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os.c @@ -0,0 +1,282 @@ + /* +** 2005 November 29 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains OS interface code that is common to all +** architectures. +*/ +#define _SQLITE_OS_C_ 1 +#include "sqliteInt.h" +#undef _SQLITE_OS_C_ + +/* +** The default SQLite sqlite3_vfs implementations do not allocate +** memory (actually, os_unix.c allocates a small amount of memory +** from within OsOpen()), but some third-party implementations may. +** So we test the effects of a malloc() failing and the sqlite3OsXXX() +** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. +** +** The following functions are instrumented for malloc() failure +** testing: +** +** sqlite3OsOpen() +** sqlite3OsRead() +** sqlite3OsWrite() +** sqlite3OsSync() +** sqlite3OsLock() +** +*/ +#ifdef SQLITE_TEST + #define DO_OS_MALLOC_TEST if (1) { \ + void *pTstAlloc = sqlite3_malloc(10); \ + if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ + sqlite3_free(pTstAlloc); \ + } +#else + #define DO_OS_MALLOC_TEST +#endif + +/* +** The following routines are convenience wrappers around methods +** of the sqlite3_file object. This is mostly just syntactic sugar. All +** of this would be completely automatic if SQLite were coded using +** C++ instead of plain old C. +*/ +int sqlite3OsClose(sqlite3_file *pId){ + int rc = SQLITE_OK; + if( pId->pMethods ){ + rc = pId->pMethods->xClose(pId); + pId->pMethods = 0; + } + return rc; +} +int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST; + return id->pMethods->xRead(id, pBuf, amt, offset); +} +int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST; + return id->pMethods->xWrite(id, pBuf, amt, offset); +} +int sqlite3OsTruncate(sqlite3_file *id, i64 size){ + return id->pMethods->xTruncate(id, size); +} +int sqlite3OsSync(sqlite3_file *id, int flags){ + DO_OS_MALLOC_TEST; + return id->pMethods->xSync(id, flags); +} +int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ + return id->pMethods->xFileSize(id, pSize); +} +int sqlite3OsLock(sqlite3_file *id, int lockType){ + DO_OS_MALLOC_TEST; + return id->pMethods->xLock(id, lockType); +} +int sqlite3OsUnlock(sqlite3_file *id, int lockType){ + return id->pMethods->xUnlock(id, lockType); +} +int sqlite3OsCheckReservedLock(sqlite3_file *id){ + return id->pMethods->xCheckReservedLock(id); +} +int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ + return id->pMethods->xFileControl(id,op,pArg); +} + +#ifdef SQLITE_TEST + /* The following two variables are used to override the values returned + ** by the xSectorSize() and xDeviceCharacteristics() vfs methods for + ** testing purposes. They are usually set by a test command implemented + ** in test6.c. + */ + int sqlite3_test_sector_size = 0; + int sqlite3_test_device_characteristics = 0; + int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + int dc = id->pMethods->xDeviceCharacteristics(id); + return dc | sqlite3_test_device_characteristics; + } + int sqlite3OsSectorSize(sqlite3_file *id){ + if( sqlite3_test_sector_size==0 ){ + int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; + return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); + } + return sqlite3_test_sector_size; + } +#else + int sqlite3OsSectorSize(sqlite3_file *id){ + int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; + return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); + } + int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + return id->pMethods->xDeviceCharacteristics(id); + } +#endif + +/* +** The next group of routines are convenience wrappers around the +** VFS methods. +*/ +int sqlite3OsOpen( + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, + int *pFlagsOut +){ + DO_OS_MALLOC_TEST; + return pVfs->xOpen(pVfs, zPath, pFile, flags, pFlagsOut); +} +int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return pVfs->xDelete(pVfs, zPath, dirSync); +} +int sqlite3OsAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){ + return pVfs->xAccess(pVfs, zPath, flags); +} +int sqlite3OsGetTempname(sqlite3_vfs *pVfs, int nBufOut, char *zBufOut){ + return pVfs->xGetTempname(pVfs, nBufOut, zBufOut); +} +int sqlite3OsFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nPathOut, + char *zPathOut +){ + return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); +} +void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return pVfs->xDlOpen(pVfs, zPath); +} +void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + pVfs->xDlError(pVfs, nByte, zBufOut); +} +void *sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ + return pVfs->xDlSym(pVfs, pHandle, zSymbol); +} +void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ + pVfs->xDlClose(pVfs, pHandle); +} +int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return pVfs->xRandomness(pVfs, nByte, zBufOut); +} +int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ + return pVfs->xSleep(pVfs, nMicro); +} +int sqlite3OsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return pVfs->xCurrentTime(pVfs, pTimeOut); +} + +int sqlite3OsOpenMalloc( + sqlite3_vfs *pVfs, + const char *zFile, + sqlite3_file **ppFile, + int flags, + int *pOutFlags +){ + int rc = SQLITE_NOMEM; + sqlite3_file *pFile; + pFile = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile); + if( pFile ){ + rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); + if( rc!=SQLITE_OK ){ + sqlite3_free(pFile); + }else{ + *ppFile = pFile; + } + } + return rc; +} +int sqlite3OsCloseFree(sqlite3_file *pFile){ + int rc = SQLITE_OK; + if( pFile ){ + rc = sqlite3OsClose(pFile); + sqlite3_free(pFile); + } + return rc; +} + +/* +** The list of all registered VFS implementations. This list is +** initialized to the single VFS returned by sqlite3OsDefaultVfs() +** upon the first call to sqlite3_vfs_find(). +*/ +static sqlite3_vfs *vfsList = 0; + +/* +** Locate a VFS by name. If no name is given, simply return the +** first VFS on the list. +*/ +sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_vfs *pVfs; + static int isInit = 0; + sqlite3_mutex_enter(mutex); + if( !isInit ){ + vfsList = sqlite3OsDefaultVfs(); + isInit = 1; + } + for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ + if( zVfs==0 ) break; + if( strcmp(zVfs, pVfs->zName)==0 ) break; + } + sqlite3_mutex_leave(mutex); + return pVfs; +} + +/* +** Unlink a VFS from the linked list +*/ +static void vfsUnlink(sqlite3_vfs *pVfs){ + assert( sqlite3_mutex_held(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)) ); + if( vfsList==pVfs ){ + vfsList = pVfs->pNext; + }else{ + sqlite3_vfs *p = vfsList; + while( p->pNext && p->pNext!=pVfs ){ + p = p->pNext; + } + if( p->pNext==pVfs ){ + p->pNext = pVfs->pNext; + } + } +} + +/* +** Register a VFS with the system. It is harmless to register the same +** VFS multiple times. The new VFS becomes the default if makeDflt is +** true. +*/ +int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_vfs_find(0); /* Make sure we are initialized */ + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + if( makeDflt || vfsList==0 ){ + pVfs->pNext = vfsList; + vfsList = pVfs; + }else{ + pVfs->pNext = vfsList->pNext; + vfsList->pNext = pVfs; + } + assert(vfsList); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/* +** Unregister a VFS so that it is no longer accessible. +*/ +int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + assert(vfsList); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os.h b/libraries/sqlite/unix/sqlite-3.5.1/src/os.h new file mode 100644 index 0000000000..554952df00 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os.h @@ -0,0 +1,284 @@ +/* +** 2001 September 16 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Figure out if we are dealing with Unix, Windows, or some other +** operating system. After the following block of preprocess macros, +** all of OS_UNIX, OS_WIN, OS_OS2, and OS_OTHER will defined to either +** 1 or 0. One of the four will be 1. The other three will be 0. +*/ +#if defined(OS_OTHER) +# if OS_OTHER==1 +# undef OS_UNIX +# define OS_UNIX 0 +# undef OS_WIN +# define OS_WIN 0 +# undef OS_OS2 +# define OS_OS2 0 +# else +# undef OS_OTHER +# endif +#endif +#if !defined(OS_UNIX) && !defined(OS_OTHER) +# define OS_OTHER 0 +# ifndef OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) +# define OS_WIN 1 +# define OS_UNIX 0 +# define OS_OS2 0 +# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) +# define OS_WIN 0 +# define OS_UNIX 0 +# define OS_OS2 1 +# else +# define OS_WIN 0 +# define OS_UNIX 1 +# define OS_OS2 0 +# endif +# else +# define OS_UNIX 0 +# define OS_OS2 0 +# endif +#else +# ifndef OS_WIN +# define OS_WIN 0 +# endif +#endif + + + +/* +** Define the maximum size of a temporary filename +*/ +#if OS_WIN +# include +# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) +#elif OS_OS2 +# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) +# include /* has to be included before os2.h for linking to work */ +# endif +# define INCL_DOSDATETIME +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# define INCL_DOSMISC +# define INCL_DOSPROCESS +# define INCL_DOSMODULEMGR +# include +# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) +#else +# define SQLITE_TEMPNAME_SIZE 200 +#endif + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 512 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** If using an alternative OS interface, then we must have an "os_other.h" +** header file available for that interface. Presumably the "os_other.h" +** header file contains #defines similar to those above. +*/ +#if OS_OTHER +# include "os_other.h" +#endif + + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** These #defines are available in sqlite_aux.h so that adaptors for +** connecting SQLite to other operating systems can use the same byte +** ranges for locking. In particular, the same locking strategy and +** byte ranges are used for Unix. This leaves open the possiblity of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#ifndef SQLITE_TEST +#define PENDING_BYTE 0x40000000 /* First byte past the 1GB boundary */ +#else +extern unsigned int sqlite3_pending_byte; +#define PENDING_BYTE sqlite3_pending_byte +#endif + +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Functions for accessing sqlite3_file methods +*/ +int sqlite3OsClose(sqlite3_file*); +int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +int sqlite3OsTruncate(sqlite3_file*, i64 size); +int sqlite3OsSync(sqlite3_file*, int); +int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +int sqlite3OsLock(sqlite3_file*, int); +int sqlite3OsUnlock(sqlite3_file*, int); +int sqlite3OsCheckReservedLock(sqlite3_file *id); +int sqlite3OsFileControl(sqlite3_file*,int,void*); +int sqlite3OsSectorSize(sqlite3_file *id); +int sqlite3OsDeviceCharacteristics(sqlite3_file *id); + +/* +** Functions for accessing sqlite3_vfs methods +*/ +int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +int sqlite3OsAccess(sqlite3_vfs *, const char *, int); +int sqlite3OsGetTempname(sqlite3_vfs *, int, char *); +int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +void sqlite3OsDlError(sqlite3_vfs *, int, char *); +void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *); +void sqlite3OsDlClose(sqlite3_vfs *, void *); +int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +int sqlite3OsSleep(sqlite3_vfs *, int); +int sqlite3OsCurrentTime(sqlite3_vfs *, double*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +int sqlite3OsCloseFree(sqlite3_file *); + +/* +** Each OS-specific backend defines an instance of the following +** structure for returning a pointer to its sqlite3_vfs. If OS_OTHER +** is defined (meaning that the application-defined OS interface layer +** is used) then there is no default VFS. The application must +** register one or more VFS structures using sqlite3_vfs_register() +** before attempting to use SQLite. +*/ +#if OS_UNIX || OS_WIN || OS_OS2 +sqlite3_vfs *sqlite3OsDefaultVfs(void); +#else +# define sqlite3OsDefaultVfs(X) 0 +#endif + +#endif /* _SQLITE_OS_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h b/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h new file mode 100644 index 0000000000..8de4be9718 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h @@ -0,0 +1,127 @@ +/* +** 2004 May 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + + +/* + * When testing, this global variable stores the location of the + * pending-byte in the database file. + */ +#ifdef SQLITE_TEST +unsigned int sqlite3_pending_byte = 0x40000000; +#endif + +#ifdef SQLITE_DEBUG +int sqlite3_os_trace = 0; +#define OSTRACE1(X) if( sqlite3_os_trace ) sqlite3DebugPrintf(X) +#define OSTRACE2(X,Y) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y) +#define OSTRACE3(X,Y,Z) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z) +#define OSTRACE4(X,Y,Z,A) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A) +#define OSTRACE5(X,Y,Z,A,B) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A,B) +#define OSTRACE6(X,Y,Z,A,B,C) \ + if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C) +#define OSTRACE7(X,Y,Z,A,B,C,D) \ + if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D) +#else +#define OSTRACE1(X) +#define OSTRACE2(X,Y) +#define OSTRACE3(X,Y,Z) +#define OSTRACE4(X,Y,Z,A) +#define OSTRACE5(X,Y,Z,A,B) +#define OSTRACE6(X,Y,Z,A,B,C) +#define OSTRACE7(X,Y,Z,A,B,C,D) +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE +__inline__ unsigned long long int hwtime(void){ + unsigned long long int x; + __asm__("rdtsc\n\t" + "mov %%edx, %%ecx\n\t" + :"=A" (x)); + return x; +} +static unsigned long long int g_start; +static unsigned int elapse; +#define TIMER_START g_start=hwtime() +#define TIMER_END elapse=hwtime()-g_start +#define TIMER_ELAPSED elapse +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED 0 +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#ifdef SQLITE_TEST +int sqlite3_io_error_hit = 0; +int sqlite3_io_error_pending = 0; +int sqlite3_io_error_persist = 0; +int sqlite3_diskfull_pending = 0; +int sqlite3_diskfull = 0; +#define SimulateIOError(CODE) \ + if( sqlite3_io_error_pending || sqlite3_io_error_hit ) \ + if( sqlite3_io_error_pending-- == 1 \ + || (sqlite3_io_error_persist && sqlite3_io_error_hit) ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit = 1; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif + +/* +** When testing, keep a count of the number of open files. +*/ +#ifdef SQLITE_TEST +int sqlite3_open_file_count = 0; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c new file mode 100644 index 0000000000..c4fbe66d47 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c @@ -0,0 +1,1032 @@ +/* +** 2006 Feb 14 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains code that is specific to OS/2. +*/ + +#include "sqliteInt.h" + +#if OS_OS2 + +/* +** Macros used to determine whether or not to use threads. +*/ +#if defined(THREADSAFE) && THREADSAFE +# define SQLITE_OS2_THREADS 1 +#endif + +/* +** Include code that is common to all os_*.c files +*/ +#include "os_common.h" + +/* +** The os2File structure is subclass of OsFile specific for the OS/2 +** protability layer. +*/ +typedef struct os2File os2File; +struct os2File { + IoMethod const *pMethod; /* Always the first entry */ + HFILE h; /* Handle for accessing the file */ + int delOnClose; /* True if file is to be deleted on close */ + char* pathToDel; /* Name of file to delete on close */ + unsigned char locktype; /* Type of lock currently held on this file */ +}; + +/* +** Do not include any of the File I/O interface procedures if the +** SQLITE_OMIT_DISKIO macro is defined (indicating that there database +** will be in-memory only) +*/ +#ifndef SQLITE_OMIT_DISKIO + +/* +** Delete the named file +*/ +int sqlite3Os2Delete( const char *zFilename ){ + APIRET rc = NO_ERROR; + + rc = DosDelete( (PSZ)zFilename ); + OSTRACE2( "DELETE \"%s\"\n", zFilename ); + return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Return TRUE if the named file exists. +*/ +int sqlite3Os2FileExists( const char *zFilename ){ + FILESTATUS3 fsts3ConfigInfo; + memset(&fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo)); + return DosQueryPathInfo( (PSZ)zFilename, FIL_STANDARD, + &fsts3ConfigInfo, sizeof(FILESTATUS3) ) == NO_ERROR; +} + +/* Forward declaration */ +int allocateOs2File( os2File *pInit, OsFile **pld ); + +/* +** Attempt to open a file for both reading and writing. If that +** fails, try opening it read-only. If the file does not exist, +** try to create it. +** +** On success, a handle for the open file is written to *id +** and *pReadonly is set to 0 if the file was opened for reading and +** writing or 1 if the file was opened read-only. The function returns +** SQLITE_OK. +** +** On failure, the function returns SQLITE_CANTOPEN and leaves +** *id and *pReadonly unchanged. +*/ +int sqlite3Os2OpenReadWrite( + const char *zFilename, + OsFile **pld, + int *pReadonly +){ + os2File f; + HFILE hf; + ULONG ulAction; + APIRET rc = NO_ERROR; + + assert( *pld == 0 ); + rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, + FILE_ARCHIVED | FILE_NORMAL, + OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, + OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | + OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, (PEAOP2)NULL ); + if( rc != NO_ERROR ){ + rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, + FILE_ARCHIVED | FILE_NORMAL, + OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, + OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | + OPEN_SHARE_DENYWRITE | OPEN_ACCESS_READONLY, (PEAOP2)NULL ); + if( rc != NO_ERROR ){ + return SQLITE_CANTOPEN; + } + *pReadonly = 1; + } + else{ + *pReadonly = 0; + } + f.h = hf; + f.locktype = NO_LOCK; + f.delOnClose = 0; + f.pathToDel = NULL; + OpenCounter(+1); + OSTRACE3( "OPEN R/W %d \"%s\"\n", hf, zFilename ); + return allocateOs2File( &f, pld ); +} + + +/* +** Attempt to open a new file for exclusive access by this process. +** The file will be opened for both reading and writing. To avoid +** a potential security problem, we do not allow the file to have +** previously existed. Nor do we allow the file to be a symbolic +** link. +** +** If delFlag is true, then make arrangements to automatically delete +** the file when it is closed. +** +** On success, write the file handle into *id and return SQLITE_OK. +** +** On failure, return SQLITE_CANTOPEN. +*/ +int sqlite3Os2OpenExclusive( const char *zFilename, OsFile **pld, int delFlag ){ + os2File f; + HFILE hf; + ULONG ulAction; + APIRET rc = NO_ERROR; + + assert( *pld == 0 ); + rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, FILE_NORMAL, + OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS, + OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | + OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, (PEAOP2)NULL ); + if( rc != NO_ERROR ){ + return SQLITE_CANTOPEN; + } + + f.h = hf; + f.locktype = NO_LOCK; + f.delOnClose = delFlag ? 1 : 0; + f.pathToDel = delFlag ? sqlite3OsFullPathname( zFilename ) : NULL; + OpenCounter( +1 ); + if( delFlag ) DosForceDelete( (PSZ)sqlite3OsFullPathname( zFilename ) ); + OSTRACE3( "OPEN EX %d \"%s\"\n", hf, sqlite3OsFullPathname ( zFilename ) ); + return allocateOs2File( &f, pld ); +} + +/* +** Attempt to open a new file for read-only access. +** +** On success, write the file handle into *id and return SQLITE_OK. +** +** On failure, return SQLITE_CANTOPEN. +*/ +int sqlite3Os2OpenReadOnly( const char *zFilename, OsFile **pld ){ + os2File f; + HFILE hf; + ULONG ulAction; + APIRET rc = NO_ERROR; + + assert( *pld == 0 ); + rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, + FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, + OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | + OPEN_SHARE_DENYWRITE | OPEN_ACCESS_READONLY, (PEAOP2)NULL ); + if( rc != NO_ERROR ){ + return SQLITE_CANTOPEN; + } + f.h = hf; + f.locktype = NO_LOCK; + f.delOnClose = 0; + f.pathToDel = NULL; + OpenCounter( +1 ); + OSTRACE3( "OPEN RO %d \"%s\"\n", hf, zFilename ); + return allocateOs2File( &f, pld ); +} + +/* +** Attempt to open a file descriptor for the directory that contains a +** file. This file descriptor can be used to fsync() the directory +** in order to make sure the creation of a new file is actually written +** to disk. +** +** This routine is only meaningful for Unix. It is a no-op under +** OS/2 since OS/2 does not support hard links. +** +** On success, a handle for a previously open file is at *id is +** updated with the new directory file descriptor and SQLITE_OK is +** returned. +** +** On failure, the function returns SQLITE_CANTOPEN and leaves +** *id unchanged. +*/ +int os2OpenDirectory( + OsFile *id, + const char *zDirname +){ + return SQLITE_OK; +} + +/* +** Create a temporary file name in zBuf. zBuf must be big enough to +** hold at least SQLITE_TEMPNAME_SIZE characters. +*/ +int sqlite3Os2TempFileName( char *zBuf ){ + static const unsigned char zChars[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; + int i, j; + PSZ zTempPath = 0; + if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){ + if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){ + if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){ + ULONG ulDriveNum = 0, ulDriveMap = 0; + DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap ); + sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) ); + } + } + } + /* strip off a trailing slashes or backslashes, otherwise we would get * + * multiple (back)slashes which causes DosOpen() to fail */ + j = strlen(zTempPath); + while( j > 0 && zTempPath[j-1] == '\\' || zTempPath[j-1] == '/' ){ + j--; + } + zTempPath[j] = '\0'; + for(;;){ + sprintf( zBuf, "%s\\"TEMP_FILE_PREFIX, zTempPath ); + j = strlen( zBuf ); + sqlite3Randomness( 15, &zBuf[j] ); + for( i = 0; i < 15; i++, j++ ){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + if( !sqlite3OsFileExists( zBuf ) ) break; + } + OSTRACE2( "TEMP FILENAME: %s\n", zBuf ); + return SQLITE_OK; +} + +/* +** Close a file. +*/ +int os2Close( OsFile **pld ){ + os2File *pFile; + APIRET rc = NO_ERROR; + if( pld && (pFile = (os2File*)*pld) != 0 ){ + OSTRACE2( "CLOSE %d\n", pFile->h ); + rc = DosClose( pFile->h ); + pFile->locktype = NO_LOCK; + if( pFile->delOnClose != 0 ){ + rc = DosForceDelete( (PSZ)pFile->pathToDel ); + } + *pld = 0; + OpenCounter( -1 ); + } + + return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +int os2Read( OsFile *id, void *pBuf, int amt ){ + ULONG got; + assert( id!=0 ); + SimulateIOError( return SQLITE_IOERR ); + OSTRACE3( "READ %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); + DosRead( ((os2File*)id)->h, pBuf, amt, &got ); + if (got == (ULONG)amt) + return SQLITE_OK; + else if (got == 0) + return SQLITE_IOERR_READ; + else { + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +int os2Write( OsFile *id, const void *pBuf, int amt ){ + APIRET rc = NO_ERROR; + ULONG wrote; + assert( id!=0 ); + SimulateIOError( return SQLITE_IOERR ); + SimulateDiskfullError( return SQLITE_FULL ); + OSTRACE3( "WRITE %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); + while( amt > 0 && + (rc = DosWrite( ((os2File*)id)->h, (PVOID)pBuf, amt, &wrote )) && wrote > 0 ){ + amt -= wrote; + pBuf = &((char*)pBuf)[wrote]; + } + + return ( rc != NO_ERROR || amt > (int)wrote ) ? SQLITE_FULL : SQLITE_OK; +} + +/* +** Move the read/write pointer in a file. +*/ +int os2Seek( OsFile *id, i64 offset ){ + APIRET rc = NO_ERROR; + ULONG filePointer = 0L; + assert( id!=0 ); + rc = DosSetFilePtr( ((os2File*)id)->h, offset, FILE_BEGIN, &filePointer ); + OSTRACE3( "SEEK %d %lld\n", ((os2File*)id)->h, offset ); + return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Make sure all writes to a particular file are committed to disk. +*/ +int os2Sync( OsFile *id, int dataOnly ){ + assert( id!=0 ); + OSTRACE3( "SYNC %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); + return DosResetBuffer( ((os2File*)id)->h ) == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Sync the directory zDirname. This is a no-op on operating systems other +** than UNIX. +*/ +int sqlite3Os2SyncDirectory( const char *zDirname ){ + SimulateIOError( return SQLITE_IOERR ); + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +int os2Truncate( OsFile *id, i64 nByte ){ + APIRET rc = NO_ERROR; + ULONG upperBits = nByte>>32; + assert( id!=0 ); + OSTRACE3( "TRUNCATE %d %lld\n", ((os2File*)id)->h, nByte ); + SimulateIOError( return SQLITE_IOERR ); + rc = DosSetFilePtr( ((os2File*)id)->h, nByte, FILE_BEGIN, &upperBits ); + if( rc != NO_ERROR ){ + return SQLITE_IOERR; + } + rc = DosSetFilePtr( ((os2File*)id)->h, 0L, FILE_END, &upperBits ); + return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Determine the current size of a file in bytes +*/ +int os2FileSize( OsFile *id, i64 *pSize ){ + APIRET rc = NO_ERROR; + FILESTATUS3 fsts3FileInfo; + memset(&fsts3FileInfo, 0, sizeof(fsts3FileInfo)); + assert( id!=0 ); + SimulateIOError( return SQLITE_IOERR ); + rc = DosQueryFileInfo( ((os2File*)id)->h, FIL_STANDARD, &fsts3FileInfo, sizeof(FILESTATUS3) ); + if( rc == NO_ERROR ){ + *pSize = fsts3FileInfo.cbFile; + return SQLITE_OK; + } + else{ + return SQLITE_IOERR; + } +} + +/* +** Acquire a reader lock. +*/ +static int getReadLock( os2File *id ){ + FILELOCK LockArea, + UnlockArea; + memset(&LockArea, 0, sizeof(LockArea)); + memset(&UnlockArea, 0, sizeof(UnlockArea)); + LockArea.lOffset = SHARED_FIRST; + LockArea.lRange = SHARED_SIZE; + UnlockArea.lOffset = 0L; + UnlockArea.lRange = 0L; + return DosSetFileLocks( id->h, &UnlockArea, &LockArea, 2000L, 1L ); +} + +/* +** Undo a readlock +*/ +static int unlockReadLock( os2File *id ){ + FILELOCK LockArea, + UnlockArea; + memset(&LockArea, 0, sizeof(LockArea)); + memset(&UnlockArea, 0, sizeof(UnlockArea)); + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = SHARED_FIRST; + UnlockArea.lRange = SHARED_SIZE; + return DosSetFileLocks( id->h, &UnlockArea, &LockArea, 2000L, 1L ); +} + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Check that a given pathname is a directory and is writable +** +*/ +int sqlite3Os2IsDirWritable( char *zDirname ){ + FILESTATUS3 fsts3ConfigInfo; + APIRET rc = NO_ERROR; + memset(&fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo)); + if( zDirname==0 ) return 0; + if( strlen(zDirname)>CCHMAXPATH ) return 0; + rc = DosQueryPathInfo( (PSZ)zDirname, FIL_STANDARD, &fsts3ConfigInfo, sizeof(FILESTATUS3) ); + if( rc != NO_ERROR ) return 0; + if( (fsts3ConfigInfo.attrFile & FILE_DIRECTORY) != FILE_DIRECTORY ) return 0; + + return 1; +} +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. The os2Unlock() routine +** erases all locks at once and returns us immediately to locking level 0. +** It is not possible to lower the locking level one step at a time. You +** must go straight to locking level 0. +*/ +int os2Lock( OsFile *id, int locktype ){ + APIRET rc = SQLITE_OK; /* Return code from subroutines */ + APIRET res = NO_ERROR; /* Result of an OS/2 lock call */ + int newLocktype; /* Set id->locktype to this value before exiting */ + int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ + FILELOCK LockArea, + UnlockArea; + os2File *pFile = (os2File*)id; + memset(&LockArea, 0, sizeof(LockArea)); + memset(&UnlockArea, 0, sizeof(UnlockArea)); + assert( pFile!=0 ); + OSTRACE4( "LOCK %d %d was %d\n", pFile->h, locktype, pFile->locktype ); + + /* If there is already a lock of this type or more restrictive on the + ** OsFile, do nothing. Don't use the end_lock: exit path, as + ** sqlite3OsEnterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or + ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of + ** the PENDING_LOCK byte is temporary. + */ + newLocktype = pFile->locktype; + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype==RESERVED_LOCK) + ){ + int cnt = 3; + + LockArea.lOffset = PENDING_BYTE; + LockArea.lRange = 1L; + UnlockArea.lOffset = 0L; + UnlockArea.lRange = 0L; + + while( cnt-->0 && (res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L) )!=NO_ERROR ){ + /* Try 3 times to get the pending lock. The pending lock might be + ** held by another reader process who will release it momentarily. + */ + OSTRACE2( "could not get a PENDING lock. cnt=%d\n", cnt ); + DosSleep(1); + } + gotPendingLock = res; + } + + /* Acquire a shared lock + */ + if( locktype==SHARED_LOCK && res ){ + assert( pFile->locktype==NO_LOCK ); + res = getReadLock(pFile); + if( res == NO_ERROR ){ + newLocktype = SHARED_LOCK; + } + } + + /* Acquire a RESERVED lock + */ + if( locktype==RESERVED_LOCK && res ){ + assert( pFile->locktype==SHARED_LOCK ); + LockArea.lOffset = RESERVED_BYTE; + LockArea.lRange = 1L; + UnlockArea.lOffset = 0L; + UnlockArea.lRange = 0L; + res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + if( res == NO_ERROR ){ + newLocktype = RESERVED_LOCK; + } + } + + /* Acquire a PENDING lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + newLocktype = PENDING_LOCK; + gotPendingLock = 0; + } + + /* Acquire an EXCLUSIVE lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + assert( pFile->locktype>=SHARED_LOCK ); + res = unlockReadLock(pFile); + OSTRACE2( "unreadlock = %d\n", res ); + LockArea.lOffset = SHARED_FIRST; + LockArea.lRange = SHARED_SIZE; + UnlockArea.lOffset = 0L; + UnlockArea.lRange = 0L; + res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + if( res == NO_ERROR ){ + newLocktype = EXCLUSIVE_LOCK; + }else{ + OSTRACE2( "error-code = %d\n", res ); + } + } + + /* If we are holding a PENDING lock that ought to be released, then + ** release it now. + */ + if( gotPendingLock && locktype==SHARED_LOCK ){ + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = PENDING_BYTE; + UnlockArea.lRange = 1L; + DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + } + + /* Update the state of the lock has held in the file descriptor then + ** return the appropriate result code. + */ + if( res == NO_ERROR ){ + rc = SQLITE_OK; + }else{ + OSTRACE4( "LOCK FAILED %d trying for %d but got %d\n", pFile->h, + locktype, newLocktype ); + rc = SQLITE_BUSY; + } + pFile->locktype = newLocktype; + return rc; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero, otherwise zero. +*/ +int os2CheckReservedLock( OsFile *id ){ + APIRET rc = NO_ERROR; + os2File *pFile = (os2File*)id; + assert( pFile!=0 ); + if( pFile->locktype>=RESERVED_LOCK ){ + rc = 1; + OSTRACE3( "TEST WR-LOCK %d %d (local)\n", pFile->h, rc ); + }else{ + FILELOCK LockArea, + UnlockArea; + memset(&LockArea, 0, sizeof(LockArea)); + memset(&UnlockArea, 0, sizeof(UnlockArea)); + LockArea.lOffset = RESERVED_BYTE; + LockArea.lRange = 1L; + UnlockArea.lOffset = 0L; + UnlockArea.lRange = 0L; + rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + if( rc == NO_ERROR ){ + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = RESERVED_BYTE; + UnlockArea.lRange = 1L; + rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + } + OSTRACE3( "TEST WR-LOCK %d %d (remote)\n", pFile->h, rc ); + } + return rc; +} + +/* +** Lower the locking level on file descriptor id to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** It is not possible for this routine to fail if the second argument +** is NO_LOCK. If the second argument is SHARED_LOCK then this routine +** might return SQLITE_IOERR; +*/ +int os2Unlock( OsFile *id, int locktype ){ + int type; + APIRET rc = SQLITE_OK; + os2File *pFile = (os2File*)id; + FILELOCK LockArea, + UnlockArea; + memset(&LockArea, 0, sizeof(LockArea)); + memset(&UnlockArea, 0, sizeof(UnlockArea)); + assert( pFile!=0 ); + assert( locktype<=SHARED_LOCK ); + OSTRACE4( "UNLOCK %d to %d was %d\n", pFile->h, locktype, pFile->locktype ); + type = pFile->locktype; + if( type>=EXCLUSIVE_LOCK ){ + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = SHARED_FIRST; + UnlockArea.lRange = SHARED_SIZE; + DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + if( locktype==SHARED_LOCK && getReadLock(pFile) != NO_ERROR ){ + /* This should never happen. We should always be able to + ** reacquire the read lock */ + rc = SQLITE_IOERR; + } + } + if( type>=RESERVED_LOCK ){ + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = RESERVED_BYTE; + UnlockArea.lRange = 1L; + DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + } + if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + unlockReadLock(pFile); + } + if( type>=PENDING_LOCK ){ + LockArea.lOffset = 0L; + LockArea.lRange = 0L; + UnlockArea.lOffset = PENDING_BYTE; + UnlockArea.lRange = 1L; + DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); + } + pFile->locktype = locktype; + return rc; +} + +/* +** Turn a relative pathname into a full pathname. Return a pointer +** to the full pathname stored in space obtained from sqliteMalloc(). +** The calling function is responsible for freeing this space once it +** is no longer needed. +*/ +char *sqlite3Os2FullPathname( const char *zRelative ){ + char *zFull = 0; + if( strchr(zRelative, ':') ){ + sqlite3SetString( &zFull, zRelative, (char*)0 ); + }else{ + ULONG ulDriveNum = 0; + ULONG ulDriveMap = 0; + ULONG cbzBufLen = SQLITE_TEMPNAME_SIZE; + char zDrive[2]; + char *zBuff; + + zBuff = sqliteMalloc( cbzBufLen ); + if( zBuff != 0 ){ + DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap ); + if( DosQueryCurrentDir( ulDriveNum, (PBYTE)zBuff, &cbzBufLen ) == NO_ERROR ){ + sprintf( zDrive, "%c", (char)('A' + ulDriveNum - 1) ); + sqlite3SetString( &zFull, zDrive, ":\\", zBuff, + "\\", zRelative, (char*)0 ); + } + sqliteFree( zBuff ); + } + } + return zFull; +} + +/* +** The fullSync option is meaningless on os2, or correct me if I'm wrong. This is a no-op. +** From os_unix.c: Change the value of the fullsync flag in the given file descriptor. +** From os_unix.c: ((unixFile*)id)->fullSync = v; +*/ +static void os2SetFullSync( OsFile *id, int v ){ + return; +} + +/* +** Return the underlying file handle for an OsFile +*/ +static int os2FileHandle( OsFile *id ){ + return (int)((os2File*)id)->h; +} + +/* +** Return an integer that indices the type of lock currently held +** by this handle. (Used for testing and analysis only.) +*/ +static int os2LockState( OsFile *id ){ + return ((os2File*)id)->locktype; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and it's journal file) that the sector size will be the +** same for both. +*/ +static int os2SectorSize(OsFile *id){ + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** This vector defines all the methods that can operate on an OsFile +** for os2. +*/ +static const IoMethod sqlite3Os2IoMethod = { + os2Close, + os2OpenDirectory, + os2Read, + os2Write, + os2Seek, + os2Truncate, + os2Sync, + os2SetFullSync, + os2FileHandle, + os2FileSize, + os2Lock, + os2Unlock, + os2LockState, + os2CheckReservedLock, + os2SectorSize, +}; + +/* +** Allocate memory for an OsFile. Initialize the new OsFile +** to the value given in pInit and return a pointer to the new +** OsFile. If we run out of memory, close the file and return NULL. +*/ +int allocateOs2File( os2File *pInit, OsFile **pld ){ + os2File *pNew; + pNew = sqliteMalloc( sizeof(*pNew) ); + if( pNew==0 ){ + DosClose( pInit->h ); + *pld = 0; + return SQLITE_NOMEM; + }else{ + *pNew = *pInit; + pNew->pMethod = &sqlite3Os2IoMethod; + pNew->locktype = NO_LOCK; + *pld = (OsFile*)pNew; + OpenCounter(+1); + return SQLITE_OK; + } +} + +#endif /* SQLITE_OMIT_DISKIO */ +/*************************************************************************** +** Everything above deals with file I/O. Everything that follows deals +** with other miscellanous aspects of the operating system interface +****************************************************************************/ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +void *sqlite3Os2Dlopen(const char *zFilename){ + UCHAR loadErr[256]; + HMODULE hmod; + APIRET rc; + rc = DosLoadModule((PSZ)loadErr, sizeof(loadErr), zFilename, &hmod); + if (rc != NO_ERROR) return 0; + return (void*)hmod; +} +void *sqlite3Os2Dlsym(void *pHandle, const char *zSymbol){ + PFN pfn; + APIRET rc; + rc = DosQueryProcAddr((HMODULE)pHandle, 0L, zSymbol, &pfn); + if (rc != NO_ERROR) { + /* if the symbol itself was not found, search again for the same + * symbol with an extra underscore, that might be needed depending + * on the calling convention */ + char _zSymbol[256] = "_"; + strncat(_zSymbol, zSymbol, 255); + rc = DosQueryProcAddr((HMODULE)pHandle, 0L, _zSymbol, &pfn); + } + if (rc != NO_ERROR) return 0; + return (void *)pfn; +} +int sqlite3Os2Dlclose(void *pHandle){ + return DosFreeModule((HMODULE)pHandle); +} +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ + + +/* +** Get information to seed the random number generator. The seed +** is written into the buffer zBuf[256]. The calling function must +** supply a sufficiently large buffer. +*/ +int sqlite3Os2RandomSeed( char *zBuf ){ + /* We have to initialize zBuf to prevent valgrind from reporting + ** errors. The reports issued by valgrind are incorrect - we would + ** prefer that the randomness be increased by making use of the + ** uninitialized space in zBuf - but valgrind errors tend to worry + ** some users. Rather than argue, it seems easier just to initialize + ** the whole array and silence valgrind, even if that means less randomness + ** in the random seed. + ** + ** When testing, initializing zBuf[] to zero is all we do. That means + ** that we always use the same random number sequence. This makes the + ** tests repeatable. + */ + memset( zBuf, 0, 256 ); + DosGetDateTime( (PDATETIME)zBuf ); + return SQLITE_OK; +} + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +int sqlite3Os2Sleep( int ms ){ + DosSleep( ms ); + return ms; +} + +/* +** Static variables used for thread synchronization +*/ +static int inMutex = 0; +#ifdef SQLITE_OS2_THREADS +static ULONG mutexOwner; +#endif + +/* +** The following pair of routines implement mutual exclusion for +** multi-threaded processes. Only a single thread is allowed to +** executed code that is surrounded by EnterMutex() and LeaveMutex(). +** +** SQLite uses only a single Mutex. There is not much critical +** code and what little there is executes quickly and without blocking. +*/ +void sqlite3Os2EnterMutex(){ +#ifdef SQLITE_OS2_THREADS + PTIB ptib; + DosEnterCritSec(); + DosGetInfoBlocks( &ptib, NULL ); + mutexOwner = ptib->tib_ptib2->tib2_ultid; +#endif + assert( !inMutex ); + inMutex = 1; +} +void sqlite3Os2LeaveMutex(){ +#ifdef SQLITE_OS2_THREADS + PTIB ptib; +#endif + assert( inMutex ); + inMutex = 0; +#ifdef SQLITE_OS2_THREADS + DosGetInfoBlocks( &ptib, NULL ); + assert( mutexOwner == ptib->tib_ptib2->tib2_ultid ); + DosExitCritSec(); +#endif +} + +/* +** Return TRUE if the mutex is currently held. +** +** If the thisThreadOnly parameter is true, return true if and only if the +** calling thread holds the mutex. If the parameter is false, return +** true if any thread holds the mutex. +*/ +int sqlite3Os2InMutex( int thisThreadOnly ){ +#ifdef SQLITE_OS2_THREADS + PTIB ptib; + DosGetInfoBlocks( &ptib, NULL ); + return inMutex>0 && (thisThreadOnly==0 || mutexOwner==ptib->tib_ptib2->tib2_ultid); +#else + return inMutex>0; +#endif +} + +/* +** The following variable, if set to a non-zero value, becomes the result +** returned from sqlite3OsCurrentTime(). This is used for testing. +*/ +#ifdef SQLITE_TEST +int sqlite3_current_time = 0; +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +int sqlite3Os2CurrentTime( double *prNow ){ + double now; + USHORT second, minute, hour, + day, month, year; + DATETIME dt; + DosGetDateTime( &dt ); + second = (USHORT)dt.seconds; + minute = (USHORT)dt.minutes + dt.timezone; + hour = (USHORT)dt.hours; + day = (USHORT)dt.day; + month = (USHORT)dt.month; + year = (USHORT)dt.year; + + /* Calculations from http://www.astro.keele.ac.uk/~rno/Astronomy/hjd.html + http://www.astro.keele.ac.uk/~rno/Astronomy/hjd-0.1.c */ + /* Calculate the Julian days */ + now = day - 32076 + + 1461*(year + 4800 + (month - 14)/12)/4 + + 367*(month - 2 - (month - 14)/12*12)/12 - + 3*((year + 4900 + (month - 14)/12)/100)/4; + + /* Add the fractional hours, mins and seconds */ + now += (hour + 12.0)/24.0; + now += minute/1440.0; + now += second/86400.0; + *prNow = now; +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *prNow = sqlite3_current_time/86400.0 + 2440587.5; + } +#endif + return 0; +} + +/* +** Remember the number of thread-specific-data blocks allocated. +** Use this to verify that we are not leaking thread-specific-data. +** Ticket #1601 +*/ +#ifdef SQLITE_TEST +int sqlite3_tsd_count = 0; +# define TSD_COUNTER_INCR InterlockedIncrement( &sqlite3_tsd_count ) +# define TSD_COUNTER_DECR InterlockedDecrement( &sqlite3_tsd_count ) +#else +# define TSD_COUNTER_INCR /* no-op */ +# define TSD_COUNTER_DECR /* no-op */ +#endif + +/* +** If called with allocateFlag>1, then return a pointer to thread +** specific data for the current thread. Allocate and zero the +** thread-specific data if it does not already exist necessary. +** +** If called with allocateFlag==0, then check the current thread +** specific data. Return it if it exists. If it does not exist, +** then return NULL. +** +** If called with allocateFlag<0, check to see if the thread specific +** data is allocated and is all zero. If it is then deallocate it. +** Return a pointer to the thread specific data or NULL if it is +** unallocated or gets deallocated. +*/ +ThreadData *sqlite3Os2ThreadSpecificData( int allocateFlag ){ + static ThreadData **s_ppTsd = NULL; + static const ThreadData zeroData = {0, 0, 0}; + ThreadData *pTsd; + + if( !s_ppTsd ){ + sqlite3OsEnterMutex(); + if( !s_ppTsd ){ + PULONG pul; + APIRET rc = DosAllocThreadLocalMemory(1, &pul); + if( rc != NO_ERROR ){ + sqlite3OsLeaveMutex(); + return 0; + } + s_ppTsd = (ThreadData **)pul; + } + sqlite3OsLeaveMutex(); + } + pTsd = *s_ppTsd; + if( allocateFlag>0 ){ + if( !pTsd ){ + pTsd = sqlite3OsMalloc( sizeof(zeroData) ); + if( pTsd ){ + *pTsd = zeroData; + *s_ppTsd = pTsd; + TSD_COUNTER_INCR; + } + } + }else if( pTsd!=0 && allocateFlag<0 + && memcmp( pTsd, &zeroData, sizeof(ThreadData) )==0 ){ + sqlite3OsFree(pTsd); + *s_ppTsd = NULL; + TSD_COUNTER_DECR; + pTsd = 0; + } + return pTsd; +} +#endif /* OS_OS2 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c new file mode 100644 index 0000000000..e95435e74b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c @@ -0,0 +1,2749 @@ +/* +** 2004 May 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains code that is specific to Unix systems. +*/ +#include "sqliteInt.h" +#if OS_UNIX /* This file is used on unix only */ + +/* #define SQLITE_ENABLE_LOCKING_STYLE 0 */ + +/* +** These #defines should enable >2GB file support on Posix if the +** underlying operating system supports it. If the OS lacks +** large file support, these should be no-ops. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: RedHat 7.2) but you want your code to work +** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in RedHat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* +** standard include files. +*/ +#include +#include +#include +#include +#include +#include +#include +#ifdef SQLITE_ENABLE_LOCKING_STYLE +#include +#include +#include +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** If we are to be thread-safe, include the pthreads header and define +** the SQLITE_UNIX_THREADS macro. +*/ +#if SQLITE_THREADSAFE +# include +# define SQLITE_UNIX_THREADS 1 +#endif + +/* +** Default permissions when creating a new file +*/ +#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS +# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 +#endif + +/* +** Maximum supported path-length. +*/ +#define MAX_PATHNAME 512 + + +/* +** The unixFile structure is subclass of sqlite3_file specific for the unix +** protability layer. +*/ +typedef struct unixFile unixFile; +struct unixFile { + sqlite3_io_methods const *pMethod; /* Always the first entry */ +#ifdef SQLITE_TEST + /* In test mode, increase the size of this structure a bit so that + ** it is larger than the struct CrashFile defined in test6.c. + */ + char aPadding[32]; +#endif + struct openCnt *pOpen; /* Info about all open fd's on this inode */ + struct lockInfo *pLock; /* Info about locks on this inode */ +#ifdef SQLITE_ENABLE_LOCKING_STYLE + void *lockingContext; /* Locking style specific state */ +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + int h; /* The file descriptor */ + unsigned char locktype; /* The type of lock held on this fd */ + int dirfd; /* File descriptor for the directory */ +#if SQLITE_THREADSAFE + pthread_t tid; /* The thread that "owns" this unixFile */ +#endif +}; + +/* +** Include code that is common to all os_*.c files +*/ +#include "os_common.h" + +/* +** Define various macros that are missing from some systems. +*/ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifdef SQLITE_DISABLE_LFS +# undef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifndef O_NOFOLLOW +# define O_NOFOLLOW 0 +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* +** The DJGPP compiler environment looks mostly like Unix, but it +** lacks the fcntl() system call. So redefine fcntl() to be something +** that always succeeds. This means that locking does not occur under +** DJGPP. But it's DOS - what did you expect? +*/ +#ifdef __DJGPP__ +# define fcntl(A,B,C) 0 +#endif + +/* +** The threadid macro resolves to the thread-id or to 0. Used for +** testing and debugging only. +*/ +#if SQLITE_THREADSAFE +#define threadid pthread_self() +#else +#define threadid 0 +#endif + +/* +** Set or check the unixFile.tid field. This field is set when an unixFile +** is first opened. All subsequent uses of the unixFile verify that the +** same thread is operating on the unixFile. Some operating systems do +** not allow locks to be overridden by other threads and that restriction +** means that sqlite3* database handles cannot be moved from one thread +** to another. This logic makes sure a user does not try to do that +** by mistake. +** +** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to +** another as long as we are running on a system that supports threads +** overriding each others locks (which now the most common behavior) +** or if no locks are held. But the unixFile.pLock field needs to be +** recomputed because its key includes the thread-id. See the +** transferOwnership() function below for additional information +*/ +#if SQLITE_THREADSAFE +# define SET_THREADID(X) (X)->tid = pthread_self() +# define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \ + !pthread_equal((X)->tid, pthread_self())) +#else +# define SET_THREADID(X) +# define CHECK_THREADID(X) 0 +#endif + +/* +** Here is the dirt on POSIX advisory locks: ANSI STD 1003.1 (1996) +** section 6.5.2.2 lines 483 through 490 specify that when a process +** sets or clears a lock, that operation overrides any prior locks set +** by the same process. It does not explicitly say so, but this implies +** that it overrides locks set by the same process using a different +** file descriptor. Consider this test case: +** +** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644); +** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644); +** +** Suppose ./file1 and ./file2 are really the same file (because +** one is a hard or symbolic link to the other) then if you set +** an exclusive lock on fd1, then try to get an exclusive lock +** on fd2, it works. I would have expected the second lock to +** fail since there was already a lock on the file due to fd1. +** But not so. Since both locks came from the same process, the +** second overrides the first, even though they were on different +** file descriptors opened on different file names. +** +** Bummer. If you ask me, this is broken. Badly broken. It means +** that we cannot use POSIX locks to synchronize file access among +** competing threads of the same process. POSIX locks will work fine +** to synchronize access for threads in separate processes, but not +** threads within the same process. +** +** To work around the problem, SQLite has to manage file locks internally +** on its own. Whenever a new database is opened, we have to find the +** specific inode of the database file (the inode is determined by the +** st_dev and st_ino fields of the stat structure that fstat() fills in) +** and check for locks already existing on that inode. When locks are +** created or removed, we have to look at our own internal record of the +** locks to see if another thread has previously set a lock on that same +** inode. +** +** The sqlite3_file structure for POSIX is no longer just an integer file +** descriptor. It is now a structure that holds the integer file +** descriptor and a pointer to a structure that describes the internal +** locks on the corresponding inode. There is one locking structure +** per inode, so if the same inode is opened twice, both unixFile structures +** point to the same locking structure. The locking structure keeps +** a reference count (so we will know when to delete it) and a "cnt" +** field that tells us its internal lock status. cnt==0 means the +** file is unlocked. cnt==-1 means the file has an exclusive lock. +** cnt>0 means there are cnt shared locks on the file. +** +** Any attempt to lock or unlock a file first checks the locking +** structure. The fcntl() system call is only invoked to set a +** POSIX lock if the internal lock structure transitions between +** a locked and an unlocked state. +** +** 2004-Jan-11: +** More recent discoveries about POSIX advisory locks. (The more +** I discover, the more I realize the a POSIX advisory locks are +** an abomination.) +** +** If you close a file descriptor that points to a file that has locks, +** all locks on that file that are owned by the current process are +** released. To work around this problem, each unixFile structure contains +** a pointer to an openCnt structure. There is one openCnt structure +** per open inode, which means that multiple unixFile can point to a single +** openCnt. When an attempt is made to close an unixFile, if there are +** other unixFile open on the same inode that are holding locks, the call +** to close() the file descriptor is deferred until all of the locks clear. +** The openCnt structure keeps a list of file descriptors that need to +** be closed and that list is walked (and cleared) when the last lock +** clears. +** +** First, under Linux threads, because each thread has a separate +** process ID, lock operations in one thread do not override locks +** to the same file in other threads. Linux threads behave like +** separate processes in this respect. But, if you close a file +** descriptor in linux threads, all locks are cleared, even locks +** on other threads and even though the other threads have different +** process IDs. Linux threads is inconsistent in this respect. +** (I'm beginning to think that linux threads is an abomination too.) +** The consequence of this all is that the hash table for the lockInfo +** structure has to include the process id as part of its key because +** locks in different threads are treated as distinct. But the +** openCnt structure should not include the process id in its +** key because close() clears lock on all threads, not just the current +** thread. Were it not for this goofiness in linux threads, we could +** combine the lockInfo and openCnt structures into a single structure. +** +** 2004-Jun-28: +** On some versions of linux, threads can override each others locks. +** On others not. Sometimes you can change the behavior on the same +** system by setting the LD_ASSUME_KERNEL environment variable. The +** POSIX standard is silent as to which behavior is correct, as far +** as I can tell, so other versions of unix might show the same +** inconsistency. There is no little doubt in my mind that posix +** advisory locks and linux threads are profoundly broken. +** +** To work around the inconsistencies, we have to test at runtime +** whether or not threads can override each others locks. This test +** is run once, the first time any lock is attempted. A static +** variable is set to record the results of this test for future +** use. +*/ + +/* +** An instance of the following structure serves as the key used +** to locate a particular lockInfo structure given its inode. +** +** If threads cannot override each others locks, then we set the +** lockKey.tid field to the thread ID. If threads can override +** each others locks then tid is always set to zero. tid is omitted +** if we compile without threading support. +*/ +struct lockKey { + dev_t dev; /* Device number */ + ino_t ino; /* Inode number */ +#if SQLITE_THREADSAFE + pthread_t tid; /* Thread ID or zero if threads can override each other */ +#endif +}; + +/* +** An instance of the following structure is allocated for each open +** inode on each thread with a different process ID. (Threads have +** different process IDs on linux, but not on most other unixes.) +** +** A single inode can have multiple file descriptors, so each unixFile +** structure contains a pointer to an instance of this object and this +** object keeps a count of the number of unixFile pointing to it. +*/ +struct lockInfo { + struct lockKey key; /* The lookup key */ + int cnt; /* Number of SHARED locks held */ + int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ + int nRef; /* Number of pointers to this structure */ +}; + +/* +** An instance of the following structure serves as the key used +** to locate a particular openCnt structure given its inode. This +** is the same as the lockKey except that the thread ID is omitted. +*/ +struct openKey { + dev_t dev; /* Device number */ + ino_t ino; /* Inode number */ +}; + +/* +** An instance of the following structure is allocated for each open +** inode. This structure keeps track of the number of locks on that +** inode. If a close is attempted against an inode that is holding +** locks, the close is deferred until all locks clear by adding the +** file descriptor to be closed to the pending list. +*/ +struct openCnt { + struct openKey key; /* The lookup key */ + int nRef; /* Number of pointers to this structure */ + int nLock; /* Number of outstanding locks */ + int nPending; /* Number of pending close() operations */ + int *aPending; /* Malloced space holding fd's awaiting a close() */ +}; + +/* +** These hash tables map inodes and file descriptors (really, lockKey and +** openKey structures) into lockInfo and openCnt structures. Access to +** these hash tables must be protected by a mutex. +*/ +static Hash lockHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0}; +static Hash openHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0}; + +#ifdef SQLITE_ENABLE_LOCKING_STYLE +/* +** The locking styles are associated with the different file locking +** capabilities supported by different file systems. +** +** POSIX locking style fully supports shared and exclusive byte-range locks +** ADP locking only supports exclusive byte-range locks +** FLOCK only supports a single file-global exclusive lock +** DOTLOCK isn't a true locking style, it refers to the use of a special +** file named the same as the database file with a '.lock' extension, this +** can be used on file systems that do not offer any reliable file locking +** NO locking means that no locking will be attempted, this is only used for +** read-only file systems currently +** UNSUPPORTED means that no locking will be attempted, this is only used for +** file systems that are known to be unsupported +*/ +typedef enum { + posixLockingStyle = 0, /* standard posix-advisory locks */ + afpLockingStyle, /* use afp locks */ + flockLockingStyle, /* use flock() */ + dotlockLockingStyle, /* use .lock files */ + noLockingStyle, /* useful for read-only file system */ + unsupportedLockingStyle /* indicates unsupported file system */ +} sqlite3LockingStyle; +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Helper functions to obtain and relinquish the global mutex. +*/ +static void enterMutex(){ + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); +} +static void leaveMutex(){ + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); +} + +#if SQLITE_THREADSAFE +/* +** This variable records whether or not threads can override each others +** locks. +** +** 0: No. Threads cannot override each others locks. +** 1: Yes. Threads can override each others locks. +** -1: We don't know yet. +** +** On some systems, we know at compile-time if threads can override each +** others locks. On those systems, the SQLITE_THREAD_OVERRIDE_LOCK macro +** will be set appropriately. On other systems, we have to check at +** runtime. On these latter systems, SQLTIE_THREAD_OVERRIDE_LOCK is +** undefined. +** +** This variable normally has file scope only. But during testing, we make +** it a global so that the test code can change its value in order to verify +** that the right stuff happens in either case. +*/ +#ifndef SQLITE_THREAD_OVERRIDE_LOCK +# define SQLITE_THREAD_OVERRIDE_LOCK -1 +#endif +#ifdef SQLITE_TEST +int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK; +#else +static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK; +#endif + +/* +** This structure holds information passed into individual test +** threads by the testThreadLockingBehavior() routine. +*/ +struct threadTestData { + int fd; /* File to be locked */ + struct flock lock; /* The locking operation */ + int result; /* Result of the locking operation */ +}; + +#ifdef SQLITE_LOCK_TRACE +/* +** Print out information about all locking operations. +** +** This routine is used for troubleshooting locks on multithreaded +** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE +** command-line option on the compiler. This code is normally +** turned off. +*/ +static int lockTrace(int fd, int op, struct flock *p){ + char *zOpName, *zType; + int s; + int savedErrno; + if( op==F_GETLK ){ + zOpName = "GETLK"; + }else if( op==F_SETLK ){ + zOpName = "SETLK"; + }else{ + s = fcntl(fd, op, p); + sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); + return s; + } + if( p->l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( p->l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( p->l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + assert( p->l_whence==SEEK_SET ); + s = fcntl(fd, op, p); + savedErrno = errno; + sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n", + threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len, + (int)p->l_pid, s); + if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){ + struct flock l2; + l2 = *p; + fcntl(fd, F_GETLK, &l2); + if( l2.l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( l2.l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( l2.l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n", + zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid); + } + errno = savedErrno; + return s; +} +#define fcntl lockTrace +#endif /* SQLITE_LOCK_TRACE */ + +/* +** The testThreadLockingBehavior() routine launches two separate +** threads on this routine. This routine attempts to lock a file +** descriptor then returns. The success or failure of that attempt +** allows the testThreadLockingBehavior() procedure to determine +** whether or not threads can override each others locks. +*/ +static void *threadLockingTest(void *pArg){ + struct threadTestData *pData = (struct threadTestData*)pArg; + pData->result = fcntl(pData->fd, F_SETLK, &pData->lock); + return pArg; +} + +/* +** This procedure attempts to determine whether or not threads +** can override each others locks then sets the +** threadsOverrideEachOthersLocks variable appropriately. +*/ +static void testThreadLockingBehavior(int fd_orig){ + int fd; + struct threadTestData d[2]; + pthread_t t[2]; + + fd = dup(fd_orig); + if( fd<0 ) return; + memset(d, 0, sizeof(d)); + d[0].fd = fd; + d[0].lock.l_type = F_RDLCK; + d[0].lock.l_len = 1; + d[0].lock.l_start = 0; + d[0].lock.l_whence = SEEK_SET; + d[1] = d[0]; + d[1].lock.l_type = F_WRLCK; + pthread_create(&t[0], 0, threadLockingTest, &d[0]); + pthread_create(&t[1], 0, threadLockingTest, &d[1]); + pthread_join(t[0], 0); + pthread_join(t[1], 0); + close(fd); + threadsOverrideEachOthersLocks = d[0].result==0 && d[1].result==0; +} +#endif /* SQLITE_THREADSAFE */ + +/* +** Release a lockInfo structure previously allocated by findLockInfo(). +*/ +static void releaseLockInfo(struct lockInfo *pLock){ + if (pLock == NULL) + return; + pLock->nRef--; + if( pLock->nRef==0 ){ + sqlite3HashInsert(&lockHash, &pLock->key, sizeof(pLock->key), 0); + sqlite3_free(pLock); + } +} + +/* +** Release a openCnt structure previously allocated by findLockInfo(). +*/ +static void releaseOpenCnt(struct openCnt *pOpen){ + if (pOpen == NULL) + return; + pOpen->nRef--; + if( pOpen->nRef==0 ){ + sqlite3HashInsert(&openHash, &pOpen->key, sizeof(pOpen->key), 0); + free(pOpen->aPending); + sqlite3_free(pOpen); + } +} + +#ifdef SQLITE_ENABLE_LOCKING_STYLE +/* +** Tests a byte-range locking query to see if byte range locks are +** supported, if not we fall back to dotlockLockingStyle. +*/ +static sqlite3LockingStyle sqlite3TestLockingStyle( + const char *filePath, + int fd +){ + /* test byte-range lock using fcntl */ + struct flock lockInfo; + + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + + if( fcntl(fd, F_GETLK, &lockInfo)!=-1 ) { + return posixLockingStyle; + } + + /* testing for flock can give false positives. So if if the above test + ** fails, then we fall back to using dot-lock style locking. + */ + return dotlockLockingStyle; +} + +/* +** Examines the f_fstypename entry in the statfs structure as returned by +** stat() for the file system hosting the database file, assigns the +** appropriate locking style based on it's value. These values and +** assignments are based on Darwin/OSX behavior and have not been tested on +** other systems. +*/ +static sqlite3LockingStyle sqlite3DetectLockingStyle( + const char *filePath, + int fd +){ + +#ifdef SQLITE_FIXED_LOCKING_STYLE + return (sqlite3LockingStyle)SQLITE_FIXED_LOCKING_STYLE; +#else + struct statfs fsInfo; + + if (statfs(filePath, &fsInfo) == -1) + return sqlite3TestLockingStyle(filePath, fd); + + if (fsInfo.f_flags & MNT_RDONLY) + return noLockingStyle; + + if( (!strcmp(fsInfo.f_fstypename, "hfs")) || + (!strcmp(fsInfo.f_fstypename, "ufs")) ) + return posixLockingStyle; + + if(!strcmp(fsInfo.f_fstypename, "afpfs")) + return afpLockingStyle; + + if(!strcmp(fsInfo.f_fstypename, "nfs")) + return sqlite3TestLockingStyle(filePath, fd); + + if(!strcmp(fsInfo.f_fstypename, "smbfs")) + return flockLockingStyle; + + if(!strcmp(fsInfo.f_fstypename, "msdos")) + return dotlockLockingStyle; + + if(!strcmp(fsInfo.f_fstypename, "webdav")) + return unsupportedLockingStyle; + + return sqlite3TestLockingStyle(filePath, fd); +#endif /* SQLITE_FIXED_LOCKING_STYLE */ +} + +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Given a file descriptor, locate lockInfo and openCnt structures that +** describes that file descriptor. Create new ones if necessary. The +** return values might be uninitialized if an error occurs. +** +** Return the number of errors. +*/ +static int findLockInfo( + int fd, /* The file descriptor used in the key */ + struct lockInfo **ppLock, /* Return the lockInfo structure here */ + struct openCnt **ppOpen /* Return the openCnt structure here */ +){ + int rc; + struct lockKey key1; + struct openKey key2; + struct stat statbuf; + struct lockInfo *pLock; + struct openCnt *pOpen; + rc = fstat(fd, &statbuf); + if( rc!=0 ) return 1; + + memset(&key1, 0, sizeof(key1)); + key1.dev = statbuf.st_dev; + key1.ino = statbuf.st_ino; +#if SQLITE_THREADSAFE + if( threadsOverrideEachOthersLocks<0 ){ + testThreadLockingBehavior(fd); + } + key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self(); +#endif + memset(&key2, 0, sizeof(key2)); + key2.dev = statbuf.st_dev; + key2.ino = statbuf.st_ino; + pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1)); + if( pLock==0 ){ + struct lockInfo *pOld; + pLock = sqlite3_malloc( sizeof(*pLock) ); + if( pLock==0 ){ + rc = 1; + goto exit_findlockinfo; + } + pLock->key = key1; + pLock->nRef = 1; + pLock->cnt = 0; + pLock->locktype = 0; + pOld = sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock); + if( pOld!=0 ){ + assert( pOld==pLock ); + sqlite3_free(pLock); + rc = 1; + goto exit_findlockinfo; + } + }else{ + pLock->nRef++; + } + *ppLock = pLock; + if( ppOpen!=0 ){ + pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2)); + if( pOpen==0 ){ + struct openCnt *pOld; + pOpen = sqlite3_malloc( sizeof(*pOpen) ); + if( pOpen==0 ){ + releaseLockInfo(pLock); + rc = 1; + goto exit_findlockinfo; + } + pOpen->key = key2; + pOpen->nRef = 1; + pOpen->nLock = 0; + pOpen->nPending = 0; + pOpen->aPending = 0; + pOld = sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen); + if( pOld!=0 ){ + assert( pOld==pOpen ); + sqlite3_free(pOpen); + releaseLockInfo(pLock); + rc = 1; + goto exit_findlockinfo; + } + }else{ + pOpen->nRef++; + } + *ppOpen = pOpen; + } + +exit_findlockinfo: + return rc; +} + +#ifdef SQLITE_DEBUG +/* +** Helper function for printing out trace information from debugging +** binaries. This returns the string represetation of the supplied +** integer lock-type. +*/ +static const char *locktypeName(int locktype){ + switch( locktype ){ + case NO_LOCK: return "NONE"; + case SHARED_LOCK: return "SHARED"; + case RESERVED_LOCK: return "RESERVED"; + case PENDING_LOCK: return "PENDING"; + case EXCLUSIVE_LOCK: return "EXCLUSIVE"; + } + return "ERROR"; +} +#endif + +/* +** If we are currently in a different thread than the thread that the +** unixFile argument belongs to, then transfer ownership of the unixFile +** over to the current thread. +** +** A unixFile is only owned by a thread on systems where one thread is +** unable to override locks created by a different thread. RedHat9 is +** an example of such a system. +** +** Ownership transfer is only allowed if the unixFile is currently unlocked. +** If the unixFile is locked and an ownership is wrong, then return +** SQLITE_MISUSE. SQLITE_OK is returned if everything works. +*/ +#if SQLITE_THREADSAFE +static int transferOwnership(unixFile *pFile){ + int rc; + pthread_t hSelf; + if( threadsOverrideEachOthersLocks ){ + /* Ownership transfers not needed on this system */ + return SQLITE_OK; + } + hSelf = pthread_self(); + if( pthread_equal(pFile->tid, hSelf) ){ + /* We are still in the same thread */ + OSTRACE1("No-transfer, same thread\n"); + return SQLITE_OK; + } + if( pFile->locktype!=NO_LOCK ){ + /* We cannot change ownership while we are holding a lock! */ + return SQLITE_MISUSE; + } + OSTRACE4("Transfer ownership of %d from %d to %d\n", + pFile->h, pFile->tid, hSelf); + pFile->tid = hSelf; + if (pFile->pLock != NULL) { + releaseLockInfo(pFile->pLock); + rc = findLockInfo(pFile->h, &pFile->pLock, 0); + OSTRACE5("LOCK %d is now %s(%s,%d)\n", pFile->h, + locktypeName(pFile->locktype), + locktypeName(pFile->pLock->locktype), pFile->pLock->cnt); + return rc; + } else { + return SQLITE_OK; + } +} +#else + /* On single-threaded builds, ownership transfer is a no-op */ +# define transferOwnership(X) SQLITE_OK +#endif + +/* +** Seek to the offset passed as the second argument, then read cnt +** bytes into pBuf. Return the number of bytes actually read. +*/ +static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ + int got; + i64 newOffset; + TIMER_START; +#if defined(USE_PREAD) + got = pread(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#elif defined(USE_PREAD64) + got = pread64(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#else + newOffset = lseek(id->h, offset, SEEK_SET); + SimulateIOError( newOffset-- ); + if( newOffset!=offset ){ + return -1; + } + got = read(id->h, pBuf, cnt); +#endif + TIMER_END; + OSTRACE5("READ %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED); + return got; +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int unixRead( + sqlite3_file *id, + void *pBuf, + int amt, + sqlite3_int64 offset +){ + int got; + assert( id ); + got = seekAndRead((unixFile*)id, offset, pBuf, amt); + if( got==amt ){ + return SQLITE_OK; + }else if( got<0 ){ + return SQLITE_IOERR_READ; + }else{ + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Seek to the offset in id->offset then read cnt bytes into pBuf. +** Return the number of bytes actually read. Update the offset. +*/ +static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ + int got; + i64 newOffset; + TIMER_START; +#if defined(USE_PREAD) + got = pwrite(id->h, pBuf, cnt, offset); +#elif defined(USE_PREAD64) + got = pwrite64(id->h, pBuf, cnt, offset); +#else + newOffset = lseek(id->h, offset, SEEK_SET); + if( newOffset!=offset ){ + return -1; + } + got = write(id->h, pBuf, cnt); +#endif + TIMER_END; + OSTRACE5("WRITE %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED); + return got; +} + + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int unixWrite( + sqlite3_file *id, + const void *pBuf, + int amt, + sqlite3_int64 offset +){ + int wrote = 0; + assert( id ); + assert( amt>0 ); + while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){ + amt -= wrote; + offset += wrote; + pBuf = &((char*)pBuf)[wrote]; + } + SimulateIOError(( wrote=(-1), amt=1 )); + SimulateDiskfullError(( wrote=0, amt=1 )); + if( amt>0 ){ + if( wrote<0 ){ + return SQLITE_IOERR_WRITE; + }else{ + return SQLITE_FULL; + } + } + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occuring at the right times. +*/ +int sqlite3_sync_count = 0; +int sqlite3_fullsync_count = 0; +#endif + +/* +** Use the fdatasync() API only if the HAVE_FDATASYNC macro is defined. +** Otherwise use fsync() in its place. +*/ +#ifndef HAVE_FDATASYNC +# define fdatasync fsync +#endif + +/* +** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not +** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently +** only available on Mac OS X. But that could change. +*/ +#ifdef F_FULLFSYNC +# define HAVE_FULLFSYNC 1 +#else +# define HAVE_FULLFSYNC 0 +#endif + + +/* +** The fsync() system call does not work as advertised on many +** unix systems. The following procedure is an attempt to make +** it work better. +** +** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful +** for testing when we want to run through the test suite quickly. +** You are strongly advised *not* to deploy with SQLITE_NO_SYNC +** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash +** or power failure will likely corrupt the database file. +*/ +static int full_fsync(int fd, int fullSync, int dataOnly){ + int rc; + + /* Record the number of times that we do a normal fsync() and + ** FULLSYNC. This is used during testing to verify that this procedure + ** gets called with the correct arguments. + */ +#ifdef SQLITE_TEST + if( fullSync ) sqlite3_fullsync_count++; + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op + */ +#ifdef SQLITE_NO_SYNC + rc = SQLITE_OK; +#else + +#if HAVE_FULLFSYNC + if( fullSync ){ + rc = fcntl(fd, F_FULLFSYNC, 0); + }else{ + rc = 1; + } + /* If the FULLFSYNC failed, fall back to attempting an fsync(). + * It shouldn't be possible for fullfsync to fail on the local + * file system (on OSX), so failure indicates that FULLFSYNC + * isn't supported for this file system. So, attempt an fsync + * and (for now) ignore the overhead of a superfluous fcntl call. + * It'd be better to detect fullfsync support once and avoid + * the fcntl call every time sync is called. + */ + if( rc ) rc = fsync(fd); + +#else + if( dataOnly ){ + rc = fdatasync(fd); + }else{ + rc = fsync(fd); + } +#endif /* HAVE_FULLFSYNC */ +#endif /* defined(SQLITE_NO_SYNC) */ + + return rc; +} + +/* +** Make sure all writes to a particular file are committed to disk. +** +** If dataOnly==0 then both the file itself and its metadata (file +** size, access time, etc) are synced. If dataOnly!=0 then only the +** file data is synced. +** +** Under Unix, also make sure that the directory entry for the file +** has been created by fsync-ing the directory that contains the file. +** If we do not do this and we encounter a power failure, the directory +** entry for the journal might not exist after we reboot. The next +** SQLite to access the file will not know that the journal exists (because +** the directory entry for the journal was never created) and the transaction +** will not roll back - possibly leading to database corruption. +*/ +static int unixSync(sqlite3_file *id, int flags){ + int rc; + unixFile *pFile = (unixFile*)id; + + int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); + int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; + + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + assert( pFile ); + OSTRACE2("SYNC %-3d\n", pFile->h); + rc = full_fsync(pFile->h, isFullsync, isDataOnly); + SimulateIOError( rc=1 ); + if( rc ){ + return SQLITE_IOERR_FSYNC; + } + if( pFile->dirfd>=0 ){ + OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd, + HAVE_FULLFSYNC, isFullsync); +#ifndef SQLITE_DISABLE_DIRSYNC + /* The directory sync is only attempted if full_fsync is + ** turned off or unavailable. If a full_fsync occurred above, + ** then the directory sync is superfluous. + */ + if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){ + /* + ** We have received multiple reports of fsync() returning + ** errors when applied to directories on certain file systems. + ** A failed directory sync is not a big deal. So it seems + ** better to ignore the error. Ticket #1657 + */ + /* return SQLITE_IOERR; */ + } +#endif + close(pFile->dirfd); /* Only need to sync once, so close the directory */ + pFile->dirfd = -1; /* when we are done. */ + } + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +static int unixTruncate(sqlite3_file *id, i64 nByte){ + int rc; + assert( id ); + rc = ftruncate(((unixFile*)id)->h, (off_t)nByte); + SimulateIOError( rc=1 ); + if( rc ){ + return SQLITE_IOERR_TRUNCATE; + }else{ + return SQLITE_OK; + } +} + +/* +** Determine the current size of a file in bytes +*/ +static int unixFileSize(sqlite3_file *id, i64 *pSize){ + int rc; + struct stat buf; + assert( id ); + rc = fstat(((unixFile*)id)->h, &buf); + SimulateIOError( rc=1 ); + if( rc!=0 ){ + return SQLITE_IOERR_FSTAT; + } + *pSize = buf.st_size; + return SQLITE_OK; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero. If the file is unlocked or holds only SHARED locks, then +** return zero. +*/ +static int unixCheckReservedLock(sqlite3_file *id){ + int r = 0; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + enterMutex(); /* Because pFile->pLock is shared across threads */ + + /* Check if a thread in this process holds such a lock */ + if( pFile->pLock->locktype>SHARED_LOCK ){ + r = 1; + } + + /* Otherwise see if some other process holds it. + */ + if( !r ){ + struct flock lock; + lock.l_whence = SEEK_SET; + lock.l_start = RESERVED_BYTE; + lock.l_len = 1; + lock.l_type = F_WRLCK; + fcntl(pFile->h, F_GETLK, &lock); + if( lock.l_type!=F_UNLCK ){ + r = 1; + } + } + + leaveMutex(); + OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r); + + return r; +} + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int unixLock(sqlite3_file *id, int locktype){ + /* The following describes the implementation of the various locks and + ** lock transitions in terms of the POSIX advisory shared and exclusive + ** lock primitives (called read-locks and write-locks below, to avoid + ** confusion with SQLite lock names). The algorithms are complicated + ** slightly in order to be compatible with windows systems simultaneously + ** accessing the same database file, in case that is ever required. + ** + ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved + ** byte', each single bytes at well known offsets, and the 'shared byte + ** range', a range of 510 bytes at a well known offset. + ** + ** To obtain a SHARED lock, a read-lock is obtained on the 'pending + ** byte'. If this is successful, a random byte from the 'shared byte + ** range' is read-locked and the lock on the 'pending byte' released. + ** + ** A process may only obtain a RESERVED lock after it has a SHARED lock. + ** A RESERVED lock is implemented by grabbing a write-lock on the + ** 'reserved byte'. + ** + ** A process may only obtain a PENDING lock after it has obtained a + ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock + ** on the 'pending byte'. This ensures that no new SHARED locks can be + ** obtained, but existing SHARED locks are allowed to persist. A process + ** does not have to obtain a RESERVED lock on the way to a PENDING lock. + ** This property is used by the algorithm for rolling back a journal file + ** after a crash. + ** + ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is + ** implemented by obtaining a write-lock on the entire 'shared byte + ** range'. Since all other locks require a read-lock on one of the bytes + ** within this range, this ensures that no other locks are held on the + ** database. + ** + ** The reason a single byte cannot be used instead of the 'shared byte + ** range' is that some versions of windows do not support read-locks. By + ** locking a random byte from a range, concurrent SHARED locks may exist + ** even if the locking primitive used is always a write-lock. + */ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + struct lockInfo *pLock = pFile->pLock; + struct flock lock; + int s; + + assert( pFile ); + OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d\n", pFile->h, + locktypeName(locktype), locktypeName(pFile->locktype), + locktypeName(pLock->locktype), pLock->cnt , getpid()); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the end_lock: exit path, as + ** enterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, + locktypeName(locktype)); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* This mutex is needed because pFile->pLock is shared across threads + */ + enterMutex(); + + /* Make sure the current thread owns the pFile. + */ + rc = transferOwnership(pFile); + if( rc!=SQLITE_OK ){ + leaveMutex(); + return rc; + } + pLock = pFile->pLock; + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->locktype!=pLock->locktype && + (pLock->locktype>=PENDING_LOCK || locktype>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( locktype==SHARED_LOCK && + (pLock->locktype==SHARED_LOCK || pLock->locktype==RESERVED_LOCK) ){ + assert( locktype==SHARED_LOCK ); + assert( pFile->locktype==0 ); + assert( pLock->cnt>0 ); + pFile->locktype = SHARED_LOCK; + pLock->cnt++; + pFile->pOpen->nLock++; + goto end_lock; + } + + lock.l_len = 1L; + + lock.l_whence = SEEK_SET; + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + if( locktype==SHARED_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktypeh, F_SETLK, &lock); + if( s==(-1) ){ + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + goto end_lock; + } + } + + + /* If control gets to this point, then actually go ahead and make + ** operating system calls for the specified lock. + */ + if( locktype==SHARED_LOCK ){ + assert( pLock->cnt==0 ); + assert( pLock->locktype==0 ); + + /* Now get the read-lock */ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + s = fcntl(pFile->h, F_SETLK, &lock); + + /* Drop the temporary PENDING lock */ + lock.l_start = PENDING_BYTE; + lock.l_len = 1L; + lock.l_type = F_UNLCK; + if( fcntl(pFile->h, F_SETLK, &lock)!=0 ){ + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + goto end_lock; + } + if( s==(-1) ){ + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + }else{ + pFile->locktype = SHARED_LOCK; + pFile->pOpen->nLock++; + pLock->cnt = 1; + } + }else if( locktype==EXCLUSIVE_LOCK && pLock->cnt>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + assert( 0!=pFile->locktype ); + lock.l_type = F_WRLCK; + switch( locktype ){ + case RESERVED_LOCK: + lock.l_start = RESERVED_BYTE; + break; + case EXCLUSIVE_LOCK: + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + break; + default: + assert(0); + } + s = fcntl(pFile->h, F_SETLK, &lock); + if( s==(-1) ){ + rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; + } + } + + if( rc==SQLITE_OK ){ + pFile->locktype = locktype; + pLock->locktype = locktype; + }else if( locktype==EXCLUSIVE_LOCK ){ + pFile->locktype = PENDING_LOCK; + pLock->locktype = PENDING_LOCK; + } + +end_lock: + leaveMutex(); + OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), + rc==SQLITE_OK ? "ok" : "failed"); + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int unixUnlock(sqlite3_file *id, int locktype){ + struct lockInfo *pLock; + struct flock lock; + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d\n", pFile->h, locktype, + pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid()); + + assert( locktype<=SHARED_LOCK ); + if( pFile->locktype<=locktype ){ + return SQLITE_OK; + } + if( CHECK_THREADID(pFile) ){ + return SQLITE_MISUSE; + } + enterMutex(); + pLock = pFile->pLock; + assert( pLock->cnt!=0 ); + if( pFile->locktype>SHARED_LOCK ){ + assert( pLock->locktype==pFile->locktype ); + if( locktype==SHARED_LOCK ){ + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( fcntl(pFile->h, F_SETLK, &lock)==(-1) ){ + /* This should never happen */ + rc = SQLITE_IOERR_RDLOCK; + } + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = PENDING_BYTE; + lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE ); + if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){ + pLock->locktype = SHARED_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + } + } + if( locktype==NO_LOCK ){ + struct openCnt *pOpen; + + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + pLock->cnt--; + if( pLock->cnt==0 ){ + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = lock.l_len = 0L; + if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){ + pLock->locktype = NO_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + } + } + + /* Decrement the count of locks against this same file. When the + ** count reaches zero, close any other file descriptors whose close + ** was deferred because of outstanding locks. + */ + pOpen = pFile->pOpen; + pOpen->nLock--; + assert( pOpen->nLock>=0 ); + if( pOpen->nLock==0 && pOpen->nPending>0 ){ + int i; + for(i=0; inPending; i++){ + close(pOpen->aPending[i]); + } + free(pOpen->aPending); + pOpen->nPending = 0; + pOpen->aPending = 0; + } + } + leaveMutex(); + pFile->locktype = locktype; + return rc; +} + +/* +** Close a file. +*/ +static int unixClose(sqlite3_file *id){ + unixFile *pFile = (unixFile *)id; + if( !pFile ) return SQLITE_OK; + unixUnlock(id, NO_LOCK); + if( pFile->dirfd>=0 ) close(pFile->dirfd); + pFile->dirfd = -1; + enterMutex(); + + if( pFile->pOpen->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pOpen->aPending. It will be automatically closed when + ** the last lock is cleared. + */ + int *aNew; + struct openCnt *pOpen = pFile->pOpen; + aNew = realloc( pOpen->aPending, (pOpen->nPending+1)*sizeof(int) ); + if( aNew==0 ){ + /* If a malloc fails, just leak the file descriptor */ + }else{ + pOpen->aPending = aNew; + pOpen->aPending[pOpen->nPending] = pFile->h; + pOpen->nPending++; + } + }else{ + /* There are no outstanding locks so we can close the file immediately */ + close(pFile->h); + } + releaseLockInfo(pFile->pLock); + releaseOpenCnt(pFile->pOpen); + + leaveMutex(); + OSTRACE2("CLOSE %-3d\n", pFile->h); + OpenCounter(-1); + memset(pFile, 0, sizeof(unixFile)); + return SQLITE_OK; +} + + +#ifdef SQLITE_ENABLE_LOCKING_STYLE +#pragma mark AFP Support + +/* + ** The afpLockingContext structure contains all afp lock specific state + */ +typedef struct afpLockingContext afpLockingContext; +struct afpLockingContext { + unsigned long long sharedLockByte; + char *filePath; +}; + +struct ByteRangeLockPB2 +{ + unsigned long long offset; /* offset to first byte to lock */ + unsigned long long length; /* nbr of bytes to lock */ + unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */ + unsigned char unLockFlag; /* 1 = unlock, 0 = lock */ + unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */ + int fd; /* file desc to assoc this lock with */ +}; + +#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) + +/* +** Return 0 on success, 1 on failure. To match the behavior of the +** normal posix file locking (used in unixLock for example), we should +** provide 'richer' return codes - specifically to differentiate between +** 'file busy' and 'file system error' results. +*/ +static int _AFPFSSetLock( + const char *path, + int fd, + unsigned long long offset, + unsigned long long length, + int setLockFlag +){ + struct ByteRangeLockPB2 pb; + int err; + + pb.unLockFlag = setLockFlag ? 0 : 1; + pb.startEndFlag = 0; + pb.offset = offset; + pb.length = length; + pb.fd = fd; + OSTRACE5("AFPLOCK setting lock %s for %d in range %llx:%llx\n", + (setLockFlag?"ON":"OFF"), fd, offset, length); + err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); + if ( err==-1 ) { + OSTRACE4("AFPLOCK failed to fsctl() '%s' %d %s\n", path, errno, + strerror(errno)); + return 1; /* error */ + } else { + return 0; + } +} + +/* + ** This routine checks if there is a RESERVED lock held on the specified + ** file by this or any other process. If such a lock is held, return + ** non-zero. If the file is unlocked or holds only SHARED locks, then + ** return zero. + */ +static int afpUnixCheckReservedLock(sqlite3_file *id){ + int r = 0; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + + /* Check if a thread in this process holds such a lock */ + if( pFile->locktype>SHARED_LOCK ){ + r = 1; + } + + /* Otherwise see if some other process holds it. + */ + if ( !r ) { + /* lock the byte */ + int failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1); + if (failed) { + /* if we failed to get the lock then someone else must have it */ + r = 1; + } else { + /* if we succeeded in taking the reserved lock, unlock it to restore + ** the original state */ + _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0); + } + } + OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r); + + return r; +} + +/* AFP-style locking following the behavior of unixLock, see the unixLock +** function comments for details of lock management. */ +static int afpUnixLock(sqlite3_file *id, int locktype) +{ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + int gotPendingLock = 0; + + assert( pFile ); + OSTRACE5("LOCK %d %s was %s pid=%d\n", pFile->h, + locktypeName(locktype), locktypeName(pFile->locktype), getpid()); + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as + ** enterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, + locktypeName(locktype)); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* This mutex is needed because pFile->pLock is shared across threads + */ + enterMutex(); + + /* Make sure the current thread owns the pFile. + */ + rc = transferOwnership(pFile); + if( rc!=SQLITE_OK ){ + leaveMutex(); + return rc; + } + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + if( locktype==SHARED_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktypefilePath, pFile->h, + PENDING_BYTE, 1, 1); + if (failed) { + rc = SQLITE_BUSY; + goto afp_end_lock; + } + } + + /* If control gets to this point, then actually go ahead and make + ** operating system calls for the specified lock. + */ + if( locktype==SHARED_LOCK ){ + int lk, failed; + int tries = 0; + + /* Now get the read-lock */ + /* note that the quality of the randomness doesn't matter that much */ + lk = random(); + context->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1); + failed = _AFPFSSetLock(context->filePath, pFile->h, + SHARED_FIRST+context->sharedLockByte, 1, 1); + + /* Drop the temporary PENDING lock */ + if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)) { + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + goto afp_end_lock; + } + + if( failed ){ + rc = SQLITE_BUSY; + } else { + pFile->locktype = SHARED_LOCK; + } + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + int failed = 0; + assert( 0!=pFile->locktype ); + if (locktype >= RESERVED_LOCK && pFile->locktype < RESERVED_LOCK) { + /* Acquire a RESERVED lock */ + failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1); + } + if (!failed && locktype == EXCLUSIVE_LOCK) { + /* Acquire an EXCLUSIVE lock */ + + /* Remove the shared lock before trying the range. we'll need to + ** reestablish the shared lock if we can't get the afpUnixUnlock + */ + if (!_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST + + context->sharedLockByte, 1, 0)) { + /* now attemmpt to get the exclusive lock range */ + failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST, + SHARED_SIZE, 1); + if (failed && _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST + + context->sharedLockByte, 1, 1)) { + rc = SQLITE_IOERR_RDLOCK; /* this should never happen */ + } + } else { + /* */ + rc = SQLITE_IOERR_UNLOCK; /* this should never happen */ + } + } + if( failed && rc == SQLITE_OK){ + rc = SQLITE_BUSY; + } + } + + if( rc==SQLITE_OK ){ + pFile->locktype = locktype; + }else if( locktype==EXCLUSIVE_LOCK ){ + pFile->locktype = PENDING_LOCK; + } + +afp_end_lock: + leaveMutex(); + OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), + rc==SQLITE_OK ? "ok" : "failed"); + return rc; +} + +/* + ** Lower the locking level on file descriptor pFile to locktype. locktype + ** must be either NO_LOCK or SHARED_LOCK. + ** + ** If the locking level of the file descriptor is already at or below + ** the requested locking level, this routine is a no-op. + */ +static int afpUnixUnlock(sqlite3_file *id, int locktype) { + struct flock lock; + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + + assert( pFile ); + OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, + pFile->locktype, getpid()); + + assert( locktype<=SHARED_LOCK ); + if( pFile->locktype<=locktype ){ + return SQLITE_OK; + } + if( CHECK_THREADID(pFile) ){ + return SQLITE_MISUSE; + } + enterMutex(); + if( pFile->locktype>SHARED_LOCK ){ + if( locktype==SHARED_LOCK ){ + int failed = 0; + + /* unlock the exclusive range - then re-establish the shared lock */ + if (pFile->locktype==EXCLUSIVE_LOCK) { + failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST, + SHARED_SIZE, 0); + if (!failed) { + /* successfully removed the exclusive lock */ + if (_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST+ + context->sharedLockByte, 1, 1)) { + /* failed to re-establish our shared lock */ + rc = SQLITE_IOERR_RDLOCK; /* This should never happen */ + } + } else { + /* This should never happen - failed to unlock the exclusive range */ + rc = SQLITE_IOERR_UNLOCK; + } + } + } + if (rc == SQLITE_OK && pFile->locktype>=PENDING_LOCK) { + if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)){ + /* failed to release the pending lock */ + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + } + } + if (rc == SQLITE_OK && pFile->locktype>=RESERVED_LOCK) { + if (_AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0)) { + /* failed to release the reserved lock */ + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + } + } + } + if( locktype==NO_LOCK ){ + int failed = _AFPFSSetLock(context->filePath, pFile->h, + SHARED_FIRST + context->sharedLockByte, 1, 0); + if (failed) { + rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ + } + } + if (rc == SQLITE_OK) + pFile->locktype = locktype; + leaveMutex(); + return rc; +} + +/* + ** Close a file & cleanup AFP specific locking context + */ +static int afpUnixClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)pId; + + if( !pFile ) return SQLITE_OK; + afpUnixUnlock(*pId, NO_LOCK); + /* free the AFP locking structure */ + if (pFile->lockingContext != NULL) { + if (((afpLockingContext *)pFile->lockingContext)->filePath != NULL) + sqlite3_free(((afpLockingContext*)pFile->lockingContext)->filePath); + sqlite3_free(pFile->lockingContext); + } + + if( pFile->dirfd>=0 ) close(pFile->dirfd); + pFile->dirfd = -1; + close(pFile->h); + OSTRACE2("CLOSE %-3d\n", pFile->h); + OpenCounter(-1); + return SQLITE_OK; +} + + +#pragma mark flock() style locking + +/* + ** The flockLockingContext is not used + */ +typedef void flockLockingContext; + +static int flockUnixCheckReservedLock(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + + if (pFile->locktype == RESERVED_LOCK) { + return 1; /* already have a reserved lock */ + } else { + /* attempt to get the lock */ + int rc = flock(pFile->h, LOCK_EX | LOCK_NB); + if (!rc) { + /* got the lock, unlock it */ + flock(pFile->h, LOCK_UN); + return 0; /* no one has it reserved */ + } + return 1; /* someone else might have it reserved */ + } +} + +static int flockUnixLock(sqlite3_file *id, int locktype) { + unixFile *pFile = (unixFile*)id; + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->locktype > NO_LOCK) { + pFile->locktype = locktype; + return SQLITE_OK; + } + + /* grab an exclusive lock */ + int rc = flock(pFile->h, LOCK_EX | LOCK_NB); + if (rc) { + /* didn't get, must be busy */ + return SQLITE_BUSY; + } else { + /* got it, set the type and return ok */ + pFile->locktype = locktype; + return SQLITE_OK; + } +} + +static int flockUnixUnlock(sqlite3_file *id, int locktype) { + unixFile *pFile = (unixFile*)id; + + assert( locktype<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->locktype==locktype ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (locktype==SHARED_LOCK) { + pFile->locktype = locktype; + return SQLITE_OK; + } + + /* no, really, unlock. */ + int rc = flock(pFile->h, LOCK_UN); + if (rc) + return SQLITE_IOERR_UNLOCK; + else { + pFile->locktype = NO_LOCK; + return SQLITE_OK; + } +} + +/* + ** Close a file. + */ +static int flockUnixClose(sqlite3_file *pId) { + unixFile *pFile = (unixFile*)*pId; + + if( !pFile ) return SQLITE_OK; + flockUnixUnlock(*pId, NO_LOCK); + + if( pFile->dirfd>=0 ) close(pFile->dirfd); + pFile->dirfd = -1; + enterMutex(); + + close(pFile->h); + leaveMutex(); + OSTRACE2("CLOSE %-3d\n", pFile->h); + OpenCounter(-1); + return SQLITE_OK; +} + +#pragma mark Old-School .lock file based locking + +/* + ** The dotlockLockingContext structure contains all dotlock (.lock) lock + ** specific state + */ +typedef struct dotlockLockingContext dotlockLockingContext; +struct dotlockLockingContext { + char *lockPath; +}; + + +static int dotlockUnixCheckReservedLock(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + dotlockLockingContext *context = + (dotlockLockingContext *) pFile->lockingContext; + + if (pFile->locktype == RESERVED_LOCK) { + return 1; /* already have a reserved lock */ + } else { + struct stat statBuf; + if (lstat(context->lockPath,&statBuf) == 0) + /* file exists, someone else has the lock */ + return 1; + else + /* file does not exist, we could have it if we want it */ + return 0; + } +} + +static int dotlockUnixLock(sqlite3_file *id, int locktype) { + unixFile *pFile = (unixFile*)id; + dotlockLockingContext *context = + (dotlockLockingContext *) pFile->lockingContext; + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->locktype > NO_LOCK) { + pFile->locktype = locktype; + + /* Always update the timestamp on the old file */ + utimes(context->lockPath,NULL); + return SQLITE_OK; + } + + /* check to see if lock file already exists */ + struct stat statBuf; + if (lstat(context->lockPath,&statBuf) == 0){ + return SQLITE_BUSY; /* it does, busy */ + } + + /* grab an exclusive lock */ + int fd = open(context->lockPath,O_RDONLY|O_CREAT|O_EXCL,0600); + if (fd < 0) { + /* failed to open/create the file, someone else may have stolen the lock */ + return SQLITE_BUSY; + } + close(fd); + + /* got it, set the type and return ok */ + pFile->locktype = locktype; + return SQLITE_OK; +} + +static int dotlockUnixUnlock(sqlite3_file *id, int locktype) { + unixFile *pFile = (unixFile*)id; + dotlockLockingContext *context = + (dotlockLockingContext *) pFile->lockingContext; + + assert( locktype<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->locktype==locktype ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (locktype==SHARED_LOCK) { + pFile->locktype = locktype; + return SQLITE_OK; + } + + /* no, really, unlock. */ + unlink(context->lockPath); + pFile->locktype = NO_LOCK; + return SQLITE_OK; +} + +/* + ** Close a file. + */ +static int dotlockUnixClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + + if( !pFile ) return SQLITE_OK; + dotlockUnixUnlock(*pId, NO_LOCK); + /* free the dotlock locking structure */ + if (pFile->lockingContext != NULL) { + if (((dotlockLockingContext *)pFile->lockingContext)->lockPath != NULL) + sqlite3_free( ( (dotlockLockingContext *) + pFile->lockingContext)->lockPath); + sqlite3_free(pFile->lockingContext); + } + + if( pFile->dirfd>=0 ) close(pFile->dirfd); + pFile->dirfd = -1; + enterMutex(); + + close(pFile->h); + + leaveMutex(); + OSTRACE2("CLOSE %-3d\n", pFile->h); + OpenCounter(-1); + return SQLITE_OK; +} + + +#pragma mark No locking + +/* + ** The nolockLockingContext is void + */ +typedef void nolockLockingContext; + +static int nolockUnixCheckReservedLock(sqlite3_file *id) { + return 0; +} + +static int nolockUnixLock(sqlite3_file *id, int locktype) { + return SQLITE_OK; +} + +static int nolockUnixUnlock(sqlite3_file *id, int locktype) { + return SQLITE_OK; +} + +/* + ** Close a file. + */ +static int nolockUnixClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + + if( !pFile ) return SQLITE_OK; + if( pFile->dirfd>=0 ) close(pFile->dirfd); + pFile->dirfd = -1; + enterMutex(); + + close(pFile->h); + + leaveMutex(); + OSTRACE2("CLOSE %-3d\n", pFile->h); + OpenCounter(-1); + return SQLITE_OK; +} + +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + + +/* +** Information and control of an open file handle. +*/ +static int unixFileControl(sqlite3_file *id, int op, void *pArg){ + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = ((unixFile*)id)->locktype; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and it's journal file) that the sector size will be the +** same for both. +*/ +static int unixSectorSize(sqlite3_file *id){ + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** Return the device characteristics for the file. This is always 0. +*/ +static int unixDeviceCharacteristics(sqlite3_file *id){ + return 0; +} + +/* +** This vector defines all the methods that can operate on an sqlite3_file +** for unix. +*/ +static const sqlite3_io_methods sqlite3UnixIoMethod = { + 1, /* iVersion */ + unixClose, + unixRead, + unixWrite, + unixTruncate, + unixSync, + unixFileSize, + unixLock, + unixUnlock, + unixCheckReservedLock, + unixFileControl, + unixSectorSize, + unixDeviceCharacteristics +}; + +#ifdef SQLITE_ENABLE_LOCKING_STYLE +/* +** This vector defines all the methods that can operate on an sqlite3_file +** for unix with AFP style file locking. +*/ +static const sqlite3_io_methods sqlite3AFPLockingUnixIoMethod = { + 1, /* iVersion */ + unixClose, + unixRead, + unixWrite, + unixTruncate, + unixSync, + unixFileSize, + afpUnixLock, + afpUnixUnlock, + afpUnixCheckReservedLock, + unixFileControl, + unixSectorSize, + unixDeviceCharacteristics +}; + +/* +** This vector defines all the methods that can operate on an sqlite3_file +** for unix with flock() style file locking. +*/ +static const sqlite3_io_methods sqlite3FlockLockingUnixIoMethod = { + 1, /* iVersion */ + flockUnixClose, + unixRead, + unixWrite, + unixTruncate, + unixSync, + unixFileSize, + flockUnixLock, + flockUnixUnlock, + flockUnixCheckReservedLock, + unixFileControl, + unixSectorSize, + unixDeviceCharacteristics +}; + +/* +** This vector defines all the methods that can operate on an sqlite3_file +** for unix with dotlock style file locking. +*/ +static const sqlite3_io_methods sqlite3DotlockLockingUnixIoMethod = { + 1, /* iVersion */ + dotlockUnixClose, + unixRead, + unixWrite, + unixTruncate, + unixSync, + unixFileSize, + dotlockUnixLock, + dotlockUnixUnlock, + dotlockUnixCheckReservedLock, + unixFileControl, + unixSectorSize, + unixDeviceCharacteristics +}; + +/* +** This vector defines all the methods that can operate on an sqlite3_file +** for unix with dotlock style file locking. +*/ +static const sqlite3_io_methods sqlite3NolockLockingUnixIoMethod = { + 1, /* iVersion */ + nolockUnixClose, + unixRead, + unixWrite, + unixTruncate, + unixSync, + unixFileSize, + nolockUnixLock, + nolockUnixUnlock, + nolockUnixCheckReservedLock, + unixFileControl, + unixSectorSize, + unixDeviceCharacteristics +}; + +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Allocate memory for a new unixFile and initialize that unixFile. +** Write a pointer to the new unixFile into *pId. +** If we run out of memory, close the file and return an error. +*/ +#ifdef SQLITE_ENABLE_LOCKING_STYLE +/* +** When locking extensions are enabled, the filepath and locking style +** are needed to determine the unixFile pMethod to use for locking operations. +** The locking-style specific lockingContext data structure is created +** and assigned here also. +*/ +static int fillInUnixFile( + int h, /* Open file descriptor of file being opened */ + int dirfd, /* Directory file descriptor */ + sqlite3_file *pId, /* Write completed initialization here */ + const char *zFilename, /* Name of the file being opened */ +){ + sqlite3LockingStyle lockingStyle; + unixFile *pNew = (unixFile *)pId; + int rc; + + memset(pNew, 0, sizeof(unixFile)); + lockingStyle = sqlite3DetectLockingStyle(zFilename, h); + if ( lockingStyle == posixLockingStyle ) { + enterMutex(); + rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen); + leaveMutex(); + if( rc ){ + close(h); + unlink(zFilename); + return SQLITE_NOMEM; + } + } else { + /* pLock and pOpen are only used for posix advisory locking */ + pNew->pLock = NULL; + pNew->pOpen = NULL; + } + pNew->dirfd = -1; + pNew->h = h; + SET_THREADID(pNew); + pNew = sqlite3_malloc( sizeof(unixFile) ); + if( pNew==0 ){ + close(h); + enterMutex(); + releaseLockInfo(pNew->pLock); + releaseOpenCnt(pNew->pOpen); + leaveMutex(); + return SQLITE_NOMEM; + }else{ + switch(lockingStyle) { + case afpLockingStyle: { + /* afp locking uses the file path so it needs to be included in + ** the afpLockingContext */ + int nFilename; + pNew->pMethod = &sqlite3AFPLockingUnixIoMethod; + pNew->lockingContext = + sqlite3_malloc(sizeof(afpLockingContext)); + nFilename = strlen(zFilename)+1; + ((afpLockingContext *)pNew->lockingContext)->filePath = + sqlite3_malloc(nFilename); + memcpy(((afpLockingContext *)pNew->lockingContext)->filePath, + zFilename, nFilename); + srandomdev(); + break; + } + case flockLockingStyle: + /* flock locking doesn't need additional lockingContext information */ + pNew->pMethod = &sqlite3FlockLockingUnixIoMethod; + break; + case dotlockLockingStyle: { + /* dotlock locking uses the file path so it needs to be included in + ** the dotlockLockingContext */ + int nFilename; + pNew->pMethod = &sqlite3DotlockLockingUnixIoMethod; + pNew->lockingContext = sqlite3_malloc( + sizeof(dotlockLockingContext)); + nFilename = strlen(zFilename) + 6; + ((dotlockLockingContext *)pNew->lockingContext)->lockPath = + sqlite3_malloc( nFilename ); + sqlite3_snprintf(nFilename, + ((dotlockLockingContext *)pNew->lockingContext)->lockPath, + "%s.lock", zFilename); + break; + } + case posixLockingStyle: + /* posix locking doesn't need additional lockingContext information */ + pNew->pMethod = &sqlite3UnixIoMethod; + break; + case noLockingStyle: + case unsupportedLockingStyle: + default: + pNew->pMethod = &sqlite3NolockLockingUnixIoMethod; + } + OpenCounter(+1); + return SQLITE_OK; + } +} +#else /* SQLITE_ENABLE_LOCKING_STYLE */ +static int fillInUnixFile( + int h, /* Open file descriptor on file being opened */ + int dirfd, + sqlite3_file *pId, /* Write to the unixFile structure here */ + const char *zFilename /* Name of the file being opened */ +){ + unixFile *pNew = (unixFile *)pId; + int rc; + +#ifdef FD_CLOEXEC + fcntl(h, F_SETFD, fcntl(h, F_GETFD, 0) | FD_CLOEXEC); +#endif + + enterMutex(); + rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen); + leaveMutex(); + if( rc ){ + close(h); + return SQLITE_NOMEM; + } + + OSTRACE3("OPEN %-3d %s\n", h, zFilename); + pNew->dirfd = -1; + pNew->h = h; + pNew->dirfd = dirfd; + SET_THREADID(pNew); + + pNew->pMethod = &sqlite3UnixIoMethod; + OpenCounter(+1); + return SQLITE_OK; +} +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Open a file descriptor to the directory containing file zFilename. +** If successful, *pFd is set to the opened file descriptor and +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined +** value. +** +** If SQLITE_OK is returned, the caller is responsible for closing +** the file descriptor *pFd using close(). +*/ +static int openDirectory(const char *zFilename, int *pFd){ + int ii; + int fd = -1; + char zDirname[MAX_PATHNAME+1]; + + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); + for(ii=strlen(zDirname); ii>=0 && zDirname[ii]!='/'; ii--); + if( ii>0 ){ + zDirname[ii] = '\0'; + fd = open(zDirname, O_RDONLY|O_BINARY, 0); + if( fd>=0 ){ +#ifdef FD_CLOEXEC + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC); +#endif + OSTRACE3("OPENDIR %-3d %s\n", fd, zDirname); + } + } + *pFd = fd; + return (fd>=0?SQLITE_OK:SQLITE_CANTOPEN); +} + +/* +** Open the file zPath. +** +** Previously, the SQLite OS layer used three functions in place of this +** one: +** +** sqlite3OsOpenReadWrite(); +** sqlite3OsOpenReadOnly(); +** sqlite3OsOpenExclusive(); +** +** These calls correspond to the following combinations of flags: +** +** ReadWrite() -> (READWRITE | CREATE) +** ReadOnly() -> (READONLY) +** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) +** +** The old OpenExclusive() accepted a boolean argument - "delFlag". If +** true, the file was configured to be automatically deleted when the +** file handle closed. To achieve the same effect using this new +** interface, add the DELETEONCLOSE flag to those specified above for +** OpenExclusive(). +*/ +static int unixOpen( + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + int fd = 0; /* File descriptor returned by open() */ + int dirfd = -1; /* Directory file descriptor */ + int oflags = 0; /* Flags to pass to open() */ + int eType = flags&0xFFFFFF00; /* Type of file to open */ + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); + + /* If creating a master or main-file journal, this function will open + ** a file-descriptor on the directory too. The first time unixSync() + ** is called the directory file descriptor will be fsync()ed and close()d. + */ + int isOpenDirectory = (isCreate && + (eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL) + ); + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + + /* The main DB, main journal, and master journal are never automatically + ** deleted + */ + assert( eType!=SQLITE_OPEN_MAIN_DB || !isDelete ); + assert( eType!=SQLITE_OPEN_MAIN_JOURNAL || !isDelete ); + assert( eType!=SQLITE_OPEN_MASTER_JOURNAL || !isDelete ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB + ); + + if( isReadonly ) oflags |= O_RDONLY; + if( isReadWrite ) oflags |= O_RDWR; + if( isCreate ) oflags |= O_CREAT; + if( isExclusive ) oflags |= (O_EXCL|O_NOFOLLOW); + oflags |= (O_LARGEFILE|O_BINARY); + + memset(pFile, 0, sizeof(unixFile)); + fd = open(zPath, oflags, isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS); + if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){ + /* Failed to open the file for read/write access. Try read-only. */ + flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + flags |= SQLITE_OPEN_READONLY; + return unixOpen(pVfs, zPath, pFile, flags, pOutFlags); + } + if( fd<0 ){ + return SQLITE_CANTOPEN; + } + if( isDelete ){ + unlink(zPath); + } + if( pOutFlags ){ + *pOutFlags = flags; + } + + assert(fd!=0); + if( isOpenDirectory ){ + int rc = openDirectory(zPath, &dirfd); + if( rc!=SQLITE_OK ){ + close(fd); + return rc; + } + } + return fillInUnixFile(fd, dirfd, pFile, zPath); +} + +/* +** Delete the file at zPath. If the dirSync argument is true, fsync() +** the directory after deleting the file. +*/ +static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + int rc = SQLITE_OK; + SimulateIOError(return SQLITE_IOERR_DELETE); + unlink(zPath); + if( dirSync ){ + int fd; + rc = openDirectory(zPath, &fd); + if( rc==SQLITE_OK ){ + if( fsync(fd) ){ + rc = SQLITE_IOERR_DIR_FSYNC; + } + close(fd); + } + } + return rc; +} + +/* +** Test the existance of or access permissions of file zPath. The +** test performed depends on the value of flags: +** +** SQLITE_ACCESS_EXISTS: Return 1 if the file exists +** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. +** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. +** +** Otherwise return 0. +*/ +static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){ + int amode = 0; + switch( flags ){ + case SQLITE_ACCESS_EXISTS: + amode = F_OK; + break; + case SQLITE_ACCESS_READWRITE: + amode = W_OK|R_OK; + break; + case SQLITE_ACCESS_READ: + amode = R_OK; + break; + + default: + assert(!"Invalid flags argument"); + } + return (access(zPath, amode)==0); +} + +/* +** Create a temporary file name in zBuf. zBuf must be allocated +** by the calling process and must be big enough to hold at least +** pVfs->mxPathname bytes. +*/ +static int unixGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + static const char *azDirs[] = { + 0, + "/var/tmp", + "/usr/tmp", + "/tmp", + ".", + }; + static const unsigned char zChars[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; + int i, j; + struct stat buf; + const char *zDir = "."; + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. + */ + SimulateIOError( return SQLITE_ERROR ); + + azDirs[0] = sqlite3_temp_directory; + for(i=0; imxPathname==MAX_PATHNAME ); + assert( nBuf>=MAX_PATHNAME ); + sqlite3_snprintf(MAX_PATHNAME-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); + j = strlen(zBuf); + sqlite3Randomness(15, &zBuf[j]); + for(i=0; i<15; i++, j++){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + }while( access(zBuf,0)==0 ); + return SQLITE_OK; +} + + +/* +** Turn a relative pathname into a full pathname. The relative path +** is stored as a nul-terminated string in the buffer pointed to by +** zPath. +** +** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes +** (in this case, MAX_PATHNAME bytes). The full-path is written to +** this buffer before returning. +*/ +static int unixFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zPath, /* Possibly relative input path */ + int nOut, /* Size of output buffer in bytes */ + char *zOut /* Output buffer */ +){ + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directly has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + + assert( pVfs->mxPathname==MAX_PATHNAME ); + zOut[MAX_PATHNAME-1] = '\0'; + if( zPath[0]=='/' ){ + sqlite3_snprintf(MAX_PATHNAME, zOut, "%s", zPath); + }else{ + int nCwd; + if( getcwd(zOut, MAX_PATHNAME-1)==0 ){ + return SQLITE_CANTOPEN; + } + nCwd = strlen(zOut); + sqlite3_snprintf(MAX_PATHNAME-nCwd, &zOut[nCwd], "/%s", zPath); + } + return SQLITE_OK; + +#if 0 + /* + ** Remove "/./" path elements and convert "/A/./" path elements + ** to just "/". + */ + if( zFull ){ + int i, j; + for(i=j=0; zFull[i]; i++){ + if( zFull[i]=='/' ){ + if( zFull[i+1]=='/' ) continue; + if( zFull[i+1]=='.' && zFull[i+2]=='/' ){ + i += 1; + continue; + } + if( zFull[i+1]=='.' && zFull[i+2]=='.' && zFull[i+3]=='/' ){ + while( j>0 && zFull[j-1]!='/' ){ j--; } + i += 3; + continue; + } + } + zFull[j++] = zFull[i]; + } + zFull[j] = 0; + } +#endif +} + + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +#include +static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ + return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); +} + +/* +** SQLite calls this function immediately after a call to unixDlSym() or +** unixDlOpen() fails (returns a null pointer). If a more detailed error +** message is available, it is written to zBufOut. If no error message +** is available, zBufOut is left unmodified and SQLite uses a default +** error message. +*/ +static void unixDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ + char *zErr; + enterMutex(); + zErr = dlerror(); + if( zErr ){ + sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); + } + leaveMutex(); +} +static void *unixDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ + return dlsym(pHandle, zSymbol); +} +static void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){ + dlclose(pHandle); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define unixDlOpen 0 + #define unixDlError 0 + #define unixDlSym 0 + #define unixDlClose 0 +#endif + +/* +** Write nBuf bytes of random data to the supplied buffer zBuf. +*/ +static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + + assert(nBuf>=(sizeof(time_t)+sizeof(int))); + + /* We have to initialize zBuf to prevent valgrind from reporting + ** errors. The reports issued by valgrind are incorrect - we would + ** prefer that the randomness be increased by making use of the + ** uninitialized space in zBuf - but valgrind errors tend to worry + ** some users. Rather than argue, it seems easier just to initialize + ** the whole array and silence valgrind, even if that means less randomness + ** in the random seed. + ** + ** When testing, initializing zBuf[] to zero is all we do. That means + ** that we always use the same random number sequence. This makes the + ** tests repeatable. + */ + memset(zBuf, 0, nBuf); +#if !defined(SQLITE_TEST) + { + int pid, fd; + fd = open("/dev/urandom", O_RDONLY); + if( fd<0 ){ + time_t t; + time(&t); + memcpy(zBuf, &t, sizeof(t)); + pid = getpid(); + memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid)); + }else{ + read(fd, zBuf, nBuf); + close(fd); + } + } +#endif + return SQLITE_OK; +} + + +/* +** Sleep for a little while. Return the amount of time slept. +** The argument is the number of microseconds we want to sleep. +** The return value is the number of microseconds of sleep actually +** requested from the underlying operating system, a number which +** might be greater than or equal to the argument, but not less +** than the argument. +*/ +static int unixSleep(sqlite3_vfs *pVfs, int microseconds){ +#if defined(HAVE_USLEEP) && HAVE_USLEEP + usleep(microseconds); + return microseconds; +#else + int seconds = (microseconds+999999)/1000000; + sleep(seconds); + return seconds*1000000; +#endif +} + +/* +** The following variable, if set to a non-zero value, becomes the result +** returned from sqlite3OsCurrentTime(). This is used for testing. +*/ +#ifdef SQLITE_TEST +int sqlite3_current_time = 0; +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int unixCurrentTime(sqlite3_vfs *pVfs, double *prNow){ +#ifdef NO_GETTOD + time_t t; + time(&t); + *prNow = t/86400.0 + 2440587.5; +#else + struct timeval sNow; + gettimeofday(&sNow, 0); + *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0; +#endif +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *prNow = sqlite3_current_time/86400.0 + 2440587.5; + } +#endif + return 0; +} + +/* +** Return a pointer to the sqlite3DefaultVfs structure. We use +** a function rather than give the structure global scope because +** some compilers (MSVC) do not allow forward declarations of +** initialized structures. +*/ +sqlite3_vfs *sqlite3OsDefaultVfs(void){ + static sqlite3_vfs unixVfs = { + 1, /* iVersion */ + sizeof(unixFile), /* szOsFile */ + MAX_PATHNAME, /* mxPathname */ + 0, /* pNext */ + "unix", /* zName */ + 0, /* pAppData */ + + unixOpen, /* xOpen */ + unixDelete, /* xDelete */ + unixAccess, /* xAccess */ + unixGetTempname, /* xGetTempName */ + unixFullPathname, /* xFullPathname */ + unixDlOpen, /* xDlOpen */ + unixDlError, /* xDlError */ + unixDlSym, /* xDlSym */ + unixDlClose, /* xDlClose */ + unixRandomness, /* xRandomness */ + unixSleep, /* xSleep */ + unixCurrentTime /* xCurrentTime */ + }; + + return &unixVfs; +} + +#endif /* OS_UNIX */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c new file mode 100644 index 0000000000..bcb1c6ec2c --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c @@ -0,0 +1,1545 @@ +/* +** 2004 May 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains code that is specific to windows. +*/ +#include "sqliteInt.h" +#if OS_WIN /* This file is used for windows only */ + + +/* +** A Note About Memory Allocation: +** +** This driver uses malloc()/free() directly rather than going through +** the SQLite-wrappers sqlite3_malloc()/sqlite3_free(). Those wrappers +** are designed for use on embedded systems where memory is scarce and +** malloc failures happen frequently. Win32 does not typically run on +** embedded systems, and when it does the developers normally have bigger +** problems to worry about than running out of memory. So there is not +** a compelling need to use the wrappers. +** +** But there is a good reason to not use the wrappers. If we use the +** wrappers then we will get simulated malloc() failures within this +** driver. And that causes all kinds of problems for our tests. We +** could enhance SQLite to deal with simulated malloc failures within +** the OS driver, but the code to deal with those failure would not +** be exercised on Linux (which does not need to malloc() in the driver) +** and so we would have difficulty writing coverage tests for that +** code. Better to leave the code out, we think. +** +** The point of this discussion is as follows: When creating a new +** OS layer for an embedded system, if you use this file as an example, +** avoid the use of malloc()/free(). Those routines work ok on windows +** desktops but not so well in embedded systems. +*/ + +#include + +#ifdef __CYGWIN__ +# include +#endif + +/* +** Macros used to determine whether or not to use threads. +*/ +#if defined(THREADSAFE) && THREADSAFE +# define SQLITE_W32_THREADS 1 +#endif + +/* +** Include code that is common to all os_*.c files +*/ +#include "os_common.h" + +/* +** Determine if we are dealing with WindowsCE - which has a much +** reduced API. +*/ +#if defined(_WIN32_WCE) +# define OS_WINCE 1 +# define AreFileApisANSI() 1 +#else +# define OS_WINCE 0 +#endif + +/* +** WinCE lacks native support for file locking so we have to fake it +** with some code of our own. +*/ +#if OS_WINCE +typedef struct winceLock { + int nReaders; /* Number of reader locks obtained */ + BOOL bPending; /* Indicates a pending lock has been obtained */ + BOOL bReserved; /* Indicates a reserved lock has been obtained */ + BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ +} winceLock; +#endif + +/* +** The winFile structure is a subclass of sqlite3_file* specific to the win32 +** portability layer. +*/ +typedef struct winFile winFile; +struct winFile { + const sqlite3_io_methods *pMethod;/* Must be first */ + HANDLE h; /* Handle for accessing the file */ + unsigned char locktype; /* Type of lock currently held on this file */ + short sharedLockByte; /* Randomly chosen byte used as a shared lock */ +#if OS_WINCE + WCHAR *zDeleteOnClose; /* Name of file to delete when closing */ + HANDLE hMutex; /* Mutex used to control access to shared lock */ + HANDLE hShared; /* Shared memory segment used for locking */ + winceLock local; /* Locks obtained by this instance of winFile */ + winceLock *shared; /* Global shared lock memory for the file */ +#endif +}; + + +/* +** The following variable is (normally) set once and never changes +** thereafter. It records whether the operating system is Win95 +** or WinNT. +** +** 0: Operating system unknown. +** 1: Operating system is Win95. +** 2: Operating system is WinNT. +** +** In order to facilitate testing on a WinNT system, the test fixture +** can manually set this value to 1 to emulate Win98 behavior. +*/ +#ifdef SQLITE_TEST +int sqlite3_os_type = 0; +#else +static int sqlite3_os_type = 0; +#endif + +/* +** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, +** or WinCE. Return false (zero) for Win95, Win98, or WinME. +** +** Here is an interesting observation: Win95, Win98, and WinME lack +** the LockFileEx() API. But we can still statically link against that +** API as long as we don't call it win running Win95/98/ME. A call to +** this routine is used to determine if the host is Win95/98/ME or +** WinNT/2K/XP so that we will know whether or not we can safely call +** the LockFileEx() API. +*/ +#if OS_WINCE +# define isNT() (1) +#else + static int isNT(void){ + if( sqlite3_os_type==0 ){ + OSVERSIONINFO sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + GetVersionEx(&sInfo); + sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; + } + return sqlite3_os_type==2; + } +#endif /* OS_WINCE */ + +/* +** Convert a UTF-8 string to microsoft unicode (UTF-16?). +** +** Space to hold the returned string is obtained from malloc. +*/ +static WCHAR *utf8ToUnicode(const char *zFilename){ + int nChar; + WCHAR *zWideFilename; + + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); + zWideFilename = malloc( nChar*sizeof(zWideFilename[0]) ); + if( zWideFilename==0 ){ + return 0; + } + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar); + if( nChar==0 ){ + free(zWideFilename); + zWideFilename = 0; + } + return zWideFilename; +} + +/* +** Convert microsoft unicode to UTF-8. Space to hold the returned string is +** obtained from malloc(). +*/ +static char *unicodeToUtf8(const WCHAR *zWideFilename){ + int nByte; + char *zFilename; + + nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); + zFilename = malloc( nByte ); + if( zFilename==0 ){ + return 0; + } + nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, + 0, 0); + if( nByte == 0 ){ + free(zFilename); + zFilename = 0; + } + return zFilename; +} + +/* +** Convert an ansi string to microsoft unicode, based on the +** current codepage settings for file apis. +** +** Space to hold the returned string is obtained +** from malloc. +*/ +static WCHAR *mbcsToUnicode(const char *zFilename){ + int nByte; + WCHAR *zMbcsFilename; + int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; + + nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); + zMbcsFilename = malloc( nByte*sizeof(zMbcsFilename[0]) ); + if( zMbcsFilename==0 ){ + return 0; + } + nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); + if( nByte==0 ){ + free(zMbcsFilename); + zMbcsFilename = 0; + } + return zMbcsFilename; +} + +/* +** Convert microsoft unicode to multibyte character string, based on the +** user's Ansi codepage. +** +** Space to hold the returned string is obtained from +** malloc(). +*/ +static char *unicodeToMbcs(const WCHAR *zWideFilename){ + int nByte; + char *zFilename; + int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; + + nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); + zFilename = malloc( nByte ); + if( zFilename==0 ){ + return 0; + } + nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte, + 0, 0); + if( nByte == 0 ){ + free(zFilename); + zFilename = 0; + } + return zFilename; +} + +/* +** Convert multibyte character string to UTF-8. Space to hold the +** returned string is obtained from malloc(). +*/ +static char *mbcsToUtf8(const char *zFilename){ + char *zFilenameUtf8; + WCHAR *zTmpWide; + + zTmpWide = mbcsToUnicode(zFilename); + if( zTmpWide==0 ){ + return 0; + } + zFilenameUtf8 = unicodeToUtf8(zTmpWide); + free(zTmpWide); + return zFilenameUtf8; +} + +/* +** Convert UTF-8 to multibyte character string. Space to hold the +** returned string is obtained from malloc(). +*/ +static char *utf8ToMbcs(const char *zFilename){ + char *zFilenameMbcs; + WCHAR *zTmpWide; + + zTmpWide = utf8ToUnicode(zFilename); + if( zTmpWide==0 ){ + return 0; + } + zFilenameMbcs = unicodeToMbcs(zTmpWide); + free(zTmpWide); + return zFilenameMbcs; +} + +#if OS_WINCE +/************************************************************************* +** This section contains code for WinCE only. +*/ +/* +** WindowsCE does not have a localtime() function. So create a +** substitute. +*/ +#include +struct tm *__cdecl localtime(const time_t *t) +{ + static struct tm y; + FILETIME uTm, lTm; + SYSTEMTIME pTm; + sqlite3_int64 t64; + t64 = *t; + t64 = (t64 + 11644473600)*10000000; + uTm.dwLowDateTime = t64 & 0xFFFFFFFF; + uTm.dwHighDateTime= t64 >> 32; + FileTimeToLocalFileTime(&uTm,&lTm); + FileTimeToSystemTime(&lTm,&pTm); + y.tm_year = pTm.wYear - 1900; + y.tm_mon = pTm.wMonth - 1; + y.tm_wday = pTm.wDayOfWeek; + y.tm_mday = pTm.wDay; + y.tm_hour = pTm.wHour; + y.tm_min = pTm.wMinute; + y.tm_sec = pTm.wSecond; + return &y; +} + +/* This will never be called, but defined to make the code compile */ +#define GetTempPathA(a,b) + +#define LockFile(a,b,c,d,e) winceLockFile(&a, b, c, d, e) +#define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e) +#define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f) + +#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-offsetof(winFile,h)] + +/* +** Acquire a lock on the handle h +*/ +static void winceMutexAcquire(HANDLE h){ + DWORD dwErr; + do { + dwErr = WaitForSingleObject(h, INFINITE); + } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); +} +/* +** Release a lock acquired by winceMutexAcquire() +*/ +#define winceMutexRelease(h) ReleaseMutex(h) + +/* +** Create the mutex and shared memory used for locking in the file +** descriptor pFile +*/ +static BOOL winceCreateLock(const char *zFilename, winFile *pFile){ + WCHAR *zTok; + WCHAR *zName = utf8ToUnicode(zFilename); + BOOL bInit = TRUE; + + /* Initialize the local lockdata */ + ZeroMemory(&pFile->local, sizeof(pFile->local)); + + /* Replace the backslashes from the filename and lowercase it + ** to derive a mutex name. */ + zTok = CharLowerW(zName); + for (;*zTok;zTok++){ + if (*zTok == '\\') *zTok = '_'; + } + + /* Create/open the named mutex */ + pFile->hMutex = CreateMutexW(NULL, FALSE, zName); + if (!pFile->hMutex){ + free(zName); + return FALSE; + } + + /* Acquire the mutex before continuing */ + winceMutexAcquire(pFile->hMutex); + + /* Since the names of named mutexes, semaphores, file mappings etc are + ** case-sensitive, take advantage of that by uppercasing the mutex name + ** and using that as the shared filemapping name. + */ + CharUpperW(zName); + pFile->hShared = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(winceLock), + zName); + + /* Set a flag that indicates we're the first to create the memory so it + ** must be zero-initialized */ + if (GetLastError() == ERROR_ALREADY_EXISTS){ + bInit = FALSE; + } + + free(zName); + + /* If we succeeded in making the shared memory handle, map it. */ + if (pFile->hShared){ + pFile->shared = (winceLock*)MapViewOfFile(pFile->hShared, + FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); + /* If mapping failed, close the shared memory handle and erase it */ + if (!pFile->shared){ + CloseHandle(pFile->hShared); + pFile->hShared = NULL; + } + } + + /* If shared memory could not be created, then close the mutex and fail */ + if (pFile->hShared == NULL){ + winceMutexRelease(pFile->hMutex); + CloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + return FALSE; + } + + /* Initialize the shared memory if we're supposed to */ + if (bInit) { + ZeroMemory(pFile->shared, sizeof(winceLock)); + } + + winceMutexRelease(pFile->hMutex); + return TRUE; +} + +/* +** Destroy the part of winFile that deals with wince locks +*/ +static void winceDestroyLock(winFile *pFile){ + if (pFile->hMutex){ + /* Acquire the mutex */ + winceMutexAcquire(pFile->hMutex); + + /* The following blocks should probably assert in debug mode, but they + are to cleanup in case any locks remained open */ + if (pFile->local.nReaders){ + pFile->shared->nReaders --; + } + if (pFile->local.bReserved){ + pFile->shared->bReserved = FALSE; + } + if (pFile->local.bPending){ + pFile->shared->bPending = FALSE; + } + if (pFile->local.bExclusive){ + pFile->shared->bExclusive = FALSE; + } + + /* De-reference and close our copy of the shared memory handle */ + UnmapViewOfFile(pFile->shared); + CloseHandle(pFile->hShared); + + if( pFile->zDeleteOnClose ){ + DeleteFileW(pFile->zDeleteOnClose); + free(pFile->zDeleteOnClose); + pFile->zDeleteOnClose = 0; + } + + /* Done with the mutex */ + winceMutexRelease(pFile->hMutex); + CloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + } +} + +/* +** An implementation of the LockFile() API of windows for wince +*/ +static BOOL winceLockFile( + HANDLE *phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Wanting an exclusive lock? */ + if (dwFileOffsetLow == SHARED_FIRST + && nNumberOfBytesToLockLow == SHARED_SIZE){ + if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ + pFile->shared->bExclusive = TRUE; + pFile->local.bExclusive = TRUE; + bReturn = TRUE; + } + } + + /* Want a read-only lock? */ + else if ((dwFileOffsetLow >= SHARED_FIRST && + dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE) && + nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bExclusive == 0){ + pFile->local.nReaders ++; + if (pFile->local.nReaders == 1){ + pFile->shared->nReaders ++; + } + bReturn = TRUE; + } + } + + /* Want a pending lock? */ + else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToLockLow == 1){ + /* If no pending lock has been acquired, then acquire it */ + if (pFile->shared->bPending == 0) { + pFile->shared->bPending = TRUE; + pFile->local.bPending = TRUE; + bReturn = TRUE; + } + } + /* Want a reserved lock? */ + else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bReserved == 0) { + pFile->shared->bReserved = TRUE; + pFile->local.bReserved = TRUE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} + +/* +** An implementation of the UnlockFile API of windows for wince +*/ +static BOOL winceUnlockFile( + HANDLE *phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToUnlockLow, + DWORD nNumberOfBytesToUnlockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Releasing a reader lock or an exclusive lock */ + if (dwFileOffsetLow >= SHARED_FIRST && + dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE){ + /* Did we have an exclusive lock? */ + if (pFile->local.bExclusive){ + pFile->local.bExclusive = FALSE; + pFile->shared->bExclusive = FALSE; + bReturn = TRUE; + } + + /* Did we just have a reader lock? */ + else if (pFile->local.nReaders){ + pFile->local.nReaders --; + if (pFile->local.nReaders == 0) + { + pFile->shared->nReaders --; + } + bReturn = TRUE; + } + } + + /* Releasing a pending lock */ + else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bPending){ + pFile->local.bPending = FALSE; + pFile->shared->bPending = FALSE; + bReturn = TRUE; + } + } + /* Releasing a reserved lock */ + else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bReserved) { + pFile->local.bReserved = FALSE; + pFile->shared->bReserved = FALSE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} + +/* +** An implementation of the LockFileEx() API of windows for wince +*/ +static BOOL winceLockFileEx( + HANDLE *phFile, + DWORD dwFlags, + DWORD dwReserved, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh, + LPOVERLAPPED lpOverlapped +){ + /* If the caller wants a shared read lock, forward this call + ** to winceLockFile */ + if (lpOverlapped->Offset == SHARED_FIRST && + dwFlags == 1 && + nNumberOfBytesToLockLow == SHARED_SIZE){ + return winceLockFile(phFile, SHARED_FIRST, 0, 1, 0); + } + return FALSE; +} +/* +** End of the special code for wince +*****************************************************************************/ +#endif /* OS_WINCE */ + +/***************************************************************************** +** The next group of routines implement the I/O methods specified +** by the sqlite3_io_methods object. +******************************************************************************/ + +/* +** Close a file. +** +** It is reported that an attempt to close a handle might sometimes +** fail. This is a very unreasonable result, but windows is notorious +** for being unreasonable so I do not doubt that it might happen. If +** the close fails, we pause for 100 milliseconds and try again. As +** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before +** giving up and returning an error. +*/ +#define MX_CLOSE_ATTEMPT 3 +static int winClose(sqlite3_file *id){ + int rc, cnt = 0; + winFile *pFile = (winFile*)id; + OSTRACE2("CLOSE %d\n", pFile->h); + do{ + rc = CloseHandle(pFile->h); + }while( rc==0 && cnt++ < MX_CLOSE_ATTEMPT && (Sleep(100), 1) ); +#if OS_WINCE + winceDestroyLock(pFile); +#endif + OpenCounter(-1); + return rc ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Some microsoft compilers lack this definition. +*/ +#ifndef INVALID_SET_FILE_POINTER +# define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int winRead( + sqlite3_file *id, /* File to read from */ + void *pBuf, /* Write content into this buffer */ + int amt, /* Number of bytes to read */ + sqlite3_int64 offset /* Begin reading at this offset */ +){ + LONG upperBits = (offset>>32) & 0x7fffffff; + LONG lowerBits = offset & 0xffffffff; + DWORD rc; + DWORD got; + winFile *pFile = (winFile*)id; + assert( id!=0 ); + SimulateIOError(return SQLITE_IOERR_READ); + OSTRACE3("READ %d lock=%d\n", pFile->h, pFile->locktype); + rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){ + return SQLITE_FULL; + } + if( !ReadFile(pFile->h, pBuf, amt, &got, 0) ){ + return SQLITE_IOERR_READ; + } + if( got==(DWORD)amt ){ + return SQLITE_OK; + }else{ + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int winWrite( + sqlite3_file *id, /* File to write into */ + const void *pBuf, /* The bytes to be written */ + int amt, /* Number of bytes to write */ + sqlite3_int64 offset /* Offset into the file to begin writing at */ +){ + LONG upperBits = (offset>>32) & 0x7fffffff; + LONG lowerBits = offset & 0xffffffff; + DWORD rc; + DWORD wrote; + winFile *pFile = (winFile*)id; + assert( id!=0 ); + SimulateIOError(return SQLITE_IOERR_WRITE); + SimulateDiskfullError(return SQLITE_FULL); + OSTRACE3("WRITE %d lock=%d\n", pFile->h, pFile->locktype); + rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){ + return SQLITE_FULL; + } + assert( amt>0 ); + while( + amt>0 + && (rc = WriteFile(pFile->h, pBuf, amt, &wrote, 0))!=0 + && wrote>0 + ){ + amt -= wrote; + pBuf = &((char*)pBuf)[wrote]; + } + if( !rc || amt>(int)wrote ){ + return SQLITE_FULL; + } + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ + LONG upperBits = (nByte>>32) & 0x7fffffff; + LONG lowerBits = nByte & 0xffffffff; + winFile *pFile = (winFile*)id; + OSTRACE3("TRUNCATE %d %lld\n", pFile->h, nByte); + SimulateIOError(return SQLITE_IOERR_TRUNCATE); + SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + SetEndOfFile(pFile->h); + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occuring at the right times. +*/ +int sqlite3_sync_count = 0; +int sqlite3_fullsync_count = 0; +#endif + +/* +** Make sure all writes to a particular file are committed to disk. +*/ +static int winSync(sqlite3_file *id, int flags){ + winFile *pFile = (winFile*)id; + OSTRACE3("SYNC %d lock=%d\n", pFile->h, pFile->locktype); +#ifdef SQLITE_TEST + if( flags & SQLITE_SYNC_FULL ){ + sqlite3_fullsync_count++; + } + sqlite3_sync_count++; +#endif + if( FlushFileBuffers(pFile->h) ){ + return SQLITE_OK; + }else{ + return SQLITE_IOERR; + } +} + +/* +** Determine the current size of a file in bytes +*/ +static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ + winFile *pFile = (winFile*)id; + DWORD upperBits, lowerBits; + SimulateIOError(return SQLITE_IOERR_FSTAT); + lowerBits = GetFileSize(pFile->h, &upperBits); + *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; + return SQLITE_OK; +} + +/* +** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. +*/ +#ifndef LOCKFILE_FAIL_IMMEDIATELY +# define LOCKFILE_FAIL_IMMEDIATELY 1 +#endif + +/* +** Acquire a reader lock. +** Different API routines are called depending on whether or not this +** is Win95 or WinNT. +*/ +static int getReadLock(winFile *pFile){ + int res; + if( isNT() ){ + OVERLAPPED ovlp; + ovlp.Offset = SHARED_FIRST; + ovlp.OffsetHigh = 0; + ovlp.hEvent = 0; + res = LockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY, + 0, SHARED_SIZE, 0, &ovlp); + }else{ + int lk; + sqlite3Randomness(sizeof(lk), &lk); + pFile->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1); + res = LockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } + return res; +} + +/* +** Undo a readlock +*/ +static int unlockReadLock(winFile *pFile){ + int res; + if( isNT() ){ + res = UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + }else{ + res = UnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); + } + return res; +} + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. The winUnlock() routine +** erases all locks at once and returns us immediately to locking level 0. +** It is not possible to lower the locking level one step at a time. You +** must go straight to locking level 0. +*/ +static int winLock(sqlite3_file *id, int locktype){ + int rc = SQLITE_OK; /* Return code from subroutines */ + int res = 1; /* Result of a windows lock call */ + int newLocktype; /* Set pFile->locktype to this value before exiting */ + int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ + winFile *pFile = (winFile*)id; + + assert( pFile!=0 ); + OSTRACE5("LOCK %d %d was %d(%d)\n", + pFile->h, locktype, pFile->locktype, pFile->sharedLockByte); + + /* If there is already a lock of this type or more restrictive on the + ** OsFile, do nothing. Don't use the end_lock: exit path, as + ** sqlite3OsEnterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or + ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of + ** the PENDING_LOCK byte is temporary. + */ + newLocktype = pFile->locktype; + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype==RESERVED_LOCK) + ){ + int cnt = 3; + while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){ + /* Try 3 times to get the pending lock. The pending lock might be + ** held by another reader process who will release it momentarily. + */ + OSTRACE2("could not get a PENDING lock. cnt=%d\n", cnt); + Sleep(1); + } + gotPendingLock = res; + } + + /* Acquire a shared lock + */ + if( locktype==SHARED_LOCK && res ){ + assert( pFile->locktype==NO_LOCK ); + res = getReadLock(pFile); + if( res ){ + newLocktype = SHARED_LOCK; + } + } + + /* Acquire a RESERVED lock + */ + if( locktype==RESERVED_LOCK && res ){ + assert( pFile->locktype==SHARED_LOCK ); + res = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); + if( res ){ + newLocktype = RESERVED_LOCK; + } + } + + /* Acquire a PENDING lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + newLocktype = PENDING_LOCK; + gotPendingLock = 0; + } + + /* Acquire an EXCLUSIVE lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + assert( pFile->locktype>=SHARED_LOCK ); + res = unlockReadLock(pFile); + OSTRACE2("unreadlock = %d\n", res); + res = LockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + if( res ){ + newLocktype = EXCLUSIVE_LOCK; + }else{ + OSTRACE2("error-code = %d\n", GetLastError()); + getReadLock(pFile); + } + } + + /* If we are holding a PENDING lock that ought to be released, then + ** release it now. + */ + if( gotPendingLock && locktype==SHARED_LOCK ){ + UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); + } + + /* Update the state of the lock has held in the file descriptor then + ** return the appropriate result code. + */ + if( res ){ + rc = SQLITE_OK; + }else{ + OSTRACE4("LOCK FAILED %d trying for %d but got %d\n", pFile->h, + locktype, newLocktype); + rc = SQLITE_BUSY; + } + pFile->locktype = newLocktype; + return rc; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero, otherwise zero. +*/ +static int winCheckReservedLock(sqlite3_file *id){ + int rc; + winFile *pFile = (winFile*)id; + assert( pFile!=0 ); + if( pFile->locktype>=RESERVED_LOCK ){ + rc = 1; + OSTRACE3("TEST WR-LOCK %d %d (local)\n", pFile->h, rc); + }else{ + rc = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); + if( rc ){ + UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); + } + rc = !rc; + OSTRACE3("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc); + } + return rc; +} + +/* +** Lower the locking level on file descriptor id to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** It is not possible for this routine to fail if the second argument +** is NO_LOCK. If the second argument is SHARED_LOCK then this routine +** might return SQLITE_IOERR; +*/ +static int winUnlock(sqlite3_file *id, int locktype){ + int type; + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + assert( pFile!=0 ); + assert( locktype<=SHARED_LOCK ); + OSTRACE5("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype, + pFile->locktype, pFile->sharedLockByte); + type = pFile->locktype; + if( type>=EXCLUSIVE_LOCK ){ + UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + if( locktype==SHARED_LOCK && !getReadLock(pFile) ){ + /* This should never happen. We should always be able to + ** reacquire the read lock */ + rc = SQLITE_IOERR_UNLOCK; + } + } + if( type>=RESERVED_LOCK ){ + UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); + } + if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + unlockReadLock(pFile); + } + if( type>=PENDING_LOCK ){ + UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); + } + pFile->locktype = locktype; + return rc; +} + +/* +** Control and query of the open file handle. +*/ +static int winFileControl(sqlite3_file *id, int op, void *pArg){ + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = ((winFile*)id)->locktype; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and it's journal file) that the sector size will be the +** same for both. +*/ +static int winSectorSize(sqlite3_file *id){ + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** Return a vector of device characteristics. +*/ +static int winDeviceCharacteristics(sqlite3_file *id){ + return 0; +} + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32. +*/ +static const sqlite3_io_methods winIoMethod = { + 1, /* iVersion */ + winClose, + winRead, + winWrite, + winTruncate, + winSync, + winFileSize, + winLock, + winUnlock, + winCheckReservedLock, + winFileControl, + winSectorSize, + winDeviceCharacteristics +}; + +/*************************************************************************** +** Here ends the I/O methods that form the sqlite3_io_methods object. +** +** The next block of code implements the VFS methods. +****************************************************************************/ + +/* +** Convert a UTF-8 filename into whatever form the underlying +** operating system wants filenames in. Space to hold the result +** is obtained from malloc and must be freed by the calling +** function. +*/ +static void *convertUtf8Filename(const char *zFilename){ + void *zConverted = 0; + if( isNT() ){ + zConverted = utf8ToUnicode(zFilename); + }else{ + zConverted = utf8ToMbcs(zFilename); + } + /* caller will handle out of memory */ + return zConverted; +} + +/* +** Open a file. +*/ +static int winOpen( + sqlite3_vfs *pVfs, /* Not used */ + const char *zName, /* Name of the file (UTF-8) */ + sqlite3_file *id, /* Write the SQLite file handle here */ + int flags, /* Open mode flags */ + int *pOutFlags /* Status return flags */ +){ + HANDLE h; + DWORD dwDesiredAccess; + DWORD dwShareMode; + DWORD dwCreationDisposition; + DWORD dwFlagsAndAttributes = 0; + winFile *pFile = (winFile*)id; + void *zConverted = convertUtf8Filename(zName); + if( zConverted==0 ){ + return SQLITE_NOMEM; + } + + if( flags & SQLITE_OPEN_READWRITE ){ + dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; + }else{ + dwDesiredAccess = GENERIC_READ; + } + if( flags & SQLITE_OPEN_CREATE ){ + dwCreationDisposition = OPEN_ALWAYS; + }else{ + dwCreationDisposition = OPEN_EXISTING; + } + if( flags & SQLITE_OPEN_MAIN_DB ){ + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + }else{ + dwShareMode = 0; + } + if( flags & (SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TEMP_JOURNAL + | SQLITE_OPEN_SUBJOURNAL) ){ + dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY + | FILE_ATTRIBUTE_HIDDEN + | FILE_FLAG_DELETE_ON_CLOSE; + }else{ + dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; + } + if( flags & (SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB) ){ + dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; + }else{ + dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN; + } + if( isNT() ){ + h = CreateFileW((WCHAR*)zConverted, + dwDesiredAccess, + dwShareMode, + NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL + ); + }else{ +#if OS_WINCE + return SQLITE_NOMEM; +#else + h = CreateFileA((char*)zConverted, + dwDesiredAccess, + dwShareMode, + NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL + ); +#endif + } + if( h==INVALID_HANDLE_VALUE ){ + free(zConverted); + if( flags & SQLITE_OPEN_READWRITE ){ + return winOpen(0, zName, id, + ((flags|SQLITE_OPEN_READONLY)&~SQLITE_OPEN_READWRITE), pOutFlags); + }else{ + return SQLITE_CANTOPEN; + } + } + if( pOutFlags ){ + if( flags & SQLITE_OPEN_READWRITE ){ + *pOutFlags = SQLITE_OPEN_READWRITE; + }else{ + *pOutFlags = SQLITE_OPEN_READONLY; + } + } + memset(pFile, 0, sizeof(*pFile)); + pFile->pMethod = &winIoMethod; + pFile->h = h; +#if OS_WINCE + if( (flags & (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)) == + (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB) + && !winceCreateLock(zFilename, pFile) + ){ + CloseHandle(h); + free(zConverted); + return SQLITE_CANTOPEN; + } + if( dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE ){ + pFile->zDeleteOnClose = zConverted; + }else +#endif + { + free(zConverted); + } + OpenCounter(+1); + return SQLITE_OK; +} + +/* +** Delete the named file. +** +** Note that windows does not allow a file to be deleted if some other +** process has it open. Sometimes a virus scanner or indexing program +** will open a journal file shortly after it is created in order to do +** whatever it is it does. While this other process is holding the +** file open, we will be unable to delete it. To work around this +** problem, we delay 100 milliseconds and try to delete again. Up +** to MX_DELETION_ATTEMPTs deletion attempts are run before giving +** up and returning an error. +*/ +#define MX_DELETION_ATTEMPTS 3 +static int winDelete( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to delete */ + int syncDir /* Not used on win32 */ +){ + int cnt = 0; + int rc; + void *zConverted = convertUtf8Filename(zFilename); + if( zConverted==0 ){ + return SQLITE_NOMEM; + } + SimulateIOError(return SQLITE_IOERR_DELETE); + if( isNT() ){ + do{ + rc = DeleteFileW(zConverted); + }while( rc==0 && GetFileAttributesW(zConverted)!=0xffffffff + && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); + }else{ +#if OS_WINCE + return SQLITE_NOMEM; +#else + do{ + rc = DeleteFileA(zConverted); + }while( rc==0 && GetFileAttributesA(zConverted)!=0xffffffff + && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); +#endif + } + free(zConverted); + OSTRACE2("DELETE \"%s\"\n", zFilename); + return rc!=0 ? SQLITE_OK : SQLITE_IOERR; +} + +/* +** Check the existance and status of a file. +*/ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags /* Type of test to make on this file */ +){ + DWORD attr; + int rc; + void *zConverted = convertUtf8Filename(zFilename); + if( zConverted==0 ){ + return SQLITE_NOMEM; + } + if( isNT() ){ + attr = GetFileAttributesW((WCHAR*)zConverted); + }else{ +#if OS_WINCE + return SQLITE_NOMEM; +#else + attr = GetFileAttributesA((char*)zConverted); +#endif + } + free(zConverted); + switch( flags ){ + case SQLITE_ACCESS_READ: + case SQLITE_ACCESS_EXISTS: + rc = attr!=0xffffffff; + break; + case SQLITE_ACCESS_READWRITE: + rc = (attr & FILE_ATTRIBUTE_READONLY)==0; + break; + default: + assert(!"Invalid flags argument"); + } + return rc; +} + + +/* +** Create a temporary file name in zBuf. zBuf must be big enough to +** hold at pVfs->mxPathname characters. +*/ +static int winGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + static char zChars[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; + int i, j; + char zTempPath[MAX_PATH+1]; + if( sqlite3_temp_directory ){ + sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory); + }else if( isNT() ){ + char *zMulti; + WCHAR zWidePath[MAX_PATH]; + GetTempPathW(MAX_PATH-30, zWidePath); + zMulti = unicodeToUtf8(zWidePath); + if( zMulti ){ + sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti); + free(zMulti); + }else{ + return SQLITE_NOMEM; + } + }else{ + char *zUtf8; + char zMbcsPath[MAX_PATH]; + GetTempPathA(MAX_PATH-30, zMbcsPath); + zUtf8 = mbcsToUtf8(zMbcsPath); + if( zUtf8 ){ + sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8); + free(zUtf8); + }else{ + return SQLITE_NOMEM; + } + } + for(i=strlen(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){} + zTempPath[i] = 0; + sqlite3_snprintf(pVfs->mxPathname-30, zBuf, + "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath); + j = strlen(zBuf); + sqlite3Randomness(20, &zBuf[j]); + for(i=0; i<20; i++, j++){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + OSTRACE2("TEMP FILENAME: %s\n", zBuf); + return SQLITE_OK; +} + +/* +** Turn a relative pathname into a full pathname. Write the full +** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname +** bytes in size. +*/ +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ + +#if defined(__CYGWIN__) + cygwin_conv_to_full_win32_path(zRelative, zFull); + return SQLITE_OK; +#endif + +#if OS_WINCE + /* WinCE has no concept of a relative pathname, or so I am told. */ + sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zRelative); +#endif + +#if !OS_WINCE && !defined(__CYGWIN__) + int nByte; + void *zConverted; + char *zOut; + zConverted = convertUtf8Filename(zRelative); + if( isNT() ){ + WCHAR *zTemp; + nByte = GetFullPathNameW((WCHAR*)zConverted, 0, 0, 0) + 3; + zTemp = malloc( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + free(zConverted); + return SQLITE_NOMEM; + } + GetFullPathNameW((WCHAR*)zConverted, nByte, zTemp, 0); + free(zConverted); + zOut = unicodeToUtf8(zTemp); + free(zTemp); + }else{ + char *zTemp; + nByte = GetFullPathNameA((char*)zConverted, 0, 0, 0) + 3; + zTemp = malloc( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + free(zConverted); + return SQLITE_NOMEM; + } + GetFullPathNameA((char*)zConverted, nByte, zTemp, 0); + free(zConverted); + zOut = mbcsToUtf8(zTemp); + free(zTemp); + } + if( zOut ){ + sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zOut); + free(zOut); + return SQLITE_OK; + }else{ + return SQLITE_NOMEM; + } +#endif +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ + HANDLE h; + void *zConverted = convertUtf8Filename(zFilename); + if( zConverted==0 ){ + return 0; + } + if( isNT() ){ + h = LoadLibraryW((WCHAR*)zConverted); + }else{ +#if OS_WINCE + return 0; +#else + h = LoadLibraryA((char*)zConverted); +#endif + } + free(zConverted); + return (void*)h; +} +static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + 0, + zBufOut, + nBuf-1, + 0 + ); +} +void *winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ +#if OS_WINCE + /* The GetProcAddressA() routine is only available on wince. */ + return GetProcAddressA((HANDLE)pHandle, zSymbol); +#else + /* All other windows platforms expect GetProcAddress() to take + ** an Ansi string regardless of the _UNICODE setting */ + return GetProcAddress((HANDLE)pHandle, zSymbol); +#endif +} +void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ + FreeLibrary((HANDLE)pHandle); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define winDlOpen 0 + #define winDlError 0 + #define winDlSym 0 + #define winDlClose 0 +#endif + + +/* +** Write up to nBuf bytes of randomness into zBuf. +*/ +static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + int n = 0; + if( sizeof(SYSTEMTIME)<=nBuf-n ){ + SYSTEMTIME x; + GetSystemTime(&x); + memcpy(&zBuf[n], &x, sizeof(x)); + n += sizeof(x); + } + if( sizeof(DWORD)<=nBuf-n ){ + DWORD pid = GetCurrentProcessId(); + memcpy(&zBuf[n], &pid, sizeof(pid)); + n += sizeof(pid); + } + if( sizeof(DWORD)<=nBuf-n ){ + DWORD cnt = GetTickCount(); + memcpy(&zBuf[n], &cnt, sizeof(cnt)); + n += sizeof(cnt); + } + if( sizeof(LARGE_INTEGER)<=nBuf-n ){ + LARGE_INTEGER i; + QueryPerformanceCounter(&i); + memcpy(&zBuf[n], &i, sizeof(i)); + n += sizeof(i); + } + return n; +} + + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +static int winSleep(sqlite3_vfs *pVfs, int microsec){ + Sleep((microsec+999)/1000); + return ((microsec+999)/1000)*1000; +} + +/* +** The following variable, if set to a non-zero value, becomes the result +** returned from sqlite3OsCurrentTime(). This is used for testing. +*/ +#ifdef SQLITE_TEST +int sqlite3_current_time = 0; +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ + FILETIME ft; + /* FILETIME structure is a 64-bit value representing the number of + 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). + */ + double now; +#if OS_WINCE + SYSTEMTIME time; + GetSystemTime(&time); + SystemTimeToFileTime(&time,&ft); +#else + GetSystemTimeAsFileTime( &ft ); +#endif + now = ((double)ft.dwHighDateTime) * 4294967296.0; + *prNow = (now + ft.dwLowDateTime)/864000000000.0 + 2305813.5; +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *prNow = sqlite3_current_time/86400.0 + 2440587.5; + } +#endif + return 0; +} + + +/* +** Return a pointer to the sqlite3DefaultVfs structure. We use +** a function rather than give the structure global scope because +** some compilers (MSVC) do not allow forward declarations of +** initialized structures. +*/ +sqlite3_vfs *sqlite3OsDefaultVfs(void){ + static sqlite3_vfs winVfs = { + 1, /* iVersion */ + sizeof(winFile), /* szOsFile */ + MAX_PATH, /* mxPathname */ + 0, /* pNext */ + "win32", /* zName */ + 0, /* pAppData */ + + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winGetTempname, /* xGetTempName */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime /* xCurrentTime */ + }; + + return &winVfs; +} + +#endif /* OS_WIN */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c new file mode 100644 index 0000000000..b0ad7158bc --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c @@ -0,0 +1,5104 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of the page cache subsystem or "pager". +** +** The pager is used to access a database disk file. It implements +** atomic commit and rollback through the use of a journal file that +** is separate from the database file. The pager also implements file +** locking to prevent two processes from writing the same database +** file simultaneously, or one process from reading the database while +** another is writing. +** +** @(#) $Id: pager.c,v 1.392 2007/10/03 15:22:26 danielk1977 Exp $ +*/ +#ifndef SQLITE_OMIT_DISKIO +#include "sqliteInt.h" +#include +#include + +/* +** Macros for troubleshooting. Normally turned off +*/ +#if 0 +#define sqlite3DebugPrintf printf +#define PAGERTRACE1(X) sqlite3DebugPrintf(X) +#define PAGERTRACE2(X,Y) sqlite3DebugPrintf(X,Y) +#define PAGERTRACE3(X,Y,Z) sqlite3DebugPrintf(X,Y,Z) +#define PAGERTRACE4(X,Y,Z,W) sqlite3DebugPrintf(X,Y,Z,W) +#define PAGERTRACE5(X,Y,Z,W,V) sqlite3DebugPrintf(X,Y,Z,W,V) +#else +#define PAGERTRACE1(X) +#define PAGERTRACE2(X,Y) +#define PAGERTRACE3(X,Y,Z) +#define PAGERTRACE4(X,Y,Z,W) +#define PAGERTRACE5(X,Y,Z,W,V) +#endif + +/* +** The following two macros are used within the PAGERTRACEX() macros above +** to print out file-descriptors. +** +** PAGERID() takes a pointer to a Pager struct as it's argument. The +** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file +** struct as it's argument. +*/ +#define PAGERID(p) ((int)(p->fd)) +#define FILEHANDLEID(fd) ((int)fd) + +/* +** The page cache as a whole is always in one of the following +** states: +** +** PAGER_UNLOCK The page cache is not currently reading or +** writing the database file. There is no +** data held in memory. This is the initial +** state. +** +** PAGER_SHARED The page cache is reading the database. +** Writing is not permitted. There can be +** multiple readers accessing the same database +** file at the same time. +** +** PAGER_RESERVED This process has reserved the database for writing +** but has not yet made any changes. Only one process +** at a time can reserve the database. The original +** database file has not been modified so other +** processes may still be reading the on-disk +** database file. +** +** PAGER_EXCLUSIVE The page cache is writing the database. +** Access is exclusive. No other processes or +** threads can be reading or writing while one +** process is writing. +** +** PAGER_SYNCED The pager moves to this state from PAGER_EXCLUSIVE +** after all dirty pages have been written to the +** database file and the file has been synced to +** disk. All that remains to do is to remove or +** truncate the journal file and the transaction +** will be committed. +** +** The page cache comes up in PAGER_UNLOCK. The first time a +** sqlite3PagerGet() occurs, the state transitions to PAGER_SHARED. +** After all pages have been released using sqlite_page_unref(), +** the state transitions back to PAGER_UNLOCK. The first time +** that sqlite3PagerWrite() is called, the state transitions to +** PAGER_RESERVED. (Note that sqlite3PagerWrite() can only be +** called on an outstanding page which means that the pager must +** be in PAGER_SHARED before it transitions to PAGER_RESERVED.) +** PAGER_RESERVED means that there is an open rollback journal. +** The transition to PAGER_EXCLUSIVE occurs before any changes +** are made to the database file, though writes to the rollback +** journal occurs with just PAGER_RESERVED. After an sqlite3PagerRollback() +** or sqlite3PagerCommitPhaseTwo(), the state can go back to PAGER_SHARED, +** or it can stay at PAGER_EXCLUSIVE if we are in exclusive access mode. +*/ +#define PAGER_UNLOCK 0 +#define PAGER_SHARED 1 /* same as SHARED_LOCK */ +#define PAGER_RESERVED 2 /* same as RESERVED_LOCK */ +#define PAGER_EXCLUSIVE 4 /* same as EXCLUSIVE_LOCK */ +#define PAGER_SYNCED 5 + +/* +** If the SQLITE_BUSY_RESERVED_LOCK macro is set to true at compile-time, +** then failed attempts to get a reserved lock will invoke the busy callback. +** This is off by default. To see why, consider the following scenario: +** +** Suppose thread A already has a shared lock and wants a reserved lock. +** Thread B already has a reserved lock and wants an exclusive lock. If +** both threads are using their busy callbacks, it might be a long time +** be for one of the threads give up and allows the other to proceed. +** But if the thread trying to get the reserved lock gives up quickly +** (if it never invokes its busy callback) then the contention will be +** resolved quickly. +*/ +#ifndef SQLITE_BUSY_RESERVED_LOCK +# define SQLITE_BUSY_RESERVED_LOCK 0 +#endif + +/* +** This macro rounds values up so that if the value is an address it +** is guaranteed to be an address that is aligned to an 8-byte boundary. +*/ +#define FORCE_ALIGNMENT(X) (((X)+7)&~7) + +typedef struct PgHdr PgHdr; + +/* +** Each pager stores all currently unreferenced pages in a list sorted +** in least-recently-used (LRU) order (i.e. the first item on the list has +** not been referenced in a long time, the last item has been recently +** used). An instance of this structure is included as part of each +** pager structure for this purpose (variable Pager.lru). +** +** Additionally, if memory-management is enabled, all unreferenced pages +** are stored in a global LRU list (global variable sqlite3LruPageList). +** +** In both cases, the PagerLruList.pFirstSynced variable points to +** the first page in the corresponding list that does not require an +** fsync() operation before it's memory can be reclaimed. If no such +** page exists, PagerLruList.pFirstSynced is set to NULL. +*/ +typedef struct PagerLruList PagerLruList; +struct PagerLruList { + PgHdr *pFirst; /* First page in LRU list */ + PgHdr *pLast; /* Last page in LRU list (the most recently used) */ + PgHdr *pFirstSynced; /* First page in list with PgHdr.needSync==0 */ +}; + +/* +** The following structure contains the next and previous pointers used +** to link a PgHdr structure into a PagerLruList linked list. +*/ +typedef struct PagerLruLink PagerLruLink; +struct PagerLruLink { + PgHdr *pNext; + PgHdr *pPrev; +}; + +/* +** Each in-memory image of a page begins with the following header. +** This header is only visible to this pager module. The client +** code that calls pager sees only the data that follows the header. +** +** Client code should call sqlite3PagerWrite() on a page prior to making +** any modifications to that page. The first time sqlite3PagerWrite() +** is called, the original page contents are written into the rollback +** journal and PgHdr.inJournal and PgHdr.needSync are set. Later, once +** the journal page has made it onto the disk surface, PgHdr.needSync +** is cleared. The modified page cannot be written back into the original +** database file until the journal pages has been synced to disk and the +** PgHdr.needSync has been cleared. +** +** The PgHdr.dirty flag is set when sqlite3PagerWrite() is called and +** is cleared again when the page content is written back to the original +** database file. +** +** Details of important structure elements: +** +** needSync +** +** If this is true, this means that it is not safe to write the page +** content to the database because the original content needed +** for rollback has not by synced to the main rollback journal. +** The original content may have been written to the rollback journal +** but it has not yet been synced. So we cannot write to the database +** file because power failure might cause the page in the journal file +** to never reach the disk. It is as if the write to the journal file +** does not occur until the journal file is synced. +** +** This flag is false if the page content exactly matches what +** currently exists in the database file. The needSync flag is also +** false if the original content has been written to the main rollback +** journal and synced. If the page represents a new page that has +** been added onto the end of the database during the current +** transaction, the needSync flag is true until the original database +** size in the journal header has been synced to disk. +** +** inJournal +** +** This is true if the original page has been written into the main +** rollback journal. This is always false for new pages added to +** the end of the database file during the current transaction. +** And this flag says nothing about whether or not the journal +** has been synced to disk. For pages that are in the original +** database file, the following expression should always be true: +** +** inJournal = (pPager->aInJournal[(pgno-1)/8] & (1<<((pgno-1)%8))!=0 +** +** The pPager->aInJournal[] array is only valid for the original +** pages of the database, not new pages that are added to the end +** of the database, so obviously the above expression cannot be +** valid for new pages. For new pages inJournal is always 0. +** +** dirty +** +** When true, this means that the content of the page has been +** modified and needs to be written back to the database file. +** If false, it means that either the content of the page is +** unchanged or else the content is unimportant and we do not +** care whether or not it is preserved. +** +** alwaysRollback +** +** This means that the sqlite3PagerDontRollback() API should be +** ignored for this page. The DontRollback() API attempts to say +** that the content of the page on disk is unimportant (it is an +** unused page on the freelist) so that it is unnecessary to +** rollback changes to this page because the content of the page +** can change without changing the meaning of the database. This +** flag overrides any DontRollback() attempt. This flag is set +** when a page that originally contained valid data is added to +** the freelist. Later in the same transaction, this page might +** be pulled from the freelist and reused for something different +** and at that point the DontRollback() API will be called because +** pages taken from the freelist do not need to be protected by +** the rollback journal. But this flag says that the page was +** not originally part of the freelist so that it still needs to +** be rolled back in spite of any subsequent DontRollback() calls. +** +** needRead +** +** This flag means (when true) that the content of the page has +** not yet been loaded from disk. The in-memory content is just +** garbage. (Actually, we zero the content, but you should not +** make any assumptions about the content nevertheless.) If the +** content is needed in the future, it should be read from the +** original database file. +*/ +struct PgHdr { + Pager *pPager; /* The pager to which this page belongs */ + Pgno pgno; /* The page number for this page */ + PgHdr *pNextHash, *pPrevHash; /* Hash collision chain for PgHdr.pgno */ + PagerLruLink free; /* Next and previous free pages */ + PgHdr *pNextAll; /* A list of all pages */ + u8 inJournal; /* TRUE if has been written to journal */ + u8 dirty; /* TRUE if we need to write back changes */ + u8 needSync; /* Sync journal before writing this page */ + u8 alwaysRollback; /* Disable DontRollback() for this page */ + u8 needRead; /* Read content if PagerWrite() is called */ + short int nRef; /* Number of users of this page */ + PgHdr *pDirty, *pPrevDirty; /* Dirty pages */ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + PagerLruLink gfree; /* Global list of nRef==0 pages */ +#endif +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; +#endif + void *pData; /* Page data */ + /* Pager.nExtra bytes of local data appended to this header */ +}; + +/* +** For an in-memory only database, some extra information is recorded about +** each page so that changes can be rolled back. (Journal files are not +** used for in-memory databases.) The following information is added to +** the end of every EXTRA block for in-memory databases. +** +** This information could have been added directly to the PgHdr structure. +** But then it would take up an extra 8 bytes of storage on every PgHdr +** even for disk-based databases. Splitting it out saves 8 bytes. This +** is only a savings of 0.8% but those percentages add up. +*/ +typedef struct PgHistory PgHistory; +struct PgHistory { + u8 *pOrig; /* Original page text. Restore to this on a full rollback */ + u8 *pStmt; /* Text as it was at the beginning of the current statement */ + PgHdr *pNextStmt, *pPrevStmt; /* List of pages in the statement journal */ + u8 inStmt; /* TRUE if in the statement subjournal */ +}; + +/* +** A macro used for invoking the codec if there is one +*/ +#ifdef SQLITE_HAS_CODEC +# define CODEC1(P,D,N,X) if( P->xCodec!=0 ){ P->xCodec(P->pCodecArg,D,N,X); } +# define CODEC2(P,D,N,X) ((char*)(P->xCodec!=0?P->xCodec(P->pCodecArg,D,N,X):D)) +#else +# define CODEC1(P,D,N,X) /* NO-OP */ +# define CODEC2(P,D,N,X) ((char*)D) +#endif + +/* +** Convert a pointer to a PgHdr into a pointer to its data +** and back again. +*/ +#define PGHDR_TO_DATA(P) ((P)->pData) +#define PGHDR_TO_EXTRA(G,P) ((void*)&((G)[1])) +#define PGHDR_TO_HIST(P,PGR) \ + ((PgHistory*)&((char*)(&(P)[1]))[(PGR)->nExtra]) + +/* +** A open page cache is an instance of the following structure. +** +** Pager.errCode may be set to SQLITE_IOERR, SQLITE_CORRUPT, or +** or SQLITE_FULL. Once one of the first three errors occurs, it persists +** and is returned as the result of every major pager API call. The +** SQLITE_FULL return code is slightly different. It persists only until the +** next successful rollback is performed on the pager cache. Also, +** SQLITE_FULL does not affect the sqlite3PagerGet() and sqlite3PagerLookup() +** APIs, they may still be used successfully. +*/ +struct Pager { + sqlite3_vfs *pVfs; /* OS functions to use for IO */ + u8 journalOpen; /* True if journal file descriptors is valid */ + u8 journalStarted; /* True if header of journal is synced */ + u8 useJournal; /* Use a rollback journal on this file */ + u8 noReadlock; /* Do not bother to obtain readlocks */ + u8 stmtOpen; /* True if the statement subjournal is open */ + u8 stmtInUse; /* True we are in a statement subtransaction */ + u8 stmtAutoopen; /* Open stmt journal when main journal is opened*/ + u8 noSync; /* Do not sync the journal if true */ + u8 fullSync; /* Do extra syncs of the journal for robustness */ + u8 sync_flags; /* One of SYNC_NORMAL or SYNC_FULL */ + u8 state; /* PAGER_UNLOCK, _SHARED, _RESERVED, etc. */ + u8 tempFile; /* zFilename is a temporary file */ + u8 readOnly; /* True for a read-only database */ + u8 needSync; /* True if an fsync() is needed on the journal */ + u8 dirtyCache; /* True if cached pages have changed */ + u8 alwaysRollback; /* Disable DontRollback() for all pages */ + u8 memDb; /* True to inhibit all file I/O */ + u8 setMaster; /* True if a m-j name has been written to jrnl */ + u8 doNotSync; /* Boolean. While true, do not spill the cache */ + u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ + u8 changeCountDone; /* Set after incrementing the change-counter */ + u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ + int errCode; /* One of several kinds of errors */ + int dbSize; /* Number of pages in the file */ + int origDbSize; /* dbSize before the current change */ + int stmtSize; /* Size of database (in pages) at stmt_begin() */ + int nRec; /* Number of pages written to the journal */ + u32 cksumInit; /* Quasi-random value added to every checksum */ + int stmtNRec; /* Number of records in stmt subjournal */ + int nExtra; /* Add this many bytes to each in-memory page */ + int pageSize; /* Number of bytes in a page */ + int nPage; /* Total number of in-memory pages */ + int nRef; /* Number of in-memory pages with PgHdr.nRef>0 */ + int mxPage; /* Maximum number of pages to hold in cache */ + Pgno mxPgno; /* Maximum allowed size of the database */ + u8 *aInJournal; /* One bit for each page in the database file */ + u8 *aInStmt; /* One bit for each page in the database */ + char *zFilename; /* Name of the database file */ + char *zJournal; /* Name of the journal file */ + char *zDirectory; /* Directory hold database and journal files */ + char *zStmtJrnl; /* Name of the statement journal file */ + sqlite3_file *fd, *jfd; /* File descriptors for database and journal */ + sqlite3_file *stfd; /* File descriptor for the statement subjournal*/ + BusyHandler *pBusyHandler; /* Pointer to sqlite.busyHandler */ + PagerLruList lru; /* LRU list of free pages */ + PgHdr *pAll; /* List of all pages */ + PgHdr *pStmt; /* List of pages in the statement subjournal */ + PgHdr *pDirty; /* List of all dirty pages */ + i64 journalOff; /* Current byte offset in the journal file */ + i64 journalHdr; /* Byte offset to previous journal header */ + i64 stmtHdrOff; /* First journal header written this statement */ + i64 stmtCksum; /* cksumInit when statement was started */ + i64 stmtJSize; /* Size of journal at stmt_begin() */ + int sectorSize; /* Assumed sector size during rollback */ +#ifdef SQLITE_TEST + int nHit, nMiss; /* Cache hits and missing */ + int nRead, nWrite; /* Database pages read/written */ +#endif + void (*xDestructor)(DbPage*,int); /* Call this routine when freeing pages */ + void (*xReiniter)(DbPage*,int); /* Call this routine when reloading pages */ +#ifdef SQLITE_HAS_CODEC + void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ + void *pCodecArg; /* First argument to xCodec() */ +#endif + int nHash; /* Size of the pager hash table */ + PgHdr **aHash; /* Hash table to map page number to PgHdr */ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + Pager *pNext; /* Doubly linked list of pagers on which */ + Pager *pPrev; /* sqlite3_release_memory() will work */ + int iInUseMM; /* Non-zero if unavailable to MM */ + int iInUseDB; /* Non-zero if in sqlite3_release_memory() */ +#endif + char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ + char dbFileVers[16]; /* Changes whenever database file changes */ +}; + +/* +** The following global variables hold counters used for +** testing purposes only. These variables do not exist in +** a non-testing build. These variables are not thread-safe. +*/ +#ifdef SQLITE_TEST +int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ +int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ +int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ +int sqlite3_pager_pgfree_count = 0; /* Number of cache pages freed */ +# define PAGER_INCR(v) v++ +#else +# define PAGER_INCR(v) +#endif + +/* +** The following variable points to the head of a double-linked list +** of all pagers that are eligible for page stealing by the +** sqlite3_release_memory() interface. Access to this list is +** protected by the SQLITE_MUTEX_STATIC_MEM2 mutex. +*/ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +static Pager *sqlite3PagerList = 0; +static PagerLruList sqlite3LruPageList = {0, 0, 0}; +#endif + + +/* +** Journal files begin with the following magic string. The data +** was obtained from /dev/random. It is used only as a sanity check. +** +** Since version 2.8.0, the journal format contains additional sanity +** checking information. If the power fails while the journal is begin +** written, semi-random garbage data might appear in the journal +** file after power is restored. If an attempt is then made +** to roll the journal back, the database could be corrupted. The additional +** sanity checking data is an attempt to discover the garbage in the +** journal and ignore it. +** +** The sanity checking information for the new journal format consists +** of a 32-bit checksum on each page of data. The checksum covers both +** the page number and the pPager->pageSize bytes of data for the page. +** This cksum is initialized to a 32-bit random value that appears in the +** journal file right after the header. The random initializer is important, +** because garbage data that appears at the end of a journal is likely +** data that was once in other files that have now been deleted. If the +** garbage data came from an obsolete journal file, the checksums might +** be correct. But by initializing the checksum to random value which +** is different for every journal, we minimize that risk. +*/ +static const unsigned char aJournalMagic[] = { + 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, +}; + +/* +** The size of the header and of each page in the journal is determined +** by the following macros. +*/ +#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) + +/* +** The journal header size for this pager. In the future, this could be +** set to some value read from the disk controller. The important +** characteristic is that it is the same size as a disk sector. +*/ +#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) + +/* +** The macro MEMDB is true if we are dealing with an in-memory database. +** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set, +** the value of MEMDB will be a constant and the compiler will optimize +** out code that would never execute. +*/ +#ifdef SQLITE_OMIT_MEMORYDB +# define MEMDB 0 +#else +# define MEMDB pPager->memDb +#endif + +/* +** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a master journal name - there are no more pages to +** roll back. See comments for function writeMasterJournal() for details. +*/ +/* #define PAGER_MJ_PGNO(x) (PENDING_BYTE/((x)->pageSize)) */ +#define PAGER_MJ_PGNO(x) ((PENDING_BYTE/((x)->pageSize))+1) + +/* +** The maximum legal page number is (2^31 - 1). +*/ +#define PAGER_MAX_PGNO 2147483647 + +/* +** The pagerEnter() and pagerLeave() routines acquire and release +** a mutex on each pager. The mutex is recursive. +** +** This is a special-purpose mutex. It only provides mutual exclusion +** between the Btree and the Memory Management sqlite3_release_memory() +** function. It does not prevent, for example, two Btrees from accessing +** the same pager at the same time. Other general-purpose mutexes in +** the btree layer handle that chore. +*/ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + static void pagerEnter(Pager *p){ + p->iInUseDB++; + if( p->iInUseMM && p->iInUseDB==1 ){ + sqlite3_mutex *mutex; + mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); + p->iInUseDB = 0; + sqlite3_mutex_enter(mutex); + p->iInUseDB = 1; + sqlite3_mutex_leave(mutex); + } + assert( p->iInUseMM==0 ); + } + static void pagerLeave(Pager *p){ + p->iInUseDB--; + assert( p->iInUseDB>=0 ); + } +#else +# define pagerEnter(X) +# define pagerLeave(X) +#endif + +/* +** Enable reference count tracking (for debugging) here: +*/ +#ifdef SQLITE_DEBUG + int pager3_refinfo_enable = 0; + static void pager_refinfo(PgHdr *p){ + static int cnt = 0; + if( !pager3_refinfo_enable ) return; + sqlite3DebugPrintf( + "REFCNT: %4d addr=%p nRef=%-3d total=%d\n", + p->pgno, PGHDR_TO_DATA(p), p->nRef, p->pPager->nRef + ); + cnt++; /* Something to set a breakpoint on */ + } +# define REFINFO(X) pager_refinfo(X) +#else +# define REFINFO(X) +#endif + +/* +** Add page pPg to the end of the linked list managed by structure +** pList (pPg becomes the last entry in the list - the most recently +** used). Argument pLink should point to either pPg->free or pPg->gfree, +** depending on whether pPg is being added to the pager-specific or +** global LRU list. +*/ +static void listAdd(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){ + pLink->pNext = 0; + pLink->pPrev = pList->pLast; + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + assert(pLink==&pPg->free || pLink==&pPg->gfree); + assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList); +#endif + + if( pList->pLast ){ + int iOff = (char *)pLink - (char *)pPg; + PagerLruLink *pLastLink = (PagerLruLink *)(&((u8 *)pList->pLast)[iOff]); + pLastLink->pNext = pPg; + }else{ + assert(!pList->pFirst); + pList->pFirst = pPg; + } + + pList->pLast = pPg; + if( !pList->pFirstSynced && pPg->needSync==0 ){ + pList->pFirstSynced = pPg; + } +} + +/* +** Remove pPg from the list managed by the structure pointed to by pList. +** +** Argument pLink should point to either pPg->free or pPg->gfree, depending +** on whether pPg is being added to the pager-specific or global LRU list. +*/ +static void listRemove(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){ + int iOff = (char *)pLink - (char *)pPg; + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + assert(pLink==&pPg->free || pLink==&pPg->gfree); + assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList); +#endif + + if( pPg==pList->pFirst ){ + pList->pFirst = pLink->pNext; + } + if( pPg==pList->pLast ){ + pList->pLast = pLink->pPrev; + } + if( pLink->pPrev ){ + PagerLruLink *pPrevLink = (PagerLruLink *)(&((u8 *)pLink->pPrev)[iOff]); + pPrevLink->pNext = pLink->pNext; + } + if( pLink->pNext ){ + PagerLruLink *pNextLink = (PagerLruLink *)(&((u8 *)pLink->pNext)[iOff]); + pNextLink->pPrev = pLink->pPrev; + } + if( pPg==pList->pFirstSynced ){ + PgHdr *p = pLink->pNext; + while( p && p->needSync ){ + PagerLruLink *pL = (PagerLruLink *)(&((u8 *)p)[iOff]); + p = pL->pNext; + } + pList->pFirstSynced = p; + } + + pLink->pNext = pLink->pPrev = 0; +} + +/* +** Add page pPg to the list of free pages for the pager. If +** memory-management is enabled, also add the page to the global +** list of free pages. +*/ +static void lruListAdd(PgHdr *pPg){ + listAdd(&pPg->pPager->lru, &pPg->free, pPg); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( !pPg->pPager->memDb ){ + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + listAdd(&sqlite3LruPageList, &pPg->gfree, pPg); + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + } +#endif +} + +/* +** Remove page pPg from the list of free pages for the associated pager. +** If memory-management is enabled, also remove pPg from the global list +** of free pages. +*/ +static void lruListRemove(PgHdr *pPg){ + listRemove(&pPg->pPager->lru, &pPg->free, pPg); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( !pPg->pPager->memDb ){ + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + listRemove(&sqlite3LruPageList, &pPg->gfree, pPg); + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + } +#endif +} + +/* +** This function is called just after the needSync flag has been cleared +** from all pages managed by pPager (usually because the journal file +** has just been synced). It updates the pPager->lru.pFirstSynced variable +** and, if memory-management is enabled, the sqlite3LruPageList.pFirstSynced +** variable also. +*/ +static void lruListSetFirstSynced(Pager *pPager){ + pPager->lru.pFirstSynced = pPager->lru.pFirst; +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( !pPager->memDb ){ + PgHdr *p; + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + for(p=sqlite3LruPageList.pFirst; p && p->needSync; p=p->gfree.pNext); + assert(p==pPager->lru.pFirstSynced || p==sqlite3LruPageList.pFirstSynced); + sqlite3LruPageList.pFirstSynced = p; + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + } +#endif +} + +/* +** Return true if page *pPg has already been written to the statement +** journal (or statement snapshot has been created, if *pPg is part +** of an in-memory database). +*/ +static int pageInStatement(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + if( MEMDB ){ + return PGHDR_TO_HIST(pPg, pPager)->inStmt; + }else{ + Pgno pgno = pPg->pgno; + u8 *a = pPager->aInStmt; + return (a && (int)pgno<=pPager->stmtSize && (a[pgno/8] & (1<<(pgno&7)))); + } +} + +/* +** Change the size of the pager hash table to N. N must be a power +** of two. +*/ +static void pager_resize_hash_table(Pager *pPager, int N){ + PgHdr **aHash, *pPg; + assert( N>0 && (N&(N-1))==0 ); + pagerLeave(pPager); + sqlite3MallocBenignFailure((int)pPager->aHash); + aHash = sqlite3MallocZero( sizeof(aHash[0])*N ); + pagerEnter(pPager); + if( aHash==0 ){ + /* Failure to rehash is not an error. It is only a performance hit. */ + return; + } + sqlite3_free(pPager->aHash); + pPager->nHash = N; + pPager->aHash = aHash; + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + int h; + if( pPg->pgno==0 ){ + assert( pPg->pNextHash==0 && pPg->pPrevHash==0 ); + continue; + } + h = pPg->pgno & (N-1); + pPg->pNextHash = aHash[h]; + if( aHash[h] ){ + aHash[h]->pPrevHash = pPg; + } + aHash[h] = pPg; + pPg->pPrevHash = 0; + } +} + +/* +** Read a 32-bit integer from the given file descriptor. Store the integer +** that is read in *pRes. Return SQLITE_OK if everything worked, or an +** error code is something goes wrong. +** +** All values are stored on disk as big-endian. +*/ +static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ + unsigned char ac[4]; + int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset); + if( rc==SQLITE_OK ){ + *pRes = sqlite3Get4byte(ac); + } + return rc; +} + +/* +** Write a 32-bit integer into a string buffer in big-endian byte order. +*/ +#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) + +/* +** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK +** on success or an error code is something goes wrong. +*/ +static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ + char ac[4]; + put32bits(ac, val); + return sqlite3OsWrite(fd, ac, 4, offset); +} + +/* +** If file pFd is open, call sqlite3OsUnlock() on it. +*/ +static int osUnlock(sqlite3_file *pFd, int eLock){ + if( !pFd->pMethods ){ + return SQLITE_OK; + } + return sqlite3OsUnlock(pFd, eLock); +} + +/* +** This function determines whether or not the atomic-write optimization +** can be used with this pager. The optimization can be used if: +** +** (a) the value returned by OsDeviceCharacteristics() indicates that +** a database page may be written atomically, and +** (b) the value returned by OsSectorSize() is less than or equal +** to the page size. +** +** If the optimization cannot be used, 0 is returned. If it can be used, +** then the value returned is the size of the journal file when it +** contains rollback data for exactly one page. +*/ +#ifdef SQLITE_ENABLE_ATOMIC_WRITE +static int jrnlBufferSize(Pager *pPager){ + int dc; /* Device characteristics */ + int nSector; /* Sector size */ + int nPage; /* Page size */ + sqlite3_file *fd = pPager->fd; + + if( fd->pMethods ){ + dc = sqlite3OsDeviceCharacteristics(fd); + nSector = sqlite3OsSectorSize(fd); + nPage = pPager->pageSize; + } + + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + + if( !fd->pMethods || (dc&(SQLITE_IOCAP_ATOMIC|(nPage>>8))&&nSector<=nPage) ){ + return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); + } + return 0; +} +#endif + +/* +** This function should be called when an error occurs within the pager +** code. The first argument is a pointer to the pager structure, the +** second the error-code about to be returned by a pager API function. +** The value returned is a copy of the second argument to this function. +** +** If the second argument is SQLITE_IOERR, SQLITE_CORRUPT, or SQLITE_FULL +** the error becomes persistent. Until the persisten error is cleared, +** subsequent API calls on this Pager will immediately return the same +** error code. +** +** A persistent error indicates that the contents of the pager-cache +** cannot be trusted. This state can be cleared by completely discarding +** the contents of the pager-cache. If a transaction was active when +** the persistent error occured, then the rollback journal may need +** to be replayed. +*/ +static void pager_unlock(Pager *pPager); +static int pager_error(Pager *pPager, int rc){ + int rc2 = rc & 0xff; + assert( + pPager->errCode==SQLITE_FULL || + pPager->errCode==SQLITE_OK || + (pPager->errCode & 0xff)==SQLITE_IOERR + ); + if( + rc2==SQLITE_FULL || + rc2==SQLITE_IOERR || + rc2==SQLITE_CORRUPT + ){ + pPager->errCode = rc; + if( pPager->state==PAGER_UNLOCK && pPager->nRef==0 ){ + /* If the pager is already unlocked, call pager_unlock() now to + ** clear the error state and ensure that the pager-cache is + ** completely empty. + */ + pager_unlock(pPager); + } + } + return rc; +} + +/* +** If SQLITE_CHECK_PAGES is defined then we do some sanity checking +** on the cache using a hash function. This is used for testing +** and debugging only. +*/ +#ifdef SQLITE_CHECK_PAGES +/* +** Return a 32-bit hash of the page data for pPage. +*/ +static u32 pager_datahash(int nByte, unsigned char *pData){ + u32 hash = 0; + int i; + for(i=0; ipPager->pageSize, + (unsigned char *)PGHDR_TO_DATA(pPage)); +} + +/* +** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES +** is defined, and NDEBUG is not defined, an assert() statement checks +** that the page is either dirty or still matches the calculated page-hash. +*/ +#define CHECK_PAGE(x) checkPage(x) +static void checkPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( !pPg->pageHash || pPager->errCode || MEMDB || pPg->dirty || + pPg->pageHash==pager_pagehash(pPg) ); +} + +#else +#define pager_datahash(X,Y) 0 +#define pager_pagehash(X) 0 +#define CHECK_PAGE(x) +#endif + +/* +** When this is called the journal file for pager pPager must be open. +** The master journal file name is read from the end of the file and +** written into memory supplied by the caller. +** +** zMaster must point to a buffer of at least nMaster bytes allocated by +** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is +** enough space to write the master journal name). If the master journal +** name in the journal is longer than nMaster bytes (including a +** nul-terminator), then this is handled as if no master journal name +** were present in the journal. +** +** If no master journal file name is present zMaster[0] is set to 0 and +** SQLITE_OK returned. +*/ +static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, int nMaster){ + int rc; + u32 len; + i64 szJ; + u32 cksum; + int i; + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + + zMaster[0] = '\0'; + + rc = sqlite3OsFileSize(pJrnl, &szJ); + if( rc!=SQLITE_OK || szJ<16 ) return rc; + + rc = read32bits(pJrnl, szJ-16, &len); + if( rc!=SQLITE_OK ) return rc; + + if( len>=nMaster ){ + return SQLITE_OK; + } + + rc = read32bits(pJrnl, szJ-12, &cksum); + if( rc!=SQLITE_OK ) return rc; + + rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8); + if( rc!=SQLITE_OK || memcmp(aMagic, aJournalMagic, 8) ) return rc; + + rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len); + if( rc!=SQLITE_OK ){ + return rc; + } + zMaster[len] = '\0'; + + /* See if the checksum matches the master journal name */ + for(i=0; ijournalOff; + if( c ){ + offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); + } + assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); + assert( offset>=c ); + assert( (offset-c)journalOff = offset; +} + +/* +** The journal file must be open when this routine is called. A journal +** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the +** current location. +** +** The format for the journal header is as follows: +** - 8 bytes: Magic identifying journal format. +** - 4 bytes: Number of records in journal, or -1 no-sync mode is on. +** - 4 bytes: Random number used for page hash. +** - 4 bytes: Initial database page count. +** - 4 bytes: Sector size used by the process that wrote this journal. +** +** Followed by (JOURNAL_HDR_SZ - 24) bytes of unused space. +*/ +static int writeJournalHdr(Pager *pPager){ + char zHeader[sizeof(aJournalMagic)+16]; + int rc; + + if( pPager->stmtHdrOff==0 ){ + pPager->stmtHdrOff = pPager->journalOff; + } + + seekJournalHdr(pPager); + pPager->journalHdr = pPager->journalOff; + + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + + /* + ** Write the nRec Field - the number of page records that follow this + ** journal header. Normally, zero is written to this value at this time. + ** After the records are added to the journal (and the journal synced, + ** if in full-sync mode), the zero is overwritten with the true number + ** of records (see syncJournal()). + ** + ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When + ** reading the journal this value tells SQLite to assume that the + ** rest of the journal file contains valid page records. This assumption + ** is dangerous, as if a failure occured whilst writing to the journal + ** file it may contain some garbage data. There are two scenarios + ** where this risk can be ignored: + ** + ** * When the pager is in no-sync mode. Corruption can follow a + ** power failure in this case anyway. + ** + ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees + ** that garbage data is never appended to the journal file. + */ + assert(pPager->fd->pMethods||pPager->noSync); + if( (pPager->noSync) + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) + ){ + put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); + }else{ + put32bits(&zHeader[sizeof(aJournalMagic)], 0); + } + + /* The random check-hash initialiser */ + sqlite3Randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); + /* The initial database size */ + put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbSize); + /* The assumed sector size for this process */ + put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, sizeof(zHeader))) + rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader),pPager->journalOff); + pPager->journalOff += JOURNAL_HDR_SZ(pPager); + + /* The journal header has been written successfully. Seek the journal + ** file descriptor to the end of the journal header sector. + */ + if( rc==SQLITE_OK ){ + IOTRACE(("JTAIL %p %lld\n", pPager, pPager->journalOff-1)) + rc = sqlite3OsWrite(pPager->jfd, "\000", 1, pPager->journalOff-1); + } + return rc; +} + +/* +** The journal file must be open when this is called. A journal header file +** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal +** file. See comments above function writeJournalHdr() for a description of +** the journal header format. +** +** If the header is read successfully, *nRec is set to the number of +** page records following this header and *dbSize is set to the size of the +** database before the transaction began, in pages. Also, pPager->cksumInit +** is set to the value read from the journal header. SQLITE_OK is returned +** in this case. +** +** If the journal header file appears to be corrupted, SQLITE_DONE is +** returned and *nRec and *dbSize are not set. If JOURNAL_HDR_SZ bytes +** cannot be read from the journal file an error code is returned. +*/ +static int readJournalHdr( + Pager *pPager, + i64 journalSize, + u32 *pNRec, + u32 *pDbSize +){ + int rc; + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + i64 jrnlOff; + + seekJournalHdr(pPager); + if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ + return SQLITE_DONE; + } + jrnlOff = pPager->journalOff; + + rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), jrnlOff); + if( rc ) return rc; + jrnlOff += sizeof(aMagic); + + if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ + return SQLITE_DONE; + } + + rc = read32bits(pPager->jfd, jrnlOff, pNRec); + if( rc ) return rc; + + rc = read32bits(pPager->jfd, jrnlOff+4, &pPager->cksumInit); + if( rc ) return rc; + + rc = read32bits(pPager->jfd, jrnlOff+8, pDbSize); + if( rc ) return rc; + + /* Update the assumed sector-size to match the value used by + ** the process that created this journal. If this journal was + ** created by a process other than this one, then this routine + ** is being called from within pager_playback(). The local value + ** of Pager.sectorSize is restored at the end of that routine. + */ + rc = read32bits(pPager->jfd, jrnlOff+12, (u32 *)&pPager->sectorSize); + if( rc ) return rc; + + pPager->journalOff += JOURNAL_HDR_SZ(pPager); + return SQLITE_OK; +} + + +/* +** Write the supplied master journal name into the journal file for pager +** pPager at the current location. The master journal name must be the last +** thing written to a journal file. If the pager is in full-sync mode, the +** journal file descriptor is advanced to the next sector boundary before +** anything is written. The format is: +** +** + 4 bytes: PAGER_MJ_PGNO. +** + N bytes: length of master journal name. +** + 4 bytes: N +** + 4 bytes: Master journal name checksum. +** + 8 bytes: aJournalMagic[]. +** +** The master journal page checksum is the sum of the bytes in the master +** journal name. +** +** If zMaster is a NULL pointer (occurs for a single database transaction), +** this call is a no-op. +*/ +static int writeMasterJournal(Pager *pPager, const char *zMaster){ + int rc; + int len; + int i; + i64 jrnlOff; + u32 cksum = 0; + char zBuf[sizeof(aJournalMagic)+2*4]; + + if( !zMaster || pPager->setMaster) return SQLITE_OK; + pPager->setMaster = 1; + + len = strlen(zMaster); + for(i=0; ifullSync ){ + seekJournalHdr(pPager); + } + jrnlOff = pPager->journalOff; + pPager->journalOff += (len+20); + + rc = write32bits(pPager->jfd, jrnlOff, PAGER_MJ_PGNO(pPager)); + if( rc!=SQLITE_OK ) return rc; + jrnlOff += 4; + + rc = sqlite3OsWrite(pPager->jfd, zMaster, len, jrnlOff); + if( rc!=SQLITE_OK ) return rc; + jrnlOff += len; + + put32bits(zBuf, len); + put32bits(&zBuf[4], cksum); + memcpy(&zBuf[8], aJournalMagic, sizeof(aJournalMagic)); + rc = sqlite3OsWrite(pPager->jfd, zBuf, 8+sizeof(aJournalMagic), jrnlOff); + pPager->needSync = !pPager->noSync; + return rc; +} + +/* +** Add or remove a page from the list of all pages that are in the +** statement journal. +** +** The Pager keeps a separate list of pages that are currently in +** the statement journal. This helps the sqlite3PagerStmtCommit() +** routine run MUCH faster for the common case where there are many +** pages in memory but only a few are in the statement journal. +*/ +static void page_add_to_stmt_list(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); + assert( MEMDB ); + if( !pHist->inStmt ){ + assert( pHist->pPrevStmt==0 && pHist->pNextStmt==0 ); + if( pPager->pStmt ){ + PGHDR_TO_HIST(pPager->pStmt, pPager)->pPrevStmt = pPg; + } + pHist->pNextStmt = pPager->pStmt; + pPager->pStmt = pPg; + pHist->inStmt = 1; + } +} + +/* +** Find a page in the hash table given its page number. Return +** a pointer to the page or NULL if not found. +*/ +static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){ + PgHdr *p; + if( pPager->aHash==0 ) return 0; + p = pPager->aHash[pgno & (pPager->nHash-1)]; + while( p && p->pgno!=pgno ){ + p = p->pNextHash; + } + return p; +} + +/* +** Clear the in-memory cache. This routine +** sets the state of the pager back to what it was when it was first +** opened. Any outstanding pages are invalidated and subsequent attempts +** to access those pages will likely result in a coredump. +*/ +static void pager_reset(Pager *pPager){ + PgHdr *pPg, *pNext; + if( pPager->errCode ) return; + for(pPg=pPager->pAll; pPg; pPg=pNext){ + IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno)); + PAGER_INCR(sqlite3_pager_pgfree_count); + pNext = pPg->pNextAll; + lruListRemove(pPg); + sqlite3_free(pPg->pData); + sqlite3_free(pPg); + } + assert(pPager->lru.pFirst==0); + assert(pPager->lru.pFirstSynced==0); + assert(pPager->lru.pLast==0); + pPager->pStmt = 0; + pPager->pAll = 0; + pPager->pDirty = 0; + pPager->nHash = 0; + sqlite3_free(pPager->aHash); + pPager->nPage = 0; + pPager->aHash = 0; + pPager->nRef = 0; +} + +/* +** Unlock the database file. +** +** If the pager is currently in error state, discard the contents of +** the cache and reset the Pager structure internal state. If there is +** an open journal-file, then the next time a shared-lock is obtained +** on the pager file (by this or any other process), it will be +** treated as a hot-journal and rolled back. +*/ +static void pager_unlock(Pager *pPager){ + if( !pPager->exclusiveMode ){ + if( !MEMDB ){ + if( pPager->fd->pMethods ){ + osUnlock(pPager->fd, NO_LOCK); + } + pPager->dbSize = -1; + IOTRACE(("UNLOCK %p\n", pPager)) + + /* If Pager.errCode is set, the contents of the pager cache cannot be + ** trusted. Now that the pager file is unlocked, the contents of the + ** cache can be discarded and the error code safely cleared. + */ + if( pPager->errCode ){ + pPager->errCode = SQLITE_OK; + pager_reset(pPager); + if( pPager->stmtOpen ){ + sqlite3OsClose(pPager->stfd); + sqlite3_free(pPager->aInStmt); + pPager->aInStmt = 0; + } + if( pPager->journalOpen ){ + sqlite3OsClose(pPager->jfd); + pPager->journalOpen = 0; + sqlite3_free(pPager->aInJournal); + pPager->aInJournal = 0; + } + pPager->stmtOpen = 0; + pPager->stmtInUse = 0; + pPager->journalOff = 0; + pPager->journalStarted = 0; + pPager->stmtAutoopen = 0; + pPager->origDbSize = 0; + } + } + + if( !MEMDB || pPager->errCode==SQLITE_OK ){ + pPager->state = PAGER_UNLOCK; + pPager->changeCountDone = 0; + } + } +} + +/* +** Execute a rollback if a transaction is active and unlock the +** database file. If the pager has already entered the error state, +** do not attempt the rollback. +*/ +static void pagerUnlockAndRollback(Pager *p){ + assert( p->state>=PAGER_RESERVED || p->journalOpen==0 ); + if( p->errCode==SQLITE_OK && p->state>=PAGER_RESERVED ){ + sqlite3PagerRollback(p); + } + pager_unlock(p); + assert( p->errCode || !p->journalOpen || (p->exclusiveMode&&!p->journalOff) ); + assert( p->errCode || !p->stmtOpen || p->exclusiveMode ); +} + +/* +** This routine ends a transaction. A transaction is ended by either +** a COMMIT or a ROLLBACK. +** +** When this routine is called, the pager has the journal file open and +** a RESERVED or EXCLUSIVE lock on the database. This routine will release +** the database lock and acquires a SHARED lock in its place if that is +** the appropriate thing to do. Release locks usually is appropriate, +** unless we are in exclusive access mode or unless this is a +** COMMIT AND BEGIN or ROLLBACK AND BEGIN operation. +** +** The journal file is either deleted or truncated. +** +** TODO: Consider keeping the journal file open for temporary databases. +** This might give a performance improvement on windows where opening +** a file is an expensive operation. +*/ +static int pager_end_transaction(Pager *pPager){ + PgHdr *pPg; + int rc = SQLITE_OK; + int rc2 = SQLITE_OK; + assert( !MEMDB ); + if( pPager->statestmtOpen && !pPager->exclusiveMode ){ + sqlite3OsClose(pPager->stfd); + pPager->stmtOpen = 0; + } + if( pPager->journalOpen ){ + if( pPager->exclusiveMode + && (rc = sqlite3OsTruncate(pPager->jfd, 0))==SQLITE_OK ){; + pPager->journalOff = 0; + pPager->journalStarted = 0; + }else{ + sqlite3OsClose(pPager->jfd); + pPager->journalOpen = 0; + if( rc==SQLITE_OK ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + } + } + sqlite3_free( pPager->aInJournal ); + pPager->aInJournal = 0; + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + pPg->inJournal = 0; + pPg->dirty = 0; + pPg->needSync = 0; + pPg->alwaysRollback = 0; +#ifdef SQLITE_CHECK_PAGES + pPg->pageHash = pager_pagehash(pPg); +#endif + } + pPager->pDirty = 0; + pPager->dirtyCache = 0; + pPager->nRec = 0; + }else{ + assert( pPager->aInJournal==0 ); + assert( pPager->dirtyCache==0 || pPager->useJournal==0 ); + } + + if( !pPager->exclusiveMode ){ + rc2 = osUnlock(pPager->fd, SHARED_LOCK); + pPager->state = PAGER_SHARED; + }else if( pPager->state==PAGER_SYNCED ){ + pPager->state = PAGER_EXCLUSIVE; + } + pPager->origDbSize = 0; + pPager->setMaster = 0; + pPager->needSync = 0; + lruListSetFirstSynced(pPager); + pPager->dbSize = -1; + + return (rc==SQLITE_OK?rc2:rc); +} + +/* +** Compute and return a checksum for the page of data. +** +** This is not a real checksum. It is really just the sum of the +** random initial value and the page number. We experimented with +** a checksum of the entire data, but that was found to be too slow. +** +** Note that the page number is stored at the beginning of data and +** the checksum is stored at the end. This is important. If journal +** corruption occurs due to a power failure, the most likely scenario +** is that one end or the other of the record will be changed. It is +** much less likely that the two ends of the journal record will be +** correct and the middle be corrupt. Thus, this "checksum" scheme, +** though fast and simple, catches the mostly likely kind of corruption. +** +** FIX ME: Consider adding every 200th (or so) byte of the data to the +** checksum. That way if a single page spans 3 or more disk sectors and +** only the middle sector is corrupt, we will still have a reasonable +** chance of failing the checksum and thus detecting the problem. +*/ +static u32 pager_cksum(Pager *pPager, const u8 *aData){ + u32 cksum = pPager->cksumInit; + int i = pPager->pageSize-200; + while( i>0 ){ + cksum += aData[i]; + i -= 200; + } + return cksum; +} + +/* Forward declaration */ +static void makeClean(PgHdr*); + +/* +** Read a single page from the journal file opened on file descriptor +** jfd. Playback this one page. +** +** If useCksum==0 it means this journal does not use checksums. Checksums +** are not used in statement journals because statement journals do not +** need to survive power failures. +*/ +static int pager_playback_one_page( + Pager *pPager, + sqlite3_file *jfd, + i64 offset, + int useCksum +){ + int rc; + PgHdr *pPg; /* An existing page in the cache */ + Pgno pgno; /* The page number of a page in journal */ + u32 cksum; /* Checksum used for sanity checking */ + u8 *aData = (u8 *)pPager->pTmpSpace; /* Temp storage for a page */ + + /* useCksum should be true for the main journal and false for + ** statement journals. Verify that this is always the case + */ + assert( jfd == (useCksum ? pPager->jfd : pPager->stfd) ); + assert( aData ); + + rc = read32bits(jfd, offset, &pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsRead(jfd, aData, pPager->pageSize, offset+4); + if( rc!=SQLITE_OK ) return rc; + pPager->journalOff += pPager->pageSize + 4; + + /* Sanity checking on the page. This is more important that I originally + ** thought. If a power failure occurs while the journal is being written, + ** it could cause invalid data to be written into the journal. We need to + ** detect this invalid data (with high probability) and ignore it. + */ + if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + return SQLITE_DONE; + } + if( pgno>(unsigned)pPager->dbSize ){ + return SQLITE_OK; + } + if( useCksum ){ + rc = read32bits(jfd, offset+pPager->pageSize+4, &cksum); + if( rc ) return rc; + pPager->journalOff += 4; + if( pager_cksum(pPager, aData)!=cksum ){ + return SQLITE_DONE; + } + } + + assert( pPager->state==PAGER_RESERVED || pPager->state>=PAGER_EXCLUSIVE ); + + /* If the pager is in RESERVED state, then there must be a copy of this + ** page in the pager cache. In this case just update the pager cache, + ** not the database file. The page is left marked dirty in this case. + ** + ** An exception to the above rule: If the database is in no-sync mode + ** and a page is moved during an incremental vacuum then the page may + ** not be in the pager cache. Later: if a malloc() or IO error occurs + ** during a Movepage() call, then the page may not be in the cache + ** either. So the condition described in the above paragraph is not + ** assert()able. + ** + ** If in EXCLUSIVE state, then we update the pager cache if it exists + ** and the main file. The page is then marked not dirty. + ** + ** Ticket #1171: The statement journal might contain page content that is + ** different from the page content at the start of the transaction. + ** This occurs when a page is changed prior to the start of a statement + ** then changed again within the statement. When rolling back such a + ** statement we must not write to the original database unless we know + ** for certain that original page contents are synced into the main rollback + ** journal. Otherwise, a power loss might leave modified data in the + ** database file without an entry in the rollback journal that can + ** restore the database to its original form. Two conditions must be + ** met before writing to the database files. (1) the database must be + ** locked. (2) we know that the original page content is fully synced + ** in the main journal either because the page is not in cache or else + ** the page is marked as needSync==0. + */ + pPg = pager_lookup(pPager, pgno); + PAGERTRACE4("PLAYBACK %d page %d hash(%08x)\n", + PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData)); + if( pPager->state>=PAGER_EXCLUSIVE && (pPg==0 || pPg->needSync==0) ){ + i64 offset = (pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsWrite(pPager->fd, aData, pPager->pageSize, offset); + if( pPg ){ + makeClean(pPg); + } + } + if( pPg ){ + /* No page should ever be explicitly rolled back that is in use, except + ** for page 1 which is held in use in order to keep the lock on the + ** database active. However such a page may be rolled back as a result + ** of an internal error resulting in an automatic call to + ** sqlite3PagerRollback(). + */ + void *pData; + /* assert( pPg->nRef==0 || pPg->pgno==1 ); */ + pData = PGHDR_TO_DATA(pPg); + memcpy(pData, aData, pPager->pageSize); + if( pPager->xReiniter ){ + pPager->xReiniter(pPg, pPager->pageSize); + } +#ifdef SQLITE_CHECK_PAGES + pPg->pageHash = pager_pagehash(pPg); +#endif + /* If this was page 1, then restore the value of Pager.dbFileVers. + ** Do this before any decoding. */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); + } + + /* Decode the page just read from disk */ + CODEC1(pPager, pData, pPg->pgno, 3); + } + return rc; +} + +/* +** Parameter zMaster is the name of a master journal file. A single journal +** file that referred to the master journal file has just been rolled back. +** This routine checks if it is possible to delete the master journal file, +** and does so if it is. +** +** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not +** available for use within this function. +** +** +** The master journal file contains the names of all child journals. +** To tell if a master journal can be deleted, check to each of the +** children. If all children are either missing or do not refer to +** a different master journal, then this master journal can be deleted. +*/ +static int pager_delmaster(Pager *pPager, const char *zMaster){ + sqlite3_vfs *pVfs = pPager->pVfs; + int rc; + int master_open = 0; + sqlite3_file *pMaster; + sqlite3_file *pJournal; + char *zMasterJournal = 0; /* Contents of master journal file */ + i64 nMasterJournal; /* Size of master journal file */ + + /* Open the master journal file exclusively in case some other process + ** is running this routine also. Not that it makes too much difference. + */ + pMaster = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile * 2); + pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile); + if( !pMaster ){ + rc = SQLITE_NOMEM; + }else{ + int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); + rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0); + } + if( rc!=SQLITE_OK ) goto delmaster_out; + master_open = 1; + + rc = sqlite3OsFileSize(pMaster, &nMasterJournal); + if( rc!=SQLITE_OK ) goto delmaster_out; + + if( nMasterJournal>0 ){ + char *zJournal; + char *zMasterPtr = 0; + int nMasterPtr = pPager->pVfs->mxPathname+1; + + /* Load the entire master journal file into space obtained from + ** sqlite3_malloc() and pointed to by zMasterJournal. + */ + zMasterJournal = (char *)sqlite3_malloc(nMasterJournal + nMasterPtr); + if( !zMasterJournal ){ + rc = SQLITE_NOMEM; + goto delmaster_out; + } + zMasterPtr = &zMasterJournal[nMasterJournal]; + rc = sqlite3OsRead(pMaster, zMasterJournal, nMasterJournal, 0); + if( rc!=SQLITE_OK ) goto delmaster_out; + + zJournal = zMasterJournal; + while( (zJournal-zMasterJournal)state>=PAGER_EXCLUSIVE && pPager->fd->pMethods ){ + rc = sqlite3OsTruncate(pPager->fd, pPager->pageSize*(i64)nPage); + } + if( rc==SQLITE_OK ){ + pPager->dbSize = nPage; + pager_truncate_cache(pPager); + } + return rc; +} + +/* +** Set the sectorSize for the given pager. +** +** The sector size is the larger of the sector size reported +** by sqlite3OsSectorSize() and the pageSize. +*/ +static void setSectorSize(Pager *pPager){ + assert(pPager->fd->pMethods||pPager->tempFile); + if( !pPager->tempFile ){ + /* Sector size doesn't matter for temporary files. Also, the file + ** may not have been opened yet, in whcih case the OsSectorSize() + ** call will segfault. + */ + pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); + } + if( pPager->sectorSizepageSize ){ + pPager->sectorSize = pPager->pageSize; + } +} + +/* +** Playback the journal and thus restore the database file to +** the state it was in before we started making changes. +** +** The journal file format is as follows: +** +** (1) 8 byte prefix. A copy of aJournalMagic[]. +** (2) 4 byte big-endian integer which is the number of valid page records +** in the journal. If this value is 0xffffffff, then compute the +** number of page records from the journal size. +** (3) 4 byte big-endian integer which is the initial value for the +** sanity checksum. +** (4) 4 byte integer which is the number of pages to truncate the +** database to during a rollback. +** (5) 4 byte integer which is the number of bytes in the master journal +** name. The value may be zero (indicate that there is no master +** journal.) +** (6) N bytes of the master journal name. The name will be nul-terminated +** and might be shorter than the value read from (5). If the first byte +** of the name is \000 then there is no master journal. The master +** journal name is stored in UTF-8. +** (7) Zero or more pages instances, each as follows: +** + 4 byte page number. +** + pPager->pageSize bytes of data. +** + 4 byte checksum +** +** When we speak of the journal header, we mean the first 6 items above. +** Each entry in the journal is an instance of the 7th item. +** +** Call the value from the second bullet "nRec". nRec is the number of +** valid page entries in the journal. In most cases, you can compute the +** value of nRec from the size of the journal file. But if a power +** failure occurred while the journal was being written, it could be the +** case that the size of the journal file had already been increased but +** the extra entries had not yet made it safely to disk. In such a case, +** the value of nRec computed from the file size would be too large. For +** that reason, we always use the nRec value in the header. +** +** If the nRec value is 0xffffffff it means that nRec should be computed +** from the file size. This value is used when the user selects the +** no-sync option for the journal. A power failure could lead to corruption +** in this case. But for things like temporary table (which will be +** deleted when the power is restored) we don't care. +** +** If the file opened as the journal file is not a well-formed +** journal file then all pages up to the first corrupted page are rolled +** back (or no pages if the journal header is corrupted). The journal file +** is then deleted and SQLITE_OK returned, just as if no corruption had +** been encountered. +** +** If an I/O or malloc() error occurs, the journal-file is not deleted +** and an error code is returned. +*/ +static int pager_playback(Pager *pPager, int isHot){ + sqlite3_vfs *pVfs = pPager->pVfs; + i64 szJ; /* Size of the journal file in bytes */ + u32 nRec; /* Number of Records in the journal */ + int i; /* Loop counter */ + Pgno mxPg = 0; /* Size of the original file in pages */ + int rc; /* Result code of a subroutine */ + char *zMaster = 0; /* Name of master journal file if any */ + + /* Figure out how many records are in the journal. Abort early if + ** the journal is empty. + */ + assert( pPager->journalOpen ); + rc = sqlite3OsFileSize(pPager->jfd, &szJ); + if( rc!=SQLITE_OK || szJ==0 ){ + goto end_playback; + } + + /* Read the master journal name from the journal, if it is present. + ** If a master journal file name is specified, but the file is not + ** present on disk, then the journal is not hot and does not need to be + ** played back. + */ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + assert( rc!=SQLITE_DONE ); + if( rc!=SQLITE_OK + || (zMaster[0] && !sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS)) + ){ + zMaster = 0; + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + goto end_playback; + } + pPager->journalOff = 0; + zMaster = 0; + + /* This loop terminates either when the readJournalHdr() call returns + ** SQLITE_DONE or an IO error occurs. */ + while( 1 ){ + + /* Read the next journal header from the journal file. If there are + ** not enough bytes left in the journal file for a complete header, or + ** it is corrupted, then a process must of failed while writing it. + ** This indicates nothing more needs to be rolled back. + */ + rc = readJournalHdr(pPager, szJ, &nRec, &mxPg); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + goto end_playback; + } + + /* If nRec is 0xffffffff, then this journal was created by a process + ** working in no-sync mode. This means that the rest of the journal + ** file consists of pages, there are no more journal headers. Compute + ** the value of nRec based on this assumption. + */ + if( nRec==0xffffffff ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); + nRec = (szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager); + } + + /* If nRec is 0 and this rollback is of a transaction created by this + ** process and if this is the final header in the journal, then it means + ** that this part of the journal was being filled but has not yet been + ** synced to disk. Compute the number of pages based on the remaining + ** size of the file. + ** + ** The third term of the test was added to fix ticket #2565. + */ + if( nRec==0 && !isHot && + pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ + nRec = (szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager); + } + + /* If this is the first header read from the journal, truncate the + ** database file back to it's original size. + */ + if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ + rc = pager_truncate(pPager, mxPg); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + } + + /* Copy original pages out of the journal and back into the database file. + */ + for(i=0; ijfd, pPager->journalOff, 1); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + pPager->journalOff = szJ; + break; + }else{ + goto end_playback; + } + } + } + } + /*NOTREACHED*/ + assert( 0 ); + +end_playback: + if( rc==SQLITE_OK ){ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + } + if( rc==SQLITE_OK ){ + rc = pager_end_transaction(pPager); + } + if( rc==SQLITE_OK && zMaster[0] ){ + /* If there was a master journal and this routine will return success, + ** see if it is possible to delete the master journal. + */ + rc = pager_delmaster(pPager, zMaster); + } + + /* The Pager.sectorSize variable may have been updated while rolling + ** back a journal created by a process with a different sector size + ** value. Reset it to the correct value for this process. + */ + setSectorSize(pPager); + return rc; +} + +/* +** Playback the statement journal. +** +** This is similar to playing back the transaction journal but with +** a few extra twists. +** +** (1) The number of pages in the database file at the start of +** the statement is stored in pPager->stmtSize, not in the +** journal file itself. +** +** (2) In addition to playing back the statement journal, also +** playback all pages of the transaction journal beginning +** at offset pPager->stmtJSize. +*/ +static int pager_stmt_playback(Pager *pPager){ + i64 szJ; /* Size of the full journal */ + i64 hdrOff; + int nRec; /* Number of Records */ + int i; /* Loop counter */ + int rc; + + szJ = pPager->journalOff; +#ifndef NDEBUG + { + i64 os_szJ; + rc = sqlite3OsFileSize(pPager->jfd, &os_szJ); + if( rc!=SQLITE_OK ) return rc; + assert( szJ==os_szJ ); + } +#endif + + /* Set hdrOff to be the offset just after the end of the last journal + ** page written before the first journal-header for this statement + ** transaction was written, or the end of the file if no journal + ** header was written. + */ + hdrOff = pPager->stmtHdrOff; + assert( pPager->fullSync || !hdrOff ); + if( !hdrOff ){ + hdrOff = szJ; + } + + /* Truncate the database back to its original size. + */ + rc = pager_truncate(pPager, pPager->stmtSize); + assert( pPager->state>=PAGER_SHARED ); + + /* Figure out how many records are in the statement journal. + */ + assert( pPager->stmtInUse && pPager->journalOpen ); + nRec = pPager->stmtNRec; + + /* Copy original pages out of the statement journal and back into the + ** database file. Note that the statement journal omits checksums from + ** each record since power-failure recovery is not important to statement + ** journals. + */ + for(i=0; ipageSize); + rc = pager_playback_one_page(pPager, pPager->stfd, offset, 0); + assert( rc!=SQLITE_DONE ); + if( rc!=SQLITE_OK ) goto end_stmt_playback; + } + + /* Now roll some pages back from the transaction journal. Pager.stmtJSize + ** was the size of the journal file when this statement was started, so + ** everything after that needs to be rolled back, either into the + ** database, the memory cache, or both. + ** + ** If it is not zero, then Pager.stmtHdrOff is the offset to the start + ** of the first journal header written during this statement transaction. + */ + pPager->journalOff = pPager->stmtJSize; + pPager->cksumInit = pPager->stmtCksum; + while( pPager->journalOff < hdrOff ){ + rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1); + assert( rc!=SQLITE_DONE ); + if( rc!=SQLITE_OK ) goto end_stmt_playback; + } + + while( pPager->journalOff < szJ ){ + u32 nJRec; /* Number of Journal Records */ + u32 dummy; + rc = readJournalHdr(pPager, szJ, &nJRec, &dummy); + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_DONE ); + goto end_stmt_playback; + } + if( nJRec==0 ){ + nJRec = (szJ - pPager->journalOff) / (pPager->pageSize+8); + } + for(i=nJRec-1; i>=0 && pPager->journalOff < szJ; i--){ + rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1); + assert( rc!=SQLITE_DONE ); + if( rc!=SQLITE_OK ) goto end_stmt_playback; + } + } + + pPager->journalOff = szJ; + +end_stmt_playback: + if( rc==SQLITE_OK) { + pPager->journalOff = szJ; + /* pager_reload_cache(pPager); */ + } + return rc; +} + +/* +** Change the maximum number of in-memory pages that are allowed. +*/ +void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ + if( mxPage>10 ){ + pPager->mxPage = mxPage; + }else{ + pPager->mxPage = 10; + } +} + +/* +** Adjust the robustness of the database to damage due to OS crashes +** or power failures by changing the number of syncs()s when writing +** the rollback journal. There are three levels: +** +** OFF sqlite3OsSync() is never called. This is the default +** for temporary and transient files. +** +** NORMAL The journal is synced once before writes begin on the +** database. This is normally adequate protection, but +** it is theoretically possible, though very unlikely, +** that an inopertune power failure could leave the journal +** in a state which would cause damage to the database +** when it is rolled back. +** +** FULL The journal is synced twice before writes begin on the +** database (with some additional information - the nRec field +** of the journal header - being written in between the two +** syncs). If we assume that writing a +** single disk sector is atomic, then this mode provides +** assurance that the journal will not be corrupted to the +** point of causing damage to the database during rollback. +** +** Numeric values associated with these states are OFF==1, NORMAL=2, +** and FULL=3. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +void sqlite3PagerSetSafetyLevel(Pager *pPager, int level, int full_fsync){ + pPager->noSync = level==1 || pPager->tempFile; + pPager->fullSync = level==3 && !pPager->tempFile; + pPager->sync_flags = (full_fsync?SQLITE_SYNC_FULL:SQLITE_SYNC_NORMAL); + if( pPager->noSync ) pPager->needSync = 0; +} +#endif + +/* +** The following global variable is incremented whenever the library +** attempts to open a temporary file. This information is used for +** testing and analysis only. +*/ +#ifdef SQLITE_TEST +int sqlite3_opentemp_count = 0; +#endif + +/* +** Open a temporary file. +** +** Write the file descriptor into *fd. Return SQLITE_OK on success or some +** other error code if we fail. The OS will automatically delete the temporary +** file when it is closed. +*/ +static int sqlite3PagerOpentemp( + sqlite3_vfs *pVfs, /* The virtual file system layer */ + sqlite3_file *pFile, /* Write the file descriptor here */ + char *zFilename, /* Name of the file. Might be NULL */ + int vfsFlags /* Flags passed through to the VFS */ +){ + int rc; + assert( zFilename!=0 ); + +#ifdef SQLITE_TEST + sqlite3_opentemp_count++; /* Used for testing and analysis only */ +#endif + + vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + rc = sqlite3OsOpen(pVfs, zFilename, pFile, vfsFlags, 0); + assert( rc!=SQLITE_OK || pFile->pMethods ); + return rc; +} + +/* +** Create a new page cache and put a pointer to the page cache in *ppPager. +** The file to be cached need not exist. The file is not locked until +** the first call to sqlite3PagerGet() and is only held open until the +** last page is released using sqlite3PagerUnref(). +** +** If zFilename is NULL then a randomly-named temporary file is created +** and used as the file to be cached. The file will be deleted +** automatically when it is closed. +** +** If zFilename is ":memory:" then all information is held in cache. +** It is never written to disk. This can be used to implement an +** in-memory database. +*/ +int sqlite3PagerOpen( + sqlite3_vfs *pVfs, /* The virtual file system to use */ + Pager **ppPager, /* Return the Pager structure here */ + const char *zFilename, /* Name of the database file to open */ + int nExtra, /* Extra bytes append to each in-memory page */ + int flags, /* flags controlling this file */ + int vfsFlags /* flags passed through to sqlite3_vfs.xOpen() */ +){ + u8 *pPtr; + Pager *pPager = 0; + int rc = SQLITE_OK; + int i; + int tempFile = 0; + int memDb = 0; + int readOnly = 0; + int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; + int noReadlock = (flags & PAGER_NO_READLOCK)!=0; + int journalFileSize = sqlite3JournalSize(pVfs); + int nDefaultPage = SQLITE_DEFAULT_PAGE_SIZE; + char *zPathname; + int nPathname; + + /* The default return is a NULL pointer */ + *ppPager = 0; + + /* Compute the full pathname */ + nPathname = pVfs->mxPathname+1; + zPathname = sqlite3_malloc(nPathname); + if( zPathname==0 ){ + return SQLITE_NOMEM; + } + if( zFilename && zFilename[0] ){ +#ifndef SQLITE_OMIT_MEMORYDB + if( strcmp(zFilename,":memory:")==0 ){ + memDb = 1; + zPathname[0] = 0; + }else +#endif + { + rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); + } + }else{ + rc = sqlite3OsGetTempname(pVfs, nPathname, zPathname); + } + if( rc!=SQLITE_OK ){ + sqlite3_free(zPathname); + return rc; + } + nPathname = strlen(zPathname); + + /* Allocate memory for the pager structure */ + pPager = sqlite3MallocZero( + sizeof(*pPager) + /* Pager structure */ + journalFileSize + /* The journal file structure */ + pVfs->szOsFile * 2 + /* The db and stmt journal files */ + 4*nPathname + 40 /* zFilename, zDirectory, zJournal, zStmtJrnl */ + ); + if( !pPager ){ + sqlite3_free(zPathname); + return SQLITE_NOMEM; + } + pPtr = (u8 *)&pPager[1]; + pPager->vfsFlags = vfsFlags; + pPager->fd = (sqlite3_file*)&pPtr[pVfs->szOsFile*0]; + pPager->stfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*1]; + pPager->jfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*2]; + pPager->zFilename = (char*)&pPtr[pVfs->szOsFile*2+journalFileSize]; + pPager->zDirectory = &pPager->zFilename[nPathname+1]; + pPager->zJournal = &pPager->zDirectory[nPathname+1]; + pPager->zStmtJrnl = &pPager->zJournal[nPathname+10]; + pPager->pVfs = pVfs; + memcpy(pPager->zFilename, zPathname, nPathname+1); + sqlite3_free(zPathname); + + /* Open the pager file. + */ + if( zFilename && zFilename[0] && !memDb ){ + if( nPathname>(pVfs->mxPathname - sizeof("-journal")) ){ + rc = SQLITE_CANTOPEN; + }else{ + int fout = 0; + rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, + pPager->vfsFlags, &fout); + readOnly = (fout&SQLITE_OPEN_READONLY); + + /* If the file was successfully opened for read/write access, + ** choose a default page size in case we have to create the + ** database file. The default page size is the maximum of: + ** + ** + SQLITE_DEFAULT_PAGE_SIZE, + ** + The value returned by sqlite3OsSectorSize() + ** + The largest page size that can be written atomically. + */ + if( rc==SQLITE_OK && !readOnly ){ + int iSectorSize = sqlite3OsSectorSize(pPager->fd); + if( nDefaultPagefd); + int ii; + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); + for(ii=nDefaultPage; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ + if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ) nDefaultPage = ii; + } + } +#endif + if( nDefaultPage>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ + nDefaultPage = SQLITE_MAX_DEFAULT_PAGE_SIZE; + } + } + } + }else if( !memDb ){ + /* If a temporary file is requested, it is not opened immediately. + ** In this case we accept the default page size and delay actually + ** opening the file until the first call to OsWrite(). + */ + tempFile = 1; + pPager->state = PAGER_EXCLUSIVE; + } + + if( pPager && rc==SQLITE_OK ){ + pPager->pTmpSpace = (char *)sqlite3_malloc(nDefaultPage); + } + + /* If an error occured in either of the blocks above. + ** Free the Pager structure and close the file. + ** Since the pager is not allocated there is no need to set + ** any Pager.errMask variables. + */ + if( !pPager || !pPager->pTmpSpace ){ + sqlite3OsClose(pPager->fd); + sqlite3_free(pPager); + return ((rc==SQLITE_OK)?SQLITE_NOMEM:rc); + } + + PAGERTRACE3("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename); + IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) + + /* Fill in Pager.zDirectory[] */ + memcpy(pPager->zDirectory, pPager->zFilename, nPathname+1); + for(i=strlen(pPager->zDirectory); i>0 && pPager->zDirectory[i-1]!='/'; i--){} + if( i>0 ) pPager->zDirectory[i-1] = 0; + + /* Fill in Pager.zJournal[] and Pager.zStmtJrnl[] */ + memcpy(pPager->zJournal, pPager->zFilename, nPathname); + memcpy(&pPager->zJournal[nPathname], "-journal", 9); + memcpy(pPager->zStmtJrnl, pPager->zFilename, nPathname); + memcpy(&pPager->zStmtJrnl[nPathname], "-stmtjrnl", 10); + + /* pPager->journalOpen = 0; */ + pPager->useJournal = useJournal && !memDb; + pPager->noReadlock = noReadlock && readOnly; + /* pPager->stmtOpen = 0; */ + /* pPager->stmtInUse = 0; */ + /* pPager->nRef = 0; */ + pPager->dbSize = memDb-1; + pPager->pageSize = nDefaultPage; + /* pPager->stmtSize = 0; */ + /* pPager->stmtJSize = 0; */ + /* pPager->nPage = 0; */ + pPager->mxPage = 100; + pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; + /* pPager->state = PAGER_UNLOCK; */ + assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) ); + /* pPager->errMask = 0; */ + pPager->tempFile = tempFile; + assert( tempFile==PAGER_LOCKINGMODE_NORMAL + || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); + pPager->exclusiveMode = tempFile; + pPager->memDb = memDb; + pPager->readOnly = readOnly; + /* pPager->needSync = 0; */ + pPager->noSync = pPager->tempFile || !useJournal; + pPager->fullSync = (pPager->noSync?0:1); + pPager->sync_flags = SQLITE_SYNC_NORMAL; + /* pPager->pFirst = 0; */ + /* pPager->pFirstSynced = 0; */ + /* pPager->pLast = 0; */ + pPager->nExtra = FORCE_ALIGNMENT(nExtra); + assert(pPager->fd->pMethods||memDb||tempFile); + if( !memDb ){ + setSectorSize(pPager); + } + /* pPager->pBusyHandler = 0; */ + /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ + *ppPager = pPager; +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + pPager->iInUseMM = 0; + pPager->iInUseDB = 0; + if( !memDb ){ + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); + sqlite3_mutex_enter(mutex); + pPager->pNext = sqlite3PagerList; + if( sqlite3PagerList ){ + assert( sqlite3PagerList->pPrev==0 ); + sqlite3PagerList->pPrev = pPager; + } + pPager->pPrev = 0; + sqlite3PagerList = pPager; + sqlite3_mutex_leave(mutex); + } +#endif + return SQLITE_OK; +} + +/* +** Set the busy handler function. +*/ +void sqlite3PagerSetBusyhandler(Pager *pPager, BusyHandler *pBusyHandler){ + pPager->pBusyHandler = pBusyHandler; +} + +/* +** Set the destructor for this pager. If not NULL, the destructor is called +** when the reference count on each page reaches zero. The destructor can +** be used to clean up information in the extra segment appended to each page. +** +** The destructor is not called as a result sqlite3PagerClose(). +** Destructors are only called by sqlite3PagerUnref(). +*/ +void sqlite3PagerSetDestructor(Pager *pPager, void (*xDesc)(DbPage*,int)){ + pPager->xDestructor = xDesc; +} + +/* +** Set the reinitializer for this pager. If not NULL, the reinitializer +** is called when the content of a page in cache is restored to its original +** value as a result of a rollback. The callback gives higher-level code +** an opportunity to restore the EXTRA section to agree with the restored +** page data. +*/ +void sqlite3PagerSetReiniter(Pager *pPager, void (*xReinit)(DbPage*,int)){ + pPager->xReiniter = xReinit; +} + +/* +** Set the page size to *pPageSize. If the suggest new page size is +** inappropriate, then an alternative page size is set to that +** value before returning. +*/ +int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){ + int rc = SQLITE_OK; + u16 pageSize = *pPageSize; + assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); + if( pageSize && pageSize!=pPager->pageSize + && !pPager->memDb && pPager->nRef==0 + ){ + char *pNew = (char *)sqlite3_malloc(pageSize); + if( !pNew ){ + rc = SQLITE_NOMEM; + }else{ + pagerEnter(pPager); + pager_reset(pPager); + pPager->pageSize = pageSize; + setSectorSize(pPager); + sqlite3_free(pPager->pTmpSpace); + pPager->pTmpSpace = pNew; + pagerLeave(pPager); + } + } + *pPageSize = pPager->pageSize; + return rc; +} + +/* +** Attempt to set the maximum database page count if mxPage is positive. +** Make no changes if mxPage is zero or negative. And never reduce the +** maximum page count below the current size of the database. +** +** Regardless of mxPage, return the current maximum page count. +*/ +int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ + if( mxPage>0 ){ + pPager->mxPgno = mxPage; + } + sqlite3PagerPagecount(pPager); + return pPager->mxPgno; +} + +/* +** The following set of routines are used to disable the simulated +** I/O error mechanism. These routines are used to avoid simulated +** errors in places where we do not care about errors. +** +** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops +** and generate no code. +*/ +#ifdef SQLITE_TEST +extern int sqlite3_io_error_pending; +extern int sqlite3_io_error_hit; +static int saved_cnt; +void disable_simulated_io_errors(void){ + saved_cnt = sqlite3_io_error_pending; + sqlite3_io_error_pending = -1; +} +void enable_simulated_io_errors(void){ + sqlite3_io_error_pending = saved_cnt; +} +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +/* +** Read the first N bytes from the beginning of the file into memory +** that pDest points to. +** +** No error checking is done. The rational for this is that this function +** may be called even if the file does not exist or contain a header. In +** these cases sqlite3OsRead() will return an error, to which the correct +** response is to zero the memory at pDest and continue. A real IO error +** will presumably recur and be picked up later (Todo: Think about this). +*/ +int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ + int rc = SQLITE_OK; + memset(pDest, 0, N); + assert(MEMDB||pPager->fd->pMethods||pPager->tempFile); + if( pPager->fd->pMethods ){ + IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) + rc = sqlite3OsRead(pPager->fd, pDest, N, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + return rc; +} + +/* +** Return the total number of pages in the disk file associated with +** pPager. +** +** If the PENDING_BYTE lies on the page directly after the end of the +** file, then consider this page part of the file too. For example, if +** PENDING_BYTE is byte 4096 (the first byte of page 5) and the size of the +** file is 4096 bytes, 5 is returned instead of 4. +*/ +int sqlite3PagerPagecount(Pager *pPager){ + i64 n = 0; + int rc; + assert( pPager!=0 ); + if( pPager->errCode ){ + return 0; + } + if( pPager->dbSize>=0 ){ + n = pPager->dbSize; + } else { + assert(pPager->fd->pMethods||pPager->tempFile); + if( (pPager->fd->pMethods) + && (rc = sqlite3OsFileSize(pPager->fd, &n))!=SQLITE_OK ){ + pPager->nRef++; + pager_error(pPager, rc); + pPager->nRef--; + return 0; + } + if( n>0 && npageSize ){ + n = 1; + }else{ + n /= pPager->pageSize; + } + if( pPager->state!=PAGER_UNLOCK ){ + pPager->dbSize = n; + } + } + if( n==(PENDING_BYTE/pPager->pageSize) ){ + n++; + } + if( n>pPager->mxPgno ){ + pPager->mxPgno = n; + } + return n; +} + + +#ifndef SQLITE_OMIT_MEMORYDB +/* +** Clear a PgHistory block +*/ +static void clearHistory(PgHistory *pHist){ + sqlite3_free(pHist->pOrig); + sqlite3_free(pHist->pStmt); + pHist->pOrig = 0; + pHist->pStmt = 0; +} +#else +#define clearHistory(x) +#endif + +/* +** Forward declaration +*/ +static int syncJournal(Pager*); + +/* +** Unlink pPg from it's hash chain. Also set the page number to 0 to indicate +** that the page is not part of any hash chain. This is required because the +** sqlite3PagerMovepage() routine can leave a page in the +** pNextFree/pPrevFree list that is not a part of any hash-chain. +*/ +static void unlinkHashChain(Pager *pPager, PgHdr *pPg){ + if( pPg->pgno==0 ){ + assert( pPg->pNextHash==0 && pPg->pPrevHash==0 ); + return; + } + if( pPg->pNextHash ){ + pPg->pNextHash->pPrevHash = pPg->pPrevHash; + } + if( pPg->pPrevHash ){ + assert( pPager->aHash[pPg->pgno & (pPager->nHash-1)]!=pPg ); + pPg->pPrevHash->pNextHash = pPg->pNextHash; + }else{ + int h = pPg->pgno & (pPager->nHash-1); + pPager->aHash[h] = pPg->pNextHash; + } + if( MEMDB ){ + clearHistory(PGHDR_TO_HIST(pPg, pPager)); + } + pPg->pgno = 0; + pPg->pNextHash = pPg->pPrevHash = 0; +} + +/* +** Unlink a page from the free list (the list of all pages where nRef==0) +** and from its hash collision chain. +*/ +static void unlinkPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + + /* Unlink from free page list */ + lruListRemove(pPg); + + /* Unlink from the pgno hash table */ + unlinkHashChain(pPager, pPg); +} + +/* +** This routine is used to truncate the cache when a database +** is truncated. Drop from the cache all pages whose pgno is +** larger than pPager->dbSize and is unreferenced. +** +** Referenced pages larger than pPager->dbSize are zeroed. +** +** Actually, at the point this routine is called, it would be +** an error to have a referenced page. But rather than delete +** that page and guarantee a subsequent segfault, it seems better +** to zero it and hope that we error out sanely. +*/ +static void pager_truncate_cache(Pager *pPager){ + PgHdr *pPg; + PgHdr **ppPg; + int dbSize = pPager->dbSize; + + ppPg = &pPager->pAll; + while( (pPg = *ppPg)!=0 ){ + if( pPg->pgno<=dbSize ){ + ppPg = &pPg->pNextAll; + }else if( pPg->nRef>0 ){ + memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize); + ppPg = &pPg->pNextAll; + }else{ + *ppPg = pPg->pNextAll; + IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno)); + PAGER_INCR(sqlite3_pager_pgfree_count); + unlinkPage(pPg); + makeClean(pPg); + sqlite3_free(pPg->pData); + sqlite3_free(pPg); + pPager->nPage--; + } + } +} + +/* +** Try to obtain a lock on a file. Invoke the busy callback if the lock +** is currently not available. Repeat until the busy callback returns +** false or until the lock succeeds. +** +** Return SQLITE_OK on success and an error code if we cannot obtain +** the lock. +*/ +static int pager_wait_on_lock(Pager *pPager, int locktype){ + int rc; + + /* The OS lock values must be the same as the Pager lock values */ + assert( PAGER_SHARED==SHARED_LOCK ); + assert( PAGER_RESERVED==RESERVED_LOCK ); + assert( PAGER_EXCLUSIVE==EXCLUSIVE_LOCK ); + + /* If the file is currently unlocked then the size must be unknown */ + assert( pPager->state>=PAGER_SHARED || pPager->dbSize<0 || MEMDB ); + + if( pPager->state>=locktype ){ + rc = SQLITE_OK; + }else{ + do { + rc = sqlite3OsLock(pPager->fd, locktype); + }while( rc==SQLITE_BUSY && sqlite3InvokeBusyHandler(pPager->pBusyHandler) ); + if( rc==SQLITE_OK ){ + pPager->state = locktype; + IOTRACE(("LOCK %p %d\n", pPager, locktype)) + } + } + return rc; +} + +/* +** Truncate the file to the number of pages specified. +*/ +int sqlite3PagerTruncate(Pager *pPager, Pgno nPage){ + int rc; + assert( pPager->state>=PAGER_SHARED || MEMDB ); + sqlite3PagerPagecount(pPager); + if( pPager->errCode ){ + rc = pPager->errCode; + return rc; + } + if( nPage>=(unsigned)pPager->dbSize ){ + return SQLITE_OK; + } + if( MEMDB ){ + pPager->dbSize = nPage; + pager_truncate_cache(pPager); + return SQLITE_OK; + } + pagerEnter(pPager); + rc = syncJournal(pPager); + pagerLeave(pPager); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Get an exclusive lock on the database before truncating. */ + pagerEnter(pPager); + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + pagerLeave(pPager); + if( rc!=SQLITE_OK ){ + return rc; + } + + rc = pager_truncate(pPager, nPage); + return rc; +} + +/* +** Shutdown the page cache. Free all memory and close all files. +** +** If a transaction was in progress when this routine is called, that +** transaction is rolled back. All outstanding pages are invalidated +** and their memory is freed. Any attempt to use a page associated +** with this page cache after this function returns will likely +** result in a coredump. +** +** This function always succeeds. If a transaction is active an attempt +** is made to roll it back. If an error occurs during the rollback +** a hot journal may be left in the filesystem but no error is returned +** to the caller. +*/ +int sqlite3PagerClose(Pager *pPager){ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( !MEMDB ){ + sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); + sqlite3_mutex_enter(mutex); + if( pPager->pPrev ){ + pPager->pPrev->pNext = pPager->pNext; + }else{ + sqlite3PagerList = pPager->pNext; + } + if( pPager->pNext ){ + pPager->pNext->pPrev = pPager->pPrev; + } + sqlite3_mutex_leave(mutex); + } +#endif + + disable_simulated_io_errors(); + pPager->errCode = 0; + pPager->exclusiveMode = 0; + pager_reset(pPager); + pagerUnlockAndRollback(pPager); + enable_simulated_io_errors(); + PAGERTRACE2("CLOSE %d\n", PAGERID(pPager)); + IOTRACE(("CLOSE %p\n", pPager)) + assert( pPager->errCode || (pPager->journalOpen==0 && pPager->stmtOpen==0) ); + if( pPager->journalOpen ){ + sqlite3OsClose(pPager->jfd); + } + sqlite3_free(pPager->aInJournal); + if( pPager->stmtOpen ){ + sqlite3OsClose(pPager->stfd); + } + sqlite3OsClose(pPager->fd); + /* Temp files are automatically deleted by the OS + ** if( pPager->tempFile ){ + ** sqlite3OsDelete(pPager->zFilename); + ** } + */ + + sqlite3_free(pPager->aHash); + sqlite3_free(pPager->pTmpSpace); + sqlite3_free(pPager); + return SQLITE_OK; +} + +#if !defined(NDEBUG) || defined(SQLITE_TEST) +/* +** Return the page number for the given page data. +*/ +Pgno sqlite3PagerPagenumber(DbPage *p){ + return p->pgno; +} +#endif + +/* +** The page_ref() function increments the reference count for a page. +** If the page is currently on the freelist (the reference count is zero) then +** remove it from the freelist. +** +** For non-test systems, page_ref() is a macro that calls _page_ref() +** online of the reference count is zero. For test systems, page_ref() +** is a real function so that we can set breakpoints and trace it. +*/ +static void _page_ref(PgHdr *pPg){ + if( pPg->nRef==0 ){ + /* The page is currently on the freelist. Remove it. */ + lruListRemove(pPg); + pPg->pPager->nRef++; + } + pPg->nRef++; + REFINFO(pPg); +} +#ifdef SQLITE_DEBUG + static void page_ref(PgHdr *pPg){ + if( pPg->nRef==0 ){ + _page_ref(pPg); + }else{ + pPg->nRef++; + REFINFO(pPg); + } + } +#else +# define page_ref(P) ((P)->nRef==0?_page_ref(P):(void)(P)->nRef++) +#endif + +/* +** Increment the reference count for a page. The input pointer is +** a reference to the page data. +*/ +int sqlite3PagerRef(DbPage *pPg){ + pagerEnter(pPg->pPager); + page_ref(pPg); + pagerLeave(pPg->pPager); + return SQLITE_OK; +} + +/* +** Sync the journal. In other words, make sure all the pages that have +** been written to the journal have actually reached the surface of the +** disk. It is not safe to modify the original database file until after +** the journal has been synced. If the original database is modified before +** the journal is synced and a power failure occurs, the unsynced journal +** data would be lost and we would be unable to completely rollback the +** database changes. Database corruption would occur. +** +** This routine also updates the nRec field in the header of the journal. +** (See comments on the pager_playback() routine for additional information.) +** If the sync mode is FULL, two syncs will occur. First the whole journal +** is synced, then the nRec field is updated, then a second sync occurs. +** +** For temporary databases, we do not care if we are able to rollback +** after a power failure, so no sync occurs. +** +** If the IOCAP_SEQUENTIAL flag is set for the persistent media on which +** the database is stored, then OsSync() is never called on the journal +** file. In this case all that is required is to update the nRec field in +** the journal header. +** +** This routine clears the needSync field of every page current held in +** memory. +*/ +static int syncJournal(Pager *pPager){ + PgHdr *pPg; + int rc = SQLITE_OK; + + + /* Sync the journal before modifying the main database + ** (assuming there is a journal and it needs to be synced.) + */ + if( pPager->needSync ){ + if( !pPager->tempFile ){ + int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + assert( pPager->journalOpen ); + + /* assert( !pPager->noSync ); // noSync might be set if synchronous + ** was turned off after the transaction was started. Ticket #615 */ +#ifndef NDEBUG + { + /* Make sure the pPager->nRec counter we are keeping agrees + ** with the nRec computed from the size of the journal file. + */ + i64 jSz; + rc = sqlite3OsFileSize(pPager->jfd, &jSz); + if( rc!=0 ) return rc; + assert( pPager->journalOff==jSz ); + } +#endif + if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + /* Write the nRec value into the journal file header. If in + ** full-synchronous mode, sync the journal first. This ensures that + ** all data has really hit the disk before nRec is updated to mark + ** it as a candidate for rollback. + ** + ** This is not required if the persistent media supports the + ** SAFE_APPEND property. Because in this case it is not possible + ** for garbage data to be appended to the file, the nRec field + ** is populated with 0xFFFFFFFF when the journal header is written + ** and never needs to be updated. + */ + i64 jrnlOff; + if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager)); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags); + if( rc!=0 ) return rc; + } + + jrnlOff = pPager->journalHdr + sizeof(aJournalMagic); + IOTRACE(("JHDR %p %lld %d\n", pPager, jrnlOff, 4)); + rc = write32bits(pPager->jfd, jrnlOff, pPager->nRec); + if( rc ) return rc; + } + if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager)); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags| + (pPager->sync_flags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) + ); + if( rc!=0 ) return rc; + } + pPager->journalStarted = 1; + } + pPager->needSync = 0; + + /* Erase the needSync flag from every page. + */ + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + pPg->needSync = 0; + } + lruListSetFirstSynced(pPager); + } + +#ifndef NDEBUG + /* If the Pager.needSync flag is clear then the PgHdr.needSync + ** flag must also be clear for all pages. Verify that this + ** invariant is true. + */ + else{ + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + assert( pPg->needSync==0 ); + } + assert( pPager->lru.pFirstSynced==pPager->lru.pFirst ); + } +#endif + + return rc; +} + +/* +** Merge two lists of pages connected by pDirty and in pgno order. +** Do not both fixing the pPrevDirty pointers. +*/ +static PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB){ + PgHdr result, *pTail; + pTail = &result; + while( pA && pB ){ + if( pA->pgnopgno ){ + pTail->pDirty = pA; + pTail = pA; + pA = pA->pDirty; + }else{ + pTail->pDirty = pB; + pTail = pB; + pB = pB->pDirty; + } + } + if( pA ){ + pTail->pDirty = pA; + }else if( pB ){ + pTail->pDirty = pB; + }else{ + pTail->pDirty = 0; + } + return result.pDirty; +} + +/* +** Sort the list of pages in accending order by pgno. Pages are +** connected by pDirty pointers. The pPrevDirty pointers are +** corrupted by this sort. +*/ +#define N_SORT_BUCKET_ALLOC 25 +#define N_SORT_BUCKET 25 +#ifdef SQLITE_TEST + int sqlite3_pager_n_sort_bucket = 0; + #undef N_SORT_BUCKET + #define N_SORT_BUCKET \ + (sqlite3_pager_n_sort_bucket?sqlite3_pager_n_sort_bucket:N_SORT_BUCKET_ALLOC) +#endif +static PgHdr *sort_pagelist(PgHdr *pIn){ + PgHdr *a[N_SORT_BUCKET_ALLOC], *p; + int i; + memset(a, 0, sizeof(a)); + while( pIn ){ + p = pIn; + pIn = p->pDirty; + p->pDirty = 0; + for(i=0; ipPager; + + /* At this point there may be either a RESERVED or EXCLUSIVE lock on the + ** database file. If there is already an EXCLUSIVE lock, the following + ** calls to sqlite3OsLock() are no-ops. + ** + ** Moving the lock from RESERVED to EXCLUSIVE actually involves going + ** through an intermediate state PENDING. A PENDING lock prevents new + ** readers from attaching to the database but is unsufficient for us to + ** write. The idea of a PENDING lock is to prevent new readers from + ** coming in while we wait for existing readers to clear. + ** + ** While the pager is in the RESERVED state, the original database file + ** is unchanged and we can rollback without having to playback the + ** journal into the original database file. Once we transition to + ** EXCLUSIVE, it means the database file has been changed and any rollback + ** will require a journal playback. + */ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + return rc; + } + + pList = sort_pagelist(pList); + for(p=pList; p; p=p->pDirty){ + assert( p->dirty ); + p->dirty = 0; + } + while( pList ){ + + /* If the file has not yet been opened, open it now. */ + if( !pPager->fd->pMethods ){ + assert(pPager->tempFile); + rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->fd, pPager->zFilename, + pPager->vfsFlags); + if( rc ) return rc; + } + + /* If there are dirty pages in the page cache with page numbers greater + ** than Pager.dbSize, this means sqlite3PagerTruncate() was called to + ** make the file smaller (presumably by auto-vacuum code). Do not write + ** any such pages to the file. + */ + if( pList->pgno<=pPager->dbSize ){ + i64 offset = (pList->pgno-1)*(i64)pPager->pageSize; + char *pData = CODEC2(pPager, PGHDR_TO_DATA(pList), pList->pgno, 6); + PAGERTRACE4("STORE %d page %d hash(%08x)\n", + PAGERID(pPager), pList->pgno, pager_pagehash(pList)); + IOTRACE(("PGOUT %p %d\n", pPager, pList->pgno)); + rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); + PAGER_INCR(sqlite3_pager_writedb_count); + PAGER_INCR(pPager->nWrite); + if( pList->pgno==1 ){ + memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); + } + } +#ifndef NDEBUG + else{ + PAGERTRACE3("NOSTORE %d page %d\n", PAGERID(pPager), pList->pgno); + } +#endif + if( rc ) return rc; +#ifdef SQLITE_CHECK_PAGES + pList->pageHash = pager_pagehash(pList); +#endif + pList = pList->pDirty; + } + return SQLITE_OK; +} + +/* +** Collect every dirty page into a dirty list and +** return a pointer to the head of that list. All pages are +** collected even if they are still in use. +*/ +static PgHdr *pager_get_all_dirty_pages(Pager *pPager){ + return pPager->pDirty; +} + +/* +** Return TRUE if there is a hot journal on the given pager. +** A hot journal is one that needs to be played back. +** +** If the current size of the database file is 0 but a journal file +** exists, that is probably an old journal left over from a prior +** database with the same name. Just delete the journal. +*/ +static int hasHotJournal(Pager *pPager){ + sqlite3_vfs *pVfs = pPager->pVfs; + if( !pPager->useJournal ) return 0; + if( !sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS) ){ + return 0; + } + if( sqlite3OsCheckReservedLock(pPager->fd) ){ + return 0; + } + if( sqlite3PagerPagecount(pPager)==0 ){ + sqlite3OsDelete(pVfs, pPager->zJournal, 0); + return 0; + }else{ + return 1; + } +} + +/* +** Try to find a page in the cache that can be recycled. +** +** This routine may return SQLITE_IOERR, SQLITE_FULL or SQLITE_OK. It +** does not set the pPager->errCode variable. +*/ +static int pager_recycle(Pager *pPager, PgHdr **ppPg){ + PgHdr *pPg; + *ppPg = 0; + + /* It is illegal to call this function unless the pager object + ** pointed to by pPager has at least one free page (page with nRef==0). + */ + assert(!MEMDB); + assert(pPager->lru.pFirst); + + /* Find a page to recycle. Try to locate a page that does not + ** require us to do an fsync() on the journal. + */ + pPg = pPager->lru.pFirstSynced; + + /* If we could not find a page that does not require an fsync() + ** on the journal file then fsync the journal file. This is a + ** very slow operation, so we work hard to avoid it. But sometimes + ** it can't be helped. + */ + if( pPg==0 && pPager->lru.pFirst){ + int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + int rc = syncJournal(pPager); + if( rc!=0 ){ + return rc; + } + if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + /* If in full-sync mode, write a new journal header into the + ** journal file. This is done to avoid ever modifying a journal + ** header that is involved in the rollback of pages that have + ** already been written to the database (in case the header is + ** trashed when the nRec field is updated). + */ + pPager->nRec = 0; + assert( pPager->journalOff > 0 ); + assert( pPager->doNotSync==0 ); + rc = writeJournalHdr(pPager); + if( rc!=0 ){ + return rc; + } + } + pPg = pPager->lru.pFirst; + } + + assert( pPg->nRef==0 ); + + /* Write the page to the database file if it is dirty. + */ + if( pPg->dirty ){ + int rc; + assert( pPg->needSync==0 ); + makeClean(pPg); + pPg->dirty = 1; + pPg->pDirty = 0; + rc = pager_write_pagelist( pPg ); + pPg->dirty = 0; + if( rc!=SQLITE_OK ){ + return rc; + } + } + assert( pPg->dirty==0 ); + + /* If the page we are recycling is marked as alwaysRollback, then + ** set the global alwaysRollback flag, thus disabling the + ** sqlite3PagerDontRollback() optimization for the rest of this transaction. + ** It is necessary to do this because the page marked alwaysRollback + ** might be reloaded at a later time but at that point we won't remember + ** that is was marked alwaysRollback. This means that all pages must + ** be marked as alwaysRollback from here on out. + */ + if( pPg->alwaysRollback ){ + IOTRACE(("ALWAYS_ROLLBACK %p\n", pPager)) + pPager->alwaysRollback = 1; + } + + /* Unlink the old page from the free list and the hash table + */ + unlinkPage(pPg); + assert( pPg->pgno==0 ); + + *ppPg = pPg; + return SQLITE_OK; +} + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* +** This function is called to free superfluous dynamically allocated memory +** held by the pager system. Memory in use by any SQLite pager allocated +** by the current thread may be sqlite3_free()ed. +** +** nReq is the number of bytes of memory required. Once this much has +** been released, the function returns. The return value is the total number +** of bytes of memory released. +*/ +int sqlite3PagerReleaseMemory(int nReq){ + int nReleased = 0; /* Bytes of memory released so far */ + sqlite3_mutex *mutex; /* The MEM2 mutex */ + Pager *pPager; /* For looping over pagers */ + int rc = SQLITE_OK; + + /* Acquire the memory-management mutex + */ + mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); + sqlite3_mutex_enter(mutex); + + /* Signal all database connections that memory management wants + ** to have access to the pagers. + */ + for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){ + pPager->iInUseMM = 1; + } + + while( rc==SQLITE_OK && (nReq<0 || nReleasedneedSync || pPg->pPager->iInUseDB) ){ + pPg = pPg->gfree.pNext; + } + if( !pPg ){ + pPg = sqlite3LruPageList.pFirst; + while( pPg && pPg->pPager->iInUseDB ){ + pPg = pPg->gfree.pNext; + } + } + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); + + /* If pPg==0, then the block above has failed to find a page to + ** recycle. In this case return early - no further memory will + ** be released. + */ + if( !pPg ) break; + + pPager = pPg->pPager; + assert(!pPg->needSync || pPg==pPager->lru.pFirst); + assert(pPg->needSync || pPg==pPager->lru.pFirstSynced); + + rc = pager_recycle(pPager, &pRecycled); + assert(pRecycled==pPg || rc!=SQLITE_OK); + if( rc==SQLITE_OK ){ + /* We've found a page to free. At this point the page has been + ** removed from the page hash-table, free-list and synced-list + ** (pFirstSynced). It is still in the all pages (pAll) list. + ** Remove it from this list before freeing. + ** + ** Todo: Check the Pager.pStmt list to make sure this is Ok. It + ** probably is though. + */ + PgHdr *pTmp; + assert( pPg ); + if( pPg==pPager->pAll ){ + pPager->pAll = pPg->pNextAll; + }else{ + for( pTmp=pPager->pAll; pTmp->pNextAll!=pPg; pTmp=pTmp->pNextAll ){} + pTmp->pNextAll = pPg->pNextAll; + } + nReleased += ( + sizeof(*pPg) + pPager->pageSize + + sizeof(u32) + pPager->nExtra + + MEMDB*sizeof(PgHistory) + ); + IOTRACE(("PGFREE %p %d *\n", pPager, pPg->pgno)); + PAGER_INCR(sqlite3_pager_pgfree_count); + sqlite3_free(pPg->pData); + sqlite3_free(pPg); + pPager->nPage--; + }else{ + /* An error occured whilst writing to the database file or + ** journal in pager_recycle(). The error is not returned to the + ** caller of this function. Instead, set the Pager.errCode variable. + ** The error will be returned to the user (or users, in the case + ** of a shared pager cache) of the pager for which the error occured. + */ + assert( + (rc&0xff)==SQLITE_IOERR || + rc==SQLITE_FULL || + rc==SQLITE_BUSY + ); + assert( pPager->state>=PAGER_RESERVED ); + pager_error(pPager, rc); + } + } + + /* Clear the memory management flags and release the mutex + */ + for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){ + pPager->iInUseMM = 0; + } + sqlite3_mutex_leave(mutex); + + /* Return the number of bytes released + */ + return nReleased; +} +#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */ + +/* +** Read the content of page pPg out of the database file. +*/ +static int readDbPage(Pager *pPager, PgHdr *pPg, Pgno pgno){ + int rc; + i64 offset; + assert( MEMDB==0 ); + assert(pPager->fd->pMethods||pPager->tempFile); + if( !pPager->fd->pMethods ){ + return SQLITE_IOERR_SHORT_READ; + } + offset = (pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsRead(pPager->fd, PGHDR_TO_DATA(pPg), pPager->pageSize, offset); + PAGER_INCR(sqlite3_pager_readdb_count); + PAGER_INCR(pPager->nRead); + IOTRACE(("PGIN %p %d\n", pPager, pgno)); + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &((u8*)PGHDR_TO_DATA(pPg))[24], + sizeof(pPager->dbFileVers)); + } + CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); + PAGERTRACE4("FETCH %d page %d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, pager_pagehash(pPg)); + return rc; +} + + +/* +** This function is called to obtain the shared lock required before +** data may be read from the pager cache. If the shared lock has already +** been obtained, this function is a no-op. +** +** Immediately after obtaining the shared lock (if required), this function +** checks for a hot-journal file. If one is found, an emergency rollback +** is performed immediately. +*/ +static int pagerSharedLock(Pager *pPager){ + int rc = SQLITE_OK; + int isHot = 0; + + /* If this database is opened for exclusive access, has no outstanding + ** page references and is in an error-state, now is the chance to clear + ** the error. Discard the contents of the pager-cache and treat any + ** open journal file as a hot-journal. + */ + if( !MEMDB && pPager->exclusiveMode && pPager->nRef==0 && pPager->errCode ){ + if( pPager->journalOpen ){ + isHot = 1; + } + pager_reset(pPager); + pPager->errCode = SQLITE_OK; + } + + /* If the pager is still in an error state, do not proceed. The error + ** state will be cleared at some point in the future when all page + ** references are dropped and the cache can be discarded. + */ + if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ + return pPager->errCode; + } + + if( pPager->state==PAGER_UNLOCK || isHot ){ + sqlite3_vfs *pVfs = pPager->pVfs; + if( !MEMDB ){ + assert( pPager->nRef==0 ); + if( !pPager->noReadlock ){ + rc = pager_wait_on_lock(pPager, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + return pager_error(pPager, rc); + } + assert( pPager->state>=SHARED_LOCK ); + } + + /* If a journal file exists, and there is no RESERVED lock on the + ** database file, then it either needs to be played back or deleted. + */ + if( hasHotJournal(pPager) || isHot ){ + /* Get an EXCLUSIVE lock on the database file. At this point it is + ** important that a RESERVED lock is not obtained on the way to the + ** EXCLUSIVE lock. If it were, another process might open the + ** database file, detect the RESERVED lock, and conclude that the + ** database is safe to read while this process is still rolling it + ** back. + ** + ** Because the intermediate RESERVED lock is not requested, the + ** second process will get to this point in the code and fail to + ** obtain it's own EXCLUSIVE lock on the database file. + */ + if( pPager->statefd, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + pager_unlock(pPager); + return pager_error(pPager, rc); + } + pPager->state = PAGER_EXCLUSIVE; + } + + /* Open the journal for reading only. Return SQLITE_BUSY if + ** we are unable to open the journal file. + ** + ** The journal file does not need to be locked itself. The + ** journal file is never open unless the main database file holds + ** a write lock, so there is never any chance of two or more + ** processes opening the journal at the same time. + ** + ** Open the journal for read/write access. This is because in + ** exclusive-access mode the file descriptor will be kept open and + ** possibly used for a transaction later on. On some systems, the + ** OsTruncate() call used in exclusive-access mode also requires + ** a read/write file handle. + */ + if( !isHot ){ + rc = SQLITE_BUSY; + if( sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS) ){ + int fout = 0; + int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL; + assert( !pPager->tempFile ); + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); + assert( rc!=SQLITE_OK || pPager->jfd->pMethods ); + if( fout&SQLITE_OPEN_READONLY ){ + rc = SQLITE_BUSY; + sqlite3OsClose(pPager->jfd); + } + } + } + if( rc!=SQLITE_OK ){ + pager_unlock(pPager); + return ((rc==SQLITE_NOMEM||rc==SQLITE_IOERR_NOMEM)?rc:SQLITE_BUSY); + } + pPager->journalOpen = 1; + pPager->journalStarted = 0; + pPager->journalOff = 0; + pPager->setMaster = 0; + pPager->journalHdr = 0; + + /* Playback and delete the journal. Drop the database write + ** lock and reacquire the read lock. + */ + rc = pager_playback(pPager, 1); + if( rc!=SQLITE_OK ){ + return pager_error(pPager, rc); + } + assert(pPager->state==PAGER_SHARED || + (pPager->exclusiveMode && pPager->state>PAGER_SHARED) + ); + } + + if( pPager->pAll ){ + /* The shared-lock has just been acquired on the database file + ** and there are already pages in the cache (from a previous + ** read or write transaction). Check to see if the database + ** has been modified. If the database has changed, flush the + ** cache. + ** + ** Database changes is detected by looking at 15 bytes beginning + ** at offset 24 into the file. The first 4 of these 16 bytes are + ** a 32-bit counter that is incremented with each change. The + ** other bytes change randomly with each file change when + ** a codec is in use. + ** + ** There is a vanishingly small chance that a change will not be + ** detected. The chance of an undetected change is so small that + ** it can be neglected. + */ + char dbFileVers[sizeof(pPager->dbFileVers)]; + sqlite3PagerPagecount(pPager); + + if( pPager->errCode ){ + return pPager->errCode; + } + + if( pPager->dbSize>0 ){ + IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); + rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + memset(dbFileVers, 0, sizeof(dbFileVers)); + } + + if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ + pager_reset(pPager); + } + } + } + assert( pPager->exclusiveMode || pPager->state<=PAGER_SHARED ); + if( pPager->state==PAGER_UNLOCK ){ + pPager->state = PAGER_SHARED; + } + } + + return rc; +} + +/* +** Allocate a PgHdr object. Either create a new one or reuse +** an existing one that is not otherwise in use. +** +** A new PgHdr structure is created if any of the following are +** true: +** +** (1) We have not exceeded our maximum allocated cache size +** as set by the "PRAGMA cache_size" command. +** +** (2) There are no unused PgHdr objects available at this time. +** +** (3) This is an in-memory database. +** +** (4) There are no PgHdr objects that do not require a journal +** file sync and a sync of the journal file is currently +** prohibited. +** +** Otherwise, reuse an existing PgHdr. In other words, reuse an +** existing PgHdr if all of the following are true: +** +** (1) We have reached or exceeded the maximum cache size +** allowed by "PRAGMA cache_size". +** +** (2) There is a PgHdr available with PgHdr->nRef==0 +** +** (3) We are not in an in-memory database +** +** (4) Either there is an available PgHdr that does not need +** to be synced to disk or else disk syncing is currently +** allowed. +*/ +static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){ + int rc = SQLITE_OK; + PgHdr *pPg; + void *pData; + + /* Create a new PgHdr if any of the four conditions defined + ** above are met: */ + if( pPager->nPagemxPage + || pPager->lru.pFirst==0 + || MEMDB + || (pPager->lru.pFirstSynced==0 && pPager->doNotSync) + ){ + if( pPager->nPage>=pPager->nHash ){ + pager_resize_hash_table(pPager, + pPager->nHash<256 ? 256 : pPager->nHash*2); + if( pPager->nHash==0 ){ + rc = SQLITE_NOMEM; + goto pager_allocate_out; + } + } + pagerLeave(pPager); + pPg = sqlite3_malloc( sizeof(*pPg) + sizeof(u32) + pPager->nExtra + + MEMDB*sizeof(PgHistory) ); + if( pPg ){ + pData = sqlite3_malloc( pPager->pageSize ); + if( pData==0 ){ + sqlite3_free(pPg); + pPg = 0; + } + } + pagerEnter(pPager); + if( pPg==0 ){ + rc = SQLITE_NOMEM; + goto pager_allocate_out; + } + memset(pPg, 0, sizeof(*pPg)); + if( MEMDB ){ + memset(PGHDR_TO_HIST(pPg, pPager), 0, sizeof(PgHistory)); + } + pPg->pData = pData; + pPg->pPager = pPager; + pPg->pNextAll = pPager->pAll; + pPager->pAll = pPg; + pPager->nPage++; + }else{ + /* Recycle an existing page with a zero ref-count. */ + rc = pager_recycle(pPager, &pPg); + if( rc==SQLITE_BUSY ){ + rc = SQLITE_IOERR_BLOCKED; + } + if( rc!=SQLITE_OK ){ + goto pager_allocate_out; + } + assert( pPager->state>=SHARED_LOCK ); + assert(pPg); + } + *ppPg = pPg; + +pager_allocate_out: + return rc; +} + +/* +** Make sure we have the content for a page. If the page was +** previously acquired with noContent==1, then the content was +** just initialized to zeros instead of being read from disk. +** But now we need the real data off of disk. So make sure we +** have it. Read it in if we do not have it already. +*/ +static int pager_get_content(PgHdr *pPg){ + if( pPg->needRead ){ + int rc = readDbPage(pPg->pPager, pPg, pPg->pgno); + if( rc==SQLITE_OK ){ + pPg->needRead = 0; + }else{ + return rc; + } + } + return SQLITE_OK; +} + +/* +** Acquire a page. +** +** A read lock on the disk file is obtained when the first page is acquired. +** This read lock is dropped when the last page is released. +** +** This routine works for any page number greater than 0. If the database +** file is smaller than the requested page, then no actual disk +** read occurs and the memory image of the page is initialized to +** all zeros. The extra data appended to a page is always initialized +** to zeros the first time a page is loaded into memory. +** +** The acquisition might fail for several reasons. In all cases, +** an appropriate error code is returned and *ppPage is set to NULL. +** +** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt +** to find a page in the in-memory cache first. If the page is not already +** in memory, this routine goes to disk to read it in whereas Lookup() +** just returns 0. This routine acquires a read-lock the first time it +** has to go to disk, and could also playback an old journal if necessary. +** Since Lookup() never goes to disk, it never has to deal with locks +** or journal files. +** +** If noContent is false, the page contents are actually read from disk. +** If noContent is true, it means that we do not care about the contents +** of the page at this time, so do not do a disk read. Just fill in the +** page content with zeros. But mark the fact that we have not read the +** content by setting the PgHdr.needRead flag. Later on, if +** sqlite3PagerWrite() is called on this page or if this routine is +** called again with noContent==0, that means that the content is needed +** and the disk read should occur at that point. +*/ +static int pagerAcquire( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int noContent /* Do not bother reading content from disk if true */ +){ + PgHdr *pPg; + int rc; + + assert( pPager->state==PAGER_UNLOCK || pPager->nRef>0 || pgno==1 ); + + /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page + ** number greater than this, or zero, is requested. + */ + if( pgno>PAGER_MAX_PGNO || pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + return SQLITE_CORRUPT_BKPT; + } + + /* Make sure we have not hit any critical errors. + */ + assert( pPager!=0 ); + *ppPage = 0; + + /* If this is the first page accessed, then get a SHARED lock + ** on the database file. pagerSharedLock() is a no-op if + ** a database lock is already held. + */ + rc = pagerSharedLock(pPager); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pPager->state!=PAGER_UNLOCK ); + + pPg = pager_lookup(pPager, pgno); + if( pPg==0 ){ + /* The requested page is not in the page cache. */ + int nMax; + int h; + PAGER_INCR(pPager->nMiss); + rc = pagerAllocatePage(pPager, &pPg); + if( rc!=SQLITE_OK ){ + return rc; + } + + pPg->pgno = pgno; + assert( !MEMDB || pgno>pPager->stmtSize ); + if( pPager->aInJournal && (int)pgno<=pPager->origDbSize ){ +#if 0 + sqlite3CheckMemory(pPager->aInJournal, pgno/8); +#endif + assert( pPager->journalOpen ); + pPg->inJournal = (pPager->aInJournal[pgno/8] & (1<<(pgno&7)))!=0; + pPg->needSync = 0; + }else{ + pPg->inJournal = 0; + pPg->needSync = 0; + } + + makeClean(pPg); + pPg->nRef = 1; + REFINFO(pPg); + + pPager->nRef++; + if( pPager->nExtra>0 ){ + memset(PGHDR_TO_EXTRA(pPg, pPager), 0, pPager->nExtra); + } + nMax = sqlite3PagerPagecount(pPager); + if( pPager->errCode ){ + rc = pPager->errCode; + sqlite3PagerUnref(pPg); + return rc; + } + + /* Populate the page with data, either by reading from the database + ** file, or by setting the entire page to zero. + */ + if( nMax<(int)pgno || MEMDB || (noContent && !pPager->alwaysRollback) ){ + if( pgno>pPager->mxPgno ){ + sqlite3PagerUnref(pPg); + return SQLITE_FULL; + } + memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize); + pPg->needRead = noContent && !pPager->alwaysRollback; + IOTRACE(("ZERO %p %d\n", pPager, pgno)); + }else{ + rc = readDbPage(pPager, pPg, pgno); + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + pPg->pgno = 0; + sqlite3PagerUnref(pPg); + return rc; + } + pPg->needRead = 0; + } + + /* Link the page into the page hash table */ + h = pgno & (pPager->nHash-1); + assert( pgno!=0 ); + pPg->pNextHash = pPager->aHash[h]; + pPager->aHash[h] = pPg; + if( pPg->pNextHash ){ + assert( pPg->pNextHash->pPrevHash==0 ); + pPg->pNextHash->pPrevHash = pPg; + } + +#ifdef SQLITE_CHECK_PAGES + pPg->pageHash = pager_pagehash(pPg); +#endif + }else{ + /* The requested page is in the page cache. */ + assert(pPager->nRef>0 || pgno==1); + PAGER_INCR(pPager->nHit); + if( !noContent ){ + rc = pager_get_content(pPg); + if( rc ){ + return rc; + } + } + page_ref(pPg); + } + *ppPage = pPg; + return SQLITE_OK; +} +int sqlite3PagerAcquire( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int noContent /* Do not bother reading content from disk if true */ +){ + int rc; + pagerEnter(pPager); + rc = pagerAcquire(pPager, pgno, ppPage, noContent); + pagerLeave(pPager); + return rc; +} + + +/* +** Acquire a page if it is already in the in-memory cache. Do +** not read the page from disk. Return a pointer to the page, +** or 0 if the page is not in cache. +** +** See also sqlite3PagerGet(). The difference between this routine +** and sqlite3PagerGet() is that _get() will go to the disk and read +** in the page if the page is not already in cache. This routine +** returns NULL if the page is not in cache or if a disk I/O error +** has ever happened. +*/ +DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ + PgHdr *pPg = 0; + + assert( pPager!=0 ); + assert( pgno!=0 ); + + pagerEnter(pPager); + if( pPager->state==PAGER_UNLOCK ){ + assert( !pPager->pAll || pPager->exclusiveMode ); + }else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ + /* Do nothing */ + }else if( (pPg = pager_lookup(pPager, pgno))!=0 ){ + page_ref(pPg); + } + pagerLeave(pPager); + return pPg; +} + +/* +** Release a page. +** +** If the number of references to the page drop to zero, then the +** page is added to the LRU list. When all references to all pages +** are released, a rollback occurs and the lock on the database is +** removed. +*/ +int sqlite3PagerUnref(DbPage *pPg){ + Pager *pPager = pPg->pPager; + + /* Decrement the reference count for this page + */ + assert( pPg->nRef>0 ); + pagerEnter(pPg->pPager); + pPg->nRef--; + REFINFO(pPg); + + CHECK_PAGE(pPg); + + /* When the number of references to a page reach 0, call the + ** destructor and add the page to the freelist. + */ + if( pPg->nRef==0 ){ + + lruListAdd(pPg); + if( pPager->xDestructor ){ + pPager->xDestructor(pPg, pPager->pageSize); + } + + /* When all pages reach the freelist, drop the read lock from + ** the database file. + */ + pPager->nRef--; + assert( pPager->nRef>=0 ); + if( pPager->nRef==0 && (!pPager->exclusiveMode || pPager->journalOff>0) ){ + pagerUnlockAndRollback(pPager); + } + } + pagerLeave(pPager); + return SQLITE_OK; +} + +/* +** Create a journal file for pPager. There should already be a RESERVED +** or EXCLUSIVE lock on the database file when this routine is called. +** +** Return SQLITE_OK if everything. Return an error code and release the +** write lock if anything goes wrong. +*/ +static int pager_open_journal(Pager *pPager){ + sqlite3_vfs *pVfs = pPager->pVfs; + int flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_CREATE); + + int rc; + assert( !MEMDB ); + assert( pPager->state>=PAGER_RESERVED ); + assert( pPager->journalOpen==0 ); + assert( pPager->useJournal ); + assert( pPager->aInJournal==0 ); + sqlite3PagerPagecount(pPager); + pagerLeave(pPager); + pPager->aInJournal = sqlite3MallocZero( pPager->dbSize/8 + 1 ); + pagerEnter(pPager); + if( pPager->aInJournal==0 ){ + rc = SQLITE_NOMEM; + goto failed_to_open_journal; + } + + if( pPager->tempFile ){ + flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + }else{ + flags |= (SQLITE_OPEN_MAIN_JOURNAL); + } +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + rc = sqlite3JournalOpen( + pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) + ); +#else + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); +#endif + assert( rc!=SQLITE_OK || pPager->jfd->pMethods ); + pPager->journalOff = 0; + pPager->setMaster = 0; + pPager->journalHdr = 0; + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OsDelete(pVfs, pPager->zJournal, 0); + } + goto failed_to_open_journal; + } + pPager->journalOpen = 1; + pPager->journalStarted = 0; + pPager->needSync = 0; + pPager->alwaysRollback = 0; + pPager->nRec = 0; + if( pPager->errCode ){ + rc = pPager->errCode; + goto failed_to_open_journal; + } + pPager->origDbSize = pPager->dbSize; + + rc = writeJournalHdr(pPager); + + if( pPager->stmtAutoopen && rc==SQLITE_OK ){ + rc = sqlite3PagerStmtBegin(pPager); + } + if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && rc!=SQLITE_IOERR_NOMEM ){ + rc = pager_end_transaction(pPager); + if( rc==SQLITE_OK ){ + rc = SQLITE_FULL; + } + } + return rc; + +failed_to_open_journal: + sqlite3_free(pPager->aInJournal); + pPager->aInJournal = 0; + return rc; +} + +/* +** Acquire a write-lock on the database. The lock is removed when +** the any of the following happen: +** +** * sqlite3PagerCommitPhaseTwo() is called. +** * sqlite3PagerRollback() is called. +** * sqlite3PagerClose() is called. +** * sqlite3PagerUnref() is called to on every outstanding page. +** +** The first parameter to this routine is a pointer to any open page of the +** database file. Nothing changes about the page - it is used merely to +** acquire a pointer to the Pager structure and as proof that there is +** already a read-lock on the database. +** +** The second parameter indicates how much space in bytes to reserve for a +** master journal file-name at the start of the journal when it is created. +** +** A journal file is opened if this is not a temporary file. For temporary +** files, the opening of the journal file is deferred until there is an +** actual need to write to the journal. +** +** If the database is already reserved for writing, this routine is a no-op. +** +** If exFlag is true, go ahead and get an EXCLUSIVE lock on the file +** immediately instead of waiting until we try to flush the cache. The +** exFlag is ignored if a transaction is already active. +*/ +int sqlite3PagerBegin(DbPage *pPg, int exFlag){ + Pager *pPager = pPg->pPager; + int rc = SQLITE_OK; + pagerEnter(pPager); + assert( pPg->nRef>0 ); + assert( pPager->state!=PAGER_UNLOCK ); + if( pPager->state==PAGER_SHARED ){ + assert( pPager->aInJournal==0 ); + if( MEMDB ){ + pPager->state = PAGER_EXCLUSIVE; + pPager->origDbSize = pPager->dbSize; + }else{ + rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK); + if( rc==SQLITE_OK ){ + pPager->state = PAGER_RESERVED; + if( exFlag ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + if( rc!=SQLITE_OK ){ + pagerLeave(pPager); + return rc; + } + pPager->dirtyCache = 0; + PAGERTRACE2("TRANSACTION %d\n", PAGERID(pPager)); + if( pPager->useJournal && !pPager->tempFile ){ + rc = pager_open_journal(pPager); + } + } + }else if( pPager->journalOpen && pPager->journalOff==0 ){ + /* This happens when the pager was in exclusive-access mode last + ** time a (read or write) transaction was successfully concluded + ** by this connection. Instead of deleting the journal file it was + ** kept open and truncated to 0 bytes. + */ + assert( pPager->nRec==0 ); + assert( pPager->origDbSize==0 ); + assert( pPager->aInJournal==0 ); + sqlite3PagerPagecount(pPager); + pagerLeave(pPager); + pPager->aInJournal = sqlite3MallocZero( pPager->dbSize/8 + 1 ); + pagerEnter(pPager); + if( !pPager->aInJournal ){ + rc = SQLITE_NOMEM; + }else{ + pPager->origDbSize = pPager->dbSize; + rc = writeJournalHdr(pPager); + } + } + assert( !pPager->journalOpen || pPager->journalOff>0 || rc!=SQLITE_OK ); + pagerLeave(pPager); + return rc; +} + +/* +** Make a page dirty. Set its dirty flag and add it to the dirty +** page list. +*/ +static void makeDirty(PgHdr *pPg){ + if( pPg->dirty==0 ){ + Pager *pPager = pPg->pPager; + pPg->dirty = 1; + pPg->pDirty = pPager->pDirty; + if( pPager->pDirty ){ + pPager->pDirty->pPrevDirty = pPg; + } + pPg->pPrevDirty = 0; + pPager->pDirty = pPg; + } +} + +/* +** Make a page clean. Clear its dirty bit and remove it from the +** dirty page list. +*/ +static void makeClean(PgHdr *pPg){ + if( pPg->dirty ){ + pPg->dirty = 0; + if( pPg->pDirty ){ + assert( pPg->pDirty->pPrevDirty==pPg ); + pPg->pDirty->pPrevDirty = pPg->pPrevDirty; + } + if( pPg->pPrevDirty ){ + assert( pPg->pPrevDirty->pDirty==pPg ); + pPg->pPrevDirty->pDirty = pPg->pDirty; + }else{ + assert( pPg->pPager->pDirty==pPg ); + pPg->pPager->pDirty = pPg->pDirty; + } + } +} + + +/* +** Mark a data page as writeable. The page is written into the journal +** if it is not there already. This routine must be called before making +** changes to a page. +** +** The first time this routine is called, the pager creates a new +** journal and acquires a RESERVED lock on the database. If the RESERVED +** lock could not be acquired, this routine returns SQLITE_BUSY. The +** calling routine must check for that return value and be careful not to +** change any page data until this routine returns SQLITE_OK. +** +** If the journal file could not be written because the disk is full, +** then this routine returns SQLITE_FULL and does an immediate rollback. +** All subsequent write attempts also return SQLITE_FULL until there +** is a call to sqlite3PagerCommit() or sqlite3PagerRollback() to +** reset. +*/ +static int pager_write(PgHdr *pPg){ + void *pData = PGHDR_TO_DATA(pPg); + Pager *pPager = pPg->pPager; + int rc = SQLITE_OK; + + /* Check for errors + */ + if( pPager->errCode ){ + return pPager->errCode; + } + if( pPager->readOnly ){ + return SQLITE_PERM; + } + + assert( !pPager->setMaster ); + + CHECK_PAGE(pPg); + + /* If this page was previously acquired with noContent==1, that means + ** we didn't really read in the content of the page. This can happen + ** (for example) when the page is being moved to the freelist. But + ** now we are (perhaps) moving the page off of the freelist for + ** reuse and we need to know its original content so that content + ** can be stored in the rollback journal. So do the read at this + ** time. + */ + rc = pager_get_content(pPg); + if( rc ){ + return rc; + } + + /* Mark the page as dirty. If the page has already been written + ** to the journal then we can return right away. + */ + makeDirty(pPg); + if( pPg->inJournal && (pageInStatement(pPg) || pPager->stmtInUse==0) ){ + pPager->dirtyCache = 1; + }else{ + + /* If we get this far, it means that the page needs to be + ** written to the transaction journal or the ckeckpoint journal + ** or both. + ** + ** First check to see that the transaction journal exists and + ** create it if it does not. + */ + assert( pPager->state!=PAGER_UNLOCK ); + rc = sqlite3PagerBegin(pPg, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pPager->state>=PAGER_RESERVED ); + if( !pPager->journalOpen && pPager->useJournal ){ + rc = pager_open_journal(pPager); + if( rc!=SQLITE_OK ) return rc; + } + assert( pPager->journalOpen || !pPager->useJournal ); + pPager->dirtyCache = 1; + + /* The transaction journal now exists and we have a RESERVED or an + ** EXCLUSIVE lock on the main database file. Write the current page to + ** the transaction journal if it is not there already. + */ + if( !pPg->inJournal && (pPager->useJournal || MEMDB) ){ + if( (int)pPg->pgno <= pPager->origDbSize ){ + if( MEMDB ){ + PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); + PAGERTRACE3("JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); + assert( pHist->pOrig==0 ); + pHist->pOrig = sqlite3_malloc( pPager->pageSize ); + if( pHist->pOrig ){ + memcpy(pHist->pOrig, PGHDR_TO_DATA(pPg), pPager->pageSize); + } + }else{ + u32 cksum; + char *pData2; + + /* We should never write to the journal file the page that + ** contains the database locks. The following assert verifies + ** that we do not. */ + assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + pData2 = CODEC2(pPager, pData, pPg->pgno, 7); + cksum = pager_cksum(pPager, (u8*)pData2); + rc = write32bits(pPager->jfd, pPager->journalOff, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, + pPager->journalOff + 4); + pPager->journalOff += pPager->pageSize+4; + } + if( rc==SQLITE_OK ){ + rc = write32bits(pPager->jfd, pPager->journalOff, cksum); + pPager->journalOff += 4; + } + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + pPager->journalOff, pPager->pageSize)); + PAGER_INCR(sqlite3_pager_writej_count); + PAGERTRACE5("JOURNAL %d page %d needSync=%d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, pPg->needSync, pager_pagehash(pPg)); + + /* An error has occured writing to the journal file. The + ** transaction will be rolled back by the layer above. + */ + if( rc!=SQLITE_OK ){ + return rc; + } + + pPager->nRec++; + assert( pPager->aInJournal!=0 ); + pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7); + pPg->needSync = !pPager->noSync; + if( pPager->stmtInUse ){ + pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); + } + } + }else{ + pPg->needSync = !pPager->journalStarted && !pPager->noSync; + PAGERTRACE4("APPEND %d page %d needSync=%d\n", + PAGERID(pPager), pPg->pgno, pPg->needSync); + } + if( pPg->needSync ){ + pPager->needSync = 1; + } + pPg->inJournal = 1; + } + + /* If the statement journal is open and the page is not in it, + ** then write the current page to the statement journal. Note that + ** the statement journal format differs from the standard journal format + ** in that it omits the checksums and the header. + */ + if( pPager->stmtInUse + && !pageInStatement(pPg) + && (int)pPg->pgno<=pPager->stmtSize + ){ + assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize ); + if( MEMDB ){ + PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); + assert( pHist->pStmt==0 ); + pHist->pStmt = sqlite3_malloc( pPager->pageSize ); + if( pHist->pStmt ){ + memcpy(pHist->pStmt, PGHDR_TO_DATA(pPg), pPager->pageSize); + } + PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); + page_add_to_stmt_list(pPg); + }else{ + i64 offset = pPager->stmtNRec*(4+pPager->pageSize); + char *pData2 = CODEC2(pPager, pData, pPg->pgno, 7); + rc = write32bits(pPager->stfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->stfd, pData2, pPager->pageSize, offset+4); + } + PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); + if( rc!=SQLITE_OK ){ + return rc; + } + pPager->stmtNRec++; + assert( pPager->aInStmt!=0 ); + pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); + } + } + } + + /* Update the database size and return. + */ + assert( pPager->state>=PAGER_SHARED ); + if( pPager->dbSize<(int)pPg->pgno ){ + pPager->dbSize = pPg->pgno; + if( !MEMDB && pPager->dbSize==PENDING_BYTE/pPager->pageSize ){ + pPager->dbSize++; + } + } + return rc; +} + +/* +** This function is used to mark a data-page as writable. It uses +** pager_write() to open a journal file (if it is not already open) +** and write the page *pData to the journal. +** +** The difference between this function and pager_write() is that this +** function also deals with the special case where 2 or more pages +** fit on a single disk sector. In this case all co-resident pages +** must have been written to the journal file before returning. +*/ +int sqlite3PagerWrite(DbPage *pDbPage){ + int rc = SQLITE_OK; + + PgHdr *pPg = pDbPage; + Pager *pPager = pPg->pPager; + Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); + + pagerEnter(pPager); + if( !MEMDB && nPagePerSector>1 ){ + Pgno nPageCount; /* Total number of pages in database file */ + Pgno pg1; /* First page of the sector pPg is located on. */ + int nPage; /* Number of pages starting at pg1 to journal */ + int ii; + int needSync = 0; + + /* Set the doNotSync flag to 1. This is because we cannot allow a journal + ** header to be written between the pages journaled by this function. + */ + assert( pPager->doNotSync==0 ); + pPager->doNotSync = 1; + + /* This trick assumes that both the page-size and sector-size are + ** an integer power of 2. It sets variable pg1 to the identifier + ** of the first page of the sector pPg is located on. + */ + pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; + + nPageCount = sqlite3PagerPagecount(pPager); + if( pPg->pgno>nPageCount ){ + nPage = (pPg->pgno - pg1)+1; + }else if( (pg1+nPagePerSector-1)>nPageCount ){ + nPage = nPageCount+1-pg1; + }else{ + nPage = nPagePerSector; + } + assert(nPage>0); + assert(pg1<=pPg->pgno); + assert((pg1+nPage)>pPg->pgno); + + for(ii=0; iiaInJournal || pg==pPg->pgno || + pg>pPager->origDbSize || !(pPager->aInJournal[pg/8]&(1<<(pg&7))) + ) { + if( pg!=PAGER_MJ_PGNO(pPager) ){ + rc = sqlite3PagerGet(pPager, pg, &pPage); + if( rc==SQLITE_OK ){ + rc = pager_write(pPage); + if( pPage->needSync ){ + needSync = 1; + } + sqlite3PagerUnref(pPage); + } + } + }else if( (pPage = pager_lookup(pPager, pg)) ){ + if( pPage->needSync ){ + needSync = 1; + } + } + } + + /* If the PgHdr.needSync flag is set for any of the nPage pages + ** starting at pg1, then it needs to be set for all of them. Because + ** writing to any of these nPage pages may damage the others, the + ** journal file must contain sync()ed copies of all of them + ** before any of them can be written out to the database file. + */ + if( needSync ){ + for(ii=0; iineedSync = 1; + } + assert(pPager->needSync); + } + + assert( pPager->doNotSync==1 ); + pPager->doNotSync = 0; + }else{ + rc = pager_write(pDbPage); + } + pagerLeave(pPager); + return rc; +} + +/* +** Return TRUE if the page given in the argument was previously passed +** to sqlite3PagerWrite(). In other words, return TRUE if it is ok +** to change the content of the page. +*/ +#ifndef NDEBUG +int sqlite3PagerIswriteable(DbPage *pPg){ + return pPg->dirty; +} +#endif + +#ifndef SQLITE_OMIT_VACUUM +/* +** Replace the content of a single page with the information in the third +** argument. +*/ +int sqlite3PagerOverwrite(Pager *pPager, Pgno pgno, void *pData){ + PgHdr *pPg; + int rc; + + pagerEnter(pPager); + rc = sqlite3PagerGet(pPager, pgno, &pPg); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg); + if( rc==SQLITE_OK ){ + memcpy(sqlite3PagerGetData(pPg), pData, pPager->pageSize); + } + sqlite3PagerUnref(pPg); + } + pagerLeave(pPager); + return rc; +} +#endif + +/* +** A call to this routine tells the pager that it is not necessary to +** write the information on page pPg back to the disk, even though +** that page might be marked as dirty. +** +** The overlying software layer calls this routine when all of the data +** on the given page is unused. The pager marks the page as clean so +** that it does not get written to disk. +** +** Tests show that this optimization, together with the +** sqlite3PagerDontRollback() below, more than double the speed +** of large INSERT operations and quadruple the speed of large DELETEs. +** +** When this routine is called, set the alwaysRollback flag to true. +** Subsequent calls to sqlite3PagerDontRollback() for the same page +** will thereafter be ignored. This is necessary to avoid a problem +** where a page with data is added to the freelist during one part of +** a transaction then removed from the freelist during a later part +** of the same transaction and reused for some other purpose. When it +** is first added to the freelist, this routine is called. When reused, +** the sqlite3PagerDontRollback() routine is called. But because the +** page contains critical data, we still need to be sure it gets +** rolled back in spite of the sqlite3PagerDontRollback() call. +*/ +void sqlite3PagerDontWrite(DbPage *pDbPage){ + PgHdr *pPg = pDbPage; + Pager *pPager = pPg->pPager; + + if( MEMDB ) return; + pagerEnter(pPager); + pPg->alwaysRollback = 1; + if( pPg->dirty && !pPager->stmtInUse ){ + assert( pPager->state>=PAGER_SHARED ); + if( pPager->dbSize==(int)pPg->pgno && pPager->origDbSizedbSize ){ + /* If this pages is the last page in the file and the file has grown + ** during the current transaction, then do NOT mark the page as clean. + ** When the database file grows, we must make sure that the last page + ** gets written at least once so that the disk file will be the correct + ** size. If you do not write this page and the size of the file + ** on the disk ends up being too small, that can lead to database + ** corruption during the next transaction. + */ + }else{ + PAGERTRACE3("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)); + IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) + makeClean(pPg); +#ifdef SQLITE_CHECK_PAGES + pPg->pageHash = pager_pagehash(pPg); +#endif + } + } + pagerLeave(pPager); +} + +/* +** A call to this routine tells the pager that if a rollback occurs, +** it is not necessary to restore the data on the given page. This +** means that the pager does not have to record the given page in the +** rollback journal. +** +** If we have not yet actually read the content of this page (if +** the PgHdr.needRead flag is set) then this routine acts as a promise +** that we will never need to read the page content in the future. +** so the needRead flag can be cleared at this point. +*/ +void sqlite3PagerDontRollback(DbPage *pPg){ + Pager *pPager = pPg->pPager; + + pagerEnter(pPager); + assert( pPager->state>=PAGER_RESERVED ); + if( pPager->journalOpen==0 ) return; + if( pPg->alwaysRollback || pPager->alwaysRollback || MEMDB ) return; + if( !pPg->inJournal && (int)pPg->pgno <= pPager->origDbSize ){ + assert( pPager->aInJournal!=0 ); + pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7); + pPg->inJournal = 1; + pPg->needRead = 0; + if( pPager->stmtInUse ){ + pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); + } + PAGERTRACE3("DONT_ROLLBACK page %d of %d\n", pPg->pgno, PAGERID(pPager)); + IOTRACE(("GARBAGE %p %d\n", pPager, pPg->pgno)) + } + if( pPager->stmtInUse + && !pageInStatement(pPg) + && (int)pPg->pgno<=pPager->stmtSize + ){ + assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize ); + assert( pPager->aInStmt!=0 ); + pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); + } + pagerLeave(pPager); +} + + +/* +** This routine is called to increment the database file change-counter, +** stored at byte 24 of the pager file. +*/ +static int pager_incr_changecounter(Pager *pPager, int isDirect){ + PgHdr *pPgHdr; + u32 change_counter; + int rc = SQLITE_OK; + + if( !pPager->changeCountDone ){ + /* Open page 1 of the file for writing. */ + rc = sqlite3PagerGet(pPager, 1, &pPgHdr); + if( rc!=SQLITE_OK ) return rc; + + if( !isDirect ){ + rc = sqlite3PagerWrite(pPgHdr); + if( rc!=SQLITE_OK ){ + sqlite3PagerUnref(pPgHdr); + return rc; + } + } + + /* Increment the value just read and write it back to byte 24. */ + change_counter = sqlite3Get4byte((u8*)pPager->dbFileVers); + change_counter++; + put32bits(((char*)PGHDR_TO_DATA(pPgHdr))+24, change_counter); + + if( isDirect && pPager->fd->pMethods ){ + const void *zBuf = PGHDR_TO_DATA(pPgHdr); + rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); + } + + /* Release the page reference. */ + sqlite3PagerUnref(pPgHdr); + pPager->changeCountDone = 1; + } + return rc; +} + +/* +** Sync the database file for the pager pPager. zMaster points to the name +** of a master journal file that should be written into the individual +** journal file. zMaster may be NULL, which is interpreted as no master +** journal (a single database transaction). +** +** This routine ensures that the journal is synced, all dirty pages written +** to the database file and the database file synced. The only thing that +** remains to commit the transaction is to delete the journal file (or +** master journal file if specified). +** +** Note that if zMaster==NULL, this does not overwrite a previous value +** passed to an sqlite3PagerCommitPhaseOne() call. +** +** If parameter nTrunc is non-zero, then the pager file is truncated to +** nTrunc pages (this is used by auto-vacuum databases). +*/ +int sqlite3PagerCommitPhaseOne(Pager *pPager, const char *zMaster, Pgno nTrunc){ + int rc = SQLITE_OK; + + PAGERTRACE4("DATABASE SYNC: File=%s zMaster=%s nTrunc=%d\n", + pPager->zFilename, zMaster, nTrunc); + pagerEnter(pPager); + + /* If this is an in-memory db, or no pages have been written to, or this + ** function has already been called, it is a no-op. + */ + if( pPager->state!=PAGER_SYNCED && !MEMDB && pPager->dirtyCache ){ + PgHdr *pPg; + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + /* The atomic-write optimization can be used if all of the + ** following are true: + ** + ** + The file-system supports the atomic-write property for + ** blocks of size page-size, and + ** + This commit is not part of a multi-file transaction, and + ** + Exactly one page has been modified and store in the journal file. + ** + ** If the optimization can be used, then the journal file will never + ** be created for this transaction. + */ + int useAtomicWrite = ( + !zMaster && + pPager->journalOff==jrnlBufferSize(pPager) && + nTrunc==0 && + (0==pPager->pDirty || 0==pPager->pDirty->pDirty) + ); + if( useAtomicWrite ){ + /* Update the nRec field in the journal file. */ + int offset = pPager->journalHdr + sizeof(aJournalMagic); + assert(pPager->nRec==1); + rc = write32bits(pPager->jfd, offset, pPager->nRec); + + /* Update the db file change counter. The following call will modify + ** the in-memory representation of page 1 to include the updated + ** change counter and then write page 1 directly to the database + ** file. Because of the atomic-write property of the host file-system, + ** this is safe. + */ + if( rc==SQLITE_OK ){ + rc = pager_incr_changecounter(pPager, 1); + } + }else{ + rc = sqlite3JournalCreate(pPager->jfd); + } + + if( !useAtomicWrite && rc==SQLITE_OK ) +#endif + + /* If a master journal file name has already been written to the + ** journal file, then no sync is required. This happens when it is + ** written, then the process fails to upgrade from a RESERVED to an + ** EXCLUSIVE lock. The next time the process tries to commit the + ** transaction the m-j name will have already been written. + */ + if( !pPager->setMaster ){ + assert( pPager->journalOpen ); + rc = pager_incr_changecounter(pPager, 0); + if( rc!=SQLITE_OK ) goto sync_exit; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( nTrunc!=0 ){ + /* If this transaction has made the database smaller, then all pages + ** being discarded by the truncation must be written to the journal + ** file. + */ + Pgno i; + int iSkip = PAGER_MJ_PGNO(pPager); + for( i=nTrunc+1; i<=pPager->origDbSize; i++ ){ + if( !(pPager->aInJournal[i/8] & (1<<(i&7))) && i!=iSkip ){ + rc = sqlite3PagerGet(pPager, i, &pPg); + if( rc!=SQLITE_OK ) goto sync_exit; + rc = sqlite3PagerWrite(pPg); + sqlite3PagerUnref(pPg); + if( rc!=SQLITE_OK ) goto sync_exit; + } + } + } +#endif + rc = writeMasterJournal(pPager, zMaster); + if( rc!=SQLITE_OK ) goto sync_exit; + rc = syncJournal(pPager); + } + if( rc!=SQLITE_OK ) goto sync_exit; + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( nTrunc!=0 ){ + rc = sqlite3PagerTruncate(pPager, nTrunc); + if( rc!=SQLITE_OK ) goto sync_exit; + } +#endif + + /* Write all dirty pages to the database file */ + pPg = pager_get_all_dirty_pages(pPager); + rc = pager_write_pagelist(pPg); + if( rc!=SQLITE_OK ){ + while( pPg && !pPg->dirty ){ pPg = pPg->pDirty; } + pPager->pDirty = pPg; + goto sync_exit; + } + pPager->pDirty = 0; + + /* Sync the database file. */ + if( !pPager->noSync ){ + rc = sqlite3OsSync(pPager->fd, pPager->sync_flags); + } + IOTRACE(("DBSYNC %p\n", pPager)) + + pPager->state = PAGER_SYNCED; + }else if( MEMDB && nTrunc!=0 ){ + rc = sqlite3PagerTruncate(pPager, nTrunc); + } + +sync_exit: + if( rc==SQLITE_IOERR_BLOCKED ){ + /* pager_incr_changecounter() may attempt to obtain an exclusive + * lock to spill the cache and return IOERR_BLOCKED. But since + * there is no chance the cache is inconsistent, it's + * better to return SQLITE_BUSY. + */ + rc = SQLITE_BUSY; + } + pagerLeave(pPager); + return rc; +} + + +/* +** Commit all changes to the database and release the write lock. +** +** If the commit fails for any reason, a rollback attempt is made +** and an error code is returned. If the commit worked, SQLITE_OK +** is returned. +*/ +int sqlite3PagerCommitPhaseTwo(Pager *pPager){ + int rc; + PgHdr *pPg; + + if( pPager->errCode ){ + return pPager->errCode; + } + if( pPager->statedirty = 0; + pPg->inJournal = 0; + pHist->inStmt = 0; + pPg->needSync = 0; + pHist->pPrevStmt = pHist->pNextStmt = 0; + pPg = pPg->pDirty; + } + pPager->pDirty = 0; +#ifndef NDEBUG + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); + assert( !pPg->alwaysRollback ); + assert( !pHist->pOrig ); + assert( !pHist->pStmt ); + } +#endif + pPager->pStmt = 0; + pPager->state = PAGER_SHARED; + return SQLITE_OK; + } + assert( pPager->journalOpen || !pPager->dirtyCache ); + assert( pPager->state==PAGER_SYNCED || !pPager->dirtyCache ); + rc = pager_end_transaction(pPager); + rc = pager_error(pPager, rc); + pagerLeave(pPager); + return rc; +} + +/* +** Rollback all changes. The database falls back to PAGER_SHARED mode. +** All in-memory cache pages revert to their original data contents. +** The journal is deleted. +** +** This routine cannot fail unless some other process is not following +** the correct locking protocol or unless some other +** process is writing trash into the journal file (SQLITE_CORRUPT) or +** unless a prior malloc() failed (SQLITE_NOMEM). Appropriate error +** codes are returned for all these occasions. Otherwise, +** SQLITE_OK is returned. +*/ +int sqlite3PagerRollback(Pager *pPager){ + int rc; + PAGERTRACE2("ROLLBACK %d\n", PAGERID(pPager)); + if( MEMDB ){ + PgHdr *p; + for(p=pPager->pAll; p; p=p->pNextAll){ + PgHistory *pHist; + assert( !p->alwaysRollback ); + if( !p->dirty ){ + assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pOrig ); + assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pStmt ); + continue; + } + + pHist = PGHDR_TO_HIST(p, pPager); + if( pHist->pOrig ){ + memcpy(PGHDR_TO_DATA(p), pHist->pOrig, pPager->pageSize); + PAGERTRACE3("ROLLBACK-PAGE %d of %d\n", p->pgno, PAGERID(pPager)); + }else{ + PAGERTRACE3("PAGE %d is clean on %d\n", p->pgno, PAGERID(pPager)); + } + clearHistory(pHist); + p->dirty = 0; + p->inJournal = 0; + pHist->inStmt = 0; + pHist->pPrevStmt = pHist->pNextStmt = 0; + if( pPager->xReiniter ){ + pPager->xReiniter(p, pPager->pageSize); + } + } + pPager->pDirty = 0; + pPager->pStmt = 0; + pPager->dbSize = pPager->origDbSize; + pager_truncate_cache(pPager); + pPager->stmtInUse = 0; + pPager->state = PAGER_SHARED; + return SQLITE_OK; + } + + pagerEnter(pPager); + if( !pPager->dirtyCache || !pPager->journalOpen ){ + rc = pager_end_transaction(pPager); + pagerLeave(pPager); + return rc; + } + + if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ + if( pPager->state>=PAGER_EXCLUSIVE ){ + pager_playback(pPager, 0); + } + pagerLeave(pPager); + return pPager->errCode; + } + if( pPager->state==PAGER_RESERVED ){ + int rc2; + rc = pager_playback(pPager, 0); + rc2 = pager_end_transaction(pPager); + if( rc==SQLITE_OK ){ + rc = rc2; + } + }else{ + rc = pager_playback(pPager, 0); + } + /* pager_reset(pPager); */ + pPager->dbSize = -1; + + /* If an error occurs during a ROLLBACK, we can no longer trust the pager + ** cache. So call pager_error() on the way out to make any error + ** persistent. + */ + rc = pager_error(pPager, rc); + pagerLeave(pPager); + return rc; +} + +/* +** Return TRUE if the database file is opened read-only. Return FALSE +** if the database is (in theory) writable. +*/ +int sqlite3PagerIsreadonly(Pager *pPager){ + return pPager->readOnly; +} + +/* +** Return the number of references to the pager. +*/ +int sqlite3PagerRefcount(Pager *pPager){ + return pPager->nRef; +} + +#ifdef SQLITE_TEST +/* +** This routine is used for testing and analysis only. +*/ +int *sqlite3PagerStats(Pager *pPager){ + static int a[11]; + a[0] = pPager->nRef; + a[1] = pPager->nPage; + a[2] = pPager->mxPage; + a[3] = pPager->dbSize; + a[4] = pPager->state; + a[5] = pPager->errCode; + a[6] = pPager->nHit; + a[7] = pPager->nMiss; + a[8] = 0; /* Used to be pPager->nOvfl */ + a[9] = pPager->nRead; + a[10] = pPager->nWrite; + return a; +} +#endif + +/* +** Set the statement rollback point. +** +** This routine should be called with the transaction journal already +** open. A new statement journal is created that can be used to rollback +** changes of a single SQL command within a larger transaction. +*/ +static int pagerStmtBegin(Pager *pPager){ + int rc; + assert( !pPager->stmtInUse ); + assert( pPager->state>=PAGER_SHARED ); + assert( pPager->dbSize>=0 ); + PAGERTRACE2("STMT-BEGIN %d\n", PAGERID(pPager)); + if( MEMDB ){ + pPager->stmtInUse = 1; + pPager->stmtSize = pPager->dbSize; + return SQLITE_OK; + } + if( !pPager->journalOpen ){ + pPager->stmtAutoopen = 1; + return SQLITE_OK; + } + assert( pPager->journalOpen ); + pagerLeave(pPager); + assert( pPager->aInStmt==0 ); + pPager->aInStmt = sqlite3MallocZero( pPager->dbSize/8 + 1 ); + pagerEnter(pPager); + if( pPager->aInStmt==0 ){ + /* sqlite3OsLock(pPager->fd, SHARED_LOCK); */ + return SQLITE_NOMEM; + } +#ifndef NDEBUG + rc = sqlite3OsFileSize(pPager->jfd, &pPager->stmtJSize); + if( rc ) goto stmt_begin_failed; + assert( pPager->stmtJSize == pPager->journalOff ); +#endif + pPager->stmtJSize = pPager->journalOff; + pPager->stmtSize = pPager->dbSize; + pPager->stmtHdrOff = 0; + pPager->stmtCksum = pPager->cksumInit; + if( !pPager->stmtOpen ){ + rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->stfd, pPager->zStmtJrnl, + SQLITE_OPEN_SUBJOURNAL); + if( rc ){ + goto stmt_begin_failed; + } + pPager->stmtOpen = 1; + pPager->stmtNRec = 0; + } + pPager->stmtInUse = 1; + return SQLITE_OK; + +stmt_begin_failed: + if( pPager->aInStmt ){ + sqlite3_free(pPager->aInStmt); + pPager->aInStmt = 0; + } + return rc; +} +int sqlite3PagerStmtBegin(Pager *pPager){ + int rc; + pagerEnter(pPager); + rc = pagerStmtBegin(pPager); + pagerLeave(pPager); + return rc; +} + +/* +** Commit a statement. +*/ +int sqlite3PagerStmtCommit(Pager *pPager){ + pagerEnter(pPager); + if( pPager->stmtInUse ){ + PgHdr *pPg, *pNext; + PAGERTRACE2("STMT-COMMIT %d\n", PAGERID(pPager)); + if( !MEMDB ){ + /* sqlite3OsTruncate(pPager->stfd, 0); */ + sqlite3_free( pPager->aInStmt ); + pPager->aInStmt = 0; + }else{ + for(pPg=pPager->pStmt; pPg; pPg=pNext){ + PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); + pNext = pHist->pNextStmt; + assert( pHist->inStmt ); + pHist->inStmt = 0; + pHist->pPrevStmt = pHist->pNextStmt = 0; + sqlite3_free(pHist->pStmt); + pHist->pStmt = 0; + } + } + pPager->stmtNRec = 0; + pPager->stmtInUse = 0; + pPager->pStmt = 0; + } + pPager->stmtAutoopen = 0; + pagerLeave(pPager); + return SQLITE_OK; +} + +/* +** Rollback a statement. +*/ +int sqlite3PagerStmtRollback(Pager *pPager){ + int rc; + pagerEnter(pPager); + if( pPager->stmtInUse ){ + PAGERTRACE2("STMT-ROLLBACK %d\n", PAGERID(pPager)); + if( MEMDB ){ + PgHdr *pPg; + PgHistory *pHist; + for(pPg=pPager->pStmt; pPg; pPg=pHist->pNextStmt){ + pHist = PGHDR_TO_HIST(pPg, pPager); + if( pHist->pStmt ){ + memcpy(PGHDR_TO_DATA(pPg), pHist->pStmt, pPager->pageSize); + sqlite3_free(pHist->pStmt); + pHist->pStmt = 0; + } + } + pPager->dbSize = pPager->stmtSize; + pager_truncate_cache(pPager); + rc = SQLITE_OK; + }else{ + rc = pager_stmt_playback(pPager); + } + sqlite3PagerStmtCommit(pPager); + }else{ + rc = SQLITE_OK; + } + pPager->stmtAutoopen = 0; + pagerLeave(pPager); + return rc; +} + +/* +** Return the full pathname of the database file. +*/ +const char *sqlite3PagerFilename(Pager *pPager){ + return pPager->zFilename; +} + +/* +** Return the VFS structure for the pager. +*/ +const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ + return pPager->pVfs; +} + +/* +** Return the file handle for the database file associated +** with the pager. This might return NULL if the file has +** not yet been opened. +*/ +sqlite3_file *sqlite3PagerFile(Pager *pPager){ + return pPager->fd; +} + +/* +** Return the directory of the database file. +*/ +const char *sqlite3PagerDirname(Pager *pPager){ + return pPager->zDirectory; +} + +/* +** Return the full pathname of the journal file. +*/ +const char *sqlite3PagerJournalname(Pager *pPager){ + return pPager->zJournal; +} + +/* +** Return true if fsync() calls are disabled for this pager. Return FALSE +** if fsync()s are executed normally. +*/ +int sqlite3PagerNosync(Pager *pPager){ + return pPager->noSync; +} + +#ifdef SQLITE_HAS_CODEC +/* +** Set the codec for this pager +*/ +void sqlite3PagerSetCodec( + Pager *pPager, + void *(*xCodec)(void*,void*,Pgno,int), + void *pCodecArg +){ + pPager->xCodec = xCodec; + pPager->pCodecArg = pCodecArg; +} +#endif + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Move the page pPg to location pgno in the file. +** +** There must be no references to the page previously located at +** pgno (which we call pPgOld) though that page is allowed to be +** in cache. If the page previous located at pgno is not already +** in the rollback journal, it is not put there by by this routine. +** +** References to the page pPg remain valid. Updating any +** meta-data associated with pPg (i.e. data stored in the nExtra bytes +** allocated along with the page) is the responsibility of the caller. +** +** A transaction must be active when this routine is called. It used to be +** required that a statement transaction was not active, but this restriction +** has been removed (CREATE INDEX needs to move a page when a statement +** transaction is active). +*/ +int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno){ + PgHdr *pPgOld; /* The page being overwritten. */ + int h; + Pgno needSyncPgno = 0; + + pagerEnter(pPager); + assert( pPg->nRef>0 ); + + PAGERTRACE5("MOVE %d page %d (needSync=%d) moves to %d\n", + PAGERID(pPager), pPg->pgno, pPg->needSync, pgno); + IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) + + pager_get_content(pPg); + if( pPg->needSync ){ + needSyncPgno = pPg->pgno; + assert( pPg->inJournal || (int)pgno>pPager->origDbSize ); + assert( pPg->dirty ); + assert( pPager->needSync ); + } + + /* Unlink pPg from it's hash-chain */ + unlinkHashChain(pPager, pPg); + + /* If the cache contains a page with page-number pgno, remove it + ** from it's hash chain. Also, if the PgHdr.needSync was set for + ** page pgno before the 'move' operation, it needs to be retained + ** for the page moved there. + */ + pPg->needSync = 0; + pPgOld = pager_lookup(pPager, pgno); + if( pPgOld ){ + assert( pPgOld->nRef==0 ); + unlinkHashChain(pPager, pPgOld); + makeClean(pPgOld); + pPg->needSync = pPgOld->needSync; + }else{ + pPg->needSync = 0; + } + if( pPager->aInJournal && (int)pgno<=pPager->origDbSize ){ + pPg->inJournal = (pPager->aInJournal[pgno/8] & (1<<(pgno&7)))!=0; + }else{ + pPg->inJournal = 0; + assert( pPg->needSync==0 || (int)pgno>pPager->origDbSize ); + } + + /* Change the page number for pPg and insert it into the new hash-chain. */ + assert( pgno!=0 ); + pPg->pgno = pgno; + h = pgno & (pPager->nHash-1); + if( pPager->aHash[h] ){ + assert( pPager->aHash[h]->pPrevHash==0 ); + pPager->aHash[h]->pPrevHash = pPg; + } + pPg->pNextHash = pPager->aHash[h]; + pPager->aHash[h] = pPg; + pPg->pPrevHash = 0; + + makeDirty(pPg); + pPager->dirtyCache = 1; + + if( needSyncPgno ){ + /* If needSyncPgno is non-zero, then the journal file needs to be + ** sync()ed before any data is written to database file page needSyncPgno. + ** Currently, no such page exists in the page-cache and the + ** Pager.aInJournal bit has been set. This needs to be remedied by loading + ** the page into the pager-cache and setting the PgHdr.needSync flag. + ** + ** The sqlite3PagerGet() call may cause the journal to sync. So make + ** sure the Pager.needSync flag is set too. + */ + int rc; + PgHdr *pPgHdr; + assert( pPager->needSync ); + rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr); + if( rc!=SQLITE_OK ) return rc; + pPager->needSync = 1; + pPgHdr->needSync = 1; + pPgHdr->inJournal = 1; + makeDirty(pPgHdr); + sqlite3PagerUnref(pPgHdr); + } + + pagerLeave(pPager); + return SQLITE_OK; +} +#endif + +/* +** Return a pointer to the data for the specified page. +*/ +void *sqlite3PagerGetData(DbPage *pPg){ + return PGHDR_TO_DATA(pPg); +} + +/* +** Return a pointer to the Pager.nExtra bytes of "extra" space +** allocated along with the specified page. +*/ +void *sqlite3PagerGetExtra(DbPage *pPg){ + Pager *pPager = pPg->pPager; + return (pPager?PGHDR_TO_EXTRA(pPg, pPager):0); +} + +/* +** Get/set the locking-mode for this pager. Parameter eMode must be one +** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then +** the locking-mode is set to the value specified. +** +** The returned value is either PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) +** locking-mode. +*/ +int sqlite3PagerLockingMode(Pager *pPager, int eMode){ + assert( eMode==PAGER_LOCKINGMODE_QUERY + || eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_QUERY<0 ); + assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); + if( eMode>=0 && !pPager->tempFile ){ + pPager->exclusiveMode = eMode; + } + return (int)pPager->exclusiveMode; +} + +#ifdef SQLITE_DEBUG +/* +** Print a listing of all referenced pages and their ref count. +*/ +void sqlite3PagerRefdump(Pager *pPager){ + PgHdr *pPg; + for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ + if( pPg->nRef<=0 ) continue; + sqlite3DebugPrintf("PAGE %3d addr=%p nRef=%d\n", + pPg->pgno, PGHDR_TO_DATA(pPg), pPg->nRef); + } +} +#endif + +#endif /* SQLITE_OMIT_DISKIO */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h new file mode 100644 index 0000000000..cf05b11bee --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h @@ -0,0 +1,125 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite page cache +** subsystem. The page cache subsystem reads and writes a file a page +** at a time and provides a journal for rollback. +** +** @(#) $Id: pager.h,v 1.67 2007/09/03 15:19:35 drh Exp $ +*/ + +#ifndef _PAGER_H_ +#define _PAGER_H_ + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef unsigned int Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: This values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** See source code comments for a detailed description of the following +** routines: +*/ +int sqlite3PagerOpen(sqlite3_vfs *, Pager **ppPager, const char*, int,int,int); +void sqlite3PagerSetBusyhandler(Pager*, BusyHandler *pBusyHandler); +void sqlite3PagerSetDestructor(Pager*, void(*)(DbPage*,int)); +void sqlite3PagerSetReiniter(Pager*, void(*)(DbPage*,int)); +int sqlite3PagerSetPagesize(Pager*, u16*); +int sqlite3PagerMaxPageCount(Pager*, int); +int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); +void sqlite3PagerSetCachesize(Pager*, int); +int sqlite3PagerClose(Pager *pPager); +int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) +DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +int sqlite3PagerRef(DbPage*); +int sqlite3PagerUnref(DbPage*); +int sqlite3PagerWrite(DbPage*); +int sqlite3PagerOverwrite(Pager *pPager, Pgno pgno, void*); +int sqlite3PagerPagecount(Pager*); +int sqlite3PagerTruncate(Pager*,Pgno); +int sqlite3PagerBegin(DbPage*, int exFlag); +int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, Pgno); +int sqlite3PagerCommitPhaseTwo(Pager*); +int sqlite3PagerRollback(Pager*); +int sqlite3PagerIsreadonly(Pager*); +int sqlite3PagerStmtBegin(Pager*); +int sqlite3PagerStmtCommit(Pager*); +int sqlite3PagerStmtRollback(Pager*); +void sqlite3PagerDontRollback(DbPage*); +void sqlite3PagerDontWrite(DbPage*); +int sqlite3PagerRefcount(Pager*); +void sqlite3PagerSetSafetyLevel(Pager*,int,int); +const char *sqlite3PagerFilename(Pager*); +const sqlite3_vfs *sqlite3PagerVfs(Pager*); +sqlite3_file *sqlite3PagerFile(Pager*); +const char *sqlite3PagerDirname(Pager*); +const char *sqlite3PagerJournalname(Pager*); +int sqlite3PagerNosync(Pager*); +int sqlite3PagerMovepage(Pager*,DbPage*,Pgno); +void *sqlite3PagerGetData(DbPage *); +void *sqlite3PagerGetExtra(DbPage *); +int sqlite3PagerLockingMode(Pager *, int); + +#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) && !defined(SQLITE_OMIT_DISKIO) + int sqlite3PagerReleaseMemory(int); +#endif + +#ifdef SQLITE_HAS_CODEC + void sqlite3PagerSetCodec(Pager*,void*(*)(void*,void*,Pgno,int),void*); +#endif + +#if !defined(NDEBUG) || defined(SQLITE_TEST) + Pgno sqlite3PagerPagenumber(DbPage*); + int sqlite3PagerIswriteable(DbPage*); +#endif + +#ifdef SQLITE_TEST + int *sqlite3PagerStats(Pager*); + void sqlite3PagerRefdump(Pager*); + int pager3_refinfo_enable; +#endif + +#ifdef SQLITE_TEST +void disable_simulated_io_errors(void); +void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* _PAGER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y b/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y new file mode 100644 index 0000000000..5077daf31b --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y @@ -0,0 +1,1114 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains SQLite's grammar for SQL. Process this file +** using the lemon parser generator to generate C code that runs +** the parser. Lemon will also generate a header file containing +** numeric codes for all of the tokens. +** +** @(#) $Id: parse.y,v 1.234 2007/08/21 10:44:16 drh Exp $ +*/ + +// All token codes are small integers with #defines that begin with "TK_" +%token_prefix TK_ + +// The type of the data attached to each token is Token. This is also the +// default type for non-terminals. +// +%token_type {Token} +%default_type {Token} + +// The generated parser function takes a 4th argument as follows: +%extra_argument {Parse *pParse} + +// This code runs whenever there is a syntax error +// +%syntax_error { + if( !pParse->parseError ){ + if( TOKEN.z[0] ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + }else{ + sqlite3ErrorMsg(pParse, "incomplete SQL statement"); + } + pParse->parseError = 1; + } +} +%stack_overflow { + sqlite3ErrorMsg(pParse, "parser stack overflow"); + pParse->parseError = 1; +} + +// The name of the generated procedure that implements the parser +// is as follows: +%name sqlite3Parser + +// The following text is included near the beginning of the C source +// code file that implements the parser. +// +%include { +#include "sqliteInt.h" + +/* +** An instance of this structure holds information about the +** LIMIT clause of a SELECT statement. +*/ +struct LimitVal { + Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ + Expr *pOffset; /* The OFFSET expression. NULL if there is none */ +}; + +/* +** An instance of this structure is used to store the LIKE, +** GLOB, NOT LIKE, and NOT GLOB operators. +*/ +struct LikeOp { + Token eOperator; /* "like" or "glob" or "regexp" */ + int not; /* True if the NOT keyword is present */ +}; + +/* +** An instance of the following structure describes the event of a +** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, +** TK_DELETE, or TK_INSTEAD. If the event is of the form +** +** UPDATE ON (a,b,c) +** +** Then the "b" IdList records the list "a,b,c". +*/ +struct TrigEvent { int a; IdList * b; }; + +/* +** An instance of this structure holds the ATTACH key and the key type. +*/ +struct AttachKey { int type; Token key; }; + +} // end %include + +// Input is a single SQL command +input ::= cmdlist. +cmdlist ::= cmdlist ecmd. +cmdlist ::= ecmd. +cmdx ::= cmd. { sqlite3FinishCoding(pParse); } +ecmd ::= SEMI. +ecmd ::= explain cmdx SEMI. +explain ::= . { sqlite3BeginParse(pParse, 0); } +%ifndef SQLITE_OMIT_EXPLAIN +explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } +explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } +%endif SQLITE_OMIT_EXPLAIN + +///////////////////// Begin and end transactions. //////////////////////////// +// + +cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} +trans_opt ::= . +trans_opt ::= TRANSACTION. +trans_opt ::= TRANSACTION nm. +%type transtype {int} +transtype(A) ::= . {A = TK_DEFERRED;} +transtype(A) ::= DEFERRED(X). {A = @X;} +transtype(A) ::= IMMEDIATE(X). {A = @X;} +transtype(A) ::= EXCLUSIVE(X). {A = @X;} +cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} +cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} +cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} + +///////////////////// The CREATE TABLE statement //////////////////////////// +// +cmd ::= create_table create_table_args. +create_table ::= CREATE temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { + sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); +} +%type ifnotexists {int} +ifnotexists(A) ::= . {A = 0;} +ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} +%type temp {int} +%ifndef SQLITE_OMIT_TEMPDB +temp(A) ::= TEMP. {A = 1;} +%endif SQLITE_OMIT_TEMPDB +temp(A) ::= . {A = 0;} +create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { + sqlite3EndTable(pParse,&X,&Y,0); +} +create_table_args ::= AS select(S). { + sqlite3EndTable(pParse,0,0,S); + sqlite3SelectDelete(S); +} +columnlist ::= columnlist COMMA column. +columnlist ::= column. + +// A "column" is a complete description of a single column in a +// CREATE TABLE statement. This includes the column name, its +// datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, +// NOT NULL and so forth. +// +column(A) ::= columnid(X) type carglist. { + A.z = X.z; + A.n = (pParse->sLastToken.z-X.z) + pParse->sLastToken.n; +} +columnid(A) ::= nm(X). { + sqlite3AddColumn(pParse,&X); + A = X; +} + + +// An IDENTIFIER can be a generic identifier, or one of several +// keywords. Any non-standard keyword can also be an identifier. +// +%type id {Token} +id(A) ::= ID(X). {A = X;} + +// The following directive causes tokens ABORT, AFTER, ASC, etc. to +// fallback to ID if they will not parse as their original value. +// This obviates the need for the "id" nonterminal. +// +%fallback ID + ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN CASCADE CAST CONFLICT + DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR + IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN + QUERY KEY OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW + TEMP TRIGGER VACUUM VIEW VIRTUAL +%ifdef SQLITE_OMIT_COMPOUND_SELECT + EXCEPT INTERSECT UNION +%endif SQLITE_OMIT_COMPOUND_SELECT + REINDEX RENAME CTIME_KW IF + . +%wildcard ANY. + +// Define operator precedence early so that this is the first occurance +// of the operator tokens in the grammer. Keeping the operators together +// causes them to be assigned integer values that are close together, +// which keeps parser tables smaller. +// +// The token values assigned to these symbols is determined by the order +// in which lemon first sees them. It must be the case that ISNULL/NOTNULL, +// NE/EQ, GT/LE, and GE/LT are separated by only a single value. See +// the sqlite3ExprIfFalse() routine for additional information on this +// constraint. +// +%left OR. +%left AND. +%right NOT. +%left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. +%left GT LE LT GE. +%right ESCAPE. +%left BITAND BITOR LSHIFT RSHIFT. +%left PLUS MINUS. +%left STAR SLASH REM. +%left CONCAT. +%left COLLATE. +%right UMINUS UPLUS BITNOT. + +// And "ids" is an identifer-or-string. +// +%type ids {Token} +ids(A) ::= ID|STRING(X). {A = X;} + +// The name of a column or table can be any of the following: +// +%type nm {Token} +nm(A) ::= ID(X). {A = X;} +nm(A) ::= STRING(X). {A = X;} +nm(A) ::= JOIN_KW(X). {A = X;} + +// A typetoken is really one or more tokens that form a type name such +// as can be found after the column name in a CREATE TABLE statement. +// Multiple tokens are concatenated to form the value of the typetoken. +// +%type typetoken {Token} +type ::= . +type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} +typetoken(A) ::= typename(X). {A = X;} +typetoken(A) ::= typename(X) LP signed RP(Y). { + A.z = X.z; + A.n = &Y.z[Y.n] - X.z; +} +typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { + A.z = X.z; + A.n = &Y.z[Y.n] - X.z; +} +%type typename {Token} +typename(A) ::= ids(X). {A = X;} +typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} +signed ::= plus_num. +signed ::= minus_num. + +// "carglist" is a list of additional constraints that come after the +// column name and column type in a CREATE TABLE statement. +// +carglist ::= carglist carg. +carglist ::= . +carg ::= CONSTRAINT nm ccons. +carg ::= ccons. +ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,X);} +ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,X);} +ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,X);} +ccons ::= DEFAULT MINUS term(X). { + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); + sqlite3AddDefaultValue(pParse,p); +} +ccons ::= DEFAULT id(X). { + Expr *p = sqlite3PExpr(pParse, TK_STRING, 0, 0, &X); + sqlite3AddDefaultValue(pParse,p); +} + +// In addition to the type name, we also care about the primary key and +// UNIQUE constraints. +// +ccons ::= NULL onconf. +ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} +ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). + {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} +ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} +ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} +ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). + {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} +ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} +ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, (char*)C.z, C.n);} + +// The optional AUTOINCREMENT keyword +%type autoinc {int} +autoinc(X) ::= . {X = 0;} +autoinc(X) ::= AUTOINCR. {X = 1;} + +// The next group of rules parses the arguments to a REFERENCES clause +// that determine if the referential integrity checking is deferred or +// or immediate and which determine what action to take if a ref-integ +// check fails. +// +%type refargs {int} +refargs(A) ::= . { A = OE_Restrict * 0x010101; } +refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } +%type refarg {struct {int value; int mask;}} +refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } +refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } +refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } +refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } +%type refact {int} +refact(A) ::= SET NULL. { A = OE_SetNull; } +refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } +refact(A) ::= CASCADE. { A = OE_Cascade; } +refact(A) ::= RESTRICT. { A = OE_Restrict; } +%type defer_subclause {int} +defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} +defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} +%type init_deferred_pred_opt {int} +init_deferred_pred_opt(A) ::= . {A = 0;} +init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} +init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} + +// For the time being, the only constraint we care about is the primary +// key and UNIQUE. Both create indices. +// +conslist_opt(A) ::= . {A.n = 0; A.z = 0;} +conslist_opt(A) ::= COMMA(X) conslist. {A = X;} +conslist ::= conslist COMMA tcons. +conslist ::= conslist tcons. +conslist ::= tcons. +tcons ::= CONSTRAINT nm. +tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). + {sqlite3AddPrimaryKey(pParse,X,R,I,0);} +tcons ::= UNIQUE LP idxlist(X) RP onconf(R). + {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} +tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);} +tcons ::= FOREIGN KEY LP idxlist(FA) RP + REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { + sqlite3CreateForeignKey(pParse, FA, &T, TA, R); + sqlite3DeferForeignKey(pParse, D); +} +%type defer_subclause_opt {int} +defer_subclause_opt(A) ::= . {A = 0;} +defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} + +// The following is a non-standard extension that allows us to declare the +// default behavior when there is a constraint conflict. +// +%type onconf {int} +%type orconf {int} +%type resolvetype {int} +onconf(A) ::= . {A = OE_Default;} +onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} +orconf(A) ::= . {A = OE_Default;} +orconf(A) ::= OR resolvetype(X). {A = X;} +resolvetype(A) ::= raisetype(X). {A = X;} +resolvetype(A) ::= IGNORE. {A = OE_Ignore;} +resolvetype(A) ::= REPLACE. {A = OE_Replace;} + +////////////////////////// The DROP TABLE ///////////////////////////////////// +// +cmd ::= DROP TABLE ifexists(E) fullname(X). { + sqlite3DropTable(pParse, X, 0, E); +} +%type ifexists {int} +ifexists(A) ::= IF EXISTS. {A = 1;} +ifexists(A) ::= . {A = 0;} + +///////////////////// The CREATE VIEW statement ///////////////////////////// +// +%ifndef SQLITE_OMIT_VIEW +cmd ::= CREATE(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { + sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); +} +cmd ::= DROP VIEW ifexists(E) fullname(X). { + sqlite3DropTable(pParse, X, 1, E); +} +%endif SQLITE_OMIT_VIEW + +//////////////////////// The SELECT statement ///////////////////////////////// +// +cmd ::= select(X). { + sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); + sqlite3SelectDelete(X); +} + +%type select {Select*} +%destructor select {sqlite3SelectDelete($$);} +%type oneselect {Select*} +%destructor oneselect {sqlite3SelectDelete($$);} + +select(A) ::= oneselect(X). {A = X;} +%ifndef SQLITE_OMIT_COMPOUND_SELECT +select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { + if( Z ){ + Z->op = Y; + Z->pPrior = X; + }else{ + sqlite3SelectDelete(X); + } + A = Z; +} +%type multiselect_op {int} +multiselect_op(A) ::= UNION(OP). {A = @OP;} +multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} +multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} +%endif SQLITE_OMIT_COMPOUND_SELECT +oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) + groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { + A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); +} + +// The "distinct" nonterminal is true (1) if the DISTINCT keyword is +// present and false (0) if it is not. +// +%type distinct {int} +distinct(A) ::= DISTINCT. {A = 1;} +distinct(A) ::= ALL. {A = 0;} +distinct(A) ::= . {A = 0;} + +// selcollist is a list of expressions that are to become the return +// values of the SELECT statement. The "*" in statements like +// "SELECT * FROM ..." is encoded as a special expression with an +// opcode of TK_ALL. +// +%type selcollist {ExprList*} +%destructor selcollist {sqlite3ExprListDelete($$);} +%type sclp {ExprList*} +%destructor sclp {sqlite3ExprListDelete($$);} +sclp(A) ::= selcollist(X) COMMA. {A = X;} +sclp(A) ::= . {A = 0;} +selcollist(A) ::= sclp(P) expr(X) as(Y). { + A = sqlite3ExprListAppend(pParse,P,X,Y.n?&Y:0); +} +selcollist(A) ::= sclp(P) STAR. { + Expr *p = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0); + A = sqlite3ExprListAppend(pParse, P, p, 0); +} +selcollist(A) ::= sclp(P) nm(X) DOT STAR. { + Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0); + Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + A = sqlite3ExprListAppend(pParse,P, pDot, 0); +} + +// An option "AS " phrase that can follow one of the expressions that +// define the result set, or one of the tables in the FROM clause. +// +%type as {Token} +as(X) ::= AS nm(Y). {X = Y;} +as(X) ::= ids(Y). {X = Y;} +as(X) ::= . {X.n = 0;} + + +%type seltablist {SrcList*} +%destructor seltablist {sqlite3SrcListDelete($$);} +%type stl_prefix {SrcList*} +%destructor stl_prefix {sqlite3SrcListDelete($$);} +%type from {SrcList*} +%destructor from {sqlite3SrcListDelete($$);} + +// A complete FROM clause. +// +from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} +from(A) ::= FROM seltablist(X). { + A = X; + sqlite3SrcListShiftJoinType(A); +} + +// "seltablist" is a "Select Table List" - the content of the FROM clause +// in a SELECT statement. "stl_prefix" is a prefix of this list. +// +stl_prefix(A) ::= seltablist(X) joinop(Y). { + A = X; + if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; +} +stl_prefix(A) ::= . {A = 0;} +seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { + A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); +} +%ifndef SQLITE_OMIT_SUBQUERY + seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP + as(Z) on_opt(N) using_opt(U). { + A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); + } + + // A seltablist_paren nonterminal represents anything in a FROM that + // is contained inside parentheses. This can be either a subquery or + // a grouping of table and subqueries. + // + %type seltablist_paren {Select*} + %destructor seltablist_paren {sqlite3SelectDelete($$);} + seltablist_paren(A) ::= select(S). {A = S;} + seltablist_paren(A) ::= seltablist(F). { + sqlite3SrcListShiftJoinType(F); + A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); + } +%endif SQLITE_OMIT_SUBQUERY + +%type dbnm {Token} +dbnm(A) ::= . {A.z=0; A.n=0;} +dbnm(A) ::= DOT nm(X). {A = X;} + +%type fullname {SrcList*} +%destructor fullname {sqlite3SrcListDelete($$);} +fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} + +%type joinop {int} +%type joinop2 {int} +joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } +joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } +joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } +joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. + { X = sqlite3JoinType(pParse,&A,&B,&C); } + +%type on_opt {Expr*} +%destructor on_opt {sqlite3ExprDelete($$);} +on_opt(N) ::= ON expr(E). {N = E;} +on_opt(N) ::= . {N = 0;} + +%type using_opt {IdList*} +%destructor using_opt {sqlite3IdListDelete($$);} +using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} +using_opt(U) ::= . {U = 0;} + + +%type orderby_opt {ExprList*} +%destructor orderby_opt {sqlite3ExprListDelete($$);} +%type sortlist {ExprList*} +%destructor sortlist {sqlite3ExprListDelete($$);} +%type sortitem {Expr*} +%destructor sortitem {sqlite3ExprDelete($$);} + +orderby_opt(A) ::= . {A = 0;} +orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} +sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { + A = sqlite3ExprListAppend(pParse,X,Y,0); + if( A ) A->a[A->nExpr-1].sortOrder = Z; +} +sortlist(A) ::= sortitem(Y) sortorder(Z). { + A = sqlite3ExprListAppend(pParse,0,Y,0); + if( A && A->a ) A->a[0].sortOrder = Z; +} +sortitem(A) ::= expr(X). {A = X;} + +%type sortorder {int} + +sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} +sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} +sortorder(A) ::= . {A = SQLITE_SO_ASC;} + +%type groupby_opt {ExprList*} +%destructor groupby_opt {sqlite3ExprListDelete($$);} +groupby_opt(A) ::= . {A = 0;} +groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} + +%type having_opt {Expr*} +%destructor having_opt {sqlite3ExprDelete($$);} +having_opt(A) ::= . {A = 0;} +having_opt(A) ::= HAVING expr(X). {A = X;} + +%type limit_opt {struct LimitVal} + +// The destructor for limit_opt will never fire in the current grammar. +// The limit_opt non-terminal only occurs at the end of a single production +// rule for SELECT statements. As soon as the rule that create the +// limit_opt non-terminal reduces, the SELECT statement rule will also +// reduce. So there is never a limit_opt non-terminal on the stack +// except as a transient. So there is never anything to destroy. +// +//%destructor limit_opt { +// sqlite3ExprDelete($$.pLimit); +// sqlite3ExprDelete($$.pOffset); +//} +limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} +limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;} +limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). + {A.pLimit = X; A.pOffset = Y;} +limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). + {A.pOffset = X; A.pLimit = Y;} + +/////////////////////////// The DELETE statement ///////////////////////////// +// +cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);} + +%type where_opt {Expr*} +%destructor where_opt {sqlite3ExprDelete($$);} + +where_opt(A) ::= . {A = 0;} +where_opt(A) ::= WHERE expr(X). {A = X;} + +////////////////////////// The UPDATE command //////////////////////////////// +// +cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). { + sqlite3ExprListCheckLength(pParse,Y,SQLITE_MAX_COLUMN,"set list"); + sqlite3Update(pParse,X,Y,Z,R); +} + +%type setlist {ExprList*} +%destructor setlist {sqlite3ExprListDelete($$);} + +setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). + {A = sqlite3ExprListAppend(pParse,Z,Y,&X);} +setlist(A) ::= nm(X) EQ expr(Y). + {A = sqlite3ExprListAppend(pParse,0,Y,&X);} + +////////////////////////// The INSERT command ///////////////////////////////// +// +cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) + VALUES LP itemlist(Y) RP. + {sqlite3Insert(pParse, X, Y, 0, F, R);} +cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). + {sqlite3Insert(pParse, X, 0, S, F, R);} +cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. + {sqlite3Insert(pParse, X, 0, 0, F, R);} + +%type insert_cmd {int} +insert_cmd(A) ::= INSERT orconf(R). {A = R;} +insert_cmd(A) ::= REPLACE. {A = OE_Replace;} + + +%type itemlist {ExprList*} +%destructor itemlist {sqlite3ExprListDelete($$);} + +itemlist(A) ::= itemlist(X) COMMA expr(Y). + {A = sqlite3ExprListAppend(pParse,X,Y,0);} +itemlist(A) ::= expr(X). + {A = sqlite3ExprListAppend(pParse,0,X,0);} + +%type inscollist_opt {IdList*} +%destructor inscollist_opt {sqlite3IdListDelete($$);} +%type inscollist {IdList*} +%destructor inscollist {sqlite3IdListDelete($$);} + +inscollist_opt(A) ::= . {A = 0;} +inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} +inscollist(A) ::= inscollist(X) COMMA nm(Y). + {A = sqlite3IdListAppend(pParse->db,X,&Y);} +inscollist(A) ::= nm(Y). + {A = sqlite3IdListAppend(pParse->db,0,&Y);} + +/////////////////////////// Expression Processing ///////////////////////////// +// + +%type expr {Expr*} +%destructor expr {sqlite3ExprDelete($$);} +%type term {Expr*} +%destructor term {sqlite3ExprDelete($$);} + +expr(A) ::= term(X). {A = X;} +expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } +term(A) ::= NULL(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} +expr(A) ::= ID(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} +expr(A) ::= JOIN_KW(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} +expr(A) ::= nm(X) DOT nm(Y). { + Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); + Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); + A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); +} +expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { + Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); + Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); + Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); + A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); +} +term(A) ::= INTEGER|FLOAT|BLOB(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} +term(A) ::= STRING(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} +expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);} +expr(A) ::= VARIABLE(X). { + Token *pToken = &X; + Expr *pExpr = A = sqlite3PExpr(pParse, TK_VARIABLE, 0, 0, pToken); + sqlite3ExprAssignVarNumber(pParse, pExpr); +} +expr(A) ::= expr(E) COLLATE id(C). { + A = sqlite3ExprSetColl(pParse, E, &C); +} +%ifndef SQLITE_OMIT_CAST +expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { + A = sqlite3PExpr(pParse, TK_CAST, E, 0, &T); + sqlite3ExprSpan(A,&X,&Y); +} +%endif SQLITE_OMIT_CAST +expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { + if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){ + sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); + } + A = sqlite3ExprFunction(pParse, Y, &X); + sqlite3ExprSpan(A,&X,&E); + if( D && A ){ + A->flags |= EP_Distinct; + } +} +expr(A) ::= ID(X) LP STAR RP(E). { + A = sqlite3ExprFunction(pParse, 0, &X); + sqlite3ExprSpan(A,&X,&E); +} +term(A) ::= CTIME_KW(OP). { + /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are + ** treated as functions that return constants */ + A = sqlite3ExprFunction(pParse, 0,&OP); + if( A ){ + A->op = TK_CONST_FUNC; + A->span = OP; + } +} +expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). + {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). + {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).{A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). + {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} +%type likeop {struct LikeOp} +likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} +likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} +likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} +likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} +%type escape {Expr*} +%destructor escape {sqlite3ExprDelete($$);} +escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} +escape(X) ::= . [ESCAPE] {X = 0;} +expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { + ExprList *pList; + pList = sqlite3ExprListAppend(pParse,0, Y, 0); + pList = sqlite3ExprListAppend(pParse,pList, X, 0); + if( E ){ + pList = sqlite3ExprListAppend(pParse,pList, E, 0); + } + A = sqlite3ExprFunction(pParse, pList, &OP.eOperator); + if( OP.not ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); + sqlite3ExprSpan(A, &X->span, &Y->span); + if( A ) A->flags |= EP_InfixFunc; +} + +expr(A) ::= expr(X) ISNULL|NOTNULL(E). { + A = sqlite3PExpr(pParse, @E, X, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); +} +expr(A) ::= expr(X) IS NULL(E). { + A = sqlite3PExpr(pParse, TK_ISNULL, X, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); +} +expr(A) ::= expr(X) NOT NULL(E). { + A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); +} +expr(A) ::= expr(X) IS NOT NULL(E). { + A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); +} +expr(A) ::= NOT|BITNOT(B) expr(X). { + A = sqlite3PExpr(pParse, @B, X, 0, 0); + sqlite3ExprSpan(A,&B,&X->span); +} +expr(A) ::= MINUS(B) expr(X). [UMINUS] { + A = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); + sqlite3ExprSpan(A,&B,&X->span); +} +expr(A) ::= PLUS(B) expr(X). [UPLUS] { + A = sqlite3PExpr(pParse, TK_UPLUS, X, 0, 0); + sqlite3ExprSpan(A,&B,&X->span); +} +%type between_op {int} +between_op(A) ::= BETWEEN. {A = 0;} +between_op(A) ::= NOT BETWEEN. {A = 1;} +expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { + ExprList *pList = sqlite3ExprListAppend(pParse,0, X, 0); + pList = sqlite3ExprListAppend(pParse,pList, Y, 0); + A = sqlite3PExpr(pParse, TK_BETWEEN, W, 0, 0); + if( A ){ + A->pList = pList; + }else{ + sqlite3ExprListDelete(pList); + } + if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); + sqlite3ExprSpan(A,&W->span,&Y->span); +} +%ifndef SQLITE_OMIT_SUBQUERY + %type in_op {int} + in_op(A) ::= IN. {A = 0;} + in_op(A) ::= NOT IN. {A = 1;} + expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { + A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); + if( A ){ + A->pList = Y; + sqlite3ExprSetHeight(A); + }else{ + sqlite3ExprListDelete(Y); + } + if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); + } + expr(A) ::= LP(B) select(X) RP(E). { + A = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); + if( A ){ + A->pSelect = X; + sqlite3ExprSetHeight(A); + }else{ + sqlite3SelectDelete(X); + } + sqlite3ExprSpan(A,&B,&E); + } + expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { + A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); + if( A ){ + A->pSelect = Y; + sqlite3ExprSetHeight(A); + }else{ + sqlite3SelectDelete(Y); + } + if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); + sqlite3ExprSpan(A,&X->span,&E); + } + expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { + SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); + A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); + if( A ){ + A->pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); + sqlite3ExprSetHeight(A); + }else{ + sqlite3SrcListDelete(pSrc); + } + if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); + sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); + } + expr(A) ::= EXISTS(B) LP select(Y) RP(E). { + Expr *p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); + if( p ){ + p->pSelect = Y; + sqlite3ExprSpan(p,&B,&E); + sqlite3ExprSetHeight(A); + }else{ + sqlite3SelectDelete(Y); + } + } +%endif SQLITE_OMIT_SUBQUERY + +/* CASE expressions */ +expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { + A = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); + if( A ){ + A->pList = Y; + sqlite3ExprSetHeight(A); + }else{ + sqlite3ExprListDelete(Y); + } + sqlite3ExprSpan(A, &C, &E); +} +%type case_exprlist {ExprList*} +%destructor case_exprlist {sqlite3ExprListDelete($$);} +case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { + A = sqlite3ExprListAppend(pParse,X, Y, 0); + A = sqlite3ExprListAppend(pParse,A, Z, 0); +} +case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { + A = sqlite3ExprListAppend(pParse,0, Y, 0); + A = sqlite3ExprListAppend(pParse,A, Z, 0); +} +%type case_else {Expr*} +%destructor case_else {sqlite3ExprDelete($$);} +case_else(A) ::= ELSE expr(X). {A = X;} +case_else(A) ::= . {A = 0;} +%type case_operand {Expr*} +%destructor case_operand {sqlite3ExprDelete($$);} +case_operand(A) ::= expr(X). {A = X;} +case_operand(A) ::= . {A = 0;} + +%type exprlist {ExprList*} +%destructor exprlist {sqlite3ExprListDelete($$);} +%type nexprlist {ExprList*} +%destructor nexprlist {sqlite3ExprListDelete($$);} + +exprlist(A) ::= nexprlist(X). {A = X;} +exprlist(A) ::= . {A = 0;} +nexprlist(A) ::= nexprlist(X) COMMA expr(Y). + {A = sqlite3ExprListAppend(pParse,X,Y,0);} +nexprlist(A) ::= expr(Y). + {A = sqlite3ExprListAppend(pParse,0,Y,0);} + + +///////////////////////////// The CREATE INDEX command /////////////////////// +// +cmd ::= CREATE(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) + ON nm(Y) LP idxlist(Z) RP(E). { + sqlite3CreateIndex(pParse, &X, &D, + sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, + &S, &E, SQLITE_SO_ASC, NE); +} + +%type uniqueflag {int} +uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} +uniqueflag(A) ::= . {A = OE_None;} + +%type idxlist {ExprList*} +%destructor idxlist {sqlite3ExprListDelete($$);} +%type idxlist_opt {ExprList*} +%destructor idxlist_opt {sqlite3ExprListDelete($$);} +%type idxitem {Token} + +idxlist_opt(A) ::= . {A = 0;} +idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} +idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { + Expr *p = 0; + if( C.n>0 ){ + p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); + if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); + } + A = sqlite3ExprListAppend(pParse,X, p, &Y); + sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); + if( A ) A->a[A->nExpr-1].sortOrder = Z; +} +idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { + Expr *p = 0; + if( C.n>0 ){ + p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); + if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); + } + A = sqlite3ExprListAppend(pParse,0, p, &Y); + sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); + if( A ) A->a[A->nExpr-1].sortOrder = Z; +} +idxitem(A) ::= nm(X). {A = X;} + +%type collate {Token} +collate(C) ::= . {C.z = 0; C.n = 0;} +collate(C) ::= COLLATE id(X). {C = X;} + + +///////////////////////////// The DROP INDEX command ///////////////////////// +// +cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} + +///////////////////////////// The VACUUM command ///////////////////////////// +// +%ifndef SQLITE_OMIT_VACUUM +%ifndef SQLITE_OMIT_ATTACH +cmd ::= VACUUM. {sqlite3Vacuum(pParse);} +cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} +%endif SQLITE_OMIT_ATTACH +%endif SQLITE_OMIT_VACUUM + +///////////////////////////// The PRAGMA command ///////////////////////////// +// +%ifndef SQLITE_OMIT_PRAGMA +cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} +cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} +cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { + sqlite3Pragma(pParse,&X,&Z,&Y,1); +} +cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} +cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} +nmnum(A) ::= plus_num(X). {A = X;} +nmnum(A) ::= nm(X). {A = X;} +%endif SQLITE_OMIT_PRAGMA +plus_num(A) ::= plus_opt number(X). {A = X;} +minus_num(A) ::= MINUS number(X). {A = X;} +number(A) ::= INTEGER|FLOAT(X). {A = X;} +plus_opt ::= PLUS. +plus_opt ::= . + +//////////////////////////// The CREATE TRIGGER command ///////////////////// + +%ifndef SQLITE_OMIT_TRIGGER + +cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { + Token all; + all.z = A.z; + all.n = (Z.z - A.z) + Z.n; + sqlite3FinishTrigger(pParse, S, &all); +} + +trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) + trigger_time(C) trigger_event(D) + ON fullname(E) foreach_clause when_clause(G). { + sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); + A = (Z.n==0?B:Z); +} + +%type trigger_time {int} +trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } +trigger_time(A) ::= AFTER. { A = TK_AFTER; } +trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} +trigger_time(A) ::= . { A = TK_BEFORE; } + +%type trigger_event {struct TrigEvent} +%destructor trigger_event {sqlite3IdListDelete($$.b);} +trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} +trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} +trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} + +foreach_clause ::= . +foreach_clause ::= FOR EACH ROW. + +%type when_clause {Expr*} +%destructor when_clause {sqlite3ExprDelete($$);} +when_clause(A) ::= . { A = 0; } +when_clause(A) ::= WHEN expr(X). { A = X; } + +%type trigger_cmd_list {TriggerStep*} +%destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} +trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { + if( Y ){ + Y->pLast->pNext = X; + }else{ + Y = X; + } + Y->pLast = X; + A = Y; +} +trigger_cmd_list(A) ::= . { A = 0; } + +%type trigger_cmd {TriggerStep*} +%destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} +// UPDATE +trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). + { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } + +// INSERT +trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) + VALUES LP itemlist(Y) RP. + {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} + +trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). + {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} + +// DELETE +trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). + {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} + +// SELECT +trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } + +// The special RAISE expression that may occur in trigger programs +expr(A) ::= RAISE(X) LP IGNORE RP(Y). { + A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); + if( A ){ + A->iColumn = OE_Ignore; + sqlite3ExprSpan(A, &X, &Y); + } +} +expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { + A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); + if( A ) { + A->iColumn = T; + sqlite3ExprSpan(A, &X, &Y); + } +} +%endif !SQLITE_OMIT_TRIGGER + +%type raisetype {int} +raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} +raisetype(A) ::= ABORT. {A = OE_Abort;} +raisetype(A) ::= FAIL. {A = OE_Fail;} + + +//////////////////////// DROP TRIGGER statement ////////////////////////////// +%ifndef SQLITE_OMIT_TRIGGER +cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { + sqlite3DropTrigger(pParse,X,NOERR); +} +%endif !SQLITE_OMIT_TRIGGER + +//////////////////////// ATTACH DATABASE file AS name ///////////////////////// +%ifndef SQLITE_OMIT_ATTACH +cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { + sqlite3Attach(pParse, F, D, K); +} +cmd ::= DETACH database_kw_opt expr(D). { + sqlite3Detach(pParse, D); +} + +%type key_opt {Expr *} +%destructor key_opt {sqlite3ExprDelete($$);} +key_opt(A) ::= . { A = 0; } +key_opt(A) ::= KEY expr(X). { A = X; } + +database_kw_opt ::= DATABASE. +database_kw_opt ::= . +%endif SQLITE_OMIT_ATTACH + +////////////////////////// REINDEX collation ////////////////////////////////// +%ifndef SQLITE_OMIT_REINDEX +cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} +cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} +%endif SQLITE_OMIT_REINDEX + +/////////////////////////////////// ANALYZE /////////////////////////////////// +%ifndef SQLITE_OMIT_ANALYZE +cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} +cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} +%endif + +//////////////////////// ALTER TABLE table ... //////////////////////////////// +%ifndef SQLITE_OMIT_ALTERTABLE +cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { + sqlite3AlterRenameTable(pParse,X,&Z); +} +cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { + sqlite3AlterFinishAddColumn(pParse, &Y); +} +add_column_fullname ::= fullname(X). { + sqlite3AlterBeginAddColumn(pParse, X); +} +kwcolumn_opt ::= . +kwcolumn_opt ::= COLUMNKW. +%endif SQLITE_OMIT_ALTERTABLE + +//////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// +%ifndef SQLITE_OMIT_VIRTUALTABLE +cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} +cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} +create_vtab ::= CREATE VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { + sqlite3VtabBeginParse(pParse, &X, &Y, &Z); +} +vtabarglist ::= vtabarg. +vtabarglist ::= vtabarglist COMMA vtabarg. +vtabarg ::= . {sqlite3VtabArgInit(pParse);} +vtabarg ::= vtabarg vtabargtoken. +vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} +vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} +lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} +anylist ::= . +anylist ::= anylist ANY(X). {sqlite3VtabArgExtend(pParse,&X);} +%endif SQLITE_OMIT_VIRTUALTABLE diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c b/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c new file mode 100644 index 0000000000..b4d9774c1a --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c @@ -0,0 +1,1186 @@ +/* +** 2003 April 6 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code used to implement the PRAGMA command. +** +** $Id: pragma.c,v 1.149 2007/08/31 18:34:59 drh Exp $ +*/ +#include "sqliteInt.h" +#include + +/* Ignore this whole file if pragmas are disabled +*/ +#if !defined(SQLITE_OMIT_PRAGMA) && !defined(SQLITE_OMIT_PARSER) + +/* +** Interpret the given string as a safety level. Return 0 for OFF, +** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or +** unrecognized string argument. +** +** Note that the values returned are one less that the values that +** should be passed into sqlite3BtreeSetSafetyLevel(). The is done +** to support legacy SQL code. The safety level used to be boolean +** and older scripts may have used numbers 0 for OFF and 1 for ON. +*/ +static int getSafetyLevel(const char *z){ + /* 123456789 123456789 */ + static const char zText[] = "onoffalseyestruefull"; + static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; + static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; + static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; + int i, n; + if( isdigit(*z) ){ + return atoi(z); + } + n = strlen(z); + for(i=0; i=0&&i<=2)?i:0); +} +#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Interpret the given string as a temp db location. Return 1 for file +** backed temporary databases, 2 for the Red-Black tree in memory database +** and 0 to use the compile-time default. +*/ +static int getTempStore(const char *z){ + if( z[0]>='0' && z[0]<='2' ){ + return z[0] - '0'; + }else if( sqlite3StrICmp(z, "file")==0 ){ + return 1; + }else if( sqlite3StrICmp(z, "memory")==0 ){ + return 2; + }else{ + return 0; + } +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Invalidate temp storage, either when the temp storage is changed +** from default, or when 'file' and the temp_store_directory has changed +*/ +static int invalidateTempStorage(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt!=0 ){ + if( !db->autoCommit ){ + sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " + "from within a transaction"); + return SQLITE_ERROR; + } + sqlite3BtreeClose(db->aDb[1].pBt); + db->aDb[1].pBt = 0; + sqlite3ResetInternalSchema(db, 0); + } + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** If the TEMP database is open, close it and mark the database schema +** as needing reloading. This must be done when using the TEMP_STORE +** or DEFAULT_TEMP_STORE pragmas. +*/ +static int changeTempStorage(Parse *pParse, const char *zStorageType){ + int ts = getTempStore(zStorageType); + sqlite3 *db = pParse->db; + if( db->temp_store==ts ) return SQLITE_OK; + if( invalidateTempStorage( pParse ) != SQLITE_OK ){ + return SQLITE_ERROR; + } + db->temp_store = ts; + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +/* +** Generate code to return a single integer value. +*/ +static void returnSingleInt(Parse *pParse, const char *zLabel, int value){ + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeAddOp(v, OP_Integer, value, 0); + if( pParse->explain==0 ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, P3_STATIC); + } + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); +} + +#ifndef SQLITE_OMIT_FLAG_PRAGMAS +/* +** Check to see if zRight and zLeft refer to a pragma that queries +** or changes one of the flags in db->flags. Return 1 if so and 0 if not. +** Also, implement the pragma. +*/ +static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){ + static const struct sPragmaType { + const char *zName; /* Name of the pragma */ + int mask; /* Mask for the db->flags value */ + } aPragma[] = { + { "full_column_names", SQLITE_FullColNames }, + { "short_column_names", SQLITE_ShortColNames }, + { "count_changes", SQLITE_CountRows }, + { "empty_result_callbacks", SQLITE_NullCallback }, + { "legacy_file_format", SQLITE_LegacyFileFmt }, + { "fullfsync", SQLITE_FullFSync }, +#ifdef SQLITE_DEBUG + { "sql_trace", SQLITE_SqlTrace }, + { "vdbe_listing", SQLITE_VdbeListing }, + { "vdbe_trace", SQLITE_VdbeTrace }, +#endif +#ifndef SQLITE_OMIT_CHECK + { "ignore_check_constraints", SQLITE_IgnoreChecks }, +#endif + /* The following is VERY experimental */ + { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode }, + { "omit_readlock", SQLITE_NoReadlock }, + + /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted + ** flag if there are any active statements. */ + { "read_uncommitted", SQLITE_ReadUncommitted }, + }; + int i; + const struct sPragmaType *p; + for(i=0, p=aPragma; izName)==0 ){ + sqlite3 *db = pParse->db; + Vdbe *v; + v = sqlite3GetVdbe(pParse); + if( v ){ + if( zRight==0 ){ + returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 ); + }else{ + if( getBoolean(zRight) ){ + db->flags |= p->mask; + }else{ + db->flags &= ~p->mask; + } + } + } + return 1; + } + } + return 0; +} +#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ + +/* +** Process a pragma statement. +** +** Pragmas are of this form: +** +** PRAGMA [database.]id [= value] +** +** The identifier might also be a string. The value is a string, and +** identifier, or a number. If minusFlag is true, then the value is +** a number that was preceded by a minus sign. +** +** If the left side is "database.id" then pId1 is the database name +** and pId2 is the id. If the left side is just "id" then pId1 is the +** id and pId2 is any empty string. +*/ +void sqlite3Pragma( + Parse *pParse, + Token *pId1, /* First part of [database.]id field */ + Token *pId2, /* Second part of [database.]id field, or NULL */ + Token *pValue, /* Token for , or NULL */ + int minusFlag /* True if a '-' sign preceded */ +){ + char *zLeft = 0; /* Nul-terminated UTF-8 string */ + char *zRight = 0; /* Nul-terminated UTF-8 string , or NULL */ + const char *zDb = 0; /* The database name */ + Token *pId; /* Pointer to token */ + int iDb; /* Database index for */ + sqlite3 *db = pParse->db; + Db *pDb; + Vdbe *v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + + /* Interpret the [database.] part of the pragma statement. iDb is the + ** index of the database this pragma is being applied to in db.aDb[]. */ + iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); + if( iDb<0 ) return; + pDb = &db->aDb[iDb]; + + /* If the temp database has been explicitly named as part of the + ** pragma, make sure it is open. + */ + if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ + return; + } + + zLeft = sqlite3NameFromToken(db, pId); + if( !zLeft ) return; + if( minusFlag ){ + zRight = sqlite3MPrintf(db, "-%T", pValue); + }else{ + zRight = sqlite3NameFromToken(db, pValue); + } + + zDb = ((iDb>0)?pDb->zName:0); + if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ + goto pragma_out; + } + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + /* + ** PRAGMA [database.]default_cache_size + ** PRAGMA [database.]default_cache_size=N + ** + ** The first form reports the current persistent setting for the + ** page cache size. The value returned is the maximum number of + ** pages in the page cache. The second form sets both the current + ** page cache size value and the persistent page cache size value + ** stored in the database file. + ** + ** The default cache size is stored in meta-value 2 of page 1 of the + ** database file. The cache size is actually the absolute value of + ** this memory location. The sign of meta-value 2 determines the + ** synchronous setting. A negative value means synchronous is off + ** and a positive value means synchronous is on. + */ + if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){ + static const VdbeOpList getCacheSize[] = { + { OP_ReadCookie, 0, 2, 0}, /* 0 */ + { OP_AbsValue, 0, 0, 0}, + { OP_Dup, 0, 0, 0}, + { OP_Integer, 0, 0, 0}, + { OP_Ne, 0, 6, 0}, + { OP_Integer, 0, 0, 0}, /* 5 */ + { OP_Callback, 1, 0, 0}, + }; + int addr; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + sqlite3VdbeUsesBtree(v, iDb); + if( !zRight ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", P3_STATIC); + addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); + sqlite3VdbeChangeP1(v, addr, iDb); + sqlite3VdbeChangeP1(v, addr+5, SQLITE_DEFAULT_CACHE_SIZE); + }else{ + int size = atoi(zRight); + if( size<0 ) size = -size; + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp(v, OP_Integer, size, 0); + sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 2); + addr = sqlite3VdbeAddOp(v, OP_Integer, 0, 0); + sqlite3VdbeAddOp(v, OP_Ge, 0, addr+3); + sqlite3VdbeAddOp(v, OP_Negative, 0, 0); + sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 2); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + }else + + /* + ** PRAGMA [database.]page_size + ** PRAGMA [database.]page_size=N + ** + ** The first form reports the current setting for the + ** database page size in bytes. The second form sets the + ** database page size value. The value can only be set if + ** the database has not yet been created. + */ + if( sqlite3StrICmp(zLeft,"page_size")==0 ){ + Btree *pBt = pDb->pBt; + if( !zRight ){ + int size = pBt ? sqlite3BtreeGetPageSize(pBt) : 0; + returnSingleInt(pParse, "page_size", size); + }else{ + /* Malloc may fail when setting the page-size, as there is an internal + ** buffer that the pager module resizes using sqlite3_realloc(). + */ + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, atoi(zRight), -1) ){ + db->mallocFailed = 1; + } + } + }else + + /* + ** PRAGMA [database.]max_page_count + ** PRAGMA [database.]max_page_count=N + ** + ** The first form reports the current setting for the + ** maximum number of pages in the database file. The + ** second form attempts to change this setting. Both + ** forms return the current setting. + */ + if( sqlite3StrICmp(zLeft,"max_page_count")==0 ){ + Btree *pBt = pDb->pBt; + int newMax = 0; + if( zRight ){ + newMax = atoi(zRight); + } + if( pBt ){ + newMax = sqlite3BtreeMaxPageCount(pBt, newMax); + } + returnSingleInt(pParse, "max_page_count", newMax); + }else + + /* + ** PRAGMA [database.]locking_mode + ** PRAGMA [database.]locking_mode = (normal|exclusive) + */ + if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){ + const char *zRet = "normal"; + int eMode = getLockingMode(zRight); + + if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ + /* Simple "PRAGMA locking_mode;" statement. This is a query for + ** the current default locking mode (which may be different to + ** the locking-mode of the main database). + */ + eMode = db->dfltLockMode; + }else{ + Pager *pPager; + if( pId2->n==0 ){ + /* This indicates that no database name was specified as part + ** of the PRAGMA command. In this case the locking-mode must be + ** set on all attached databases, as well as the main db file. + ** + ** Also, the sqlite3.dfltLockMode variable is set so that + ** any subsequently attached databases also use the specified + ** locking mode. + */ + int ii; + assert(pDb==&db->aDb[0]); + for(ii=2; iinDb; ii++){ + pPager = sqlite3BtreePager(db->aDb[ii].pBt); + sqlite3PagerLockingMode(pPager, eMode); + } + db->dfltLockMode = eMode; + } + pPager = sqlite3BtreePager(pDb->pBt); + eMode = sqlite3PagerLockingMode(pPager, eMode); + } + + assert(eMode==PAGER_LOCKINGMODE_NORMAL||eMode==PAGER_LOCKINGMODE_EXCLUSIVE); + if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ + zRet = "exclusive"; + } + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", P3_STATIC); + sqlite3VdbeOp3(v, OP_String8, 0, 0, zRet, 0); + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + }else +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + + /* + ** PRAGMA [database.]auto_vacuum + ** PRAGMA [database.]auto_vacuum=N + ** + ** Get or set the (boolean) value of the database 'auto-vacuum' parameter. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){ + Btree *pBt = pDb->pBt; + if( sqlite3ReadSchema(pParse) ){ + goto pragma_out; + } + if( !zRight ){ + int auto_vacuum = + pBt ? sqlite3BtreeGetAutoVacuum(pBt) : SQLITE_DEFAULT_AUTOVACUUM; + returnSingleInt(pParse, "auto_vacuum", auto_vacuum); + }else{ + int eAuto = getAutoVacuum(zRight); + if( eAuto>=0 ){ + /* Call SetAutoVacuum() to set initialize the internal auto and + ** incr-vacuum flags. This is required in case this connection + ** creates the database file. It is important that it is created + ** as an auto-vacuum capable db. + */ + int rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); + if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ + /* When setting the auto_vacuum mode to either "full" or + ** "incremental", write the value of meta[6] in the database + ** file. Before writing to meta[6], check that meta[3] indicates + ** that this really is an auto-vacuum capable database. + */ + static const VdbeOpList setMeta6[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_ReadCookie, 0, 3, 0}, /* 1 */ + { OP_If, 0, 0, 0}, /* 2 */ + { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ + { OP_Integer, 0, 0, 0}, /* 4 */ + { OP_SetCookie, 0, 6, 0}, /* 5 */ + }; + int iAddr; + iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6); + sqlite3VdbeChangeP1(v, iAddr, iDb); + sqlite3VdbeChangeP1(v, iAddr+1, iDb); + sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4); + sqlite3VdbeChangeP1(v, iAddr+4, eAuto-1); + sqlite3VdbeChangeP1(v, iAddr+5, iDb); + sqlite3VdbeUsesBtree(v, iDb); + } + } + } + }else +#endif + + /* + ** PRAGMA [database.]incremental_vacuum(N) + ** + ** Do N steps of incremental vacuuming on a database. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( sqlite3StrICmp(zLeft,"incremental_vacuum")==0 ){ + int iLimit, addr; + if( sqlite3ReadSchema(pParse) ){ + goto pragma_out; + } + if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ + iLimit = 0x7fffffff; + } + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp(v, OP_MemInt, iLimit, 0); + addr = sqlite3VdbeAddOp(v, OP_IncrVacuum, iDb, 0); + sqlite3VdbeAddOp(v, OP_Callback, 0, 0); + sqlite3VdbeAddOp(v, OP_MemIncr, -1, 0); + sqlite3VdbeAddOp(v, OP_IfMemPos, 0, addr); + sqlite3VdbeJumpHere(v, addr); + }else +#endif + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + /* + ** PRAGMA [database.]cache_size + ** PRAGMA [database.]cache_size=N + ** + ** The first form reports the current local setting for the + ** page cache size. The local setting can be different from + ** the persistent cache size value that is stored in the database + ** file itself. The value returned is the maximum number of + ** pages in the page cache. The second form sets the local + ** page cache size value. It does not change the persistent + ** cache size stored on the disk so the cache size will revert + ** to its default value when the database is closed and reopened. + ** N should be a positive integer. + */ + if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + if( !zRight ){ + returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); + }else{ + int size = atoi(zRight); + if( size<0 ) size = -size; + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + }else + + /* + ** PRAGMA temp_store + ** PRAGMA temp_store = "default"|"memory"|"file" + ** + ** Return or set the local value of the temp_store flag. Changing + ** the local value does not make changes to the disk file and the default + ** value will be restored the next time the database is opened. + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + if( sqlite3StrICmp(zLeft, "temp_store")==0 ){ + if( !zRight ){ + returnSingleInt(pParse, "temp_store", db->temp_store); + }else{ + changeTempStorage(pParse, zRight); + } + }else + + /* + ** PRAGMA temp_store_directory + ** PRAGMA temp_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the temp_store_directory flag. Changing + ** the value sets a specific directory to be used for temporary files. + ** Setting to a null string reverts to the default temporary directory search. + ** If temporary directory is changed, then invalidateTempStorage. + ** + */ + if( sqlite3StrICmp(zLeft, "temp_store_directory")==0 ){ + if( !zRight ){ + if( sqlite3_temp_directory ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, + "temp_store_directory", P3_STATIC); + sqlite3VdbeOp3(v, OP_String8, 0, 0, sqlite3_temp_directory, 0); + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + } + }else{ + if( zRight[0] + && !sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE) + ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + if( TEMP_STORE==0 + || (TEMP_STORE==1 && db->temp_store<=1) + || (TEMP_STORE==2 && db->temp_store==1) + ){ + invalidateTempStorage(pParse); + } + sqlite3_free(sqlite3_temp_directory); + if( zRight[0] ){ + sqlite3_temp_directory = zRight; + zRight = 0; + }else{ + sqlite3_temp_directory = 0; + } + } + }else + + /* + ** PRAGMA [database.]synchronous + ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL + ** + ** Return or set the local value of the synchronous flag. Changing + ** the local value does not make changes to the disk file and the + ** default value will be restored the next time the database is + ** opened. + */ + if( sqlite3StrICmp(zLeft,"synchronous")==0 ){ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + if( !zRight ){ + returnSingleInt(pParse, "synchronous", pDb->safety_level-1); + }else{ + if( !db->autoCommit ){ + sqlite3ErrorMsg(pParse, + "Safety level may not be changed inside a transaction"); + }else{ + pDb->safety_level = getSafetyLevel(zRight)+1; + } + } + }else +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_FLAG_PRAGMAS + if( flagPragma(pParse, zLeft, zRight) ){ + /* The flagPragma() subroutine also generates any necessary code + ** there is nothing more to do here */ + }else +#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ + +#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS + /* + ** PRAGMA table_info(
      ) + ** + ** Return a single row for each column of the named table. The columns of + ** the returned data set are: + ** + ** cid: Column id (numbered from left to right, starting at 0) + ** name: Column name + ** type: Column declaration type. + ** notnull: True if 'NOT NULL' is part of column declaration + ** dflt_value: The default value for the column, if any. + */ + if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){ + Table *pTab; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + int i; + int nHidden = 0; + Column *pCol; + sqlite3VdbeSetNumCols(v, 6); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", P3_STATIC); + sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", P3_STATIC); + sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", P3_STATIC); + sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", P3_STATIC); + sqlite3ViewGetColumnNames(pParse, pTab); + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + const Token *pDflt; + if( IsHiddenColumn(pCol) ){ + nHidden++; + continue; + } + sqlite3VdbeAddOp(v, OP_Integer, i-nHidden, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pCol->zName, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, + pCol->zType ? pCol->zType : "", 0); + sqlite3VdbeAddOp(v, OP_Integer, pCol->notNull, 0); + if( pCol->pDflt && (pDflt = &pCol->pDflt->span)->z ){ + sqlite3VdbeOp3(v, OP_String8, 0, 0, (char*)pDflt->z, pDflt->n); + }else{ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + } + sqlite3VdbeAddOp(v, OP_Integer, pCol->isPrimKey, 0); + sqlite3VdbeAddOp(v, OP_Callback, 6, 0); + } + } + }else + + if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){ + Index *pIdx; + Table *pTab; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx ){ + int i; + pTab = pIdx->pTable; + sqlite3VdbeSetNumCols(v, 3); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", P3_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", P3_STATIC); + for(i=0; inColumn; i++){ + int cnum = pIdx->aiColumn[i]; + sqlite3VdbeAddOp(v, OP_Integer, i, 0); + sqlite3VdbeAddOp(v, OP_Integer, cnum, 0); + assert( pTab->nCol>cnum ); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->aCol[cnum].zName, 0); + sqlite3VdbeAddOp(v, OP_Callback, 3, 0); + } + } + }else + + if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){ + Index *pIdx; + Table *pTab; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + v = sqlite3GetVdbe(pParse); + pIdx = pTab->pIndex; + if( pIdx ){ + int i = 0; + sqlite3VdbeSetNumCols(v, 3); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", P3_STATIC); + while(pIdx){ + sqlite3VdbeAddOp(v, OP_Integer, i, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pIdx->zName, 0); + sqlite3VdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0); + sqlite3VdbeAddOp(v, OP_Callback, 3, 0); + ++i; + pIdx = pIdx->pNext; + } + } + } + }else + + if( sqlite3StrICmp(zLeft, "database_list")==0 ){ + int i; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + sqlite3VdbeSetNumCols(v, 3); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", P3_STATIC); + for(i=0; inDb; i++){ + if( db->aDb[i].pBt==0 ) continue; + assert( db->aDb[i].zName!=0 ); + sqlite3VdbeAddOp(v, OP_Integer, i, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, db->aDb[i].zName, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, + sqlite3BtreeGetFilename(db->aDb[i].pBt), 0); + sqlite3VdbeAddOp(v, OP_Callback, 3, 0); + } + }else + + if( sqlite3StrICmp(zLeft, "collation_list")==0 ){ + int i = 0; + HashElem *p; + sqlite3VdbeSetNumCols(v, 2); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); + for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(p); + sqlite3VdbeAddOp(v, OP_Integer, i++, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pColl->zName, 0); + sqlite3VdbeAddOp(v, OP_Callback, 2, 0); + } + }else +#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){ + FKey *pFK; + Table *pTab; + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + v = sqlite3GetVdbe(pParse); + pFK = pTab->pFKey; + if( pFK ){ + int i = 0; + sqlite3VdbeSetNumCols(v, 5); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", P3_STATIC); + sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", P3_STATIC); + sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", P3_STATIC); + sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", P3_STATIC); + while(pFK){ + int j; + for(j=0; jnCol; j++){ + char *zCol = pFK->aCol[j].zCol; + sqlite3VdbeAddOp(v, OP_Integer, i, 0); + sqlite3VdbeAddOp(v, OP_Integer, j, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, pFK->zTo, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, + pTab->aCol[pFK->aCol[j].iFrom].zName, 0); + sqlite3VdbeOp3(v, zCol ? OP_String8 : OP_Null, 0, 0, zCol, 0); + sqlite3VdbeAddOp(v, OP_Callback, 5, 0); + } + ++i; + pFK = pFK->pNextFrom; + } + } + } + }else +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef NDEBUG + if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){ + if( zRight ){ + if( getBoolean(zRight) ){ + sqlite3ParserTrace(stderr, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } + } + }else +#endif + + /* Reinstall the LIKE and GLOB functions. The variant of LIKE + ** used will be case sensitive or not depending on the RHS. + */ + if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){ + if( zRight ){ + sqlite3RegisterLikeFunctions(db, getBoolean(zRight)); + } + }else + +#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX +# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 +#endif + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + if( sqlite3StrICmp(zLeft, "integrity_check")==0 ){ + int i, j, addr, mxErr; + + /* Code that appears at the end of the integrity check. If no error + ** messages have been generated, output OK. Otherwise output the + ** error message + */ + static const VdbeOpList endCode[] = { + { OP_MemLoad, 0, 0, 0}, + { OP_Integer, 0, 0, 0}, + { OP_Ne, 0, 0, 0}, /* 2 */ + { OP_String8, 0, 0, "ok"}, + { OP_Callback, 1, 0, 0}, + }; + + /* Initialize the VDBE program */ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", P3_STATIC); + + /* Set the maximum error count */ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + if( zRight ){ + mxErr = atoi(zRight); + if( mxErr<=0 ){ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + } + } + sqlite3VdbeAddOp(v, OP_MemInt, mxErr, 0); + + /* Do an integrity check on each database file */ + for(i=0; inDb; i++){ + HashElem *x; + Hash *pTbls; + int cnt = 0; + + if( OMIT_TEMPDB && i==1 ) continue; + + sqlite3CodeVerifySchema(pParse, i); + addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); + sqlite3VdbeAddOp(v, OP_Halt, 0, 0); + sqlite3VdbeJumpHere(v, addr); + + /* Do an integrity check of the B-Tree + */ + pTbls = &db->aDb[i].pSchema->tblHash; + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + sqlite3VdbeAddOp(v, OP_Integer, pTab->tnum, 0); + cnt++; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3VdbeAddOp(v, OP_Integer, pIdx->tnum, 0); + cnt++; + } + } + if( cnt==0 ) continue; + sqlite3VdbeAddOp(v, OP_IntegrityCk, 0, i); + addr = sqlite3VdbeAddOp(v, OP_IsNull, -1, 0); + sqlite3VdbeOp3(v, OP_String8, 0, 0, + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), + P3_DYNAMIC); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + sqlite3VdbeAddOp(v, OP_Concat, 0, 0); + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + sqlite3VdbeJumpHere(v, addr); + + /* Make sure all the indices are constructed correctly. + */ + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + int loopTop; + + if( pTab->pIndex==0 ) continue; + addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); + sqlite3VdbeAddOp(v, OP_Halt, 0, 0); + sqlite3VdbeJumpHere(v, addr); + sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead); + sqlite3VdbeAddOp(v, OP_MemInt, 0, 1); + loopTop = sqlite3VdbeAddOp(v, OP_Rewind, 1, 0); + sqlite3VdbeAddOp(v, OP_MemIncr, 1, 1); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int jmp2; + static const VdbeOpList idxErr[] = { + { OP_MemIncr, -1, 0, 0}, + { OP_String8, 0, 0, "rowid "}, + { OP_Rowid, 1, 0, 0}, + { OP_String8, 0, 0, " missing from index "}, + { OP_String8, 0, 0, 0}, /* 4 */ + { OP_Concat, 2, 0, 0}, + { OP_Callback, 1, 0, 0}, + }; + sqlite3GenerateIndexKey(v, pIdx, 1); + jmp2 = sqlite3VdbeAddOp(v, OP_Found, j+2, 0); + addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); + sqlite3VdbeChangeP3(v, addr+4, pIdx->zName, P3_STATIC); + sqlite3VdbeJumpHere(v, jmp2); + } + sqlite3VdbeAddOp(v, OP_Next, 1, loopTop+1); + sqlite3VdbeJumpHere(v, loopTop); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + static const VdbeOpList cntIdx[] = { + { OP_MemInt, 0, 2, 0}, + { OP_Rewind, 0, 0, 0}, /* 1 */ + { OP_MemIncr, 1, 2, 0}, + { OP_Next, 0, 0, 0}, /* 3 */ + { OP_MemLoad, 1, 0, 0}, + { OP_MemLoad, 2, 0, 0}, + { OP_Eq, 0, 0, 0}, /* 6 */ + { OP_MemIncr, -1, 0, 0}, + { OP_String8, 0, 0, "wrong # of entries in index "}, + { OP_String8, 0, 0, 0}, /* 9 */ + { OP_Concat, 0, 0, 0}, + { OP_Callback, 1, 0, 0}, + }; + if( pIdx->tnum==0 ) continue; + addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); + sqlite3VdbeAddOp(v, OP_Halt, 0, 0); + sqlite3VdbeJumpHere(v, addr); + addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); + sqlite3VdbeChangeP1(v, addr+1, j+2); + sqlite3VdbeChangeP2(v, addr+1, addr+4); + sqlite3VdbeChangeP1(v, addr+3, j+2); + sqlite3VdbeChangeP2(v, addr+3, addr+2); + sqlite3VdbeJumpHere(v, addr+6); + sqlite3VdbeChangeP3(v, addr+9, pIdx->zName, P3_STATIC); + } + } + } + addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); + sqlite3VdbeChangeP1(v, addr+1, mxErr); + sqlite3VdbeJumpHere(v, addr+2); + }else +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_UTF16 + /* + ** PRAGMA encoding + ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" + ** + ** In it's first form, this pragma returns the encoding of the main + ** database. If the database is not initialized, it is initialized now. + ** + ** The second form of this pragma is a no-op if the main database file + ** has not already been initialized. In this case it sets the default + ** encoding that will be used for the main database file if a new file + ** is created. If an existing main database file is opened, then the + ** default text encoding for the existing database is used. + ** + ** In all cases new databases created using the ATTACH command are + ** created to use the same default text encoding as the main database. If + ** the main database has not been initialized and/or created when ATTACH + ** is executed, this is done before the ATTACH operation. + ** + ** In the second form this pragma sets the text encoding to be used in + ** new database files created using this database handle. It is only + ** useful if invoked immediately after the main database i + */ + if( sqlite3StrICmp(zLeft, "encoding")==0 ){ + static const struct EncName { + char *zName; + u8 enc; + } encnames[] = { + { "UTF-8", SQLITE_UTF8 }, + { "UTF8", SQLITE_UTF8 }, + { "UTF-16le", SQLITE_UTF16LE }, + { "UTF16le", SQLITE_UTF16LE }, + { "UTF-16be", SQLITE_UTF16BE }, + { "UTF16be", SQLITE_UTF16BE }, + { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ + { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ + { 0, 0 } + }; + const struct EncName *pEnc; + if( !zRight ){ /* "PRAGMA encoding" */ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", P3_STATIC); + sqlite3VdbeAddOp(v, OP_String8, 0, 0); + for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ + if( pEnc->enc==ENC(pParse->db) ){ + sqlite3VdbeChangeP3(v, -1, pEnc->zName, P3_STATIC); + break; + } + } + sqlite3VdbeAddOp(v, OP_Callback, 1, 0); + }else{ /* "PRAGMA encoding = XXX" */ + /* Only change the value of sqlite.enc if the database handle is not + ** initialized. If the main database exists, the new sqlite.enc value + ** will be overwritten when the schema is next loaded. If it does not + ** already exists, it will be created to use the new encoding value. + */ + if( + !(DbHasProperty(db, 0, DB_SchemaLoaded)) || + DbHasProperty(db, 0, DB_Empty) + ){ + for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ + if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ + ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; + break; + } + } + if( !pEnc->zName ){ + sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); + } + } + } + }else +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + /* + ** PRAGMA [database.]schema_version + ** PRAGMA [database.]schema_version = + ** + ** PRAGMA [database.]user_version + ** PRAGMA [database.]user_version = + ** + ** The pragma's schema_version and user_version are used to set or get + ** the value of the schema-version and user-version, respectively. Both + ** the schema-version and the user-version are 32-bit signed integers + ** stored in the database header. + ** + ** The schema-cookie is usually only manipulated internally by SQLite. It + ** is incremented by SQLite whenever the database schema is modified (by + ** creating or dropping a table or index). The schema version is used by + ** SQLite each time a query is executed to ensure that the internal cache + ** of the schema used when compiling the SQL query matches the schema of + ** the database against which the compiled query is actually executed. + ** Subverting this mechanism by using "PRAGMA schema_version" to modify + ** the schema-version is potentially dangerous and may lead to program + ** crashes or database corruption. Use with caution! + ** + ** The user-version is not used internally by SQLite. It may be used by + ** applications for any purpose. + */ + if( sqlite3StrICmp(zLeft, "schema_version")==0 + || sqlite3StrICmp(zLeft, "user_version")==0 + || sqlite3StrICmp(zLeft, "freelist_count")==0 + ){ + + int iCookie; /* Cookie index. 0 for schema-cookie, 6 for user-cookie. */ + sqlite3VdbeUsesBtree(v, iDb); + switch( zLeft[0] ){ + case 's': case 'S': + iCookie = 0; + break; + case 'f': case 'F': + iCookie = 1; + iDb = (-1*(iDb+1)); + assert(iDb<=0); + break; + default: + iCookie = 5; + break; + } + + if( zRight && iDb>=0 ){ + /* Write the specified cookie value */ + static const VdbeOpList setCookie[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_Integer, 0, 0, 0}, /* 1 */ + { OP_SetCookie, 0, 0, 0}, /* 2 */ + }; + int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); + sqlite3VdbeChangeP1(v, addr, iDb); + sqlite3VdbeChangeP1(v, addr+1, atoi(zRight)); + sqlite3VdbeChangeP1(v, addr+2, iDb); + sqlite3VdbeChangeP2(v, addr+2, iCookie); + }else{ + /* Read the specified cookie value */ + static const VdbeOpList readCookie[] = { + { OP_ReadCookie, 0, 0, 0}, /* 0 */ + { OP_Callback, 1, 0, 0} + }; + int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); + sqlite3VdbeChangeP1(v, addr, iDb); + sqlite3VdbeChangeP2(v, addr, iCookie); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, P3_TRANSIENT); + } + }else +#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* + ** Report the current state of file logs for all databases + */ + if( sqlite3StrICmp(zLeft, "lock_status")==0 ){ + static const char *const azLockName[] = { + "unlocked", "shared", "reserved", "pending", "exclusive" + }; + int i; + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeSetNumCols(v, 2); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", P3_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", P3_STATIC); + for(i=0; inDb; i++){ + Btree *pBt; + Pager *pPager; + const char *zState = "unknown"; + int j; + if( db->aDb[i].zName==0 ) continue; + sqlite3VdbeOp3(v, OP_String8, 0, 0, db->aDb[i].zName, P3_STATIC); + pBt = db->aDb[i].pBt; + if( pBt==0 || (pPager = sqlite3BtreePager(pBt))==0 ){ + zState = "closed"; + }else if( sqlite3_file_control(db, db->aDb[i].zName, + SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ + zState = azLockName[j]; + } + sqlite3VdbeOp3(v, OP_String8, 0, 0, zState, P3_STATIC); + sqlite3VdbeAddOp(v, OP_Callback, 2, 0); + } + }else +#endif + +#ifdef SQLITE_SSE + /* + ** Check to see if the sqlite_statements table exists. Create it + ** if it does not. + */ + if( sqlite3StrICmp(zLeft, "create_sqlite_statement_table")==0 ){ + extern int sqlite3CreateStatementsTable(Parse*); + sqlite3CreateStatementsTable(pParse); + }else +#endif + +#if SQLITE_HAS_CODEC + if( sqlite3StrICmp(zLeft, "key")==0 ){ + sqlite3_key(db, zRight, strlen(zRight)); + }else +#endif +#if SQLITE_HAS_CODEC || defined(SQLITE_ENABLE_CEROD) + if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){ +#if SQLITE_HAS_CODEC + if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){ + extern void sqlite3_activate_see(const char*); + sqlite3_activate_see(&zRight[4]); + } +#endif +#ifdef SQLITE_ENABLE_CEROD + if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ + extern void sqlite3_activate_cerod(const char*); + sqlite3_activate_cerod(&zRight[6]); + } +#endif + } +#endif + + {} + + if( v ){ + /* Code an OP_Expire at the end of each PRAGMA program to cause + ** the VDBE implementing the pragma to expire. Most (all?) pragmas + ** are only valid for a single execution. + */ + sqlite3VdbeAddOp(v, OP_Expire, 1, 0); + + /* + ** Reset the safety level, in case the fullfsync flag or synchronous + ** setting changed. + */ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + if( db->autoCommit ){ + sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level, + (db->flags&SQLITE_FullFSync)!=0); + } +#endif + } +pragma_out: + sqlite3_free(zLeft); + sqlite3_free(zRight); +} + +#endif /* SQLITE_OMIT_PRAGMA || SQLITE_OMIT_PARSER */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c b/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c new file mode 100644 index 0000000000..a1a0a40537 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c @@ -0,0 +1,742 @@ +/* +** 2005 May 25 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the implementation of the sqlite3_prepare() +** interface, and routines that contribute to loading the database schema +** from disk. +** +** $Id: prepare.c,v 1.61 2007/10/03 08:46:45 danielk1977 Exp $ +*/ +#include "sqliteInt.h" +#include + +/* +** Fill the InitData structure with an error message that indicates +** that the database is corrupt. +*/ +static void corruptSchema(InitData *pData, const char *zExtra){ + if( !pData->db->mallocFailed ){ + sqlite3SetString(pData->pzErrMsg, "malformed database schema", + zExtra!=0 && zExtra[0]!=0 ? " - " : (char*)0, zExtra, (char*)0); + } + pData->rc = SQLITE_CORRUPT; +} + +/* +** This is the callback routine for the code that initializes the +** database. See sqlite3Init() below for additional information. +** This routine is also called from the OP_ParseSchema opcode of the VDBE. +** +** Each callback contains the following information: +** +** argv[0] = name of thing being created +** argv[1] = root page number for table or index. 0 for trigger or view. +** argv[2] = SQL text for the CREATE statement. +** +*/ +int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){ + InitData *pData = (InitData*)pInit; + sqlite3 *db = pData->db; + int iDb = pData->iDb; + + assert( sqlite3_mutex_held(db->mutex) ); + pData->rc = SQLITE_OK; + DbClearProperty(db, iDb, DB_Empty); + if( db->mallocFailed ){ + corruptSchema(pData, 0); + return SQLITE_NOMEM; + } + + assert( argc==3 ); + if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ + if( argv[1]==0 ){ + corruptSchema(pData, 0); + return 1; + } + assert( iDb>=0 && iDbnDb ); + if( argv[2] && argv[2][0] ){ + /* Call the parser to process a CREATE TABLE, INDEX or VIEW. + ** But because db->init.busy is set to 1, no VDBE code is generated + ** or executed. All the parser does is build the internal data + ** structures that describe the table, index, or view. + */ + char *zErr; + int rc; + assert( db->init.busy ); + db->init.iDb = iDb; + db->init.newTnum = atoi(argv[1]); + rc = sqlite3_exec(db, argv[2], 0, 0, &zErr); + db->init.iDb = 0; + assert( rc!=SQLITE_OK || zErr==0 ); + if( SQLITE_OK!=rc ){ + pData->rc = rc; + if( rc==SQLITE_NOMEM ){ + db->mallocFailed = 1; + }else if( rc!=SQLITE_INTERRUPT ){ + corruptSchema(pData, zErr); + } + sqlite3_free(zErr); + return 1; + } + }else{ + /* If the SQL column is blank it means this is an index that + ** was created to be the PRIMARY KEY or to fulfill a UNIQUE + ** constraint for a CREATE TABLE. The index should have already + ** been created when we processed the CREATE TABLE. All we have + ** to do here is record the root page number for that index. + */ + Index *pIndex; + pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName); + if( pIndex==0 || pIndex->tnum!=0 ){ + /* This can occur if there exists an index on a TEMP table which + ** has the same name as another index on a permanent index. Since + ** the permanent table is hidden by the TEMP table, we can also + ** safely ignore the index on the permanent table. + */ + /* Do Nothing */; + }else{ + pIndex->tnum = atoi(argv[1]); + } + } + return 0; +} + +/* +** Attempt to read the database schema and initialize internal +** data structures for a single database file. The index of the +** database file is given by iDb. iDb==0 is used for the main +** database. iDb==1 should never be used. iDb>=2 is used for +** auxiliary databases. Return one of the SQLITE_ error codes to +** indicate success or failure. +*/ +static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ + int rc; + BtCursor *curMain; + int size; + Table *pTab; + Db *pDb; + char const *azArg[4]; + int meta[10]; + InitData initData; + char const *zMasterSchema; + char const *zMasterName = SCHEMA_TABLE(iDb); + + /* + ** The master database table has a structure like this + */ + static const char master_schema[] = + "CREATE TABLE sqlite_master(\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")" + ; +#ifndef SQLITE_OMIT_TEMPDB + static const char temp_master_schema[] = + "CREATE TEMP TABLE sqlite_temp_master(\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")" + ; +#else + #define temp_master_schema 0 +#endif + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + + /* zMasterSchema and zInitScript are set to point at the master schema + ** and initialisation script appropriate for the database being + ** initialised. zMasterName is the name of the master table. + */ + if( !OMIT_TEMPDB && iDb==1 ){ + zMasterSchema = temp_master_schema; + }else{ + zMasterSchema = master_schema; + } + zMasterName = SCHEMA_TABLE(iDb); + + /* Construct the schema tables. */ + sqlite3SafetyOff(db); + azArg[0] = zMasterName; + azArg[1] = "1"; + azArg[2] = zMasterSchema; + azArg[3] = 0; + initData.db = db; + initData.iDb = iDb; + initData.pzErrMsg = pzErrMsg; + rc = sqlite3InitCallback(&initData, 3, (char **)azArg, 0); + if( rc ){ + sqlite3SafetyOn(db); + rc = initData.rc; + goto error_out; + } + pTab = sqlite3FindTable(db, zMasterName, db->aDb[iDb].zName); + if( pTab ){ + pTab->readOnly = 1; + } + sqlite3SafetyOn(db); + + /* Create a cursor to hold the database open + */ + pDb = &db->aDb[iDb]; + if( pDb->pBt==0 ){ + if( !OMIT_TEMPDB && iDb==1 ){ + DbSetProperty(db, 1, DB_SchemaLoaded); + } + return SQLITE_OK; + } + sqlite3BtreeEnter(pDb->pBt); + rc = sqlite3BtreeCursor(pDb->pBt, MASTER_ROOT, 0, 0, 0, &curMain); + if( rc!=SQLITE_OK && rc!=SQLITE_EMPTY ){ + sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0); + sqlite3BtreeLeave(pDb->pBt); + goto error_out; + } + + /* Get the database meta information. + ** + ** Meta values are as follows: + ** meta[0] Schema cookie. Changes with each schema change. + ** meta[1] File format of schema layer. + ** meta[2] Size of the page cache. + ** meta[3] Use freelist if 0. Autovacuum if greater than zero. + ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE + ** meta[5] The user cookie. Used by the application. + ** meta[6] Incremental-vacuum flag. + ** meta[7] + ** meta[8] + ** meta[9] + ** + ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to + ** the possible values of meta[4]. + */ + if( rc==SQLITE_OK ){ + int i; + for(i=0; rc==SQLITE_OK && ipBt, i+1, (u32 *)&meta[i]); + } + if( rc ){ + sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0); + sqlite3BtreeCloseCursor(curMain); + sqlite3BtreeLeave(pDb->pBt); + goto error_out; + } + }else{ + memset(meta, 0, sizeof(meta)); + } + pDb->pSchema->schema_cookie = meta[0]; + + /* If opening a non-empty database, check the text encoding. For the + ** main database, set sqlite3.enc to the encoding of the main database. + ** For an attached db, it is an error if the encoding is not the same + ** as sqlite3.enc. + */ + if( meta[4] ){ /* text encoding */ + if( iDb==0 ){ + /* If opening the main database, set ENC(db). */ + ENC(db) = (u8)meta[4]; + db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0); + }else{ + /* If opening an attached database, the encoding much match ENC(db) */ + if( meta[4]!=ENC(db) ){ + sqlite3BtreeCloseCursor(curMain); + sqlite3SetString(pzErrMsg, "attached databases must use the same" + " text encoding as main database", (char*)0); + sqlite3BtreeLeave(pDb->pBt); + return SQLITE_ERROR; + } + } + }else{ + DbSetProperty(db, iDb, DB_Empty); + } + pDb->pSchema->enc = ENC(db); + + size = meta[2]; + if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + + /* + ** file_format==1 Version 3.0.0. + ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN + ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults + ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants + */ + pDb->pSchema->file_format = meta[1]; + if( pDb->pSchema->file_format==0 ){ + pDb->pSchema->file_format = 1; + } + if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ + sqlite3BtreeCloseCursor(curMain); + sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0); + sqlite3BtreeLeave(pDb->pBt); + return SQLITE_ERROR; + } + + + /* Read the schema information out of the schema tables + */ + assert( db->init.busy ); + if( rc==SQLITE_EMPTY ){ + /* For an empty database, there is nothing to read */ + rc = SQLITE_OK; + }else{ + char *zSql; + zSql = sqlite3MPrintf(db, + "SELECT name, rootpage, sql FROM '%q'.%s", + db->aDb[iDb].zName, zMasterName); + sqlite3SafetyOff(db); + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); + if( rc==SQLITE_ABORT ) rc = initData.rc; + sqlite3SafetyOn(db); + sqlite3_free(zSql); +#ifndef SQLITE_OMIT_ANALYZE + if( rc==SQLITE_OK ){ + sqlite3AnalysisLoad(db, iDb); + } +#endif + sqlite3BtreeCloseCursor(curMain); + } + if( db->mallocFailed ){ + /* sqlite3SetString(pzErrMsg, "out of memory", (char*)0); */ + rc = SQLITE_NOMEM; + sqlite3ResetInternalSchema(db, 0); + } + if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ + /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider + ** the schema loaded, even if errors occured. In this situation the + ** current sqlite3_prepare() operation will fail, but the following one + ** will attempt to compile the supplied statement against whatever subset + ** of the schema was loaded before the error occured. The primary + ** purpose of this is to allow access to the sqlite_master table + ** even when it's contents have been corrupted. + */ + DbSetProperty(db, iDb, DB_SchemaLoaded); + rc = SQLITE_OK; + } + sqlite3BtreeLeave(pDb->pBt); + +error_out: + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + db->mallocFailed = 1; + } + return rc; +} + +/* +** Initialize all database files - the main database file, the file +** used to store temporary tables, and any additional database files +** created using ATTACH statements. Return a success code. If an +** error occurs, write an error message into *pzErrMsg. +** +** After a database is initialized, the DB_SchemaLoaded bit is set +** bit is set in the flags field of the Db structure. If the database +** file was of zero-length, then the DB_Empty flag is also set. +*/ +int sqlite3Init(sqlite3 *db, char **pzErrMsg){ + int i, rc; + int commit_internal = !(db->flags&SQLITE_InternChanges); + + assert( sqlite3_mutex_held(db->mutex) ); + if( db->init.busy ) return SQLITE_OK; + rc = SQLITE_OK; + db->init.busy = 1; + for(i=0; rc==SQLITE_OK && inDb; i++){ + if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue; + rc = sqlite3InitOne(db, i, pzErrMsg); + if( rc ){ + sqlite3ResetInternalSchema(db, i); + } + } + + /* Once all the other databases have been initialised, load the schema + ** for the TEMP database. This is loaded last, as the TEMP database + ** schema may contain references to objects in other databases. + */ +#ifndef SQLITE_OMIT_TEMPDB + if( rc==SQLITE_OK && db->nDb>1 && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, 1, pzErrMsg); + if( rc ){ + sqlite3ResetInternalSchema(db, 1); + } + } +#endif + + db->init.busy = 0; + if( rc==SQLITE_OK && commit_internal ){ + sqlite3CommitInternalChanges(db); + } + + return rc; +} + +/* +** This routine is a no-op if the database schema is already initialised. +** Otherwise, the schema is loaded. An error code is returned. +*/ +int sqlite3ReadSchema(Parse *pParse){ + int rc = SQLITE_OK; + sqlite3 *db = pParse->db; + assert( sqlite3_mutex_held(db->mutex) ); + if( !db->init.busy ){ + rc = sqlite3Init(db, &pParse->zErrMsg); + } + if( rc!=SQLITE_OK ){ + pParse->rc = rc; + pParse->nErr++; + } + return rc; +} + + +/* +** Check schema cookies in all databases. If any cookie is out +** of date, return 0. If all schema cookies are current, return 1. +*/ +static int schemaIsValid(sqlite3 *db){ + int iDb; + int rc; + BtCursor *curTemp; + int cookie; + int allOk = 1; + + assert( sqlite3_mutex_held(db->mutex) ); + for(iDb=0; allOk && iDbnDb; iDb++){ + Btree *pBt; + pBt = db->aDb[iDb].pBt; + if( pBt==0 ) continue; + rc = sqlite3BtreeCursor(pBt, MASTER_ROOT, 0, 0, 0, &curTemp); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&cookie); + if( rc==SQLITE_OK && cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + allOk = 0; + } + sqlite3BtreeCloseCursor(curTemp); + } + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + db->mallocFailed = 1; + } + } + return allOk; +} + +/* +** Convert a schema pointer into the iDb index that indicates +** which database file in db->aDb[] the schema refers to. +** +** If the same database is attached more than once, the first +** attached database is returned. +*/ +int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ + int i = -1000000; + + /* If pSchema is NULL, then return -1000000. This happens when code in + ** expr.c is trying to resolve a reference to a transient table (i.e. one + ** created by a sub-select). In this case the return value of this + ** function should never be used. + ** + ** We return -1000000 instead of the more usual -1 simply because using + ** -1000000 as incorrectly using -1000000 index into db->aDb[] is much + ** more likely to cause a segfault than -1 (of course there are assert() + ** statements too, but it never hurts to play the odds). + */ + assert( sqlite3_mutex_held(db->mutex) ); + if( pSchema ){ + for(i=0; inDb; i++){ + if( db->aDb[i].pSchema==pSchema ){ + break; + } + } + assert( i>=0 &&i>=0 && inDb ); + } + return i; +} + +/* +** Compile the UTF-8 encoded SQL statement zSql into a statement handle. +*/ +int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + Parse sParse; + char *zErrMsg = 0; + int rc = SQLITE_OK; + int i; + + assert( ppStmt ); + *ppStmt = 0; + if( sqlite3SafetyOn(db) ){ + return SQLITE_MISUSE; + } + assert( !db->mallocFailed ); + assert( sqlite3_mutex_held(db->mutex) ); + + /* If any attached database schemas are locked, do not proceed with + ** compilation. Instead return SQLITE_LOCKED immediately. + */ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + int rc; + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zName; + sqlite3Error(db, SQLITE_LOCKED, "database schema is locked: %s", zDb); + sqlite3SafetyOff(db); + return SQLITE_LOCKED; + } + } + } + + memset(&sParse, 0, sizeof(sParse)); + sParse.db = db; + if( nBytes>=0 && zSql[nBytes]!=0 ){ + char *zSqlCopy; + if( nBytes>SQLITE_MAX_SQL_LENGTH ){ + return SQLITE_TOOBIG; + } + zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); + if( zSqlCopy ){ + sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); + sqlite3_free(zSqlCopy); + } + sParse.zTail = &zSql[nBytes]; + }else{ + sqlite3RunParser(&sParse, zSql, &zErrMsg); + } + + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM; + } + if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; + if( sParse.checkSchema && !schemaIsValid(db) ){ + sParse.rc = SQLITE_SCHEMA; + } + if( sParse.rc==SQLITE_SCHEMA ){ + sqlite3ResetInternalSchema(db, 0); + } + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM; + } + if( pzTail ){ + *pzTail = sParse.zTail; + } + rc = sParse.rc; + +#ifndef SQLITE_OMIT_EXPLAIN + if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ + if( sParse.explain==2 ){ + sqlite3VdbeSetNumCols(sParse.pVdbe, 3); + sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "order", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "from", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "detail", P3_STATIC); + }else{ + sqlite3VdbeSetNumCols(sParse.pVdbe, 5); + sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "addr", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "opcode", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "p1", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 3, COLNAME_NAME, "p2", P3_STATIC); + sqlite3VdbeSetColName(sParse.pVdbe, 4, COLNAME_NAME, "p3", P3_STATIC); + } + } +#endif + + if( sqlite3SafetyOff(db) ){ + rc = SQLITE_MISUSE; + } + + if( saveSqlFlag ){ + sqlite3VdbeSetSql(sParse.pVdbe, zSql, sParse.zTail - zSql); + } + if( rc!=SQLITE_OK || db->mallocFailed ){ + sqlite3_finalize((sqlite3_stmt*)sParse.pVdbe); + assert(!(*ppStmt)); + }else{ + *ppStmt = (sqlite3_stmt*)sParse.pVdbe; + } + + if( zErrMsg ){ + sqlite3Error(db, rc, "%s", zErrMsg); + sqlite3_free(zErrMsg); + }else{ + sqlite3Error(db, rc, 0); + } + + rc = sqlite3ApiExit(db, rc); + /* sqlite3ReleaseThreadData(); */ + assert( (rc&db->errMask)==rc ); + return rc; +} +static int sqlite3LockAndPrepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail); + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Rerun the compilation of a statement after a schema change. +** Return true if the statement was recompiled successfully. +** Return false if there is an error of some kind. +*/ +int sqlite3Reprepare(Vdbe *p){ + int rc; + sqlite3_stmt *pNew; + const char *zSql; + sqlite3 *db; + + assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); + zSql = sqlite3VdbeGetSql(p); + if( zSql==0 ){ + return 0; + } + db = sqlite3VdbeDb(p); + assert( sqlite3_mutex_held(db->mutex) ); + rc = sqlite3LockAndPrepare(db, zSql, -1, 0, &pNew, 0); + if( rc ){ + assert( pNew==0 ); + return 0; + }else{ + assert( pNew!=0 ); + } + sqlite3VdbeSwap((Vdbe*)pNew, p); + sqlite3_transfer_bindings(pNew, (sqlite3_stmt*)p); + sqlite3VdbeResetStepResult((Vdbe*)pNew); + sqlite3VdbeFinalize((Vdbe*)pNew); + return 1; +} + + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +int sqlite3_prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + return sqlite3LockAndPrepare(db,zSql,nBytes,0,ppStmt,pzTail); +} +int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + return sqlite3LockAndPrepare(db,zSql,nBytes,1,ppStmt,pzTail); +} + + +#ifndef SQLITE_OMIT_UTF16 +/* +** Compile the UTF-16 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + int saveSqlFlag, /* True to save SQL text into the sqlite3_stmt */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + /* This function currently works by first transforming the UTF-16 + ** encoded string to UTF-8, then invoking sqlite3_prepare(). The + ** tricky bit is figuring out the pointer to return in *pzTail. + */ + char *zSql8; + const char *zTail8 = 0; + int rc = SQLITE_OK; + + if( sqlite3SafetyCheck(db) ){ + return SQLITE_MISUSE; + } + sqlite3_mutex_enter(db->mutex); + zSql8 = sqlite3Utf16to8(db, zSql, nBytes); + if( zSql8 ){ + rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, ppStmt, &zTail8); + } + + if( zTail8 && pzTail ){ + /* If sqlite3_prepare returns a tail pointer, we calculate the + ** equivalent pointer into the UTF-16 string by counting the unicode + ** characters between zSql8 and zTail8, and then returning a pointer + ** the same number of characters into the UTF-16 string. + */ + int chars_parsed = sqlite3Utf8CharLen(zSql8, zTail8-zSql8); + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); + } + sqlite3_free(zSql8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +int sqlite3_prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + return sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail); +} +int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + return sqlite3Prepare16(db,zSql,nBytes,1,ppStmt,pzTail); +} + +#endif /* SQLITE_OMIT_UTF16 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c b/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c new file mode 100644 index 0000000000..bea91e211d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c @@ -0,0 +1,907 @@ +/* +** The "printf" code that follows dates from the 1980's. It is in +** the public domain. The original comments are included here for +** completeness. They are very out-of-date but might be useful as +** an historical reference. Most of the "enhancements" have been backed +** out so that the functionality is now the same as standard printf(). +** +************************************************************************** +** +** The following modules is an enhanced replacement for the "printf" subroutines +** found in the standard C library. The following enhancements are +** supported: +** +** + Additional functions. The standard set of "printf" functions +** includes printf, fprintf, sprintf, vprintf, vfprintf, and +** vsprintf. This module adds the following: +** +** * snprintf -- Works like sprintf, but has an extra argument +** which is the size of the buffer written to. +** +** * mprintf -- Similar to sprintf. Writes output to memory +** obtained from malloc. +** +** * xprintf -- Calls a function to dispose of output. +** +** * nprintf -- No output, but returns the number of characters +** that would have been output by printf. +** +** * A v- version (ex: vsnprintf) of every function is also +** supplied. +** +** + A few extensions to the formatting notation are supported: +** +** * The "=" flag (similar to "-") causes the output to be +** be centered in the appropriately sized field. +** +** * The %b field outputs an integer in binary notation. +** +** * The %c field now accepts a precision. The character output +** is repeated by the number of times the precision specifies. +** +** * The %' field works like %c, but takes as its character the +** next character of the format string, instead of the next +** argument. For example, printf("%.78'-") prints 78 minus +** signs, the same as printf("%.78c",'-'). +** +** + When compiled using GCC on a SPARC, this version of printf is +** faster than the library printf for SUN OS 4.1. +** +** + All functions are fully reentrant. +** +*/ +#include "sqliteInt.h" +#include + +/* +** Conversion types fall into various categories as defined by the +** following enumeration. +*/ +#define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */ +#define etFLOAT 2 /* Floating point. %f */ +#define etEXP 3 /* Exponentional notation. %e and %E */ +#define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */ +#define etSIZE 5 /* Return number of characters processed so far. %n */ +#define etSTRING 6 /* Strings. %s */ +#define etDYNSTRING 7 /* Dynamically allocated strings. %z */ +#define etPERCENT 8 /* Percent symbol. %% */ +#define etCHARX 9 /* Characters. %c */ +/* The rest are extensions, not normally found in printf() */ +#define etCHARLIT 10 /* Literal characters. %' */ +#define etSQLESCAPE 11 /* Strings with '\'' doubled. %q */ +#define etSQLESCAPE2 12 /* Strings with '\'' doubled and enclosed in '', + NULL pointers replaced by SQL NULL. %Q */ +#define etTOKEN 13 /* a pointer to a Token structure */ +#define etSRCLIST 14 /* a pointer to a SrcList */ +#define etPOINTER 15 /* The %p conversion */ +#define etSQLESCAPE3 16 /* %w -> Strings with '\"' doubled */ + + +/* +** An "etByte" is an 8-bit unsigned value. +*/ +typedef unsigned char etByte; + +/* +** Each builtin conversion character (ex: the 'd' in "%d") is described +** by an instance of the following structure +*/ +typedef struct et_info { /* Information about each format field */ + char fmttype; /* The format field code letter */ + etByte base; /* The base for radix conversion */ + etByte flags; /* One or more of FLAG_ constants below */ + etByte type; /* Conversion paradigm */ + etByte charset; /* Offset into aDigits[] of the digits string */ + etByte prefix; /* Offset into aPrefix[] of the prefix string */ +} et_info; + +/* +** Allowed values for et_info.flags +*/ +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ +#define FLAG_INTERN 2 /* True if for internal use only */ +#define FLAG_STRING 4 /* Allow infinity precision */ + + +/* +** The following table is searched linearly, so it is good to put the +** most frequently used conversion types first. +*/ +static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; +static const char aPrefix[] = "-x0\000X0"; +static const et_info fmtinfo[] = { + { 'd', 10, 1, etRADIX, 0, 0 }, + { 's', 0, 4, etSTRING, 0, 0 }, + { 'g', 0, 1, etGENERIC, 30, 0 }, + { 'z', 0, 4, etDYNSTRING, 0, 0 }, + { 'q', 0, 4, etSQLESCAPE, 0, 0 }, + { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, + { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, + { 'c', 0, 0, etCHARX, 0, 0 }, + { 'o', 8, 0, etRADIX, 0, 2 }, + { 'u', 10, 0, etRADIX, 0, 0 }, + { 'x', 16, 0, etRADIX, 16, 1 }, + { 'X', 16, 0, etRADIX, 0, 4 }, +#ifndef SQLITE_OMIT_FLOATING_POINT + { 'f', 0, 1, etFLOAT, 0, 0 }, + { 'e', 0, 1, etEXP, 30, 0 }, + { 'E', 0, 1, etEXP, 14, 0 }, + { 'G', 0, 1, etGENERIC, 14, 0 }, +#endif + { 'i', 10, 1, etRADIX, 0, 0 }, + { 'n', 0, 0, etSIZE, 0, 0 }, + { '%', 0, 0, etPERCENT, 0, 0 }, + { 'p', 16, 0, etPOINTER, 0, 1 }, + { 'T', 0, 2, etTOKEN, 0, 0 }, + { 'S', 0, 2, etSRCLIST, 0, 0 }, +}; +#define etNINFO (sizeof(fmtinfo)/sizeof(fmtinfo[0])) + +/* +** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point +** conversions will work. +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** "*val" is a double such that 0.1 <= *val < 10.0 +** Return the ascii code for the leading digit of *val, then +** multiply "*val" by 10.0 to renormalize. +** +** Example: +** input: *val = 3.14159 +** output: *val = 1.4159 function return = '3' +** +** The counter *cnt is incremented each time. After counter exceeds +** 16 (the number of significant digits in a 64-bit float) '0' is +** always returned. +*/ +static int et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ + int digit; + LONGDOUBLE_TYPE d; + if( (*cnt)++ >= 16 ) return '0'; + digit = (int)*val; + d = digit; + digit += '0'; + *val = (*val - d)*10.0; + return digit; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** On machines with a small stack size, you can redefine the +** SQLITE_PRINT_BUF_SIZE to be less than 350. But beware - for +** smaller values some %f conversions may go into an infinite loop. +*/ +#ifndef SQLITE_PRINT_BUF_SIZE +# define SQLITE_PRINT_BUF_SIZE 350 +#endif +#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ + +/* +** The root program. All variations call this core. +** +** INPUTS: +** func This is a pointer to a function taking three arguments +** 1. A pointer to anything. Same as the "arg" parameter. +** 2. A pointer to the list of characters to be output +** (Note, this list is NOT null terminated.) +** 3. An integer number of characters to be output. +** (Note: This number might be zero.) +** +** arg This is the pointer to anything which will be passed as the +** first argument to "func". Use it for whatever you like. +** +** fmt This is the format string, as in the usual print. +** +** ap This is a pointer to a list of arguments. Same as in +** vfprint. +** +** OUTPUTS: +** The return value is the total number of characters sent to +** the function "func". Returns -1 on a error. +** +** Note that the order in which automatic variables are declared below +** seems to make a big difference in determining how fast this beast +** will run. +*/ +static int vxprintf( + void (*func)(void*,const char*,int), /* Consumer of text */ + void *arg, /* First argument to the consumer */ + int useExtended, /* Allow extended %-conversions */ + const char *fmt, /* Format string */ + va_list ap /* arguments */ +){ + int c; /* Next character in the format string */ + char *bufpt; /* Pointer to the conversion buffer */ + int precision; /* Precision of the current field */ + int length; /* Length of the field */ + int idx; /* A general purpose loop counter */ + int count; /* Total number of characters output */ + int width; /* Width of the current field */ + etByte flag_leftjustify; /* True if "-" flag is present */ + etByte flag_plussign; /* True if "+" flag is present */ + etByte flag_blanksign; /* True if " " flag is present */ + etByte flag_alternateform; /* True if "#" flag is present */ + etByte flag_altform2; /* True if "!" flag is present */ + etByte flag_zeropad; /* True if field width constant starts with zero */ + etByte flag_long; /* True if "l" flag is present */ + etByte flag_longlong; /* True if the "ll" flag is present */ + etByte done; /* Loop termination flag */ + sqlite_uint64 longvalue; /* Value for integer types */ + LONGDOUBLE_TYPE realvalue; /* Value for real types */ + const et_info *infop; /* Pointer to the appropriate info structure */ + char buf[etBUFSIZE]; /* Conversion buffer */ + char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ + etByte errorflag = 0; /* True if an error is encountered */ + etByte xtype; /* Conversion paradigm */ + char *zExtra; /* Extra memory used for etTCLESCAPE conversions */ + static const char spaces[] = + " "; +#define etSPACESIZE (sizeof(spaces)-1) +#ifndef SQLITE_OMIT_FLOATING_POINT + int exp, e2; /* exponent of real numbers */ + double rounder; /* Used for rounding floating point values */ + etByte flag_dp; /* True if decimal point should be shown */ + etByte flag_rtz; /* True if trailing zeros should be removed */ + etByte flag_exp; /* True to force display of the exponent */ + int nsd; /* Number of significant digits returned */ +#endif + + func(arg,"",0); + count = length = 0; + bufpt = 0; + for(; (c=(*fmt))!=0; ++fmt){ + if( c!='%' ){ + int amt; + bufpt = (char *)fmt; + amt = 1; + while( (c=(*++fmt))!='%' && c!=0 ) amt++; + (*func)(arg,bufpt,amt); + count += amt; + if( c==0 ) break; + } + if( (c=(*++fmt))==0 ){ + errorflag = 1; + (*func)(arg,"%",1); + count++; + break; + } + /* Find out what flags are present */ + flag_leftjustify = flag_plussign = flag_blanksign = + flag_alternateform = flag_altform2 = flag_zeropad = 0; + done = 0; + do{ + switch( c ){ + case '-': flag_leftjustify = 1; break; + case '+': flag_plussign = 1; break; + case ' ': flag_blanksign = 1; break; + case '#': flag_alternateform = 1; break; + case '!': flag_altform2 = 1; break; + case '0': flag_zeropad = 1; break; + default: done = 1; break; + } + }while( !done && (c=(*++fmt))!=0 ); + /* Get the field width */ + width = 0; + if( c=='*' ){ + width = va_arg(ap,int); + if( width<0 ){ + flag_leftjustify = 1; + width = -width; + } + c = *++fmt; + }else{ + while( c>='0' && c<='9' ){ + width = width*10 + c - '0'; + c = *++fmt; + } + } + if( width > etBUFSIZE-10 ){ + width = etBUFSIZE-10; + } + /* Get the precision */ + if( c=='.' ){ + precision = 0; + c = *++fmt; + if( c=='*' ){ + precision = va_arg(ap,int); + if( precision<0 ) precision = -precision; + c = *++fmt; + }else{ + while( c>='0' && c<='9' ){ + precision = precision*10 + c - '0'; + c = *++fmt; + } + } + }else{ + precision = -1; + } + /* Get the conversion type modifier */ + if( c=='l' ){ + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + flag_longlong = 1; + c = *++fmt; + }else{ + flag_longlong = 0; + } + }else{ + flag_long = flag_longlong = 0; + } + /* Fetch the info entry for the field */ + infop = 0; + for(idx=0; idxflags & FLAG_INTERN)==0 ){ + xtype = infop->type; + }else{ + return -1; + } + break; + } + } + zExtra = 0; + if( infop==0 ){ + return -1; + } + + + /* Limit the precision to prevent overflowing buf[] during conversion */ + if( precision>etBUFSIZE-40 && (infop->flags & FLAG_STRING)==0 ){ + precision = etBUFSIZE-40; + } + + /* + ** At this point, variables are initialized as follows: + ** + ** flag_alternateform TRUE if a '#' is present. + ** flag_altform2 TRUE if a '!' is present. + ** flag_plussign TRUE if a '+' is present. + ** flag_leftjustify TRUE if a '-' is present or if the + ** field width was negative. + ** flag_zeropad TRUE if the width began with 0. + ** flag_long TRUE if the letter 'l' (ell) prefixed + ** the conversion character. + ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed + ** the conversion character. + ** flag_blanksign TRUE if a ' ' is present. + ** width The specified field width. This is + ** always non-negative. Zero is the default. + ** precision The specified precision. The default + ** is -1. + ** xtype The class of the conversion. + ** infop Pointer to the appropriate info struct. + */ + switch( xtype ){ + case etPOINTER: + flag_longlong = sizeof(char*)==sizeof(i64); + flag_long = sizeof(char*)==sizeof(long int); + /* Fall through into the next case */ + case etRADIX: + if( infop->flags & FLAG_SIGNED ){ + i64 v; + if( flag_longlong ) v = va_arg(ap,i64); + else if( flag_long ) v = va_arg(ap,long int); + else v = va_arg(ap,int); + if( v<0 ){ + longvalue = -v; + prefix = '-'; + }else{ + longvalue = v; + if( flag_plussign ) prefix = '+'; + else if( flag_blanksign ) prefix = ' '; + else prefix = 0; + } + }else{ + if( flag_longlong ) longvalue = va_arg(ap,u64); + else if( flag_long ) longvalue = va_arg(ap,unsigned long int); + else longvalue = va_arg(ap,unsigned int); + prefix = 0; + } + if( longvalue==0 ) flag_alternateform = 0; + if( flag_zeropad && precisioncharset]; + base = infop->base; + do{ /* Convert to ascii */ + *(--bufpt) = cset[longvalue%base]; + longvalue = longvalue/base; + }while( longvalue>0 ); + } + length = &buf[etBUFSIZE-1]-bufpt; + for(idx=precision-length; idx>0; idx--){ + *(--bufpt) = '0'; /* Zero pad */ + } + if( prefix ) *(--bufpt) = prefix; /* Add sign */ + if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ + const char *pre; + char x; + pre = &aPrefix[infop->prefix]; + if( *bufpt!=pre[0] ){ + for(; (x=(*pre))!=0; pre++) *(--bufpt) = x; + } + } + length = &buf[etBUFSIZE-1]-bufpt; + break; + case etFLOAT: + case etEXP: + case etGENERIC: + realvalue = va_arg(ap,double); +#ifndef SQLITE_OMIT_FLOATING_POINT + if( precision<0 ) precision = 6; /* Set default precision */ + if( precision>etBUFSIZE/2-10 ) precision = etBUFSIZE/2-10; + if( realvalue<0.0 ){ + realvalue = -realvalue; + prefix = '-'; + }else{ + if( flag_plussign ) prefix = '+'; + else if( flag_blanksign ) prefix = ' '; + else prefix = 0; + } + if( xtype==etGENERIC && precision>0 ) precision--; +#if 0 + /* Rounding works like BSD when the constant 0.4999 is used. Wierd! */ + for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1); +#else + /* It makes more sense to use 0.5 */ + for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){} +#endif + if( xtype==etFLOAT ) realvalue += rounder; + /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ + exp = 0; + if( sqlite3_isnan(realvalue) ){ + bufpt = "NaN"; + length = 3; + break; + } + if( realvalue>0.0 ){ + while( realvalue>=1e32 && exp<=350 ){ realvalue *= 1e-32; exp+=32; } + while( realvalue>=1e8 && exp<=350 ){ realvalue *= 1e-8; exp+=8; } + while( realvalue>=10.0 && exp<=350 ){ realvalue *= 0.1; exp++; } + while( realvalue<1e-8 && exp>=-350 ){ realvalue *= 1e8; exp-=8; } + while( realvalue<1.0 && exp>=-350 ){ realvalue *= 10.0; exp--; } + if( exp>350 || exp<-350 ){ + if( prefix=='-' ){ + bufpt = "-Inf"; + }else if( prefix=='+' ){ + bufpt = "+Inf"; + }else{ + bufpt = "Inf"; + } + length = strlen(bufpt); + break; + } + } + bufpt = buf; + /* + ** If the field type is etGENERIC, then convert to either etEXP + ** or etFLOAT, as appropriate. + */ + flag_exp = xtype==etEXP; + if( xtype!=etFLOAT ){ + realvalue += rounder; + if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } + } + if( xtype==etGENERIC ){ + flag_rtz = !flag_alternateform; + if( exp<-4 || exp>precision ){ + xtype = etEXP; + }else{ + precision = precision - exp; + xtype = etFLOAT; + } + }else{ + flag_rtz = 0; + } + if( xtype==etEXP ){ + e2 = 0; + }else{ + e2 = exp; + } + nsd = 0; + flag_dp = (precision>0) | flag_alternateform | flag_altform2; + /* The sign in front of the number */ + if( prefix ){ + *(bufpt++) = prefix; + } + /* Digits prior to the decimal point */ + if( e2<0 ){ + *(bufpt++) = '0'; + }else{ + for(; e2>=0; e2--){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + } + /* The decimal point */ + if( flag_dp ){ + *(bufpt++) = '.'; + } + /* "0" digits after the decimal point but before the first + ** significant digit of the number */ + for(e2++; e2<0 && precision>0; precision--, e2++){ + *(bufpt++) = '0'; + } + /* Significant digits after the decimal point */ + while( (precision--)>0 ){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + /* Remove trailing zeros and the "." if no digits follow the "." */ + if( flag_rtz && flag_dp ){ + while( bufpt[-1]=='0' ) *(--bufpt) = 0; + assert( bufpt>buf ); + if( bufpt[-1]=='.' ){ + if( flag_altform2 ){ + *(bufpt++) = '0'; + }else{ + *(--bufpt) = 0; + } + } + } + /* Add the "eNNN" suffix */ + if( flag_exp || (xtype==etEXP && exp) ){ + *(bufpt++) = aDigits[infop->charset]; + if( exp<0 ){ + *(bufpt++) = '-'; exp = -exp; + }else{ + *(bufpt++) = '+'; + } + if( exp>=100 ){ + *(bufpt++) = (exp/100)+'0'; /* 100's digit */ + exp %= 100; + } + *(bufpt++) = exp/10+'0'; /* 10's digit */ + *(bufpt++) = exp%10+'0'; /* 1's digit */ + } + *bufpt = 0; + + /* The converted number is in buf[] and zero terminated. Output it. + ** Note that the number is in the usual order, not reversed as with + ** integer conversions. */ + length = bufpt-buf; + bufpt = buf; + + /* Special case: Add leading zeros if the flag_zeropad flag is + ** set and we are not left justified */ + if( flag_zeropad && !flag_leftjustify && length < width){ + int i; + int nPad = width - length; + for(i=width; i>=nPad; i--){ + bufpt[i] = bufpt[i-nPad]; + } + i = prefix!=0; + while( nPad-- ) bufpt[i++] = '0'; + length = width; + } +#endif + break; + case etSIZE: + *(va_arg(ap,int*)) = count; + length = width = 0; + break; + case etPERCENT: + buf[0] = '%'; + bufpt = buf; + length = 1; + break; + case etCHARLIT: + case etCHARX: + c = buf[0] = (xtype==etCHARX ? va_arg(ap,int) : *++fmt); + if( precision>=0 ){ + for(idx=1; idx=0 && precisionetBUFSIZE ){ + bufpt = zExtra = sqlite3_malloc( n ); + if( bufpt==0 ) return -1; + }else{ + bufpt = buf; + } + j = 0; + if( needQuote ) bufpt[j++] = q; + for(i=0; (ch=escarg[i])!=0; i++){ + bufpt[j++] = ch; + if( ch==q ) bufpt[j++] = ch; + } + if( needQuote ) bufpt[j++] = q; + bufpt[j] = 0; + length = j; + /* The precision is ignored on %q and %Q */ + /* if( precision>=0 && precisionz ){ + (*func)(arg, (char*)pToken->z, pToken->n); + } + length = width = 0; + break; + } + case etSRCLIST: { + SrcList *pSrc = va_arg(ap, SrcList*); + int k = va_arg(ap, int); + struct SrcList_item *pItem = &pSrc->a[k]; + assert( k>=0 && knSrc ); + if( pItem->zDatabase && pItem->zDatabase[0] ){ + (*func)(arg, pItem->zDatabase, strlen(pItem->zDatabase)); + (*func)(arg, ".", 1); + } + (*func)(arg, pItem->zName, strlen(pItem->zName)); + length = width = 0; + break; + } + }/* End switch over the format type */ + /* + ** The text of the conversion is pointed to by "bufpt" and is + ** "length" characters long. The field width is "width". Do + ** the output. + */ + if( !flag_leftjustify ){ + register int nspace; + nspace = width-length; + if( nspace>0 ){ + count += nspace; + while( nspace>=etSPACESIZE ){ + (*func)(arg,spaces,etSPACESIZE); + nspace -= etSPACESIZE; + } + if( nspace>0 ) (*func)(arg,spaces,nspace); + } + } + if( length>0 ){ + (*func)(arg,bufpt,length); + count += length; + } + if( flag_leftjustify ){ + register int nspace; + nspace = width-length; + if( nspace>0 ){ + count += nspace; + while( nspace>=etSPACESIZE ){ + (*func)(arg,spaces,etSPACESIZE); + nspace -= etSPACESIZE; + } + if( nspace>0 ) (*func)(arg,spaces,nspace); + } + } + if( zExtra ){ + sqlite3_free(zExtra); + } + }/* End for loop over the format string */ + return errorflag ? -1 : count; +} /* End of function */ + + +/* This structure is used to store state information about the +** write to memory that is currently in progress. +*/ +struct sgMprintf { + char *zBase; /* A base allocation */ + char *zText; /* The string collected so far */ + int nChar; /* Length of the string so far */ + int nTotal; /* Output size if unconstrained */ + int nAlloc; /* Amount of space allocated in zText */ + void *(*xRealloc)(void*,int); /* Function used to realloc memory */ + int iMallocFailed; /* True if xRealloc() has failed */ +}; + +/* +** This function implements the callback from vxprintf. +** +** This routine add nNewChar characters of text in zNewText to +** the sgMprintf structure pointed to by "arg". +*/ +static void mout(void *arg, const char *zNewText, int nNewChar){ + struct sgMprintf *pM = (struct sgMprintf*)arg; + if( pM->iMallocFailed ) return; + pM->nTotal += nNewChar; + if( pM->zText ){ + if( pM->nChar + nNewChar + 1 > pM->nAlloc ){ + if( pM->xRealloc==0 ){ + nNewChar = pM->nAlloc - pM->nChar - 1; + }else{ + int nAlloc = pM->nChar + nNewChar*2 + 1; + if( pM->zText==pM->zBase ){ + pM->zText = pM->xRealloc(0, nAlloc); + if( pM->zText==0 ){ + pM->nAlloc = 0; + pM->iMallocFailed = 1; + return; + }else if( pM->nChar ){ + memcpy(pM->zText, pM->zBase, pM->nChar); + } + }else{ + char *zNew; + zNew = pM->xRealloc(pM->zText, nAlloc); + if( zNew ){ + pM->zText = zNew; + }else{ + pM->iMallocFailed = 1; + pM->xRealloc(pM->zText, 0); + pM->zText = 0; + pM->nAlloc = 0; + return; + } + } + pM->nAlloc = nAlloc; + } + } + if( nNewChar>0 ){ + memcpy(&pM->zText[pM->nChar], zNewText, nNewChar); + pM->nChar += nNewChar; + } + pM->zText[pM->nChar] = 0; + } +} + +/* +** This routine is a wrapper around xprintf() that invokes mout() as +** the consumer. +*/ +static char *base_vprintf( + void *(*xRealloc)(void*, int), /* realloc() function. May be NULL */ + int useInternal, /* Use internal %-conversions if true */ + char *zInitBuf, /* Initially write here, before mallocing */ + int nInitBuf, /* Size of zInitBuf[] */ + const char *zFormat, /* format string */ + va_list ap /* arguments */ +){ + struct sgMprintf sM; + sM.zBase = sM.zText = zInitBuf; + sM.nChar = sM.nTotal = 0; + sM.nAlloc = nInitBuf; + sM.xRealloc = xRealloc; + sM.iMallocFailed = 0; + vxprintf(mout, &sM, useInternal, zFormat, ap); + assert(sM.iMallocFailed==0 || sM.zText==0); + if( xRealloc && !sM.iMallocFailed ){ + if( sM.zText==sM.zBase ){ + sM.zText = xRealloc(0, sM.nChar+1); + if( sM.zText ){ + memcpy(sM.zText, sM.zBase, sM.nChar+1); + } + }else if( sM.nAlloc>sM.nChar+10 ){ + char *zNew; + sqlite3MallocBenignFailure(1); + zNew = xRealloc(sM.zText, sM.nChar+1); + if( zNew ){ + sM.zText = zNew; + } + } + } + return sM.zText; +} + +/* +** Realloc that is a real function, not a macro. +*/ +static void *printf_realloc(void *old, int size){ + return sqlite3_realloc(old, size); +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + z = base_vprintf(printf_realloc, 1, zBase, sizeof(zBase), zFormat, ap); + if( z==0 && db!=0 ){ + db->mallocFailed = 1; + } + return z; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ + va_list ap; + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + va_start(ap, zFormat); + z = base_vprintf(printf_realloc, 1, zBase, sizeof(zBase), zFormat, ap); + va_end(ap); + if( z==0 && db!=0 ){ + db->mallocFailed = 1; + } + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc(). Omit the internal +** %-conversion extensions. +*/ +char *sqlite3_vmprintf(const char *zFormat, va_list ap){ + char zBase[SQLITE_PRINT_BUF_SIZE]; + return base_vprintf(sqlite3_realloc, 0, zBase, sizeof(zBase), zFormat, ap); +} + +/* +** Print into memory obtained from sqlite3_malloc()(). Omit the internal +** %-conversion extensions. +*/ +char *sqlite3_mprintf(const char *zFormat, ...){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + return z; +} + +/* +** sqlite3_snprintf() works like snprintf() except that it ignores the +** current locale settings. This is important for SQLite because we +** are not able to use a "," as the decimal point in place of "." as +** specified by some locales. +*/ +char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ + char *z; + va_list ap; + + if( n<=0 ){ + return zBuf; + } + zBuf[0] = 0; + va_start(ap,zFormat); + z = base_vprintf(0, 0, zBuf, n, zFormat, ap); + va_end(ap); + return z; +} + +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) || defined(SQLITE_MEMDEBUG) +/* +** A version of printf() that understands %lld. Used for debugging. +** The printf() built into some versions of windows does not understand %lld +** and segfaults if you give it a long long int. +*/ +void sqlite3DebugPrintf(const char *zFormat, ...){ + extern int getpid(void); + va_list ap; + char zBuf[500]; + va_start(ap, zFormat); + base_vprintf(0, 0, zBuf, sizeof(zBuf), zFormat, ap); + va_end(ap); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/random.c b/libraries/sqlite/unix/sqlite-3.5.1/src/random.c new file mode 100644 index 0000000000..19b284f94f --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/random.c @@ -0,0 +1,103 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement a pseudo-random number +** generator (PRNG) for SQLite. +** +** Random numbers are used by some of the database backends in order +** to generate random integer keys for tables or random filenames. +** +** $Id: random.c,v 1.20 2007/08/21 13:51:23 drh Exp $ +*/ +#include "sqliteInt.h" + + +/* +** Get a single 8-bit random value from the RC4 PRNG. The Mutex +** must be held while executing this routine. +** +** Why not just use a library random generator like lrand48() for this? +** Because the OP_NewRowid opcode in the VDBE depends on having a very +** good source of random numbers. The lrand48() library function may +** well be good enough. But maybe not. Or maybe lrand48() has some +** subtle problems on some systems that could cause problems. It is hard +** to know. To minimize the risk of problems due to bad lrand48() +** implementations, SQLite uses this random number generator based +** on RC4, which we know works very well. +** +** (Later): Actually, OP_NewRowid does not depend on a good source of +** randomness any more. But we will leave this code in all the same. +*/ +static int randomByte(void){ + unsigned char t; + + /* All threads share a single random number generator. + ** This structure is the current state of the generator. + */ + static struct { + unsigned char isInit; /* True if initialized */ + unsigned char i, j; /* State variables */ + unsigned char s[256]; /* State variables */ + } prng; + + /* Initialize the state of the random number generator once, + ** the first time this routine is called. The seed value does + ** not need to contain a lot of randomness since we are not + ** trying to do secure encryption or anything like that... + ** + ** Nothing in this file or anywhere else in SQLite does any kind of + ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random + ** number generator) not as an encryption device. + */ + if( !prng.isInit ){ + int i; + char k[256]; + prng.j = 0; + prng.i = 0; + sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); + for(i=0; i<256; i++){ + prng.s[i] = i; + } + for(i=0; i<256; i++){ + prng.j += prng.s[i] + k[i]; + t = prng.s[prng.j]; + prng.s[prng.j] = prng.s[i]; + prng.s[i] = t; + } + prng.isInit = 1; + } + + /* Generate and return single random byte + */ + prng.i++; + t = prng.s[prng.i]; + prng.j += t; + prng.s[prng.i] = prng.s[prng.j]; + prng.s[prng.j] = t; + t += prng.s[prng.i]; + return prng.s[t]; +} + +/* +** Return N random bytes. +*/ +void sqlite3Randomness(int N, void *pBuf){ + unsigned char *zBuf = pBuf; + static sqlite3_mutex *mutex = 0; + if( mutex==0 ){ + mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PRNG); + } + sqlite3_mutex_enter(mutex); + while( N-- ){ + *(zBuf++) = randomByte(); + } + sqlite3_mutex_leave(mutex); +} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/select.c b/libraries/sqlite/unix/sqlite-3.5.1/src/select.c new file mode 100644 index 0000000000..fbe1b066db --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/select.c @@ -0,0 +1,3539 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains C code routines that are called by the parser +** to handle SELECT statements in SQLite. +** +** $Id: select.c,v 1.359 2007/08/31 17:42:48 danielk1977 Exp $ +*/ +#include "sqliteInt.h" + + +/* +** Delete all the content of a Select structure but do not deallocate +** the select structure itself. +*/ +static void clearSelect(Select *p){ + sqlite3ExprListDelete(p->pEList); + sqlite3SrcListDelete(p->pSrc); + sqlite3ExprDelete(p->pWhere); + sqlite3ExprListDelete(p->pGroupBy); + sqlite3ExprDelete(p->pHaving); + sqlite3ExprListDelete(p->pOrderBy); + sqlite3SelectDelete(p->pPrior); + sqlite3ExprDelete(p->pLimit); + sqlite3ExprDelete(p->pOffset); +} + + +/* +** Allocate a new Select structure and return a pointer to that +** structure. +*/ +Select *sqlite3SelectNew( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* which columns to include in the result */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* the WHERE clause */ + ExprList *pGroupBy, /* the GROUP BY clause */ + Expr *pHaving, /* the HAVING clause */ + ExprList *pOrderBy, /* the ORDER BY clause */ + int isDistinct, /* true if the DISTINCT keyword is present */ + Expr *pLimit, /* LIMIT value. NULL means not used */ + Expr *pOffset /* OFFSET value. NULL means no offset */ +){ + Select *pNew; + Select standin; + sqlite3 *db = pParse->db; + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); + assert( !pOffset || pLimit ); /* Can't have OFFSET without LIMIT. */ + if( pNew==0 ){ + pNew = &standin; + memset(pNew, 0, sizeof(*pNew)); + } + if( pEList==0 ){ + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0,0,0), 0); + } + pNew->pEList = pEList; + pNew->pSrc = pSrc; + pNew->pWhere = pWhere; + pNew->pGroupBy = pGroupBy; + pNew->pHaving = pHaving; + pNew->pOrderBy = pOrderBy; + pNew->isDistinct = isDistinct; + pNew->op = TK_SELECT; + assert( pOffset==0 || pLimit!=0 ); + pNew->pLimit = pLimit; + pNew->pOffset = pOffset; + pNew->iLimit = -1; + pNew->iOffset = -1; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->addrOpenEphm[2] = -1; + if( pNew==&standin) { + clearSelect(pNew); + pNew = 0; + } + return pNew; +} + +/* +** Delete the given Select structure and all of its substructures. +*/ +void sqlite3SelectDelete(Select *p){ + if( p ){ + clearSelect(p); + sqlite3_free(p); + } +} + +/* +** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the +** type of join. Return an integer constant that expresses that type +** in terms of the following bit values: +** +** JT_INNER +** JT_CROSS +** JT_OUTER +** JT_NATURAL +** JT_LEFT +** JT_RIGHT +** +** A full outer join is the combination of JT_LEFT and JT_RIGHT. +** +** If an illegal or unsupported join type is seen, then still return +** a join type, but put an error in the pParse structure. +*/ +int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ + int jointype = 0; + Token *apAll[3]; + Token *p; + static const struct { + const char zKeyword[8]; + u8 nChar; + u8 code; + } keywords[] = { + { "natural", 7, JT_NATURAL }, + { "left", 4, JT_LEFT|JT_OUTER }, + { "right", 5, JT_RIGHT|JT_OUTER }, + { "full", 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + { "outer", 5, JT_OUTER }, + { "inner", 5, JT_INNER }, + { "cross", 5, JT_INNER|JT_CROSS }, + }; + int i, j; + apAll[0] = pA; + apAll[1] = pB; + apAll[2] = pC; + for(i=0; i<3 && apAll[i]; i++){ + p = apAll[i]; + for(j=0; jn==keywords[j].nChar + && sqlite3StrNICmp((char*)p->z, keywords[j].zKeyword, p->n)==0 ){ + jointype |= keywords[j].code; + break; + } + } + if( j>=sizeof(keywords)/sizeof(keywords[0]) ){ + jointype |= JT_ERROR; + break; + } + } + if( + (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || + (jointype & JT_ERROR)!=0 + ){ + const char *zSp1 = " "; + const char *zSp2 = " "; + if( pB==0 ){ zSp1++; } + if( pC==0 ){ zSp2++; } + sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " + "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC); + jointype = JT_INNER; + }else if( jointype & JT_RIGHT ){ + sqlite3ErrorMsg(pParse, + "RIGHT and FULL OUTER JOINs are not currently supported"); + jointype = JT_INNER; + } + return jointype; +} + +/* +** Return the index of a column in a table. Return -1 if the column +** is not contained in the table. +*/ +static int columnIndex(Table *pTab, const char *zCol){ + int i; + for(i=0; inCol; i++){ + if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; + } + return -1; +} + +/* +** Set the value of a token to a '\000'-terminated string. +*/ +static void setToken(Token *p, const char *z){ + p->z = (u8*)z; + p->n = z ? strlen(z) : 0; + p->dyn = 0; +} + +/* +** Set the token to the double-quoted and escaped version of the string pointed +** to by z. For example; +** +** {a"bc} -> {"a""bc"} +*/ +static void setQuotedToken(Parse *pParse, Token *p, const char *z){ + p->z = (u8 *)sqlite3MPrintf(0, "\"%w\"", z); + p->dyn = 1; + if( p->z ){ + p->n = strlen((char *)p->z); + }else{ + pParse->db->mallocFailed = 1; + } +} + +/* +** Create an expression node for an identifier with the name of zName +*/ +Expr *sqlite3CreateIdExpr(Parse *pParse, const char *zName){ + Token dummy; + setToken(&dummy, zName); + return sqlite3PExpr(pParse, TK_ID, 0, 0, &dummy); +} + + +/* +** Add a term to the WHERE expression in *ppExpr that requires the +** zCol column to be equal in the two tables pTab1 and pTab2. +*/ +static void addWhereTerm( + Parse *pParse, /* Parsing context */ + const char *zCol, /* Name of the column */ + const Table *pTab1, /* First table */ + const char *zAlias1, /* Alias for first table. May be NULL */ + const Table *pTab2, /* Second table */ + const char *zAlias2, /* Alias for second table. May be NULL */ + int iRightJoinTable, /* VDBE cursor for the right table */ + Expr **ppExpr /* Add the equality term to this expression */ +){ + Expr *pE1a, *pE1b, *pE1c; + Expr *pE2a, *pE2b, *pE2c; + Expr *pE; + + pE1a = sqlite3CreateIdExpr(pParse, zCol); + pE2a = sqlite3CreateIdExpr(pParse, zCol); + if( zAlias1==0 ){ + zAlias1 = pTab1->zName; + } + pE1b = sqlite3CreateIdExpr(pParse, zAlias1); + if( zAlias2==0 ){ + zAlias2 = pTab2->zName; + } + pE2b = sqlite3CreateIdExpr(pParse, zAlias2); + pE1c = sqlite3PExpr(pParse, TK_DOT, pE1b, pE1a, 0); + pE2c = sqlite3PExpr(pParse, TK_DOT, pE2b, pE2a, 0); + pE = sqlite3PExpr(pParse, TK_EQ, pE1c, pE2c, 0); + if( pE ){ + ExprSetProperty(pE, EP_FromJoin); + pE->iRightJoinTable = iRightJoinTable; + } + pE = sqlite3ExprAnd(pParse->db,*ppExpr, pE); + if( pE ){ + *ppExpr = pE; + } +} + +/* +** Set the EP_FromJoin property on all terms of the given expression. +** And set the Expr.iRightJoinTable to iTable for every term in the +** expression. +** +** The EP_FromJoin property is used on terms of an expression to tell +** the LEFT OUTER JOIN processing logic that this term is part of the +** join restriction specified in the ON or USING clause and not a part +** of the more general WHERE clause. These terms are moved over to the +** WHERE clause during join processing but we need to remember that they +** originated in the ON or USING clause. +** +** The Expr.iRightJoinTable tells the WHERE clause processing that the +** expression depends on table iRightJoinTable even if that table is not +** explicitly mentioned in the expression. That information is needed +** for cases like this: +** +** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 +** +** The where clause needs to defer the handling of the t1.x=5 +** term until after the t2 loop of the join. In that way, a +** NULL t2 row will be inserted whenever t1.x!=5. If we do not +** defer the handling of t1.x=5, it will be processed immediately +** after the t1 loop and rows with t1.x!=5 will never appear in +** the output, which is incorrect. +*/ +static void setJoinExpr(Expr *p, int iTable){ + while( p ){ + ExprSetProperty(p, EP_FromJoin); + p->iRightJoinTable = iTable; + setJoinExpr(p->pLeft, iTable); + p = p->pRight; + } +} + +/* +** This routine processes the join information for a SELECT statement. +** ON and USING clauses are converted into extra terms of the WHERE clause. +** NATURAL joins also create extra WHERE clause terms. +** +** The terms of a FROM clause are contained in the Select.pSrc structure. +** The left most table is the first entry in Select.pSrc. The right-most +** table is the last entry. The join operator is held in the entry to +** the left. Thus entry 0 contains the join operator for the join between +** entries 0 and 1. Any ON or USING clauses associated with the join are +** also attached to the left entry. +** +** This routine returns the number of errors encountered. +*/ +static int sqliteProcessJoin(Parse *pParse, Select *p){ + SrcList *pSrc; /* All tables in the FROM clause */ + int i, j; /* Loop counters */ + struct SrcList_item *pLeft; /* Left table being joined */ + struct SrcList_item *pRight; /* Right table being joined */ + + pSrc = p->pSrc; + pLeft = &pSrc->a[0]; + pRight = &pLeft[1]; + for(i=0; inSrc-1; i++, pRight++, pLeft++){ + Table *pLeftTab = pLeft->pTab; + Table *pRightTab = pRight->pTab; + + if( pLeftTab==0 || pRightTab==0 ) continue; + + /* When the NATURAL keyword is present, add WHERE clause terms for + ** every column that the two tables have in common. + */ + if( pRight->jointype & JT_NATURAL ){ + if( pRight->pOn || pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "a NATURAL join may not have " + "an ON or USING clause", 0); + return 1; + } + for(j=0; jnCol; j++){ + char *zName = pLeftTab->aCol[j].zName; + if( columnIndex(pRightTab, zName)>=0 ){ + addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, + pRightTab, pRight->zAlias, + pRight->iCursor, &p->pWhere); + + } + } + } + + /* Disallow both ON and USING clauses in the same join + */ + if( pRight->pOn && pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "cannot have both ON and USING " + "clauses in the same join"); + return 1; + } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + if( pRight->pOn ){ + setJoinExpr(pRight->pOn, pRight->iCursor); + p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn); + pRight->pOn = 0; + } + + /* Create extra terms on the WHERE clause for each column named + ** in the USING clause. Example: If the two tables to be joined are + ** A and B and the USING clause names X, Y, and Z, then add this + ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z + ** Report an error if any column mentioned in the USING clause is + ** not contained in both tables to be joined. + */ + if( pRight->pUsing ){ + IdList *pList = pRight->pUsing; + for(j=0; jnId; j++){ + char *zName = pList->a[j].zName; + if( columnIndex(pLeftTab, zName)<0 || columnIndex(pRightTab, zName)<0 ){ + sqlite3ErrorMsg(pParse, "cannot join using column %s - column " + "not present in both tables", zName); + return 1; + } + addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, + pRightTab, pRight->zAlias, + pRight->iCursor, &p->pWhere); + } + } + } + return 0; +} + +/* +** Insert code into "v" that will push the record on the top of the +** stack into the sorter. +*/ +static void pushOntoSorter( + Parse *pParse, /* Parser context */ + ExprList *pOrderBy, /* The ORDER BY clause */ + Select *pSelect /* The whole SELECT statement */ +){ + Vdbe *v = pParse->pVdbe; + sqlite3ExprCodeExprList(pParse, pOrderBy); + sqlite3VdbeAddOp(v, OP_Sequence, pOrderBy->iECursor, 0); + sqlite3VdbeAddOp(v, OP_Pull, pOrderBy->nExpr + 1, 0); + sqlite3VdbeAddOp(v, OP_MakeRecord, pOrderBy->nExpr + 2, 0); + sqlite3VdbeAddOp(v, OP_IdxInsert, pOrderBy->iECursor, 0); + if( pSelect->iLimit>=0 ){ + int addr1, addr2; + addr1 = sqlite3VdbeAddOp(v, OP_IfMemZero, pSelect->iLimit+1, 0); + sqlite3VdbeAddOp(v, OP_MemIncr, -1, pSelect->iLimit+1); + addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp(v, OP_Last, pOrderBy->iECursor, 0); + sqlite3VdbeAddOp(v, OP_Delete, pOrderBy->iECursor, 0); + sqlite3VdbeJumpHere(v, addr2); + pSelect->iLimit = -1; + } +} + +/* +** Add code to implement the OFFSET +*/ +static void codeOffset( + Vdbe *v, /* Generate code into this VM */ + Select *p, /* The SELECT statement being coded */ + int iContinue, /* Jump here to skip the current record */ + int nPop /* Number of times to pop stack when jumping */ +){ + if( p->iOffset>=0 && iContinue!=0 ){ + int addr; + sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iOffset); + addr = sqlite3VdbeAddOp(v, OP_IfMemNeg, p->iOffset, 0); + if( nPop>0 ){ + sqlite3VdbeAddOp(v, OP_Pop, nPop, 0); + } + sqlite3VdbeAddOp(v, OP_Goto, 0, iContinue); + VdbeComment((v, "# skip OFFSET records")); + sqlite3VdbeJumpHere(v, addr); + } +} + +/* +** Add code that will check to make sure the top N elements of the +** stack are distinct. iTab is a sorting index that holds previously +** seen combinations of the N values. A new entry is made in iTab +** if the current N values are new. +** +** A jump to addrRepeat is made and the N+1 values are popped from the +** stack if the top N elements are not distinct. +*/ +static void codeDistinct( + Vdbe *v, /* Generate code into this VM */ + int iTab, /* A sorting index used to test for distinctness */ + int addrRepeat, /* Jump to here if not distinct */ + int N /* The top N elements of the stack must be distinct */ +){ + sqlite3VdbeAddOp(v, OP_MakeRecord, -N, 0); + sqlite3VdbeAddOp(v, OP_Distinct, iTab, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp(v, OP_Pop, N+1, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, addrRepeat); + VdbeComment((v, "# skip indistinct records")); + sqlite3VdbeAddOp(v, OP_IdxInsert, iTab, 0); +} + +/* +** Generate an error message when a SELECT is used within a subexpression +** (example: "a IN (SELECT * FROM table)") but it has more than 1 result +** column. We do this in a subroutine because the error occurs in multiple +** places. +*/ +static int checkForMultiColumnSelectError(Parse *pParse, int eDest, int nExpr){ + if( nExpr>1 && (eDest==SRT_Mem || eDest==SRT_Set) ){ + sqlite3ErrorMsg(pParse, "only a single result allowed for " + "a SELECT that is part of an expression"); + return 1; + }else{ + return 0; + } +} + +/* +** This routine generates the code for the inside of the inner loop +** of a SELECT. +** +** If srcTab and nColumn are both zero, then the pEList expressions +** are evaluated in order to get the data for this row. If nColumn>0 +** then data is pulled from srcTab and pEList is used only to get the +** datatypes for each column. +*/ +static int selectInnerLoop( + Parse *pParse, /* The parser context */ + Select *p, /* The complete select statement being coded */ + ExprList *pEList, /* List of values being extracted */ + int srcTab, /* Pull data from this table */ + int nColumn, /* Number of columns in the source table */ + ExprList *pOrderBy, /* If not NULL, sort results using this key */ + int distinct, /* If >=0, make sure results are distinct */ + int eDest, /* How to dispose of the results */ + int iParm, /* An argument to the disposal method */ + int iContinue, /* Jump here to continue with next row */ + int iBreak, /* Jump here to break out of the inner loop */ + char *aff /* affinity string if eDest is SRT_Union */ +){ + Vdbe *v = pParse->pVdbe; + int i; + int hasDistinct; /* True if the DISTINCT keyword is present */ + + if( v==0 ) return 0; + assert( pEList!=0 ); + + /* If there was a LIMIT clause on the SELECT statement, then do the check + ** to see if this row should be output. + */ + hasDistinct = distinct>=0 && pEList->nExpr>0; + if( pOrderBy==0 && !hasDistinct ){ + codeOffset(v, p, iContinue, 0); + } + + /* Pull the requested columns. + */ + if( nColumn>0 ){ + for(i=0; inExpr; + sqlite3ExprCodeExprList(pParse, pEList); + } + + /* If the DISTINCT keyword was present on the SELECT statement + ** and this row has been seen before, then do not make this row + ** part of the result. + */ + if( hasDistinct ){ + assert( pEList!=0 ); + assert( pEList->nExpr==nColumn ); + codeDistinct(v, distinct, iContinue, nColumn); + if( pOrderBy==0 ){ + codeOffset(v, p, iContinue, nColumn); + } + } + + if( checkForMultiColumnSelectError(pParse, eDest, pEList->nExpr) ){ + return 0; + } + + switch( eDest ){ + /* In this mode, write each query result to the key of the temporary + ** table iParm. + */ +#ifndef SQLITE_OMIT_COMPOUND_SELECT + case SRT_Union: { + sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); + if( aff ){ + sqlite3VdbeChangeP3(v, -1, aff, P3_STATIC); + } + sqlite3VdbeAddOp(v, OP_IdxInsert, iParm, 0); + break; + } + + /* Construct a record from the query result, but instead of + ** saving that record, use it as a key to delete elements from + ** the temporary table iParm. + */ + case SRT_Except: { + int addr; + addr = sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); + sqlite3VdbeChangeP3(v, -1, aff, P3_STATIC); + sqlite3VdbeAddOp(v, OP_NotFound, iParm, addr+3); + sqlite3VdbeAddOp(v, OP_Delete, iParm, 0); + break; + } +#endif + + /* Store the result as data using a unique key. + */ + case SRT_Table: + case SRT_EphemTab: { + sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); + if( pOrderBy ){ + pushOntoSorter(pParse, pOrderBy, p); + }else{ + sqlite3VdbeAddOp(v, OP_NewRowid, iParm, 0); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + sqlite3VdbeAddOp(v, OP_Insert, iParm, OPFLAG_APPEND); + } + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)" construct, + ** then there should be a single item on the stack. Write this + ** item into the set table with bogus data. + */ + case SRT_Set: { + int addr1 = sqlite3VdbeCurrentAddr(v); + int addr2; + + assert( nColumn==1 ); + sqlite3VdbeAddOp(v, OP_NotNull, -1, addr1+3); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); + p->affinity = sqlite3CompareAffinity(pEList->a[0].pExpr,(iParm>>16)&0xff); + if( pOrderBy ){ + /* At first glance you would think we could optimize out the + ** ORDER BY in this case since the order of entries in the set + ** does not matter. But there might be a LIMIT clause, in which + ** case the order does matter */ + pushOntoSorter(pParse, pOrderBy, p); + }else{ + sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &p->affinity, 1); + sqlite3VdbeAddOp(v, OP_IdxInsert, (iParm&0x0000FFFF), 0); + } + sqlite3VdbeJumpHere(v, addr2); + break; + } + + /* If any row exist in the result set, record that fact and abort. + */ + case SRT_Exists: { + sqlite3VdbeAddOp(v, OP_MemInt, 1, iParm); + sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); + /* The LIMIT clause will terminate the loop for us */ + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell and break out + ** of the scan loop. + */ + case SRT_Mem: { + assert( nColumn==1 ); + if( pOrderBy ){ + pushOntoSorter(pParse, pOrderBy, p); + }else{ + sqlite3VdbeAddOp(v, OP_MemStore, iParm, 1); + /* The LIMIT clause will jump out of the loop for us */ + } + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + /* Send the data to the callback function or to a subroutine. In the + ** case of a subroutine, the subroutine itself is responsible for + ** popping the data from the stack. + */ + case SRT_Subroutine: + case SRT_Callback: { + if( pOrderBy ){ + sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); + pushOntoSorter(pParse, pOrderBy, p); + }else if( eDest==SRT_Subroutine ){ + sqlite3VdbeAddOp(v, OP_Gosub, 0, iParm); + }else{ + sqlite3VdbeAddOp(v, OP_Callback, nColumn, 0); + } + break; + } + +#if !defined(SQLITE_OMIT_TRIGGER) + /* Discard the results. This is used for SELECT statements inside + ** the body of a TRIGGER. The purpose of such selects is to call + ** user-defined functions that have side effects. We do not care + ** about the actual results of the select. + */ + default: { + assert( eDest==SRT_Discard ); + sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); + break; + } +#endif + } + + /* Jump to the end of the loop if the LIMIT is reached. + */ + if( p->iLimit>=0 && pOrderBy==0 ){ + sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iLimit); + sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, iBreak); + } + return 0; +} + +/* +** Given an expression list, generate a KeyInfo structure that records +** the collating sequence for each expression in that expression list. +** +** If the ExprList is an ORDER BY or GROUP BY clause then the resulting +** KeyInfo structure is appropriate for initializing a virtual index to +** implement that clause. If the ExprList is the result set of a SELECT +** then the KeyInfo structure is appropriate for initializing a virtual +** index to implement a DISTINCT test. +** +** Space to hold the KeyInfo structure is obtain from malloc. The calling +** function is responsible for seeing that this structure is eventually +** freed. Add the KeyInfo structure to the P3 field of an opcode using +** P3_KEYINFO_HANDOFF is the usual way of dealing with this. +*/ +static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){ + sqlite3 *db = pParse->db; + int nExpr; + KeyInfo *pInfo; + struct ExprList_item *pItem; + int i; + + nExpr = pList->nExpr; + pInfo = sqlite3DbMallocZero(db, sizeof(*pInfo) + nExpr*(sizeof(CollSeq*)+1) ); + if( pInfo ){ + pInfo->aSortOrder = (u8*)&pInfo->aColl[nExpr]; + pInfo->nField = nExpr; + pInfo->enc = ENC(db); + for(i=0, pItem=pList->a; ipExpr); + if( !pColl ){ + pColl = db->pDfltColl; + } + pInfo->aColl[i] = pColl; + pInfo->aSortOrder[i] = pItem->sortOrder; + } + } + return pInfo; +} + + +/* +** If the inner loop was generated using a non-null pOrderBy argument, +** then the results were placed in a sorter. After the loop is terminated +** we need to run the sorter and output the results. The following +** routine generates the code needed to do that. +*/ +static void generateSortTail( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + Vdbe *v, /* Generate code into this VDBE */ + int nColumn, /* Number of columns of data */ + int eDest, /* Write the sorted results here */ + int iParm /* Optional parameter associated with eDest */ +){ + int brk = sqlite3VdbeMakeLabel(v); + int cont = sqlite3VdbeMakeLabel(v); + int addr; + int iTab; + int pseudoTab = 0; + ExprList *pOrderBy = p->pOrderBy; + + iTab = pOrderBy->iECursor; + if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ + pseudoTab = pParse->nTab++; + sqlite3VdbeAddOp(v, OP_OpenPseudo, pseudoTab, 0); + sqlite3VdbeAddOp(v, OP_SetNumColumns, pseudoTab, nColumn); + } + addr = 1 + sqlite3VdbeAddOp(v, OP_Sort, iTab, brk); + codeOffset(v, p, cont, 0); + if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ + sqlite3VdbeAddOp(v, OP_Integer, 1, 0); + } + sqlite3VdbeAddOp(v, OP_Column, iTab, pOrderBy->nExpr + 1); + switch( eDest ){ + case SRT_Table: + case SRT_EphemTab: { + sqlite3VdbeAddOp(v, OP_NewRowid, iParm, 0); + sqlite3VdbeAddOp(v, OP_Pull, 1, 0); + sqlite3VdbeAddOp(v, OP_Insert, iParm, OPFLAG_APPEND); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case SRT_Set: { + assert( nColumn==1 ); + sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); + sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &p->affinity, 1); + sqlite3VdbeAddOp(v, OP_IdxInsert, (iParm&0x0000FFFF), 0); + break; + } + case SRT_Mem: { + assert( nColumn==1 ); + sqlite3VdbeAddOp(v, OP_MemStore, iParm, 1); + /* The LIMIT clause will terminate the loop for us */ + break; + } +#endif + case SRT_Callback: + case SRT_Subroutine: { + int i; + sqlite3VdbeAddOp(v, OP_Insert, pseudoTab, 0); + for(i=0; iiLimit>=0 ){ + sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iLimit); + sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, brk); + } + + /* The bottom of the loop + */ + sqlite3VdbeResolveLabel(v, cont); + sqlite3VdbeAddOp(v, OP_Next, iTab, addr); + sqlite3VdbeResolveLabel(v, brk); + if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ + sqlite3VdbeAddOp(v, OP_Close, pseudoTab, 0); + } + +} + +/* +** Return a pointer to a string containing the 'declaration type' of the +** expression pExpr. The string may be treated as static by the caller. +** +** The declaration type is the exact datatype definition extracted from the +** original CREATE TABLE statement if the expression is a column. The +** declaration type for a ROWID field is INTEGER. Exactly when an expression +** is considered a column can be complex in the presence of subqueries. The +** result-set expression in all of the following SELECT statements is +** considered a column by this function. +** +** SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl); +** SELECT abc FROM (SELECT col AS abc FROM tbl); +** +** The declaration type for any expression other than a column is NULL. +*/ +static const char *columnType( + NameContext *pNC, + Expr *pExpr, + const char **pzOriginDb, + const char **pzOriginTab, + const char **pzOriginCol +){ + char const *zType = 0; + char const *zOriginDb = 0; + char const *zOriginTab = 0; + char const *zOriginCol = 0; + int j; + if( pExpr==0 || pNC->pSrcList==0 ) return 0; + + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + /* The expression is a column. Locate the table the column is being + ** extracted from in NameContext.pSrcList. This table may be real + ** database table or a subquery. + */ + Table *pTab = 0; /* Table structure column is extracted from */ + Select *pS = 0; /* Select the column is extracted from */ + int iCol = pExpr->iColumn; /* Index of column in pTab */ + while( pNC && !pTab ){ + SrcList *pTabList = pNC->pSrcList; + for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); + if( jnSrc ){ + pTab = pTabList->a[j].pTab; + pS = pTabList->a[j].pSelect; + }else{ + pNC = pNC->pNext; + } + } + + if( pTab==0 ){ + /* FIX ME: + ** This can occurs if you have something like "SELECT new.x;" inside + ** a trigger. In other words, if you reference the special "new" + ** table in the result set of a select. We do not have a good way + ** to find the actual table type, so call it "TEXT". This is really + ** something of a bug, but I do not know how to fix it. + ** + ** This code does not produce the correct answer - it just prevents + ** a segfault. See ticket #1229. + */ + zType = "TEXT"; + break; + } + + assert( pTab ); + if( pS ){ + /* The "table" is actually a sub-select or a view in the FROM clause + ** of the SELECT statement. Return the declaration type and origin + ** data for the result-set column of the sub-select. + */ + if( iCol>=0 && iColpEList->nExpr ){ + /* If iCol is less than zero, then the expression requests the + ** rowid of the sub-select or view. This expression is legal (see + ** test case misc2.2.2) - it always evaluates to NULL. + */ + NameContext sNC; + Expr *p = pS->pEList->a[iCol].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = 0; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); + } + }else if( pTab->pSchema ){ + /* A real table */ + assert( !pS ); + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zType = "INTEGER"; + zOriginCol = "rowid"; + }else{ + zType = pTab->aCol[iCol].zType; + zOriginCol = pTab->aCol[iCol].zName; + } + zOriginTab = pTab->zName; + if( pNC->pParse ){ + int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); + zOriginDb = pNC->pParse->db->aDb[iDb].zName; + } + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: { + /* The expression is a sub-select. Return the declaration type and + ** origin info for the single column in the result set of the SELECT + ** statement. + */ + NameContext sNC; + Select *pS = pExpr->pSelect; + Expr *p = pS->pEList->a[0].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); + break; + } +#endif + } + + if( pzOriginDb ){ + assert( pzOriginTab && pzOriginCol ); + *pzOriginDb = zOriginDb; + *pzOriginTab = zOriginTab; + *pzOriginCol = zOriginCol; + } + return zType; +} + +/* +** Generate code that will tell the VDBE the declaration types of columns +** in the result set. +*/ +static void generateColumnTypes( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ + Vdbe *v = pParse->pVdbe; + int i; + NameContext sNC; + sNC.pSrcList = pTabList; + sNC.pParse = pParse; + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + const char *zOrigDb = 0; + const char *zOrigTab = 0; + const char *zOrigCol = 0; + const char *zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + + /* The vdbe must make it's own copy of the column-type and other + ** column specific strings, in case the schema is reset before this + ** virtual machine is deleted. + */ + sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, P3_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, P3_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, P3_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, P3_TRANSIENT); + } +} + +/* +** Generate code that will tell the VDBE the names of columns +** in the result set. This information is used to provide the +** azCol[] values in the callback. +*/ +static void generateColumnNames( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ + Vdbe *v = pParse->pVdbe; + int i, j; + sqlite3 *db = pParse->db; + int fullNames, shortNames; + +#ifndef SQLITE_OMIT_EXPLAIN + /* If this is an EXPLAIN, skip this step */ + if( pParse->explain ){ + return; + } +#endif + + assert( v!=0 ); + if( pParse->colNamesSet || v==0 || db->mallocFailed ) return; + pParse->colNamesSet = 1; + fullNames = (db->flags & SQLITE_FullColNames)!=0; + shortNames = (db->flags & SQLITE_ShortColNames)!=0; + sqlite3VdbeSetNumCols(v, pEList->nExpr); + for(i=0; inExpr; i++){ + Expr *p; + p = pEList->a[i].pExpr; + if( p==0 ) continue; + if( pEList->a[i].zName ){ + char *zName = pEList->a[i].zName; + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, strlen(zName)); + continue; + } + if( p->op==TK_COLUMN && pTabList ){ + Table *pTab; + char *zCol; + int iCol = p->iColumn; + for(j=0; jnSrc && pTabList->a[j].iCursor!=p->iTable; j++){} + assert( jnSrc ); + pTab = pTabList->a[j].pTab; + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zCol = "rowid"; + }else{ + zCol = pTab->aCol[iCol].zName; + } + if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n); + }else if( fullNames || (!shortNames && pTabList->nSrc>1) ){ + char *zName = 0; + char *zTab; + + zTab = pTabList->a[j].zAlias; + if( fullNames || zTab==0 ) zTab = pTab->zName; + sqlite3SetString(&zName, zTab, ".", zCol, (char*)0); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, P3_DYNAMIC); + }else{ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, strlen(zCol)); + } + }else if( p->span.z && p->span.z[0] ){ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n); + /* sqlite3VdbeCompressSpace(v, addr); */ + }else{ + char zName[30]; + assert( p->op!=TK_COLUMN || pTabList==0 ); + sqlite3_snprintf(sizeof(zName), zName, "column%d", i+1); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, 0); + } + } + generateColumnTypes(pParse, pTabList, pEList); +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** Name of the connection operator, used for error messages. +*/ +static const char *selectOpName(int id){ + char *z; + switch( id ){ + case TK_ALL: z = "UNION ALL"; break; + case TK_INTERSECT: z = "INTERSECT"; break; + case TK_EXCEPT: z = "EXCEPT"; break; + default: z = "UNION"; break; + } + return z; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +/* +** Forward declaration +*/ +static int prepSelectStmt(Parse*, Select*); + +/* +** Given a SELECT statement, generate a Table structure that describes +** the result set of that SELECT. +*/ +Table *sqlite3ResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){ + Table *pTab; + int i, j; + ExprList *pEList; + Column *aCol, *pCol; + sqlite3 *db = pParse->db; + + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + if( prepSelectStmt(pParse, pSelect) ){ + return 0; + } + if( sqlite3SelectResolve(pParse, pSelect, 0) ){ + return 0; + } + pTab = sqlite3DbMallocZero(db, sizeof(Table) ); + if( pTab==0 ){ + return 0; + } + pTab->nRef = 1; + pTab->zName = zTabName ? sqlite3DbStrDup(db, zTabName) : 0; + pEList = pSelect->pEList; + pTab->nCol = pEList->nExpr; + assert( pTab->nCol>0 ); + pTab->aCol = aCol = sqlite3DbMallocZero(db, sizeof(pTab->aCol[0])*pTab->nCol); + for(i=0, pCol=aCol; inCol; i++, pCol++){ + Expr *p, *pR; + char *zType; + char *zName; + int nName; + CollSeq *pColl; + int cnt; + NameContext sNC; + + /* Get an appropriate name for the column + */ + p = pEList->a[i].pExpr; + assert( p->pRight==0 || p->pRight->token.z==0 || p->pRight->token.z[0]!=0 ); + if( (zName = pEList->a[i].zName)!=0 ){ + /* If the column contains an "AS " phrase, use as the name */ + zName = sqlite3DbStrDup(db, zName); + }else if( p->op==TK_DOT + && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){ + /* For columns of the from A.B use B as the name */ + zName = sqlite3MPrintf(db, "%T", &pR->token); + }else if( p->span.z && p->span.z[0] ){ + /* Use the original text of the column expression as its name */ + zName = sqlite3MPrintf(db, "%T", &p->span); + }else{ + /* If all else fails, make up a name */ + zName = sqlite3MPrintf(db, "column%d", i+1); + } + if( !zName || db->mallocFailed ){ + db->mallocFailed = 1; + sqlite3_free(zName); + sqlite3DeleteTable(pTab); + return 0; + } + sqlite3Dequote(zName); + + /* Make sure the column name is unique. If the name is not unique, + ** append a integer to the name so that it becomes unique. + */ + nName = strlen(zName); + for(j=cnt=0; jzName = zName; + + /* Get the typename, type affinity, and collating sequence for the + ** column. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pSrcList = pSelect->pSrc; + zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0)); + pCol->zType = zType; + pCol->affinity = sqlite3ExprAffinity(p); + pColl = sqlite3ExprCollSeq(pParse, p); + if( pColl ){ + pCol->zColl = sqlite3DbStrDup(db, pColl->zName); + } + } + pTab->iPKey = -1; + return pTab; +} + +/* +** Prepare a SELECT statement for processing by doing the following +** things: +** +** (1) Make sure VDBE cursor numbers have been assigned to every +** element of the FROM clause. +** +** (2) Fill in the pTabList->a[].pTab fields in the SrcList that +** defines FROM clause. When views appear in the FROM clause, +** fill pTabList->a[].pSelect with a copy of the SELECT statement +** that implements the view. A copy is made of the view's SELECT +** statement so that we can freely modify or delete that statement +** without worrying about messing up the presistent representation +** of the view. +** +** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword +** on joins and the ON and USING clause of joins. +** +** (4) Scan the list of columns in the result set (pEList) looking +** for instances of the "*" operator or the TABLE.* operator. +** If found, expand each "*" to be every column in every table +** and TABLE.* to be every column in TABLE. +** +** Return 0 on success. If there are problems, leave an error message +** in pParse and return non-zero. +*/ +static int prepSelectStmt(Parse *pParse, Select *p){ + int i, j, k, rc; + SrcList *pTabList; + ExprList *pEList; + struct SrcList_item *pFrom; + sqlite3 *db = pParse->db; + + if( p==0 || p->pSrc==0 || db->mallocFailed ){ + return 1; + } + pTabList = p->pSrc; + pEList = p->pEList; + + /* Make sure cursor numbers have been assigned to all entries in + ** the FROM clause of the SELECT statement. + */ + sqlite3SrcListAssignCursors(pParse, p->pSrc); + + /* Look up every table named in the FROM clause of the select. If + ** an entry of the FROM clause is a subquery instead of a table or view, + ** then create a transient table structure to describe the subquery. + */ + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab; + if( pFrom->pTab!=0 ){ + /* This statement has already been prepared. There is no need + ** to go further. */ + assert( i==0 ); + return 0; + } + if( pFrom->zName==0 ){ +#ifndef SQLITE_OMIT_SUBQUERY + /* A sub-query in the FROM clause of a SELECT */ + assert( pFrom->pSelect!=0 ); + if( pFrom->zAlias==0 ){ + pFrom->zAlias = + sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pFrom->pSelect); + } + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = + sqlite3ResultSetOfSelect(pParse, pFrom->zAlias, pFrom->pSelect); + if( pTab==0 ){ + return 1; + } + /* The isEphem flag indicates that the Table structure has been + ** dynamically allocated and may be freed at any time. In other words, + ** pTab is not pointing to a persistent table structure that defines + ** part of the schema. */ + pTab->isEphem = 1; +#endif + }else{ + /* An ordinary table or view name in the FROM clause */ + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = + sqlite3LocateTable(pParse,pFrom->zName,pFrom->zDatabase); + if( pTab==0 ){ + return 1; + } + pTab->nRef++; +#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) + if( pTab->pSelect || IsVirtual(pTab) ){ + /* We reach here if the named table is a really a view */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + return 1; + } + /* If pFrom->pSelect!=0 it means we are dealing with a + ** view within a view. The SELECT structure has already been + ** copied by the outer view so we can skip the copy step here + ** in the inner view. + */ + if( pFrom->pSelect==0 ){ + pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect); + } + } +#endif + } + } + + /* Process NATURAL keywords, and ON and USING clauses of joins. + */ + if( sqliteProcessJoin(pParse, p) ) return 1; + + /* For every "*" that occurs in the column list, insert the names of + ** all columns in all tables. And for every TABLE.* insert the names + ** of all columns in TABLE. The parser inserted a special expression + ** with the TK_ALL operator for each "*" that it found in the column list. + ** The following code just has to locate the TK_ALL expressions and expand + ** each one to the list of all columns in all tables. + ** + ** The first loop just checks to see if there are any "*" operators + ** that need expanding. + */ + for(k=0; knExpr; k++){ + Expr *pE = pEList->a[k].pExpr; + if( pE->op==TK_ALL ) break; + if( pE->op==TK_DOT && pE->pRight && pE->pRight->op==TK_ALL + && pE->pLeft && pE->pLeft->op==TK_ID ) break; + } + rc = 0; + if( knExpr ){ + /* + ** If we get here it means the result set contains one or more "*" + ** operators that need to be expanded. Loop through each expression + ** in the result set and expand them one by one. + */ + struct ExprList_item *a = pEList->a; + ExprList *pNew = 0; + int flags = pParse->db->flags; + int longNames = (flags & SQLITE_FullColNames)!=0 && + (flags & SQLITE_ShortColNames)==0; + + for(k=0; knExpr; k++){ + Expr *pE = a[k].pExpr; + if( pE->op!=TK_ALL && + (pE->op!=TK_DOT || pE->pRight==0 || pE->pRight->op!=TK_ALL) ){ + /* This particular expression does not need to be expanded. + */ + pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr, 0); + if( pNew ){ + pNew->a[pNew->nExpr-1].zName = a[k].zName; + }else{ + rc = 1; + } + a[k].pExpr = 0; + a[k].zName = 0; + }else{ + /* This expression is a "*" or a "TABLE.*" and needs to be + ** expanded. */ + int tableSeen = 0; /* Set to 1 when TABLE matches */ + char *zTName; /* text of name of TABLE */ + if( pE->op==TK_DOT && pE->pLeft ){ + zTName = sqlite3NameFromToken(db, &pE->pLeft->token); + }else{ + zTName = 0; + } + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + char *zTabName = pFrom->zAlias; + if( zTabName==0 || zTabName[0]==0 ){ + zTabName = pTab->zName; + } + if( zTName && (zTabName==0 || zTabName[0]==0 || + sqlite3StrICmp(zTName, zTabName)!=0) ){ + continue; + } + tableSeen = 1; + for(j=0; jnCol; j++){ + Expr *pExpr, *pRight; + char *zName = pTab->aCol[j].zName; + + /* If a column is marked as 'hidden' (currently only possible + ** for virtual tables), do not include it in the expanded + ** result-set list. + */ + if( IsHiddenColumn(&pTab->aCol[j]) ){ + assert(IsVirtual(pTab)); + continue; + } + + if( i>0 ){ + struct SrcList_item *pLeft = &pTabList->a[i-1]; + if( (pLeft[1].jointype & JT_NATURAL)!=0 && + columnIndex(pLeft->pTab, zName)>=0 ){ + /* In a NATURAL join, omit the join columns from the + ** table on the right */ + continue; + } + if( sqlite3IdListIndex(pLeft[1].pUsing, zName)>=0 ){ + /* In a join with a USING clause, omit columns in the + ** using clause from the table on the right. */ + continue; + } + } + pRight = sqlite3PExpr(pParse, TK_ID, 0, 0, 0); + if( pRight==0 ) break; + setQuotedToken(pParse, &pRight->token, zName); + if( zTabName && (longNames || pTabList->nSrc>1) ){ + Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, 0); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + if( pExpr==0 ) break; + setQuotedToken(pParse, &pLeft->token, zTabName); + setToken(&pExpr->span, + sqlite3MPrintf(db, "%s.%s", zTabName, zName)); + pExpr->span.dyn = 1; + pExpr->token.z = 0; + pExpr->token.n = 0; + pExpr->token.dyn = 0; + }else{ + pExpr = pRight; + pExpr->span = pExpr->token; + pExpr->span.dyn = 0; + } + if( longNames ){ + pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pExpr->span); + }else{ + pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pRight->token); + } + } + } + if( !tableSeen ){ + if( zTName ){ + sqlite3ErrorMsg(pParse, "no such table: %s", zTName); + }else{ + sqlite3ErrorMsg(pParse, "no tables specified"); + } + rc = 1; + } + sqlite3_free(zTName); + } + } + sqlite3ExprListDelete(pEList); + p->pEList = pNew; + } + if( p->pEList && p->pEList->nExpr>SQLITE_MAX_COLUMN ){ + sqlite3ErrorMsg(pParse, "too many columns in result set"); + rc = SQLITE_ERROR; + } + if( db->mallocFailed ){ + rc = SQLITE_NOMEM; + } + return rc; +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** This routine associates entries in an ORDER BY expression list with +** columns in a result. For each ORDER BY expression, the opcode of +** the top-level node is changed to TK_COLUMN and the iColumn value of +** the top-level node is filled in with column number and the iTable +** value of the top-level node is filled with iTable parameter. +** +** If there are prior SELECT clauses, they are processed first. A match +** in an earlier SELECT takes precedence over a later SELECT. +** +** Any entry that does not match is flagged as an error. The number +** of errors is returned. +*/ +static int matchOrderbyToColumn( + Parse *pParse, /* A place to leave error messages */ + Select *pSelect, /* Match to result columns of this SELECT */ + ExprList *pOrderBy, /* The ORDER BY values to match against columns */ + int iTable, /* Insert this value in iTable */ + int mustComplete /* If TRUE all ORDER BYs must match */ +){ + int nErr = 0; + int i, j; + ExprList *pEList; + sqlite3 *db = pParse->db; + + if( pSelect==0 || pOrderBy==0 ) return 1; + if( mustComplete ){ + for(i=0; inExpr; i++){ pOrderBy->a[i].done = 0; } + } + if( prepSelectStmt(pParse, pSelect) ){ + return 1; + } + if( pSelect->pPrior ){ + if( matchOrderbyToColumn(pParse, pSelect->pPrior, pOrderBy, iTable, 0) ){ + return 1; + } + } + pEList = pSelect->pEList; + for(i=0; inExpr; i++){ + struct ExprList_item *pItem; + Expr *pE = pOrderBy->a[i].pExpr; + int iCol = -1; + char *zLabel; + + if( pOrderBy->a[i].done ) continue; + if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( iCol<=0 || iCol>pEList->nExpr ){ + sqlite3ErrorMsg(pParse, + "ORDER BY position %d should be between 1 and %d", + iCol, pEList->nExpr); + nErr++; + break; + } + if( !mustComplete ) continue; + iCol--; + } + if( iCol<0 && (zLabel = sqlite3NameFromToken(db, &pE->token))!=0 ){ + for(j=0, pItem=pEList->a; jnExpr; j++, pItem++){ + char *zName; + int isMatch; + if( pItem->zName ){ + zName = sqlite3DbStrDup(db, pItem->zName); + }else{ + zName = sqlite3NameFromToken(db, &pItem->pExpr->token); + } + isMatch = zName && sqlite3StrICmp(zName, zLabel)==0; + sqlite3_free(zName); + if( isMatch ){ + iCol = j; + break; + } + } + sqlite3_free(zLabel); + } + if( iCol>=0 ){ + pE->op = TK_COLUMN; + pE->iColumn = iCol; + pE->iTable = iTable; + pE->iAgg = -1; + pOrderBy->a[i].done = 1; + }else if( mustComplete ){ + sqlite3ErrorMsg(pParse, + "ORDER BY term number %d does not match any result column", i+1); + nErr++; + break; + } + } + return nErr; +} +#endif /* #ifndef SQLITE_OMIT_COMPOUND_SELECT */ + +/* +** Get a VDBE for the given parser context. Create a new one if necessary. +** If an error occurs, return NULL and leave a message in pParse. +*/ +Vdbe *sqlite3GetVdbe(Parse *pParse){ + Vdbe *v = pParse->pVdbe; + if( v==0 ){ + v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); + } + return v; +} + + +/* +** Compute the iLimit and iOffset fields of the SELECT based on the +** pLimit and pOffset expressions. pLimit and pOffset hold the expressions +** that appear in the original SQL statement after the LIMIT and OFFSET +** keywords. Or NULL if those keywords are omitted. iLimit and iOffset +** are the integer memory register numbers for counters used to compute +** the limit and offset. If there is no limit and/or offset, then +** iLimit and iOffset are negative. +** +** This routine changes the values of iLimit and iOffset only if +** a limit or offset is defined by pLimit and pOffset. iLimit and +** iOffset should have been preset to appropriate default values +** (usually but not always -1) prior to calling this routine. +** Only if pLimit!=0 or pOffset!=0 do the limit registers get +** redefined. The UNION ALL operator uses this property to force +** the reuse of the same limit and offset registers across multiple +** SELECT statements. +*/ +static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ + Vdbe *v = 0; + int iLimit = 0; + int iOffset; + int addr1, addr2; + + /* + ** "LIMIT -1" always shows all rows. There is some + ** contraversy about what the correct behavior should be. + ** The current implementation interprets "LIMIT 0" to mean + ** no rows. + */ + if( p->pLimit ){ + p->iLimit = iLimit = pParse->nMem; + pParse->nMem += 2; + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + sqlite3ExprCode(pParse, p->pLimit); + sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); + sqlite3VdbeAddOp(v, OP_MemStore, iLimit, 1); + VdbeComment((v, "# LIMIT counter")); + sqlite3VdbeAddOp(v, OP_IfMemZero, iLimit, iBreak); + sqlite3VdbeAddOp(v, OP_MemLoad, iLimit, 0); + } + if( p->pOffset ){ + p->iOffset = iOffset = pParse->nMem++; + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + sqlite3ExprCode(pParse, p->pOffset); + sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); + sqlite3VdbeAddOp(v, OP_MemStore, iOffset, p->pLimit==0); + VdbeComment((v, "# OFFSET counter")); + addr1 = sqlite3VdbeAddOp(v, OP_IfMemPos, iOffset, 0); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_Integer, 0, 0); + sqlite3VdbeJumpHere(v, addr1); + if( p->pLimit ){ + sqlite3VdbeAddOp(v, OP_Add, 0, 0); + } + } + if( p->pLimit ){ + addr1 = sqlite3VdbeAddOp(v, OP_IfMemPos, iLimit, 0); + sqlite3VdbeAddOp(v, OP_Pop, 1, 0); + sqlite3VdbeAddOp(v, OP_MemInt, -1, iLimit+1); + addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp(v, OP_MemStore, iLimit+1, 1); + VdbeComment((v, "# LIMIT+OFFSET")); + sqlite3VdbeJumpHere(v, addr2); + } +} + +/* +** Allocate a virtual index to use for sorting. +*/ +static void createSortingIndex(Parse *pParse, Select *p, ExprList *pOrderBy){ + if( pOrderBy ){ + int addr; + assert( pOrderBy->iECursor==0 ); + pOrderBy->iECursor = pParse->nTab++; + addr = sqlite3VdbeAddOp(pParse->pVdbe, OP_OpenEphemeral, + pOrderBy->iECursor, pOrderBy->nExpr+1); + assert( p->addrOpenEphm[2] == -1 ); + p->addrOpenEphm[2] = addr; + } +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** Return the appropriate collating sequence for the iCol-th column of +** the result set for the compound-select statement "p". Return NULL if +** the column has no default collating sequence. +** +** The collating sequence for the compound select is taken from the +** left-most term of the select that has a collating sequence. +*/ +static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ + CollSeq *pRet; + if( p->pPrior ){ + pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); + }else{ + pRet = 0; + } + if( pRet==0 ){ + pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); + } + return pRet; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** This routine is called to process a query that is really the union +** or intersection of two or more separate queries. +** +** "p" points to the right-most of the two queries. the query on the +** left is p->pPrior. The left query could also be a compound query +** in which case this routine will be called recursively. +** +** The results of the total query are to be written into a destination +** of type eDest with parameter iParm. +** +** Example 1: Consider a three-way compound SQL statement. +** +** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 +** +** This statement is parsed up as follows: +** +** SELECT c FROM t3 +** | +** `-----> SELECT b FROM t2 +** | +** `------> SELECT a FROM t1 +** +** The arrows in the diagram above represent the Select.pPrior pointer. +** So if this routine is called with p equal to the t3 query, then +** pPrior will be the t2 query. p->op will be TK_UNION in this case. +** +** Notice that because of the way SQLite parses compound SELECTs, the +** individual selects always group from left to right. +*/ +static int multiSelect( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + int eDest, /* \___ Store query results as specified */ + int iParm, /* / by these two parameters. */ + char *aff /* If eDest is SRT_Union, the affinity string */ +){ + int rc = SQLITE_OK; /* Success code from a subroutine */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + int nCol; /* Number of columns in the result set */ + ExprList *pOrderBy; /* The ORDER BY clause on p */ + int aSetP2[2]; /* Set P2 value of these op to number of columns */ + int nSetP2 = 0; /* Number of slots in aSetP2[] used */ + + /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only + ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. + */ + if( p==0 || p->pPrior==0 ){ + rc = 1; + goto multi_select_end; + } + pPrior = p->pPrior; + assert( pPrior->pRightmost!=pPrior ); + assert( pPrior->pRightmost==p->pRightmost ); + if( pPrior->pOrderBy ){ + sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", + selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + if( pPrior->pLimit ){ + sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before", + selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + + /* Make sure we have a valid query engine. If not, create a new one. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + rc = 1; + goto multi_select_end; + } + + /* Create the destination temporary table if necessary + */ + if( eDest==SRT_EphemTab ){ + assert( p->pEList ); + assert( nSetP2pOrderBy; + switch( p->op ){ + case TK_ALL: { + if( pOrderBy==0 ){ + int addr = 0; + assert( !pPrior->pLimit ); + pPrior->pLimit = p->pLimit; + pPrior->pOffset = p->pOffset; + rc = sqlite3Select(pParse, pPrior, eDest, iParm, 0, 0, 0, aff); + p->pLimit = 0; + p->pOffset = 0; + if( rc ){ + goto multi_select_end; + } + p->pPrior = 0; + p->iLimit = pPrior->iLimit; + p->iOffset = pPrior->iOffset; + if( p->iLimit>=0 ){ + addr = sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, 0); + VdbeComment((v, "# Jump ahead if LIMIT reached")); + } + rc = sqlite3Select(pParse, p, eDest, iParm, 0, 0, 0, aff); + p->pPrior = pPrior; + if( rc ){ + goto multi_select_end; + } + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + } + break; + } + /* For UNION ALL ... ORDER BY fall through to the next case */ + } + case TK_EXCEPT: + case TK_UNION: { + int unionTab; /* Cursor number of the temporary table holding result */ + int op = 0; /* One of the SRT_ operations to apply to self */ + int priorOp; /* The SRT_ operation to apply to prior selects */ + Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */ + int addr; + + priorOp = p->op==TK_ALL ? SRT_Table : SRT_Union; + if( eDest==priorOp && pOrderBy==0 && !p->pLimit && !p->pOffset ){ + /* We can reuse a temporary table generated by a SELECT to our + ** right. + */ + unionTab = iParm; + }else{ + /* We will need to create our own temporary table to hold the + ** intermediate results. + */ + unionTab = pParse->nTab++; + if( pOrderBy && matchOrderbyToColumn(pParse, p, pOrderBy, unionTab,1) ){ + rc = 1; + goto multi_select_end; + } + addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, unionTab, 0); + if( priorOp==SRT_Table ){ + assert( nSetP2addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + p->pRightmost->usesEphm = 1; + } + createSortingIndex(pParse, p, pOrderBy); + assert( p->pEList ); + } + + /* Code the SELECT statements to our left + */ + assert( !pPrior->pOrderBy ); + rc = sqlite3Select(pParse, pPrior, priorOp, unionTab, 0, 0, 0, aff); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT statement + */ + switch( p->op ){ + case TK_EXCEPT: op = SRT_Except; break; + case TK_UNION: op = SRT_Union; break; + case TK_ALL: op = SRT_Table; break; + } + p->pPrior = 0; + p->pOrderBy = 0; + p->disallowOrderBy = pOrderBy!=0; + pLimit = p->pLimit; + p->pLimit = 0; + pOffset = p->pOffset; + p->pOffset = 0; + rc = sqlite3Select(pParse, p, op, unionTab, 0, 0, 0, aff); + /* Query flattening in sqlite3Select() might refill p->pOrderBy. + ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ + sqlite3ExprListDelete(p->pOrderBy); + p->pPrior = pPrior; + p->pOrderBy = pOrderBy; + sqlite3ExprDelete(p->pLimit); + p->pLimit = pLimit; + p->pOffset = pOffset; + p->iLimit = -1; + p->iOffset = -1; + if( rc ){ + goto multi_select_end; + } + + + /* Convert the data in the temporary table into whatever form + ** it is that we currently need. + */ + if( eDest!=priorOp || unionTab!=iParm ){ + int iCont, iBreak, iStart; + assert( p->pEList ); + if( eDest==SRT_Callback ){ + Select *pFirst = p; + while( pFirst->pPrior ) pFirst = pFirst->pPrior; + generateColumnNames(pParse, 0, pFirst->pEList); + } + iBreak = sqlite3VdbeMakeLabel(v); + iCont = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp(v, OP_Rewind, unionTab, iBreak); + iStart = sqlite3VdbeCurrentAddr(v); + rc = selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr, + pOrderBy, -1, eDest, iParm, + iCont, iBreak, 0); + if( rc ){ + rc = 1; + goto multi_select_end; + } + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp(v, OP_Next, unionTab, iStart); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp(v, OP_Close, unionTab, 0); + } + break; + } + case TK_INTERSECT: { + int tab1, tab2; + int iCont, iBreak, iStart; + Expr *pLimit, *pOffset; + int addr; + + /* INTERSECT is different from the others since it requires + ** two temporary tables. Hence it has its own case. Begin + ** by allocating the tables we will need. + */ + tab1 = pParse->nTab++; + tab2 = pParse->nTab++; + if( pOrderBy && matchOrderbyToColumn(pParse,p,pOrderBy,tab1,1) ){ + rc = 1; + goto multi_select_end; + } + createSortingIndex(pParse, p, pOrderBy); + + addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, tab1, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + p->pRightmost->usesEphm = 1; + assert( p->pEList ); + + /* Code the SELECTs to our left into temporary table "tab1". + */ + rc = sqlite3Select(pParse, pPrior, SRT_Union, tab1, 0, 0, 0, aff); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT into temporary table "tab2" + */ + addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, tab2, 0); + assert( p->addrOpenEphm[1] == -1 ); + p->addrOpenEphm[1] = addr; + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + pOffset = p->pOffset; + p->pOffset = 0; + rc = sqlite3Select(pParse, p, SRT_Union, tab2, 0, 0, 0, aff); + p->pPrior = pPrior; + sqlite3ExprDelete(p->pLimit); + p->pLimit = pLimit; + p->pOffset = pOffset; + if( rc ){ + goto multi_select_end; + } + + /* Generate code to take the intersection of the two temporary + ** tables. + */ + assert( p->pEList ); + if( eDest==SRT_Callback ){ + Select *pFirst = p; + while( pFirst->pPrior ) pFirst = pFirst->pPrior; + generateColumnNames(pParse, 0, pFirst->pEList); + } + iBreak = sqlite3VdbeMakeLabel(v); + iCont = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp(v, OP_Rewind, tab1, iBreak); + iStart = sqlite3VdbeAddOp(v, OP_RowKey, tab1, 0); + sqlite3VdbeAddOp(v, OP_NotFound, tab2, iCont); + rc = selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr, + pOrderBy, -1, eDest, iParm, + iCont, iBreak, 0); + if( rc ){ + rc = 1; + goto multi_select_end; + } + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp(v, OP_Next, tab1, iStart); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp(v, OP_Close, tab2, 0); + sqlite3VdbeAddOp(v, OP_Close, tab1, 0); + break; + } + } + + /* Make sure all SELECTs in the statement have the same number of elements + ** in their result sets. + */ + assert( p->pEList && pPrior->pEList ); + if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + + /* Set the number of columns in temporary tables + */ + nCol = p->pEList->nExpr; + while( nSetP2 ){ + sqlite3VdbeChangeP2(v, aSetP2[--nSetP2], nCol); + } + + /* Compute collating sequences used by either the ORDER BY clause or + ** by any temporary tables needed to implement the compound select. + ** Attach the KeyInfo structure to all temporary tables. Invoke the + ** ORDER BY processing if there is an ORDER BY clause. + ** + ** This section is run by the right-most SELECT statement only. + ** SELECT statements to the left always skip this part. The right-most + ** SELECT might also skip this part if it has no ORDER BY clause and + ** no temp tables are required. + */ + if( pOrderBy || p->usesEphm ){ + int i; /* Loop counter */ + KeyInfo *pKeyInfo; /* Collating sequence for the result set */ + Select *pLoop; /* For looping through SELECT statements */ + int nKeyCol; /* Number of entries in pKeyInfo->aCol[] */ + CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ + CollSeq **aCopy; /* A copy of pKeyInfo->aColl[] */ + + assert( p->pRightmost==p ); + nKeyCol = nCol + (pOrderBy ? pOrderBy->nExpr : 0); + pKeyInfo = sqlite3DbMallocZero(pParse->db, + sizeof(*pKeyInfo)+nKeyCol*(sizeof(CollSeq*) + 1)); + if( !pKeyInfo ){ + rc = SQLITE_NOMEM; + goto multi_select_end; + } + + pKeyInfo->enc = ENC(pParse->db); + pKeyInfo->nField = nCol; + + for(i=0, apColl=pKeyInfo->aColl; idb->pDfltColl; + } + } + + for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ + for(i=0; i<2; i++){ + int addr = pLoop->addrOpenEphm[i]; + if( addr<0 ){ + /* If [0] is unused then [1] is also unused. So we can + ** always safely abort as soon as the first unused slot is found */ + assert( pLoop->addrOpenEphm[1]<0 ); + break; + } + sqlite3VdbeChangeP2(v, addr, nCol); + sqlite3VdbeChangeP3(v, addr, (char*)pKeyInfo, P3_KEYINFO); + pLoop->addrOpenEphm[i] = -1; + } + } + + if( pOrderBy ){ + struct ExprList_item *pOTerm = pOrderBy->a; + int nOrderByExpr = pOrderBy->nExpr; + int addr; + u8 *pSortOrder; + + /* Reuse the same pKeyInfo for the ORDER BY as was used above for + ** the compound select statements. Except we have to change out the + ** pKeyInfo->aColl[] values. Some of the aColl[] values will be + ** reused when constructing the pKeyInfo for the ORDER BY, so make + ** a copy. Sufficient space to hold both the nCol entries for + ** the compound select and the nOrderbyExpr entries for the ORDER BY + ** was allocated above. But we need to move the compound select + ** entries out of the way before constructing the ORDER BY entries. + ** Move the compound select entries into aCopy[] where they can be + ** accessed and reused when constructing the ORDER BY entries. + ** Because nCol might be greater than or less than nOrderByExpr + ** we have to use memmove() when doing the copy. + */ + aCopy = &pKeyInfo->aColl[nOrderByExpr]; + pSortOrder = pKeyInfo->aSortOrder = (u8*)&aCopy[nCol]; + memmove(aCopy, pKeyInfo->aColl, nCol*sizeof(CollSeq*)); + + apColl = pKeyInfo->aColl; + for(i=0; ipExpr; + if( (pExpr->flags & EP_ExpCollate) ){ + assert( pExpr->pColl!=0 ); + *apColl = pExpr->pColl; + }else{ + *apColl = aCopy[pExpr->iColumn]; + } + *pSortOrder = pOTerm->sortOrder; + } + assert( p->pRightmost==p ); + assert( p->addrOpenEphm[2]>=0 ); + addr = p->addrOpenEphm[2]; + sqlite3VdbeChangeP2(v, addr, p->pOrderBy->nExpr+2); + pKeyInfo->nField = nOrderByExpr; + sqlite3VdbeChangeP3(v, addr, (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + pKeyInfo = 0; + generateSortTail(pParse, p, v, p->pEList->nExpr, eDest, iParm); + } + + sqlite3_free(pKeyInfo); + } + +multi_select_end: + return rc; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +#ifndef SQLITE_OMIT_VIEW +/* Forward Declarations */ +static void substExprList(sqlite3*, ExprList*, int, ExprList*); +static void substSelect(sqlite3*, Select *, int, ExprList *); + +/* +** Scan through the expression pExpr. Replace every reference to +** a column in table number iTable with a copy of the iColumn-th +** entry in pEList. (But leave references to the ROWID column +** unchanged.) +** +** This routine is part of the flattening procedure. A subquery +** whose result set is defined by pEList appears as entry in the +** FROM clause of a SELECT such that the VDBE cursor assigned to that +** FORM clause entry is iTable. This routine make the necessary +** changes to pExpr so that it refers directly to the source table +** of the subquery rather the result set of the subquery. +*/ +static void substExpr( + sqlite3 *db, /* Report malloc errors to this connection */ + Expr *pExpr, /* Expr in which substitution occurs */ + int iTable, /* Table to be substituted */ + ExprList *pEList /* Substitute expressions */ +){ + if( pExpr==0 ) return; + if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ + if( pExpr->iColumn<0 ){ + pExpr->op = TK_NULL; + }else{ + Expr *pNew; + assert( pEList!=0 && pExpr->iColumnnExpr ); + assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 ); + pNew = pEList->a[pExpr->iColumn].pExpr; + assert( pNew!=0 ); + pExpr->op = pNew->op; + assert( pExpr->pLeft==0 ); + pExpr->pLeft = sqlite3ExprDup(db, pNew->pLeft); + assert( pExpr->pRight==0 ); + pExpr->pRight = sqlite3ExprDup(db, pNew->pRight); + assert( pExpr->pList==0 ); + pExpr->pList = sqlite3ExprListDup(db, pNew->pList); + pExpr->iTable = pNew->iTable; + pExpr->pTab = pNew->pTab; + pExpr->iColumn = pNew->iColumn; + pExpr->iAgg = pNew->iAgg; + sqlite3TokenCopy(db, &pExpr->token, &pNew->token); + sqlite3TokenCopy(db, &pExpr->span, &pNew->span); + pExpr->pSelect = sqlite3SelectDup(db, pNew->pSelect); + pExpr->flags = pNew->flags; + } + }else{ + substExpr(db, pExpr->pLeft, iTable, pEList); + substExpr(db, pExpr->pRight, iTable, pEList); + substSelect(db, pExpr->pSelect, iTable, pEList); + substExprList(db, pExpr->pList, iTable, pEList); + } +} +static void substExprList( + sqlite3 *db, /* Report malloc errors here */ + ExprList *pList, /* List to scan and in which to make substitutes */ + int iTable, /* Table to be substituted */ + ExprList *pEList /* Substitute values */ +){ + int i; + if( pList==0 ) return; + for(i=0; inExpr; i++){ + substExpr(db, pList->a[i].pExpr, iTable, pEList); + } +} +static void substSelect( + sqlite3 *db, /* Report malloc errors here */ + Select *p, /* SELECT statement in which to make substitutions */ + int iTable, /* Table to be replaced */ + ExprList *pEList /* Substitute values */ +){ + if( !p ) return; + substExprList(db, p->pEList, iTable, pEList); + substExprList(db, p->pGroupBy, iTable, pEList); + substExprList(db, p->pOrderBy, iTable, pEList); + substExpr(db, p->pHaving, iTable, pEList); + substExpr(db, p->pWhere, iTable, pEList); + substSelect(db, p->pPrior, iTable, pEList); +} +#endif /* !defined(SQLITE_OMIT_VIEW) */ + +#ifndef SQLITE_OMIT_VIEW +/* +** This routine attempts to flatten subqueries in order to speed +** execution. It returns 1 if it makes changes and 0 if no flattening +** occurs. +** +** To understand the concept of flattening, consider the following +** query: +** +** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 +** +** The default way of implementing this query is to execute the +** subquery first and store the results in a temporary table, then +** run the outer query on that temporary table. This requires two +** passes over the data. Furthermore, because the temporary table +** has no indices, the WHERE clause on the outer query cannot be +** optimized. +** +** This routine attempts to rewrite queries such as the above into +** a single flat select, like this: +** +** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 +** +** The code generated for this simpification gives the same result +** but only has to scan the data once. And because indices might +** exist on the table t1, a complete scan of the data might be +** avoided. +** +** Flattening is only attempted if all of the following are true: +** +** (1) The subquery and the outer query do not both use aggregates. +** +** (2) The subquery is not an aggregate or the outer query is not a join. +** +** (3) The subquery is not the right operand of a left outer join, or +** the subquery is not itself a join. (Ticket #306) +** +** (4) The subquery is not DISTINCT or the outer query is not a join. +** +** (5) The subquery is not DISTINCT or the outer query does not use +** aggregates. +** +** (6) The subquery does not use aggregates or the outer query is not +** DISTINCT. +** +** (7) The subquery has a FROM clause. +** +** (8) The subquery does not use LIMIT or the outer query is not a join. +** +** (9) The subquery does not use LIMIT or the outer query does not use +** aggregates. +** +** (10) The subquery does not use aggregates or the outer query does not +** use LIMIT. +** +** (11) The subquery and the outer query do not both have ORDER BY clauses. +** +** (12) The subquery is not the right term of a LEFT OUTER JOIN or the +** subquery has no WHERE clause. (added by ticket #350) +** +** (13) The subquery and outer query do not both use LIMIT +** +** (14) The subquery does not use OFFSET +** +** (15) The outer query is not part of a compound select or the +** subquery does not have both an ORDER BY and a LIMIT clause. +** (See ticket #2339) +** +** In this routine, the "p" parameter is a pointer to the outer query. +** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query +** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. +** +** If flattening is not attempted, this routine is a no-op and returns 0. +** If flattening is attempted this routine returns 1. +** +** All of the expression analysis must occur on both the outer query and +** the subquery before this routine runs. +*/ +static int flattenSubquery( + sqlite3 *db, /* Database connection */ + Select *p, /* The parent or outer SELECT statement */ + int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ + int isAgg, /* True if outer SELECT uses aggregate functions */ + int subqueryIsAgg /* True if the subquery uses aggregate functions */ +){ + Select *pSub; /* The inner query or "subquery" */ + SrcList *pSrc; /* The FROM clause of the outer query */ + SrcList *pSubSrc; /* The FROM clause of the subquery */ + ExprList *pList; /* The result set of the outer query */ + int iParent; /* VDBE cursor number of the pSub result set temp table */ + int i; /* Loop counter */ + Expr *pWhere; /* The WHERE clause */ + struct SrcList_item *pSubitem; /* The subquery */ + + /* Check to see if flattening is permitted. Return 0 if not. + */ + if( p==0 ) return 0; + pSrc = p->pSrc; + assert( pSrc && iFrom>=0 && iFromnSrc ); + pSubitem = &pSrc->a[iFrom]; + pSub = pSubitem->pSelect; + assert( pSub!=0 ); + if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */ + if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; /* Restriction (2) */ + pSubSrc = pSub->pSrc; + assert( pSubSrc ); + /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, + ** not arbitrary expresssions, we allowed some combining of LIMIT and OFFSET + ** because they could be computed at compile-time. But when LIMIT and OFFSET + ** became arbitrary expressions, we were forced to add restrictions (13) + ** and (14). */ + if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ + if( pSub->pOffset ) return 0; /* Restriction (14) */ + if( p->pRightmost && pSub->pLimit && pSub->pOrderBy ){ + return 0; /* Restriction (15) */ + } + if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ + if( (pSub->isDistinct || pSub->pLimit) + && (pSrc->nSrc>1 || isAgg) ){ /* Restrictions (4)(5)(8)(9) */ + return 0; + } + if( p->isDistinct && subqueryIsAgg ) return 0; /* Restriction (6) */ + if( (p->disallowOrderBy || p->pOrderBy) && pSub->pOrderBy ){ + return 0; /* Restriction (11) */ + } + + /* Restriction 3: If the subquery is a join, make sure the subquery is + ** not used as the right operand of an outer join. Examples of why this + ** is not allowed: + ** + ** t1 LEFT OUTER JOIN (t2 JOIN t3) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) JOIN t3 + ** + ** which is not at all the same thing. + */ + if( pSubSrc->nSrc>1 && (pSubitem->jointype & JT_OUTER)!=0 ){ + return 0; + } + + /* Restriction 12: If the subquery is the right operand of a left outer + ** join, make sure the subquery has no WHERE clause. + ** An examples of why this is not allowed: + ** + ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0 + ** + ** But the t2.x>0 test will always fail on a NULL row of t2, which + ** effectively converts the OUTER JOIN into an INNER JOIN. + */ + if( (pSubitem->jointype & JT_OUTER)!=0 && pSub->pWhere!=0 ){ + return 0; + } + + /* If we reach this point, it means flattening is permitted for the + ** iFrom-th entry of the FROM clause in the outer query. + */ + + /* Move all of the FROM elements of the subquery into the + ** the FROM clause of the outer query. Before doing this, remember + ** the cursor number for the original outer query FROM element in + ** iParent. The iParent cursor will never be used. Subsequent code + ** will scan expressions looking for iParent references and replace + ** those references with expressions that resolve to the subquery FROM + ** elements we are now copying in. + */ + iParent = pSubitem->iCursor; + { + int nSubSrc = pSubSrc->nSrc; + int jointype = pSubitem->jointype; + + sqlite3DeleteTable(pSubitem->pTab); + sqlite3_free(pSubitem->zDatabase); + sqlite3_free(pSubitem->zName); + sqlite3_free(pSubitem->zAlias); + if( nSubSrc>1 ){ + int extra = nSubSrc - 1; + for(i=1; ipSrc = pSrc; + for(i=pSrc->nSrc-1; i-extra>=iFrom; i--){ + pSrc->a[i] = pSrc->a[i-extra]; + } + } + for(i=0; ia[i+iFrom] = pSubSrc->a[i]; + memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); + } + pSrc->a[iFrom].jointype = jointype; + } + + /* Now begin substituting subquery result set expressions for + ** references to the iParent in the outer query. + ** + ** Example: + ** + ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; + ** \ \_____________ subquery __________/ / + ** \_____________________ outer query ______________________________/ + ** + ** We look at every expression in the outer query and every place we see + ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". + */ + pList = p->pEList; + for(i=0; inExpr; i++){ + Expr *pExpr; + if( pList->a[i].zName==0 && (pExpr = pList->a[i].pExpr)->span.z!=0 ){ + pList->a[i].zName = + sqlite3DbStrNDup(db, (char*)pExpr->span.z, pExpr->span.n); + } + } + substExprList(db, p->pEList, iParent, pSub->pEList); + if( isAgg ){ + substExprList(db, p->pGroupBy, iParent, pSub->pEList); + substExpr(db, p->pHaving, iParent, pSub->pEList); + } + if( pSub->pOrderBy ){ + assert( p->pOrderBy==0 ); + p->pOrderBy = pSub->pOrderBy; + pSub->pOrderBy = 0; + }else if( p->pOrderBy ){ + substExprList(db, p->pOrderBy, iParent, pSub->pEList); + } + if( pSub->pWhere ){ + pWhere = sqlite3ExprDup(db, pSub->pWhere); + }else{ + pWhere = 0; + } + if( subqueryIsAgg ){ + assert( p->pHaving==0 ); + p->pHaving = p->pWhere; + p->pWhere = pWhere; + substExpr(db, p->pHaving, iParent, pSub->pEList); + p->pHaving = sqlite3ExprAnd(db, p->pHaving, + sqlite3ExprDup(db, pSub->pHaving)); + assert( p->pGroupBy==0 ); + p->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy); + }else{ + substExpr(db, p->pWhere, iParent, pSub->pEList); + p->pWhere = sqlite3ExprAnd(db, p->pWhere, pWhere); + } + + /* The flattened query is distinct if either the inner or the + ** outer query is distinct. + */ + p->isDistinct = p->isDistinct || pSub->isDistinct; + + /* + ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; + ** + ** One is tempted to try to add a and b to combine the limits. But this + ** does not work if either limit is negative. + */ + if( pSub->pLimit ){ + p->pLimit = pSub->pLimit; + pSub->pLimit = 0; + } + + /* Finially, delete what is left of the subquery and return + ** success. + */ + sqlite3SelectDelete(pSub); + return 1; +} +#endif /* SQLITE_OMIT_VIEW */ + +/* +** Analyze the SELECT statement passed in as an argument to see if it +** is a simple min() or max() query. If it is and this query can be +** satisfied using a single seek to the beginning or end of an index, +** then generate the code for this SELECT and return 1. If this is not a +** simple min() or max() query, then return 0; +** +** A simply min() or max() query looks like this: +** +** SELECT min(a) FROM table; +** SELECT max(a) FROM table; +** +** The query may have only a single table in its FROM argument. There +** can be no GROUP BY or HAVING or WHERE clauses. The result set must +** be the min() or max() of a single column of the table. The column +** in the min() or max() function must be indexed. +** +** The parameters to this routine are the same as for sqlite3Select(). +** See the header comment on that routine for additional information. +*/ +static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ + Expr *pExpr; + int iCol; + Table *pTab; + Index *pIdx; + int base; + Vdbe *v; + int seekOp; + ExprList *pEList, *pList, eList; + struct ExprList_item eListItem; + SrcList *pSrc; + int brk; + int iDb; + + /* Check to see if this query is a simple min() or max() query. Return + ** zero if it is not. + */ + if( p->pGroupBy || p->pHaving || p->pWhere ) return 0; + pSrc = p->pSrc; + if( pSrc->nSrc!=1 ) return 0; + pEList = p->pEList; + if( pEList->nExpr!=1 ) return 0; + pExpr = pEList->a[0].pExpr; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; + pList = pExpr->pList; + if( pList==0 || pList->nExpr!=1 ) return 0; + if( pExpr->token.n!=3 ) return 0; + if( sqlite3StrNICmp((char*)pExpr->token.z,"min",3)==0 ){ + seekOp = OP_Rewind; + }else if( sqlite3StrNICmp((char*)pExpr->token.z,"max",3)==0 ){ + seekOp = OP_Last; + }else{ + return 0; + } + pExpr = pList->a[0].pExpr; + if( pExpr->op!=TK_COLUMN ) return 0; + iCol = pExpr->iColumn; + pTab = pSrc->a[0].pTab; + + /* This optimization cannot be used with virtual tables. */ + if( IsVirtual(pTab) ) return 0; + + /* If we get to here, it means the query is of the correct form. + ** Check to make sure we have an index and make pIdx point to the + ** appropriate index. If the min() or max() is on an INTEGER PRIMARY + ** key column, no index is necessary so set pIdx to NULL. If no + ** usable index is found, return 0. + */ + if( iCol<0 ){ + pIdx = 0; + }else{ + CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr); + if( pColl==0 ) return 0; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nColumn>=1 ); + if( pIdx->aiColumn[0]==iCol && + 0==sqlite3StrICmp(pIdx->azColl[0], pColl->zName) ){ + break; + } + } + if( pIdx==0 ) return 0; + } + + /* Identify column types if we will be using the callback. This + ** step is skipped if the output is going to a table or a memory cell. + ** The column names have already been generated in the calling function. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) return 0; + + /* If the output is destined for a temporary table, open that table. + */ + if( eDest==SRT_EphemTab ){ + sqlite3VdbeAddOp(v, OP_OpenEphemeral, iParm, 1); + } + + /* Generating code to find the min or the max. Basically all we have + ** to do is find the first or the last entry in the chosen index. If + ** the min() or max() is on the INTEGER PRIMARY KEY, then find the first + ** or last entry in the main table. + */ + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 || pTab->isEphem ); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + base = pSrc->a[0].iCursor; + brk = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, brk); + if( pSrc->a[0].pSelect==0 ){ + sqlite3OpenTable(pParse, base, iDb, pTab, OP_OpenRead); + } + if( pIdx==0 ){ + sqlite3VdbeAddOp(v, seekOp, base, 0); + }else{ + /* Even though the cursor used to open the index here is closed + ** as soon as a single value has been read from it, allocate it + ** using (pParse->nTab++) to prevent the cursor id from being + ** reused. This is important for statements of the form + ** "INSERT INTO x SELECT max() FROM x". + */ + int iIdx; + KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); + iIdx = pParse->nTab++; + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); + sqlite3VdbeOp3(v, OP_OpenRead, iIdx, pIdx->tnum, + (char*)pKey, P3_KEYINFO_HANDOFF); + if( seekOp==OP_Rewind ){ + sqlite3VdbeAddOp(v, OP_Null, 0, 0); + sqlite3VdbeAddOp(v, OP_MakeRecord, 1, 0); + seekOp = OP_MoveGt; + } + if( pIdx->aSortOrder[0]==SQLITE_SO_DESC ){ + /* Ticket #2514: invert the seek operator if we are using + ** a descending index. */ + if( seekOp==OP_Last ){ + seekOp = OP_Rewind; + }else{ + assert( seekOp==OP_MoveGt ); + seekOp = OP_MoveLt; + } + } + sqlite3VdbeAddOp(v, seekOp, iIdx, 0); + sqlite3VdbeAddOp(v, OP_IdxRowid, iIdx, 0); + sqlite3VdbeAddOp(v, OP_Close, iIdx, 0); + sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); + } + eList.nExpr = 1; + memset(&eListItem, 0, sizeof(eListItem)); + eList.a = &eListItem; + eList.a[0].pExpr = pExpr; + selectInnerLoop(pParse, p, &eList, 0, 0, 0, -1, eDest, iParm, brk, brk, 0); + sqlite3VdbeResolveLabel(v, brk); + sqlite3VdbeAddOp(v, OP_Close, base, 0); + + return 1; +} + +/* +** Analyze and ORDER BY or GROUP BY clause in a SELECT statement. Return +** the number of errors seen. +** +** An ORDER BY or GROUP BY is a list of expressions. If any expression +** is an integer constant, then that expression is replaced by the +** corresponding entry in the result set. +*/ +static int processOrderGroupBy( + NameContext *pNC, /* Name context of the SELECT statement. */ + ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ + const char *zType /* Either "ORDER" or "GROUP", as appropriate */ +){ + int i; + ExprList *pEList = pNC->pEList; /* The result set of the SELECT */ + Parse *pParse = pNC->pParse; /* The result set of the SELECT */ + assert( pEList ); + + if( pOrderBy==0 ) return 0; + if( pOrderBy->nExpr>SQLITE_MAX_COLUMN ){ + sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); + return 1; + } + for(i=0; inExpr; i++){ + int iCol; + Expr *pE = pOrderBy->a[i].pExpr; + if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( iCol>0 && iCol<=pEList->nExpr ){ + CollSeq *pColl = pE->pColl; + int flags = pE->flags & EP_ExpCollate; + sqlite3ExprDelete(pE); + pE = sqlite3ExprDup(pParse->db, pEList->a[iCol-1].pExpr); + pOrderBy->a[i].pExpr = pE; + if( pColl && flags ){ + pE->pColl = pColl; + pE->flags |= flags; + } + }else{ + sqlite3ErrorMsg(pParse, + "%s BY column number %d out of range - should be " + "between 1 and %d", zType, iCol, pEList->nExpr); + return 1; + } + } + if( sqlite3ExprResolveNames(pNC, pE) ){ + return 1; + } + } + return 0; +} + +/* +** This routine resolves any names used in the result set of the +** supplied SELECT statement. If the SELECT statement being resolved +** is a sub-select, then pOuterNC is a pointer to the NameContext +** of the parent SELECT. +*/ +int sqlite3SelectResolve( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* The outer name context. May be NULL. */ +){ + ExprList *pEList; /* Result set. */ + int i; /* For-loop variable used in multiple places */ + NameContext sNC; /* Local name-context */ + ExprList *pGroupBy; /* The group by clause */ + + /* If this routine has run before, return immediately. */ + if( p->isResolved ){ + assert( !pOuterNC ); + return SQLITE_OK; + } + p->isResolved = 1; + + /* If there have already been errors, do nothing. */ + if( pParse->nErr>0 ){ + return SQLITE_ERROR; + } + + /* Prepare the select statement. This call will allocate all cursors + ** required to handle the tables and subqueries in the FROM clause. + */ + if( prepSelectStmt(pParse, p) ){ + return SQLITE_ERROR; + } + + /* Resolve the expressions in the LIMIT and OFFSET clauses. These + ** are not allowed to refer to any names, so pass an empty NameContext. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + if( sqlite3ExprResolveNames(&sNC, p->pLimit) || + sqlite3ExprResolveNames(&sNC, p->pOffset) ){ + return SQLITE_ERROR; + } + + /* Set up the local name-context to pass to ExprResolveNames() to + ** resolve the expression-list. + */ + sNC.allowAgg = 1; + sNC.pSrcList = p->pSrc; + sNC.pNext = pOuterNC; + + /* Resolve names in the result set. */ + pEList = p->pEList; + if( !pEList ) return SQLITE_ERROR; + for(i=0; inExpr; i++){ + Expr *pX = pEList->a[i].pExpr; + if( sqlite3ExprResolveNames(&sNC, pX) ){ + return SQLITE_ERROR; + } + } + + /* If there are no aggregate functions in the result-set, and no GROUP BY + ** expression, do not allow aggregates in any of the other expressions. + */ + assert( !p->isAgg ); + pGroupBy = p->pGroupBy; + if( pGroupBy || sNC.hasAgg ){ + p->isAgg = 1; + }else{ + sNC.allowAgg = 0; + } + + /* If a HAVING clause is present, then there must be a GROUP BY clause. + */ + if( p->pHaving && !pGroupBy ){ + sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + return SQLITE_ERROR; + } + + /* Add the expression list to the name-context before parsing the + ** other expressions in the SELECT statement. This is so that + ** expressions in the WHERE clause (etc.) can refer to expressions by + ** aliases in the result set. + ** + ** Minor point: If this is the case, then the expression will be + ** re-evaluated for each reference to it. + */ + sNC.pEList = p->pEList; + if( sqlite3ExprResolveNames(&sNC, p->pWhere) || + sqlite3ExprResolveNames(&sNC, p->pHaving) ){ + return SQLITE_ERROR; + } + if( p->pPrior==0 ){ + if( processOrderGroupBy(&sNC, p->pOrderBy, "ORDER") || + processOrderGroupBy(&sNC, pGroupBy, "GROUP") ){ + return SQLITE_ERROR; + } + } + + if( pParse->db->mallocFailed ){ + return SQLITE_NOMEM; + } + + /* Make sure the GROUP BY clause does not contain aggregate functions. + */ + if( pGroupBy ){ + struct ExprList_item *pItem; + + for(i=0, pItem=pGroupBy->a; inExpr; i++, pItem++){ + if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " + "the GROUP BY clause"); + return SQLITE_ERROR; + } + } + } + + /* If this is one SELECT of a compound, be sure to resolve names + ** in the other SELECTs. + */ + if( p->pPrior ){ + return sqlite3SelectResolve(pParse, p->pPrior, pOuterNC); + }else{ + return SQLITE_OK; + } +} + +/* +** Reset the aggregate accumulator. +** +** The aggregate accumulator is a set of memory cells that hold +** intermediate results while calculating an aggregate. This +** routine simply stores NULLs in all of those memory cells. +*/ +static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pFunc; + if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ + return; + } + for(i=0; inColumn; i++){ + sqlite3VdbeAddOp(v, OP_MemNull, pAggInfo->aCol[i].iMem, 0); + } + for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ + sqlite3VdbeAddOp(v, OP_MemNull, pFunc->iMem, 0); + if( pFunc->iDistinct>=0 ){ + Expr *pE = pFunc->pExpr; + if( pE->pList==0 || pE->pList->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "DISTINCT in aggregate must be followed " + "by an expression"); + pFunc->iDistinct = -1; + }else{ + KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->pList); + sqlite3VdbeOp3(v, OP_OpenEphemeral, pFunc->iDistinct, 0, + (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + } + } + } +} + +/* +** Invoke the OP_AggFinalize opcode for every aggregate function +** in the AggInfo structure. +*/ +static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pF; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + ExprList *pList = pF->pExpr->pList; + sqlite3VdbeOp3(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, + (void*)pF->pFunc, P3_FUNCDEF); + } +} + +/* +** Update the accumulator memory cells for an aggregate based on +** the current cursor position. +*/ +static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pF; + struct AggInfo_col *pC; + + pAggInfo->directMode = 1; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + int nArg; + int addrNext = 0; + ExprList *pList = pF->pExpr->pList; + if( pList ){ + nArg = pList->nExpr; + sqlite3ExprCodeExprList(pParse, pList); + }else{ + nArg = 0; + } + if( pF->iDistinct>=0 ){ + addrNext = sqlite3VdbeMakeLabel(v); + assert( nArg==1 ); + codeDistinct(v, pF->iDistinct, addrNext, 1); + } + if( pF->pFunc->needCollSeq ){ + CollSeq *pColl = 0; + struct ExprList_item *pItem; + int j; + assert( pList!=0 ); /* pList!=0 if pF->pFunc->needCollSeq is true */ + for(j=0, pItem=pList->a; !pColl && jpExpr); + } + if( !pColl ){ + pColl = pParse->db->pDfltColl; + } + sqlite3VdbeOp3(v, OP_CollSeq, 0, 0, (char *)pColl, P3_COLLSEQ); + } + sqlite3VdbeOp3(v, OP_AggStep, pF->iMem, nArg, (void*)pF->pFunc, P3_FUNCDEF); + if( addrNext ){ + sqlite3VdbeResolveLabel(v, addrNext); + } + } + for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ + sqlite3ExprCode(pParse, pC->pExpr); + sqlite3VdbeAddOp(v, OP_MemStore, pC->iMem, 1); + } + pAggInfo->directMode = 0; +} + + +/* +** Generate code for the given SELECT statement. +** +** The results are distributed in various ways depending on the +** value of eDest and iParm. +** +** eDest Value Result +** ------------ ------------------------------------------- +** SRT_Callback Invoke the callback for each row of the result. +** +** SRT_Mem Store first result in memory cell iParm +** +** SRT_Set Store results as keys of table iParm. +** +** SRT_Union Store results as a key in a temporary table iParm +** +** SRT_Except Remove results from the temporary table iParm. +** +** SRT_Table Store results in temporary table iParm +** +** The table above is incomplete. Additional eDist value have be added +** since this comment was written. See the selectInnerLoop() function for +** a complete listing of the allowed values of eDest and their meanings. +** +** This routine returns the number of errors. If any errors are +** encountered, then an appropriate error message is left in +** pParse->zErrMsg. +** +** This routine does NOT free the Select structure passed in. The +** calling function needs to do that. +** +** The pParent, parentTab, and *pParentAgg fields are filled in if this +** SELECT is a subquery. This routine may try to combine this SELECT +** with its parent to form a single flat query. In so doing, it might +** change the parent query from a non-aggregate to an aggregate query. +** For that reason, the pParentAgg flag is passed as a pointer, so it +** can be changed. +** +** Example 1: The meaning of the pParent parameter. +** +** SELECT * FROM t1 JOIN (SELECT x, count(*) FROM t2) JOIN t3; +** \ \_______ subquery _______/ / +** \ / +** \____________________ outer query ___________________/ +** +** This routine is called for the outer query first. For that call, +** pParent will be NULL. During the processing of the outer query, this +** routine is called recursively to handle the subquery. For the recursive +** call, pParent will point to the outer query. Because the subquery is +** the second element in a three-way join, the parentTab parameter will +** be 1 (the 2nd value of a 0-indexed array.) +*/ +int sqlite3Select( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + int eDest, /* How to dispose of the results */ + int iParm, /* A parameter used by the eDest disposal method */ + Select *pParent, /* Another SELECT for which this is a sub-query */ + int parentTab, /* Index in pParent->pSrc of this query */ + int *pParentAgg, /* True if pParent uses aggregate functions */ + char *aff /* If eDest is SRT_Union, the affinity string */ +){ + int i, j; /* Loop counters */ + WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ + Vdbe *v; /* The virtual machine under construction */ + int isAgg; /* True for select lists like "count(*)" */ + ExprList *pEList; /* List of columns to extract. */ + SrcList *pTabList; /* List of tables to select from */ + Expr *pWhere; /* The WHERE clause. May be NULL */ + ExprList *pOrderBy; /* The ORDER BY clause. May be NULL */ + ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ + Expr *pHaving; /* The HAVING clause. May be NULL */ + int isDistinct; /* True if the DISTINCT keyword is present */ + int distinct; /* Table to use for the distinct set */ + int rc = 1; /* Value to return from this function */ + int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */ + AggInfo sAggInfo; /* Information used by aggregate queries */ + int iEnd; /* Address of the end of the query */ + sqlite3 *db; /* The database connection */ + + db = pParse->db; + if( p==0 || db->mallocFailed || pParse->nErr ){ + return 1; + } + if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; + memset(&sAggInfo, 0, sizeof(sAggInfo)); + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* If there is are a sequence of queries, do the earlier ones first. + */ + if( p->pPrior ){ + if( p->pRightmost==0 ){ + Select *pLoop; + int cnt = 0; + for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){ + pLoop->pRightmost = p; + } + if( SQLITE_MAX_COMPOUND_SELECT>0 && cnt>SQLITE_MAX_COMPOUND_SELECT ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + return 1; + } + } + return multiSelect(pParse, p, eDest, iParm, aff); + } +#endif + + pOrderBy = p->pOrderBy; + if( IgnorableOrderby(eDest) ){ + p->pOrderBy = 0; + } + if( sqlite3SelectResolve(pParse, p, 0) ){ + goto select_end; + } + p->pOrderBy = pOrderBy; + + /* Make local copies of the parameters for this query. + */ + pTabList = p->pSrc; + pWhere = p->pWhere; + pGroupBy = p->pGroupBy; + pHaving = p->pHaving; + isAgg = p->isAgg; + isDistinct = p->isDistinct; + pEList = p->pEList; + if( pEList==0 ) goto select_end; + + /* + ** Do not even attempt to generate any code if we have already seen + ** errors before this routine starts. + */ + if( pParse->nErr>0 ) goto select_end; + + /* If writing to memory or generating a set + ** only a single column may be output. + */ +#ifndef SQLITE_OMIT_SUBQUERY + if( checkForMultiColumnSelectError(pParse, eDest, pEList->nExpr) ){ + goto select_end; + } +#endif + + /* ORDER BY is ignored for some destinations. + */ + if( IgnorableOrderby(eDest) ){ + pOrderBy = 0; + } + + /* Begin generating code. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto select_end; + + /* Generate code for all sub-queries in the FROM clause + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; inSrc; i++){ + const char *zSavedAuthContext = 0; + int needRestoreContext; + struct SrcList_item *pItem = &pTabList->a[i]; + + if( pItem->pSelect==0 || pItem->isPopulated ) continue; + if( pItem->zName!=0 ){ + zSavedAuthContext = pParse->zAuthContext; + pParse->zAuthContext = pItem->zName; + needRestoreContext = 1; + }else{ + needRestoreContext = 0; + } +#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 + /* Increment Parse.nHeight by the height of the largest expression + ** tree refered to by this, the parent select. The child select + ** may contain expression trees of at most + ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit + ** more conservative than necessary, but much easier than enforcing + ** an exact limit. + */ + pParse->nHeight += sqlite3SelectExprHeight(p); +#endif + sqlite3Select(pParse, pItem->pSelect, SRT_EphemTab, + pItem->iCursor, p, i, &isAgg, 0); +#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 + pParse->nHeight -= sqlite3SelectExprHeight(p); +#endif + if( needRestoreContext ){ + pParse->zAuthContext = zSavedAuthContext; + } + pTabList = p->pSrc; + pWhere = p->pWhere; + if( !IgnorableOrderby(eDest) ){ + pOrderBy = p->pOrderBy; + } + pGroupBy = p->pGroupBy; + pHaving = p->pHaving; + isDistinct = p->isDistinct; + } +#endif + + /* Check for the special case of a min() or max() function by itself + ** in the result set. + */ + if( simpleMinMaxQuery(pParse, p, eDest, iParm) ){ + rc = 0; + goto select_end; + } + + /* Check to see if this is a subquery that can be "flattened" into its parent. + ** If flattening is a possiblity, do so and return immediately. + */ +#ifndef SQLITE_OMIT_VIEW + if( pParent && pParentAgg && + flattenSubquery(db, pParent, parentTab, *pParentAgg, isAgg) ){ + if( isAgg ) *pParentAgg = 1; + goto select_end; + } +#endif + + /* If there is an ORDER BY clause, then this sorting + ** index might end up being unused if the data can be + ** extracted in pre-sorted order. If that is the case, then the + ** OP_OpenEphemeral instruction will be changed to an OP_Noop once + ** we figure out that the sorting index is not needed. The addrSortIndex + ** variable is used to facilitate that change. + */ + if( pOrderBy ){ + KeyInfo *pKeyInfo; + if( pParse->nErr ){ + goto select_end; + } + pKeyInfo = keyInfoFromExprList(pParse, pOrderBy); + pOrderBy->iECursor = pParse->nTab++; + p->addrOpenEphm[2] = addrSortIndex = + sqlite3VdbeOp3(v, OP_OpenEphemeral, pOrderBy->iECursor, pOrderBy->nExpr+2, (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + }else{ + addrSortIndex = -1; + } + + /* If the output is destined for a temporary table, open that table. + */ + if( eDest==SRT_EphemTab ){ + sqlite3VdbeAddOp(v, OP_OpenEphemeral, iParm, pEList->nExpr); + } + + /* Set the limiter. + */ + iEnd = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iEnd); + + /* Open a virtual index to use for the distinct set. + */ + if( isDistinct ){ + KeyInfo *pKeyInfo; + distinct = pParse->nTab++; + pKeyInfo = keyInfoFromExprList(pParse, p->pEList); + sqlite3VdbeOp3(v, OP_OpenEphemeral, distinct, 0, + (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + }else{ + distinct = -1; + } + + /* Aggregate and non-aggregate queries are handled differently */ + if( !isAgg && pGroupBy==0 ){ + /* This case is for non-aggregate queries + ** Begin the database scan + */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pOrderBy); + if( pWInfo==0 ) goto select_end; + + /* If sorting index that was created by a prior OP_OpenEphemeral + ** instruction ended up not being needed, then change the OP_OpenEphemeral + ** into an OP_Noop. + */ + if( addrSortIndex>=0 && pOrderBy==0 ){ + sqlite3VdbeChangeToNoop(v, addrSortIndex, 1); + p->addrOpenEphm[2] = -1; + } + + /* Use the standard inner loop + */ + if( selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, distinct, eDest, + iParm, pWInfo->iContinue, pWInfo->iBreak, aff) ){ + goto select_end; + } + + /* End the database scan loop. + */ + sqlite3WhereEnd(pWInfo); + }else{ + /* This is the processing for aggregate queries */ + NameContext sNC; /* Name context for processing aggregate information */ + int iAMem; /* First Mem address for storing current GROUP BY */ + int iBMem; /* First Mem address for previous GROUP BY */ + int iUseFlag; /* Mem address holding flag indicating that at least + ** one row of the input to the aggregator has been + ** processed */ + int iAbortFlag; /* Mem address which causes query abort if positive */ + int groupBySort; /* Rows come from source in GROUP BY order */ + + + /* The following variables hold addresses or labels for parts of the + ** virtual machine program we are putting together */ + int addrOutputRow; /* Start of subroutine that outputs a result row */ + int addrSetAbort; /* Set the abort flag and return */ + int addrInitializeLoop; /* Start of code that initializes the input loop */ + int addrTopOfLoop; /* Top of the input loop */ + int addrGroupByChange; /* Code that runs when any GROUP BY term changes */ + int addrProcessRow; /* Code to process a single input row */ + int addrEnd; /* End of all processing */ + int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ + int addrReset; /* Subroutine for resetting the accumulator */ + + addrEnd = sqlite3VdbeMakeLabel(v); + + /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in + ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the + ** SELECT statement. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.pAggInfo = &sAggInfo; + sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; + sAggInfo.pGroupBy = pGroupBy; + if( sqlite3ExprAnalyzeAggList(&sNC, pEList) ){ + goto select_end; + } + if( sqlite3ExprAnalyzeAggList(&sNC, pOrderBy) ){ + goto select_end; + } + if( pHaving && sqlite3ExprAnalyzeAggregates(&sNC, pHaving) ){ + goto select_end; + } + sAggInfo.nAccumulator = sAggInfo.nColumn; + for(i=0; ipList) ){ + goto select_end; + } + } + if( db->mallocFailed ) goto select_end; + + /* Processing for aggregates with GROUP BY is very different and + ** much more complex tha aggregates without a GROUP BY. + */ + if( pGroupBy ){ + KeyInfo *pKeyInfo; /* Keying information for the group by clause */ + + /* Create labels that we will be needing + */ + + addrInitializeLoop = sqlite3VdbeMakeLabel(v); + addrGroupByChange = sqlite3VdbeMakeLabel(v); + addrProcessRow = sqlite3VdbeMakeLabel(v); + + /* If there is a GROUP BY clause we might need a sorting index to + ** implement it. Allocate that sorting index now. If it turns out + ** that we do not need it after all, the OpenEphemeral instruction + ** will be converted into a Noop. + */ + sAggInfo.sortingIdx = pParse->nTab++; + pKeyInfo = keyInfoFromExprList(pParse, pGroupBy); + addrSortingIdx = + sqlite3VdbeOp3(v, OP_OpenEphemeral, sAggInfo.sortingIdx, + sAggInfo.nSortingColumn, + (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + + /* Initialize memory locations used by GROUP BY aggregate processing + */ + iUseFlag = pParse->nMem++; + iAbortFlag = pParse->nMem++; + iAMem = pParse->nMem; + pParse->nMem += pGroupBy->nExpr; + iBMem = pParse->nMem; + pParse->nMem += pGroupBy->nExpr; + sqlite3VdbeAddOp(v, OP_MemInt, 0, iAbortFlag); + VdbeComment((v, "# clear abort flag")); + sqlite3VdbeAddOp(v, OP_MemInt, 0, iUseFlag); + VdbeComment((v, "# indicate accumulator empty")); + sqlite3VdbeAddOp(v, OP_Goto, 0, addrInitializeLoop); + + /* Generate a subroutine that outputs a single row of the result + ** set. This subroutine first looks at the iUseFlag. If iUseFlag + ** is less than or equal to zero, the subroutine is a no-op. If + ** the processing calls for the query to abort, this subroutine + ** increments the iAbortFlag memory location before returning in + ** order to signal the caller to abort. + */ + addrSetAbort = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp(v, OP_MemInt, 1, iAbortFlag); + VdbeComment((v, "# set abort flag")); + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + addrOutputRow = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp(v, OP_IfMemPos, iUseFlag, addrOutputRow+2); + VdbeComment((v, "# Groupby result generator entry point")); + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + finalizeAggFunctions(pParse, &sAggInfo); + if( pHaving ){ + sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, 1); + } + rc = selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy, + distinct, eDest, iParm, + addrOutputRow+1, addrSetAbort, aff); + if( rc ){ + goto select_end; + } + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + VdbeComment((v, "# end groupby result generator")); + + /* Generate a subroutine that will reset the group-by accumulator + */ + addrReset = sqlite3VdbeCurrentAddr(v); + resetAccumulator(pParse, &sAggInfo); + sqlite3VdbeAddOp(v, OP_Return, 0, 0); + + /* Begin a loop that will extract all source rows in GROUP BY order. + ** This might involve two separate loops with an OP_Sort in between, or + ** it might be a single loop that uses an index to extract information + ** in the right order to begin with. + */ + sqlite3VdbeResolveLabel(v, addrInitializeLoop); + sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy); + if( pWInfo==0 ) goto select_end; + if( pGroupBy==0 ){ + /* The optimizer is able to deliver rows in group by order so + ** we do not have to sort. The OP_OpenEphemeral table will be + ** cancelled later because we still need to use the pKeyInfo + */ + pGroupBy = p->pGroupBy; + groupBySort = 0; + }else{ + /* Rows are coming out in undetermined order. We have to push + ** each row into a sorting index, terminate the first loop, + ** then loop over the sorting index in order to get the output + ** in sorted order + */ + groupBySort = 1; + sqlite3ExprCodeExprList(pParse, pGroupBy); + sqlite3VdbeAddOp(v, OP_Sequence, sAggInfo.sortingIdx, 0); + j = pGroupBy->nExpr+1; + for(i=0; iiSorterColumnpTab, pCol->iColumn, pCol->iTable); + j++; + } + sqlite3VdbeAddOp(v, OP_MakeRecord, j, 0); + sqlite3VdbeAddOp(v, OP_IdxInsert, sAggInfo.sortingIdx, 0); + sqlite3WhereEnd(pWInfo); + sqlite3VdbeAddOp(v, OP_Sort, sAggInfo.sortingIdx, addrEnd); + VdbeComment((v, "# GROUP BY sort")); + sAggInfo.useSortingIdx = 1; + } + + /* Evaluate the current GROUP BY terms and store in b0, b1, b2... + ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) + ** Then compare the current GROUP BY terms against the GROUP BY terms + ** from the previous row currently stored in a0, a1, a2... + */ + addrTopOfLoop = sqlite3VdbeCurrentAddr(v); + for(j=0; jnExpr; j++){ + if( groupBySort ){ + sqlite3VdbeAddOp(v, OP_Column, sAggInfo.sortingIdx, j); + }else{ + sAggInfo.directMode = 1; + sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr); + } + sqlite3VdbeAddOp(v, OP_MemStore, iBMem+j, jnExpr-1); + } + for(j=pGroupBy->nExpr-1; j>=0; j--){ + if( jnExpr-1 ){ + sqlite3VdbeAddOp(v, OP_MemLoad, iBMem+j, 0); + } + sqlite3VdbeAddOp(v, OP_MemLoad, iAMem+j, 0); + if( j==0 ){ + sqlite3VdbeAddOp(v, OP_Eq, 0x200, addrProcessRow); + }else{ + sqlite3VdbeAddOp(v, OP_Ne, 0x200, addrGroupByChange); + } + sqlite3VdbeChangeP3(v, -1, (void*)pKeyInfo->aColl[j], P3_COLLSEQ); + } + + /* Generate code that runs whenever the GROUP BY changes. + ** Change in the GROUP BY are detected by the previous code + ** block. If there were no changes, this block is skipped. + ** + ** This code copies current group by terms in b0,b1,b2,... + ** over to a0,a1,a2. It then calls the output subroutine + ** and resets the aggregate accumulator registers in preparation + ** for the next GROUP BY batch. + */ + sqlite3VdbeResolveLabel(v, addrGroupByChange); + for(j=0; jnExpr; j++){ + sqlite3VdbeAddOp(v, OP_MemMove, iAMem+j, iBMem+j); + } + sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); + VdbeComment((v, "# output one row")); + sqlite3VdbeAddOp(v, OP_IfMemPos, iAbortFlag, addrEnd); + VdbeComment((v, "# check abort flag")); + sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset); + VdbeComment((v, "# reset accumulator")); + + /* Update the aggregate accumulators based on the content of + ** the current row + */ + sqlite3VdbeResolveLabel(v, addrProcessRow); + updateAccumulator(pParse, &sAggInfo); + sqlite3VdbeAddOp(v, OP_MemInt, 1, iUseFlag); + VdbeComment((v, "# indicate data in accumulator")); + + /* End of the loop + */ + if( groupBySort ){ + sqlite3VdbeAddOp(v, OP_Next, sAggInfo.sortingIdx, addrTopOfLoop); + }else{ + sqlite3WhereEnd(pWInfo); + sqlite3VdbeChangeToNoop(v, addrSortingIdx, 1); + } + + /* Output the final row of result + */ + sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); + VdbeComment((v, "# output final row")); + + } /* endif pGroupBy */ + else { + /* This case runs if the aggregate has no GROUP BY clause. The + ** processing is much simpler since there is only a single row + ** of output. + */ + resetAccumulator(pParse, &sAggInfo); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0); + if( pWInfo==0 ) goto select_end; + updateAccumulator(pParse, &sAggInfo); + sqlite3WhereEnd(pWInfo); + finalizeAggFunctions(pParse, &sAggInfo); + pOrderBy = 0; + if( pHaving ){ + sqlite3ExprIfFalse(pParse, pHaving, addrEnd, 1); + } + selectInnerLoop(pParse, p, p->pEList, 0, 0, 0, -1, + eDest, iParm, addrEnd, addrEnd, aff); + } + sqlite3VdbeResolveLabel(v, addrEnd); + + } /* endif aggregate query */ + + /* If there is an ORDER BY clause, then we need to sort the results + ** and send them to the callback one by one. + */ + if( pOrderBy ){ + generateSortTail(pParse, p, v, pEList->nExpr, eDest, iParm); + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If this was a subquery, we have now converted the subquery into a + ** temporary table. So set the SrcList_item.isPopulated flag to prevent + ** this subquery from being evaluated again and to force the use of + ** the temporary table. + */ + if( pParent ){ + assert( pParent->pSrc->nSrc>parentTab ); + assert( pParent->pSrc->a[parentTab].pSelect==p ); + pParent->pSrc->a[parentTab].isPopulated = 1; + } +#endif + + /* Jump here to skip this query + */ + sqlite3VdbeResolveLabel(v, iEnd); + + /* The SELECT was successfully coded. Set the return code to 0 + ** to indicate no errors. + */ + rc = 0; + + /* Control jumps to here if an error is encountered above, or upon + ** successful coding of the SELECT. + */ +select_end: + + /* Identify column names if we will be using them in a callback. This + ** step is skipped if the output is going to some other destination. + */ + if( rc==SQLITE_OK && eDest==SRT_Callback ){ + generateColumnNames(pParse, pTabList, pEList); + } + + sqlite3_free(sAggInfo.aCol); + sqlite3_free(sAggInfo.aFunc); + return rc; +} + +#if defined(SQLITE_DEBUG) +/* +******************************************************************************* +** The following code is used for testing and debugging only. The code +** that follows does not appear in normal builds. +** +** These routines are used to print out the content of all or part of a +** parse structures such as Select or Expr. Such printouts are useful +** for helping to understand what is happening inside the code generator +** during the execution of complex SELECT statements. +** +** These routine are not called anywhere from within the normal +** code base. Then are intended to be called from within the debugger +** or from temporary "printf" statements inserted for debugging. +*/ +void sqlite3PrintExpr(Expr *p){ + if( p->token.z && p->token.n>0 ){ + sqlite3DebugPrintf("(%.*s", p->token.n, p->token.z); + }else{ + sqlite3DebugPrintf("(%d", p->op); + } + if( p->pLeft ){ + sqlite3DebugPrintf(" "); + sqlite3PrintExpr(p->pLeft); + } + if( p->pRight ){ + sqlite3DebugPrintf(" "); + sqlite3PrintExpr(p->pRight); + } + sqlite3DebugPrintf(")"); +} +void sqlite3PrintExprList(ExprList *pList){ + int i; + for(i=0; inExpr; i++){ + sqlite3PrintExpr(pList->a[i].pExpr); + if( inExpr-1 ){ + sqlite3DebugPrintf(", "); + } + } +} +void sqlite3PrintSelect(Select *p, int indent){ + sqlite3DebugPrintf("%*sSELECT(%p) ", indent, "", p); + sqlite3PrintExprList(p->pEList); + sqlite3DebugPrintf("\n"); + if( p->pSrc ){ + char *zPrefix; + int i; + zPrefix = "FROM"; + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + sqlite3DebugPrintf("%*s ", indent+6, zPrefix); + zPrefix = ""; + if( pItem->pSelect ){ + sqlite3DebugPrintf("(\n"); + sqlite3PrintSelect(pItem->pSelect, indent+10); + sqlite3DebugPrintf("%*s)", indent+8, ""); + }else if( pItem->zName ){ + sqlite3DebugPrintf("%s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3DebugPrintf("(table: %s)", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3DebugPrintf(" AS %s", pItem->zAlias); + } + if( ipSrc->nSrc-1 ){ + sqlite3DebugPrintf(","); + } + sqlite3DebugPrintf("\n"); + } + } + if( p->pWhere ){ + sqlite3DebugPrintf("%*s WHERE ", indent, ""); + sqlite3PrintExpr(p->pWhere); + sqlite3DebugPrintf("\n"); + } + if( p->pGroupBy ){ + sqlite3DebugPrintf("%*s GROUP BY ", indent, ""); + sqlite3PrintExprList(p->pGroupBy); + sqlite3DebugPrintf("\n"); + } + if( p->pHaving ){ + sqlite3DebugPrintf("%*s HAVING ", indent, ""); + sqlite3PrintExpr(p->pHaving); + sqlite3DebugPrintf("\n"); + } + if( p->pOrderBy ){ + sqlite3DebugPrintf("%*s ORDER BY ", indent, ""); + sqlite3PrintExprList(p->pOrderBy); + sqlite3DebugPrintf("\n"); + } +} +/* End of the structure debug printing code +*****************************************************************************/ +#endif /* defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c b/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c new file mode 100644 index 0000000000..bd5105e48c --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c @@ -0,0 +1,2019 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement the "sqlite" command line +** utility for accessing SQLite databases. +** +** $Id: shell.c,v 1.167 2007/09/07 01:12:32 drh Exp $ +*/ +#include +#include +#include +#include +#include "sqlite3.h" +#include +#include + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__) && !defined(__OS2__) +# include +# include +# include +# include +#endif + +#ifdef __MACOS__ +# include +# include +# include +# include +# include +# include +#endif + +#ifdef __OS2__ +# include +#endif + +#if defined(HAVE_READLINE) && HAVE_READLINE==1 +# include +# include +#else +# define readline(p) local_getline(p,stdin) +# define add_history(X) +# define read_history(X) +# define write_history(X) +# define stifle_history(X) +#endif + +#if defined(_WIN32) || defined(WIN32) +# include +#else +/* Make sure isatty() has a prototype. +*/ +extern int isatty(); +#endif + +/* +** If the following flag is set, then command execution stops +** at an error if we are not interactive. +*/ +static int bail_on_error = 0; + +/* +** Threat stdin as an interactive input if the following variable +** is true. Otherwise, assume stdin is connected to a file or pipe. +*/ +static int stdin_is_interactive = 1; + +/* +** The following is the open SQLite database. We make a pointer +** to this database a static variable so that it can be accessed +** by the SIGINT handler to interrupt database processing. +*/ +static sqlite3 *db = 0; + +/* +** True if an interrupt (Control-C) has been received. +*/ +static volatile int seenInterrupt = 0; + +/* +** This is the name of our program. It is set in main(), used +** in a number of other places, mostly for error messages. +*/ +static char *Argv0; + +/* +** Prompt strings. Initialized in main. Settable with +** .prompt main continue +*/ +static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ +static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ + +/* +** Write I/O traces to the following stream. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static FILE *iotrace = 0; +#endif + +/* +** This routine works like printf in that its first argument is a +** format string and subsequent arguments are values to be substituted +** in place of % fields. The result of formatting this string +** is written to iotrace. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static void iotracePrintf(const char *zFormat, ...){ + va_list ap; + char *z; + if( iotrace==0 ) return; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + fprintf(iotrace, "%s", z); + sqlite3_free(z); +} +#endif + + +/* +** Determines if a string is a number of not. +*/ +static int isNumber(const char *z, int *realnum){ + if( *z=='-' || *z=='+' ) z++; + if( !isdigit(*z) ){ + return 0; + } + z++; + if( realnum ) *realnum = 0; + while( isdigit(*z) ){ z++; } + if( *z=='.' ){ + z++; + if( !isdigit(*z) ) return 0; + while( isdigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + if( *z=='e' || *z=='E' ){ + z++; + if( *z=='+' || *z=='-' ) z++; + if( !isdigit(*z) ) return 0; + while( isdigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + return *z==0; +} + +/* +** A global char* and an SQL function to access its current value +** from within an SQL statement. This program used to use the +** sqlite_exec_printf() API to substitue a string into an SQL statement. +** The correct way to do this with sqlite3 is to use the bind API, but +** since the shell is built around the callback paradigm it would be a lot +** of work. Instead just use this hack, which is quite harmless. +*/ +static const char *zShellStatic = 0; +static void shellstaticFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( 0==argc ); + assert( zShellStatic ); + sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC); +} + + +/* +** This routine reads a line of text from FILE in, stores +** the text in memory obtained from malloc() and returns a pointer +** to the text. NULL is returned at end of file, or if malloc() +** fails. +** +** The interface is like "readline" but no command-line editing +** is done. +*/ +static char *local_getline(char *zPrompt, FILE *in){ + char *zLine; + int nLine; + int n; + int eol; + + if( zPrompt && *zPrompt ){ + printf("%s",zPrompt); + fflush(stdout); + } + nLine = 100; + zLine = malloc( nLine ); + if( zLine==0 ) return 0; + n = 0; + eol = 0; + while( !eol ){ + if( n+100>nLine ){ + nLine = nLine*2 + 100; + zLine = realloc(zLine, nLine); + if( zLine==0 ) return 0; + } + if( fgets(&zLine[n], nLine - n, in)==0 ){ + if( n==0 ){ + free(zLine); + return 0; + } + zLine[n] = 0; + eol = 1; + break; + } + while( zLine[n] ){ n++; } + if( n>0 && zLine[n-1]=='\n' ){ + n--; + zLine[n] = 0; + eol = 1; + } + } + zLine = realloc( zLine, n+1 ); + return zLine; +} + +/* +** Retrieve a single line of input text. +** +** zPrior is a string of prior text retrieved. If not the empty +** string, then issue a continuation prompt. +*/ +static char *one_input_line(const char *zPrior, FILE *in){ + char *zPrompt; + char *zResult; + if( in!=0 ){ + return local_getline(0, in); + } + if( zPrior && zPrior[0] ){ + zPrompt = continuePrompt; + }else{ + zPrompt = mainPrompt; + } + zResult = readline(zPrompt); +#if defined(HAVE_READLINE) && HAVE_READLINE==1 + if( zResult && *zResult ) add_history(zResult); +#endif + return zResult; +} + +struct previous_mode_data { + int valid; /* Is there legit data in here? */ + int mode; + int showHeader; + int colWidth[100]; +}; + +/* +** An pointer to an instance of this structure is passed from +** the main program to the callback. This is used to communicate +** state and mode information. +*/ +struct callback_data { + sqlite3 *db; /* The database */ + int echoOn; /* True to echo input commands */ + int cnt; /* Number of records displayed so far */ + FILE *out; /* Write results here */ + int mode; /* An output mode setting */ + int writableSchema; /* True if PRAGMA writable_schema=ON */ + int showHeader; /* True to show column names in List or Column mode */ + char *zDestTable; /* Name of destination table when MODE_Insert */ + char separator[20]; /* Separator character for MODE_List */ + int colWidth[100]; /* Requested width of each column when in column mode*/ + int actualWidth[100]; /* Actual width of each column */ + char nullvalue[20]; /* The text to print when a NULL comes back from + ** the database */ + struct previous_mode_data explainPrev; + /* Holds the mode information just before + ** .explain ON */ + char outfile[FILENAME_MAX]; /* Filename for *out */ + const char *zDbFilename; /* name of the database file */ +}; + +/* +** These are the allowed modes. +*/ +#define MODE_Line 0 /* One column per line. Blank line between records */ +#define MODE_Column 1 /* One record per line in neat columns */ +#define MODE_List 2 /* One record per line with a separator */ +#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ +#define MODE_Html 4 /* Generate an XHTML table */ +#define MODE_Insert 5 /* Generate SQL "insert" statements */ +#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ +#define MODE_Csv 7 /* Quote strings, numbers are plain */ +#define MODE_NUM_OF 8 /* The number of modes (not a mode itself) */ + +static const char *modeDescr[MODE_NUM_OF] = { + "line", + "column", + "list", + "semi", + "html", + "insert", + "tcl", + "csv", +}; + +/* +** Number of elements in an array +*/ +#define ArraySize(X) (sizeof(X)/sizeof(X[0])) + +/* +** Output the given string as a quoted string using SQL quoting conventions. +*/ +static void output_quoted_string(FILE *out, const char *z){ + int i; + int nSingle = 0; + for(i=0; z[i]; i++){ + if( z[i]=='\'' ) nSingle++; + } + if( nSingle==0 ){ + fprintf(out,"'%s'",z); + }else{ + fprintf(out,"'"); + while( *z ){ + for(i=0; z[i] && z[i]!='\''; i++){} + if( i==0 ){ + fprintf(out,"''"); + z++; + }else if( z[i]=='\'' ){ + fprintf(out,"%.*s''",i,z); + z += i+1; + }else{ + fprintf(out,"%s",z); + break; + } + } + fprintf(out,"'"); + } +} + +/* +** Output the given string as a quoted according to C or TCL quoting rules. +*/ +static void output_c_string(FILE *out, const char *z){ + unsigned int c; + fputc('"', out); + while( (c = *(z++))!=0 ){ + if( c=='\\' ){ + fputc(c, out); + fputc(c, out); + }else if( c=='\t' ){ + fputc('\\', out); + fputc('t', out); + }else if( c=='\n' ){ + fputc('\\', out); + fputc('n', out); + }else if( c=='\r' ){ + fputc('\\', out); + fputc('r', out); + }else if( !isprint(c) ){ + fprintf(out, "\\%03o", c&0xff); + }else{ + fputc(c, out); + } + } + fputc('"', out); +} + +/* +** Output the given string with characters that are special to +** HTML escaped. +*/ +static void output_html_string(FILE *out, const char *z){ + int i; + while( *z ){ + for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){} + if( i>0 ){ + fprintf(out,"%.*s",i,z); + } + if( z[i]=='<' ){ + fprintf(out,"<"); + }else if( z[i]=='&' ){ + fprintf(out,"&"); + }else{ + break; + } + z += i + 1; + } +} + +/* +** If a field contains any character identified by a 1 in the following +** array, then the string must be quoted for CSV. +*/ +static const char needCsvQuote[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +/* +** Output a single term of CSV. Actually, p->separator is used for +** the separator, which may or may not be a comma. p->nullvalue is +** the null value. Strings are quoted using ANSI-C rules. Numbers +** appear outside of quotes. +*/ +static void output_csv(struct callback_data *p, const char *z, int bSep){ + FILE *out = p->out; + if( z==0 ){ + fprintf(out,"%s",p->nullvalue); + }else{ + int i; + for(i=0; z[i]; i++){ + if( needCsvQuote[((unsigned char*)z)[i]] ){ + i = 0; + break; + } + } + if( i==0 ){ + putc('"', out); + for(i=0; z[i]; i++){ + if( z[i]=='"' ) putc('"', out); + putc(z[i], out); + } + putc('"', out); + }else{ + fprintf(out, "%s", z); + } + } + if( bSep ){ + fprintf(p->out, p->separator); + } +} + +#ifdef SIGINT +/* +** This routine runs when the user presses Ctrl-C +*/ +static void interrupt_handler(int NotUsed){ + seenInterrupt = 1; + if( db ) sqlite3_interrupt(db); +} +#endif + +/* +** This is the callback routine that the SQLite library +** invokes for each row of a query result. +*/ +static int callback(void *pArg, int nArg, char **azArg, char **azCol){ + int i; + struct callback_data *p = (struct callback_data*)pArg; + switch( p->mode ){ + case MODE_Line: { + int w = 5; + if( azArg==0 ) break; + for(i=0; iw ) w = len; + } + if( p->cnt++>0 ) fprintf(p->out,"\n"); + for(i=0; iout,"%*s = %s\n", w, azCol[i], + azArg[i] ? azArg[i] : p->nullvalue); + } + break; + } + case MODE_Column: { + if( p->cnt++==0 ){ + for(i=0; icolWidth) ){ + w = p->colWidth[i]; + }else{ + w = 0; + } + if( w<=0 ){ + w = strlen(azCol[i] ? azCol[i] : ""); + if( w<10 ) w = 10; + n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue); + if( wactualWidth) ){ + p->actualWidth[i] = w; + } + if( p->showHeader ){ + fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); + } + } + if( p->showHeader ){ + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------" + "----------------------------------------------------------", + i==nArg-1 ? "\n": " "); + } + } + } + if( azArg==0 ) break; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + fprintf(p->out,"%-*.*s%s",w,w, + azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); + } + break; + } + case MODE_Semi: + case MODE_List: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); + } + } + if( azArg==0 ) break; + for(i=0; inullvalue; + fprintf(p->out, "%s", z); + if( iout, "%s", p->separator); + }else if( p->mode==MODE_Semi ){ + fprintf(p->out, ";\n"); + }else{ + fprintf(p->out, "\n"); + } + } + break; + } + case MODE_Html: { + if( p->cnt++==0 && p->showHeader ){ + fprintf(p->out,""); + for(i=0; iout,"",azCol[i]); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + fprintf(p->out,""); + for(i=0; iout,"\n"); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Tcl: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,azCol[i] ? azCol[i] : ""); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Csv: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout,"\n"); + break; + } + case MODE_Insert: { + if( azArg==0 ) break; + fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); + for(i=0; i0 ? ",": ""; + if( azArg[i]==0 ){ + fprintf(p->out,"%sNULL",zSep); + }else if( isNumber(azArg[i], 0) ){ + fprintf(p->out,"%s%s",zSep, azArg[i]); + }else{ + if( zSep[0] ) fprintf(p->out,"%s",zSep); + output_quoted_string(p->out, azArg[i]); + } + } + fprintf(p->out,");\n"); + break; + } + } + return 0; +} + +/* +** Set the destination table field of the callback_data structure to +** the name of the table given. Escape any quote characters in the +** table name. +*/ +static void set_table_name(struct callback_data *p, const char *zName){ + int i, n; + int needQuote; + char *z; + + if( p->zDestTable ){ + free(p->zDestTable); + p->zDestTable = 0; + } + if( zName==0 ) return; + needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; + for(i=n=0; zName[i]; i++, n++){ + if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){ + needQuote = 1; + if( zName[i]=='\'' ) n++; + } + } + if( needQuote ) n += 2; + z = p->zDestTable = malloc( n+1 ); + if( z==0 ){ + fprintf(stderr,"Out of memory!\n"); + exit(1); + } + n = 0; + if( needQuote ) z[n++] = '\''; + for(i=0; zName[i]; i++){ + z[n++] = zName[i]; + if( zName[i]=='\'' ) z[n++] = '\''; + } + if( needQuote ) z[n++] = '\''; + z[n] = 0; +} + +/* zIn is either a pointer to a NULL-terminated string in memory obtained +** from malloc(), or a NULL pointer. The string pointed to by zAppend is +** added to zIn, and the result returned in memory obtained from malloc(). +** zIn, if it was not NULL, is freed. +** +** If the third argument, quote, is not '\0', then it is used as a +** quote character for zAppend. +*/ +static char *appendText(char *zIn, char const *zAppend, char quote){ + int len; + int i; + int nAppend = strlen(zAppend); + int nIn = (zIn?strlen(zIn):0); + + len = nAppend+nIn+1; + if( quote ){ + len += 2; + for(i=0; iout, "DELETE FROM sqlite_sequence;\n"); + }else if( strcmp(zTable, "sqlite_stat1")==0 ){ + fprintf(p->out, "ANALYZE sqlite_master;\n"); + }else if( strncmp(zTable, "sqlite_", 7)==0 ){ + return 0; + }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ + char *zIns; + if( !p->writableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=ON;\n"); + p->writableSchema = 1; + } + zIns = sqlite3_mprintf( + "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" + "VALUES('table','%q','%q',0,'%q');", + zTable, zTable, zSql); + fprintf(p->out, "%s\n", zIns); + sqlite3_free(zIns); + return 0; + }else{ + fprintf(p->out, "%s;\n", zSql); + } + + if( strcmp(zType, "table")==0 ){ + sqlite3_stmt *pTableInfo = 0; + char *zSelect = 0; + char *zTableInfo = 0; + char *zTmp = 0; + + zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0); + zTableInfo = appendText(zTableInfo, zTable, '"'); + zTableInfo = appendText(zTableInfo, ");", 0); + + rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0); + if( zTableInfo ) free(zTableInfo); + if( rc!=SQLITE_OK || !pTableInfo ){ + return 1; + } + + zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0); + zTmp = appendText(zTmp, zTable, '"'); + if( zTmp ){ + zSelect = appendText(zSelect, zTmp, '\''); + } + zSelect = appendText(zSelect, " || ' VALUES(' || ", 0); + rc = sqlite3_step(pTableInfo); + while( rc==SQLITE_ROW ){ + const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1); + zSelect = appendText(zSelect, "quote(", 0); + zSelect = appendText(zSelect, zText, '"'); + rc = sqlite3_step(pTableInfo); + if( rc==SQLITE_ROW ){ + zSelect = appendText(zSelect, ") || ',' || ", 0); + }else{ + zSelect = appendText(zSelect, ") ", 0); + } + } + rc = sqlite3_finalize(pTableInfo); + if( rc!=SQLITE_OK ){ + if( zSelect ) free(zSelect); + return 1; + } + zSelect = appendText(zSelect, "|| ')' FROM ", 0); + zSelect = appendText(zSelect, zTable, '"'); + + rc = run_table_dump_query(p->out, p->db, zSelect); + if( rc==SQLITE_CORRUPT ){ + zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0); + rc = run_table_dump_query(p->out, p->db, zSelect); + } + if( zSelect ) free(zSelect); + } + return 0; +} + +/* +** Run zQuery. Use dump_callback() as the callback routine so that +** the contents of the query are output as SQL statements. +** +** If we get a SQLITE_CORRUPT error, rerun the query after appending +** "ORDER BY rowid DESC" to the end. +*/ +static int run_schema_dump_query( + struct callback_data *p, + const char *zQuery, + char **pzErrMsg +){ + int rc; + rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg); + if( rc==SQLITE_CORRUPT ){ + char *zQ2; + int len = strlen(zQuery); + if( pzErrMsg ) sqlite3_free(*pzErrMsg); + zQ2 = malloc( len+100 ); + if( zQ2==0 ) return rc; + sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); + rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg); + free(zQ2); + } + return rc; +} + +/* +** Text of a help message +*/ +static char zHelp[] = + ".bail ON|OFF Stop after hitting an error. Default OFF\n" + ".databases List names and files of attached databases\n" + ".dump ?TABLE? ... Dump the database in an SQL text format\n" + ".echo ON|OFF Turn command echo on or off\n" + ".exit Exit this program\n" + ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n" + ".header(s) ON|OFF Turn display of headers on or off\n" + ".help Show this message\n" + ".import FILE TABLE Import data from FILE into TABLE\n" + ".indices TABLE Show names of all indices on TABLE\n" +#ifdef SQLITE_ENABLE_IOTRACE + ".iotrace FILE Enable I/O diagnostic logging to FILE\n" +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + ".load FILE ?ENTRY? Load an extension library\n" +#endif + ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" + " csv Comma-separated values\n" + " column Left-aligned columns. (See .width)\n" + " html HTML
      %s
      "); + output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out,"
      code\n" + " insert SQL insert statements for TABLE\n" + " line One value per line\n" + " list Values delimited by .separator string\n" + " tabs Tab-separated values\n" + " tcl TCL list elements\n" + ".nullvalue STRING Print STRING in place of NULL values\n" + ".output FILENAME Send output to FILENAME\n" + ".output stdout Send output to the screen\n" + ".prompt MAIN CONTINUE Replace the standard prompts\n" + ".quit Exit this program\n" + ".read FILENAME Execute SQL in FILENAME\n" + ".schema ?TABLE? Show the CREATE statements\n" + ".separator STRING Change separator used by output mode and .import\n" + ".show Show the current values for various settings\n" + ".tables ?PATTERN? List names of tables matching a LIKE pattern\n" + ".timeout MS Try opening locked tables for MS milliseconds\n" + ".width NUM NUM ... Set column widths for \"column\" mode\n" +; + +/* Forward reference */ +static int process_input(struct callback_data *p, FILE *in); + +/* +** Make sure the database is open. If it is not, then open it. If +** the database fails to open, print an error message and exit. +*/ +static void open_db(struct callback_data *p){ + if( p->db==0 ){ + sqlite3_open(p->zDbFilename, &p->db); + db = p->db; + sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, + shellstaticFunc, 0, 0); + if( SQLITE_OK!=sqlite3_errcode(db) ){ + fprintf(stderr,"Unable to open database \"%s\": %s\n", + p->zDbFilename, sqlite3_errmsg(db)); + exit(1); + } +#ifndef SQLITE_OMIT_LOAD_EXTENSION + sqlite3_enable_load_extension(p->db, 1); +#endif + } +} + +/* +** Do C-language style dequoting. +** +** \t -> tab +** \n -> newline +** \r -> carriage return +** \NNN -> ascii character NNN in octal +** \\ -> backslash +*/ +static void resolve_backslashes(char *z){ + int i, j, c; + for(i=j=0; (c = z[i])!=0; i++, j++){ + if( c=='\\' ){ + c = z[++i]; + if( c=='n' ){ + c = '\n'; + }else if( c=='t' ){ + c = '\t'; + }else if( c=='r' ){ + c = '\r'; + }else if( c>='0' && c<='7' ){ + c -= '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + } + } + } + } + z[j] = c; + } + z[j] = 0; +} + +/* +** Interpret zArg as a boolean value. Return either 0 or 1. +*/ +static int booleanValue(char *zArg){ + int val = atoi(zArg); + int j; + for(j=0; zArg[j]; j++){ + zArg[j] = tolower(zArg[j]); + } + if( strcmp(zArg,"on")==0 ){ + val = 1; + }else if( strcmp(zArg,"yes")==0 ){ + val = 1; + } + return val; +} + +/* +** If an input line begins with "." then invoke this routine to +** process that line. +** +** Return 1 on error, 2 to exit, and 0 otherwise. +*/ +static int do_meta_command(char *zLine, struct callback_data *p){ + int i = 1; + int nArg = 0; + int n, c; + int rc = 0; + char *azArg[50]; + + /* Parse the input line into tokens. + */ + while( zLine[i] && nArg1 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){ + bail_on_error = booleanValue(azArg[1]); + }else + + if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 1; + data.mode = MODE_Column; + data.colWidth[0] = 3; + data.colWidth[1] = 15; + data.colWidth[2] = 58; + data.cnt = 0; + sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + + if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ + char *zErrMsg = 0; + open_db(p); + fprintf(p->out, "BEGIN TRANSACTION;\n"); + p->writableSchema = 0; + if( nArg==1 ){ + run_schema_dump_query(p, + "SELECT name, type, sql FROM sqlite_master " + "WHERE sql NOT NULL AND type=='table'", 0 + ); + run_table_dump_query(p->out, p->db, + "SELECT sql FROM sqlite_master " + "WHERE sql NOT NULL AND type IN ('index','trigger','view')" + ); + }else{ + int i; + for(i=1; iout, p->db, + "SELECT sql FROM sqlite_master " + "WHERE sql NOT NULL" + " AND type IN ('index','trigger','view')" + " AND tbl_name LIKE shellstatic()" + ); + zShellStatic = 0; + } + } + if( p->writableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=OFF;\n"); + p->writableSchema = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + }else{ + fprintf(p->out, "COMMIT;\n"); + } + }else + + if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){ + p->echoOn = booleanValue(azArg[1]); + }else + + if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ + rc = 2; + }else + + if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ + int val = nArg>=2 ? booleanValue(azArg[1]) : 1; + if(val == 1) { + if(!p->explainPrev.valid) { + p->explainPrev.valid = 1; + p->explainPrev.mode = p->mode; + p->explainPrev.showHeader = p->showHeader; + memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); + } + /* We could put this code under the !p->explainValid + ** condition so that it does not execute if we are already in + ** explain mode. However, always executing it allows us an easy + ** was to reset to explain mode in case the user previously + ** did an .explain followed by a .width, .mode or .header + ** command. + */ + p->mode = MODE_Column; + p->showHeader = 1; + memset(p->colWidth,0,ArraySize(p->colWidth)); + p->colWidth[0] = 4; + p->colWidth[1] = 14; + p->colWidth[2] = 10; + p->colWidth[3] = 10; + p->colWidth[4] = 33; + }else if (p->explainPrev.valid) { + p->explainPrev.valid = 0; + p->mode = p->explainPrev.mode; + p->showHeader = p->explainPrev.showHeader; + memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); + } + }else + + if( c=='h' && (strncmp(azArg[0], "header", n)==0 || + strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){ + p->showHeader = booleanValue(azArg[1]); + }else + + if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ + fprintf(stderr,zHelp); + }else + + if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){ + char *zTable = azArg[2]; /* Insert data into this table */ + char *zFile = azArg[1]; /* The file from which to extract data */ + sqlite3_stmt *pStmt; /* A statement */ + int rc; /* Result code */ + int nCol; /* Number of columns in the table */ + int nByte; /* Number of bytes in an SQL string */ + int i, j; /* Loop counters */ + int nSep; /* Number of bytes in p->separator[] */ + char *zSql; /* An SQL statement */ + char *zLine; /* A single line of input from the file */ + char **azCol; /* zLine[] broken up into columns */ + char *zCommit; /* How to commit changes */ + FILE *in; /* The input file */ + int lineno = 0; /* Line number of input file */ + + open_db(p); + nSep = strlen(p->separator); + if( nSep==0 ){ + fprintf(stderr, "non-null separator required for import\n"); + return 0; + } + zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); + if( zSql==0 ) return 0; + nByte = strlen(zSql); + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ){ + fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); + nCol = 0; + rc = 1; + }else{ + nCol = sqlite3_column_count(pStmt); + } + sqlite3_finalize(pStmt); + if( nCol==0 ) return 0; + zSql = malloc( nByte + 20 + nCol*2 ); + if( zSql==0 ) return 0; + sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable); + j = strlen(zSql); + for(i=1; idb, zSql, -1, &pStmt, 0); + free(zSql); + if( rc ){ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(pStmt); + return 1; + } + in = fopen(zFile, "rb"); + if( in==0 ){ + fprintf(stderr, "cannot open file: %s\n", zFile); + sqlite3_finalize(pStmt); + return 0; + } + azCol = malloc( sizeof(azCol[0])*(nCol+1) ); + if( azCol==0 ){ + fclose(in); + return 0; + } + sqlite3_exec(p->db, "BEGIN", 0, 0, 0); + zCommit = "COMMIT"; + while( (zLine = local_getline(0, in))!=0 ){ + char *z; + i = 0; + lineno++; + azCol[0] = zLine; + for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){ + if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){ + *z = 0; + i++; + if( idb, zCommit, 0, 0, 0); + }else + + if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_List; + zShellStatic = azArg[1]; + sqlite3_exec(p->db, + "SELECT name FROM sqlite_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "ORDER BY 1", + callback, &data, &zErrMsg + ); + zShellStatic = 0; + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + +#ifdef SQLITE_ENABLE_IOTRACE + if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ + extern void (*sqlite3_io_trace)(const char*, ...); + if( iotrace && iotrace!=stdout ) fclose(iotrace); + iotrace = 0; + if( nArg<2 ){ + sqlite3_io_trace = 0; + }else if( strcmp(azArg[1], "-")==0 ){ + sqlite3_io_trace = iotracePrintf; + iotrace = stdout; + }else{ + iotrace = fopen(azArg[1], "w"); + if( iotrace==0 ){ + fprintf(stderr, "cannot open \"%s\"\n", azArg[1]); + sqlite3_io_trace = 0; + }else{ + sqlite3_io_trace = iotracePrintf; + } + } + }else +#endif + +#ifndef SQLITE_OMIT_LOAD_EXTENSION + if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ + const char *zFile, *zProc; + char *zErrMsg = 0; + int rc; + zFile = azArg[1]; + zProc = nArg>=3 ? azArg[2] : 0; + open_db(p); + rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); + if( rc!=SQLITE_OK ){ + fprintf(stderr, "%s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else +#endif + + if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ + int n2 = strlen(azArg[1]); + if( strncmp(azArg[1],"line",n2)==0 + || + strncmp(azArg[1],"lines",n2)==0 ){ + p->mode = MODE_Line; + }else if( strncmp(azArg[1],"column",n2)==0 + || + strncmp(azArg[1],"columns",n2)==0 ){ + p->mode = MODE_Column; + }else if( strncmp(azArg[1],"list",n2)==0 ){ + p->mode = MODE_List; + }else if( strncmp(azArg[1],"html",n2)==0 ){ + p->mode = MODE_Html; + }else if( strncmp(azArg[1],"tcl",n2)==0 ){ + p->mode = MODE_Tcl; + }else if( strncmp(azArg[1],"csv",n2)==0 ){ + p->mode = MODE_Csv; + sqlite3_snprintf(sizeof(p->separator), p->separator, ","); + }else if( strncmp(azArg[1],"tabs",n2)==0 ){ + p->mode = MODE_List; + sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); + }else if( strncmp(azArg[1],"insert",n2)==0 ){ + p->mode = MODE_Insert; + if( nArg>=3 ){ + set_table_name(p, azArg[2]); + }else{ + set_table_name(p, "table"); + } + }else { + fprintf(stderr,"mode should be one of: " + "column csv html insert line list tabs tcl\n"); + } + }else + + if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { + sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, + "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); + }else + + if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ + if( p->out!=stdout ){ + fclose(p->out); + } + if( strcmp(azArg[1],"stdout")==0 ){ + p->out = stdout; + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); + }else{ + p->out = fopen(azArg[1], "wb"); + if( p->out==0 ){ + fprintf(stderr,"can't write to \"%s\"\n", azArg[1]); + p->out = stdout; + } else { + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); + } + } + }else + + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ + if( nArg >= 2) { + strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); + } + if( nArg >= 3) { + strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); + } + }else + + if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ + rc = 2; + }else + + if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ + FILE *alt = fopen(azArg[1], "rb"); + if( alt==0 ){ + fprintf(stderr,"can't open \"%s\"\n", azArg[1]); + }else{ + process_input(p, alt); + fclose(alt); + } + }else + + if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_Semi; + if( nArg>1 ){ + int i; + for(i=0; azArg[1][i]; i++) azArg[1][i] = tolower(azArg[1][i]); + if( strcmp(azArg[1],"sqlite_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TABLE sqlite_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + }else{ + zShellStatic = azArg[1]; + sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL" + " SELECT * FROM sqlite_temp_master) " + "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg); + zShellStatic = 0; + } + }else{ + sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL" + " SELECT * FROM sqlite_temp_master) " + "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg + ); + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + + if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ + sqlite3_snprintf(sizeof(p->separator), p->separator, + "%.*s", (int)sizeof(p->separator)-1, azArg[1]); + }else + + if( c=='s' && strncmp(azArg[0], "show", n)==0){ + int i; + fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); + fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); + fprintf(p->out,"%9.9s: ", "nullvalue"); + output_c_string(p->out, p->nullvalue); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: %s\n","output", + strlen(p->outfile) ? p->outfile : "stdout"); + fprintf(p->out,"%9.9s: ", "separator"); + output_c_string(p->out, p->separator); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: ","width"); + for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + fprintf(p->out,"%d ",p->colWidth[i]); + } + fprintf(p->out,"\n"); + }else + + if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ + char **azResult; + int nRow, rc; + char *zErrMsg; + open_db(p); + if( nArg==1 ){ + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'" + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + }else{ + zShellStatic = azArg[1]; + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + zShellStatic = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + if( rc==SQLITE_OK ){ + int len, maxlen = 0; + int i, j; + int nPrintCol, nPrintRow; + for(i=1; i<=nRow; i++){ + if( azResult[i]==0 ) continue; + len = strlen(azResult[i]); + if( len>maxlen ) maxlen = len; + } + nPrintCol = 80/(maxlen+2); + if( nPrintCol<1 ) nPrintCol = 1; + nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; + for(i=0; i1 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){ + open_db(p); + sqlite3_busy_timeout(p->db, atoi(azArg[1])); + }else + + if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ + int j; + assert( nArg<=ArraySize(azArg) ); + for(j=1; jcolWidth); j++){ + p->colWidth[j-1] = atoi(azArg[j]); + } + }else + + { + fprintf(stderr, "unknown command or invalid arguments: " + " \"%s\". Enter \".help\" for help\n", azArg[0]); + } + + return rc; +} + +/* +** Return TRUE if a semicolon occurs anywhere in the first N characters +** of string z[]. +*/ +static int _contains_semicolon(const char *z, int N){ + int i; + for(i=0; iout); + free(zLine); + zLine = one_input_line(zSql, in); + if( zLine==0 ){ + break; /* We have reached EOF */ + } + if( seenInterrupt ){ + if( in!=0 ) break; + seenInterrupt = 0; + } + lineno++; + if( p->echoOn ) printf("%s\n", zLine); + if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; + if( zLine && zLine[0]=='.' && nSql==0 ){ + rc = do_meta_command(zLine, p); + if( rc==2 ){ + break; + }else if( rc ){ + errCnt++; + } + continue; + } + if( _is_command_terminator(zLine) ){ + memcpy(zLine,";",2); + } + nSqlPrior = nSql; + if( zSql==0 ){ + int i; + for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){} + if( zLine[i]!=0 ){ + nSql = strlen(zLine); + zSql = malloc( nSql+1 ); + if( zSql==0 ){ + fprintf(stderr, "out of memory\n"); + exit(1); + } + memcpy(zSql, zLine, nSql+1); + startline = lineno; + } + }else{ + int len = strlen(zLine); + zSql = realloc( zSql, nSql + len + 2 ); + if( zSql==0 ){ + fprintf(stderr,"%s: out of memory!\n", Argv0); + exit(1); + } + zSql[nSql++] = '\n'; + memcpy(&zSql[nSql], zLine, len+1); + nSql += len; + } + if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) + && sqlite3_complete(zSql) ){ + p->cnt = 0; + open_db(p); + rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg); + if( rc || zErrMsg ){ + char zPrefix[100]; + if( in!=0 || !stdin_is_interactive ){ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, + "SQL error near line %d:", startline); + }else{ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:"); + } + if( zErrMsg!=0 ){ + printf("%s %s\n", zPrefix, zErrMsg); + sqlite3_free(zErrMsg); + zErrMsg = 0; + }else{ + printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + } + errCnt++; + } + free(zSql); + zSql = 0; + nSql = 0; + } + } + if( zSql ){ + if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql); + free(zSql); + } + free(zLine); + return errCnt; +} + +/* +** Return a pathname which is the user's home directory. A +** 0 return indicates an error of some kind. Space to hold the +** resulting string is obtained from malloc(). The calling +** function should free the result. +*/ +static char *find_home_dir(void){ + char *home_dir = NULL; + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__) && !defined(__OS2__) + struct passwd *pwent; + uid_t uid = getuid(); + if( (pwent=getpwuid(uid)) != NULL) { + home_dir = pwent->pw_dir; + } +#endif + +#ifdef __MACOS__ + char home_path[_MAX_PATH+1]; + home_dir = getcwd(home_path, _MAX_PATH); +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + home_dir = getenv("USERPROFILE"); + } +#endif + + if (!home_dir) { + home_dir = getenv("HOME"); + } + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + char *zDrive, *zPath; + int n; + zDrive = getenv("HOMEDRIVE"); + zPath = getenv("HOMEPATH"); + if( zDrive && zPath ){ + n = strlen(zDrive) + strlen(zPath) + 1; + home_dir = malloc( n ); + if( home_dir==0 ) return 0; + sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); + return home_dir; + } + home_dir = "c:\\"; + } +#endif + + if( home_dir ){ + int n = strlen(home_dir) + 1; + char *z = malloc( n ); + if( z ) memcpy(z, home_dir, n); + home_dir = z; + } + + return home_dir; +} + +/* +** Read input from the file given by sqliterc_override. Or if that +** parameter is NULL, take input from ~/.sqliterc +*/ +static void process_sqliterc( + struct callback_data *p, /* Configuration data */ + const char *sqliterc_override /* Name of config file. NULL to use default */ +){ + char *home_dir = NULL; + const char *sqliterc = sqliterc_override; + char *zBuf = 0; + FILE *in = NULL; + int nBuf; + + if (sqliterc == NULL) { + home_dir = find_home_dir(); + if( home_dir==0 ){ + fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0); + return; + } + nBuf = strlen(home_dir) + 16; + zBuf = malloc( nBuf ); + if( zBuf==0 ){ + fprintf(stderr,"%s: out of memory!\n", Argv0); + exit(1); + } + sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir); + free(home_dir); + sqliterc = (const char*)zBuf; + } + in = fopen(sqliterc,"rb"); + if( in ){ + if( stdin_is_interactive ){ + printf("-- Loading resources from %s\n",sqliterc); + } + process_input(p,in); + fclose(in); + } + free(zBuf); + return; +} + +/* +** Show available command line options +*/ +static const char zOptions[] = + " -init filename read/process named file\n" + " -echo print commands before execution\n" + " -[no]header turn headers on or off\n" + " -bail stop after hitting an error\n" + " -interactive force interactive I/O\n" + " -batch force batch I/O\n" + " -column set output mode to 'column'\n" + " -csv set output mode to 'csv'\n" + " -html set output mode to HTML\n" + " -line set output mode to 'line'\n" + " -list set output mode to 'list'\n" + " -separator 'x' set output field separator (|)\n" + " -nullvalue 'text' set text string for NULL values\n" + " -version show SQLite version\n" +; +static void usage(int showDetail){ + fprintf(stderr, + "Usage: %s [OPTIONS] FILENAME [SQL]\n" + "FILENAME is the name of an SQLite database. A new database is created\n" + "if the file does not previously exist.\n", Argv0); + if( showDetail ){ + fprintf(stderr, "OPTIONS include:\n%s", zOptions); + }else{ + fprintf(stderr, "Use the -help option for additional information\n"); + } + exit(1); +} + +/* +** Initialize the state information in data +*/ +static void main_init(struct callback_data *data) { + memset(data, 0, sizeof(*data)); + data->mode = MODE_List; + memcpy(data->separator,"|", 2); + data->showHeader = 0; + sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); + sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); +} + +int main(int argc, char **argv){ + char *zErrMsg = 0; + struct callback_data data; + const char *zInitFile = 0; + char *zFirstCmd = 0; + int i; + int rc = 0; + +#ifdef __MACOS__ + argc = ccommand(&argv); +#endif + + Argv0 = argv[0]; + main_init(&data); + stdin_is_interactive = isatty(0); + + /* Make sure we have a valid signal handler early, before anything + ** else is done. + */ +#ifdef SIGINT + signal(SIGINT, interrupt_handler); +#endif + + /* Do an initial pass through the command-line argument to locate + ** the name of the database file, the name of the initialization file, + ** and the first command to execute. + */ + for(i=1; i /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** Add the ability to override 'extern' +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif + +/* +** Make sure these symbols where not defined by some previous header +** file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers +** +** The version of the SQLite library is contained in the sqlite3.h +** header file in a #define named SQLITE_VERSION. The SQLITE_VERSION +** macro resolves to a string constant. +** +** The format of the version string is "X.Y.Z", where +** X is the major version number, Y is the minor version number and Z +** is the release number. The X.Y.Z might be followed by "alpha" or "beta". +** For example "3.1.1beta". +** +** The X value is always 3 in SQLite. The X value only changes when +** backwards compatibility is broken and we intend to never break +** backwards compatibility. The Y value only changes when +** there are major feature enhancements that are forwards compatible +** but not backwards compatible. The Z value is incremented with +** each release but resets back to 0 when Y is incremented. +** +** The SQLITE_VERSION_NUMBER is an integer with the value +** (X*1000000 + Y*1000 + Z). For example, for version "3.1.1beta", +** SQLITE_VERSION_NUMBER is set to 3001001. To detect if they are using +** version 3.1.1 or greater at compile time, programs may use the test +** (SQLITE_VERSION_NUMBER>=3001001). +** +** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. +*/ +#define SQLITE_VERSION "--VERS--" +#define SQLITE_VERSION_NUMBER --VERSION-NUMBER-- + +/* +** CAPI3REF: Run-Time Library Version Numbers +** +** These routines return values equivalent to the header constants +** [SQLITE_VERSION] and [SQLITE_VERSION_NUMBER]. The values returned +** by this routines should only be different from the header values +** if you compile your program using an sqlite3.h header from a +** different version of SQLite that the version of the library you +** link against. +** +** The sqlite3_version[] string constant contains the text of the +** [SQLITE_VERSION] string. The sqlite3_libversion() function returns +** a poiner to the sqlite3_version[] string constant. The function +** is provided for DLL users who can only access functions and not +** constants within the DLL. +*/ +SQLITE_EXTERN const char sqlite3_version[]; +const char *sqlite3_libversion(void); +int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** This routine returns TRUE (nonzero) if SQLite was compiled with +** all of its mutexes enabled and is thus threadsafe. It returns +** zero if the particular build is for single-threaded operation +** only. +** +** Really all this routine does is return true if SQLite was compiled +** with the -DSQLITE_THREADSAFE=1 option and false if +** compiled with -DSQLITE_THREADSAFE=0. If SQLite uses an +** application-defined mutex subsystem, malloc subsystem, collating +** sequence, VFS, SQL function, progress callback, commit hook, +** extension, or other accessories and these add-ons are not +** threadsafe, then clearly the combination will not be threadsafe +** either. Hence, this routine never reports that the library +** is guaranteed to be threadsafe, only when it is guaranteed not +** to be. +** +** This is an experimental API and may go away or change in future +** releases. +*/ +int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** +** Each open SQLite database is represented by pointer to an instance of the +** opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors +** and [sqlite3_close()] is its destructor. There are many other interfaces +** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on this +** object. +*/ +typedef struct sqlite3 sqlite3; + + +/* +** CAPI3REF: 64-Bit Integer Types +** +** Some compilers do not support the "long long" datatype. So we have +** to do compiler-specific typedefs for 64-bit signed and unsigned integers. +** +** Many SQLite interface functions require a 64-bit integer arguments. +** Those interfaces are declared using this typedef. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** +** Call this function with a pointer to a structure that was previously +** returned from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()] and the corresponding database will by +** closed. +** +** All SQL statements prepared using [sqlite3_prepare_v2()] or +** [sqlite3_prepare16_v2()] must be destroyed using [sqlite3_finalize()] +** before this routine is called. Otherwise, SQLITE_BUSY is returned and the +** database connection remains open. +** +** Passing this routine a database connection that has already been +** closed results in undefined behavior. If other interfaces that +** reference the same database connection are pending (either in the +** same thread or in different threads) when this routine is called, +** then the behavior is undefined and is almost certainly undesirable. +*/ +int sqlite3_close(sqlite3 *); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** +** This interface is used to do a one-time evaluatation of zero +** or more SQL statements. UTF-8 text of the SQL statements to +** be evaluted is passed in as the second parameter. The statements +** are prepared one by one using [sqlite3_prepare()], evaluated +** using [sqlite3_step()], then destroyed using [sqlite3_finalize()]. +** +** If one or more of the SQL statements are queries, then +** the callback function specified by the 3rd parameter is +** invoked once for each row of the query result. This callback +** should normally return 0. If the callback returns a non-zero +** value then the query is aborted, all subsequent SQL statements +** are skipped and the sqlite3_exec() function returns the [SQLITE_ABORT]. +** +** The 4th parameter to this interface is an arbitrary pointer that is +** passed through to the callback function as its first parameter. +** +** The 2nd parameter to the callback function is the number of +** columns in the query result. The 3rd parameter to the callback +** is an array of strings holding the values for each column +** as extracted using [sqlite3_column_text()]. +** The 4th parameter to the callback is an array of strings +** obtained using [sqlite3_column_name()] and holding +** the names of each column. +** +** The callback function may be NULL, even for queries. A NULL +** callback is not an error. It just means that no callback +** will be invoked. +** +** If an error occurs while parsing or evaluating the SQL (but +** not while executing the callback) then an appropriate error +** message is written into memory obtained from [sqlite3_malloc()] and +** *errmsg is made to point to that message. The calling function +** is responsible for freeing the memory using [sqlite3_free()]. +** If errmsg==NULL, then no error message is ever written. +** +** The return value is is SQLITE_OK if there are no errors and +** some other [SQLITE_OK | return code] if there is an error. +** The particular return value depends on the type of error. +** +*/ +int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluted */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: SQLITE_OK +** +** Many SQLite functions return an integer result code from the set shown +** above in order to indicates success or failure. +** +** The result codes above are the only ones returned by SQLite in its +** default configuration. However, the [sqlite3_extended_result_codes()] +** API can be used to set a database connectoin to return more detailed +** result codes. +** +** See also: [SQLITE_IOERR_READ | extended result codes] +** +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* NOT USED. Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** +** In its default configuration, SQLite API routines return one of 26 integer +** result codes described at result-codes. However, experience has shown that +** many of these result codes are too course-grained. They do not provide as +** much information about problems as users might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 and later) include +** support for additional result codes that provide more detailed information +** about errors. The extended result codes are enabled (or disabled) for +** each database +** connection using the [sqlite3_extended_result_codes()] API. +** +** Some of the available extended result codes are listed above. +** We expect the number of extended result codes will be expand +** over time. Software that uses extended result codes should expect +** to see new result codes in future releases of SQLite. +** +** The symbolic name for an extended result code always contains a related +** primary result code as a prefix. Primary result codes contain a single +** "_" character. Extended result codes contain two or more "_" characters. +** The numeric value of an extended result code can be converted to its +** corresponding primary result code by masking off the lower 8 bytes. +** +** The SQLITE_OK result code will never be extended. It will always +** be exactly zero. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** Combination of the following bit values are used as the +** third argument to the [sqlite3_open_v2()] interface and +** as fourth argument to the xOpen method of the +** [sqlite3_vfs] object. +** +*/ +#define SQLITE_OPEN_READONLY 0x00000001 +#define SQLITE_OPEN_READWRITE 0x00000002 +#define SQLITE_OPEN_CREATE 0x00000004 +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 +#define SQLITE_OPEN_MAIN_DB 0x00000100 +#define SQLITE_OPEN_TEMP_DB 0x00000200 +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCapabilities method of the [sqlite3_io_methods] +** object returns an integer which is a vector of the following +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 + +/* +** CAPI3REF: File Locking Levels +** +** SQLite uses one of the following integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an [sqlite3_io_methods] +** object it uses a combination of the following integer values as +** the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. The SQLITE_SYNC_NORMAL means +** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means +** to use Mac OS-X style fullsync instead of fsync(). +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the OS +** interface layer. Individual OS interface implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object +** +** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to +** an instance of the this object. This object defines the +** methods used to perform various operations against the open file. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +* The second choice is an +** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to +** indicate that only the data of the file and not its inode needs to be +** synced. +** +** The integer values to xLock() and xUnlock() are one of +**
        +**
      • [SQLITE_LOCK_NONE], +**
      • [SQLITE_LOCK_SHARED], +**
      • [SQLITE_LOCK_RESERVED], +**
      • [SQLITE_LOCK_PENDING], or +**
      • [SQLITE_LOCK_EXCLUSIVE]. +**
      +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method looks +** to see if any database connection, either in this +** process or in some other process, is holding an RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false if not. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument +** is an integer opcode. The third +** argument is a generic pointer which is intended to be a pointer +** to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves opcodes less than 100 for its own use. +** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
        +**
      • [SQLITE_IOCAP_ATOMIC] +**
      • [SQLITE_IOCAP_ATOMIC512] +**
      • [SQLITE_IOCAP_ATOMIC1K] +**
      • [SQLITE_IOCAP_ATOMIC2K] +**
      • [SQLITE_IOCAP_ATOMIC4K] +**
      • [SQLITE_IOCAP_ATOMIC8K] +**
      • [SQLITE_IOCAP_ATOMIC16K] +**
      • [SQLITE_IOCAP_ATOMIC32K] +**
      • [SQLITE_IOCAP_ATOMIC64K] +**
      • [SQLITE_IOCAP_SAFE_APPEND] +**
      • [SQLITE_IOCAP_SEQUENTIAL] +**
      +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()] +** interface. +** +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode cases the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and only needs to be supported when SQLITE_TEST +** is defined. +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 + +/* +** CAPI3REF: Mutex Handle +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: OS Interface Object +** +** An instance of this object defines the interface between the +** SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". +** +** The iVersion field is initially 1 but may be larger for future +** versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered vfs modules are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. +** +** The pNext field is the only fields in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** SQLite will guarantee that the zFilename string passed to +** xOpen() is a full pathname as generated by xFullPathname() and +** that the string will be valid and unchanged until xClose() is +** called. So the [sqlite3_file] can store a pointer to the +** filename if it needs to remember the filename for some reason. +** +** The flags argument to xOpen() is a copy of the flags argument +** to [sqlite3_open_v2()]. If [sqlite3_open()] or [sqlite3_open16()] +** is used, then flags is [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be +** set. +** +** SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
        +**
      • [SQLITE_OPEN_MAIN_DB] +**
      • [SQLITE_OPEN_MAIN_JOURNAL] +**
      • [SQLITE_OPEN_TEMP_DB] +**
      • [SQLITE_OPEN_TEMP_JOURNAL] +**
      • [SQLITE_OPEN_TRANSIENT_DB] +**
      • [SQLITE_OPEN_SUBJOURNAL] +**
      • [SQLITE_OPEN_MASTER_JOURNAL] +**
      +** +** The file I/O implementation can use the object type flags to +** changes the way it deals with files. For example, an application +** that does not care about crash recovery or rollback, might make +** the open of a journal file a no-op. Writes to this journal are +** also a no-op. Any attempt to read the journal return SQLITE_IOERR. +** Or the implementation might recognize the a database file will +** be doing page-aligned sector reads and writes in a random order +** and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen +** method: +** +**
        +**
      • [SQLITE_OPEN_DELETEONCLOSE] +**
      • [SQLITE_OPEN_EXCLUSIVE] +**
      +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. This will always be set for TEMP +** databases and journals and for subjournals. The +** [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened +** for exclusive access. This flag is set for all files except +** for the main database file. +** +** Space to hold the [sqlite3_file] structure passed as the third +** argument to xOpen is allocated by caller (the SQLite core). +** szOsFile bytes are allocated for this object. The xOpen method +** fills in the allocated space. +** +** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existance of a file, +** or [SQLITE_ACCESS_READWRITE] to test to see +** if a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test to see if a file is at least readable. The file can be a +** directory. +** +** SQLite will always allocate at least mxPathname+1 byte for +** the output buffers for xGetTempname and xFullPathname. The exact +** size of the output buffer is also passed as a parameter to both +** methods. If the output buffer is not large enough, SQLITE_CANTOPEN +** should be returned. As this is handled as a fatal error by SQLite, +** vfs implementations should endevour to prevent this by setting +** mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), and xCurrentTime() interfaces +** are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. The +** xSleep() method cause the calling thread to sleep for at +** least the number of microseconds given. The xCurrentTime() +** method returns a Julian Day Number for the current date and +** time. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +struct sqlite3_vfs { + int iVersion; /* Structure version number */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags); + int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + /* New fields may be appended in figure versions. The iVersion + ** value will increment whenever this happens. */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. They determine +** the kind of what kind of permissions the xAccess method is +** looking for. With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks to see if the file exists. With SQLITE_ACCESS_READWRITE, +** the xAccess method checks to see if the file is both readable +** and writable. With SQLITE_ACCESS_READ the xAccess method +** checks to see if the file is readable. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 +#define SQLITE_ACCESS_READ 2 + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** +** This routine enables or disables the +** [SQLITE_IOERR_READ | extended result codes] feature. +** By default, SQLite API routines return one of only 26 integer +** [SQLITE_OK | result codes]. When extended result codes +** are enabled by this routine, the repetoire of result codes can be +** much larger and can (hopefully) provide more detailed information +** about the cause of an error. +** +** The second argument is a boolean value that turns extended result +** codes on and off. Extended result codes are off by default for +** backwards compatibility with older versions of SQLite. +*/ +int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid +** +** Each entry in an SQLite table has a unique 64-bit signed integer key +** called the "rowid". The rowid is always available as an undeclared +** column named ROWID, OID, or _ROWID_. If the table has a column of +** type INTEGER PRIMARY KEY then that column is another an alias for the +** rowid. +** +** This routine returns the rowid of the most recent INSERT into +** the database from the database connection given in the first +** argument. If no inserts have ever occurred on this database +** connection, zero is returned. +** +** If an INSERT occurs within a trigger, then the rowid of the +** inserted row is returned by this routine as long as the trigger +** is running. But once the trigger terminates, the value returned +** by this routine reverts to the last value inserted before the +** trigger fired. +** +** If another thread does a new insert on the same database connection +** while this routine is running and thus changes the last insert rowid, +** then the return value of this routine is undefined. +*/ +sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** +** This function returns the number of database rows that were changed +** (or inserted or deleted) by the most recent SQL statement. Only +** changes that are directly specified by the INSERT, UPDATE, or +** DELETE statement are counted. Auxiliary changes caused by +** triggers are not counted. Use the [sqlite3_total_changes()] function +** to find the total number of changes including changes caused by triggers. +** +** Within the body of a trigger, the sqlite3_changes() interface can be +** called to find the number of +** changes in the most recently completed INSERT, UPDATE, or DELETE +** statement within the body of the trigger. +** +** All changes are counted, even if they were later undone by a +** ROLLBACK or ABORT. Except, changes associated with creating and +** dropping tables are not counted. +** +** If a callback invokes [sqlite3_exec()] or [sqlite3_step()] recursively, +** then the changes in the inner, recursive call are counted together +** with the changes in the outer call. +** +** SQLite implements the command "DELETE FROM table" without a WHERE clause +** by dropping and recreating the table. (This is much faster than going +** through and deleting individual elements from the table.) Because of +** this optimization, the change count for "DELETE FROM table" will be +** zero regardless of the number of elements that were originally in the +** table. To get an accurate count of the number of rows deleted, use +** "DELETE FROM table WHERE 1" instead. +** +** If another thread makes changes on the same database connection +** while this routine is running then the return value of this routine +** is undefined. +*/ +int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +*** +** This function returns the number of database rows that have been +** modified by INSERT, UPDATE or DELETE statements since the database handle +** was opened. This includes UPDATE, INSERT and DELETE statements executed +** as part of trigger programs. All changes are counted as soon as the +** statement that makes them is completed (when the statement handle is +** passed to [sqlite3_reset()] or [sqlite3_finalize()]). +** +** See also the [sqlite3_change()] interface. +** +** SQLite implements the command "DELETE FROM table" without a WHERE clause +** by dropping and recreating the table. (This is much faster than going +** through and deleting individual elements form the table.) Because of +** this optimization, the change count for "DELETE FROM table" will be +** zero regardless of the number of elements that were originally in the +** table. To get an accurate count of the number of rows deleted, use +** "DELETE FROM table WHERE 1" instead. +** +** If another thread makes changes on the same database connection +** while this routine is running then the return value of this routine +** is undefined. +*/ +int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** +** This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a database connection that +** is closed or might close before sqlite3_interrupt() returns. +** +** The SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** If an interrupted operation was an update that is inside an +** explicit transaction, then the entire transaction will be rolled +** back automatically. +*/ +void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete +** +** These functions return true if the given input string comprises +** one or more complete SQL statements. For the sqlite3_complete() call, +** the parameter must be a nul-terminated UTF-8 string. For +** sqlite3_complete16(), a nul-terminated machine byte order UTF-16 string +** is required. +** +** These routines are useful for command-line input to determine if the +** currently entered text forms one or more complete SQL statements or +** if additional input is needed before sending the statements into +** SQLite for parsing. The algorithm is simple. If the +** last token other than spaces and comments is a semicolon, then return +** true. Actually, the algorithm is a little more complicated than that +** in order to deal with triggers, but the basic idea is the same: the +** statement is not complete unless it ends in a semicolon. +*/ +int sqlite3_complete(const char *sql); +int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors +** +** This routine identifies a callback function that might be invoked +** whenever an attempt is made to open a database table +** that another thread or process has locked. +** If the busy callback is NULL, then [SQLITE_BUSY] +** (or sometimes [SQLITE_IOERR_BLOCKED]) +** is returned immediately upon encountering the lock. +** If the busy callback is not NULL, then the +** callback will be invoked with two arguments. The +** first argument to the handler is a copy of the void* pointer which +** is the third argument to this routine. The second argument to +** the handler is the number of times that the busy handler has +** been invoked for this locking event. If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. +** If the callback returns non-zero, then another attempt is made to open the +** database for reading and the cycle repeats. +** +** The presence of a busy handler does not guarantee that +** it will be invoked when there is lock contention. +** If SQLite determines that invoking the busy handler could result in +** a deadlock, it will return [SQLITE_BUSY] instead. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** The default busy callback is NULL. +** +** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] when +** SQLite is in the middle of a large transaction where all the +** changes will not fit into the in-memory cache. SQLite will +** already hold a RESERVED lock on the database file, but it needs +** to promote this lock to EXCLUSIVE so that it can spill cache +** pages into the database file without harm to concurrent +** readers. If it is unable to promote the lock, then the in-memory +** cache will be left in an inconsistent state and so the error +** code is promoted from the relatively benign [SQLITE_BUSY] to +** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion +** forces an automatic rollback of the changes. See the +** +** CorruptionFollowingBusyError wiki page for a discussion of why +** this is important. +** +** Sqlite is re-entrant, so the busy handler may start a new query. +** (It is not clear why anyone would every want to do this, but it +** is allowed, in theory.) But the busy handler may not close the +** database. Closing the database from a busy handler will delete +** data structures out from under the executing query and will +** probably result in a segmentation fault or other runtime error. +** +** There can only be a single busy handler defined for each database +** connection. Setting a new busy handler clears any previous one. +** Note that calling [sqlite3_busy_timeout()] will also set or clear +** the busy handler. +** +** When operating in [sqlite3_enable_shared_cache | shared cache mode], +** only a single busy handler can be defined for each database file. +** So if two database connections share a single cache, then changing +** the busy handler on one connection will also change the busy +** handler in the other connection. The busy handler is invoked +** in the thread that was running when the SQLITE_BUSY was hit. +*/ +int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); + +/* +** CAPI3REF: Set A Busy Timeout +** +** This routine sets a busy handler that sleeps for a while when a +** table is locked. The handler will sleep multiple times until +** at least "ms" milliseconds of sleeping have been done. After +** "ms" milliseconds of sleeping, the handler returns 0 which +** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. +** +** Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** There can only be a single busy handler for a particular database +** connection. If another busy handler was defined +** (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared. +*/ +int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** +** This next routine is a convenience wrapper around [sqlite3_exec()]. +** Instead of invoking a user-supplied callback for each row of the +** result, this routine remembers each row of the result in memory +** obtained from [sqlite3_malloc()], then returns all of the result after the +** query has finished. +** +** As an example, suppose the query result where this table: +** +**
      +**        Name        | Age
      +**        -----------------------
      +**        Alice       | 43
      +**        Bob         | 28
      +**        Cindy       | 21
      +** 
      +** +** If the 3rd argument were &azResult then after the function returns +** azResult will contain the following data: +** +**
      +**        azResult[0] = "Name";
      +**        azResult[1] = "Age";
      +**        azResult[2] = "Alice";
      +**        azResult[3] = "43";
      +**        azResult[4] = "Bob";
      +**        azResult[5] = "28";
      +**        azResult[6] = "Cindy";
      +**        azResult[7] = "21";
      +** 
      +** +** Notice that there is an extra row of data containing the column +** headers. But the *nrow return value is still 3. *ncolumn is +** set to 2. In general, the number of values inserted into azResult +** will be ((*nrow) + 1)*(*ncolumn). +** +** After the calling function has finished using the result, it should +** pass the result data pointer to sqlite3_free_table() in order to +** release the memory that was malloc-ed. Because of the way the +** [sqlite3_malloc()] happens, the calling function must not try to call +** [sqlite3_free()] directly. Only [sqlite3_free_table()] is able to release +** the memory properly and safely. +** +** The return value of this routine is the same as from [sqlite3_exec()]. +*/ +int sqlite3_get_table( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be executed */ + char ***resultp, /* Result written to a char *[] that this points to */ + int *nrow, /* Number of result rows written here */ + int *ncolumn, /* Number of result columns written here */ + char **errmsg /* Error msg written here */ +); +void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are workalikes of the "printf()" family of functions +** from the standard C library. +** +** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. Both routines return a +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** In sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf(). This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer. We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf formatting options apply. In addition, there +** is are "%q", "%Q", and "%z" options. +** +** The %q option works like %s in that it substitutes a null-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %q is designed for use inside a string literal. By doubling each '\'' +** character it escapes that character and allows it to be inserted into +** the string. +** +** For example, so some string variable contains text as follows: +** +**
      +**  char *zText = "It's a happy day!";
      +** 
      +** +** One can use this text in an SQL statement as follows: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
      +**  INSERT INTO table1 VALUES('It''s a happy day!')
      +** 
      +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
      +**  INSERT INTO table1 VALUES('It's a happy day!');
      +** 
      +** +** This second example is an SQL syntax error. As a general rule you +** should always use %q instead of %s when inserting text into a string +** literal. +** +** The %Q option works like %q except it also adds single quotes around +** the outside of the total string. Or if the parameter in the argument +** list is a NULL pointer, %Q substitutes the text "NULL" (without single +** quotes) in place of the %Q option. So, for example, one could say: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** The "%z" formatting option works exactly like "%s" with the +** addition that after the string has been read and copied into +** the result, [sqlite3_free()] is called on the input string. +*/ +char *sqlite3_mprintf(const char*,...); +char *sqlite3_vmprintf(const char*, va_list); +char *sqlite3_snprintf(int,char*,const char*, ...); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. (See the exception below.) +** The default implementation +** of the memory allocation subsystem uses the malloc(), realloc() +** and free() provided by the standard C library. However, if +** SQLite is compiled with the following C preprocessor macro +** +**
      SQLITE_OMIT_MEMORY_ALLOCATION
      +** +** then no implementation is provided for these routines by +** SQLite. The application that links against SQLite is +** expected to provide its own implementation. If the application +** does provide its own implementation for these routines, then +** it must also provide an implementations for +** [sqlite3_memory_alarm()], [sqlite3_memory_used()], and +** [sqlite3_memory_highwater()]. The alternative implementations +** for these last three routines need not actually work, but +** stub functions at least are needed to statisfy the linker. +** SQLite never calls [sqlite3_memory_highwater()] itself, but +** the symbol is included in a table as part of the +** [sqlite3_load_extension()] interface. The +** [sqlite3_memory_alarm()] and [sqlite3_memory_used()] interfaces +** are called by [sqlite3_soft_heap_limit()] and working implementations +** of both routines must be provided if [sqlite3_soft_heap_limit()] +** is to operate correctly. +** +** Exception: The windows OS interface layer calls +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular windows +** installation. Memory allocation errors are detected, but +** they are reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +*/ +void *sqlite3_malloc(int); +void *sqlite3_realloc(void*, int); +void sqlite3_free(void*); + +/* +** CAPI3REF: Memory Allocator Statistics +** +** In addition to the basic three allocation routines +** [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()], +** the memory allocation subsystem included with the SQLite +** sources provides the interfaces shown below. +** +** The first of these two routines returns the amount of memory +** currently outstanding (malloced but not freed). The second +** returns the largest instantaneous amount of outstanding +** memory. The highwater mark is reset if the argument is +** true. +** +** The implementation of these routines in the SQLite core +** is omitted if the application is compiled with the +** SQLITE_OMIT_MEMORY_ALLOCATION macro defined. In that case, +** the application that links SQLite must provide its own +** alternative implementation. See the documentation on +** [sqlite3_malloc()] for additional information. +*/ +sqlite3_int64 sqlite3_memory_used(void); +sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Memory Allocation Alarms +** +** The [sqlite3_memory_alarm] routine is used to register +** a callback on memory allocation events. +** +** This routine registers or clears a callbacks that fires when +** the amount of memory allocated exceeds iThreshold. Only +** a single callback can be registered at a time. Each call +** to [sqlite3_memory_alarm()] overwrites the previous callback. +** The callback is disabled by setting xCallback to a NULL +** pointer. +** +** The parameters to the callback are the pArg value, the +** amount of memory currently in use, and the size of the +** allocation that provoked the callback. The callback will +** presumably invoke [sqlite3_free()] to free up memory space. +** The callback may invoke [sqlite3_malloc()] or [sqlite3_realloc()] +** but if it does, no additional callbacks will be invoked by +** the recursive calls. +** +** The [sqlite3_soft_heap_limit()] interface works by registering +** a memory alarm at the soft heap limit and invoking +** [sqlite3_release_memory()] in the alarm callback. Application +** programs should not attempt to use the [sqlite3_memory_alarm()] +** interface because doing so will interfere with the +** [sqlite3_soft_heap_limit()] module. This interface is exposed +** only so that applications can provide their own +** alternative implementation when the SQLite core is +** compiled with SQLITE_OMIT_MEMORY_ALLOCATION. +*/ +int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used, int N), + void *pArg, + sqlite3_int64 iThreshold +); + + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +*** +** This routine registers a authorizer callback with the SQLite library. +** The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. The authorizer callback should +** return SQLITE_OK to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. +** +** Depending on the action, the [SQLITE_IGNORE] and [SQLITE_DENY] return +** codes might mean something different or they might mean the same +** thing. If the action is, for example, to perform a delete opertion, +** then [SQLITE_IGNORE] and [SQLITE_DENY] both cause the statement compilation +** to fail with an error. But if the action is to read a specific column +** from a specific table, then [SQLITE_DENY] will cause the entire +** statement to fail but [SQLITE_IGNORE] will cause a NULL value to be +** read instead of the actual column value. +** +** The first parameter to the authorizer callback is a copy of +** the third parameter to the sqlite3_set_authorizer() interface. +** The second parameter to the callback is an integer +** [SQLITE_COPY | action code] that specifies the particular action +** to be authorized. The available action codes are +** [SQLITE_COPY | documented separately]. The third through sixth +** parameters to the callback are strings that contain additional +** details about the action to be authorized. +** +** An authorizer is used when preparing SQL statements from an untrusted +** source, to ensure that the SQL statements do not try to access data +** that they are not allowed to see, or that they do not try to +** execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being prepared that disallows everything +** except SELECT statements. +** +** Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call. A NULL authorizer means that no authorization +** callback is invoked. The default authorizer is NULL. +** +** Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()]. +*/ +int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorizer certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization callback +** function will be parameters or NULL depending on which of these +** codes is used as the second parameter. The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable. The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* NULL NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* Function Name NULL */ +#define SQLITE_COPY 0 /* No longer used */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** The callback function registered by sqlite3_trace() is invoked +** at the first [sqlite3_step()] for the evaluation of an SQL statement. +** The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes and includes +** information on how long that statement ran. +** +** The sqlite3_profile() API is currently considered experimental and +** is subject to change. +*/ +void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); +void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: Query Progress Callbacks +** +** This routine configures a callback function - the progress callback - that +** is invoked periodically during long running calls to [sqlite3_exec()], +** [sqlite3_step()] and [sqlite3_get_table()]. An example use for this +** interface is to keep a GUI updated during a large query. +** +** The progress callback is invoked once for every N virtual machine opcodes, +** where N is the second argument to this function. The progress callback +** itself is identified by the third argument to this function. The fourth +** argument to this function is a void pointer passed to the progress callback +** function each time it is invoked. +** +** If a call to [sqlite3_exec()], [sqlite3_step()], or [sqlite3_get_table()] +** results in fewer than N opcodes being executed, then the progress +** callback is never invoked. +** +** Only a single progress callback function may be registered for each +** open database connection. Every call to sqlite3_progress_handler() +** overwrites the results of the previous call. +** To remove the progress callback altogether, pass NULL as the third +** argument to this function. +** +** If the progress callback returns a result other than 0, then the current +** query is immediately terminated and any database changes rolled back. +** The containing [sqlite3_exec()], [sqlite3_step()], or +** [sqlite3_get_table()] call returns SQLITE_INTERRUPT. This feature +** can be used, for example, to implement the "Cancel" button on a +** progress dialog box in a GUI. +*/ +void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** +** Open the sqlite database file "filename". The "filename" is UTF-8 +** encoded for [sqlite3_open()] and [sqlite3_open_v2()] and UTF-16 encoded +** in the native byte order for [sqlite3_open16()]. +** An [sqlite3*] handle is returned in *ppDb, even +** if an error occurs. If the database is opened (or created) successfully, +** then [SQLITE_OK] is returned. Otherwise an error code is returned. The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error. +** +** The default encoding for the database will be UTF-8 if +** [sqlite3_open()] or [sqlite3_open_v2()] is called and +** UTF-16 if [sqlite3_open16()] is used. +** +** Whether or not an error occurs when it is opened, resources associated +** with the [sqlite3*] handle should be released by passing it to +** [sqlite3_close()] when it is no longer required. +** +** The [sqlite3_open_v2()] interface works like [sqlite3_open()] except that +** provides two additional parameters for additional control over the +** new database connection. The flags parameter can be one of: +** +**
        +**
      1. [SQLITE_OPEN_READONLY] +**
      2. [SQLITE_OPEN_READWRITE] +**
      3. [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE] +**
      +** +** The first value opens the database read-only. If the database does +** not previously exist, an error is returned. The second option opens +** the database for reading and writing if possible, or reading only if +** if the file is write protected. In either case the database must already +** exist or an error is returned. The third option opens the database +** for reading and writing and creates it if it does not already exist. +** The third options is behavior that is always used for [sqlite3_open()] +** and [sqlite3_open16()]. +** +** If the filename is ":memory:", then an private +** in-memory database is created for the connection. This in-memory +** database will vanish when the database connection is closed. Future +** version of SQLite might make use of additional special filenames +** that begin with the ":" character. It is recommended that +** when a database filename really does begin with +** ":" that you prefix the filename with a pathname like "./" to +** avoid ambiguity. +** +** If the filename is an empty string, then a private temporary +** on-disk database will be created. This private database will be +** automatically deleted as soon as the database connection is closed. +** +** The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system +** interface that the new database connection should use. If the +** fourth parameter is a NULL pointer then the default [sqlite3_vfs] +** object is used. +** +** Note to windows users: The encoding used for the filename argument +** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** [sqlite3_open()] or [sqlite3_open_v2()]. +*/ +int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Error Codes And Messages +** +** The sqlite3_errcode() interface returns the numeric +** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code] +** for the most recent failed sqlite3_* API call associated +** with [sqlite3] handle 'db'. If a prior API call failed but the +** most recent API call succeeded, the return value from sqlite3_errcode() +** is undefined. +** +** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF8 or UTF16 respectively. +** Memory to hold the error message string is managed internally. The +** string may be overwritten or deallocated by subsequent calls to SQLite +** interface functions. +** +** Calls to many sqlite3_* functions set the error code and string returned +** by [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] +** (overwriting the previous values). Note that calls to [sqlite3_errcode()], +** [sqlite3_errmsg()], and [sqlite3_errmsg16()] themselves do not affect the +** results of future invocations. Calls to API routines that do not return +** an error code (example: [sqlite3_data_count()]) do not +** change the error code returned by this routine. Interfaces that are +** not associated with a specific database connection (examples: +** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] do not change +** the return code. +** +** Assuming no other intervening sqlite3_* API calls are made, the error +** code returned by this function is associated with the same error as +** the strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]. +*/ +int sqlite3_errcode(sqlite3 *db); +const char *sqlite3_errmsg(sqlite3*); +const void *sqlite3_errmsg16(sqlite3*); + +/* +** CAPI3REF: SQL Statement Object +** +** Instance of this object represent single SQL statements. This +** is variously known as a "prepared statement" or a +** "compiled SQL statement" or simply as a "statement". +** +** The life of a statement object goes something like this: +** +**
        +**
      1. Create the object using [sqlite3_prepare_v2()] or a related +** function. +**
      2. Bind values to host parameters using +** [sqlite3_bind_blob | sqlite3_bind_* interfaces]. +**
      3. Run the SQL by calling [sqlite3_step()] one or more times. +**
      4. Reset the statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
      5. Destroy the object using [sqlite3_finalize()]. +**
      +** +** Refer to documentation on individual methods above for additional +** information. +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Compiling An SQL Statement +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** The first argument "db" is an [sqlite3 | SQLite database handle] +** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()] +** or [sqlite3_open16()]. +** The second argument "zSql" is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. +** +** If the nByte argument is less +** than zero, then zSql is read up to the first zero terminator. If +** nByte is non-negative, then it is the maximum number of +** bytes read from zSql. When nByte is non-negative, the +** zSql string ends at either the first '\000' character or +** until the nByte-th byte, whichever comes first. +** +** *pzTail is made to point to the first byte past the end of the first +** SQL statement in zSql. This routine only compiles the first statement +** in zSql, so *pzTail is left pointing to what remains uncompiled. +** +** *ppStmt is left pointing to a compiled +** [sqlite3_stmt | SQL statement structure] that can be +** executed using [sqlite3_step()]. Or if there is an error, *ppStmt may be +** set to NULL. If the input text contained no SQL (if the input is and +** empty string or a comment) then *ppStmt is set to NULL. The calling +** procedure is responsible for deleting the compiled SQL statement +** using [sqlite3_finalize()] after it has finished with it. +** +** On success, [SQLITE_OK] is returned. Otherwise an +** [SQLITE_ERROR | error code] is returned. +** +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are +** recommended for all new programs. The two older interfaces are retained +** for backwards compatibility, but their use is discouraged. +** In the "v2" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave a differently in two ways: +** +**
        +**
      1. +** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. If the schema has changed in a way +** that makes the statement no longer valid, [sqlite3_step()] will still +** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is +** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the +** error go away. Note: use [sqlite3_errmsg()] to find the text of the parsing +** error that results in an [SQLITE_SCHEMA] return. +**
      2. +** +**
      3. +** When an error occurs, +** [sqlite3_step()] will return one of the detailed +** [SQLITE_ERROR | result codes] or +** [SQLITE_IOERR_READ | extended result codes] such as directly. +** The legacy behavior was that [sqlite3_step()] would only return a generic +** [SQLITE_ERROR] result code and you would have to make a second call to +** [sqlite3_reset()] in order to find the underlying cause of the problem. +** With the "v2" prepare interfaces, the underlying reason for the error is +** returned immediately. +**
      4. +**
      +*/ +int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Dynamically Typed Value Object +** +** SQLite uses dynamic typing for the values it stores. Values can +** be integers, floating point values, strings, BLOBs, or NULL. When +** passing around values internally, each value is represented as +** an instance of the sqlite3_value object. +*/ +typedef struct Mem sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. A pointer to such an object is the +** first parameter to user-defined SQL functions. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** +** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, +** one or more literals can be replace by a parameter in one of these +** forms: +** +**
        +**
      • ? +**
      • ?NNN +**
      • :AAA +**
      • @AAA +**
      • $VVV +**
      +** +** In the parameter forms shown above NNN is an integer literal, +** AAA is an alphanumeric identifier and VVV is a variable name according +** to the syntax rules of the TCL programming language. +** The values of these parameters (also called "host parameter names") +** can be set using the sqlite3_bind_*() routines defined here. +** +** The first argument to the sqlite3_bind_*() routines always is a pointer +** to the [sqlite3_stmt] object returned from [sqlite3_prepare_v2()] or +** its variants. The second +** argument is the index of the parameter to be set. The first parameter has +** an index of 1. When the same named parameter is used more than once, second +** and subsequent +** occurrences have the same index as the first occurrence. The index for +** named parameters can be looked up using the +** [sqlite3_bind_parameter_name()] API if desired. The index for "?NNN" +** parametes is the value of NNN. +** The NNN value must be between 1 and the compile-time +** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999). +** See limits.html for additional information. +** +** The third argument is the value to bind to the parameter. +** +** In those +** routines that have a fourth argument, its value is the number of bytes +** in the parameter. To be clear: the value is the number of bytes in the +** string, not the number of characters. The number +** of bytes does not include the zero-terminator at the end of strings. +** If the fourth parameter is negative, the length of the string is +** number of bytes up to the first zero terminator. +** +** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or +** text after SQLite has finished with it. If the fifth argument is the +** special value [SQLITE_STATIC], then the library assumes that the information +** is in static, unmanaged space and does not need to be freed. If the +** fifth argument has the value [SQLITE_TRANSIENT], then SQLite makes its +** own private copy of the data immediately, before the sqlite3_bind_*() +** routine returns. +** +** The sqlite3_bind_zeroblob() routine binds a BLOB of length n that +** is filled with zeros. A zeroblob uses a fixed amount of memory +** (just an integer to hold it size) while it is being processed. +** Zeroblobs are intended to serve as place-holders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | increment BLOB I/O] routines. A negative +** value for the zeroblob results in a zero-length BLOB. +** +** The sqlite3_bind_*() routines must be called after +** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and +** before [sqlite3_step()]. +** Bindings are not cleared by the [sqlite3_reset()] routine. +** Unbound parameters are interpreted as NULL. +** +** These routines return [SQLITE_OK] on success or an error code if +** anything goes wrong. [SQLITE_RANGE] is returned if the parameter +** index is out of range. [SQLITE_NOMEM] is returned if malloc fails. +** [SQLITE_MISUSE] is returned if these routines are called on a virtual +** machine that is the wrong state or which has already been finalized. +*/ +int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +int sqlite3_bind_double(sqlite3_stmt*, int, double); +int sqlite3_bind_int(sqlite3_stmt*, int, int); +int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +int sqlite3_bind_null(sqlite3_stmt*, int); +int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); +int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); + +/* +** CAPI3REF: Number Of Host Parameters +** +** Return the largest host parameter index in the precompiled statement given +** as the argument. When the host parameters are of the forms like ":AAA" +** or "?", then they are assigned sequential increasing numbers beginning +** with one, so the value returned is the number of parameters. However +** if the same host parameter name is used multiple times, each occurrance +** is given the same number, so the value returned in that case is the number +** of unique host parameter names. If host parameters of the form "?NNN" +** are used (where NNN is an integer) then there might be gaps in the +** numbering and the value returned by this interface is the index of the +** host parameter with the largest index value. +** +** The prepared statement must not be [sqlite3_finalize | finalized] +** prior to this routine returnning. Otherwise the results are undefined +** and probably undesirable. +*/ +int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** +** This routine returns a pointer to the name of the n-th parameter in a +** [sqlite3_stmt | prepared statement]. +** Host parameters of the form ":AAA" or "@AAA" or "$VVV" have a name +** which is the string ":AAA" or "@AAA" or "$VVV". +** In other words, the initial ":" or "$" or "@" +** is included as part of the name. +** Parameters of the form "?" or "?NNN" have no name. +** +** The first bound parameter has an index of 1, not 0. +** +** If the value n is out of range or if the n-th parameter is nameless, +** then NULL is returned. The returned string is always in the +** UTF-8 encoding even if the named parameter was originally specified +** as UTF-16 in [sqlite3_prepare16()] or [sqlite3_prepare16_v2()]. +*/ +const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** +** This routine returns the index of a host parameter with the given name. +** The name must match exactly. If no parameter with the given name is +** found, return 0. Parameter names must be UTF8. +*/ +int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** +** Contrary to the intuition of many, [sqlite3_reset()] does not +** reset the [sqlite3_bind_blob | bindings] on a +** [sqlite3_stmt | prepared statement]. Use this routine to +** reset all host parameters to NULL. +*/ +int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** +** Return the number of columns in the result set returned by the +** [sqlite3_stmt | compiled SQL statement]. This routine returns 0 +** if pStmt is an SQL statement that does not return data (for +** example an UPDATE). +*/ +int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** +** These routines return the name assigned to a particular column +** in the result set of a SELECT statement. The sqlite3_column_name() +** interface returns a pointer to a UTF8 string and sqlite3_column_name16() +** returns a pointer to a UTF16 string. The first parameter is the +** [sqlite3_stmt | prepared statement] that implements the SELECT statement. +** The second parameter is the column number. The left-most column is +** number 0. +** +** The returned string pointer is valid until either the +** [sqlite3_stmt | prepared statement] is destroyed by [sqlite3_finalize()] +** or until the next call sqlite3_column_name() or sqlite3_column_name16() +** on the same column. +** +** If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +*/ +const char *sqlite3_column_name(sqlite3_stmt*, int N); +const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result +** +** These routines provide a means to determine what column of what +** table in which database a result of a SELECT statement comes from. +** The name of the database or table or column can be returned as +** either a UTF8 or UTF16 string. The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** The returned string is valid until +** the [sqlite3_stmt | prepared statement] is destroyed using +** [sqlite3_finalize()] or until the same information is requested +** again in a different encoding. +** +** The names returned are the original un-aliased names of the +** database, table, and column. +** +** The first argument to the following calls is a +** [sqlite3_stmt | compiled SQL statement]. +** These functions return information about the Nth column returned by +** the statement, where N is the second function argument. +** +** If the Nth column returned by the statement is an expression +** or subquery and is not a column value, then all of these functions +** return NULL. Otherwise, they return the +** name of the attached database, table and column that query result +** column was extracted from. +** +** As with all other SQLite APIs, those postfixed with "16" return UTF-16 +** encoded strings, the other functions return UTF-8. +** +** These APIs are only available if the library was compiled with the +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. +** +** If two or more threads call one or more of these routines against the same +** prepared statement and column at the same time then the results are +** undefined. +*/ +const char *sqlite3_column_database_name(sqlite3_stmt*,int); +const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +const char *sqlite3_column_table_name(sqlite3_stmt*,int); +const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result +** +** The first parameter is a [sqlite3_stmt | compiled SQL statement]. +** If this statement is a SELECT statement and the Nth column of the +** returned result set of that SELECT is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned. If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** The returned string is always UTF-8 encoded. For example, in +** the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** And the following statement compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** Then this routine would return the string "VARIANT" for the second +** result column (i==1), and a NULL pointer for the first result column +** (i==0). +** +** SQLite uses dynamic run-time typing. So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +const char *sqlite3_column_decltype(sqlite3_stmt *, int i); +const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement +** +** After an [sqlite3_stmt | SQL statement] has been prepared with a call +** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of +** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], +** then this function must be called one or more times to evaluate the +** statement. +** +** The details of the behavior of this sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "v2" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** In the lagacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** With the "v2" interface, any of the other [SQLITE_OK | result code] +** or [SQLITE_IOERR_READ | extended result code] might be returned as +** well. +** +** [SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. If the statement is a COMMIT +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a COMMIT and occurs within a +** explicit transaction then you should rollback the transaction before +** continuing. +** +** [SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** If the SQL statement being executed returns any data, then +** [SQLITE_ROW] is returned each time a new row of data is ready +** for processing by the caller. The values may be accessed using +** the [sqlite3_column_int | column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** [SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** With the legacy interface, a more specific error code (example: +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [sqlite3_stmt | prepared statement]. In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [sqlite3_stmt | prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** Goofy Interface Alert: +** In the legacy interface, +** the sqlite3_step() API always returns a generic error code, +** [SQLITE_ERROR], following any error other than [SQLITE_BUSY] +** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or +** [sqlite3_finalize()] in order to find one of the specific +** [SQLITE_ERROR | result codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the +** more specific [SQLITE_ERROR | result codes] are returned directly +** by sqlite3_step(). The use of the "v2" interface is recommended. +*/ +int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: +** +** Return the number of values in the current row of the result set. +** +** After a call to [sqlite3_step()] that returns [SQLITE_ROW], this routine +** will return the same value as the [sqlite3_column_count()] function. +** After [sqlite3_step()] has returned an [SQLITE_DONE], [SQLITE_BUSY], or +** a [SQLITE_ERROR | error code], or before [sqlite3_step()] has been +** called on the [sqlite3_stmt | prepared statement] for the first time, +** this routine returns zero. +*/ +int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** +** Every value in SQLite has one of five fundamental datatypes: +** +**
        +**
      • 64-bit signed integer +**
      • 64-bit IEEE floating point number +**
      • string +**
      • BLOB +**
      • NULL +**
      +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Results Values From A Query +** +** These routines return information about +** a single column of the current result row of a query. In every +** case the first argument is a pointer to the +** [sqlite3_stmt | SQL statement] that is being +** evaluated (the [sqlite3_stmt*] that was returned from +** [sqlite3_prepare_v2()] or one of its variants) and +** the second argument is the index of the column for which information +** should be returned. The left-most column of the result set +** has an index of 0. +** +** If the SQL statement is not currently point to a valid row, or if the +** the column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The sqlite3_column_type() routine returns +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value +** returned by sqlite3_column_type() is only meaningful if no type +** conversions have occurred as described below. After a type conversion, +** the value returned by sqlite3_column_type() is undefined. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** The value returned does not include the zero terminator at the end +** of the string. For clarity: the value returned is the number of +** bytes in the string, not the number of characters. +** +** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even zero-length strings, are always zero terminated. The return +** value from sqlite3_column_blob() for a zero-length blob is an arbitrary +** pointer, possibly even a NULL pointer. +** +** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() +** but leaves the result in UTF-16 instead of UTF-8. +** The zero terminator is not included in this count. +** +** These routines attempt to convert the value where appropriate. For +** example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to do the conversion +** automatically. The following table details the conversions that +** are applied: +** +**
      +**
      +**
      Internal
      Type
      Requested
      Type
      Conversion +** +**
      NULL INTEGER Result is 0 +**
      NULL FLOAT Result is 0.0 +**
      NULL TEXT Result is NULL pointer +**
      NULL BLOB Result is NULL pointer +**
      INTEGER FLOAT Convert from integer to float +**
      INTEGER TEXT ASCII rendering of the integer +**
      INTEGER BLOB Same as for INTEGER->TEXT +**
      FLOAT INTEGER Convert from float to integer +**
      FLOAT TEXT ASCII rendering of the float +**
      FLOAT BLOB Same as FLOAT->TEXT +**
      TEXT INTEGER Use atoi() +**
      TEXT FLOAT Use atof() +**
      TEXT BLOB No change +**
      BLOB INTEGER Convert to TEXT then use atoi() +**
      BLOB FLOAT Convert to TEXT then use atof() +**
      BLOB TEXT Add a zero terminator if needed +**
      +** +** +** The table above makes reference to standard C library functions atoi() +** and atof(). SQLite does not really use these functions. It has its +** on equavalent internal routines. The atoi() and atof() names are +** used in the table for brevity and because they are familiar to most +** C programmers. +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
        +**
      • The initial content is a BLOB and sqlite3_column_text() +** or sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.

      • +** +**
      • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.

      • +** +**
      • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.

      • +**
      +** +** Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer points to will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometime it is +** not possible and in those cases prior pointers are invalidated. +** +** The safest and easiest to remember policy is to invoke these routines +** in one of the following ways: +** +**
        +**
      • sqlite3_column_text() followed by sqlite3_column_bytes()
      • +**
      • sqlite3_column_blob() followed by sqlite3_column_bytes()
      • +**
      • sqlite3_column_text16() followed by sqlite3_column_bytes16()
      • +**
      +** +** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(), +** or sqlite3_column_text16() first to force the result into the desired +** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to +** find the size of the result. Do not mix call to sqlite3_column_text() or +** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not +** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes(). +** +** The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. The memory space used to hold strings +** and blobs is freed automatically. Do not pass the pointers returned +** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** If a memory allocation error occurs during the evaluation of any +** of these routines, a default value is returned. The default value +** is either the integer 0, the floating point number 0.0, or a NULL +** pointer. Subsequent calls to [sqlite3_errcode()] will return +** [SQLITE_NOMEM]. +*/ +const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +double sqlite3_column_double(sqlite3_stmt*, int iCol); +int sqlite3_column_int(sqlite3_stmt*, int iCol); +sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +int sqlite3_column_type(sqlite3_stmt*, int iCol); +sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** +** The sqlite3_finalize() function is called to delete a +** [sqlite3_stmt | compiled SQL statement]. If the statement was +** executed successfully, or not executed at all, then SQLITE_OK is returned. +** If execution of the statement failed then an +** [SQLITE_ERROR | error code] or [SQLITE_IOERR_READ | extended error code] +** is returned. +** +** This routine can be called at any point during the execution of the +** [sqlite3_stmt | virtual machine]. If the virtual machine has not +** completed execution when this routine is called, that is like +** encountering an error or an interrupt. (See [sqlite3_interrupt()].) +** Incomplete updates may be rolled back and transactions cancelled, +** depending on the circumstances, and the +** [SQLITE_ERROR | result code] returned will be [SQLITE_ABORT]. +*/ +int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** +** The sqlite3_reset() function is called to reset a +** [sqlite3_stmt | compiled SQL statement] object. +** back to it's initial state, ready to be re-executed. +** Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +*/ +int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions +** +** The following two functions are used to add SQL functions or aggregates +** or to redefine the behavior of existing SQL functions or aggregates. The +** difference only between the two is that the second parameter, the +** name of the (scalar) function or aggregate, is encoded in UTF-8 for +** sqlite3_create_function() and UTF-16 for sqlite3_create_function16(). +** +** The first argument is the [sqlite3 | database handle] that holds the +** SQL function or aggregate is to be added or redefined. If a single +** program uses more than one database handle internally, then SQL +** functions or aggregates must be added individually to each database +** handle with which they will be used. +** +** The second parameter is the name of the SQL function to be created +** or redefined. +** The length of the name is limited to 255 bytes, exclusive of the +** zero-terminator. Note that the name length limit is in bytes, not +** characters. Any attempt to create a function with a longer name +** will result in an SQLITE_ERROR error. +** +** The third parameter is the number of arguments that the SQL function or +** aggregate takes. If this parameter is negative, then the SQL function or +** aggregate may take any number of arguments. +** +** The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. Any SQL function implementation should be able to work +** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be +** more efficient with one encoding than another. It is allowed to +** invoke sqlite3_create_function() or sqlite3_create_function16() multiple +** times with the same function but with different values of eTextRep. +** When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** If there is only a single implementation which does not care what +** text encoding is used, then the fourth argument should be +** [SQLITE_ANY]. +** +** The fifth parameter is an arbitrary pointer. The implementation +** of the function can gain access to this pointer using +** [sqlite3_user_data()]. +** +** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL +** function or aggregate. A scalar SQL function requires an implementation of +** the xFunc callback only, NULL pointers should be passed as the xStep +** and xFinal parameters. An aggregate SQL function requires an implementation +** of xStep and xFinal and NULL should be passed for xFunc. To delete an +** existing SQL function or aggregate, pass NULL for all three function +** callback. +** +** It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing perferred text encodings. SQLite will use +** the implementation most closely matches the way in which the +** SQL function is used. +*/ +int sqlite3_create_function( + sqlite3 *, + const char *zFunctionName, + int nArg, + int eTextRep, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +int sqlite3_create_function16( + sqlite3*, + const void *zFunctionName, + int nArg, + int eTextRep, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 +#define SQLITE_UTF16LE 2 +#define SQLITE_UTF16BE 3 +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* sqlite3_create_function only */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Obsolete Functions +** +** These functions are all now obsolete. In order to maintain +** backwards compatibility with older code, we continue to support +** these functions. However, new development projects should avoid +** the use of these functions. To help encourage people to avoid +** using these functions, we are not going to tell you want they do. +*/ +int sqlite3_aggregate_count(sqlite3_context*); +int sqlite3_expired(sqlite3_stmt*); +int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +int sqlite3_global_recover(void); +void sqlite3_thread_cleanup(void); + +/* +** CAPI3REF: Obtaining SQL Function Parameter Values +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 4th parameter to these callbacks is an array of pointers to +** [sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work just like the corresponding +** [sqlite3_column_blob | sqlite3_column_* routines] except that +** these routines take a single [sqlite3_value*] pointer instead +** of an [sqlite3_stmt*] pointer and an integer column number. +** +** The sqlite3_value_text16() interface extracts a UTF16 string +** in the native byte-order of the host machine. The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF16 strings as big-endian and little-endian respectively. +** +** The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in order +** words if the value is original a string that looks like a number) +** then it is done. Otherwise no conversion occurs. The +** [SQLITE_INTEGER | datatype] after conversion is returned. +** +** Please pay particular attention to the fact that the pointer that +** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the sqlite3_value* parameters. +** Or, if the sqlite3_value* argument comes from the [sqlite3_column_value()] +** interface, then these routines should be called from the same thread +** that ran [sqlite3_column_value()]. +*/ +const void *sqlite3_value_blob(sqlite3_value*); +int sqlite3_value_bytes(sqlite3_value*); +int sqlite3_value_bytes16(sqlite3_value*); +double sqlite3_value_double(sqlite3_value*); +int sqlite3_value_int(sqlite3_value*); +sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +const unsigned char *sqlite3_value_text(sqlite3_value*); +const void *sqlite3_value_text16(sqlite3_value*); +const void *sqlite3_value_text16le(sqlite3_value*); +const void *sqlite3_value_text16be(sqlite3_value*); +int sqlite3_value_type(sqlite3_value*); +int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** +** The implementation of aggregate SQL functions use this routine to allocate +** a structure for storing their state. The first time this routine +** is called for a particular aggregate, a new structure of size nBytes +** is allocated, zeroed, and returned. On subsequent calls (for the +** same aggregate instance) the same buffer is returned. The implementation +** of the aggregate can use the returned buffer to accumulate data. +** +** The buffer allocated is freed automatically by SQLite whan the aggregate +** query concludes. +** +** The first parameter should be a copy of the +** [sqlite3_context | SQL function context] that is the first +** parameter to the callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** +** The pUserData parameter to the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines +** used to register user functions is available to +** the implementation of the function using this call. +** +** This routine must be called from the same thread in which +** the SQL function is running. +*/ +void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** +** The following two functions may be used by scalar SQL functions to +** associate meta-data with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated meta-data may be preserved. This may +** be used, for example, to add a regular-expression matching scalar +** function. The compiled version of the regular expression is stored as +** meta-data associated with the SQL value passed as the regular expression +** pattern. The compiled regular expression can be reused on multiple +** invocations of the same function so that the original pattern string +** does not need to be recompiled on each invocation. +** +** The sqlite3_get_auxdata() interface returns a pointer to the meta-data +** associated with the Nth argument value to the current SQL function +** call, where N is the second parameter. If no meta-data has been set for +** that value, then a NULL pointer is returned. +** +** The sqlite3_set_auxdata() is used to associate meta-data with an SQL +** function argument. The third parameter is a pointer to the meta-data +** to be associated with the Nth user function argument value. The fourth +** parameter specifies a destructor that will be called on the meta- +** data pointer to release it when it is no longer required. If the +** destructor is NULL, it is not invoked. +** +** In practice, meta-data is preserved between function calls for +** expressions that are constant at compile time. This includes literal +** values and SQL variables. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +void *sqlite3_get_auxdata(sqlite3_context*, int); +void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior +** +** These are special value for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. See ticket #2191. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the +** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used +** to bind values to host parameters in prepared statements. +** Refer to the +** [sqlite3_bind_blob | sqlite3_bind_* documentation] for +** additional information. +** +** The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. The +** parameter to sqlite3_result_error() or sqlite3_result_error16() +** is the text of an error message. +** +** The sqlite3_result_toobig() cause the function implementation +** to throw and error indicating that a string or BLOB is to long +** to represent. +** +** These routines must be called from within the same thread as +** the SQL function associated with the [sqlite3_context] pointer. +*/ +void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +void sqlite3_result_double(sqlite3_context*, double); +void sqlite3_result_error(sqlite3_context*, const char*, int); +void sqlite3_result_error16(sqlite3_context*, const void*, int); +void sqlite3_result_error_toobig(sqlite3_context*); +void sqlite3_result_error_nomem(sqlite3_context*); +void sqlite3_result_int(sqlite3_context*, int); +void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +void sqlite3_result_null(sqlite3_context*); +void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +void sqlite3_result_zeroblob(sqlite3_context*, int n); + +/* +** CAPI3REF: Define New Collating Sequences +** +** These functions are used to add new collation sequences to the +** [sqlite3*] handle specified as the first argument. +** +** The name of the new collation sequence is specified as a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string for sqlite3_create_collation16(). In all cases +** the name is passed as the second function argument. +** +** The third argument must be one of the constants [SQLITE_UTF8], +** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied +** routine expects to be passed pointers to strings encoded using UTF-8, +** UTF-16 little-endian or UTF-16 big-endian respectively. +** +** A pointer to the user supplied routine must be passed as the fifth +** argument. If it is NULL, this is the same as deleting the collation +** sequence (so that SQLite cannot call it anymore). Each time the user +** supplied function is invoked, it is passed a copy of the void* passed as +** the fourth argument to sqlite3_create_collation() or +** sqlite3_create_collation16() as its first parameter. +** +** The remaining arguments to the user-supplied routine are two strings, +** each represented by a [length, data] pair and encoded in the encoding +** that was passed as the third argument when the collation sequence was +** registered. The user routine should return negative, zero or positive if +** the first string is less than, equal to, or greater than the second +** string. i.e. (STRING1 - STRING2). +** +** The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** excapt that it takes an extra argument which is a destructor for +** the collation. The destructor is called when the collation is +** destroyed and is passed a copy of the fourth parameter void* pointer +** of the sqlite3_create_collation_v2(). Collations are destroyed when +** they are overridden by later calls to the collation creation functions +** or when the [sqlite3*] database handle is closed using [sqlite3_close()]. +** +** The sqlite3_create_collation_v2() interface is experimental and +** subject to change in future releases. The other collation creation +** functions are stable. +*/ +int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); +int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +int sqlite3_create_collation16( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** +** To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** database handle to be called whenever an undefined collation sequence is +** required. +** +** If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. If sqlite3_collation_needed16() is used, the names +** are passed as UTF-16 in machine native byte order. A call to either +** function replaces any existing callback. +** +** When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** handle. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], or +** [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence. +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** This function causes the current thread to suspend execution +** a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. +*/ +int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** If this global variable is made to point to a string which is +** the name of a folder (a.ka. directory), then all temporary files +** created by SQLite will be placed in that directory. If this variable +** is NULL pointer, then SQLite does a search for an appropriate temporary +** file directory. +** +** It is not safe to modify this variable once a database connection +** has been opened. It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been call and remain unchanged thereafter. +*/ +SQLITE_EXTERN char *sqlite3_temp_directory; + +/* +** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode +** +** Test to see whether or not the database connection is in autocommit +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on +** by default. Autocommit is disabled by a BEGIN statement and reenabled +** by the next COMMIT or ROLLBACK. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out if SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Associated With A Prepared Statement +** +** Return the [sqlite3*] database handle to which a +** [sqlite3_stmt | prepared statement] belongs. +** This is the same database handle that was +** the first argument to the [sqlite3_prepare_v2()] or its variants +** that was used to create the statement in the first place. +*/ +sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** +** These routines +** register callback functions to be invoked whenever a transaction +** is committed or rolled back. The pArg argument is passed through +** to the callback. If the callback on a commit hook function +** returns non-zero, then the commit is converted into a rollback. +** +** If another function was previously registered, its pArg value is returned. +** Otherwise NULL is returned. +** +** Registering a NULL function disables the callback. +** +** For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. The +** callback is not invoked if a transaction is automatically rolled +** back because the database connection is closed. +** +** These are experimental interfaces and are subject to change. +*/ +void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks +** +** Register a callback function with the database connection identified by the +** first argument to be invoked whenever a row is updated, inserted or deleted. +** Any callback set by a previous call to this function for the same +** database connection is overridden. +** +** The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted. The first argument to the callback is +** a copy of the third argument to sqlite3_update_hook(). The second callback +** argument is one of SQLITE_INSERT, SQLITE_DELETE or SQLITE_UPDATE, depending +** on the operation that caused the callback to be invoked. The third and +** fourth arguments to the callback contain pointers to the database and +** table name containing the affected row. The final callback parameter is +** the rowid of the row. In the case of an update, this is the rowid after +** the update takes place. +** +** The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence). +** +** If another function was previously registered, its pArg value is returned. +** Otherwise NULL is returned. +*/ +void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache +** +** This routine enables or disables the sharing of the database cache +** and schema data structures between connections to the same database. +** Sharing is enabled if the argument is true and disabled if the argument +** is false. +** +** Beginning in SQLite version 3.5.0, cache sharing is enabled and disabled +** for an entire process. In prior versions of SQLite, sharing was +** enabled or disabled for each thread separately. +** +** The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue use the sharing mode that was +** in effect at the time they were opened. +** +** Virtual tables cannot be used with a shared cache. When shared +** cache is enabled, the [sqlite3_create_module()] API used to register +** virtual tables will always return an error. +** +** This routine returns [SQLITE_OK] if shared cache was +** enabled or disabled successfully. An [SQLITE_ERROR | error code] +** is returned otherwise. +** +** Shared cache is disabled by default. But this might change in +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +*/ +int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** Attempt to free N bytes of heap memory by deallocating non-essential +** memory allocations held by the database library (example: memory +** used to cache database pages to improve performance). +*/ +int sqlite3_release_memory(int); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** Place a "soft" limit on the amount of heap memory that may be allocated +** by SQLite. If an internal allocation is requested +** that would exceed the specified limit, [sqlite3_release_memory()] is +** invoked one or more times to free up some space before the allocation +** is made. +** +** The limit is called "soft", because if [sqlite3_release_memory()] cannot +** free sufficient memory to prevent the limit from being exceeded, +** the memory is allocated anyway and the current operation proceeds. +** +** A negative or zero value for N means that there is no soft heap limit and +** [sqlite3_release_memory()] will only be called when memory is exhausted. +** The default value for the soft heap limit is zero. +** +** SQLite makes a best effort to honor the soft heap limit. But if it +** is unable to reduce memory usage below the soft limit, execution will +** continue without error or notification. This is why the limit is +** called a "soft" limit. It is advisory only. +** +** The soft heap limit is implemented using the [sqlite3_memory_alarm()] +** interface. Only a single memory alarm is available in the default +** implementation. This means that if the application also uses the +** memory alarm interface it will interfere with the operation of the +** soft heap limit and undefined behavior will result. +** +** Prior to SQLite version 3.5.0, this routine only constrained the memory +** allocated by a single thread - the same thread in which this routine +** runs. Beginning with SQLite version 3.5.0, the soft heap limit is +** applied to all threads. The value specified for the soft heap limit +** is an upper bound on the total memory allocation for all threads. In +** version 3.5.0 there is no mechanism for limiting the heap usage for +** individual threads. +*/ +void sqlite3_soft_heap_limit(int); + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** +** This routine +** returns meta-data about a specific column of a specific database +** table accessible using the connection handle passed as the first function +** argument. +** +** The column is identified by the second, third and fourth parameters to +** this function. The second parameter is either the name of the database +** (i.e. "main", "temp" or an attached database) containing the specified +** table or NULL. If it is NULL, then all attached databases are searched +** for the table using the same algorithm as the database engine uses to +** resolve unqualified table references. +** +** The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. Neither of these parameters +** may be NULL. +** +** Meta information is returned by writing to the memory locations passed as +** the 5th and subsequent parameters to this function. Any of these +** arguments may be NULL, in which case the corresponding element of meta +** information is ommitted. +** +**
      +** Parameter     Output Type      Description
      +** -----------------------------------
      +**
      +**   5th         const char*      Data type
      +**   6th         const char*      Name of the default collation sequence 
      +**   7th         int              True if the column has a NOT NULL constraint
      +**   8th         int              True if the column is part of the PRIMARY KEY
      +**   9th         int              True if the column is AUTOINCREMENT
      +** 
      +** +** +** The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid only until the next +** call to any sqlite API function. +** +** If the specified table is actually a view, then an error is returned. +** +** If the specified column is "rowid", "oid" or "_rowid_" and an +** INTEGER PRIMARY KEY column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. If there is no +** explicitly declared IPK column, then the output parameters are set as +** follows: +** +**
      +**     data type: "INTEGER"
      +**     collation sequence: "BINARY"
      +**     not null: 0
      +**     primary key: 1
      +**     auto increment: 0
      +** 
      +** +** This function may load one or more schemas from database files. If an +** error occurs during this process, or if the requested table or column +** cannot be found, an SQLITE error code is returned and an error message +** left in the database handle (to be retrieved using sqlite3_errmsg()). +** +** This API is only available if the library was compiled with the +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. +*/ +int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** +** Attempt to load an SQLite extension library contained in the file +** zFile. The entry point is zProc. zProc may be 0 in which case the +** name of the entry point defaults to "sqlite3_extension_init". +** +** Return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** error message text. The calling function should free this memory +** by calling [sqlite3_free()]. +** +** Extension loading must be enabled using [sqlite3_enable_load_extension()] +** prior to calling this API or an error will be returned. +*/ +int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** +** So as not to open security holes in older applications that are +** unprepared to deal with extension loading, and as a means of disabling +** extension loading while evaluating user-entered SQL, the following +** API is provided to turn the [sqlite3_load_extension()] mechanism on and +** off. It is off by default. See ticket #1863. +** +** Call this routine with onoff==1 to turn extension loading on +** and call it with onoff==0 to turn it back off again. +*/ +int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Make Arrangements To Automatically Load An Extension +** +** Register an extension entry point that is automatically invoked +** whenever a new database connection is opened using +** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. +** +** This API can be invoked at program startup in order to register +** one or more statically linked extensions that will be available +** to all new database connections. +** +** Duplicate extensions are detected so calling this routine multiple +** times with the same extension is harmless. +** +** This routine stores a pointer to the extension in an array +** that is obtained from malloc(). If you run a memory leak +** checker on your program and it reports a leak because of this +** array, then invoke [sqlite3_automatic_extension_reset()] prior +** to shutdown to free the memory. +** +** Automatic extensions apply across all threads. +** +** This interface is experimental and is subject to change or +** removal in future releases of SQLite. +*/ +int sqlite3_auto_extension(void *xEntryPoint); + + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** Disable all previously registered automatic extensions. This +** routine undoes the effect of all prior [sqlite3_automatic_extension()] +** calls. +** +** This call disabled automatic extensions in all threads. +** +** This interface is experimental and is subject to change or +** removal in future releases of SQLite. +*/ +void sqlite3_reset_auto_extension(void); + + +/* +****** EXPERIMENTAL - subject to change without notice ************** +** +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stablizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** A module is a class of virtual tables. Each module is defined +** by an instance of the following structure. This structure consists +** mostly of methods for the module. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); +}; + +/* +** The sqlite3_index_info structure and its substructures is used to +** pass information into and receive the reply from the xBestIndex +** method of an sqlite3_module. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** The aConstraint[] array records WHERE clause constraints of the +** form: +** +** column OP expr +** +** Where OP is =, <, <=, >, or >=. The particular operator is stored +** in aConstraint[].op. The index of the column is stored in +** aConstraint[].iColumn. aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot. +** +** The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** The aConstraint[] array only reports WHERE clause terms in the correct +** form that refer to the particular virtual table being queried. +** +** Information about the ORDER BY clause is stored in aOrderBy[]. +** Each term of aOrderBy records a column of the ORDER BY clause. +** +** The xBestIndex method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite. +** +** The idxNum and idxPtr values are recorded and passed into xFilter. +** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true. +** +** The orderByConsumed means that output from xFilter will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** The estimatedCost value is an estimate of the cost of doing the +** particular lookup. A full scan of a table with N entries should have +** a cost of N. A binary search of a table of N entries should have a +** cost of approximately log(N). +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column on left-hand side of constraint */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ +}; +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 + +/* +** This routine is used to register a new module name with an SQLite +** connection. Module names must be registered before creating new +** virtual tables on the module, or before using preexisting virtual +** tables of the module. +*/ +int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *, /* Methods for the module */ + void * /* Client data for xCreate/xConnect */ +); + +/* +** This routine is identical to the sqlite3_create_module() method above, +** except that it allows a destructor function to be specified. It is +** even more experimental than the rest of the virtual tables API. +*/ +int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *, /* Methods for the module */ + void *, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** Every module implementation uses a subclass of the following structure +** to describe a particular instance of the module. Each subclass will +** be tailored to the specific needs of the module implementation. The +** purpose of this superclass is to define certain fields that are common +** to all module implementations. +** +** Virtual tables methods can set an error message by assigning a +** string obtained from sqlite3_mprintf() to zErrMsg. The method should +** take care that any prior string is freed by a call to sqlite3_free() +** prior to assigning a new string to zErrMsg. After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note +** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field +** since virtual tables are commonly implemented in loadable extensions which +** do not have access to sqlite3MPrintf() or sqlite3Free(). +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Used internally */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* Every module implementation uses a subclass of the following structure +** to describe cursors that point into the virtual table and are used +** to loop through the virtual table. Cursors are created using the +** xOpen method of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** The xCreate and xConnect methods of a module use the following API +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable); + +/* +** Virtual tables can provide alternative implementations of functions +** using the xFindFunction method. But global versions of those functions +** must exist in order to be overloaded. +** +** This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created. The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a place-holder function that can be overloaded +** by virtual tables. +** +** This API should be considered part of the virtual table interface, +** which is experimental and subject to change. +*/ +int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +** +****** EXPERIMENTAL - subject to change without notice ************** +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB +** +** An instance of the following opaque structure is used to +** represent an blob-handle. A blob-handle is created by +** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()]. +** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the blob. +** The [sqlite3_blob_bytes()] interface returns the size of the +** blob in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** +** Open a handle to the blob located in row iRow,, column zColumn, +** table zTable in database zDb. i.e. the same blob that would +** be selected by: +** +**
      +**     SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
      +** 
      +** +** If the flags parameter is non-zero, the blob is opened for +** read and write access. If it is zero, the blob is opened for read +** access. +** +** On success, [SQLITE_OK] is returned and the new +** [sqlite3_blob | blob handle] is written to *ppBlob. +** Otherwise an error code is returned and +** any value written to *ppBlob should not be used by the caller. +** This function sets the database-handle error code and message +** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()]. +*/ +int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Close A BLOB Handle +** +** Close an open [sqlite3_blob | blob handle]. +*/ +int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** +** Return the size in bytes of the blob accessible via the open +** [sqlite3_blob | blob-handle] passed as an argument. +*/ +int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** +** This function is used to read data from an open +** [sqlite3_blob | blob-handle] into a caller supplied buffer. +** n bytes of data are copied into buffer +** z from the open blob, starting at offset iOffset. +** +** On success, SQLITE_OK is returned. Otherwise, an +** [SQLITE_ERROR | SQLite error code] or an +** [SQLITE_IOERR_READ | extended error code] is returned. +*/ +int sqlite3_blob_read(sqlite3_blob *, void *z, int n, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** +** This function is used to write data into an open +** [sqlite3_blob | blob-handle] from a user supplied buffer. +** n bytes of data are copied from the buffer +** pointed to by z into the open blob, starting at offset iOffset. +** +** If the [sqlite3_blob | blob-handle] passed as the first argument +** was not opened for writing (the flags parameter to [sqlite3_blob_open()] +*** was zero), this function returns [SQLITE_READONLY]. +** +** This function may only modify the contents of the blob, it is +** not possible to increase the size of a blob using this API. If +** offset iOffset is less than n bytes from the end of the blob, +** [SQLITE_ERROR] is returned and no data is written. +** +** On success, SQLITE_OK is returned. Otherwise, an +** [SQLITE_ERROR | SQLite error code] or an +** [SQLITE_IOERR_READ | extended error code] is returned. +*/ +int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** The sqlite3_vfs_find() interface returns a pointer to a VFS given its +** name. Names are case sensitive. If there is no match, a NULL +** pointer is returned. If zVfsName is NULL then the default +** VFS is returned. +** +** New VFSes are registered with sqlite3_vfs_register(). Each +** new VFS becomes the default VFS if the makeDflt flag is set. +** The same VFS can be registered multiple times without injury. +** To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** Unregister a VFS with the sqlite3_vfs_unregister() interface. +** If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary. +*/ +sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
        +**
      • SQLITE_MUTEX_OS2 +**
      • SQLITE_MUTEX_PTHREAD +**
      • SQLITE_MUTEX_W32 +**
      • SQLITE_MUTEX_NOOP +**
      +** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_OS2, +** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations +** are appropriate for use on os/2, unix, and windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. The +** mutex interface routines defined here become external +** references in the SQLite library for which implementations +** must be provided by the application. This facility allows an +** application that links against SQLite to provide its own mutex +** implementation without having to modify the SQLite core. +** +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. SQLite +** will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_MEM2 +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Four static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. SQLite is careful to deallocate every +** dynamic mutex that it allocates. The dynamic mutexes must not be in +** use when they are deallocated. Attempting to deallocate a static +** mutex results in undefined behavior. SQLite never deallocates +** a static mutex. +** +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. SQLite will never exhibit +** such behavior in its own use of mutexes. +** +** Some systems (ex: windows95) do not the operation implemented by +** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will +** always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior. +** +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. SQLite will +** never do either. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int); +void sqlite3_mutex_free(sqlite3_mutex*); +void sqlite3_mutex_enter(sqlite3_mutex*); +int sqlite3_mutex_try(sqlite3_mutex*); +void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Verifcation Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. The core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provided versions of these +** routines that actually work. +** If the implementation does not provide working +** versions of these routines, it should at least provide stubs +** that always return true so that one does not get spurious +** assertion failures. +** +** If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But the +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +int sqlite3_mutex_held(sqlite3_mutex*); +int sqlite3_mutex_notheld(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Types +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ + +/* +** CAPI3REF: Low-Level Control Of Database Files +** +** The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. The +** name of the database is the name assigned to the database by the +** ATTACH SQL command that opened the +** database. To control the main database file, use the name "main" +** or a NULL pointer. The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. The return value of the xFileControl +** method becomes the return value of this routine. +** +** If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif +#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h b/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h new file mode 100644 index 0000000000..5d4c2dec96 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h @@ -0,0 +1,350 @@ +/* +** 2006 June 7 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +** +** @(#) $Id: sqlite3ext.h,v 1.17 2007/08/31 16:11:36 drh Exp $ +*/ +#ifndef _SQLITE3EXT_H_ +#define _SQLITE3EXT_H_ +#include "sqlite3.h" + +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** The following structure hold pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each others shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*snprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*),void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); +}; + +/* +** The following macros redefine the API routines so that they are +** redirected throught the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#ifndef SQLITE_CORE +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#define sqlite3_expired sqlite3_api->expired +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#define sqlite3_global_recover sqlite3_api->global_recover +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->snprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#endif /* SQLITE_CORE */ + +#define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api; +#define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v; + +#endif /* _SQLITE3EXT_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h b/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h new file mode 100644 index 0000000000..2170e53912 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h @@ -0,0 +1,1972 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +** @(#) $Id: sqliteInt.h,v 1.613 2007/10/03 08:46:45 danielk1977 Exp $ +*/ +#ifndef _SQLITEINT_H_ +#define _SQLITEINT_H_ +#include "sqliteLimit.h" + +/* +** For testing purposes, the various size limit constants are really +** variables that we can modify in the testfixture. +*/ +#ifdef SQLITE_TEST + #undef SQLITE_MAX_LENGTH + #undef SQLITE_MAX_COLUMN + #undef SQLITE_MAX_SQL_LENGTH + #undef SQLITE_MAX_EXPR_DEPTH + #undef SQLITE_MAX_COMPOUND_SELECT + #undef SQLITE_MAX_VDBE_OP + #undef SQLITE_MAX_FUNCTION_ARG + #undef SQLITE_MAX_VARIABLE_NUMBER + #undef SQLITE_MAX_PAGE_SIZE + #undef SQLITE_MAX_PAGE_COUNT + #undef SQLITE_MAX_LIKE_PATTERN_LENGTH + + #define SQLITE_MAX_LENGTH sqlite3MAX_LENGTH + #define SQLITE_MAX_COLUMN sqlite3MAX_COLUMN + #define SQLITE_MAX_SQL_LENGTH sqlite3MAX_SQL_LENGTH + #define SQLITE_MAX_EXPR_DEPTH sqlite3MAX_EXPR_DEPTH + #define SQLITE_MAX_COMPOUND_SELECT sqlite3MAX_COMPOUND_SELECT + #define SQLITE_MAX_VDBE_OP sqlite3MAX_VDBE_OP + #define SQLITE_MAX_FUNCTION_ARG sqlite3MAX_FUNCTION_ARG + #define SQLITE_MAX_VARIABLE_NUMBER sqlite3MAX_VARIABLE_NUMBER + #define SQLITE_MAX_PAGE_SIZE sqlite3MAX_PAGE_SIZE + #define SQLITE_MAX_PAGE_COUNT sqlite3MAX_PAGE_COUNT + #define SQLITE_MAX_LIKE_PATTERN_LENGTH sqlite3MAX_LIKE_PATTERN_LENGTH + + extern int sqlite3MAX_LENGTH; + extern int sqlite3MAX_COLUMN; + extern int sqlite3MAX_SQL_LENGTH; + extern int sqlite3MAX_EXPR_DEPTH; + extern int sqlite3MAX_COMPOUND_SELECT; + extern int sqlite3MAX_VDBE_OP; + extern int sqlite3MAX_FUNCTION_ARG; + extern int sqlite3MAX_VARIABLE_NUMBER; + extern int sqlite3MAX_PAGE_SIZE; + extern int sqlite3MAX_PAGE_COUNT; + extern int sqlite3MAX_LIKE_PATTERN_LENGTH; +#endif + + +/* +** The SQLITE_THREADSAFE macro must be defined as either 0 or 1. +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy +*/ +#if !defined(SQLITE_THREADSAFE) +#if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +#else +# define SQLITE_THREADSAFE 1 +#endif +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most unix systems. But Mac OS X is different. +** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, +** so it is omitted there. See ticket #2673. +** +** Later we learn that _XOPEN_SOURCE is poorly or incorrectly +** implemented on some systems. So we avoid defining it at all +** if it is already defined or if it is unneeded because we are +** not doing a threadsafe build. Ticket #2681. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__MACOS__) && SQLITE_THREADSAFE +# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ +#endif + +#if defined(SQLITE_TCL) || defined(TCLSH) +# include +#endif + +/* +** Many people are failing to set -DNDEBUG=1 when compiling SQLite. +** Setting NDEBUG makes the code smaller and run faster. So the following +** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 +** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** These #defines should enable >2GB file support on Posix if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: RedHat 7.2) but you want your code to work +** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in RedHat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** Similar is true for MacOS. LFS is only supported on MacOS 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +#include "sqlite3.h" +#include "hash.h" +#include "parse.h" +#include +#include +#include +#include +#include + +#define sqlite3_isnan(X) ((X)!=(X)) + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (0x7fffffffffffffff) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** If the following macro is set to 1, then NULL values are considered +** distinct when determining whether or not two entries are the same +** in a UNIQUE index. This is the way PostgreSQL, Oracle, DB2, MySQL, +** OCELOT, and Firebird all work. The SQL92 spec explicitly says this +** is the way things are suppose to work. +** +** If the following macro is set to 0, the NULLs are indistinct for +** a UNIQUE index. In this mode, you can only have a single NULL entry +** for a column declared UNIQUE. This is the way Informix and SQL Server +** work. +*/ +#define NULL_DISTINCT_FOR_UNIQUE 1 + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 1 +#endif + +/* +** Provide a default value for TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef TEMP_STORE +# define TEMP_STORE 1 +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# define UINT32_TYPE unsigned int +#endif +#ifndef UINT16_TYPE +# define UINT16_TYPE unsigned short int +#endif +#ifndef INT16_TYPE +# define INT16_TYPE short int +#endif +#ifndef UINT8_TYPE +# define UINT8_TYPE unsigned char +#endif +#ifndef INT8_TYPE +# define INT8_TYPE signed char +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef UINT8_TYPE i8; /* 1-byte signed integer */ + +/* +** Macros to determine whether the machine is big or little endian, +** evaluated at runtime. +*/ +#ifdef SQLITE_AMALGAMATION +const int sqlite3One; +#else +extern const int sqlite3one; +#endif +#if defined(i386) || defined(__i386__) || defined(_M_IX86) +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xFunc)(void *,int); /* The busy callback */ + void *pArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler typedefs. +*/ +#include "btree.h" +#include "vdbe.h" +#include "pager.h" + + +/* +** Name of the master database table. The master database table +** is a special table that holds the names and attributes of all +** user tables and indices. +*/ +#define MASTER_NAME "sqlite_master" +#define TEMP_MASTER_NAME "sqlite_temp_master" + +/* +** The root-page of the master database table. +*/ +#define MASTER_ROOT 1 + +/* +** The name of the schema table. +*/ +#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) (sizeof(X)/sizeof(X[0])) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Db Db; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct FKey FKey; +typedef struct FuncDef FuncDef; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct Parse Parse; +typedef struct Select Select; +typedef struct SrcList SrcList; +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct TriggerStack TriggerStack; +typedef struct TriggerStep TriggerStep; +typedef struct Trigger Trigger; +typedef struct WhereInfo WhereInfo; +typedef struct WhereLevel WhereLevel; + +#include "os.h" +#include "mutex.h" + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zName; /* Name of this database */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ + u8 safety_level; /* How aggressive at synching data to disk */ + void *pAux; /* Auxiliary data. Usually NULL */ + void (*xFreeAux)(void*); /* Routine to free pAux */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** If there are no virtual tables configured in this schema, the +** Schema.db variable is set to NULL. After the first virtual table +** has been added, it is set to point to the database connection +** used to create the connection. Once a virtual table has been +** added to the Schema structure and the Schema.db variable populated, +** only that database connection may use the Schema to prepare +** statements. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash aFKey; /* Foreign keys indexed by to-table */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 flags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3 *db; /* "Owner" connection. See comment above */ +#endif +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) + +/* +** Allowed values for the DB.flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ + + +/* +** Each database is an instance of the following structure. +** +** The sqlite.lastRowid records the last insert rowid generated by an +** insert statement. Inserts on views do not affect its value. Each +** trigger has its own context, so that lastRowid can be updated inside +** triggers as usual. The previous value will be restored once the trigger +** exits. Upon entering a before or instead of trigger, lastRowid is no +** longer (since after version 2.8.12) reset to -1. +** +** The sqlite.nChange does not count changes within triggers and keeps no +** context. It is reset at start of sqlite3_exec. +** The sqlite.lsChange represents the number of changes made by the last +** insert, update, or delete statement. It remains constant throughout the +** length of a statement and is then updated by OP_SetCounts. It keeps a +** context stack just like lastRowid so that the count of changes +** within a trigger is not seen outside the trigger. Changes to views do not +** affect the value of lsChange. +** The sqlite.csChange keeps track of the number of current changes (since +** the last statement) and is used to update sqlite_lsChange. +** +** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 +** store the most recent error code and, if applicable, string. The +** internal function sqlite3Error() is used to set these variables +** consistently. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + int nDb; /* Number of backends currently in use */ + Db *aDb; /* All backends */ + int flags; /* Miscellanous flags. See below */ + int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errMask; /* & result codes with this before returning */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + int nTable; /* Number of tables in the database */ + CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + i64 priorNewRowid; /* Last randomly generated ROWID */ + int magic; /* Magic number for detect library misuse */ + int nChange; /* Value returned by sqlite3_changes() */ + int nTotalChange; /* Value returned by sqlite3_total_changes() */ + sqlite3_mutex *mutex; /* Connection mutex */ + struct sqlite3InitInfo { /* Information used during initialization */ + int iDb; /* When back is being initialized */ + int newTnum; /* Rootpage of table being initialized */ + u8 busy; /* TRUE if currently initializing */ + } init; + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared libraray handles */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + int activeVdbeCnt; /* Number of vdbes currently executing */ + void (*xTrace)(void*,const char*); /* Trace function */ + void *pTraceArg; /* Argument to the trace function */ + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ + char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ + union { + int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; +#ifndef SQLITE_OMIT_AUTHORIZATION + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); + /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + int nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + Hash aModule; /* populated by sqlite3_create_module() */ + Table *pVTab; /* vtab with active Connect/Create method */ + sqlite3_vtab **aVTrans; /* Virtual tables with open transactions */ + int nVTrans; /* Allocated size of aVTrans */ +#endif + Hash aFunc; /* All functions that can be in SQL exprs */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + int busyTimeout; /* Busy handler timeout, in msec */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ +#ifdef SQLITE_SSE + sqlite3_stmt *pFetch; /* Used by SSE to fetch stored statements */ +#endif + u8 dfltLockMode; /* Default locking-mode for attached dbs */ +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define ENC(db) ((db)->aDb[0].pSchema->enc) + +/* +** Possible values for the sqlite.flags and or Db.flags fields. +** +** On sqlite.flags, the SQLITE_InTrans value means that we have +** executed a BEGIN. On Db.flags, SQLITE_InTrans means a statement +** transaction is active on that particular database file. +*/ +#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ +#define SQLITE_InTrans 0x00000008 /* True if in a transaction */ +#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */ +#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ +#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ +#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ +#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ + /* result set is empty */ +#define SQLITE_SqlTrace 0x00000200 /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing 0x00000400 /* Debug listings of VDBE programs */ +#define SQLITE_WriteSchema 0x00000800 /* OK to update SQLITE_MASTER */ +#define SQLITE_NoReadlock 0x00001000 /* Readlocks are omitted when + ** accessing read-only databases */ +#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommitted 0x00004000 /* For shared-cache mode */ +#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ +#define SQLITE_FullFSync 0x00010000 /* Use full fsync on the backend */ +#define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */ + +#define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */ +#define SQLITE_SharedCache 0x00080000 /* Cache sharing is enabled */ +#define SQLITE_Vtab 0x00100000 /* There exists a virtual table */ + +/* +** Possible values for the sqlite.magic field. +** The numbers are obtained at random and have no special meaning, other +** than being distinct from one another. +*/ +#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ +#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ +#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ +#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ + +/* +** Each SQL function is defined by an instance of the following +** structure. A pointer to this structure is stored in the sqlite.aFunc +** hash table. When multiple functions have the same name, the hash table +** points to a linked list of these structures. +*/ +struct FuncDef { + i16 nArg; /* Number of arguments. -1 means unlimited */ + u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ + u8 needCollSeq; /* True if sqlite3GetFuncCollSeq() might be called */ + u8 flags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ + void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ + void (*xFinalize)(sqlite3_context*); /* Aggregate finializer */ + char zName[1]; /* SQL name of the function. MUST BE LAST */ +}; + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ +}; + +/* +** Possible values for FuncDef.flags +*/ +#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x04 /* Ephermeral. Delete with VDBE */ + +/* +** information about each column of an SQL table is held in an instance +** of this structure. +*/ +struct Column { + char *zName; /* Name of this column */ + Expr *pDflt; /* Default value of this column */ + char *zType; /* Data type for this column */ + char *zColl; /* Collating sequence. If NULL, use the default */ + u8 notNull; /* True if there is a NOT NULL constraint */ + u8 isPrimKey; /* True if this column is part of the PRIMARY KEY */ + char affinity; /* One of the SQLITE_AFF_... values */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + u8 isHidden; /* True if this column is 'hidden' */ +#endif +}; + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** There may two seperate implementations of the collation function, one +** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that +** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine +** native byte order. When a collation sequence is invoked, SQLite selects +** the version that will require the least expensive encoding +** translations, if any. +** +** The CollSeq.pUser member variable is an extra parameter that passed in +** as the first argument to the UTF-8 comparison function, xCmp. +** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, +** xCmp16. +** +** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + u8 type; /* One of the SQLITE_COLL_... values below */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** Allowed values of CollSeq flags: +*/ +#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ +#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ +#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ +#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by number the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'a'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P3 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. +*/ +#define SQLITE_AFF_TEXT 'a' +#define SQLITE_AFF_NONE 'b' +#define SQLITE_AFF_NUMERIC 'c' +#define SQLITE_AFF_INTEGER 'd' +#define SQLITE_AFF_REAL 'e' + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** Each SQL table is represented in memory by an instance of the +** following structure. +** +** Table.zName is the name of the table. The case of the original +** CREATE TABLE statement is stored, but case is not significant for +** comparisons. +** +** Table.nCol is the number of columns in this table. Table.aCol is a +** pointer to an array of Column structures, one for each column. +** +** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of +** the column that is that key. Otherwise Table.iPKey is negative. Note +** that the datatype of the PRIMARY KEY must be INTEGER for this field to +** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of +** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid +** is generated for each row of the table. Table.hasPrimKey is true if +** the table has any PRIMARY KEY, INTEGER or otherwise. +** +** Table.tnum is the page number for the root BTree page of the table in the +** database file. If Table.iDb is the index of the database table backend +** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that +** holds temporary tables and indices. If Table.isEphem +** is true, then the table is stored in a file that is automatically deleted +** when the VDBE cursor to the table is closed. In this case Table.tnum +** refers VDBE cursor number that holds the table open, not to the root +** page number. Transient tables are used to hold the results of a +** sub-query that appears instead of a real table name in the FROM clause +** of a SELECT statement. +*/ +struct Table { + char *zName; /* Name of the table */ + int nCol; /* Number of columns in this table */ + Column *aCol; /* Information about each column */ + int iPKey; /* If not less then 0, use aCol[iPKey] as the primary key */ + Index *pIndex; /* List of SQL indexes on this table. */ + int tnum; /* Root BTree node for this table (see note above) */ + Select *pSelect; /* NULL for tables. Points to definition if a view. */ + int nRef; /* Number of pointers to this Table */ + Trigger *pTrigger; /* List of SQL triggers on this table */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + char *zColAff; /* String defining the affinity of each column */ +#ifndef SQLITE_OMIT_CHECK + Expr *pCheck; /* The AND of all CHECK constraints */ +#endif +#ifndef SQLITE_OMIT_ALTERTABLE + int addColOffset; /* Offset in CREATE TABLE statement to add a new column */ +#endif + u8 readOnly; /* True if this table should not be written by the user */ + u8 isEphem; /* True if created using OP_OpenEphermeral */ + u8 hasPrimKey; /* True if there exists a primary key */ + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ + u8 autoInc; /* True if the integer primary key is autoincrement */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + u8 isVirtual; /* True if this is a virtual table */ + u8 isCommit; /* True once the CREATE TABLE has been committed */ + Module *pMod; /* Pointer to the implementation of the module */ + sqlite3_vtab *pVtab; /* Pointer to the module instance */ + int nModuleArg; /* Number of arguments to the module */ + char **azModuleArg; /* Text of all module args. [0] is module name */ +#endif + Schema *pSchema; /* Schema that contains this table */ +}; + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) ((X)->isVirtual) +# define IsHiddenColumn(X) ((X)->isHidden) +#else +# define IsVirtual(X) 0 +# define IsHiddenColumn(X) 0 +#endif + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existance of the to-table is not checked +** until an attempt is made to insert data into the from-table. +** +** The sqlite.aFKey hash table stores pointers to this structure +** given the name of a to-table. For each to-table, all foreign keys +** associated with that table are on a linked list using the FKey.pNextTo +** field. +*/ +struct FKey { + Table *pFrom; /* The table that constains the REFERENCES clause */ + FKey *pNextFrom; /* Next foreign key in pFrom */ + char *zTo; /* Name of table that the key points to */ + FKey *pNextTo; /* Next foreign key that points to zTo */ + int nCol; /* Number of columns in this key */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ + } *aCol; /* One entry for each of nCol column s */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 updateConf; /* How to resolve conflicts that occur on UPDATE */ + u8 deleteConf; /* How to resolve conflicts that occur on DELETE */ + u8 insertConf; /* How to resolve conflicts that occur on INSERT */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** +** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The following symbolic values are used to record which type +** of action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ + +#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 7 /* Set the foreign key value to NULL */ +#define OE_SetDflt 8 /* Set the foreign key value to its default */ +#define OE_Cascade 9 /* Cascade the changes */ + +#define OE_Default 99 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +** +** If the KeyInfo.incrKey value is true and the comparison would +** otherwise be equal, then return a result as if the second key +** were larger. +*/ +struct KeyInfo { + sqlite3 *db; /* The database connection */ + u8 enc; /* Text encoding - one of the TEXT_Utf* values */ + u8 incrKey; /* Increase 2nd key by epsilon before comparison */ + int nField; /* Number of entries in aColl[] */ + u8 *aSortOrder; /* If defined an aSortOrder[i] is true, sort DESC */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +*/ +struct Index { + char *zName; /* Name of this index */ + int nColumn; /* Number of columns in the table used by this index */ + int *aiColumn; /* Which columns are used by this index. 1st is 0 */ + unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + int tnum; /* Page containing root of this index in database file */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ + char **azColl; /* Array of collation sequence names for index */ +}; + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** Note if Token.z==0 then Token.dyn and Token.n are undefined and +** may contain random values. Do not make any assuptions about Token.dyn +** and Token.n when Token.z==0. +*/ +struct Token { + const unsigned char *z; /* Text of the token. Not NULL-terminated! */ + unsigned dyn : 1; /* True for malloced memory, false for static */ + unsigned n : 31; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iColumn field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + ExprList *pGroupBy; /* The group by clause */ + int nSortingColumn; /* Number of columns in the sorting index */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + int iTable; /* Cursor number of the source table */ + int iColumn; /* Column number within the source table */ + int iSorterColumn; /* Column number in the sorting index */ + int iMem; /* Memory location that acts as accumulator */ + Expr *pExpr; /* The original expression */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nColumnAlloc; /* Number of slots allocated for aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephermeral table used to enforce DISTINCT */ + } *aFunc; + int nFunc; /* Number of entries in aFunc[] */ + int nFuncAlloc; /* Number of slots allocated for aFunc[] */ +}; + +/* +** Each node of an expression in the parse tree is an instance +** of this structure. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** Expr.pRight and Expr.pLeft are subexpressions. Expr.pList is a list +** of argument if the expression is a function. +** +** Expr.token is the operator token for this node. For some expressions +** that have subexpressions, Expr.token can be the complete text that gave +** rise to the Expr. In the latter case, the token is marked as being +** a compound token. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is a function, the Expr.iTable is an integer code +** representing which function. If the expression is an unbound variable +** marker (a question mark character '?' in the original SQL) then the +** Expr.iTable holds the index number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** The Expr.pSelect field points to a SELECT statement. The SELECT might +** be the right operand of an IN operator. Or, if a scalar SELECT appears +** in an expression the opcode is TK_SELECT and Expr.pSelect is the only +** operand. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affinity; /* The affinity of the column or 0 if not a column */ + u16 flags; /* Various flags. See below */ + CollSeq *pColl; /* The collation type of the column or 0 */ + Expr *pLeft, *pRight; /* Left and right subnodes */ + ExprList *pList; /* A list of expressions used as function arguments + ** or in " IN (aCol[] or ->aFunc[] */ + int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + Select *pSelect; /* When the expression is a sub-select. Also the + ** right side of " IN (

    i7JD{-hBjrJ1AJ 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 R?kQSCd!K%7`qkui}2QXgLVIjy2+1Hnc!c! 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%0AH)PBOiVmxkY8j)$Qz})E`^A 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 nD>~( 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%0DpE+I4@txc^DkKYI}BKffIN0dRd0 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