svn commit: samba r17636 - in branches/SOC/mkhl/ejs-map: .
mkhl at samba.org
mkhl at samba.org
Sun Aug 20 23:14:13 GMT 2006
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
*/
-
More information about the samba-cvs
mailing list