Index: library/mongodb/nsfmongo.c =================================================================== diff -u -r04b17cf850af721f6ad1760dece06ef78b11da83 -r42ba8471f7620b850b6296f753cbc3079fe5c6cd --- library/mongodb/nsfmongo.c (.../nsfmongo.c) (revision 04b17cf850af721f6ad1760dece06ef78b11da83) +++ library/mongodb/nsfmongo.c (.../nsfmongo.c) (revision 42ba8471f7620b850b6296f753cbc3079fe5c6cd) @@ -132,7 +132,7 @@ Tcl_Obj * BsonToList(Tcl_Interp *interp, const char *data , int depth) { bson_iterator i; - const char *key, *tag; + const char *tag; char oidhex[25]; Tcl_Obj *resultObj, *elemObj; @@ -141,6 +141,7 @@ while ( bson_iterator_next( &i ) ){ bson_type t = bson_iterator_type( &i ); + const char *key; if ( t == 0 ) break; @@ -155,6 +156,8 @@ case BSON_BOOL: tag = "boolean"; elemObj = Tcl_NewBooleanObj(bson_iterator_bool( &i )); break; case BSON_REGEX: tag = "regex"; elemObj = Tcl_NewStringObj(bson_iterator_regex( &i ), -1); break; case BSON_STRING: tag = "string"; elemObj = Tcl_NewStringObj(bson_iterator_string( &i ), -1); break; + case BSON_MINKEY: tag = "minkey"; elemObj = Tcl_NewStringObj("null", 4); break; + case BSON_MAXKEY: tag = "maxkey"; elemObj = Tcl_NewStringObj("null", 4); break; case BSON_NULL: tag = "null"; elemObj = Tcl_NewStringObj("null", 4); break; case BSON_OID: { tag = "oid"; @@ -220,6 +223,10 @@ if (*(tag + 1) == 'o') /* double */ return BSON_DOUBLE; case 'i': /* integer */ return BSON_INT; case 'l': /* long */ return BSON_LONG; + case 'm': + if (*(tag + 1) == 'i') /* minkey */ return BSON_MINKEY; + if (*(tag + 1) == 'a') /* maxkey */ return BSON_MAXKEY; + break; case 'n': /* null */ return BSON_NULL; case 'o': if (*(tag + 1) == 'i') /* oid */ return BSON_OID; @@ -288,6 +295,12 @@ bson_append_long(bbPtr, name, v); break; } + case BSON_MAXKEY: + bson_append_maxkey(bbPtr, name); + break; + case BSON_MINKEY: + bson_append_minkey(bbPtr, name); + break; case BSON_NULL: { bson_append_null(bbPtr, name); break; @@ -455,13 +468,12 @@ NsfMongoConnect(Tcl_Interp *interp, CONST char *replicaSet, Tcl_Obj *server, int withTimeout) { char channelName[80], *buffer = NULL; mongo_host_port host_port; - int result, objc = 0; + int status, objc = 0; mongo *connPtr; - int status; Tcl_Obj **objv; if (server) { - result = Tcl_ListObjGetElements(interp, server, &objc, &objv); + int result = Tcl_ListObjGetElements(interp, server, &objc, &objv); if (result != TCL_OK) { return NsfPrintError(interp, "The provided servers are not a well-formed list"); } @@ -538,13 +550,14 @@ /* cmd run NsfMongoRunCmd { + {-argName "-nocomplain" -required 0 -nrargs 0} {-argName "conn" -required 1 -type mongo} {-argName "db" -required 1} {-argName "cmd" -required 1 -type tclobj} } */ static int -NsfMongoRunCmd(Tcl_Interp *interp, mongo *connPtr, CONST char *db, Tcl_Obj *cmdObj) { +NsfMongoRunCmd(Tcl_Interp *interp, int withNocomplain, mongo *connPtr, CONST char *db, Tcl_Obj *cmdObj) { int result, objc; Tcl_Obj **objv; bson cmd[1], out[1]; @@ -559,11 +572,13 @@ result = mongo_run_command( connPtr, db, cmd, out ); bson_destroy( cmd ); - if (result != MONGO_OK) { - return NsfPrintError(interp, "mongo::run: provided command returned an unknown error"); + + if (withNocomplain == 0 && result != MONGO_OK) { + fprintf(stderr, "run result %d\n", result); + return NsfPrintError(interp, "mongo::run: command '%s' returned an unknown error", ObjStr(cmdObj)); } - Tcl_SetObjResult(interp, Tcl_NewIntObj(1)); + Tcl_SetObjResult(interp, Tcl_NewIntObj(result == MONGO_OK)); return TCL_OK; } @@ -670,7 +685,7 @@ */ static int NsfMongoInsert(Tcl_Interp *interp, mongo *connPtr, CONST char *namespace, Tcl_Obj *valuesObj) { int i, objc, result; - Tcl_Obj **objv, *resultObj; + Tcl_Obj **objv; bson b[1]; result = Tcl_ListObjGetElements(interp, valuesObj, &objc, &objv); @@ -697,7 +712,7 @@ if (result == MONGO_ERROR) { result = NsfPrintError(interp, ErrorMsg(connPtr->err)); } else { - resultObj = BsonToList(interp, b->data, 0); + Tcl_Obj *resultObj = BsonToList(interp, b->data, 0); Tcl_SetObjResult(interp, resultObj); result = TCL_OK; } @@ -774,7 +789,7 @@ */ static int NsfMongoRemove(Tcl_Interp *interp, mongo *connPtr, CONST char *namespace, Tcl_Obj *conditionObj) { - int objc, result; + int objc, result, status; Tcl_Obj **objv; bson query[1]; @@ -785,8 +800,10 @@ BsonAppendObjv(interp, query, objc, objv); /* for the time being, no write_concern (last arg of mongo_remove()) */ - mongo_remove(connPtr, namespace, query, NULL); + status = mongo_remove(connPtr, namespace, query, NULL); + Tcl_SetObjResult(interp, Tcl_NewIntObj(status == MONGO_OK)); + bson_destroy(query); return TCL_OK; } @@ -854,7 +871,6 @@ int withTailable, int withAwaitdata) { int objc1, objc2, result, options = 0; Tcl_Obj **objv1, **objv2; - char buffer[80]; mongo_cursor *cursor; bson query[1]; bson atts[1]; @@ -891,6 +907,7 @@ cursor = mongo_find( connPtr, namespace, query, atts, withLimit, withSkip, options); if (cursor) { + char buffer[80]; Nsf_PointerAdd(interp, buffer, "mongo_cursor", cursor); Tcl_SetObjResult(interp, Tcl_NewStringObj(buffer, -1)); } else { @@ -971,12 +988,12 @@ static int NsfMongoGridFSRemoveFile(Tcl_Interp *interp, gridfs *gridfsPtr, CONST char *filename) { - int result; + int status; /* the current interfaces does not return a status ! */ - result = gridfs_remove_filename(gridfsPtr, filename); + status = gridfs_remove_filename(gridfsPtr, filename); - Tcl_SetObjResult(interp, Tcl_NewIntObj(result == MONGO_OK)); + Tcl_SetObjResult(interp, Tcl_NewIntObj(status == MONGO_OK)); return TCL_OK; } @@ -1093,14 +1110,14 @@ */ static int NsfMongoGridFileOpen(Tcl_Interp *interp, gridfs *gridfsPtr, CONST char *filename) { - char buffer[80]; gridfile* gridFilePtr; int result; gridFilePtr = (gridfile *)ckalloc(sizeof(gridfile)); result = gridfs_find_filename(gridfsPtr, filename, gridFilePtr); if (result == MONGO_OK) { + char buffer[80]; Nsf_PointerAdd(interp, buffer, "gridfile", gridFilePtr); Tcl_SetObjResult(interp, Tcl_NewStringObj(buffer, -1)); } else {