Merge branch 'master' of ssh://git.samba.org/data/git/samba
[samba.git] / source3 / lib / dbwrap.c
index c06cd4bb164587b19eafe0eec87acd6b1cf07d07..73c2761a1b3d069cf482a31757e9c150fe1f00a0 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-
+#ifdef CLUSTER_SUPPORT
+#include "ctdb_private.h"
+#endif
 /*
  * Fall back using fetch_locked if no genuine fetch operation is provided
  */
@@ -41,17 +42,33 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+/**
+ * open a database
+ */
 struct db_context *db_open(TALLOC_CTX *mem_ctx,
                           const char *name,
                           int hash_size, int tdb_flags,
                           int open_flags, mode_t mode)
 {
        struct db_context *result = NULL;
+#ifdef CLUSTER_SUPPORT
+       const char *sockname = lp_ctdbd_socket();
+#endif
 
 #ifdef CLUSTER_SUPPORT
+       if(!sockname || !*sockname) {
+               sockname = CTDB_PATH;
+       }
 
        if (lp_clustering()) {
                const char *partname;
+
+               if (!socket_exist(sockname)) {
+                       DEBUG(1, ("ctdb socket does not exist - is ctdb not "
+                                 "running?\n"));
+                       return NULL;
+               }
+
                /* ctdb only wants the file part of the name */
                partname = strrchr(name, '/');
                if (partname) {
@@ -66,8 +83,10 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
                        if (result == NULL) {
                                DEBUG(0,("failed to attach to ctdb %s\n",
                                         partname));
-                               smb_panic("failed to attach to a ctdb "
-                                         "database");
+                               if (errno == 0) {
+                                       errno = EIO;
+                               }
+                               return NULL;
                        }
                }
        }
@@ -85,3 +104,45 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
 
        return result;
 }
+
+NTSTATUS dbwrap_delete_bystring(struct db_context *db, const char *key)
+{
+       struct db_record *rec;
+       NTSTATUS status;
+
+       rec = db->fetch_locked(db, talloc_tos(), string_term_tdb_data(key));
+       if (rec == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       status = rec->delete_rec(rec);
+       TALLOC_FREE(rec);
+       return status;
+}
+
+NTSTATUS dbwrap_store_bystring(struct db_context *db, const char *key,
+                              TDB_DATA data, int flags)
+{
+       struct db_record *rec;
+       NTSTATUS status;
+
+       rec = db->fetch_locked(db, talloc_tos(), string_term_tdb_data(key));
+       if (rec == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       status = rec->store(rec, data, flags);
+       TALLOC_FREE(rec);
+       return status;
+}
+
+TDB_DATA dbwrap_fetch_bystring(struct db_context *db, TALLOC_CTX *mem_ctx,
+                              const char *key)
+{
+       TDB_DATA result;
+
+       if (db->fetch(db, mem_ctx, string_term_tdb_data(key), &result) == -1) {
+               return make_tdb_data(NULL, 0);
+       }
+
+       return result;
+}