понедельник, 26 октября 2009 г.

Релиз SQLite 3.6.19

Знаменательное событие, но я как-то совсем позабыл о нем рассказать. Анонс здесь:
SQLite Release 3.6.19 On 2009 Oct 14 (3.6.19)

Как обычно, множество багфиксов и улучшений, но самое главное - добавлена поддержка foreign key constraints.

Проблема с биндингом переменных, к сожалению, осталась, так что патч все еще нужен. Пришлось его подправить, поскольку код интерфейса tclsqlite существенно изменился. Заявлена поддержка Non-Recursive Engine (NRE) для TCL 8.6 и выше.


--- sqlite3-3.6.19.orig/src/tclsqlite.c
+++ sqlite3-3.6.19/src/tclsqlite.c
@@ -757,6 +757,8 @@
Tcl_Obj *pVar = Tcl_GetObjResult(p->interp);
int n;
u8 *data;
+ Tcl_WideInt v;
+ double r;
const char *zType = (pVar->typePtr ? pVar->typePtr->name : "");
char c = zType[0];
if( c=='b' && strcmp(zType,"bytearray")==0 && pVar->bytes==0 ){
@@ -764,18 +766,10 @@
** has no string representation. */
data = Tcl_GetByteArrayFromObj(pVar, &n);
sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT);
- }else if( c=='b' && strcmp(zType,"boolean")==0 ){
- Tcl_GetIntFromObj(0, pVar, &n);
- sqlite3_result_int(context, n);
- }else if( c=='d' && strcmp(zType,"double")==0 ){
- double r;
- Tcl_GetDoubleFromObj(0, pVar, &r);
- sqlite3_result_double(context, r);
- }else if( (c=='w' && strcmp(zType,"wideInt")==0) ||
- (c=='i' && strcmp(zType,"int")==0) ){
- Tcl_WideInt v;
- Tcl_GetWideIntFromObj(0, pVar, &v);
+ }else if( TCL_OK == Tcl_GetWideIntFromObj(0, pVar, &v)){
sqlite3_result_int64(context, v);
+ }else if( TCL_OK == Tcl_GetDoubleFromObj(0, pVar, &r)){
+ sqlite3_result_double(context, r);
}else{
data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT);
@@ -1014,6 +1008,9 @@

*ppPreStmt = 0;

+ Tcl_ObjType *tclWideIntType = Tcl_GetObjType("wideint");
+ Tcl_ObjType *tclDoubleType = Tcl_GetObjType("double");
+
/* Trim spaces from the start of zSql and calculate the remaining length. */
while( isspace(zSql[0]) ){ zSql++; }
nSql = strlen30(zSql);
@@ -1092,6 +1089,8 @@
if( pVar ){
int n;
u8 *data;
+ Tcl_WideInt v;
+ double r;
const char *zType = (pVar->typePtr ? pVar->typePtr->name : "");
char c = zType[0];
if( zVar[0]=='@' ||
@@ -1103,18 +1102,10 @@
sqlite3_bind_blob(pStmt, i, data, n, SQLITE_STATIC);
Tcl_IncrRefCount(pVar);
pPreStmt->apParm[iParm++] = pVar;
- }else if( c=='b' && strcmp(zType,"boolean")==0 ){
- Tcl_GetIntFromObj(interp, pVar, &n);
- sqlite3_bind_int(pStmt, i, n);
- }else if( c=='d' && strcmp(zType,"double")==0 ){
- double r;
- Tcl_GetDoubleFromObj(interp, pVar, &r);
- sqlite3_bind_double(pStmt, i, r);
- }else if( (c=='w' && strcmp(zType,"wideInt")==0) ||
- (c=='i' && strcmp(zType,"int")==0) ){
- Tcl_WideInt v;
- Tcl_GetWideIntFromObj(interp, pVar, &v);
+ }else if( TCL_OK == Tcl_GetWideIntFromObj(interp, pVar, &v)) {
sqlite3_bind_int64(pStmt, i, v);
+ }else if( TCL_OK == Tcl_GetDoubleFromObj(interp, pVar, &r)) {
+ sqlite3_bind_double(pStmt, i, r);
}else{
data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
sqlite3_bind_text(pStmt, i, (char *)data, n, SQLITE_STATIC);

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru