r7480: ldb_sqlite3 work in progress
authorDerrell Lipman <derrell@samba.org>
Sat, 11 Jun 2005 03:20:26 +0000 (03:20 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:17:57 +0000 (13:17 -0500)
(This used to be commit 510e7994da808ab12f51fa7a36c3f5f9244c51ac)

source4/lib/ldb/common/ldb_explode_dn.c
source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c

index f015ce81c7d66d24786c90ec45c010dba3b8002c..cacd9862b61c80839a6292661c4784fad0f84e06 100644 (file)
@@ -377,8 +377,7 @@ ldb_explode_dn(void * mem_ctx,
                  */
 
                 /* allocate space for the normalized component */
-               if ((component->component =
-                     dest = talloc_size(component, size)) == NULL) {
+               if ((dest = talloc_size(component, size)) == NULL) {
 
                         goto failed;
                 }
@@ -396,6 +395,9 @@ ldb_explode_dn(void * mem_ctx,
                         dest += size;
                }
 
+                /* Save the just-generated string */
+                component->component = dest;
+
                ldb_debug(mem_ctx,
                           LDB_DEBUG_TRACE,
                           "component: [%s]\n", component->component);
@@ -432,7 +434,7 @@ ldb_explode_dn(void * mem_ctx,
        }
 
        /* rebuild the normalized DN */
-       if ((dn->dn = dest = talloc_size(dn, size)) == NULL) {
+       if ((dest = talloc_size(dn, size)) == NULL) {
                 goto failed;
         }
 
@@ -453,6 +455,9 @@ ldb_explode_dn(void * mem_ctx,
                 dest += size;
        }
 
+        /* Save the just-generated string */
+        dn->dn = dest;
+
        ldb_debug(mem_ctx, LDB_DEBUG_TRACE, "dn: [%s]\n", dn->dn);
 
         /* we don't need the copy of the DN any more */
index e491fba6e08b2f908025fee34e56d2986723b92e..556702a21d63d351e504c6cebba901fd5a139aa1 100644 (file)
@@ -1288,9 +1288,15 @@ new_dn(struct ldb_module * module,
        char * pDN,
        long long * pEID)
 {
+        int                         nComponent;
+        int                         bFirst;
+        char *                      p;
+        char *                      pPartialDN;
+        long long                   eid;
         struct ldb_dn *             pExplodedDN;
+        struct ldb_dn_component *   pComponent;
        struct ldb_context *        ldb = module->ldb;
-//     struct lsqlite3_private *   lsqlite3 = module->private_data;
+       struct lsqlite3_private *   lsqlite3 = module->private_data;
 
         /* Explode and normalize the DN */
         if ((pExplodedDN =
@@ -1301,8 +1307,71 @@ new_dn(struct ldb_module * module,
                 return -1;
         }
 
-#warning "*** new_dn() not yet fully implemented ***"
-        return -1;
+        /* Allocate a string to hold the partial DN of each component */
+        if ((pPartialDN = talloc_strdup(ldb, "")) == NULL) {
+                return -1;
+        }
+
+        /* For each component of the DN (starting with the last one)... */
+        eid = 0;
+        for (nComponent = pExplodedDN->comp_num - 1, bFirst = TRUE;
+             nComponent >= 0;
+             nComponent--, bFirst = FALSE) {
+                
+                /* Point to the component */
+                pComponent = pExplodedDN->components[nComponent];
+
+                /* Add this component on to the partial DN to date */
+                if ((p = talloc_asprintf(ldb,
+                                         "%s%s%s",
+                                         pComponent->component,
+                                         bFirst ? "" : ",",
+                                         pPartialDN)) == NULL) {
+                        return -1;
+                }
+
+                /* No need for the old partial DN any more */
+                talloc_free(pPartialDN);
+
+                /* Save the new partial DN */
+                pPartialDN = p;
+
+                /*
+                 * Ensure that an entry is in the ldb_entry table for this
+                 * component.  Any component other than the last one
+                 * (component 0) may already exist.  It is an error if
+                 * component 0 (the full DN requested to be be inserted)
+                 * already exists.
+                 */
+                if (bFirst) {
+                        /* This is a top-level entry.  Parent EID is null. */
+                        QUERY_NOROWS(lsqlite3,
+                                     FALSE,
+                                     "INSERT %s INTO ldb_entry "
+                                     "    (peid, dn) "
+                                     "  VALUES "
+                                     "    (NULL, %q);",
+                                     nComponent == 0 ? "" : "OR IGNORE",
+                                     pPartialDN);
+                } else {
+                        QUERY_NOROWS(lsqlite3,
+                                     FALSE,
+                                     "INSERT %s INTO ldb_entry "
+                                     "    (peid, dn) "
+                                     "  VALUES "
+                                     "    (%lld, %q);",
+                                     nComponent == 0 ? "" : "OR IGNORE",
+                                     eid, pPartialDN);
+                }
+
+                /* Get the EID of the just inserted row (the next parent) */
+                eid = sqlite3_last_insert_rowid(lsqlite3->sqlite);
+        }
+
+        /* Give 'em what they came for! */
+        *pEID = eid;
+
+        return 0;
 }
 
 
@@ -1310,18 +1379,38 @@ static int
 new_attr(struct ldb_module * module,
                   char * pAttrName)
 {
+        long long                   bExists;
        struct lsqlite3_private *   lsqlite3 = module->private_data;
 
-        /* NOTE: pAttrName is assumed to already be case-folded here! */
-        QUERY_NOROWS(lsqlite3,
-                     FALSE,
-                     "CREATE TABLE ldb_attr_%q "
-                     "("
-                     "  eid        INTEGER REFERENCES ldb_entry, "
-                     "  attr_value TEXT"
-                     ");",
-                     pAttrName);
+        /*
+         * NOTE:
+         *   pAttrName is assumed to already be case-folded here!
+         */
+
+        /* See if the table already exists */
+        QUERY_INT(lsqlite3,
+                  bExists,
+                  FALSE,
+                  "SELECT COUNT(*) <> 0"
+                  "  FROM sqlite_master "
+                  "  WHERE type = 'table' "
+                  "    AND tbl_name = %Q;",
+                  pAttrName);
+
+        /* Did it exist? */
+        if (! bExists) {
+                /* Nope.  Create the table */
+                QUERY_NOROWS(lsqlite3,
+                             FALSE,
+                             "CREATE TABLE ldb_attr_%q "
+                             "("
+                             "  eid        INTEGER REFERENCES ldb_entry, "
+                             "  attr_value TEXT"
+                             ");",
+                             pAttrName);
+        }
 
         return 0;
 }
 
+