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
/*
- * $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.
*/
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 */
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;
}
}
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;
}
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;
#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 {
char *db_envhome;
char *db_filename;
FILE *db_errlog;
- db_table db_table[3];
+ db_table db_table[DBIF_DB_CNT];
} DBD;
/* Functions */
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;
/*
- * $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.
*/
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. */
/*
- * $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.
*/
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 */
#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;