r8602: allow options in ldb connect calls
[bbaumbach/samba-autobuild/.git] / source4 / scripting / ejs / smbcalls_ldb.c
index be54ac79ac1f150ca12c980561ef3c393bcb58d6..0795db9018acfb44ebf16d602970784fb34973fc 100644 (file)
@@ -28,9 +28,9 @@
 /*
   get the connected db
  */
-static struct ldb_context *ejs_ldb_db(int eid, struct MprVar *v)
+static struct ldb_context *ejs_get_ldb_context(int eid)
 {
-       struct ldb_context *ldb = mprGetPtr(v, "ldb");
+       struct ldb_context *ldb = mprGetThisPtr(eid, "db");
        if (ldb == NULL) {
                ejsSetErrorMsg(eid, "invalid ldb connection");
        }
@@ -41,44 +41,64 @@ static struct ldb_context *ejs_ldb_db(int eid, struct MprVar *v)
   perform an ldb search, returning an array of results
 
   syntax:
-     res = ldb.search(db, "expression");
+     res = ldb.search("expression");
      var attrs = new Array("attr1", "attr2", "attr3");
-     ldb.search(db, "expression", attrs);
+     ldb.search("expression", attrs);
+     var basedn = "cn=this,dc=is,dc=a,dc=test";
+     ldb.search("expression", attrs, ldb.SCOPE_SUBTREE, basedn);
 */
 static int ejs_ldbSearch(MprVarHandle eid, int argc, struct MprVar **argv)
 {
        const char **attrs = NULL;
        const char *expression;
+       const char *basedn = NULL;
+       int scope = LDB_SCOPE_DEFAULT;
        TALLOC_CTX *tmp_ctx = talloc_new(mprMemCtx());
        struct ldb_context *ldb;
        int ret;
        struct ldb_message **res;
 
        /* validate arguments */
-       if (argc < 2 || argc > 3) {
-               ejsSetErrorMsg(eid, "ldb.search invalid arguments");
+       if (argc < 1 || argc > 4) {
+               ejsSetErrorMsg(eid, "ldb.search invalid number of arguments");
                goto failed;
        }
-       if (argc == 3 && argv[2]->type != MPR_TYPE_OBJECT) {
+       if (argc > 3 && argv[3]->type != MPR_TYPE_OBJECT) {
                ejsSetErrorMsg(eid, "ldb.search attributes must be an object");
                goto failed;
        }
 
-       ldb = ejs_ldb_db(eid, argv[0]);
+       ldb = ejs_get_ldb_context(eid);
        if (ldb == NULL) {
                return -1;
        }
        
-       expression = mprToString(argv[1]);
+       expression = mprToString(argv[0]);
        if (expression == NULL) {
-               ejsSetErrorMsg(eid, "ldb.search invalid arguments");
+               ejsSetErrorMsg(eid, "ldb.search invalid expression");
                goto failed;
        }
+       if (argc > 1) {
+               basedn = mprToString(argv[1]);
+               /* a null basedn is valid */
+       }
        if (argc > 2) {
-               attrs = mprToList(tmp_ctx, argv[2]);
+               scope = mprToInt(argv[2]);
+               switch (scope) {
+                       case LDB_SCOPE_DEFAULT:
+                       case LDB_SCOPE_BASE:
+                       case LDB_SCOPE_ONELEVEL:
+                       case LDB_SCOPE_SUBTREE:
+                               break; /* ok */
+                       default:
+                               ejsSetErrorMsg(eid, "ldb.search invalid scope");
+                               goto failed;
+               }
        }
-
-       ret = ldb_search(ldb, NULL, LDB_SCOPE_DEFAULT, expression, attrs, &res);
+       if (argc > 3) {
+               attrs = mprToList(tmp_ctx, argv[3]);
+       }
+       ret = ldb_search(ldb, basedn, scope, expression, attrs, &res);
        if (ret == -1) {
                ejsSetErrorMsg(eid, "ldb.search failed - %s", ldb_errstring(ldb));
                mpr_Return(eid, mprCreateUndefinedVar());
@@ -106,18 +126,18 @@ static int ejs_ldbAddModify(MprVarHandle eid, int argc, struct MprVar **argv,
        struct ldb_ldif *ldif;
        int ret;
 
-       if (argc != 2) {
+       if (argc != 1) {
                ejsSetErrorMsg(eid, "ldb.add/modify invalid arguments");
                return -1;
        }
 
-       ldifstring = mprToString(argv[1]);
+       ldifstring = mprToString(argv[0]);
        if (ldifstring == NULL) {
                ejsSetErrorMsg(eid, "ldb.add/modify invalid arguments");
                return -1;
        }
 
-       ldb = ejs_ldb_db(eid, argv[0]);
+       ldb = ejs_get_ldb_context(eid);
        if (ldb == NULL) {
                return -1;
        }
@@ -136,7 +156,7 @@ static int ejs_ldbAddModify(MprVarHandle eid, int argc, struct MprVar **argv,
 /*
   perform an ldb delete
   usage:
-   ok = ldb.delete(db, dn);
+   ok = ldb.delete(dn);
 */
 static int ejs_ldbDelete(MprVarHandle eid, int argc, struct MprVar **argv)
 {
@@ -144,14 +164,14 @@ static int ejs_ldbDelete(MprVarHandle eid, int argc, struct MprVar **argv)
        struct ldb_context *ldb;
        int ret;
 
-       if (argc != 2) {
+       if (argc != 1) {
                ejsSetErrorMsg(eid, "ldb.delete invalid arguments");
                return -1;
        }
 
-       dn      = mprToString(argv[1]);
+       dn = mprToString(argv[0]);
 
-       ldb = ejs_ldb_db(eid, argv[0]);
+       ldb = ejs_get_ldb_context(eid);
        if (ldb == NULL) {
                return -1;
        }
@@ -164,7 +184,7 @@ static int ejs_ldbDelete(MprVarHandle eid, int argc, struct MprVar **argv)
 /*
   perform an ldb rename
   usage:
-   ok = ldb.rename(db, dn1, dn2);
+   ok = ldb.rename(dn1, dn2);
 */
 static int ejs_ldbRename(MprVarHandle eid, int argc, struct MprVar **argv)
 {
@@ -172,19 +192,19 @@ static int ejs_ldbRename(MprVarHandle eid, int argc, struct MprVar **argv)
        struct ldb_context *ldb;
        int ret;
 
-       if (argc != 3) {
+       if (argc != 2) {
                ejsSetErrorMsg(eid, "ldb.rename invalid arguments");
                return -1;
        }
 
-       dn1    = mprToString(argv[1]);
-       dn2    = mprToString(argv[2]);
+       dn1 = mprToString(argv[0]);
+       dn2 = mprToString(argv[1]);
        if (dn1 == NULL || dn2 == NULL) {
                ejsSetErrorMsg(eid, "ldb.rename invalid arguments");
                return -1;
        }
 
-       ldb = ejs_ldb_db(eid, argv[0]);
+       ldb = ejs_get_ldb_context(eid);
        if (ldb == NULL) {
                return -1;
        }
@@ -195,11 +215,29 @@ static int ejs_ldbRename(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+/*
+  get last error message
+  usage:
+   ok = ldb.errstring();
+*/
+static int ejs_ldbErrstring(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       struct ldb_context *ldb;
+
+       ldb = ejs_get_ldb_context(eid);
+       if (ldb == NULL) {
+               return -1;
+       }
+
+       mpr_Return(eid, mprString(ldb_errstring(ldb)));
+       return 0;
+}
+
 /*
   perform an ldb modify
 
   syntax:
-    ok = ldb.modify(db, ldifstring);
+    ok = ldb.modify(ldifstring);
 */
 static int ejs_ldbAdd(MprVarHandle eid, int argc, struct MprVar **argv)
 {
@@ -210,7 +248,7 @@ static int ejs_ldbAdd(MprVarHandle eid, int argc, struct MprVar **argv)
   perform an ldb add
 
   syntax:
-    ok = ldb.add(db, ldifstring);
+    ok = ldb.add(ldifstring);
 */
 static int ejs_ldbModify(MprVarHandle eid, int argc, struct MprVar **argv)
 {
@@ -220,31 +258,28 @@ static int ejs_ldbModify(MprVarHandle eid, int argc, struct MprVar **argv)
 /*
   connect to a database
   usage:
-   db = ldb.connect(dbfile);
+   ok = ldb.connect(dbfile);
+   ok = ldb.connect(dbfile, "modules:modlist");
 */
 static int ejs_ldbConnect(MprVarHandle eid, int argc, char **argv)
 {
        struct ldb_context *ldb;
        const char *dbfile;
-       struct MprVar v;
 
-       if (argc != 1) {
+       if (argc < 1) {
                ejsSetErrorMsg(eid, "ldb.connect invalid arguments");
                return -1;
        }
 
        dbfile = argv[0];
 
-       ldb = ldb_wrap_connect(mprMemCtx(), dbfile, 0, NULL);
+       ldb = ldb_wrap_connect(mprMemCtx(), dbfile, 0, argv+1);
        if (ldb == NULL) {
                ejsSetErrorMsg(eid, "ldb.connect failed to open %s", dbfile);
-               mpr_Return(eid, mprCreateUndefinedVar());
        }
 
-       v = mprObject("db");
-       mprSetPtrChild(&v, "ldb", ldb);
-
-       mpr_Return(eid, v);
+       mprSetThisPtr(eid, "db", ldb);
+       mpr_Return(eid, mprCreateBoolVar(ldb != NULL));
        return 0;
 }
 
@@ -254,16 +289,22 @@ static int ejs_ldbConnect(MprVarHandle eid, int argc, char **argv)
 */
 static int ejs_ldb_init(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       struct MprVar ldb = mprObject("ldb");
-
-       mprSetStringCFunction(&ldb, "connect", ejs_ldbConnect);
-       mprSetCFunction(&ldb, "search", ejs_ldbSearch);
-       mprSetCFunction(&ldb, "add", ejs_ldbAdd);
-       mprSetCFunction(&ldb, "modify", ejs_ldbModify);
-       mprSetCFunction(&ldb, "delete", ejs_ldbDelete);
-       mprSetCFunction(&ldb, "rename", ejs_ldbRename);
+       struct MprVar *ldb;
+       mpr_Return(eid, mprObject("ldb"));
+
+       ldb  = ejsGetReturnValue(eid);
+
+       mprSetStringCFunction(ldb, "connect", ejs_ldbConnect);
+       mprSetCFunction(ldb, "search", ejs_ldbSearch);
+       mprSetCFunction(ldb, "add", ejs_ldbAdd);
+       mprSetCFunction(ldb, "modify", ejs_ldbModify);
+       mprSetCFunction(ldb, "del", ejs_ldbDelete);
+       mprSetCFunction(ldb, "rename", ejs_ldbRename);
+       mprSetCFunction(ldb, "errstring", ejs_ldbErrstring);
+       mprSetVar(ldb, "SCOPE_BASE", mprCreateNumberVar(LDB_SCOPE_BASE));
+       mprSetVar(ldb, "SCOPE_ONE", mprCreateNumberVar(LDB_SCOPE_ONELEVEL));
+       mprSetVar(ldb, "SCOPE_SUBTREE", mprCreateNumberVar(LDB_SCOPE_SUBTREE));
 
-       mpr_Return(eid, ldb);
        return 0;
 }