Merge branch 'master' of ssh://git.samba.org/data/git/samba into abartlet-devel
authorAndrew Bartlett <abartlet@samba.org>
Tue, 16 Dec 2008 05:23:10 +0000 (16:23 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 16 Dec 2008 05:23:10 +0000 (16:23 +1100)
12 files changed:
lib/tdb/common/tdb.c
lib/tdb/include/tdb.h
lib/tdb/tools/tdbbackup.c
pidl/config.mk
source4/lib/ldb/common/ldb_modules.c
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/ldb.i
source4/lib/ldb/ldb_tdb/ldb_index.c
source4/lib/ldb/ldb_wrap.c
source4/lib/ldb/tools/ldbadd.c
source4/lib/ldb/tools/ldbedit.c
source4/lib/ldb/tools/ldbmodify.c

index c7cec297f6cd0c5c27d81067b4a84a5224dd36ad..8c61ec1a89d0e6303a507e24455940d9eeff13ab 100644 (file)
@@ -800,3 +800,92 @@ failed:
        tdb_unlockall(tdb);
        return -1;
 }
+
+struct traverse_state {
+       bool error;
+       struct tdb_context *dest_db;
+};
+
+/*
+  traverse function for repacking
+ */
+static int repack_traverse(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *private)
+{
+       struct traverse_state *state = (struct traverse_state *)private;
+       if (tdb_store(state->dest_db, key, data, TDB_INSERT) != 0) {
+               state->error = true;
+               return -1;
+       }
+       return 0;
+}
+
+/*
+  repack a tdb
+ */
+int tdb_repack(struct tdb_context *tdb)
+{
+       struct tdb_context *tmp_db;
+       struct traverse_state state;
+
+       if (tdb_transaction_start(tdb) != 0) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to start transaction\n"));
+               return -1;
+       }
+
+       tmp_db = tdb_open("tmpdb", tdb_hash_size(tdb), TDB_INTERNAL, O_RDWR|O_CREAT, 0);
+       if (tmp_db == NULL) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to create tmp_db\n"));
+               tdb_transaction_cancel(tdb);
+               return -1;
+       }
+
+       state.error = false;
+       state.dest_db = tmp_db;
+
+       if (tdb_traverse_read(tdb, repack_traverse, &state) == -1) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to traverse copying out\n"));
+               tdb_transaction_cancel(tdb);
+               tdb_close(tmp_db);
+               return -1;              
+       }
+
+       if (state.error) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Error during traversal\n"));
+               tdb_transaction_cancel(tdb);
+               tdb_close(tmp_db);
+               return -1;
+       }
+
+       if (tdb_wipe_all(tdb) != 0) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to wipe database\n"));
+               tdb_transaction_cancel(tdb);
+               tdb_close(tmp_db);
+               return -1;
+       }
+
+       state.error = false;
+       state.dest_db = tdb;
+
+       if (tdb_traverse_read(tmp_db, repack_traverse, &state) == -1) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to traverse copying back\n"));
+               tdb_transaction_cancel(tdb);
+               tdb_close(tmp_db);
+               return -1;              
+       }
+
+       if (state.error) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Error during second traversal\n"));
+               tdb_transaction_cancel(tdb);
+               tdb_close(tmp_db);
+               return -1;
+       }
+
+       tdb_close(tmp_db);
+
+       if (tdb_transaction_commit(tdb) != 0) {
+               TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to commit\n"));
+               return -1;
+       }
+
+       return 0;
+}
index c41c9941f0691074b59ec73e36f4ff003a9e9ef9..94b5e366b90cd28002ca4c21e405a0f2197b5ffb 100644 (file)
@@ -152,11 +152,14 @@ int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key);
 
 void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *sigptr);
 
+/* wipe and repack */
+int tdb_wipe_all(struct tdb_context *tdb);
+int tdb_repack(struct tdb_context *tdb);
+
 /* Debug functions. Not used in production. */
 void tdb_dump_all(struct tdb_context *tdb);
 int tdb_printfreelist(struct tdb_context *tdb);
 int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries);
-int tdb_wipe_all(struct tdb_context *tdb);
 int tdb_freelist_size(struct tdb_context *tdb);
 
 extern TDB_DATA tdb_null;
index 6f3ca48314f0ccbb0b48bcecf1637e0e3f628290..83c0e16399e1e1792559882e7dec73ca623e32ee 100644 (file)
@@ -126,9 +126,17 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
                return 1;
        }
 
-       /* lock the old tdb */
-       if (tdb_lockall(tdb) != 0) {
-               fprintf(stderr,"Failed to lock %s\n", old_name);
+       if (tdb_transaction_start(tdb) != 0) {
+               printf("Failed to start transaction on old tdb\n");
+               tdb_close(tdb);
+               tdb_close(tdb_new);
+               unlink(tmp_name);
+               free(tmp_name);
+               return 1;
+       }
+
+       if (tdb_transaction_start(tdb_new) != 0) {
+               printf("Failed to start transaction on new tdb\n");
                tdb_close(tdb);
                tdb_close(tdb_new);
                unlink(tmp_name);
@@ -152,6 +160,14 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
        /* close the old tdb */
        tdb_close(tdb);
 
+       if (tdb_transaction_commit(tdb_new) != 0) {
+               fprintf(stderr, "Failed to commit new tdb\n");
+               tdb_close(tdb_new);
+               unlink(tmp_name);
+               free(tmp_name);         
+               return 1;
+       }
+
        /* close the new tdb and re-open read-only */
        tdb_close(tdb_new);
        tdb_new = tdb_open(tmp_name, 0, TDB_DEFAULT, O_RDONLY, 0);
@@ -173,9 +189,6 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
                return 1;
        }
 
-       /* make sure the new tdb has reached stable storage */
-       fsync(tdb_fd(tdb_new));
-
        /* close the new tdb and rename it to .bak */
        tdb_close(tdb_new);
        if (rename(tmp_name, new_name) != 0) {
index 45582f5d568b54fce90aa66f13759d710978c3be..d7a84e3fcc23c0db4b3a64672890d6cd7d965e22 100644 (file)
@@ -28,4 +28,7 @@ $(pidldir)/lib/Parse/Pidl/Expr.pm: $(pidldir)/idl.yp
 
 testcov-html:: pidl-testcov
 
+pidl-clean:
+       /bin/rm -f $(pidldir)/Makefile
 
+clean:: pidl-clean
index 2b453bb0c37a2cccea7e9f6eef7103fdb142c5e7..ab0f4c51cc27f62a5cbfe719f62658d1012d8e02 100644 (file)
@@ -40,6 +40,9 @@
 #define LDB_MODULE_PREFIX      "modules:"
 #define LDB_MODULE_PREFIX_LEN  8
 
+static void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
+                                const char *symbol);
+
 void ldb_set_modules_dir(struct ldb_context *ldb, const char *path)
 {
        talloc_free(ldb->modules_dir);
@@ -291,8 +294,8 @@ int ldb_register_module(const struct ldb_module_ops *ops)
        return 0;
 }
 
-void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
-                           const char *symbol)
+static void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
+                                const char *symbol)
 {
        char *path;
        void *handle;
@@ -334,6 +337,10 @@ int ldb_load_modules_list(struct ldb_context *ldb, const char **module_list, str
        for (i = 0; module_list[i] != NULL; i++) {
                struct ldb_module *current;
                const struct ldb_module_ops *ops;
+
+               if (strcmp(module_list[i], "") == 0) {
+                       continue;
+               }
                
                ops = ldb_find_module_ops(module_list[i]);
                if (ops == NULL) {
index 8f7e010bee764bdbcd2c74a002a55dd2eba7a2f3..90c49800173d85f24ad2299f10f44c849c3668dd 100644 (file)
@@ -259,9 +259,6 @@ const char *ldb_default_modules_dir(void);
 
 int ldb_register_backend(const char *url_prefix, ldb_connect_fn);
 
-void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
-                           const char *symbol);
-
 struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb);
 
 int ldb_module_send_entry(struct ldb_request *req,
index 6ecbfbfa08acf08bfc4d1c0fda660b59b9aa7ef9..0f05c1fbab6bfaf66938bb5c0e734ea9d2da96cf 100644 (file)
@@ -190,6 +190,7 @@ PyObject *ldb_val_to_py_object(struct ldb_context *ldb_ctx,
 }
 
 %apply const char * const *NULL_STR_LIST { const char * const *attrs }
+%apply const char * const *NULL_STR_LIST { const char * const *options }
 %apply const char * const *NULL_STR_LIST { const char * const *control_strings }
 
 #endif
@@ -711,9 +712,10 @@ typedef struct ldb_context {
         %feature("docstring") connect "S.connect(url,flags=0,options=None) -> None\n" \
                                       "Connect to a LDB URL.";
         ldb_error connect(const char *url, unsigned int flags = 0, 
-            const char *options[] = NULL);
+            const char *const *options = NULL);
 
         ~ldb() { talloc_free($self); }
+
         ldb_error search_ex(TALLOC_CTX *mem_ctx,
                    ldb_dn *base = NULL, 
                    enum ldb_scope scope = LDB_SCOPE_DEFAULT, 
index 65711d9f4b90cb68568a0e85e1a4e367cccff743..eedbda41706c656bd678dd9d6fe9be5d4e168a45 100644 (file)
@@ -1250,5 +1250,9 @@ int ltdb_reindex(struct ldb_module *module)
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
+       if (tdb_repack(ltdb->tdb) != 0) {
+               return LDB_ERR_OPERATIONS_ERROR;                
+       }
+
        return LDB_SUCCESS;
 }
index 3cf5ec613a7d5f4dd78cbf3ef41f086efd75da1e..4a34c1c998d981d48f0194341748ec1e92c11d94 100644 (file)
@@ -4822,7 +4822,7 @@ SWIGINTERN PyObject *_wrap_Ldb_connect(PyObject *SWIGUNUSEDPARM(self), PyObject
   ldb *arg1 = (ldb *) 0 ;
   char *arg2 = (char *) 0 ;
   unsigned int arg3 = (unsigned int) 0 ;
-  char **arg4 = (char **) (char **)NULL ;
+  char **arg4 = (char **) NULL ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int res2 ;
@@ -4830,8 +4830,6 @@ SWIGINTERN PyObject *_wrap_Ldb_connect(PyObject *SWIGUNUSEDPARM(self), PyObject
   int alloc2 = 0 ;
   unsigned int val3 ;
   int ecode3 = 0 ;
-  void *argp4 = 0 ;
-  int res4 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
   PyObject * obj2 = 0 ;
@@ -4860,25 +4858,33 @@ SWIGINTERN PyObject *_wrap_Ldb_connect(PyObject *SWIGUNUSEDPARM(self), PyObject
     arg3 = (unsigned int)(val3);
   }
   if (obj3) {
-    res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_p_char, 0 |  0 );
-    if (!SWIG_IsOK(res4)) {
-      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Ldb_connect" "', argument " "4"" of type '" "char const *[]""'"); 
-    } 
-    arg4 = (char **)(argp4);
+    if (obj3 == Py_None) {
+      arg4 = NULL;
+    } else if (PySequence_Check(obj3)) {
+      int i;
+      arg4 = talloc_array(NULL, char *, PySequence_Size(obj3)+1);
+      for(i = 0; i < PySequence_Size(obj3); i++)
+      arg4[i] = PyString_AsString(PySequence_GetItem(obj3, i));
+      arg4[i] = NULL;
+    } else {
+      SWIG_exception(SWIG_TypeError, "expected sequence");
+    }
   }
   if (arg1 == NULL)
   SWIG_exception(SWIG_ValueError, 
     "ldb context must be non-NULL");
-  result = ldb_connect(arg1,(char const *)arg2,arg3,(char const *(*))arg4);
+  result = ldb_connect(arg1,(char const *)arg2,arg3,(char const *const *)arg4);
   if (result != 0) {
     PyErr_SetObject(PyExc_LdbError, Py_BuildValue((char *)"(i,s)", result, ldb_errstring(arg1)));
     SWIG_fail;
   }
   resultobj = Py_None;
   if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+  talloc_free(arg4);
   return resultobj;
 fail:
   if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+  talloc_free(arg4);
   return NULL;
 }
 
index 15376e7342c18ba4a715ecaff97f5442dcd780c2..3749aec629db0f529e812eb67065e2660f079ee3 100644 (file)
@@ -92,6 +92,11 @@ int main(int argc, const char **argv)
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
 
+       if (ldb_transaction_start(ldb) != 0) {
+               printf("Failed to start transaction\n");
+               exit(1);
+       }
+
        if (options->argc == 0) {
                ret = process_file(ldb, stdin, &count);
        } else {
@@ -108,6 +113,11 @@ int main(int argc, const char **argv)
                }
        }
 
+       if (count != 0 && ldb_transaction_commit(ldb) != 0) {
+               printf("Failed to commit transaction\n");
+               exit(1);
+       }
+
        talloc_free(ldb);
 
        printf("Added %d records with %d failures\n", count, failures);
index b2a040cd09c94c8c25c6ed1574a2149c7d2467a4..b18aea1b10ca3e02db4a9ff1bcfbf4bb92375d5e 100644 (file)
@@ -112,6 +112,11 @@ static int merge_edits(struct ldb_context *ldb,
        int ret = 0;
        int adds=0, modifies=0, deletes=0;
 
+       if (ldb_transaction_start(ldb) != 0) {
+               fprintf(stderr, "Failed to start transaction\n");
+               return -1;
+       }
+
        /* do the adds and modifies */
        for (i=0;i<count2;i++) {
                msg = msg_find(ldb, msgs1, count1, msgs2[i]->dn);
@@ -150,6 +155,11 @@ static int merge_edits(struct ldb_context *ldb,
                }
        }
 
+       if (ldb_transaction_commit(ldb) != 0) {
+               fprintf(stderr, "Failed to commit transaction\n");
+               return -1;
+       }
+
        printf("# %d adds  %d modifies  %d deletes\n", adds, modifies, deletes);
 
        return ret;
index 6e355a10cf5e11af091d5544eb23e5a789c0f25d..8b6309e016af2ee5b85869e7c7a0f5e519d2f6b3 100644 (file)
@@ -91,6 +91,11 @@ int main(int argc, const char **argv)
 
        ldb = ldb_init(NULL, NULL);
 
+       if (ldb_transaction_start(ldb) != 0) {
+               printf("Failed to start transaction\n");
+               exit(1);
+       }
+
        options = ldb_cmdline_process(ldb, argc, argv, usage);
 
        if (options->argc == 0) {
@@ -108,6 +113,11 @@ int main(int argc, const char **argv)
                }
        }
 
+       if (count != 0 && ldb_transaction_commit(ldb) != 0) {
+               printf("Failed to commit transaction\n");
+               exit(1);
+       }
+
        talloc_free(ldb);
 
        printf("Modified %d records with %d failures\n", count, failures);