Author: mkhl Date: 2006-08-20 23:14:12 +0000 (Sun, 20 Aug 2006) New Revision: 17636
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17636 Log: Update set of changes to smbcalls_* and mprutil to facilitate ldb operations from ejs. Martin Modified: branches/SOC/mkhl/ejs-map/ejs.patch Changeset: Modified: branches/SOC/mkhl/ejs-map/ejs.patch =================================================================== --- branches/SOC/mkhl/ejs-map/ejs.patch 2006-08-20 23:07:36 UTC (rev 17635) +++ branches/SOC/mkhl/ejs-map/ejs.patch 2006-08-20 23:14:12 UTC (rev 17636) @@ -1,13 +1,128 @@ Add access to the ldb_attrib_handler to smbcalls_ldb. These don't really belong in the smbcalls files, they aren't usually accessed from ejs client scripts. -Add GUID handling to mprutils. +Add ldb_val handling to mprutil. +Add GUID handling to mprutil. +Add more GUID handling to smbcalls_guid. +Index: scripting/ejs/smbcalls.h +=================================================================== +--- scripting/ejs/smbcalls.h (revision 17618) ++++ scripting/ejs/smbcalls.h (working copy) +@@ -29,6 +29,9 @@ + void mprSetCFunction(struct MprVar *obj, const char *name, MprCFunction fn); + void mprSetStringCFunction(struct MprVar *obj, const char *name, MprStringCFunction fn); + ++struct MprVar mprLdbVal(const struct ldb_val val); ++struct ldb_val mprToLdbVal(struct MprVar *var); ++ + struct smbcalls_context { + struct event_context *event_ctx; + struct messaging_context *msg_ctx; +@@ -36,6 +39,7 @@ + + struct ldb_context; + struct ldb_message; ++struct ldb_attrib_handler; + struct cli_credentials; + + #include "scripting/ejs/proto.h" +Index: scripting/ejs/smbcalls_guid.c +=================================================================== +--- scripting/ejs/smbcalls_guid.c (revision 0) ++++ scripting/ejs/smbcalls_guid.c (revision 0) +@@ -0,0 +1,78 @@ ++#include "includes.h" ++#include "scripting/ejs/smbcalls.h" ++#include "lib/appweb/ejs/ejs.h" ++#include "lib/ldb/include/ldb.h" ++#include "librpc/gen_ndr/ndr_misc.h" ++#include "librpc/ndr/libndr.h" ++ ++static int ejs_encodeGuid(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ struct GUID *guid; ++ struct ldb_val val; ++ NTSTATUS status; ++ ++ if (argc != 1) { ++ ejsSetErrorMsg(eid, "encodeGuid invalid argument count"); ++ return -1; ++ } ++ ++ val = data_blob(NULL, 0); ++ ++ guid = mprToGuid(mprMemCtx(), argv[0]); ++ if (guid == NULL) { ++ ejsSetErrorMsg(eid, "encodeGuid invalid GUID string"); ++ return -1; ++ } ++ ++ status = ndr_push_struct_blob(&val, mprMemCtx(), guid, ++ (ndr_push_flags_fn_t)ndr_push_GUID); ++ if (NT_STATUS_IS_OK(status)) { ++ talloc_free(guid); ++ ejsSetErrorMsg(eid, "encodeGuid failed to encode GUID"); ++ return -1; ++ } ++ ++ talloc_free(guid); ++ mpr_Return(eid, mprLdbVal(val)); ++ return 0; ++} ++ ++static int ejs_decodeGuid(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ struct GUID *guid; ++ struct ldb_val val; ++ NTSTATUS status; ++ ++ if (argc != 1) { ++ ejsSetErrorMsg(eid, "decodeGuid invalid argument count"); ++ return -1; ++ } ++ ++ guid = talloc(mprMemCtx(), struct GUID); ++ if (guid == NULL) { ++ ejsSetErrorMsg(eid, "decodeGuid Out of Memory"); ++ return -1; ++ } ++ ++ val = mprToLdbVal(argv[0]); ++ ++ status = ndr_pull_struct_blob(&val, guid, guid, ++ (ndr_pull_flags_fn_t)ndr_pull_GUID); ++ if (!NT_STATUS_IS_OK(status)) { ++ talloc_free(guid); ++ ejsSetErrorMsg(eid, "decodeGuid failed to decode GUID"); ++ return -1; ++ } ++ ++ mpr_Return(eid, mprGuid(guid)); ++ talloc_free(guid); ++ return 0; ++} ++ ++NTSTATUS smb_setup_ejs_guid(void) ++{ ++ ejsDefineCFunction(-1, "encodeGuid", ejs_encodeGuid, NULL, MPR_VAR_SCRIPT_HANDLE); ++ ejsDefineCFunction(-1, "decodeGuid", ejs_decodeGuid, NULL, MPR_VAR_SCRIPT_HANDLE); ++ return NT_STATUS_OK; ++} ++ Index: scripting/ejs/smbcalls_ldb.c =================================================================== ---- scripting/ejs/smbcalls_ldb.c (Revision 17553) -+++ scripting/ejs/smbcalls_ldb.c (Arbeitskopie) -@@ -524,6 +524,67 @@ +--- scripting/ejs/smbcalls_ldb.c (revision 17618) ++++ scripting/ejs/smbcalls_ldb.c (working copy) +@@ -26,6 +26,7 @@ + #include "lib/appweb/ejs/ejs.h" + #include "lib/ldb/include/ldb.h" + #include "lib/ldb/include/ldb_errors.h" ++#include "lib/ldb/include/ldb_private.h" + #include "db_wrap.h" + + /* +@@ -524,6 +525,68 @@ } /* @@ -27,19 +142,19 @@ + } + + ldb = ejs_get_ldb_context(eid); -+ if (ldb = NULL) { ++ if (ldb == NULL) { + return -1; + } + -+ val.data = (uint8_t *)mprToString(argv[0]); ++ val.data = (uint8_t *)discard_const_p(char, mprToString(argv[0])); + val.length = strlen((char *)val.data); + -+ ret = ldb_handler_copy(ldb, mprMemCtx(), val, &out); ++ ret = ldb_handler_copy(ldb, mprMemCtx(), &val, &out); + if (ret) { + return -1; + } + -+ mpr_Return(mprData(out.data, out.length)); ++ mpr_Return(eid, mprData(out.data, out.length)); + return 0; +} + @@ -48,12 +163,13 @@ + usage: + handler = ldb.attrib_handler("attribute"); + val = handler.canonicalise(ldb, oldval); ++ XXX: This should really be reorganized i na mildly object-oriented fashion. ++ The part from mprutil is actually closer to what I want in *this* place... +*/ +static int ejs_ldb_attrib_handler(MprVarHandle eid, int argc, struct MprVar **argv) +{ + struct ldb_context *ldb; + const struct ldb_attrib_handler *handler; -+ int ret; + + if (argc != 1) { + ejsSetErrorMsg(eid, "ldb.attrib_handler invalid arguments"); @@ -61,13 +177,13 @@ + } + + ldb = ejs_get_ldb_context(eid); -+ if (ldb = NULL) { ++ if (ldb == NULL) { + return -1; + } + + handler = ldb_attrib_handler(ldb, mprToString(argv[0])); + -+ mpr_Return(mprLdbAttribHandler(ldb, handler)); ++ mprLdbAttribHandler(eid, ldb, handler); + return 0; +} + @@ -75,7 +191,7 @@ initialise ldb ejs subsystem */ static int ejs_ldb_init(MprVarHandle eid, int argc, struct MprVar **argv) -@@ -544,6 +605,8 @@ +@@ -544,6 +607,8 @@ mprSetCFunction(ldb, "transaction_start", ejs_ldbTransactionStart); mprSetCFunction(ldb, "transaction_cancel", ejs_ldbTransactionCancel); mprSetCFunction(ldb, "transaction_commit", ejs_ldbTransactionCommit); @@ -84,11 +200,37 @@ mprSetVar(ldb, "SCOPE_BASE", mprCreateNumberVar(LDB_SCOPE_BASE)); mprSetVar(ldb, "SCOPE_ONE", mprCreateNumberVar(LDB_SCOPE_ONELEVEL)); mprSetVar(ldb, "SCOPE_SUBTREE", mprCreateNumberVar(LDB_SCOPE_SUBTREE)); +Index: scripting/ejs/config.mk +=================================================================== +--- scripting/ejs/config.mk (revision 17618) ++++ scripting/ejs/config.mk (working copy) +@@ -11,6 +11,11 @@ + SUBSYSTEM = smbcalls + INIT_FUNCTION = smb_setup_ejs_config + ++[MODULE::smbcalls_guid] ++OBJ_FILES = smbcalls_guid.o ++SUBSYSTEM = smbcalls ++INIT_FUNCTION = smb_setup_ejs_guid ++ + [MODULE::smbcalls_ldb] + OBJ_FILES = smbcalls_ldb.o + SUBSYSTEM = smbcalls Index: scripting/ejs/mprutil.c =================================================================== ---- scripting/ejs/mprutil.c (Revision 17553) -+++ scripting/ejs/mprutil.c (Arbeitskopie) -@@ -139,6 +139,14 @@ +--- scripting/ejs/mprutil.c (revision 17618) ++++ scripting/ejs/mprutil.c (working copy) +@@ -25,6 +25,9 @@ + #include "lib/ldb/include/ldb.h" + #include "scripting/ejs/smbcalls.h" + ++#include "librpc/gen_ndr/ndr_misc.h" ++#include "librpc/ndr/libndr.h" ++ + /* + return a default mpr object + */ +@@ -139,6 +142,14 @@ } /* @@ -103,10 +245,157 @@ construct a string MprVar from a lump of data */ struct MprVar mprData(const uint8_t *p, size_t length) -@@ -252,6 +260,26 @@ +@@ -154,6 +165,25 @@ } /* ++ construct a string MprVar from an ldb_val ++*/ ++struct MprVar mprLdbVal(const struct ldb_val val) ++{ ++ return mprData(val.data, val.length); ++} ++ ++/* ++ turn a MprVar string variable into an ldb_val ++*/ ++const struct ldb_val mprToLdbVal(struct MprVar *var) ++{ ++ struct ldb_val val; ++ val.data = (uint8_t *)discard_const_p(char, mprToString(var)); ++ val.length = strlen((char *)val.data); ++ return val; ++} ++ ++/* + turn a ldb_message into a ejs object variable + */ + static struct MprVar mprLdbMessage(struct ldb_context *ldb, struct ldb_message *msg) +@@ -209,7 +239,6 @@ + return mprCreateUndefinedVar(); + } + +- + /* + turn an array of ldb_messages into a ejs object variable + */ +@@ -228,6 +257,112 @@ + + + /* ++ XXX: see comment below ++*/ ++static int ejs_ldbAttribHandler_handle(MprVarHandle eid, ldb_attr_handler_t handler, struct MprVar *arg) ++{ ++ struct ldb_context *ldb; ++ struct ldb_val val, out; ++ int ret; ++ ++ ldb = mprGetThisPtr(eid, "db"); ++ val = mprToLdbVal(arg); ++ ++ ret = handler(ldb, mprMemCtx(), &val, &out); ++ if (ret) { ++ return -1; ++ } ++ ++ mpr_Return(eid, mprData(out.data, out.length)); ++ return 0; ++} ++ ++static int ejs_ldbAttribHandler_ldif_read(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ const struct ldb_attrib_handler *handler; ++ ++ if (argc != 1) { ++ ejsSetErrorMsg(eid, "handler.ldif_read invalid arguments"); ++ return -1; ++ } ++ ++ handler = mprGetThisPtr(eid, "handler"); ++ ++ return ejs_ldbAttribHandler_handle(eid, handler->ldif_read_fn, argv[0]); ++} ++ ++static int ejs_ldbAttribHandler_ldif_write(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ const struct ldb_attrib_handler *handler; ++ ++ if (argc != 1) { ++ ejsSetErrorMsg(eid, "handler.ldif_write invalid arguments"); ++ return -1; ++ } ++ ++ handler = mprGetThisPtr(eid, "handler"); ++ ++ return ejs_ldbAttribHandler_handle(eid, handler->ldif_write_fn, argv[0]); ++} ++ ++static int ejs_ldbAttribHandler_canonicalise(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ const struct ldb_attrib_handler *handler; ++ ++ if (argc != 1) { ++ ejsSetErrorMsg(eid, "handler.canonicalise invalid arguments"); ++ return -1; ++ } ++ ++ handler = mprGetThisPtr(eid, "handler"); ++ ++ return ejs_ldbAttribHandler_handle(eid, handler->canonicalise_fn, argv[0]); ++} ++ ++static int ejs_ldbAttribHandler_comparison(MprVarHandle eid, int argc, struct MprVar **argv) ++{ ++ struct ldb_context *ldb; ++ const struct ldb_attrib_handler *handler; ++ struct ldb_val val1, val2; ++ int ret; ++ ++ if (argc != 2) { ++ ejsSetErrorMsg(eid, "handler.compare invalid arguments"); ++ return -1; ++ } ++ ++ ldb = mprGetThisPtr(eid, "db"); ++ handler = mprGetThisPtr(eid, "handler"); ++ ++ val1 = mprToLdbVal(argv[0]); ++ val2 = mprToLdbVal(argv[1]); ++ ++ ret = handler->comparison_fn(ldb, mprMemCtx(), &val1, &val2); ++ mpr_Return(eid, mprCreateIntegerVar(ret)); ++ return 0; ++} ++ ++/* ++ XXX: This part and the one from smbcalls_ldb should be organized ++ together and in a way that fits the mildly object-oriented fashion ++ of ejs. This function actually looks a lot like the way to go... ++*/ ++int mprLdbAttribHandler(MprVarHandle eid, struct ldb_context *ldb, const struct ldb_attrib_handler *handler) ++{ ++ struct MprVar *var = mprInitObject(eid, handler->attr, 0, NULL); ++ ++ mprSetPtr(var, "db", ldb); ++ mprSetPtr(var, "handler", handler); ++ mprSetVar(var, "attr", mprString(handler->attr)); ++ mprSetCFunction(var, "ldif_read", ejs_ldbAttribHandler_ldif_read); ++ mprSetCFunction(var, "ldif_write", ejs_ldbAttribHandler_ldif_write); ++ mprSetCFunction(var, "canonicalise", ejs_ldbAttribHandler_canonicalise); ++ mprSetCFunction(var, "compare", ejs_ldbAttribHandler_comparison); ++ ++ return 0; ++} ++ ++/* + turn a MprVar string variable into a const char * + */ + const char *mprToString(struct MprVar *v) +@@ -252,6 +387,26 @@ + } + + /* + turn a MprVar string variable into a GUID struct +*/ +struct GUID *mprToGuid(TALLOC_CTX *mem_ctx, struct MprVar *v) @@ -130,4 +419,3 @@ turn a MprVar object variable into a string list this assumes the object variable consists only of strings */ -