From 8e18b511aefa7786b66cb2ff152f1f4492ef4e33 Mon Sep 17 00:00:00 2001
From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:08 +0000
Subject: [PATCH 1/1] cscvs to tla changeset 28 Author: noodles Date:
 2002/11/11 15:47:19 Add support for searching on a full string to DB3
 backend.

---
 keydb_db3.c | 67 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 57 insertions(+), 10 deletions(-)

diff --git a/keydb_db3.c b/keydb_db3.c
index 5224b52..6ef3473 100644
--- a/keydb_db3.c
+++ b/keydb_db3.c
@@ -225,6 +225,11 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 	return (numkeys);
 }
 
+int worddb_cmp(const char *d1, const char *d2)
+{
+	return memcmp(d1, d2, 12);
+}
+
 /**
  *	fetch_key_text - Trys to find the keys that contain the supplied text.
  *	@search: The text to search for.
@@ -241,40 +246,82 @@ int fetch_key_text(const char *search, struct openpgp_publickey **publickey)
 	uint64_t keyid;
 	int i;
 	int numkeys;
+	char *searchtext = NULL;
+	struct ll *wordlist = NULL;
+	struct ll *curword = NULL;
+	struct ll *keylist = NULL;
+	struct ll *newkeylist = NULL;
 
 	numkeys = 0;
+	searchtext = strdup(search);
+	wordlist = makewordlist(wordlist, searchtext);
+
 
 	ret = worddb->cursor(worddb,
 			NULL, /* txn */
 			&cursor,
 			0);   /* flags */
-	if (ret == 0) {
+
+	for (curword = wordlist; curword != NULL; curword = curword->next) {
 		memset(&key, 0, sizeof(key));
 		memset(&data, 0, sizeof(data));
-		key.data = (void *) search;
-		key.size = strlen(search);
+		key.data = curword->object;
+		key.size = strlen(curword->object);
+		data.flags = DB_DBT_MALLOC;
 		ret = cursor->c_get(cursor,
 				&key,
 				&data,
 				DB_SET);
-		while (ret == 0 && strcmp(key.data, search) == 0) {
+		while (ret == 0 && strncmp(key.data, curword->object,
+					key.size) == 0 &&
+				((char *) curword->object)[key.size] == 0) {
 			keyid = 0;
 			for (i = 4; i < 12; i++) {
 				keyid <<= 8;
-				keyid += ((unsigned char *) data.data)[i];
+				keyid += ((unsigned char *)
+						data.data)[i];
+			}
+
+			if (keylist == NULL ||
+					llfind(keylist, data.data,
+						worddb_cmp) != NULL) {
+				newkeylist = lladd(newkeylist, data.data);
+			} else {
+				free(data.data);
+				data.data = NULL;
 			}
-			numkeys += fetch_key(keyid,
-					publickey,
-					false);
 			ret = cursor->c_get(cursor,
 					&key,
 					&data,
 					DB_NEXT);
 		}
-		ret = cursor->c_close(cursor);
-		cursor = NULL;
+		llfree(keylist, free);
+		keylist = newkeylist;
+		newkeylist = NULL;
 	}
 	
+	for (newkeylist = keylist; newkeylist != NULL;
+			newkeylist = newkeylist->next) {
+
+			keyid = 0;
+			for (i = 4; i < 12; i++) {
+				keyid <<= 8;
+				keyid += ((unsigned char *)
+						newkeylist->object)[i];
+			}
+
+			numkeys += fetch_key(keyid,
+					publickey,
+					false);
+	}
+	llfree(keylist, free);
+	keylist = NULL;
+	free(searchtext);
+	searchtext = NULL;
+
+	ret = cursor->c_close(cursor);
+	cursor = NULL;
+	
 	return (numkeys);
 }
 
-- 
2.39.5