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