Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Obj-ify tclsqlite (CVS 146) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
85a4254ef0998fac06ddc285decd7934 |
User & Date: | drh 2000-09-21 13:01:36.000 |
Context
2000-09-29
| ||
13:30 | :-) (CVS 147) (check-in: e11f7527f9 user: drh tags: trunk) | |
2000-09-21
| ||
13:01 | Obj-ify tclsqlite (CVS 146) (check-in: 85a4254ef0 user: drh tags: trunk) | |
2000-09-14
| ||
01:25 | Version 1.0.5 (CVS 495) (check-in: 84839d8764 user: drh tags: trunk) | |
Changes
Changes to Makefile.in.
︙ | ︙ | |||
45 46 47 48 49 50 51 | # LIBREADLINE = @TARGET_READLINE_LIBS@ # Object files for the SQLite library. # LIBOBJ = build.o dbbe.o delete.o expr.o insert.o \ main.o parse.o select.o tokenize.o update.o \ | | | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # LIBREADLINE = @TARGET_READLINE_LIBS@ # Object files for the SQLite library. # LIBOBJ = build.o dbbe.o delete.o expr.o insert.o \ main.o parse.o select.o tokenize.o update.o \ util.o vdbe.o where.o tclsqlite.o # All of the source code files. # SRC = \ $(TOP)/src/build.c \ $(TOP)/src/dbbe.c \ $(TOP)/src/dbbe.h \ |
︙ | ︙ | |||
153 154 155 156 157 158 159 160 161 162 163 164 165 166 | select.o: $(TOP)/src/select.c $(HDR) $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/select.c update.o: $(TOP)/src/update.c $(HDR) $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/update.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) | > > > | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | select.o: $(TOP)/src/select.c $(HDR) $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/select.c update.o: $(TOP)/src/update.c $(HDR) $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/update.c tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) $(TCC) $(GDBM_FLAGS) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.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) |
︙ | ︙ |
Changes to configure.
︙ | ︙ | |||
521 522 523 524 525 526 527 | else ac_n= ac_c='\c' ac_t= fi # The following RCS revision string applies to configure.in | | | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | else ac_n= ac_c='\c' ac_t= fi # The following RCS revision string applies to configure.in # $Revision: 1.7 $ ######### # Make sure we are not building in a subdirectory of the source tree. # temp=`echo $srcdir | grep '[^./]'` |
︙ | ︙ | |||
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 | if test "$found" = "yes"; then TARGET_TCL_INC="-I$dir/include" break fi done fi ########## # Figure out what C libraries are required to compile programs # that use GDBM. # 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 | > > > | | | | | | 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 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 | if test "$found" = "yes"; then TARGET_TCL_INC="-I$dir/include" break fi done fi if test "$found" = "no"; then TARGET_TCL_INC="-DNO_TCL=1" fi ########## # Figure out what C libraries are required to compile programs # that use GDBM. # 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:1394: 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 1401 "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:1412: \"$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 1423 "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:1434: \"$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 |
︙ | ︙ | |||
1451 1452 1453 1454 1455 1456 1457 | fi ########## # Figure out where to get the GDBM header files. # echo $ac_n "checking GDBM header files""... $ac_c" 1>&6 | | | | | | 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 | fi ########## # Figure out where to get the GDBM header files. # echo $ac_n "checking GDBM header files""... $ac_c" 1>&6 echo "configure:1462: 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:1474: 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 1479 "configure" #include "confdefs.h" #include <gdbm.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1484: \"$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 |
︙ | ︙ | |||
1500 1501 1502 1503 1504 1505 1506 | 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 | | | 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 | 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:1511: 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 |
︙ | ︙ | |||
1541 1542 1543 1544 1545 1546 1547 | 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 | | | | | | | 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 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 | 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:1552: 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 1559 "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:1570: \"$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 1581 "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:1592: \"$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 |
︙ | ︙ | |||
1609 1610 1611 1612 1613 1614 1615 | fi ########## # Figure out where to get the READLINE header files. # echo $ac_n "checking readline header files""... $ac_c" 1>&6 | | | | | | 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 1643 1644 1645 1646 1647 1648 | fi ########## # Figure out where to get the READLINE header files. # echo $ac_n "checking readline header files""... $ac_c" 1>&6 echo "configure:1620: 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:1632: 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 1637 "configure" #include "confdefs.h" #include <readline.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1642: \"$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 |
︙ | ︙ | |||
1658 1659 1660 1661 1662 1663 1664 | 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 | | | 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 | 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:1669: 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 |
︙ | ︙ | |||
1687 1688 1689 1690 1691 1692 1693 | 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 | | | 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 | 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:1698: 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 |
︙ | ︙ | |||
1731 1732 1733 1734 1735 1736 1737 | ######### # Figure out whether or not we have a "usleep()" function. # echo $ac_n "checking for usleep""... $ac_c" 1>&6 | | | | 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 | ######### # Figure out whether or not we have a "usleep()" function. # echo $ac_n "checking for usleep""... $ac_c" 1>&6 echo "configure:1742: 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 1747 "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. */ |
︙ | ︙ | |||
1759 1760 1761 1762 1763 1764 1765 | choke me #else usleep(); #endif ; return 0; } EOF | | | 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 | choke me #else usleep(); #endif ; return 0; } EOF if { (eval echo configure:1770: \"$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.7 $ ######### # Make sure we are not building in a subdirectory of the source tree. # changequote(<<<,>>>) temp=`echo $srcdir | grep '[^./]'` changequote([,]) |
︙ | ︙ | |||
411 412 413 414 415 416 417 418 419 420 421 422 423 424 | for dir in /usr/local /usr/X11* /usr/pkg /usr/contrib /usr; do AC_CHECK_FILE($dir/include/tcl.h, found=yes) if test "$found" = "yes"; then TARGET_TCL_INC="-I$dir/include" break fi done fi AC_SUBST(TARGET_TCL_INC) ########## # Figure out what C libraries are required to compile programs # that use GDBM. # | > > > | 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 | for dir in /usr/local /usr/X11* /usr/pkg /usr/contrib /usr; do AC_CHECK_FILE($dir/include/tcl.h, found=yes) if test "$found" = "yes"; then TARGET_TCL_INC="-I$dir/include" break fi done fi if test "$found" = "no"; then TARGET_TCL_INC="-DNO_TCL=1" fi AC_SUBST(TARGET_TCL_INC) ########## # Figure out what C libraries are required to compile programs # that use GDBM. # |
︙ | ︙ |
Changes to src/tclsqlite.c.
︙ | ︙ | |||
19 20 21 22 23 24 25 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** A TCL Interface to SQLite ** | | > > | | | 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 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** A TCL Interface to SQLite ** ** $Id: tclsqlite.c,v 1.9 2000/09/21 13:01:37 drh Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ #include "sqlite.h" #include <tcl.h> #include <stdlib.h> #include <string.h> /* ** There is one instance of this structure for each SQLite database ** that has been opened by the SQLite TCL interface. */ typedef struct SqliteDb SqliteDb; struct SqliteDb { sqlite *db; /* The "real" database structure */ Tcl_Interp *interp; /* The interpreter used for this database */ char *zBusy; /* The busy callback routine */ }; /* ** An instance of this structure passes information thru the sqlite ** logic from the original TCL command into the callback routine. */ typedef struct CallbackData CallbackData; struct CallbackData { Tcl_Interp *interp; /* The TCL interpreter */ char *zArray; /* The array into which data is written */ Tcl_Obj *pCode; /* The code to execute for each row */ int once; /* Set only for the first invocation of callback */ }; /* ** Called for each row of the result. */ static int DbEvalCallback( |
︙ | ︙ | |||
80 81 82 83 84 85 86 | for(i=0; i<nCol; i++){ char *z = azCol[i]; if( z==0 ) z = ""; Tcl_SetVar(cbData->interp, azN[i], z, 0); } } cbData->once = 0; | | > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | for(i=0; i<nCol; i++){ char *z = azCol[i]; if( z==0 ) z = ""; Tcl_SetVar(cbData->interp, azN[i], z, 0); } } cbData->once = 0; rc = Tcl_EvalObj(cbData->interp, cbData->pCode); return rc; } /* ** This is an alternative callback for database queries. Instead ** of invoking a TCL script to handle the result, this callback just ** appends each column of the result to a list. After the query ** is complete, the list is returned. */ static int DbEvalCallback2( void *clientData, /* An instance of CallbackData */ int nCol, /* Number of columns in the result */ char ** azCol, /* Data for each column */ char ** azN /* Name for each column */ ){ Tcl_Obj *pList = (Tcl_Obj*)clientData; int i; for(i=0; i<nCol; i++){ Tcl_Obj *pElem; if( azCol[i] && *azCol[i] ){ pElem = Tcl_NewStringObj(azCol[i], -1); }else{ pElem = Tcl_NewObj(); } Tcl_ListObjAppendElement(0, pList, pElem); } return 0; } /* ** Called when the command is deleted. */ static void DbDeleteCmd(void *db){ SqliteDb *pDb = (SqliteDb*)db; sqlite_close(pDb->db); |
︙ | ︙ | |||
135 136 137 138 139 140 141 | ** sqlite db1 "my_database" ** db1 close ** ** The first command opens a connection to the "my_database" database ** and calls that connection "db1". The second command causes this ** subroutine to be invoked. */ | | < < > > > > > > > > | < | < > | > | > | | < | | > > < > | | < | | > > > | > | | | > | | > | | < | | > | > | > | < | > > | | | > > | > > > | > > < > | | < | | < | < < < < < < > | 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 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 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 | ** sqlite db1 "my_database" ** db1 close ** ** The first command opens a connection to the "my_database" database ** and calls that connection "db1". The second command causes this ** subroutine to be invoked. */ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ SqliteDb *pDb = (SqliteDb*)cd; int choice; static char *DB_optStrs[] = { "busy", "close", "complete", "eval", "timeout" }; enum DB_opts { DB_BUSY, DB_CLOSE, DB_COMPLETE, DB_EVAL, DB_TIMEOUT }; if( objc<2 ){ Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ..."); return TCL_ERROR; } if( Tcl_GetIndexFromObj(interp, objv[1], DB_optStrs, "option", 0, &choice) ){ return TCL_ERROR; } switch( (enum DB_opts)choice ){ /* $db busy ?CALLBACK? ** ** Invoke the given callback if an SQL statement attempts to open ** a locked database file. */ case DB_BUSY: { if( objc>3 ){ Tcl_WrongNumArgs(interp, 2, objv, "CALLBACK"); return TCL_ERROR; }else if( objc==2 ){ if( pDb->zBusy ){ Tcl_AppendResult(interp, pDb->zBusy, 0); } }else{ char *zBusy; int len; if( pDb->zBusy ){ Tcl_Free(pDb->zBusy); } zBusy = Tcl_GetStringFromObj(objv[2], &len); if( zBusy && len>0 ){ pDb->zBusy = Tcl_Alloc( len + 1 ); strcpy(pDb->zBusy, zBusy); }else{ pDb->zBusy = 0; } if( pDb->zBusy ){ pDb->interp = interp; sqlite_busy_handler(pDb->db, DbBusyHandler, pDb); }else{ sqlite_busy_handler(pDb->db, 0, 0); } } break; } /* $db close ** ** Shutdown the database */ case DB_CLOSE: { Tcl_DeleteCommand(interp, Tcl_GetStringFromObj(objv[0], 0)); break; } /* $db complete SQL ** ** Return TRUE if SQL is a complete SQL statement. Return FALSE if ** additional lines of input are needed. This is similar to the ** built-in "info complete" command of Tcl. */ case DB_COMPLETE: { Tcl_Obj *pResult; int isComplete; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 2, objv, "SQL"); return TCL_ERROR; } isComplete = sqlite_complete( Tcl_GetStringFromObj(objv[2], 0) ); pResult = Tcl_GetObjResult(interp); Tcl_SetBooleanObj(pResult, isComplete); break; } /* ** $db eval $sql ?array { ...code... }? ** ** The SQL statement in $sql is evaluated. For each row, the values are ** placed in elements of the array named "array" and ...code... is executed. ** If "array" and "code" are omitted, then no callback is every invoked. ** If "array" is an empty string, then the values are placed in variables ** that have the same name as the fields extracted by the query. */ case DB_EVAL: { CallbackData cbData; char *zErrMsg; char *zSql; int rc; if( objc!=5 && objc!=3 ){ Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?"); return TCL_ERROR; } pDb->interp = interp; zSql = Tcl_GetStringFromObj(objv[2], 0); Tcl_IncrRefCount(objv[2]); if( objc==5 ){ cbData.interp = interp; cbData.once = 1; cbData.zArray = Tcl_GetStringFromObj(objv[3], 0); cbData.pCode = objv[4]; zErrMsg = 0; Tcl_IncrRefCount(objv[3]); Tcl_IncrRefCount(objv[4]); rc = sqlite_exec(pDb->db, zSql, DbEvalCallback, &cbData, &zErrMsg); Tcl_DecrRefCount(objv[4]); Tcl_DecrRefCount(objv[3]); }else{ Tcl_Obj *pList = Tcl_NewObj(); rc = sqlite_exec(pDb->db, zSql, DbEvalCallback2, pList, &zErrMsg); Tcl_SetObjResult(interp, pList); } if( zErrMsg ){ Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE); free(zErrMsg); } Tcl_DecrRefCount(objv[2]); return rc; } /* ** $db timeout MILLESECONDS ** ** Delay for the number of milliseconds specified when a file is locked. */ case DB_TIMEOUT: { int ms; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 2, objv, "MILLISECONDS"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp, objv[2], &ms) ) return TCL_ERROR; sqlite_busy_timeout(pDb->db, ms); break; } } /* End of the SWITCH statement */ return TCL_OK; } /* ** sqlite DBNAME FILENAME ?MODE? ** ** This is the main Tcl command. When the "sqlite" Tcl command is |
︙ | ︙ | |||
310 311 312 313 314 315 316 | p->db = sqlite_open(argv[2], mode, &zErrMsg); if( p->db==0 ){ Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE); Tcl_Free((char*)p); free(zErrMsg); return TCL_ERROR; } | | | 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | p->db = sqlite_open(argv[2], mode, &zErrMsg); if( p->db==0 ){ Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE); Tcl_Free((char*)p); free(zErrMsg); return TCL_ERROR; } Tcl_CreateObjCommand(interp, argv[1], DbObjCmd, (char*)p, DbDeleteCmd); return TCL_OK; } /* ** Initialize this module. ** ** This Tcl module contains only a single new Tcl command named "sqlite". |
︙ | ︙ | |||
393 394 395 396 397 398 399 | } }else{ Tcl_GlobalEval(interp, zMainloop); } return 0; } #endif /* TCLSH */ | > > | 437 438 439 440 441 442 443 444 445 | } }else{ Tcl_GlobalEval(interp, zMainloop); } return 0; } #endif /* TCLSH */ #endif /* !defined(NO_TCL) */ |
Changes to test/tester.tcl.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements some common TCL routines used for regression # testing the SQLite library # | | | 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 some common TCL routines used for regression # testing the SQLite library # # $Id: tester.tcl,v 1.6 2000/09/21 13:01:37 drh Exp $ # Create a test database # file delete -force testdb file mkdir testdb sqlite db testdb |
︙ | ︙ | |||
78 79 80 81 82 83 84 | puts "$nErr errors out of $nTest tests" exit $nErr } # A procedure to execute SQL # proc execsql {sql} { | < | < < < < < | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | puts "$nErr errors out of $nTest tests" exit $nErr } # A procedure to execute SQL # proc execsql {sql} { return [db eval $sql] } # Another procedure to execute SQL. This one includes the field # names in the returned list. # proc execsql2 {sql} { set result {} |
︙ | ︙ |
Changes to www/changes.tcl.
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 24 25 | } proc chng {date desc} { puts "<DT><B>$date</B></DT>" puts "<DD><P><UL>$desc</UL></P></DD>" } chng {2000 Sep 13 (Version 1.0.5)} { <li>Changed the print format for floating point values from "%g" to "%.15g". </li> <li>Changed the comparison function so that numbers in exponential notation (ex: 1.234e+05) sort in numerical order.</li> } | > > > > > > > | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | } proc chng {date desc} { puts "<DT><B>$date</B></DT>" puts "<DD><P><UL>$desc</UL></P></DD>" } chng {2000 Sep 21 (Not Released)} { <li>Change the tclsqlite "eval" method to return a list of results if no callback script is specified.</li> <li>Change tclsqlite.c to use the Tcl_Obj interface</li> <li>Add tclsqlite.c to the libsqlite.a library</li> } chng {2000 Sep 13 (Version 1.0.5)} { <li>Changed the print format for floating point values from "%g" to "%.15g". </li> <li>Changed the comparison function so that numbers in exponential notation (ex: 1.234e+05) sort in numerical order.</li> } |
︙ | ︙ |