]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/cnid/tdb/cnid_tdb_update.c
Spotlight: use async Tracker SPARQL API
[netatalk.git] / libatalk / cnid / tdb / cnid_tdb_update.c
index 2c3c87cd84be16025ec1bfa853d3d962102c180b..9688d866c5c5490a16751de56d89ea144298e9b5 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * $Id: cnid_tdb_update.c,v 1.4 2009-11-20 17:37:14 didg Exp $
- */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 #include "cnid_tdb.h"
 #include <atalk/logger.h>
 
-int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
-                     const cnid_t did, char *name, const size_t len
-                     /*, const char *info, const int infolen */ )
+int cnid_tdb_update(struct _cnid_db *cdb, cnid_t id, const struct stat *st,
+                    cnid_t did, const char *name, size_t len)
 {
     struct _cnid_tdb_private *db;
     TDB_DATA key, data, altdata;
 
-    if (!cdb || !(db = cdb->_private) || !id || !st || !name || (db->flags & CNIDFLAG_DB_RO)) {
+    if (!cdb || !(db = cdb->cnid_db_private) || !id || !st || !name || (db->flags & CNIDFLAG_DB_RO)) {
         return -1;
     }
 
@@ -26,29 +21,62 @@ int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st
     memset(&altdata, 0, sizeof(altdata));
 
 
-    /* Get the old info. */
-    key.dptr = (char *)&id;
-    key.dsize = sizeof(id);
-    memset(&data, 0, sizeof(data));
-    data = tdb_fetch(db->tdb_cnid, key);
-    if (!data.dptr) {
-        return 0;
-    }
+    /* Get the old info. search by dev/ino */
+    data.dptr = make_tdb_data(cdb->cnid_db_flags, st, did, name, len);
+    data.dsize = CNID_HEADER_LEN + len + 1;
     key.dptr = data.dptr +CNID_DEVINO_OFS;
     key.dsize = CNID_DEVINO_LEN;
-    tdb_delete(db->tdb_devino, key); 
+    altdata = tdb_fetch(db->tdb_devino, key);
+    if (altdata.dptr) {
+        tdb_delete(db->tdb_devino, key); 
+
+        key.dptr = altdata.dptr;
+        key.dsize = sizeof(id);
+
+        data = tdb_fetch(db->tdb_cnid, key);
+        tdb_delete(db->tdb_cnid, key); 
+        free(altdata.dptr);
+
+        if (data.dptr) {
+            key.dptr = (unsigned char *)data.dptr +CNID_DID_OFS;
+            key.dsize = data.dsize - CNID_DID_OFS;
+            tdb_delete(db->tdb_didname, key); 
+        
+            free(data.dptr);
+        }
+    }
 
-    key.dptr = (char *)data.dptr +CNID_DID_OFS;
+    /* search by did/name */
+    data.dptr = make_tdb_data(cdb->cnid_db_flags, st, did, name, len);
+    data.dsize = CNID_HEADER_LEN + len + 1;
+    key.dptr = (unsigned char *)data.dptr +CNID_DID_OFS;
     key.dsize = data.dsize - CNID_DID_OFS;
-    tdb_delete(db->tdb_didname, key); 
+    altdata = tdb_fetch(db->tdb_didname, key);
+    if (altdata.dptr) {
+        tdb_delete(db->tdb_didname, key); 
+
+        key.dptr = altdata.dptr;
+        key.dsize = sizeof(id);
+        data = tdb_fetch(db->tdb_cnid, key);
+        tdb_delete(db->tdb_cnid, key); 
+        free(altdata.dptr);
+
+        if (data.dptr) {
+            key.dptr = data.dptr +CNID_DEVINO_OFS;
+            key.dsize = CNID_DEVINO_LEN;
+            tdb_delete(db->tdb_devino, key); 
+            free(data.dptr);
+        }
+    }
+    
 
-    free(data.dptr);
     /* Make a new entry. */
-    data.dptr = make_tdb_data(cdb->flags, st, did, name, len);
+    data.dptr = make_tdb_data(cdb->cnid_db_flags, st, did, name, len);
     data.dsize = CNID_HEADER_LEN + len + 1;
+    memcpy(data.dptr, &id, sizeof(id));
 
     /* Update the old CNID with the new info. */
-    key.dptr = (char *) &id;
+    key.dptr = (unsigned char *) &id;
     key.dsize = sizeof(id);
     if (tdb_store(db->tdb_cnid, key, data, TDB_REPLACE)) {
         goto update_err;
@@ -57,13 +85,13 @@ int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st
     /* Put in a new dev/ino mapping. */
     key.dptr = data.dptr +CNID_DEVINO_OFS;
     key.dsize = CNID_DEVINO_LEN;
-    altdata.dptr  = (char *) &id;
+    altdata.dptr  = (unsigned char *) &id;
     altdata.dsize = sizeof(id);
     if (tdb_store(db->tdb_devino, key, altdata, TDB_REPLACE)) {
         goto update_err;
     }
     /* put in a new did/name mapping. */
-    key.dptr = (char *) data.dptr +CNID_DID_OFS;
+    key.dptr = (unsigned char *) data.dptr +CNID_DID_OFS;
     key.dsize = data.dsize -CNID_DID_OFS;
 
     if (tdb_store(db->tdb_didname, key, altdata, TDB_REPLACE)) {