Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

missing cache in 'nmz/field.c - nmz_get_field_data()'



いわきりです

nmz/field.cの中のnmz_get_field_data()で、cache機能が
実装されていますが、hitミスが発生します。

同一プロセス内で、インデックスを切り替えながら複数回検索を
じっしする場合に発生します。
[php-users]で報告されています。
 http://ns1.php.gr.jp/pipermail/php-users/2002-September/010012.html

nmz_free_internal()にcacheのクリアを実装した方が良くないでしょうか?
クイックハックなので、マルチスレッドサーバでの
libnamazu.soの利用は考慮していません。

--- libnamazu.c.orig	Tue Mar 26 19:49:33 2002
+++ libnamazu.c	Thu Oct  3 11:13:42 2002
@@ -62,6 +62,7 @@
 #include "codeconv.h"
 #include "search.h"
 #include "hlist.h"
+#include "field.h"
 #include "i18n.h"
 #include "regex.h"
 #include "var.h"
@@ -95,6 +96,7 @@
     nmz_free_idxnames();
     nmz_free_aliases();
     nmz_free_replaces();
+    nmz_free_field_cache();
 }
 
 void 
--- field.h.orig	Sun Jan  9 17:52:27 2000
+++ field.h	Thu Oct  3 11:09:31 2002
@@ -10,5 +10,6 @@
 extern int nmz_isfield ( const char *key );
 extern char *nmz_get_field_name ( const char *fieldpat );
 extern void nmz_get_field_data ( int idxid, int docid, const char *field, char 
*data );
+extern void nmz_free_field_cache ( void );
 
 #endif /* _FIELD_H */
--- field.c.orig	Fri Dec 21 14:36:40 2001
+++ field.c	Thu Oct  3 11:04:11 2002
@@ -148,22 +148,22 @@
     return field_name;
 }
 
+static int cache_idx = 0, cache_num = 0;
+struct field_cache {
+	int idxid;
+	int docid;
+	char field[BUFSIZE];
+	char data[BUFSIZE];
+};
+static struct field_cache fc[FIELD_CACHE_SIZE];
+
 void 
 nmz_get_field_data(int idxid, int docid, const char *field, char *data) 
 {
     char fname[BUFSIZE];
     char tmpfield[BUFSIZE];
     int i;
-    static int cache_idx = 0, cache_num = 0;
     FILE *fp_field, *fp_field_idx;
-    struct field_cache {
-	int idxid;
-	int docid;
-	char field[BUFSIZE];
-	char data[BUFSIZE];
-    };
-    static struct field_cache fc[FIELD_CACHE_SIZE];
-
     strcpy(data, ""); /* For safety. */
 
     strncpy(tmpfield, field, BUFSIZE - 1);
@@ -225,4 +225,15 @@
     }
 }
 
-
+void
+nmz_free_field_cache(void)
+{
+	int i;
+	for(i=0; i++; i < cache_num) {
+		fc[i].idxid =0;
+		fc[i].docid =0;
+		strcpy(fc[i].field, "");
+		strcpy(fc[i].data, "");
+	}
+	cache_num = 0;
+}



-- 
Youichi Iwakiri