]> arthur.barton.de Git - netatalk.git/commitdiff
Additional CNID db name index
authorFrank Lahm <franklahm@googlemail.com>
Thu, 18 Nov 2010 14:03:09 +0000 (15:03 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Thu, 18 Nov 2010 14:03:09 +0000 (15:03 +0100)
etc/cnid_dbd/Makefile.am
etc/cnid_dbd/dbd.h
etc/cnid_dbd/dbif.c
etc/cnid_dbd/dbif.h
etc/cnid_dbd/main.c
etc/cnid_dbd/pack.c
etc/cnid_dbd/pack.h
include/atalk/cnid_dbd_private.h

index 50b3085ebc78aa7f0f40e74afb4564c1b08eec14..802ad3abb64e90f620a319a678a22d25599a9978 100644 (file)
@@ -10,7 +10,7 @@ endif
 cnid_dbd_SOURCES = dbif.c pack.c comm.c db_param.c main.c \
                    dbd_add.c dbd_get.c dbd_resolve.c dbd_lookup.c \
                    dbd_update.c dbd_delete.c dbd_getstamp.c \
-                   dbd_rebuild_add.c dbd_dbcheck.c
+                   dbd_rebuild_add.c dbd_dbcheck.c dbd_search.c
 cnid_dbd_LDADD = $(top_builddir)/libatalk/libatalk.la @BDB_LIBS@ @ACL_LIBS@
 
 cnid_metad_SOURCES = cnid_metad.c usockfd.c db_param.c
index 0dbff51dba97a4ac133c6ab20469470031c54987..dea8327810c81c776601e9d4134eb97982a93dc1 100644 (file)
@@ -1,8 +1,6 @@
 /*
- * $Id: dbd.h,v 1.7 2009-11-25 14:59:15 franklahm Exp $
- *
  * Copyright (C) Joerg Lenneis 2003
- * Copyright (C) Frank Lahm 2009
+ * Copyright (C) Frank Lahm 2009, 2010
  * All Rights Reserved.  See COPYING.
  */
 
@@ -23,6 +21,7 @@ extern int dbd_update(DBD *dbd, struct cnid_dbd_rqst *, struct cnid_dbd_rply *);
 extern int dbd_delete(DBD *dbd, struct cnid_dbd_rqst *, struct cnid_dbd_rply *, int idx);
 extern int dbd_getstamp(DBD *dbd, struct cnid_dbd_rqst *, struct cnid_dbd_rply *);
 extern int dbd_rebuild_add(DBD *dbd, struct cnid_dbd_rqst *, struct cnid_dbd_rply *);
+extern int dbd_search(DBD *dbd, struct cnid_dbd_rqst *, struct cnid_dbd_rply *);
 extern int dbd_check_indexes(DBD *dbd, char *);
 
 #endif /* CNID_DBD_DBD_H */
index ea22816b1cce8944dc53c865e2a38b914091dc96..3529121f777c2b3f62549ca4a2b7b45b7c91e8d6 100644 (file)
@@ -238,14 +238,19 @@ DBD *dbif_init(const char *envhome, const char *filename)
     dbd->db_table[DBIF_CNID].name        = "cnid2.db";
     dbd->db_table[DBIF_IDX_DEVINO].name  = "devino.db";
     dbd->db_table[DBIF_IDX_DIDNAME].name = "didname.db";
+    dbd->db_table[DBIF_IDX_NAME].name    = "name.db";
 
     dbd->db_table[DBIF_CNID].type        = DB_BTREE;
     dbd->db_table[DBIF_IDX_DEVINO].type  = DB_BTREE;
     dbd->db_table[DBIF_IDX_DIDNAME].type = DB_BTREE;
+    dbd->db_table[DBIF_IDX_NAME].type    = DB_BTREE;
 
     dbd->db_table[DBIF_CNID].openflags        = DB_CREATE;
     dbd->db_table[DBIF_IDX_DEVINO].openflags  = DB_CREATE;
     dbd->db_table[DBIF_IDX_DIDNAME].openflags = DB_CREATE;
+    dbd->db_table[DBIF_IDX_NAME].openflags    = DB_CREATE;
+
+    dbd->db_table[DBIF_IDX_NAME].flags = DB_DUPSORT;
 
     return dbd;
 }
@@ -495,6 +500,20 @@ int dbif_open(DBD *dbd, struct db_param *dbp, int reindex)
     }
     if (reindex)
         LOG(log_info, logtype_cnid, "... done.");
+
+    if (reindex)
+        LOG(log_info, logtype_cnid, "Reindexing name index...");
+    if ((ret = dbd->db_table[0].db->associate(dbd->db_table[0].db, 
+                                              dbd->db_txn,
+                                              dbd->db_table[DBIF_IDX_NAME].db, 
+                                              idxname,
+                                              (reindex) ? DB_CREATE : 0))
+        != 0) {
+        LOG(log_error, logtype_cnid, "Failed to associate name index: %s",db_strerror(ret));
+        return -1;
+    }
+    if (reindex)
+        LOG(log_info, logtype_cnid, "... done.");
     
     return 0;
 }
@@ -725,6 +744,20 @@ 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)
+{
+    int ret;
+    DBC *cursorp;
+
+    /* Get a cursor */
+    dbd->db_table[DBIF_IDX_NAME].db->cursor(dbd->db_table[DBIF_IDX_NAME].db,
+                                            NULL,
+                                            &cursorp,
+                                            0);
+
+    return 1;
+}
+
 int dbif_txn_begin(DBD *dbd)
 {
     int ret;
index e2903b284b7325c01991e3f1f588115b39d1b58e..d8b7ca162bea810531379d46b45739a203fe4944 100644 (file)
 #include <atalk/adouble.h>
 #include "db_param.h"
 
-#define DBIF_DB_CNT 3
+#define DBIF_DB_CNT 4
  
 #define DBIF_CNID          0
 #define DBIF_IDX_DEVINO    1
 #define DBIF_IDX_DIDNAME   2
+#define DBIF_IDX_NAME      3
 
 /* Structures */
 typedef struct {
@@ -80,7 +81,7 @@ typedef struct {
     char     *db_envhome;
     char     *db_filename;
     FILE     *db_errlog;
-    db_table db_table[3];
+    db_table db_table[DBIF_DB_CNT];
 } DBD;
 
 /* Functions */
index a715c19a4cea5e1ad2b1cc048c0218cf96507413..1b1b988752f6c8ce7b7d2a86b378a72118e37764 100644 (file)
@@ -174,6 +174,9 @@ static int loop(struct db_param *dbp)
             case CNID_DBD_OP_REBUILD_ADD:
                 ret = dbd_rebuild_add(dbd, &rqst, &rply);
                 break;
+            case CNID_DBD_OP_SEARCH:
+                ret = dbd_search(dbd, &rqst, &rply);
+                break;
             default:
                 LOG(log_error, logtype_cnid, "loop: unknown op %d", rqst.op);
                 ret = -1;
index 1b4a15be588646fff8814ff9f2557abc08d02f7e..eb90d85809b5f45af70e5736e7990e8d1beb26eb 100644 (file)
@@ -1,7 +1,6 @@
 /*
- * $Id: pack.c,v 1.6 2009-10-13 22:55:37 didg Exp $
- *
  * Copyright (C) Joerg Lenneis 2003
+ * Copyright (C) Frank Lahm 2010
  * All Rights Reserved.  See COPYING.
  */
 
@@ -72,6 +71,15 @@ int devino(DB *dbp _U_, const DBT *pkey _U_,  const DBT *pdata, DBT *skey)
     return (0);
 }
 
+/* --------------- */
+int idxname(DB *dbp _U_, const DBT *pkey _U_,  const DBT *pdata, DBT *skey)
+{
+    memset(skey, 0, sizeof(DBT));
+    skey->data = (char *)pdata->data + CNID_NAME_OFS;
+    skey->size = strlen((char *)skey->data) + 1;
+    return (0);
+}
+
 /* The equivalent to make_cnid_data in the cnid library. Non re-entrant. We
    differ from make_cnid_data in that we never return NULL, rqst->name cannot
    ever cause start[] to overflow because name length is checked in libatalk. */
index fb6984991d666e9caad2011c14abb63ad0674931..e94ef0d9a11a827faf2aa3b3e4145ce52df0b52b 100644 (file)
@@ -1,7 +1,6 @@
 /*
- * $Id: pack.h,v 1.5 2009-05-04 09:09:43 franklahm Exp $
- *
  * Copyright (C) Joerg Lenneis 2003
+ * Copyright (C) Frank Lahm 2010
  * All Rights Reserved.  See COPYING.
  */
 
@@ -23,5 +22,6 @@
 extern unsigned char *pack_cnid_data(struct cnid_dbd_rqst *);
 extern int didname(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
 extern int devino(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
+extern int idxname(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
 
 #endif /* CNID_DBD_PACK_H */
index 4e4847a7eb4ab5bb84bd913036e4a784ad928569..742cf447437e398d613534cb19a999f68e77a94c 100644 (file)
 #define CNID_DBD_OP_MANGLE_GET  0x0a
 #define CNID_DBD_OP_GETSTAMP    0x0b
 #define CNID_DBD_OP_REBUILD_ADD 0x0c
+#define CNID_DBD_OP_SEARCH      0x0d
 
 #define CNID_DBD_RES_OK            0x00
 #define CNID_DBD_RES_NOTFOUND      0x01
 #define CNID_DBD_RES_ERR_DB        0x02
 #define CNID_DBD_RES_ERR_MAX       0x03
 #define CNID_DBD_RES_ERR_DUPLCNID  0x04
+#define CNID_DBD_RES_SRCH_CNT      0x05
+#define CNID_DBD_RES_SRCH_DONE     0x06
+
+#define DBD_MAX_SRCH_RPLY_PAYLOAD  4096
 
 struct cnid_dbd_rqst {
     int     op;
     cnid_t  cnid;
     dev_t   dev;
     ino_t   ino;
-    u_int32_t type;
-    cnid_t  did;
+    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 */
+    };
     char   *name;
     size_t  namelen;
 };
 
 struct cnid_dbd_rply {
     int     result;    
-    cnid_t  cnid;
+    union {
+        cnid_t  cnid;
+        uint32_t count;         /* for dbd_search: number of returned names */
+    };
     cnid_t  did;
     char   *name;
     size_t  namelen;