Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | :-) (CVS 214) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
73a1ed61265040925f1a41c9c0cfeea5 |
User & Date: | drh 2001-04-28 16:52:41.000 |
Context
2001-04-29
| ||
23:32 | :-) (CVS 215) (check-in: 624ccbca98 user: drh tags: trunk) | |
2001-04-28
| ||
16:52 | :-) (CVS 214) (check-in: 73a1ed6126 user: drh tags: trunk) | |
2001-04-17
| ||
20:09 | :-) (CVS 1719) (check-in: 8e0476f900 user: drh tags: trunk) | |
Changes
Changes to Makefile.in.
︙ | ︙ | |||
192 193 194 195 196 197 198 | pager.o: $(TOP)/src/pager.c $(HDR) $(TCC) $(GDBM_FLAGS) $(TCL_FLAGS) -c $(TOP)/src/pager.c gdbmdump: $(TOP)/tool/gdbmdump.c $(TCC) $(GDBM_FLAGS) -o gdbmdump $(TOP)/tool/gdbmdump.c $(LIBGDBM) tclsqlite: $(TOP)/src/tclsqlite.c libsqlite.a | | | | | | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | pager.o: $(TOP)/src/pager.c $(HDR) $(TCC) $(GDBM_FLAGS) $(TCL_FLAGS) -c $(TOP)/src/pager.c gdbmdump: $(TOP)/tool/gdbmdump.c $(TCC) $(GDBM_FLAGS) -o gdbmdump $(TOP)/tool/gdbmdump.c $(LIBGDBM) tclsqlite: $(TOP)/src/tclsqlite.c libsqlite.a $(TCC) $(TCL_FLAGS) -DTCLSH=1 -o tclsqlite \ $(TOP)/src/tclsqlite.c libsqlite.a $(LIBGDBM) $(LIBTCL) testfixture: $(TOP)/src/tclsqlite.c libsqlite.a $(TESTSRC) $(TCC) $(TCL_FLAGS) -DTCLSH=1 -DSQLITE_TEST=1 -o testfixture \ $(TESTSRC) $(TOP)/src/tclsqlite.c \ libsqlite.a $(LIBGDBM) $(LIBTCL) test: testfixture sqlite ./testfixture $(TOP)/test/all.test sqlite.tar.gz: pwd=`pwd`; cd $(TOP)/..; tar czf $$pwd/sqlite.tar.gz sqlite index.html: $(TOP)/www/index.tcl sqlite.tar.gz last_change tclsh $(TOP)/www/index.tcl `cat $(TOP)/VERSION` >index.html |
︙ | ︙ |
Changes to configure.
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-hints=FILE Read configuration options from FILE" ac_help="$ac_help --enable-utf8 Use UTF-8 encodings" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE | > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-hints=FILE Read configuration options from FILE" ac_help="$ac_help --enable-utf8 Use UTF-8 encodings" ac_help="$ac_help --disable-gdbm Omit the GDBM drivers" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE |
︙ | ︙ | |||
523 524 525 526 527 528 529 | else ac_n= ac_c='\c' ac_t= fi # The following RCS revision string applies to configure.in | | | 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 | else ac_n= ac_c='\c' ac_t= fi # The following RCS revision string applies to configure.in # $Revision: 1.10 $ ######### # Make sure we are not building in a subdirectory of the source tree. # temp=`echo $srcdir | grep '[^./]'` |
︙ | ︙ | |||
598 599 600 601 602 603 604 | # generate command-line programs that run on the build machine. # default_build_cflags="-g" if test "$config_BUILD_CC" = ""; then # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | | | 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 | # generate command-line programs that run on the build machine. # default_build_cflags="-g" if test "$config_BUILD_CC" = ""; then # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:608: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
︙ | ︙ | |||
628 629 630 631 632 633 634 | echo "$ac_t""no" 1>&6 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 | | | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 | echo "$ac_t""no" 1>&6 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:638: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
︙ | ︙ | |||
679 680 681 682 683 684 685 | if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | | | 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 | if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:689: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
︙ | ︙ | |||
711 712 713 714 715 716 717 | ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 | | | | | 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 | ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:721: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 732 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi |
︙ | ︙ | |||
753 754 755 756 757 758 759 | cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 | | | | | | 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 | cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:763: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:768: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <<EOF #ifdef __GNUC__ yes; #endif EOF if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:777: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:796: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else |
︙ | ︙ | |||
825 826 827 828 829 830 831 | { echo "configure: error: unable to find a compiler for building build tools" 1>&2; exit 1; } fi BUILD_CC=$CC default_build_cflags=$CFLAGS else BUILD_CC=$config_BUILD_CC echo $ac_n "checking host compiler""... $ac_c" 1>&6 | | | | | | | | | 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 | { echo "configure: error: unable to find a compiler for building build tools" 1>&2; exit 1; } fi BUILD_CC=$CC default_build_cflags=$CFLAGS else BUILD_CC=$config_BUILD_CC echo $ac_n "checking host compiler""... $ac_c" 1>&6 echo "configure:835: checking host compiler" >&5 CC=$BUILD_CC echo "$ac_t""$BUILD_CC" 1>&6 fi echo $ac_n "checking switches for the host compiler""... $ac_c" 1>&6 echo "configure:840: checking switches for the host compiler" >&5 if test "$config_BUILD_CFLAGS" != ""; then CFLAGS=$config_BUILD_CFLAGS BUILD_CFLAGS=$config_BUILD_CFLAGS else BUILD_CFLAGS=$default_build_cflags fi echo "$ac_t""$BUILD_CFLAGS" 1>&6 if test "$config_BUILD_LIBS" != ""; then BUILD_LIBS=$config_BUILD_LIBS fi ########## # Locate a compiler that converts C code into *.o files that run on # the target machine. # echo $ac_n "checking target compiler""... $ac_c" 1>&6 echo "configure:860: checking target compiler" >&5 if test "$config_TARGET_CC" != ""; then TARGET_CC=$config_TARGET_CC else TARGET_CC=$BUILD_CC fi echo "$ac_t""$TARGET_CC" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 echo "configure:868: checking switches on the target compiler" >&5 if test "$config_TARGET_CFLAGS" != ""; then TARGET_CFLAGS=$config_TARGET_CFLAGS else TARGET_CFLAGS=$BUILD_CFLAGS fi echo "$ac_t""$TARGET_CFLAGS" 1>&6 echo $ac_n "checking target linker""... $ac_c" 1>&6 echo "configure:876: checking target linker" >&5 if test "$config_TARGET_LINK" = ""; then TARGET_LINK=$TARGET_CC else TARGET_LINK=$config_TARGET_LINK fi echo "$ac_t""$TARGET_LINK" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 echo "configure:884: checking switches on the target compiler" >&5 if test "$config_TARGET_TFLAGS" != ""; then TARGET_TFLAGS=$config_TARGET_TFLAGS else TARGET_TFLAGS=$BUILD_CFLAGS fi if test "$config_TARGET_RANLIB" != ""; then TARGET_RANLIB=$config_TARGET_RANLIB else # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:896: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
︙ | ︙ | |||
932 933 934 935 936 937 938 | # Set the $cross variable if we are cross-compiling. Make # it 0 if we are not. # echo $ac_n "checking if host and target compilers are the same""... $ac_c" 1>&6 | | | | | | | | 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 | # Set the $cross variable if we are cross-compiling. Make # it 0 if we are not. # echo $ac_n "checking if host and target compilers are the same""... $ac_c" 1>&6 echo "configure:942: checking if host and target compilers are the same" >&5 if test "$BUILD_CC" = "$TARGET_CC"; then cross=0 echo "$ac_t""yes" 1>&6 else cross=1 echo "$ac_t""no" 1>&6 fi ########## # Are we using UTF-8 or iso8859 encodings? # # Check whether --enable-utf8 or --disable-utf8 was given. if test "${enable_utf8+set}" = set; then enableval="$enable_utf8" : else enable_utf8=no fi echo $ac_n "checking character encoding""... $ac_c" 1>&6 echo "configure:963: checking character encoding" >&5 if test "$enable_utf8" = "no"; then ENCODING=ISO8859 echo "$ac_t""iso8859" 1>&6 else ENCODING=UTF8 echo "$ac_t""UTF-8" 1>&6 fi ########### # 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 $ac_n "checking if executables have the .exe suffix""... $ac_c" 1>&6 echo "configure:979: checking if executables have the .exe suffix" >&5 if test "$config_BUILD_EXEEXT" = ".exe"; then CYGWIN=yes echo "$ac_t""yes" 1>&6 else echo "$ac_t""unknown" 1>&6 fi if test "$CYGWIN" != "yes"; then echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 echo "configure:988: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 993 "configure" #include "confdefs.h" int main() { #ifndef __CYGWIN__ #define __CYGWIN__ __CYGWIN32__ #endif return __CYGWIN__; ; return 0; } EOF if { (eval echo configure:1004: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_cygwin=no |
︙ | ︙ | |||
1058 1059 1060 1061 1062 1063 1064 | TARGET_TCL_LIBS="$config_TARGET_TCL_LIBS" else if test "$with_tcl" != ""; then extra=`echo $with_tcl/$tclsubdir/libtcl8*.a` fi CC=$TARGET_CC echo $ac_n "checking for sin""... $ac_c" 1>&6 | | | | 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 | TARGET_TCL_LIBS="$config_TARGET_TCL_LIBS" else if test "$with_tcl" != ""; then extra=`echo $with_tcl/$tclsubdir/libtcl8*.a` fi CC=$TARGET_CC echo $ac_n "checking for sin""... $ac_c" 1>&6 echo "configure:1068: checking for sin" >&5 if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 1073 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char sin(); below. */ #include <assert.h> /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ |
︙ | ︙ | |||
1086 1087 1088 1089 1090 1091 1092 | choke me #else sin(); #endif ; return 0; } EOF | | | | | | 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 | choke me #else sin(); #endif ; return 0; } EOF if { (eval echo configure:1096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_sin=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_sin=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then echo "$ac_t""yes" 1>&6 LIBS="" else echo "$ac_t""no" 1>&6 LIBS="-lm" fi echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 echo "configure:1117: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <<EOF #line 1125 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen(); int main() { dlopen() ; return 0; } EOF if { (eval echo configure:1136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" |
︙ | ︙ | |||
1160 1161 1162 1163 1164 1165 1166 | otherlibs=$LIBS if test "$extra" != ""; then LIBS=$extra else LIBS="" echo $ac_n "checking for library containing Tcl_Init""... $ac_c" 1>&6 | | | | | | | 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 | otherlibs=$LIBS if test "$extra" != ""; then LIBS=$extra else LIBS="" echo $ac_n "checking for library containing Tcl_Init""... $ac_c" 1>&6 echo "configure:1170: checking for library containing Tcl_Init" >&5 if eval "test \"`echo '$''{'ac_cv_search_Tcl_Init'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_Tcl_Init="no" cat > conftest.$ac_ext <<EOF #line 1177 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Tcl_Init(); int main() { Tcl_Init() ; return 0; } EOF if { (eval echo configure:1188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_Tcl_Init="none required" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* test "$ac_cv_search_Tcl_Init" = "no" && for i in tcl8.4 tcl8.3 tcl8.2 tcl8.1 tcl8.0 tcl80 tcl; do LIBS="-l$i $otherlibs $ac_func_search_save_LIBS" cat > conftest.$ac_ext <<EOF #line 1199 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Tcl_Init(); int main() { Tcl_Init() ; return 0; } EOF if { (eval echo configure:1210: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_Tcl_Init="-l$i" break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi |
︙ | ︙ | |||
1229 1230 1231 1232 1233 1234 1235 | fi ########## # Figure out where to get the TCL header files. # echo $ac_n "checking TCL header files""... $ac_c" 1>&6 | | | | | | | | | | 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 | fi ########## # Figure out where to get the TCL header files. # echo $ac_n "checking TCL header files""... $ac_c" 1>&6 echo "configure:1239: checking TCL header files" >&5 found=no if test "$config_TARGET_TCL_INC" != ""; then TARGET_TCL_INC=$config_TARGET_TCL_INC found=yes else if test "$with_tcl" != ""; then TARGET_TCL_INC="-I$with_tcl/generic -I$with_tcl/$tclsubdir" found=yes else TARGET_TCL_INC="" found=no fi fi if test "$found" = "yes"; then echo "$ac_t""$TARGET_TCL_INC" 1>&6 else echo "$ac_t""not specified: still searching..." 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:1258: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext <<EOF #line 1273 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1279: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext <<EOF #line 1290 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1296: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext <<EOF #line 1307 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1313: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 |
︙ | ︙ | |||
1329 1330 1331 1332 1333 1334 1335 | else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 ac_safe=`echo "tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for tcl.h""... $ac_c" 1>&6 | | | | | 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 | else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 ac_safe=`echo "tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for tcl.h""... $ac_c" 1>&6 echo "configure:1339: checking for tcl.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 1344 "configure" #include "confdefs.h" #include <tcl.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1349: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 |
︙ | ︙ | |||
1366 1367 1368 1369 1370 1371 1372 | fi if test "$found" = "no"; then for dir in /usr/local /usr/X11 /usr/X11R6 /usr/pkg /usr/contrib /usr; do ac_safe=`echo "$dir/include/tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/tcl.h""... $ac_c" 1>&6 | | | 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 | fi if test "$found" = "no"; then for dir in /usr/local /usr/X11 /usr/X11R6 /usr/pkg /usr/contrib /usr; do ac_safe=`echo "$dir/include/tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/tcl.h""... $ac_c" 1>&6 echo "configure:1376: checking for $dir/include/tcl.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then { echo "configure: error: Cannot check for file existence when cross compiling" 1>&2; exit 1; } else if test -r $dir/include/tcl.h; then |
︙ | ︙ | |||
1403 1404 1405 1406 1407 1408 1409 | fi ########## # Figure out what C libraries are required to compile programs # that use GDBM. # | > > > > > > > > > > > > > | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 | fi ########## # Figure out what C libraries are required to compile programs # that use GDBM. # use_gdbm=true # Check whether --enable-gdbm or --disable-gdbm was given. if test "${enable_gdbm+set}" = set; then enableval="$enable_gdbm" use_gdbm=$enableval else use_gdbm=true fi if test "$use_gdbm" = "no"; then use_gdbm=false; fi if test "$use_gdbm" = "yes"; then use_gdbm=true; fi if $use_gdbm; then if test "$config_TARGET_GDBM_LIBS" != ""; then TARGET_GDBM_LIBS="$config_TARGET_GDBM_LIBS" else CC=$TARGET_CC LIBS="" echo $ac_n "checking for library containing gdbm_open""... $ac_c" 1>&6 echo "configure:1433: checking for library containing gdbm_open" >&5 if eval "test \"`echo '$''{'ac_cv_search_gdbm_open'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_gdbm_open="no" cat > conftest.$ac_ext <<EOF #line 1440 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdbm_open(); int main() { gdbm_open() ; return 0; } EOF if { (eval echo configure:1451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_gdbm_open="none required" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* test "$ac_cv_search_gdbm_open" = "no" && for i in gdbm; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <<EOF #line 1462 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdbm_open(); int main() { gdbm_open() ; return 0; } EOF if { (eval echo configure:1473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_gdbm_open="-l$i" break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* done LIBS="$ac_func_search_save_LIBS" fi echo "$ac_t""$ac_cv_search_gdbm_open" 1>&6 if test "$ac_cv_search_gdbm_open" != "no"; then test "$ac_cv_search_gdbm_open" = "none required" || LIBS="$ac_cv_search_gdbm_open $LIBS" else : fi TARGET_GDBM_LIBS="$LIBS" fi fi ########## # Figure out where to get the GDBM header files. # if $use_gdbm; then echo $ac_n "checking GDBM header files""... $ac_c" 1>&6 echo "configure:1503: checking GDBM header files" >&5 found=no if test "$config_TARGET_GDBM_INC" != ""; then TARGET_GDBM_INC=$config_TARGET_GDBM_INC found=yes fi if test "$found" = "yes"; then echo "$ac_t""$TARGET_GDBM_INC" 1>&6 else echo "$ac_t""not specified: still searching..." 1>&6 ac_safe=`echo "gdbm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for gdbm.h""... $ac_c" 1>&6 echo "configure:1515: checking for gdbm.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 1520 "configure" #include "confdefs.h" #include <gdbm.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1525: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 found=yes else echo "$ac_t""no" 1>&6 fi fi if test "$found" = "no"; then for dir in /usr/local /usr/pkg /usr/contrib; do ac_safe=`echo "$dir/include/gdbm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/gdbm.h""... $ac_c" 1>&6 echo "configure:1552: checking for $dir/include/gdbm.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then { echo "configure: error: Cannot check for file existence when cross compiling" 1>&2; exit 1; } else if test -r $dir/include/gdbm.h; then |
︙ | ︙ | |||
1549 1550 1551 1552 1553 1554 1555 | echo "$ac_t""yes" 1>&6 found=yes else echo "$ac_t""no" 1>&6 fi | | | | | | > > > | | | | | | 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 | echo "$ac_t""yes" 1>&6 found=yes else echo "$ac_t""no" 1>&6 fi if test "$found" = "yes"; then TARGET_GDBM_INC="-I$dir/include" break fi done fi else TARGET_GDBM_INC="-DDISABLE_GDBM" fi ########## # Figure out what C libraries are required to compile programs # that use "readline()" library. # if test "$config_TARGET_READLINE_LIBS" != ""; then TARGET_READLINE_LIBS="$config_TARGET_READLINE_LIBS" else CC=$TARGET_CC LIBS="" echo $ac_n "checking for library containing readline""... $ac_c" 1>&6 echo "configure:1596: checking for library containing readline" >&5 if eval "test \"`echo '$''{'ac_cv_search_readline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_readline="no" cat > conftest.$ac_ext <<EOF #line 1603 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char readline(); int main() { readline() ; return 0; } EOF if { (eval echo configure:1614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_readline="none required" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* test "$ac_cv_search_readline" = "no" && for i in readline; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <<EOF #line 1625 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char readline(); int main() { readline() ; return 0; } EOF if { (eval echo configure:1636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_readline="-l$i" break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi |
︙ | ︙ | |||
1636 1637 1638 1639 1640 1641 1642 | fi ########## # Figure out where to get the READLINE header files. # echo $ac_n "checking readline header files""... $ac_c" 1>&6 | | | | | | 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 | fi ########## # Figure out where to get the READLINE header files. # echo $ac_n "checking readline header files""... $ac_c" 1>&6 echo "configure:1664: checking readline header files" >&5 found=no if test "$config_TARGET_READLINE_INC" != ""; then TARGET_READLINE_INC=$config_TARGET_READLINE_INC found=yes fi if test "$found" = "yes"; then echo "$ac_t""$TARGET_READLINE_INC" 1>&6 else echo "$ac_t""not specified: still searching..." 1>&6 ac_safe=`echo "readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for readline.h""... $ac_c" 1>&6 echo "configure:1676: checking for readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 1681 "configure" #include "confdefs.h" #include <readline.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 |
︙ | ︙ | |||
1685 1686 1687 1688 1689 1690 1691 | fi if test "$found" = "no"; then for dir in /usr /usr/local /usr/local/readline /usr/contrib; do ac_safe=`echo "$dir/include/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline.h""... $ac_c" 1>&6 | | | 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 | fi if test "$found" = "no"; then for dir in /usr /usr/local /usr/local/readline /usr/contrib; do ac_safe=`echo "$dir/include/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline.h""... $ac_c" 1>&6 echo "configure:1713: checking for $dir/include/readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then { echo "configure: error: Cannot check for file existence when cross compiling" 1>&2; exit 1; } else if test -r $dir/include/readline.h; then |
︙ | ︙ | |||
1714 1715 1716 1717 1718 1719 1720 | if test "$found" = "yes"; then TARGET_READLINE_INC="-I$dir/include" break fi ac_safe=`echo "$dir/include/readline/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline/readline.h""... $ac_c" 1>&6 | | | 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 | if test "$found" = "yes"; then TARGET_READLINE_INC="-I$dir/include" break fi ac_safe=`echo "$dir/include/readline/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline/readline.h""... $ac_c" 1>&6 echo "configure:1742: checking for $dir/include/readline/readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then { echo "configure: error: Cannot check for file existence when cross compiling" 1>&2; exit 1; } else if test -r $dir/include/readline/readline.h; then |
︙ | ︙ | |||
1758 1759 1760 1761 1762 1763 1764 | ######### # Figure out whether or not we have a "usleep()" function. # echo $ac_n "checking for usleep""... $ac_c" 1>&6 | | | | 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 | ######### # Figure out whether or not we have a "usleep()" function. # echo $ac_n "checking for usleep""... $ac_c" 1>&6 echo "configure:1786: checking for usleep" >&5 if eval "test \"`echo '$''{'ac_cv_func_usleep'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF #line 1791 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char usleep(); below. */ #include <assert.h> /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ |
︙ | ︙ | |||
1786 1787 1788 1789 1790 1791 1792 | choke me #else usleep(); #endif ; return 0; } EOF | | | 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 | choke me #else usleep(); #endif ; return 0; } EOF if { (eval echo configure:1814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_usleep=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_usleep=no" |
︙ | ︙ |
Changes to configure.in.
︙ | ︙ | |||
147 148 149 150 151 152 153 | # 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 | | | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | # 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.10 $ ######### # Make sure we are not building in a subdirectory of the source tree. # changequote(<<<,>>>) temp=`echo $srcdir | grep '[^./]'` changequote([,]) |
︙ | ︙ | |||
436 437 438 439 440 441 442 | fi AC_SUBST(TARGET_TCL_INC) ########## # Figure out what C libraries are required to compile programs # that use GDBM. # | > > > > > > > > | | | | | | | | > > | | | | | | | | > > > > > > > > > > > > > < < < < < < < | < < < | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 | fi AC_SUBST(TARGET_TCL_INC) ########## # Figure out what C libraries are required to compile programs # that use GDBM. # use_gdbm=true AC_ARG_ENABLE(gdbm, [ --disable-gdbm Omit the GDBM drivers], use_gdbm=$enableval, use_gdbm=true ) if test "$use_gdbm" = "no"; then use_gdbm=false; fi if test "$use_gdbm" = "yes"; then use_gdbm=true; fi if $use_gdbm; then if test "$config_TARGET_GDBM_LIBS" != ""; then TARGET_GDBM_LIBS="$config_TARGET_GDBM_LIBS" else CC=$TARGET_CC LIBS="" AC_SEARCH_LIBS(gdbm_open, gdbm,,,) TARGET_GDBM_LIBS="$LIBS" fi fi AC_SUBST(TARGET_GDBM_LIBS) ########## # Figure out where to get the GDBM header files. # if $use_gdbm; then AC_MSG_CHECKING([GDBM header files]) found=no if test "$config_TARGET_GDBM_INC" != ""; then TARGET_GDBM_INC=$config_TARGET_GDBM_INC found=yes fi if test "$found" = "yes"; then AC_MSG_RESULT($TARGET_GDBM_INC) else AC_MSG_RESULT(not specified: still searching...) AC_CHECK_HEADER(gdbm.h, [found=yes]) fi if test "$found" = "no"; then for dir in /usr/local /usr/pkg /usr/contrib; do AC_CHECK_FILE($dir/include/gdbm.h, found=yes) if test "$found" = "yes"; then TARGET_GDBM_INC="-I$dir/include" break fi done fi else TARGET_GDBM_INC="-DDISABLE_GDBM" fi AC_SUBST(TARGET_GDBM_INC) ########## # Figure out what C libraries are required to compile programs # that use "readline()" library. # |
︙ | ︙ |
Changes to notes/notes2.txt.
1 2 3 4 5 | How to do a B*Tree insert: add_to_page(cursor, data, ptr){ if( data_fits_on_page ){ add data to page; return; } if( page==root ){ | > | | | > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | How to do a B*Tree insert: add_to_page(cursor, data, ptr){ if( data_fits_on_page ){ add data to page; return; } if( page==root ){ split currentpage+(data+ptr) into lowerpart, center, upperpart newpage1 = lowerpart; newpage2 = upperpart; page = ptr(newpage1) + center + ptr(newpage2); return; } if( move_some_data_left || move_some_data_right ){ add data to page return } split currentpage+(data+ptr) into lowerpart, center, upperpart newpage = upperpart currentpage = lowerpart pop cursor one level add_to_page(cursor, center, ptr(newpage)); } unlink_entry(cursor, olddata){ if( !is_a_leaf ){ n = next_entry() if( n fits pageof(cursor) ){ if( olddata!=nil ) copy dataof(cursor) into olddata copy dataof(n) into dataof(cursor) unlink_entry(n, nil) return } n = prev_entry() if( n fits pageof(cursor) ){ if( olddata!=nil ) copy dataof(cursor) into olddata copy dataof(n) into dataof(cursor) unlink_entry(n, nil) return } unlink_entry(n, leafdata) move cursor data and ptr into olddata, oldptr add_to_page(cursor, leafdata, oldptr) return } move cursor data into olddata if( !underfull(pageof(cursor)) ) return } |
Changes to src/btree.c.
︙ | ︙ | |||
17 18 19 20 21 22 23 | ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** $Id: btree.c,v 1.2 2001/04/28 16:52:41 drh Exp $ */ #include "sqliteInt.h" #include "pager.h" #include "btree.h" #include <assert.h> typedef unsigned int u32; /* ** The maximum number of database entries that can be held in a single ** page of the database. Each entry has a 16-byte header consisting of ** 4 unsigned 32-bit numbers, as follows: ** ** nKey Number of byte in the key ** nData Number of byte in the data ** pgno Page number of the right child block ** next index in MemPage.aPage[] of the next entry in sorted order ** ** The key and data follow this header. The key and data are packed together ** and the total rounded up to the next multiple of 4 bytes. There must ** be at least 4 bytes in the key/data packet, so each entry consumes at ** least 20 bytes of space on the page. */ #define MX_CELL (SQLITE_PAGE_SIZE/20) /* ** Freeblocks are divided by cells, so there can be at most one more ** free block than there are cells. */ #define MX_FREE (MX_CELL+1) /* ** The maximum amount of data (in bytes) that can be stored locally for a ** database entry. If the entry contains more data than this, the ** extra goes onto overflow pages. */ #define MX_LOCAL_PAYLOAD ((SQLITE_PAGE_SIZE-20-4*24)/4) /* ** On a single disk page, there are sections of the page that are used ** to hold data and sections that are unused and available for holding ** new data. A single instance of this structure describes a contiguous ** block of free space on a disk page. */ struct FreeBlk { int idx; /* Index into MemPage.aPage[] of the start of freeblock */ int size; /* Number of MemPage.aPage[] slots used by this block */ }; typedef struct FreeBlk; /* ** For every page in the database file, an instance of the following structure ** is stored in memory. The aPage[] array contains the data obtained from ** the disk. The rest is auxiliary data that held in memory only. */ struct MemPage { u32 aPage[SQLITE_PAGE_SIZE/sizeof(u32)]; /* Page data stored on disk */ unsigned char isInit; /* True if sequel is initialized */ unsigned char validUp; /* True if MemPage.up is valid */ unsigned char validLeft; /* True if MemPage.left is valid */ unsigned char validRight; /* True if MemPage.right is valid */ Pgno up; /* The parent page. 0 means this is the root */ Pgno left; /* Left sibling page. 0==none */ Pgno right; /* Right sibling page. 0==none */ int idxStart; /* Index in aPage[] of real data */ int nCell; /* Number of entries on this page */ u32 *aCell[MX_CELL]; /* All entires in sorted order */ int nFree; /* Number of free blocks on this page */ int nFreeSlot; /* Number of free elements of aPage[] */ FreeBlk aFree[MX_FREE]; /* Free blocks in no particular order */ } typedef struct MemPage; /* ** 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)-SQLITE_PAGE_SIZE) /* ** Everything we need to know about an open database */ struct Btree { Pager *pPager; /* The page cache */ BtCursor *pCursor; /* All open cursors */ MemPage *page1; /* First page of the database */ int inTrans; /* True if a transaction is current */ }; typedef Btree Bt; /* ** The maximum depth of a cursor */ #define MX_LEVEL 20 /* ** Within a cursor, each level off the search tree is an instance of ** this structure. */ typedef struct BtIdxpt BtIdxpt; struct BtIdxpt { Pgno pgno; /* The page number */ u32 *aPage; /* The page data */ int idx; /* Index into pPage[] */ u32 *aIdx; /* Pointer to pPage[idx] */ }; /* ** Everything we need to know about a cursor */ struct BtCursor { Btree *pBt; /* The whole database */ BtCursor *pPrev, *pNext; /* Linked list of all cursors */ int valid; /* True if the cursor points to something */ int nLevel; /* Number of levels of indexing used */ BtIdxpt *pLevel; /* Pointer to aLevel[nLevel] */ BtIdxpt aLevel[MX_LEVEL]; /* The index levels */ }; /* ** The first page contains the following additional information: ** ** MAGIC-1 ** MAGIC-2 ** First free block */ #define EXTRA_PAGE_1_CELLS 3 #define MAGIC_1 0x7264dc61 #define MAGIC_2 0x54e55d9e /* ** Each database page has a header as follows: ** ** page1_header Extra numbers found on page 1 only. ** leftmost_pgno Page number of the leftmost child ** first_cell Index into MemPage.aPage of first cell ** ** MemPage.pStart always points to the leftmost_pgno. */ /* ** Mark a section of the memory block as in-use. */ static void useSpace(MemPage *pPage, int start, int size){ int i; FreeBlk *p; /* Some basic sanity checking */ assert( pPage && pPage->isInit ); assert( pPage->nFree>0 && pPage->nFree<=MX_FREE ); assert( pPage->nFreeSlot >= size ); assert( start > pPage->idxStart ); assert( size>0 ); assert( start + size < SQLITE_PAGE_SIZE/sizeof(pPage->aPage[0]) ); /* Search for the freeblock that describes the space to be used */ for(i=0; i<pPage->nFree; i++){ p = &pPage->aFree[i] if( p->idx<=start && p->idx+p->size>start ) break; } /* The freeblock must contain all the space that is to be used */ assert( i<pPage->nFree ); assert( p->idx+p->size >= start+size ); /* Remove the used space from the freeblock */ if( p->idx==start ){ /* The space is at the beginning of the block p->size -= size; if( p->size==0 ){ *p = pPage->aFree[pPage->nFree-1]; pPage->nFree--; } }else if( p->idx+p->size==start+size ){ /* Space at the end of the block */ p->size -= size; }else{ /* Space in the middle of the freeblock. We have to split the ** freeblock in two */ /******* TBD *********/ } pPage->nFreeSlot -= size; } /* ** Return a section of the MemPage.aPage[] to the freelist. */ static void freeSpace(MemPage *pPage, int start, int size){ } /* ** Defragment the freespace */ static void defragmentSpace(MemPage *pPage){ } /* ** Initialize the auxiliary information for a disk block. */ static int initPage(MemPage *pPage, Pgno pgnoThis, Pgno pgnoParent){ u32 idx; pPage->isInit = 1; pPage->validUp = 1; pPage->up = pgnoParent; pPage->nFreeSlot = SQLITE_PAGE_SIZE/sizeof(pPage->aPage[0]) - 2; pPage->nFree = 1; if( pgnoThis==1 ){ pPage->idxStart = EXTRA_PAGE_1_CELLS; pPage->nFreeByte -= EXTRA_PAGE_1_CELLS; } pPage->aFree[0].idx = pPage->idxStart + 2; pPage->aFree[0].size = pPage->nFreeByte; pPage->nCell = 0; idx = pPage->aPage[pPage->idxStart+1]; while( idx!=0 ){ int size; pPage->aCell[pPage->nCell++] = idx; size = pPage->aPage[idx] + pPage->aPage[idx+1]; if( size>MX_LOCAL_PAYLOAD ){ if( size>MX_DIRECT_PAYLOAD ){ size = MX_LOCAL_PAYLOAD + 2*sizeof(u32); }else{ size = MX_LOCAL_PAYLOAD + sizeof(u32); } } size = (size + sizeof(u32) - 1)/sizeof(u32) + 4; useSpace(pPage, idx, size); idx = pPage->aPage[idx+3]; } return SQLITE_OK; } /* ** Open a new database */ int sqliteBtreeOpen(const char *zFilename, int mode, Btree **ppBtree){ Btree *pBt; pBt = sqliteMalloc( sizeof(*pBt) ); if( pBt==0 ){ **ppBtree = 0; return SQLITE_NOMEM; } rc = sqlitepager_open(&pBt->pPager, zFilename, 100, EXTRA_SPACE); if( rc!=SQLITE_OK ){ if( pBt->pPager ) sqlitepager_close(pBt->pPager); sqliteFree(pBt); *ppBtree = 0; return rc; } pBt->pCursor = 0; |
︙ | ︙ | |||
118 119 120 121 122 123 124 | /* ** Start a new transaction */ int sqliteBtreeBeginTrans(Btree *pBt){ int rc; if( pBt->inTrans ) return SQLITE_ERROR; if( pBt->page1==0 ){ | | > > > > > > | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 | /* ** Start a new transaction */ int sqliteBtreeBeginTrans(Btree *pBt){ int rc; if( pBt->inTrans ) return SQLITE_ERROR; if( pBt->page1==0 ){ rc = lockBtree(pBt); if( rc!=SQLITE_OK ) return rc; } rc = sqlitepager_write(pBt->page1); if( rc==SQLITE_OK ){ pBt->inTrans = 1; } return rc; } /* ** Get a reference to page1 of the database file. This will ** also acquire a readlock on that file. */ static int lockBtree(Btree *pBt){ int rc; if( pBt->page1 ) return SQLITE_OK; rc = sqlitepager_get(pBt->pPager, 1, &pBt->page1); if( rc!=SQLITE_OK ) return rc; rc = initPage(pBt->page1); if( rc!=SQLITE_OK ){ sqlitepager_unref(pBt->page1); pBt->page1 = 0; return rc; } /* Sanity checking on the database file format */ return rc; } /* ** Remove the last reference to the database file. This will ** remove the read lock. |
︙ | ︙ | |||
233 234 235 236 237 238 239 240 241 242 243 244 245 246 | } if( pBt->pCursor==0 && pBt->inTrans==0 ){ unlockBtree(pBt); } sqliteFree(pCur); } int sqliteBtreeKeySize(BtCursor *pCur){ int nEntry; u32 *aPage; BtIdxpt *pIdx; int offset; if( !pCur->valid ) return 0; pIdx = &pCur->aLevel[pCur->nLevel-1]; | > > > > > | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 | } if( pBt->pCursor==0 && pBt->inTrans==0 ){ unlockBtree(pBt); } sqliteFree(pCur); } /* ** Return the number of bytes in the key of the entry to which ** the cursor is currently point. If the cursor has not been ** initialized or is pointed to a deleted entry, then return 0. */ int sqliteBtreeKeySize(BtCursor *pCur){ int nEntry; u32 *aPage; BtIdxpt *pIdx; int offset; if( !pCur->valid ) return 0; pIdx = &pCur->aLevel[pCur->nLevel-1]; |
︙ | ︙ |
Changes to src/dbbe.c.
︙ | ︙ | |||
26 27 28 29 30 31 32 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses GDBM as the database backend. It should be ** relatively simple to convert to a different database such ** as NDBM, SDBM, or BerkeleyDB. ** | | < > > > < > > > > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses GDBM as the database backend. It should be ** relatively simple to convert to a different database such ** as NDBM, SDBM, or BerkeleyDB. ** ** $Id: dbbe.c,v 1.28 2001/04/28 16:52:41 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* ** This routine opens a new database. It looks at the first ** few characters of the database name to try to determine what ** kind of database to open. If the first characters are "gdbm:", ** then it uses the GDBM driver. If the first few characters are ** "memory:" then it uses the in-memory driver. If there is no ** match, the default to the GDBM driver. ** ** If successful, a pointer to the Dbbe structure is returned. ** If there are errors, an appropriate error message is left ** in *pzErrMsg and NULL is returned. */ Dbbe *sqliteDbbeOpen( const char *zName, /* The name of the database */ int writeFlag, /* True if we will be writing to the database */ int createFlag, /* True to create database if it doesn't exist */ char **pzErrMsg /* Write error messages (if any) here */ ){ extern Dbbe *sqliteMemOpen(const char*,int,int,char**); #ifndef DISABLE_GDBM extern Dbbe *sqliteGdbmOpen(const char*,int,int,char**); if( strncmp(zName, "gdbm:", 5)==0 ){ return sqliteGdbmOpen(&zName[5], writeFlag, createFlag, pzErrMsg); } #endif if( strncmp(zName, "memory:", 7)==0 ){ return sqliteMemOpen(&zName[7], writeFlag, createFlag, pzErrMsg); } #ifndef DISABLE_GDBM return sqliteGdbmOpen(zName, writeFlag, createFlag, pzErrMsg); #else return sqliteMemOpen(zName, writeFlag, createFlag, pzErrMsg); #endif } #if 0 /* NOT USED */ /* ** Translate the name of an SQL table (or index) into the name ** of a file that holds the key/data pairs for that table or ** index. Space to hold the filename is obtained from |
︙ | ︙ |
Changes to src/dbbegdbm.c.
︙ | ︙ | |||
26 27 28 29 30 31 32 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses GDBM as the database backend. It should be ** relatively simple to convert to a different database such ** as NDBM, SDBM, or BerkeleyDB. ** | | > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses GDBM as the database backend. It should be ** relatively simple to convert to a different database such ** as NDBM, SDBM, or BerkeleyDB. ** ** $Id: dbbegdbm.c,v 1.8 2001/04/28 16:52:41 drh Exp $ */ #ifndef DISABLE_GDBM #include "sqliteInt.h" #include <gdbm.h> #include <sys/stat.h> #include <unistd.h> #include <ctype.h> #include <time.h> |
︙ | ︙ | |||
670 671 672 673 674 675 676 | pNew->dbbe.x = &gdbmMethods; pNew->zDir = (char*)&pNew[1]; strcpy(pNew->zDir, zName); pNew->write = writeFlag; pNew->pOpen = 0; return &pNew->dbbe; } | > | 671 672 673 674 675 676 677 678 | pNew->dbbe.x = &gdbmMethods; pNew->zDir = (char*)&pNew[1]; strcpy(pNew->zDir, zName); pNew->write = writeFlag; pNew->pOpen = 0; return &pNew->dbbe; } #endif /* DISABLE_GDBM */ |
Changes to src/dbbemem.c.
︙ | ︙ | |||
26 27 28 29 30 31 32 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses an in-memory hash table as the database backend. ** Nothing is ever written to disk using this backend. All information ** is forgotten when the program exits. ** | | < < < | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ** sqlite and the code that does the actually reading and writing ** of information to the disk. ** ** This file uses an in-memory hash table as the database backend. ** Nothing is ever written to disk using this backend. All information ** is forgotten when the program exits. ** ** $Id: dbbemem.c,v 1.15 2001/04/28 16:52:42 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> typedef struct Array Array; typedef struct ArrayElem ArrayElem; typedef struct Datum Datum; /* A complete associative array is an instance of the following structure. |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
22 23 24 25 26 27 28 | ** ************************************************************************* ** 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. ** | | > > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ** ************************************************************************* ** 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.29 2001/04/28 16:52:42 drh Exp $ */ #include "sqliteInt.h" #if defined(HAVE_USLEEP) && HAVE_USLEEP #include <unistd.h> #endif /* ** This is the callback routine for the code that initializes the ** database. Each callback contains text of a CREATE TABLE or ** CREATE INDEX statement that must be parsed to yield the internal ** structures that describe the tables. ** |
︙ | ︙ |
Changes to src/pager.c.
︙ | ︙ | |||
23 24 25 26 27 28 29 | ************************************************************************* ** This is the implementation of the page cache subsystem. ** ** The page cache is used to access a database file. The pager journals ** all writes in order to support rollback. Locking is used to limit ** access to one or more reader or on writer. ** | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ************************************************************************* ** This is the implementation of the page cache subsystem. ** ** The page cache is used to access a database file. The pager journals ** all writes in order to support rollback. Locking is used to limit ** access to one or more reader or on writer. ** ** @(#) $Id: pager.c,v 1.5 2001/04/28 16:52:42 drh Exp $ */ #include "sqliteInt.h" #include "pager.h" #include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <assert.h> |
︙ | ︙ | |||
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | PgHdr *pNextHash, *pPrevHash; /* Hash collision chain for PgHdr.pgno */ int nRef; /* Number of users of this page */ PgHdr *pNextFree, *pPrevFree; /* Freelist of pages where nRef==0 */ PgHdr *pNextAll, *pPrevAll; /* A list of all pages */ char inJournal; /* TRUE if has been written to journal */ char dirty; /* TRUE if we need to write back changes */ /* SQLITE_PAGE_SIZE bytes of page data follow this header */ }; /* ** Convert a pointer to a PgHdr into a pointer to its data ** and back again. */ #define PGHDR_TO_DATA(P) ((void*)(&(P)[1])) #define DATA_TO_PGHDR(D) (&((PgHdr*)(D))[-1]) /* ** How big to make the hash table used for locating in-memory pages ** by page number. */ #define N_PG_HASH 101 /* ** A open page cache is an instance of the following structure. */ struct Pager { char *zFilename; /* Name of the database file */ char *zJournal; /* Name of the journal file */ int fd, jfd; /* File descriptors for database and journal */ int dbSize; /* Number of pages in the file */ int origDbSize; /* dbSize before the current change */ 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 */ int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */ unsigned char state; /* SQLITE_UNLOCK, _READLOCK or _WRITELOCK */ unsigned char errMask; /* One of several kinds of errors */ PgHdr *pFirst, *pLast; /* List of free pages */ | > > > | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | PgHdr *pNextHash, *pPrevHash; /* Hash collision chain for PgHdr.pgno */ int nRef; /* Number of users of this page */ PgHdr *pNextFree, *pPrevFree; /* Freelist of pages where nRef==0 */ PgHdr *pNextAll, *pPrevAll; /* A list of all pages */ char inJournal; /* TRUE if has been written to journal */ char dirty; /* TRUE if we need to write back changes */ /* SQLITE_PAGE_SIZE bytes of page data follow this header */ /* Pager.nExtra bytes of local data follow the page data */ }; /* ** Convert a pointer to a PgHdr into a pointer to its data ** and back again. */ #define PGHDR_TO_DATA(P) ((void*)(&(P)[1])) #define DATA_TO_PGHDR(D) (&((PgHdr*)(D))[-1]) #define PGHDR_TO_EXTRA(P) ((void*)&((char*)(&(P)[1]))[SQLITE_PAGE_SIZE]) /* ** How big to make the hash table used for locating in-memory pages ** by page number. */ #define N_PG_HASH 101 /* ** A open page cache is an instance of the following structure. */ struct Pager { char *zFilename; /* Name of the database file */ char *zJournal; /* Name of the journal file */ int fd, jfd; /* File descriptors for database and journal */ int dbSize; /* Number of pages in the file */ int origDbSize; /* dbSize before the current change */ int nExtra; /* Add this many bytes to each in-memory 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 */ int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */ unsigned char state; /* SQLITE_UNLOCK, _READLOCK or _WRITELOCK */ unsigned char errMask; /* One of several kinds of errors */ PgHdr *pFirst, *pLast; /* List of free pages */ |
︙ | ︙ | |||
423 424 425 426 427 428 429 | /* ** 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 opened until ** the first call to sqlitepager_get() and is only held open until the ** last page is released using sqlitepager_unref(). */ | | > > > > > | 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 | /* ** 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 opened until ** the first call to sqlitepager_get() and is only held open until the ** last page is released using sqlitepager_unref(). */ int sqlitepager_open( Pager **ppPager, /* Return the Pager structure here */ const char *zFilename, /* Name of the database file to open */ int mxPage, /* Max number of in-memory cache pages */ int nExtra /* Extra bytes append to each in-memory page */ ){ Pager *pPager; int nameLen; int fd; *ppPager = 0; if( sqlite_malloc_failed ){ return SQLITE_NOMEM; |
︙ | ︙ | |||
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 | /* ** Return the page number for the given page data */ Pgno sqlitepager_pagenumber(void *pData){ PgHdr *p = DATA_TO_PGHDR(pData); return p->pgno; } /* ** Acquire a page. ** ** A read lock is obtained for the first page acquired. The lock ** is dropped when the last page is released. ** ** The acquisition might fail for several reasons. In all cases, ** an appropriate error code is returned and *ppPage is set to NULL. */ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ PgHdr *pPg; /* Make sure we have not hit any critical errors. */ if( pPager==0 || pgno==0 ){ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 | /* ** Return the page number for the given page data */ Pgno sqlitepager_pagenumber(void *pData){ PgHdr *p = DATA_TO_PGHDR(pData); return p->pgno; } /* ** Increment 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. */ static void sqlitepager_ref(PgHdr *pPg){ if( pPg->nRef==0 ){ /* The page is currently on the freelist. Remove it. */ if( pPg->pPrevFree ){ pPg->pPrevFree->pNextFree = pPg->pNextFree; }else{ pPg->pPager->pFirst = pPg->pNextFree; } if( pPg->pNextFree ){ pPg->pNextFree->pPrevFree = pPg->pPrevFree; }else{ pPg->pPager->pLast = pPg->pPrevFree; } pPg->pPager->nRef++; } pPg->nRef++; } /* ** Acquire a page. ** ** A read lock is obtained for the first page acquired. The lock ** is dropped when the last page is released. ** ** The acquisition might fail for several reasons. In all cases, ** an appropriate error code is returned and *ppPage is set to NULL. ** ** See also sqlitepager_lookup(). Both this routine and _lookup() attempt ** to find a page in the in-memory cache first. If the page is not already ** in cache, 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. */ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){ PgHdr *pPg; /* Make sure we have not hit any critical errors. */ if( pPager==0 || pgno==0 ){ |
︙ | ︙ | |||
592 593 594 595 596 597 598 | */ rc = pager_playback(pPager); if( rc!=SQLITE_OK ){ return rc; } } pPg = 0; | < < > | | 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 | */ rc = pager_playback(pPager); if( rc!=SQLITE_OK ){ return rc; } } pPg = 0; }else{ /* Search for page in cache */ pPg = pager_lookup(pPager, pgno); } if( pPg==0 ){ /* The requested page is not in the page cache. */ int h; pPager->nMiss++; if( pPager->nPage<pPager->mxPage || pPager->pFirst==0 ){ /* Create a new page */ pPg = sqliteMalloc( sizeof(*pPg) + SQLITE_PAGE_SIZE + pPager->nExtra ); if( pPg==0 ){ *ppPage = 0; pager_unwritelock(pPager); pPager->errMask |= PAGER_ERR_MEM; return SQLITE_NOMEM; } pPg->pPager = pPager; |
︙ | ︙ | |||
687 688 689 690 691 692 693 694 695 | pPager->aHash[h] = pPg; if( pPg->pNextHash ){ assert( pPg->pNextHash->pPrevHash==0 ); pPg->pNextHash->pPrevHash = pPg; } pager_seek(pPager->fd, (pgno-1)*SQLITE_PAGE_SIZE); pager_read(pPager->fd, PGHDR_TO_DATA(pPg), SQLITE_PAGE_SIZE); }else{ /* The requested page is in the page cache. */ | > > > < < < < < | > | | > > | > > > > > > > > > > > > > | > > | > | | > | | > > > > | < | 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 | pPager->aHash[h] = pPg; if( pPg->pNextHash ){ assert( pPg->pNextHash->pPrevHash==0 ); pPg->pNextHash->pPrevHash = pPg; } pager_seek(pPager->fd, (pgno-1)*SQLITE_PAGE_SIZE); pager_read(pPager->fd, PGHDR_TO_DATA(pPg), SQLITE_PAGE_SIZE); if( pPager->nExtra>0 ){ memset(PGHDR_TO_EXTRA(pPg), 0, pPager->nExtra); } }else{ /* The requested page is in the page cache. */ pPager->nHit++; sqlitepager_ref(pPg); } *ppPage = PGHDR_TO_DATA(pPg); return SQLITE_OK; } /* ** 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 sqlitepager_get(). The difference between this routine ** and sqlitepager_get() 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 and no disk I/O ever ** occurs. */ void *sqlitepager_lookup(Pager *pPager, Pgno pgno){ PgHdr *pPg; /* Make sure we have not hit any critical errors. */ if( pPager==0 || pgno==0 ){ return 0; } if( pPager->errMask & ~(PAGER_ERR_FULL) ){ return 0; } if( pPager->nRef==0 ){ return 0; } pPg = pager_lookup(pPager, pgno); if( pPg==0 ) return 0; sqlitepager_ref(pPg); return PGHDR_TO_DATA(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 |
︙ | ︙ |
Changes to src/pager.h.
︙ | ︙ | |||
21 22 23 24 25 26 27 | ** http://www.hwaci.com/drh/ ** ************************************************************************* ** 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. ** | | | > < | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ** http://www.hwaci.com/drh/ ** ************************************************************************* ** 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.3 2001/04/28 16:52:42 drh Exp $ */ /* ** The size of one page */ #define SQLITE_PAGE_SIZE 1024 /* ** 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; int sqlitepager_open(Pager **ppPager, const char *zFilename,int nPage,int nEx); int sqlitepager_close(Pager *pPager); int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage); void *sqlitepager_lookup(Pager *pPager, Pgno pgno); int sqlitepager_unref(void*); Pgno sqlitepager_pagenumber(void*); int sqlitepager_write(void*); int sqlitepager_pagecount(Pager*); int sqlitepager_commit(Pager*); int sqlitepager_rollback(Pager*); int *sqlitepager_stats(Pager*); |
Changes to src/sqliteInt.h.
︙ | ︙ | |||
19 20 21 22 23 24 25 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Internal interface definitions for SQLite. ** | | > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Internal interface definitions for SQLite. ** ** @(#) $Id: sqliteInt.h,v 1.42 2001/04/28 16:52:42 drh Exp $ */ #include "sqlite.h" #include "dbbe.h" #include "vdbe.h" #include "parse.h" #ifndef DISABLE_GDBM #include <gdbm.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> /* ** The paging system deals with 32-bit integers. |
︙ | ︙ |
Changes to src/test2.c.
︙ | ︙ | |||
21 22 23 24 25 26 27 | ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Code for testing the pager.c module in SQLite. This code ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** | | | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Code for testing the pager.c module in SQLite. This code ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** ** $Id: test2.c,v 1.2 2001/04/28 16:52:42 drh Exp $ */ #include "sqliteInt.h" #include "pager.h" #include "tcl.h" #include <stdlib.h> #include <string.h> |
︙ | ︙ | |||
76 77 78 79 80 81 82 | char zBuf[100]; if( argc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " FILENAME N-PAGE\"", 0); return TCL_ERROR; } if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR; | | | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | char zBuf[100]; if( argc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " FILENAME N-PAGE\"", 0); return TCL_ERROR; } if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR; rc = sqlitepager_open(&pPager, argv[1], nPage, 0); if( rc!=SQLITE_OK ){ Tcl_AppendResult(interp, errorName(rc), 0); return TCL_ERROR; } sprintf(zBuf,"0x%x",(int)pPager); Tcl_AppendResult(interp, zBuf, 0); return TCL_OK; |
︙ | ︙ | |||
256 257 258 259 260 261 262 263 264 265 266 267 268 269 | Tcl_AppendResult(interp, errorName(rc), 0); return TCL_ERROR; } sprintf(zBuf,"0x%x",(int)pPage); Tcl_AppendResult(interp, zBuf, 0); return TCL_OK; } /* ** Usage: page_unref PAGE ** ** Drop a pointer to a page. */ static int page_unref( | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | Tcl_AppendResult(interp, errorName(rc), 0); return TCL_ERROR; } sprintf(zBuf,"0x%x",(int)pPage); Tcl_AppendResult(interp, zBuf, 0); return TCL_OK; } /* ** Usage: page_lookup ID PGNO ** ** Return a pointer to a page if the page is already in cache. ** If not in cache, return an empty string. */ static int page_lookup( void *NotUsed, Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int argc, /* Number of arguments */ char **argv /* Text of each argument */ ){ Pager *pPager; char zBuf[100]; void *pPage; int pgno; if( argc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ID PGNO\"", 0); return TCL_ERROR; } if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR; if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR; pPage = sqlitepager_lookup(pPager, pgno); if( pPage ){ sprintf(zBuf,"0x%x",(int)pPage); Tcl_AppendResult(interp, zBuf, 0); } return TCL_OK; } /* ** Usage: page_unref PAGE ** ** Drop a pointer to a page. */ static int page_unref( |
︙ | ︙ | |||
372 373 374 375 376 377 378 379 380 381 382 383 384 | Tcl_CreateCommand(interp, "pager_open", pager_open, 0, 0); Tcl_CreateCommand(interp, "pager_close", pager_close, 0, 0); Tcl_CreateCommand(interp, "pager_commit", pager_commit, 0, 0); Tcl_CreateCommand(interp, "pager_rollback", pager_rollback, 0, 0); Tcl_CreateCommand(interp, "pager_stats", pager_stats, 0, 0); Tcl_CreateCommand(interp, "pager_pagecount", pager_pagecount, 0, 0); Tcl_CreateCommand(interp, "page_get", page_get, 0, 0); Tcl_CreateCommand(interp, "page_unref", page_unref, 0, 0); Tcl_CreateCommand(interp, "page_read", page_read, 0, 0); Tcl_CreateCommand(interp, "page_write", page_write, 0, 0); Tcl_CreateCommand(interp, "page_number", page_number, 0, 0); return TCL_OK; } | > | 403 404 405 406 407 408 409 410 411 412 413 414 415 416 | Tcl_CreateCommand(interp, "pager_open", pager_open, 0, 0); Tcl_CreateCommand(interp, "pager_close", pager_close, 0, 0); Tcl_CreateCommand(interp, "pager_commit", pager_commit, 0, 0); Tcl_CreateCommand(interp, "pager_rollback", pager_rollback, 0, 0); Tcl_CreateCommand(interp, "pager_stats", pager_stats, 0, 0); Tcl_CreateCommand(interp, "pager_pagecount", pager_pagecount, 0, 0); Tcl_CreateCommand(interp, "page_get", page_get, 0, 0); Tcl_CreateCommand(interp, "page_lookup", page_lookup, 0, 0); Tcl_CreateCommand(interp, "page_unref", page_unref, 0, 0); Tcl_CreateCommand(interp, "page_read", page_read, 0, 0); Tcl_CreateCommand(interp, "page_write", page_write, 0, 0); Tcl_CreateCommand(interp, "page_number", page_number, 0, 0); return TCL_OK; } |
Changes to src/vdbe.c.
︙ | ︙ | |||
37 38 39 40 41 42 43 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** | | < | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** ** $Id: vdbe.c,v 1.58 2001/04/28 16:52:42 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* ** SQL is translated into a sequence of instructions to be ** executed by a virtual machine. Each instruction is an instance ** of the following structure. */ |
︙ | ︙ |
Changes to test/expr.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing expressions. # | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing expressions. # # $Id: expr.test,v 1.14 2001/04/28 16:52:42 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a table to work with. # execsql {CREATE TABLE test1(i1 int, i2 int, r1 real, r2 real, t1 text, t2 text)} |
︙ | ︙ | |||
176 177 178 179 180 181 182 | test_expr expr-5.23 "t1='ax\uFEDC', t2='A_%'" {t1 LIKE t2} 1 test_expr expr-5.24 "t1='ax\uFEDCy\uFEDC', t2='A%\uFEDC'" {t1 LIKE t2} 1 } # Theses tests are for when SQLite assumes iso8859 characters. # if {[sqlite -encoding]=="iso8859"} { | > > | > > > > > | | | | > | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | test_expr expr-5.23 "t1='ax\uFEDC', t2='A_%'" {t1 LIKE t2} 1 test_expr expr-5.24 "t1='ax\uFEDCy\uFEDC', t2='A%\uFEDC'" {t1 LIKE t2} 1 } # Theses tests are for when SQLite assumes iso8859 characters. # if {[sqlite -encoding]=="iso8859"} { set go 1 if {[info command encoding]!=""} { if {[catch {encoding system iso8859-1} msg]} { puts "skipping tests of LIKE operator: $msg" set go 0 } } if {$go} { test_expr expr-5.50 "t1='a\266c', t2='A_C'" {t1 LIKE t2} 1 test_expr expr-5.51 "t1='a\347', t2='A_'" {t1 LIKE t2} 1 test_expr expr-5.52 "t1='ax\351', t2='A_\351'" {t1 LIKE t2} 1 test_expr expr-5.53 "t1='ax\241', t2='A_%'" {t1 LIKE t2} 1 } } test_expr expr-6.1 {t1='abc', t2='xyz'} {t1 GLOB t2} 0 test_expr expr-6.2 {t1='abc', t2='ABC'} {t1 GLOB t2} 0 test_expr expr-6.3 {t1='abc', t2='A?C'} {t1 GLOB t2} 0 test_expr expr-6.4 {t1='abc', t2='a?c'} {t1 GLOB t2} 1 test_expr expr-6.5 {t1='abc', t2='abc?'} {t1 GLOB t2} 0 |
︙ | ︙ | |||
233 234 235 236 237 238 239 | test_expr expr-6.40 "t1='a\u1234b', t2='a\[a-\u1234\]b'" {t1 GLOB t2} 1 test_expr expr-6.41 "t1='a\u1234b', t2='a\[a-\u1233\]b'" {t1 GLOB t2} 0 } # Theses tests are for when SQLite assumes iso8859 characters. # if {[sqlite -encoding]=="iso8859"} { | > > | > > > > > | | | | | | | | | | | | | > | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | test_expr expr-6.40 "t1='a\u1234b', t2='a\[a-\u1234\]b'" {t1 GLOB t2} 1 test_expr expr-6.41 "t1='a\u1234b', t2='a\[a-\u1233\]b'" {t1 GLOB t2} 0 } # Theses tests are for when SQLite assumes iso8859 characters. # if {[sqlite -encoding]=="iso8859"} { set go 1 if {[info command encoding]!=""} { if {[catch {encoding system iso8859-1} msg]} { puts "skipping tests of GLOB operator: $msg" set go 0 } } if {$go} { test_expr expr-6.50 "t1='a\266c', t2='a?c'" {t1 GLOB t2} 1 test_expr expr-6.51 "t1='a\266', t2='a?'" {t1 GLOB t2} 1 test_expr expr-6.52 "t1='a\266', t2='a??'" {t1 GLOB t2} 0 test_expr expr-6.53 "t1='ax\266', t2='a??'" {t1 GLOB t2} 1 test_expr expr-6.54 "t1='ax\266', t2='a?\266'" {t1 GLOB t2} 1 test_expr expr-6.55 "t1='ax\266y\266', t2='a*\266'" {t1 GLOB t2} 1 test_expr expr-6.56 "t1='a\266b', t2='a\[x\266y\]b'" {t1 GLOB t2} 1 test_expr expr-6.57 "t1='a\266b', t2='a\[\260-\270\]b'" {t1 GLOB t2} 1 test_expr expr-6.58 "t1='a\266b', t2='a\[\266-\270\]b'" {t1 GLOB t2} 1 test_expr expr-6.59 "t1='a\266b', t2='a\[\267-\270\]b'" {t1 GLOB t2} 0 test_expr expr-6.60 "t1='a\266b', t2='a\[x-\267\]b'" {t1 GLOB t2} 1 test_expr expr-6.61 "t1='a\266b', t2='a\[x-\266\]b'" {t1 GLOB t2} 1 test_expr expr-6.62 "t1='a\266b', t2='a\[x-\265\]b'" {t1 GLOB t2} 0 } } # The sqliteExprIfFalse and sqliteExprIfTrue routines are only # executed as part of a WHERE clause. Create a table suitable # for testing these functions. # execsql {DROP TABLE test1} |
︙ | ︙ |