Index: library/mongodb/mongoAPI.decls =================================================================== diff -u -rab21c8502870e715c567c657146283699e31b01b -r7fd68223bc5bc14af69bbe5779991819b3327b3b --- library/mongodb/mongoAPI.decls (.../mongoAPI.decls) (revision ab21c8502870e715c567c657146283699e31b01b) +++ library/mongodb/mongoAPI.decls (.../mongoAPI.decls) (revision 7fd68223bc5bc14af69bbe5779991819b3327b3b) @@ -24,6 +24,11 @@ {-argName "json" -required 1 -type tclobj} } +# returns the timestamp portion of the ObjectId in form of an epoch +cmd oid::gettimestamp NsfMongoOidGettimestamp { + {-argName "oid" -required 1} +} + cmd close NsfMongoClose { {-argName "conn" -required 1 -type mongoc_client_t -withObj 1} } Index: library/mongodb/mongoAPI.h =================================================================== diff -u -r745c46b4619253f283fe4285d1f4a83375e3d9d7 -r7fd68223bc5bc14af69bbe5779991819b3327b3b --- library/mongodb/mongoAPI.h (.../mongoAPI.h) (revision 745c46b4619253f283fe4285d1f4a83375e3d9d7) +++ library/mongodb/mongoAPI.h (.../mongoAPI.h) (revision 7fd68223bc5bc14af69bbe5779991819b3327b3b) @@ -89,7 +89,7 @@ /* just to define the symbol */ -static Nsf_methodDefinition method_definitions[31]; +static Nsf_methodDefinition method_definitions[32]; static const char *method_command_namespace_names[] = { "::mongo" @@ -150,6 +150,8 @@ NSF_nonnull(2) NSF_nonnull(4); static int NsfMongoJsonParseStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) NSF_nonnull(2) NSF_nonnull(4); +static int NsfMongoOidGettimestampStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) + NSF_nonnull(2) NSF_nonnull(4); static int NsfMongoRunCmdStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) NSF_nonnull(2) NSF_nonnull(4); static int NsfMongoStatusStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) @@ -211,6 +213,8 @@ NSF_nonnull(1) NSF_nonnull(2); static int NsfMongoJsonParse(Tcl_Interp *interp, Tcl_Obj *jsonObj) NSF_nonnull(1) NSF_nonnull(2); +static int NsfMongoOidGettimestamp(Tcl_Interp *interp, const char *oid) + NSF_nonnull(1) NSF_nonnull(2); static int NsfMongoRunCmd(Tcl_Interp *interp, int withNocomplain, mongoc_client_t *connPtr, const char *db, Tcl_Obj *cmdObj) NSF_nonnull(1) NSF_nonnull(3) NSF_nonnull(4) NSF_nonnull(5); static int NsfMongoStatus(Tcl_Interp *interp, mongoc_client_t *connPtr, Tcl_Obj *connObj) @@ -245,6 +249,7 @@ NsfMongoGridFileSeekIdx, NsfMongoJsonGenerateIdx, NsfMongoJsonParseIdx, + NsfMongoOidGettimestampIdx, NsfMongoRunCmdIdx, NsfMongoStatusIdx } NsfMethods; @@ -839,6 +844,26 @@ } static int +NsfMongoOidGettimestampStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) { + ParseContext pc; + (void)clientData; + + if (likely(ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[NsfMongoOidGettimestampIdx].paramDefs, + method_definitions[NsfMongoOidGettimestampIdx].nrParameters, 0, NSF_ARGPARSE_BUILTIN, + &pc) == TCL_OK)) { + const char *oid = (const char *)pc.clientData[0]; + + assert(pc.status == 0); + return NsfMongoOidGettimestamp(interp, oid); + + } else { + + return TCL_ERROR; + } +} + +static int NsfMongoRunCmdStub(ClientData clientData, Tcl_Interp *interp, TCL_OBJC_T objc, Tcl_Obj *const* objv) { ParseContext pc; (void)clientData; @@ -881,7 +906,7 @@ } } -static Nsf_methodDefinition method_definitions[31] = { +static Nsf_methodDefinition method_definitions[32] = { {"::mongo::collection::close", NsfCollectionCloseStub, 1, { {"collection", NSF_ARG_REQUIRED, 1, Nsf_ConvertTo_Pointer, NULL,NULL,"mongoc_collection_t",NULL,NULL,NULL,NULL,NULL}} }, @@ -1002,6 +1027,9 @@ {"::mongo::json::parse", NsfMongoJsonParseStub, 1, { {"json", NSF_ARG_REQUIRED, 1, Nsf_ConvertTo_Tclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, +{"::mongo::oid::gettimestamp", NsfMongoOidGettimestampStub, 1, { + {"oid", NSF_ARG_REQUIRED, 1, Nsf_ConvertTo_String, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} +}, {"::mongo::run", NsfMongoRunCmdStub, 4, { {"-nocomplain", 0, 0, Nsf_ConvertTo_String, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}, {"conn", NSF_ARG_REQUIRED, 1, Nsf_ConvertTo_Pointer, NULL,NULL,"mongoc_client_t",NULL,NULL,NULL,NULL,NULL}, Index: library/mongodb/nsfmongo.c =================================================================== diff -u -r745c46b4619253f283fe4285d1f4a83375e3d9d7 -r7fd68223bc5bc14af69bbe5779991819b3327b3b --- library/mongodb/nsfmongo.c (.../nsfmongo.c) (revision 745c46b4619253f283fe4285d1f4a83375e3d9d7) +++ library/mongodb/nsfmongo.c (.../nsfmongo.c) (revision 7fd68223bc5bc14af69bbe5779991819b3327b3b) @@ -659,6 +659,31 @@ } /* + cmd oid::gettimestamp NsfMongoOidGettimestamp { + {-argName "oid" -required 1} + } +*/ +static int NsfMongoOidGettimestamp(Tcl_Interp *interp, const char *oid) +{ + int result; + + if (strlen(oid) < 24) { + result = NsfPrintError(interp, "mongo::oid::gettimestamp:" + "the input string MUST be 24 characters or more in length"); + } else { + bson_oid_t oid_value; + time_t t; + + bson_oid_init_from_string (&oid_value, oid); + t = bson_oid_get_time_t(&oid_value); + fprintf (stderr, "The OID was generated at %u\n", (unsigned) t); + Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt)t)); + result = TCL_OK; + } + return result; +} + +/* cmd close NsfMongoClose { {-argName "conn" -required 1 -type mongoc_client_t -withObj 1} } @@ -1666,6 +1691,7 @@ } + /*********************************************************************** * GridFile interface * Index: library/mongodb/pkgIndex.add =================================================================== diff -u -r745c46b4619253f283fe4285d1f4a83375e3d9d7 -r7fd68223bc5bc14af69bbe5779991819b3327b3b --- library/mongodb/pkgIndex.add (.../pkgIndex.add) (revision 745c46b4619253f283fe4285d1f4a83375e3d9d7) +++ library/mongodb/pkgIndex.add (.../pkgIndex.add) (revision 7fd68223bc5bc14af69bbe5779991819b3327b3b) @@ -1 +1 @@ -package ifneeded nsf::mongo 2.4.0 [list load [file join $dir libtcl9nsfmongo2.4.0.dylib]] +package ifneeded nsf::mongo 2.4.0 [list load [file join $dir libnsfmongo2.4.0.dylib]] Index: library/mongodb/tests/nsf-mongo.test =================================================================== diff -u -rf10f6e087eba19df21585a1776e095862306855d -r7fd68223bc5bc14af69bbe5779991819b3327b3b --- library/mongodb/tests/nsf-mongo.test (.../nsf-mongo.test) (revision f10f6e087eba19df21585a1776e095862306855d) +++ library/mongodb/tests/nsf-mongo.test (.../nsf-mongo.test) (revision 7fd68223bc5bc14af69bbe5779991819b3327b3b) @@ -273,8 +273,9 @@ puts [C bson pp $stats] } +puts stderr "Creation time of 64f9ce9eb84de6be1f06e967 in epoch value" +? {::mongo::oid::gettimestamp 64f9ce9eb84de6be1f06e967} "1694092958" - puts stderr "\nStatus" set status [::mongo::status $mongoConn] puts [C bson pp $status]