]> arthur.barton.de Git - netatalk.git/commitdiff
Return cnids
authorFrank Lahm <franklahm@googlemail.com>
Thu, 18 Nov 2010 16:31:12 +0000 (17:31 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Thu, 18 Nov 2010 16:31:12 +0000 (17:31 +0100)
etc/cnid_dbd/dbd_search.c
etc/cnid_dbd/dbif.c
etc/cnid_dbd/dbif.h
include/atalk/cnid_dbd_private.h

index 5190c24b12949b66fc83ae66ad221c6ea7a6e1c6..09624c834923277bf8cade65efb6df68e5d97f78 100644 (file)
 int dbd_search(DBD *dbd, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply)
 {
     DBT key;
-    int rc;
-    static char resbuf[DBD_MAX_SRCH_RPLY_PAYLOAD];
+    int results;
+    static char resbuf[DBD_MAX_SRCH_RSLTS * sizeof(cnid_t)];
     memset(&key, 0, sizeof(key));
+    rply->name = resbuf;
     rply->namelen = 0;
 
     key.data = rqst->name;
     key.size = rqst->namelen;
 
-    if ((rc = dbif_del(dbd, DBIF_IDX_DEVINO, &key, 0)) < 0) {
-        LOG(log_error, logtype_cnid, "dbd_delete: Unable to delete entry for dev/ino: 0x%llx/0x%llx",
-            (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
+    if ((results = dbif_search(dbd, &key, 0)) < 0) {
+        LOG(log_error, logtype_cnid, "dbd_search(\"%s\"): db error", rqst->name);
         rply->result = CNID_DBD_RES_ERR_DB;
         return -1;
     }
-    if (rc) {
-        LOG(log_debug, logtype_cnid, "cnid_delete: deleted dev/ino: 0x%llx/0x%llx",
-            (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
+    if (results) {
+        LOG(log_debug, logtype_cnid, "dbd_search(\"%s\"): %d matches", rqst->name, results);
+        rply->namelen = results * sizeof(cnid_t);
         rply->result = CNID_DBD_RES_OK;
     } else {
-        LOG(log_debug, logtype_cnid, "cnid_delete: dev/ino: 0x%llx/0x%llx not in database", 
-            (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
+        LOG(log_debug, logtype_cnid, "dbd_search(\"%s\"): no matches", rqst->name);
         rply->result = CNID_DBD_RES_NOTFOUND;
     }
 
index 3529121f777c2b3f62549ca4a2b7b45b7c91e8d6..a4f090e3f812439d8b9e33de2ddf85f1a7ef5f90 100644 (file)
@@ -744,18 +744,52 @@ int dbif_del(DBD *dbd, const int dbi, DBT *key, u_int32_t flags)
         return 1;
 }
 
-int dbif_search(DBD *dbd, DBT *key, int sindex, char *resbuf, ssize_t bufsize)
+/*!
+ * Search the database by name
+ *
+ * @param resbuf    (w) buffer for search results CNIDs, maxsize is assumed to be
+ *                      DBD_MAX_SRCH_RSLTS * sizefof(cnid_t)
+ *
+ * @returns -1 on error, 0 when nothing found, else the number of matches
+ */
+int dbif_search(DBD *dbd, DBT *key, char *resbuf)
 {
-    int ret;
-    DBC *cursorp;
+    int ret = 0;
+    int count = 0;
+    DBC *cursorp = NULL;
+    DBT pkey, data;
+    char *cnids = resbuf;
+    cnid_t cnid;
+
+    memset(&pkey, 0, sizeof(DBT));
+    memset(&data, 0, sizeof(DBT));
 
     /* Get a cursor */
-    dbd->db_table[DBIF_IDX_NAME].db->cursor(dbd->db_table[DBIF_IDX_NAME].db,
-                                            NULL,
-                                            &cursorp,
-                                            0);
+    ret = dbd->db_table[DBIF_IDX_NAME].db->cursor(dbd->db_table[DBIF_IDX_NAME].db,
+                                                  NULL,
+                                                  &cursorp,
+                                                  0);
+    if (ret != 0) {
+        LOG(log_error, logtype_cnid, "Couldn't create cursor: %s", db_strerror(ret));
+        ret = -1;
+        goto exit;
+    }
+
+    ret = cursorp->pget(cursorp, key, &pkey, &data, DB_SET_RANGE);
+    while (count < DBD_MAX_SRCH_RSLTS && ret != DB_NOTFOUND) {
+        count++;
+        memcpy(cnids, pkey.data, sizeof(cnid_t));
+        cnids += sizeof(cnid_t);
+        LOG(log_error, logtype_cnid, "match: CNID %" PRIu32, memcpy(&cnid, pkey.data, sizeof(cnid_t)), ntohl(cnid));
+        ret = cursorp->pget(cursorp, key, &pkey, &data, DB_NEXT_DUP);
+    }
 
-    return 1;
+    ret = count;
+
+exit:
+    if (cursorp != NULL)
+        cursorp->close(cursorp);
+    return ret;
 }
 
 int dbif_txn_begin(DBD *dbd)
index d8b7ca162bea810531379d46b45739a203fe4944..04eea3d909183961ef25b91460bd4781fd4ad320 100644 (file)
@@ -97,6 +97,7 @@ extern int dbif_put(DBD *, const int, DBT *, DBT *, u_int32_t);
 extern int dbif_del(DBD *, const int, DBT *, u_int32_t);
 extern int dbif_count(DBD *, const int, u_int32_t *);
 extern int dbif_stamp(DBD *, void *, int);
+extern int dbif_search(DBD *dbd, DBT *key, char *resbuf);
 extern int dbif_copy_rootinfokey(DBD *srcdbd, DBD *destdbd);
 extern int dbif_txn_begin(DBD *);
 extern int dbif_txn_commit(DBD *);
index 742cf447437e398d613534cb19a999f68e77a94c..0607aec228c5889a4ac93e02e83feaa269f76cc3 100644 (file)
 #define CNID_DBD_RES_SRCH_CNT      0x05
 #define CNID_DBD_RES_SRCH_DONE     0x06
 
-#define DBD_MAX_SRCH_RPLY_PAYLOAD  4096
+#define DBD_MAX_SRCH_RSLTS 100
 
 struct cnid_dbd_rqst {
     int     op;
     cnid_t  cnid;
     dev_t   dev;
     ino_t   ino;
-    union {
-        uint32_t type;
-        uint32_t reqcount;      /* for dbd_search: number of results per query */
-    };
-    union {
-        cnid_t  did;
-        uint32_t sindex;        /* for dbd_search: continuation index */
-    };
+    uint32_t type;
+    cnid_t  did;
     char   *name;
     size_t  namelen;
 };
 
 struct cnid_dbd_rply {
     int     result;    
-    union {
-        cnid_t  cnid;
-        uint32_t count;         /* for dbd_search: number of returned names */
-    };
+    cnid_t  cnid;
     cnid_t  did;
     char   *name;
     size_t  namelen;