Fossil SCM

Added query reset, refactored bind commands to accept their indexes in the same way as the col commands do (and expanded the remaining col commands which did not do so).

stephan 2012-07-15 15:28 th1-query-api
Commit f2ee33d46085df6e2a6de35f6402e437f4bde7e3
+76 -19
--- src/th_main.c
+++ src/th_main.c
@@ -1188,10 +1188,28 @@
11881188
return queryReportDbErr( interp );
11891189
}
11901190
Th_SetResultInt( interp, rc );
11911191
return TH_OK;
11921192
}
1193
+
1194
+static int queryResetCmd(
1195
+ Th_Interp *interp,
1196
+ void *p,
1197
+ int argc,
1198
+ const char **argv,
1199
+ int *argl
1200
+){
1201
+ sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1202
+ int const rc = sqlite3_reset(pStmt);
1203
+ if(rc){
1204
+ Th_ErrorMessage(interp, "Reset of statement failed.", NULL, 0);
1205
+ return TH_ERROR;
1206
+ }else{
1207
+ return TH_OK;
1208
+ }
1209
+}
1210
+
11931211
11941212
/*
11951213
** TH Syntax:
11961214
**
11971215
** query col string stmtId Index
@@ -1205,23 +1223,25 @@
12051223
void *p,
12061224
int argc,
12071225
const char **argv,
12081226
int *argl
12091227
){
1228
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1229
+ int index = sq->colCmdIndex;
12101230
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
12111231
int requireArgc = pStmt ? 2 : 3;
12121232
char const * val;
1213
- int index = -1;
12141233
int valLen;
1234
+ if( index >= 0 ) --requireArgc;
12151235
if( argc!=requireArgc ){
12161236
return Th_WrongNumArgs2(interp,
12171237
argv[0], argl[0],
12181238
"StmtHandle Index");
12191239
}
12201240
if(!pStmt){
12211241
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1222
- }else{
1242
+ }else if(index<0){
12231243
Th_ToInt(interp, argv[1], argl[1], &index);
12241244
}
12251245
if(index < 0){
12261246
return TH_ERROR;
12271247
}
@@ -1245,25 +1265,26 @@
12451265
void *p,
12461266
int argc,
12471267
const char **argv,
12481268
int *argl
12491269
){
1270
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1271
+ int index = sq->colCmdIndex;
12501272
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
12511273
int requireArgc = pStmt ? 2 : 3;
12521274
int rc = 0;
1253
- int index = -1;
1275
+ if( index >= 0 ) --requireArgc;
12541276
if( argc!=requireArgc ){
12551277
return Th_WrongNumArgs2(interp,
12561278
argv[0], argl[0],
12571279
"StmtHandle Index");
12581280
}
12591281
if(!pStmt){
12601282
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1261
- }else{
1283
+ }else if(index<0){
12621284
Th_ToInt(interp, argv[1], argl[1], &index);
12631285
}
1264
-
12651286
if(index < 0){
12661287
return TH_ERROR;
12671288
}
12681289
Th_SetResultInt( interp, sqlite3_column_int( pStmt, index ) );
12691290
return TH_OK;
@@ -1283,22 +1304,24 @@
12831304
void *p,
12841305
int argc,
12851306
const char **argv,
12861307
int *argl
12871308
){
1309
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1310
+ int index = sq->colCmdIndex;
12881311
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
12891312
int requireArgc = pStmt ? 2 : 3;
12901313
double rc = 0;
1291
- int index = -1;
1314
+ if( index >= 0 ) --requireArgc;
12921315
if( argc!=requireArgc ){
12931316
return Th_WrongNumArgs2(interp,
12941317
argv[0], argl[0],
12951318
"StmtHandle Index");
12961319
}
12971320
if(!pStmt){
12981321
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1299
- }else{
1322
+ }else if(index<0){
13001323
Th_ToInt(interp, argv[1], argl[1], &index);
13011324
}
13021325
if(index < 0){
13031326
return TH_ERROR;
13041327
}
@@ -1582,22 +1605,24 @@
15821605
void *p,
15831606
int argc,
15841607
const char **argv,
15851608
int *argl
15861609
){
1610
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1611
+ int index = sq->colCmdIndex;
15871612
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
15881613
int requireArgc = pStmt ? 2 : 3;
1614
+ if( index > 0 ) --requireArgc;
15891615
int rc;
1590
- int index = 0;
15911616
if( argc!=requireArgc ){
15921617
return Th_WrongNumArgs2(interp,
15931618
argv[0], argl[0],
15941619
"StmtHandle Index");
15951620
}
15961621
if(!pStmt){
15971622
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1598
- }else{
1623
+ }else if(index<1){
15991624
Th_ToInt( interp, argv[1], argl[1], &index );
16001625
}
16011626
if(index < 1){
16021627
return TH_ERROR;
16031628
}
@@ -1623,28 +1648,35 @@
16231648
void *p,
16241649
int argc,
16251650
const char **argv,
16261651
int *argl
16271652
){
1653
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1654
+ int index = sq->colCmdIndex;
16281655
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
16291656
int requireArgc = pStmt ? 3 : 4;
16301657
int rc;
1631
- int index = 0;
1658
+ int argPos;
1659
+ if( index > 0 ) --requireArgc;
16321660
if( argc!=requireArgc ){
16331661
return Th_WrongNumArgs2(interp,
16341662
argv[0], argl[0],
16351663
"StmtHandle Index Value");
16361664
}
16371665
if(!pStmt){
16381666
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1639
- }else{
1667
+ argPos = 3;
1668
+ }else if(index<1){
16401669
Th_ToInt( interp, argv[1], argl[1], &index );
1670
+ argPos = 2;
1671
+ }else{
1672
+ argPos = 1;
16411673
}
16421674
if(index < 1){
16431675
return TH_ERROR;
16441676
}
1645
- rc = sqlite3_bind_text( pStmt, index, argv[3], argl[3], SQLITE_TRANSIENT );
1677
+ rc = sqlite3_bind_text( pStmt, index, argv[argPos], argl[argPos], SQLITE_TRANSIENT );
16461678
if(rc){
16471679
return queryReportDbErr( interp );
16481680
}
16491681
Th_SetResultInt( interp, 0 );
16501682
return TH_OK;
@@ -1663,27 +1695,31 @@
16631695
void *p,
16641696
int argc,
16651697
const char **argv,
16661698
int *argl
16671699
){
1700
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1701
+ int index = sq->colCmdIndex;
16681702
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
16691703
int requireArgc = pStmt ? 3 : 4;
16701704
int rc;
1671
- int index = 0;
16721705
int argPos;
16731706
int val;
1707
+ if( index > 0 ) --requireArgc;
16741708
if( argc!=requireArgc ){
16751709
return Th_WrongNumArgs2(interp,
16761710
argv[0], argl[0],
16771711
"StmtHandle Index Value");
16781712
}
16791713
if(!pStmt){
16801714
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
16811715
argPos = 3;
1682
- }else{
1716
+ }else if(index<1){
16831717
Th_ToInt( interp, argv[1], argl[1], &index );
16841718
argPos = 2;
1719
+ }else{
1720
+ argPos = 1;
16851721
}
16861722
if(index < 1){
16871723
return TH_ERROR;
16881724
}
16891725
if( 0 != Th_ToInt( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1711,27 +1747,31 @@
17111747
void *p,
17121748
int argc,
17131749
const char **argv,
17141750
int *argl
17151751
){
1752
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1753
+ int index = sq->colCmdIndex;
17161754
sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
17171755
int requireArgc = pStmt ? 3 : 4;
17181756
int rc;
1719
- int index = 0;
17201757
int argPos;
17211758
double val;
1759
+ if( index > 0 ) --requireArgc;
17221760
if( argc!=requireArgc ){
17231761
return Th_WrongNumArgs2(interp,
17241762
argv[0], argl[0],
17251763
"StmtHandle Index Value");
17261764
}
17271765
if(!pStmt){
17281766
queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
17291767
argPos = 3;
1730
- }else{
1768
+ }else if(index<1){
17311769
Th_ToInt( interp, argv[1], argl[1], &index );
17321770
argPos = 2;
1771
+ }else{
1772
+ argPos = 1;
17331773
}
17341774
if(index < 1){
17351775
return TH_ERROR;
17361776
}
17371777
if( 0 != Th_ToDouble( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1751,18 +1791,36 @@
17511791
void *ctx,
17521792
int argc,
17531793
const char **argv,
17541794
int *argl
17551795
){
1796
+ int colIndex = -1;
17561797
static Th_SubCommand aSub[] = {
17571798
{"int", queryBindIntCmd},
17581799
{"double", queryBindDoubleCmd},
17591800
{"null", queryBindNullCmd},
17601801
{"string", queryBindStringCmd},
17611802
{0, 0}
17621803
};
1804
+ Th_Sqlite * sq = Th_sqlite_manager(interp);
1805
+ assert(NULL != sq);
1806
+ if( 1 == argc ){
1807
+ Th_WrongNumArgs2( interp, argv[0], argl[0],
1808
+ "subcommand");
1809
+ return TH_ERROR;
1810
+ }else if( 0 == Th_TryInt(interp,argv[1], argl[1], &colIndex) ){
1811
+ if(colIndex <0){
1812
+ Th_ErrorMessage( interp, "Invalid column index.", NULL, 0);
1813
+ return TH_ERROR;
1814
+ }
1815
+ ++argv;
1816
+ ++argl;
1817
+ --argc;
1818
+ }
1819
+ sq->colCmdIndex = colIndex;
17631820
Th_CallSubCommand2( interp, ctx, argc, argv, argl, aSub );
1821
+
17641822
}
17651823
17661824
static int queryColTopLevelCmd(
17671825
Th_Interp *interp,
17681826
void *ctx,
@@ -1808,13 +1866,10 @@
18081866
++argv;
18091867
++argl;
18101868
--argc;
18111869
}
18121870
sq->colCmdIndex = colIndex;
1813
- /* TODO: accept the index as the first param after "col", and make
1814
- subcommands aware of sq->colCmdIndex.
1815
- */
18161871
Th_CallSubCommand2( interp, ctx, argc, argv, argl,
18171872
(colIndex<0) ? aSub : aSubWithIndex );
18181873
}
18191874
18201875
@@ -1828,10 +1883,11 @@
18281883
int stmtId = 0;
18291884
sqlite3_stmt * pStmt = NULL;
18301885
static Th_SubCommand aSubAll[] = {
18311886
{"bind", queryBindTopLevelCmd},
18321887
{"col", queryColTopLevelCmd},
1888
+ {"reset", queryResetCmd},
18331889
{"step", queryStepCmd},
18341890
{"finalize", queryFinalizeCmd},
18351891
{"prepare", queryPrepareCmd},
18361892
{"strftime", queryStrftimeCmd},
18371893
{0, 0}
@@ -1843,10 +1899,11 @@
18431899
*/
18441900
{"bind", queryBindTopLevelCmd},
18451901
{"col", queryColTopLevelCmd},
18461902
{"step", queryStepCmd},
18471903
{"finalize", queryFinalizeCmd},
1904
+ {"reset", queryResetCmd},
18481905
{0, 0}
18491906
};
18501907
18511908
18521909
assert( NULL != Th_sqlite_manager(interp) );
18531910
--- src/th_main.c
+++ src/th_main.c
@@ -1188,10 +1188,28 @@
1188 return queryReportDbErr( interp );
1189 }
1190 Th_SetResultInt( interp, rc );
1191 return TH_OK;
1192 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1193
1194 /*
1195 ** TH Syntax:
1196 **
1197 ** query col string stmtId Index
@@ -1205,23 +1223,25 @@
1205 void *p,
1206 int argc,
1207 const char **argv,
1208 int *argl
1209 ){
 
 
1210 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1211 int requireArgc = pStmt ? 2 : 3;
1212 char const * val;
1213 int index = -1;
1214 int valLen;
 
1215 if( argc!=requireArgc ){
1216 return Th_WrongNumArgs2(interp,
1217 argv[0], argl[0],
1218 "StmtHandle Index");
1219 }
1220 if(!pStmt){
1221 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1222 }else{
1223 Th_ToInt(interp, argv[1], argl[1], &index);
1224 }
1225 if(index < 0){
1226 return TH_ERROR;
1227 }
@@ -1245,25 +1265,26 @@
1245 void *p,
1246 int argc,
1247 const char **argv,
1248 int *argl
1249 ){
 
 
1250 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1251 int requireArgc = pStmt ? 2 : 3;
1252 int rc = 0;
1253 int index = -1;
1254 if( argc!=requireArgc ){
1255 return Th_WrongNumArgs2(interp,
1256 argv[0], argl[0],
1257 "StmtHandle Index");
1258 }
1259 if(!pStmt){
1260 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1261 }else{
1262 Th_ToInt(interp, argv[1], argl[1], &index);
1263 }
1264
1265 if(index < 0){
1266 return TH_ERROR;
1267 }
1268 Th_SetResultInt( interp, sqlite3_column_int( pStmt, index ) );
1269 return TH_OK;
@@ -1283,22 +1304,24 @@
1283 void *p,
1284 int argc,
1285 const char **argv,
1286 int *argl
1287 ){
 
 
1288 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1289 int requireArgc = pStmt ? 2 : 3;
1290 double rc = 0;
1291 int index = -1;
1292 if( argc!=requireArgc ){
1293 return Th_WrongNumArgs2(interp,
1294 argv[0], argl[0],
1295 "StmtHandle Index");
1296 }
1297 if(!pStmt){
1298 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1299 }else{
1300 Th_ToInt(interp, argv[1], argl[1], &index);
1301 }
1302 if(index < 0){
1303 return TH_ERROR;
1304 }
@@ -1582,22 +1605,24 @@
1582 void *p,
1583 int argc,
1584 const char **argv,
1585 int *argl
1586 ){
 
 
1587 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1588 int requireArgc = pStmt ? 2 : 3;
 
1589 int rc;
1590 int index = 0;
1591 if( argc!=requireArgc ){
1592 return Th_WrongNumArgs2(interp,
1593 argv[0], argl[0],
1594 "StmtHandle Index");
1595 }
1596 if(!pStmt){
1597 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1598 }else{
1599 Th_ToInt( interp, argv[1], argl[1], &index );
1600 }
1601 if(index < 1){
1602 return TH_ERROR;
1603 }
@@ -1623,28 +1648,35 @@
1623 void *p,
1624 int argc,
1625 const char **argv,
1626 int *argl
1627 ){
 
 
1628 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1629 int requireArgc = pStmt ? 3 : 4;
1630 int rc;
1631 int index = 0;
 
1632 if( argc!=requireArgc ){
1633 return Th_WrongNumArgs2(interp,
1634 argv[0], argl[0],
1635 "StmtHandle Index Value");
1636 }
1637 if(!pStmt){
1638 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1639 }else{
 
1640 Th_ToInt( interp, argv[1], argl[1], &index );
 
 
 
1641 }
1642 if(index < 1){
1643 return TH_ERROR;
1644 }
1645 rc = sqlite3_bind_text( pStmt, index, argv[3], argl[3], SQLITE_TRANSIENT );
1646 if(rc){
1647 return queryReportDbErr( interp );
1648 }
1649 Th_SetResultInt( interp, 0 );
1650 return TH_OK;
@@ -1663,27 +1695,31 @@
1663 void *p,
1664 int argc,
1665 const char **argv,
1666 int *argl
1667 ){
 
 
1668 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1669 int requireArgc = pStmt ? 3 : 4;
1670 int rc;
1671 int index = 0;
1672 int argPos;
1673 int val;
 
1674 if( argc!=requireArgc ){
1675 return Th_WrongNumArgs2(interp,
1676 argv[0], argl[0],
1677 "StmtHandle Index Value");
1678 }
1679 if(!pStmt){
1680 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1681 argPos = 3;
1682 }else{
1683 Th_ToInt( interp, argv[1], argl[1], &index );
1684 argPos = 2;
 
 
1685 }
1686 if(index < 1){
1687 return TH_ERROR;
1688 }
1689 if( 0 != Th_ToInt( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1711,27 +1747,31 @@
1711 void *p,
1712 int argc,
1713 const char **argv,
1714 int *argl
1715 ){
 
 
1716 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1717 int requireArgc = pStmt ? 3 : 4;
1718 int rc;
1719 int index = 0;
1720 int argPos;
1721 double val;
 
1722 if( argc!=requireArgc ){
1723 return Th_WrongNumArgs2(interp,
1724 argv[0], argl[0],
1725 "StmtHandle Index Value");
1726 }
1727 if(!pStmt){
1728 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1729 argPos = 3;
1730 }else{
1731 Th_ToInt( interp, argv[1], argl[1], &index );
1732 argPos = 2;
 
 
1733 }
1734 if(index < 1){
1735 return TH_ERROR;
1736 }
1737 if( 0 != Th_ToDouble( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1751,18 +1791,36 @@
1751 void *ctx,
1752 int argc,
1753 const char **argv,
1754 int *argl
1755 ){
 
1756 static Th_SubCommand aSub[] = {
1757 {"int", queryBindIntCmd},
1758 {"double", queryBindDoubleCmd},
1759 {"null", queryBindNullCmd},
1760 {"string", queryBindStringCmd},
1761 {0, 0}
1762 };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1763 Th_CallSubCommand2( interp, ctx, argc, argv, argl, aSub );
 
1764 }
1765
1766 static int queryColTopLevelCmd(
1767 Th_Interp *interp,
1768 void *ctx,
@@ -1808,13 +1866,10 @@
1808 ++argv;
1809 ++argl;
1810 --argc;
1811 }
1812 sq->colCmdIndex = colIndex;
1813 /* TODO: accept the index as the first param after "col", and make
1814 subcommands aware of sq->colCmdIndex.
1815 */
1816 Th_CallSubCommand2( interp, ctx, argc, argv, argl,
1817 (colIndex<0) ? aSub : aSubWithIndex );
1818 }
1819
1820
@@ -1828,10 +1883,11 @@
1828 int stmtId = 0;
1829 sqlite3_stmt * pStmt = NULL;
1830 static Th_SubCommand aSubAll[] = {
1831 {"bind", queryBindTopLevelCmd},
1832 {"col", queryColTopLevelCmd},
 
1833 {"step", queryStepCmd},
1834 {"finalize", queryFinalizeCmd},
1835 {"prepare", queryPrepareCmd},
1836 {"strftime", queryStrftimeCmd},
1837 {0, 0}
@@ -1843,10 +1899,11 @@
1843 */
1844 {"bind", queryBindTopLevelCmd},
1845 {"col", queryColTopLevelCmd},
1846 {"step", queryStepCmd},
1847 {"finalize", queryFinalizeCmd},
 
1848 {0, 0}
1849 };
1850
1851
1852 assert( NULL != Th_sqlite_manager(interp) );
1853
--- src/th_main.c
+++ src/th_main.c
@@ -1188,10 +1188,28 @@
1188 return queryReportDbErr( interp );
1189 }
1190 Th_SetResultInt( interp, rc );
1191 return TH_OK;
1192 }
1193
1194 static int queryResetCmd(
1195 Th_Interp *interp,
1196 void *p,
1197 int argc,
1198 const char **argv,
1199 int *argl
1200 ){
1201 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1202 int const rc = sqlite3_reset(pStmt);
1203 if(rc){
1204 Th_ErrorMessage(interp, "Reset of statement failed.", NULL, 0);
1205 return TH_ERROR;
1206 }else{
1207 return TH_OK;
1208 }
1209 }
1210
1211
1212 /*
1213 ** TH Syntax:
1214 **
1215 ** query col string stmtId Index
@@ -1205,23 +1223,25 @@
1223 void *p,
1224 int argc,
1225 const char **argv,
1226 int *argl
1227 ){
1228 Th_Sqlite * sq = Th_sqlite_manager(interp);
1229 int index = sq->colCmdIndex;
1230 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1231 int requireArgc = pStmt ? 2 : 3;
1232 char const * val;
 
1233 int valLen;
1234 if( index >= 0 ) --requireArgc;
1235 if( argc!=requireArgc ){
1236 return Th_WrongNumArgs2(interp,
1237 argv[0], argl[0],
1238 "StmtHandle Index");
1239 }
1240 if(!pStmt){
1241 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1242 }else if(index<0){
1243 Th_ToInt(interp, argv[1], argl[1], &index);
1244 }
1245 if(index < 0){
1246 return TH_ERROR;
1247 }
@@ -1245,25 +1265,26 @@
1265 void *p,
1266 int argc,
1267 const char **argv,
1268 int *argl
1269 ){
1270 Th_Sqlite * sq = Th_sqlite_manager(interp);
1271 int index = sq->colCmdIndex;
1272 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1273 int requireArgc = pStmt ? 2 : 3;
1274 int rc = 0;
1275 if( index >= 0 ) --requireArgc;
1276 if( argc!=requireArgc ){
1277 return Th_WrongNumArgs2(interp,
1278 argv[0], argl[0],
1279 "StmtHandle Index");
1280 }
1281 if(!pStmt){
1282 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1283 }else if(index<0){
1284 Th_ToInt(interp, argv[1], argl[1], &index);
1285 }
 
1286 if(index < 0){
1287 return TH_ERROR;
1288 }
1289 Th_SetResultInt( interp, sqlite3_column_int( pStmt, index ) );
1290 return TH_OK;
@@ -1283,22 +1304,24 @@
1304 void *p,
1305 int argc,
1306 const char **argv,
1307 int *argl
1308 ){
1309 Th_Sqlite * sq = Th_sqlite_manager(interp);
1310 int index = sq->colCmdIndex;
1311 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1312 int requireArgc = pStmt ? 2 : 3;
1313 double rc = 0;
1314 if( index >= 0 ) --requireArgc;
1315 if( argc!=requireArgc ){
1316 return Th_WrongNumArgs2(interp,
1317 argv[0], argl[0],
1318 "StmtHandle Index");
1319 }
1320 if(!pStmt){
1321 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1322 }else if(index<0){
1323 Th_ToInt(interp, argv[1], argl[1], &index);
1324 }
1325 if(index < 0){
1326 return TH_ERROR;
1327 }
@@ -1582,22 +1605,24 @@
1605 void *p,
1606 int argc,
1607 const char **argv,
1608 int *argl
1609 ){
1610 Th_Sqlite * sq = Th_sqlite_manager(interp);
1611 int index = sq->colCmdIndex;
1612 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1613 int requireArgc = pStmt ? 2 : 3;
1614 if( index > 0 ) --requireArgc;
1615 int rc;
 
1616 if( argc!=requireArgc ){
1617 return Th_WrongNumArgs2(interp,
1618 argv[0], argl[0],
1619 "StmtHandle Index");
1620 }
1621 if(!pStmt){
1622 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1623 }else if(index<1){
1624 Th_ToInt( interp, argv[1], argl[1], &index );
1625 }
1626 if(index < 1){
1627 return TH_ERROR;
1628 }
@@ -1623,28 +1648,35 @@
1648 void *p,
1649 int argc,
1650 const char **argv,
1651 int *argl
1652 ){
1653 Th_Sqlite * sq = Th_sqlite_manager(interp);
1654 int index = sq->colCmdIndex;
1655 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1656 int requireArgc = pStmt ? 3 : 4;
1657 int rc;
1658 int argPos;
1659 if( index > 0 ) --requireArgc;
1660 if( argc!=requireArgc ){
1661 return Th_WrongNumArgs2(interp,
1662 argv[0], argl[0],
1663 "StmtHandle Index Value");
1664 }
1665 if(!pStmt){
1666 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1667 argPos = 3;
1668 }else if(index<1){
1669 Th_ToInt( interp, argv[1], argl[1], &index );
1670 argPos = 2;
1671 }else{
1672 argPos = 1;
1673 }
1674 if(index < 1){
1675 return TH_ERROR;
1676 }
1677 rc = sqlite3_bind_text( pStmt, index, argv[argPos], argl[argPos], SQLITE_TRANSIENT );
1678 if(rc){
1679 return queryReportDbErr( interp );
1680 }
1681 Th_SetResultInt( interp, 0 );
1682 return TH_OK;
@@ -1663,27 +1695,31 @@
1695 void *p,
1696 int argc,
1697 const char **argv,
1698 int *argl
1699 ){
1700 Th_Sqlite * sq = Th_sqlite_manager(interp);
1701 int index = sq->colCmdIndex;
1702 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1703 int requireArgc = pStmt ? 3 : 4;
1704 int rc;
 
1705 int argPos;
1706 int val;
1707 if( index > 0 ) --requireArgc;
1708 if( argc!=requireArgc ){
1709 return Th_WrongNumArgs2(interp,
1710 argv[0], argl[0],
1711 "StmtHandle Index Value");
1712 }
1713 if(!pStmt){
1714 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1715 argPos = 3;
1716 }else if(index<1){
1717 Th_ToInt( interp, argv[1], argl[1], &index );
1718 argPos = 2;
1719 }else{
1720 argPos = 1;
1721 }
1722 if(index < 1){
1723 return TH_ERROR;
1724 }
1725 if( 0 != Th_ToInt( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1711,27 +1747,31 @@
1747 void *p,
1748 int argc,
1749 const char **argv,
1750 int *argl
1751 ){
1752 Th_Sqlite * sq = Th_sqlite_manager(interp);
1753 int index = sq->colCmdIndex;
1754 sqlite3_stmt * pStmt = (sqlite3_stmt*)p;
1755 int requireArgc = pStmt ? 3 : 4;
1756 int rc;
 
1757 int argPos;
1758 double val;
1759 if( index > 0 ) --requireArgc;
1760 if( argc!=requireArgc ){
1761 return Th_WrongNumArgs2(interp,
1762 argv[0], argl[0],
1763 "StmtHandle Index Value");
1764 }
1765 if(!pStmt){
1766 queryStmtIndexArgs(interp, argc, argv, argl, &pStmt, &index);
1767 argPos = 3;
1768 }else if(index<1){
1769 Th_ToInt( interp, argv[1], argl[1], &index );
1770 argPos = 2;
1771 }else{
1772 argPos = 1;
1773 }
1774 if(index < 1){
1775 return TH_ERROR;
1776 }
1777 if( 0 != Th_ToDouble( interp, argv[argPos], argl[argPos], &val ) ){
@@ -1751,18 +1791,36 @@
1791 void *ctx,
1792 int argc,
1793 const char **argv,
1794 int *argl
1795 ){
1796 int colIndex = -1;
1797 static Th_SubCommand aSub[] = {
1798 {"int", queryBindIntCmd},
1799 {"double", queryBindDoubleCmd},
1800 {"null", queryBindNullCmd},
1801 {"string", queryBindStringCmd},
1802 {0, 0}
1803 };
1804 Th_Sqlite * sq = Th_sqlite_manager(interp);
1805 assert(NULL != sq);
1806 if( 1 == argc ){
1807 Th_WrongNumArgs2( interp, argv[0], argl[0],
1808 "subcommand");
1809 return TH_ERROR;
1810 }else if( 0 == Th_TryInt(interp,argv[1], argl[1], &colIndex) ){
1811 if(colIndex <0){
1812 Th_ErrorMessage( interp, "Invalid column index.", NULL, 0);
1813 return TH_ERROR;
1814 }
1815 ++argv;
1816 ++argl;
1817 --argc;
1818 }
1819 sq->colCmdIndex = colIndex;
1820 Th_CallSubCommand2( interp, ctx, argc, argv, argl, aSub );
1821
1822 }
1823
1824 static int queryColTopLevelCmd(
1825 Th_Interp *interp,
1826 void *ctx,
@@ -1808,13 +1866,10 @@
1866 ++argv;
1867 ++argl;
1868 --argc;
1869 }
1870 sq->colCmdIndex = colIndex;
 
 
 
1871 Th_CallSubCommand2( interp, ctx, argc, argv, argl,
1872 (colIndex<0) ? aSub : aSubWithIndex );
1873 }
1874
1875
@@ -1828,10 +1883,11 @@
1883 int stmtId = 0;
1884 sqlite3_stmt * pStmt = NULL;
1885 static Th_SubCommand aSubAll[] = {
1886 {"bind", queryBindTopLevelCmd},
1887 {"col", queryColTopLevelCmd},
1888 {"reset", queryResetCmd},
1889 {"step", queryStepCmd},
1890 {"finalize", queryFinalizeCmd},
1891 {"prepare", queryPrepareCmd},
1892 {"strftime", queryStrftimeCmd},
1893 {0, 0}
@@ -1843,10 +1899,11 @@
1899 */
1900 {"bind", queryBindTopLevelCmd},
1901 {"col", queryColTopLevelCmd},
1902 {"step", queryStepCmd},
1903 {"finalize", queryFinalizeCmd},
1904 {"reset", queryResetCmd},
1905 {0, 0}
1906 };
1907
1908
1909 assert( NULL != Th_sqlite_manager(interp) );
1910
--- test/th1-query-api-1.th1
+++ test/th1-query-api-1.th1
@@ -54,13 +54,16 @@
5454
set sql {SELECT uid, login FROM user WHERE uid!=?}
5555
#set sql {SELECT uid, login FROM user WHERE login=?}
5656
#set sql {SELECT tagid, value, null FROM tagxref WHERE value IS ? LIMIT 3}
5757
set stmt [query prepare $sql]
5858
puts "stmt ID=" $stmt "\n"
59
-query bind int $stmt 1 3
59
+#query bind int $stmt 1 3
60
+#query $stmt bind 1 int 3
61
+query $stmt bind 1 string 3
62
+#query $stmt bind string 1 3
6063
#set stmt [query prepare $sql]
61
-#query bind string $stmt 1 stephan
64
+#query $stmt bind 1 string 1
6265
#set stmt [query prepare $sql]
6366
#query $stmt bind null 1
6467
puts "USER LIST:\n"
6568
catch {
6669
proc my_each {stmt colCount} {
@@ -75,16 +78,21 @@
7578
# }
7679
puts "\n"
7780
# error "hi!"
7881
}
7982
query_step_each $stmt my_each
83
+# query reset $stmt
84
+# query $stmt reset
8085
# query_step_each $stmt {
8186
# proc each {stmt cc} { puts hi "\n" }
8287
# }
88
+ return 0
8389
} rc
8490
query finalize $stmt
85
-puts rc = $rc "\n"
91
+if { 0 != $rc } {
92
+ puts "ERROR: $rc\n"
93
+}
8694
8795
set consts [list SQLITE_BLOB SQLITE_DONE SQLITE_ERROR SQLITE_FLOAT SQLITE_INTEGER SQLITE_NULL SQLITE_OK SQLITE_ROW SQLITE_TEXT]
8896
#set consts $SQLITE_CONSTANTS
8997
puts consts = $consts "\n"
9098
for {set i 0} {$i < [llength $consts]} {incr i} {
9199
92100
ADDED test/th1-query-api-2.th1
--- test/th1-query-api-1.th1
+++ test/th1-query-api-1.th1
@@ -54,13 +54,16 @@
54 set sql {SELECT uid, login FROM user WHERE uid!=?}
55 #set sql {SELECT uid, login FROM user WHERE login=?}
56 #set sql {SELECT tagid, value, null FROM tagxref WHERE value IS ? LIMIT 3}
57 set stmt [query prepare $sql]
58 puts "stmt ID=" $stmt "\n"
59 query bind int $stmt 1 3
 
 
 
60 #set stmt [query prepare $sql]
61 #query bind string $stmt 1 stephan
62 #set stmt [query prepare $sql]
63 #query $stmt bind null 1
64 puts "USER LIST:\n"
65 catch {
66 proc my_each {stmt colCount} {
@@ -75,16 +78,21 @@
75 # }
76 puts "\n"
77 # error "hi!"
78 }
79 query_step_each $stmt my_each
 
 
80 # query_step_each $stmt {
81 # proc each {stmt cc} { puts hi "\n" }
82 # }
 
83 } rc
84 query finalize $stmt
85 puts rc = $rc "\n"
 
 
86
87 set consts [list SQLITE_BLOB SQLITE_DONE SQLITE_ERROR SQLITE_FLOAT SQLITE_INTEGER SQLITE_NULL SQLITE_OK SQLITE_ROW SQLITE_TEXT]
88 #set consts $SQLITE_CONSTANTS
89 puts consts = $consts "\n"
90 for {set i 0} {$i < [llength $consts]} {incr i} {
91
92 DDED test/th1-query-api-2.th1
--- test/th1-query-api-1.th1
+++ test/th1-query-api-1.th1
@@ -54,13 +54,16 @@
54 set sql {SELECT uid, login FROM user WHERE uid!=?}
55 #set sql {SELECT uid, login FROM user WHERE login=?}
56 #set sql {SELECT tagid, value, null FROM tagxref WHERE value IS ? LIMIT 3}
57 set stmt [query prepare $sql]
58 puts "stmt ID=" $stmt "\n"
59 #query bind int $stmt 1 3
60 #query $stmt bind 1 int 3
61 query $stmt bind 1 string 3
62 #query $stmt bind string 1 3
63 #set stmt [query prepare $sql]
64 #query $stmt bind 1 string 1
65 #set stmt [query prepare $sql]
66 #query $stmt bind null 1
67 puts "USER LIST:\n"
68 catch {
69 proc my_each {stmt colCount} {
@@ -75,16 +78,21 @@
78 # }
79 puts "\n"
80 # error "hi!"
81 }
82 query_step_each $stmt my_each
83 # query reset $stmt
84 # query $stmt reset
85 # query_step_each $stmt {
86 # proc each {stmt cc} { puts hi "\n" }
87 # }
88 return 0
89 } rc
90 query finalize $stmt
91 if { 0 != $rc } {
92 puts "ERROR: $rc\n"
93 }
94
95 set consts [list SQLITE_BLOB SQLITE_DONE SQLITE_ERROR SQLITE_FLOAT SQLITE_INTEGER SQLITE_NULL SQLITE_OK SQLITE_ROW SQLITE_TEXT]
96 #set consts $SQLITE_CONSTANTS
97 puts consts = $consts "\n"
98 for {set i 0} {$i < [llength $consts]} {incr i} {
99
100 DDED test/th1-query-api-2.th1
--- a/test/th1-query-api-2.th1
+++ b/test/th1-query-api-2.th1
@@ -0,0 +1,20 @@
1
+<th1>
2
+catch {
3
+ set stmt [query prepare {
4
+ SELECT login, cap, cexpire, mtime, NULL FROM user
5
+ WHERE uid<? AND cexpire IS NOT NULL
6
+ AND mtime IS NOT NULL
7
+ }]
8
+ puts "stmt ID=$stmt\n"
9
+# query bind int $stmt 1 2
10
+# query $stmt bind int 1 2
11
+2 query $stmt bind 1 int 5
12
+# segfault: query bind 1 int $stmt 2
13
+ 0 < set sep "\n"
14
+ for {} {[query $stmt step]} {} {
15
+ puts [query $stmt col string 0] $sep
16
+ puts [query $stmt col time 2 {%Y%m%d @ %H:%M:%S}] $sep
17
+ puts [query $stmt col time 2 {%Y%m%d @ %H:%M:%S} {+10 years}] $sep
18
+ puts [query $stmt col 2 time {%Y%m%d @ %H:%M:%S} {+10 years}] $sep
19
+# puts [query col time $stmt 2 %s] $sep
20
+ puts [query col time
--- a/test/th1-query-api-2.th1
+++ b/test/th1-query-api-2.th1
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/test/th1-query-api-2.th1
+++ b/test/th1-query-api-2.th1
@@ -0,0 +1,20 @@
1 <th1>
2 catch {
3 set stmt [query prepare {
4 SELECT login, cap, cexpire, mtime, NULL FROM user
5 WHERE uid<? AND cexpire IS NOT NULL
6 AND mtime IS NOT NULL
7 }]
8 puts "stmt ID=$stmt\n"
9 # query bind int $stmt 1 2
10 # query $stmt bind int 1 2
11 2 query $stmt bind 1 int 5
12 # segfault: query bind 1 int $stmt 2
13 0 < set sep "\n"
14 for {} {[query $stmt step]} {} {
15 puts [query $stmt col string 0] $sep
16 puts [query $stmt col time 2 {%Y%m%d @ %H:%M:%S}] $sep
17 puts [query $stmt col time 2 {%Y%m%d @ %H:%M:%S} {+10 years}] $sep
18 puts [query $stmt col 2 time {%Y%m%d @ %H:%M:%S} {+10 years}] $sep
19 # puts [query col time $stmt 2 %s] $sep
20 puts [query col time
--- www/th1_query.wiki
+++ www/th1_query.wiki
@@ -76,18 +76,18 @@
7676
puts [query $stmt col string 0] "\n"
7777
}
7878
</pre></nowiki>
7979
8080
81
-<h2>strftime</h2>
81
+<h2>reset</h2>
8282
83
-This works like <tt>col time</tt> (described below) but takes its
84
-value from an arbitrary source specified by the 3rd argument.
83
+Resets a query so that it can be executed again. This is only needed when
84
+binding parameters in a loop - call it at the end of each loop iteration.
8585
8686
<nowiki><pre>
87
-query strftime %s 1319211587 unixepoch
88
-query strftime {%Y%m%d @ %H:%M:%S} [query $stmt col string 2] {+10 years}]
87
+query $stmt reset
88
+query reset $stmt
8989
</pre></nowiki>
9090
9191
9292
<h2>bind xxx</h2>
9393
@@ -100,11 +100,13 @@
100100
* <tt>bind string StmtId Index Value</tt>
101101
102102
Note that all of those optionally accept the statement handle directly after
103103
the "query" command (before the "col" subcommand). e.g.
104104
<tt>query bind null $stmt 1</tt> and
105
-<tt>query $stmt bind null 1</tt> are equivalent.
105
+<tt>query $stmt bind null 1</tt> are equivalent. They also accept the column index
106
+either before or after the type name, e.g.
107
+<tt>query $stmt bind 1 string ...</tt> and <tt>query $stmt bind string 1 ...</tt> are equivalent.
106108
107109
108110
Achtung: the bind API uses 1-based indexes, just like SQL does.
109111
110112
<nowiki><pre>
@@ -153,5 +155,19 @@
153155
154156
<nowiki><pre>
155157
query $stmt col time $index {%Y%m%d @ %H:%M:%S} {+5 years}
156158
query $stmt col time $index %s unixepoch
157159
</pre></nowiki>
160
+
161
+
162
+
163
+
164
+<h2>strftime</h2>
165
+
166
+This works like <tt>col time</tt> (described below) but takes its
167
+value from an arbitrary source specified by the 3rd argument.
168
+
169
+<nowiki><pre>
170
+query strftime %s 1319211587 unixepoch
171
+query strftime {%Y%m%d @ %H:%M:%S} [query $stmt col string 2] {+10 years}]
172
+</pre></nowiki>
173
+
158174
--- www/th1_query.wiki
+++ www/th1_query.wiki
@@ -76,18 +76,18 @@
76 puts [query $stmt col string 0] "\n"
77 }
78 </pre></nowiki>
79
80
81 <h2>strftime</h2>
82
83 This works like <tt>col time</tt> (described below) but takes its
84 value from an arbitrary source specified by the 3rd argument.
85
86 <nowiki><pre>
87 query strftime %s 1319211587 unixepoch
88 query strftime {%Y%m%d @ %H:%M:%S} [query $stmt col string 2] {+10 years}]
89 </pre></nowiki>
90
91
92 <h2>bind xxx</h2>
93
@@ -100,11 +100,13 @@
100 * <tt>bind string StmtId Index Value</tt>
101
102 Note that all of those optionally accept the statement handle directly after
103 the "query" command (before the "col" subcommand). e.g.
104 <tt>query bind null $stmt 1</tt> and
105 <tt>query $stmt bind null 1</tt> are equivalent.
 
 
106
107
108 Achtung: the bind API uses 1-based indexes, just like SQL does.
109
110 <nowiki><pre>
@@ -153,5 +155,19 @@
153
154 <nowiki><pre>
155 query $stmt col time $index {%Y%m%d @ %H:%M:%S} {+5 years}
156 query $stmt col time $index %s unixepoch
157 </pre></nowiki>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
--- www/th1_query.wiki
+++ www/th1_query.wiki
@@ -76,18 +76,18 @@
76 puts [query $stmt col string 0] "\n"
77 }
78 </pre></nowiki>
79
80
81 <h2>reset</h2>
82
83 Resets a query so that it can be executed again. This is only needed when
84 binding parameters in a loop - call it at the end of each loop iteration.
85
86 <nowiki><pre>
87 query $stmt reset
88 query reset $stmt
89 </pre></nowiki>
90
91
92 <h2>bind xxx</h2>
93
@@ -100,11 +100,13 @@
100 * <tt>bind string StmtId Index Value</tt>
101
102 Note that all of those optionally accept the statement handle directly after
103 the "query" command (before the "col" subcommand). e.g.
104 <tt>query bind null $stmt 1</tt> and
105 <tt>query $stmt bind null 1</tt> are equivalent. They also accept the column index
106 either before or after the type name, e.g.
107 <tt>query $stmt bind 1 string ...</tt> and <tt>query $stmt bind string 1 ...</tt> are equivalent.
108
109
110 Achtung: the bind API uses 1-based indexes, just like SQL does.
111
112 <nowiki><pre>
@@ -153,5 +155,19 @@
155
156 <nowiki><pre>
157 query $stmt col time $index {%Y%m%d @ %H:%M:%S} {+5 years}
158 query $stmt col time $index %s unixepoch
159 </pre></nowiki>
160
161
162
163
164 <h2>strftime</h2>
165
166 This works like <tt>col time</tt> (described below) but takes its
167 value from an arbitrary source specified by the 3rd argument.
168
169 <nowiki><pre>
170 query strftime %s 1319211587 unixepoch
171 query strftime {%Y%m%d @ %H:%M:%S} [query $stmt col string 2] {+10 years}]
172 </pre></nowiki>
173
174

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button