[Groonga-commit] groonga/groonga [master] removed fuctions and macros supported by the plugin API. removed grn_str (deprecated).

Back to archive index

null+****@clear***** null+****@clear*****
2012年 2月 13日 (月) 10:32:03 JST


Susumu Yata	2012-02-13 10:32:03 +0900 (Mon, 13 Feb 2012)

  New Revision: cfe49a8ea5aea4de33edbee8ef0b196d1d45954b

  Log:
    removed fuctions and macros supported by the plugin API. removed grn_str (deprecated).

  Modified files:
    include/groonga/tokenizer.h
    lib/tokenizer.c

  Modified: include/groonga/tokenizer.h (+2 -102)
===================================================================
--- include/groonga/tokenizer.h    2012-02-10 19:16:20 +0900 (e00d151)
+++ include/groonga/tokenizer.h    2012-02-13 10:32:03 +0900 (e089cce)
@@ -27,107 +27,6 @@ extern "C" {
 #endif  /* __cplusplus */
 
 /*
-  Don't call these functions directly. Use GRN_TOKENIZER_MALLOC() and
-  GRN_TOKENIZER_FREE() instead.
- */
-void *grn_tokenizer_malloc(grn_ctx *ctx, size_t size, const char *file,
-                           int line, const char *func);
-void grn_tokenizer_free(grn_ctx *ctx, void *ptr, const char *file,
-                        int line, const char *func);
-
-/*
-  GRN_TOKENIZER_MALLOC() allocates `size' bytes and returns a pointer to the
-  allocated memory space. Note that the memory space is associated with `ctx'.
- */
-#define GRN_TOKENIZER_MALLOC(ctx, size) \
-  grn_tokenizer_malloc((ctx), (size), __FILE__, __LINE__, __FUNCTION__)
-/*
-  GRN_TOKENIZER_FREE() frees a memory space allocated by
-  GRN_TOKENIZER_MALLOC(). This means that `ptr' must be a pointer returned by
-  GRN_TOKENIZER_MALLOC().
- */
-#define GRN_TOKENIZER_FREE(ctx, ptr) \
-  grn_tokenizer_free((ctx), (ptr), __FILE__, __LINE__, __FUNCTION__)
-
-/*
-  GRN_TOKENIZER_LOG() reports a log of `level'. Its error message is generated
-  from the varying number of arguments, in which the first one is the format
-  string and the rest are its arguments. See grn_log_level in "groonga.h" for
-  more details of `level'.
- */
-#define GRN_TOKENIZER_LOG(ctx, level, ...) \
-  GRN_LOG((ctx), (level), __VA_ARGS__)
-
-/*
-  Don't call grn_tokenizer_set_error() directly. This function is used in
-  GRN_TOKENIZER_SET_ERROR().
- */
-void grn_tokenizer_set_error(grn_ctx *ctx, grn_log_level level,
-                             grn_rc error_code,
-                             const char *file, int line, const char *func,
-                             const char *format, ...);
-
-/*
-  Don't call these functions directly. grn_tokenizer_backtrace() and
-  grn_tokenizer_logtrace() are used in GRN_TOKENIZER_SET_ERROR().
- */
-void grn_tokenizer_backtrace(grn_ctx *ctx);
-void grn_tokenizer_logtrace(grn_ctx *ctx, grn_log_level level);
-
-/*
-  Don't use GRN_TOKENIZER_SET_ERROR() directly. This macro is used in
-  GRN_TOKENIZER_ERROR().
- */
-#define GRN_TOKENIZER_SET_ERROR(ctx, level, error_code, ...) do { \
-  grn_tokenizer_set_error(ctx, level, error_code, \
-                          __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); \
-  GRN_LOG(ctx, level, __VA_ARGS__); \
-  grn_tokenizer_backtrace(ctx); \
-  grn_tokenizer_logtrace(ctx, level); \
-} while (0)
-
-/*
-  GRN_TOKENIZER_ERROR() reports an error of `error_code'. Its error message is
-  generated from the varying number of arguments, in which the first one is the
-  format string and the rest are its arguments. See grn_rc in "groonga.h" for
-  more details of `error_code'.
- */
-#define GRN_TOKENIZER_ERROR(ctx, error_code, ...) \
-  GRN_TOKENIZER_SET_ERROR(ctx, GRN_LOG_ERROR, error_code, __VA_ARGS__)
-
-/*
-  grn_tokenizer_mutex is available to make a critical section. See the
-  following functions.
- */
-typedef struct _grn_tokenizer_mutex grn_tokenizer_mutex;
-
-/*
-  grn_tokenizer_mutex_create() returns a pointer to a new object of
-  grn_tokenizer_mutex. Memory for the new object is obtained with
-  GRN_TOKENIZER_MALLOC(). grn_tokenizer_mutex_create() returns NULL if
-  sufficient memory is not available.
- */
-grn_tokenizer_mutex *grn_tokenizer_mutex_create(grn_ctx *ctx);
-
-/*
-  grn_tokenizer_mutex_destroy() finalizes an object of grn_tokenizer_mutex
-  and then frees memory allocated for that object.
- */
-void grn_tokenizer_mutex_destroy(grn_ctx *ctx, grn_tokenizer_mutex *mutex);
-
-/*
-  grn_tokenizer_mutex_lock() locks a mutex object. If the object is already
-  locked, the calling thread waits until the object will be unlocked.
- */
-void grn_tokenizer_mutex_lock(grn_ctx *ctx, grn_tokenizer_mutex *mutex);
-
-/*
-  grn_tokenizer_mutex_unlock() unlocks a mutex object.
-  grn_tokenizer_mutex_unlock() should not be called for an unlocked object.
- */
-void grn_tokenizer_mutex_unlock(grn_ctx *ctx, grn_tokenizer_mutex *mutex);
-
-/*
   grn_tokenizer_charlen() returns the length (#bytes) of the first character
   in the string specified by `str_ptr' and `str_length'. If the starting bytes
   are invalid as a character, grn_tokenizer_charlen() returns 0. See
@@ -151,7 +50,8 @@ int grn_tokenizer_isspace(grn_ctx *ctx, const char *str_ptr,
 typedef struct _grn_tokenizer_query grn_tokenizer_query;
 
 struct _grn_tokenizer_query {
-  grn_str *str;
+  grn_obj *normalized_query;
+  char *query_buf;
   const char *ptr;
   unsigned int length;
   grn_encoding encoding;

  Modified: lib/tokenizer.c (+40 -104)
===================================================================
--- lib/tokenizer.c    2012-02-10 19:16:20 +0900 (7d4415f)
+++ lib/tokenizer.c    2012-02-13 10:32:03 +0900 (b47f1db)
@@ -26,89 +26,6 @@
 #include "str.h"
 #include "token.h"
 
-void *grn_tokenizer_malloc(grn_ctx *ctx, size_t size, const char *file,
-                           int line, const char *func) {
-  return grn_malloc(ctx, size, file, line, func);
-}
-
-void grn_tokenizer_free(grn_ctx *ctx, void *ptr, const char *file,
-                        int line, const char *func) {
-  return grn_free(ctx, ptr, file, line, func);
-}
-
-/*
-  grn_tokenizer_ctx_log() is a clone of grn_ctx_log() in ctx.c. The only
-  difference is that grn_tokenizer_ctx_log() uses va_list instead of `...'.
- */
-static void grn_tokenizer_ctx_log(grn_ctx *ctx, const char *format,
-                                  va_list ap) {
-  va_list aq;
-  va_copy(aq, ap);
-  vsnprintf(ctx->errbuf, GRN_CTX_MSGSIZE, format, aq);
-  va_end(aq);
-}
-
-void grn_tokenizer_set_error(grn_ctx *ctx, grn_log_level level,
-                             grn_rc error_code,
-                             const char *file, int line, const char *func,
-                             const char *format, ...) {
-  ctx->errlvl = level;
-  ctx->rc = error_code;
-  ctx->errfile = file;
-  ctx->errline = line;
-  ctx->errfunc = func;
-  grn_ctx_impl_err(ctx);
-
-  {
-    va_list ap;
-    va_start(ap, format);
-    grn_tokenizer_ctx_log(ctx, format, ap);
-    va_end(ap);
-  }
-}
-
-void grn_tokenizer_backtrace(grn_ctx *ctx) {
-  BACKTRACE(ctx);
-}
-
-void grn_tokenizer_logtrace(grn_ctx *ctx, grn_log_level level) {
-  if (level <= GRN_LOG_ERROR) {
-    LOGTRACE(ctx, level);
-  }
-}
-
-struct _grn_tokenizer_mutex {
-  grn_critical_section critical_section;
-};
-
-grn_tokenizer_mutex *grn_tokenizer_mutex_create(grn_ctx *ctx) {
-  grn_tokenizer_mutex * const mutex =
-      GRN_TOKENIZER_MALLOC(ctx, sizeof(grn_tokenizer_mutex));
-  if (mutex != NULL) {
-    CRITICAL_SECTION_INIT(mutex->critical_section);
-  }
-  return mutex;
-}
-
-void grn_tokenizer_mutex_destroy(grn_ctx *ctx, grn_tokenizer_mutex *mutex) {
-  if (mutex != NULL) {
-    CRITICAL_SECTION_FIN(mutex->critical_section);
-    GRN_TOKENIZER_FREE(ctx, mutex);
-  }
-}
-
-void grn_tokenizer_mutex_lock(grn_ctx *ctx, grn_tokenizer_mutex *mutex) {
-  if (mutex != NULL) {
-    CRITICAL_SECTION_ENTER(mutex->critical_section);
-  }
-}
-
-void grn_tokenizer_mutex_unlock(grn_ctx *ctx, grn_tokenizer_mutex *mutex) {
-  if (mutex != NULL) {
-    CRITICAL_SECTION_LEAVE(mutex->critical_section);
-  }
-}
-
 /*
   grn_tokenizer_charlen() takes the length of a string, unlike grn_charlen_().
  */
@@ -166,40 +83,57 @@ grn_tokenizer_query *grn_tokenizer_query_create(grn_ctx *ctx,
                                                 int num_args, grn_obj **args) {
   grn_obj *query_str = grn_ctx_pop(ctx);
   if (query_str == NULL) {
-    GRN_TOKENIZER_ERROR(ctx, GRN_INVALID_ARGUMENT, "missing argument");
+    GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT, "missing argument");
     return NULL;
   }
 
   if ((num_args < 1) || (args == NULL) || (args[0] == NULL)) {
-    GRN_TOKENIZER_ERROR(ctx, GRN_INVALID_ARGUMENT, "invalid NULL pointer");
+    GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT, "invalid NULL pointer");
     return NULL;
   }
 
   {
     grn_tokenizer_query * const query =
-        GRN_TOKENIZER_MALLOC(ctx, sizeof(grn_tokenizer_query));
+        GRN_PLUGIN_MALLOC(ctx, sizeof(grn_tokenizer_query));
     if (query == NULL) {
       return NULL;
     }
+    query->normalized_query = NULL;
+    query->query_buf = NULL;
 
     {
       grn_obj * const table = args[0];
-      grn_encoding table_encoding;
-      int flags = 0;
-      grn_table_get_info(ctx, table, NULL, &table_encoding, NULL, NULL);
-      {
-        grn_str * const str = grn_str_open_(ctx, GRN_TEXT_VALUE(query_str),
-                                            GRN_TEXT_LEN(query_str),
-                                            flags | GRN_OBJ_KEY_NORMALIZE,
-                                            table_encoding);
-        if (str == NULL) {
-          GRN_TOKENIZER_FREE(ctx, query);
+      grn_encoding table_encoding = GRN_ENC_NONE;
+      grn_obj *normalizer = NULL;
+      grn_table_get_info(ctx, table, NULL, &table_encoding, NULL, &normalizer);
+      if (normalizer != NULL) {
+        grn_obj * const normalized_query = grn_normalized_text_open(
+            ctx, normalizer, GRN_TEXT_VALUE(query_str),
+            GRN_TEXT_LEN(query_str), table_encoding, 0);
+        if (query->normalized_query == NULL) {
+          GRN_PLUGIN_FREE(ctx, query);
+          GRN_PLUGIN_ERROR(ctx, GRN_TOKENIZER_ERROR,
+                           "[tokenizer] failed to open normalized text");
+          return NULL;
+        }
+        query->normalized_query = normalized_query;
+        grn_normalized_text_get_value(ctx, query->normalized_query,
+                                      &query->ptr, NULL, &query->length);
+      } else {
+        unsigned int query_length = GRN_TEXT_LEN(query_str);
+        char *query_buf = (char *)GRN_PLUGIN_MALLOC(ctx, query_length + 1);
+        if (query_buf == NULL) {
+          GRN_PLUGIN_FREE(ctx, query);
+          GRN_PLUGIN_ERROR(ctx, GRN_TOKENIZER_ERROR,
+                           "[tokenizer] failed to duplicate query");
           return NULL;
         }
-        query->str = str;
+        memcpy(query_buf, GRN_TEXT_VALUE(query_str), query_length);
+        query_buf[query_length] = '\0';
+        query->query_buf = query_buf;
+        query->ptr = query_buf;
+        query->length = query_length;
       }
-      query->ptr = query->str->norm;
-      query->length = query->str->norm_blen;
       query->encoding = table_encoding;
     }
     return query;
@@ -208,10 +142,13 @@ grn_tokenizer_query *grn_tokenizer_query_create(grn_ctx *ctx,
 
 void grn_tokenizer_query_destroy(grn_ctx *ctx, grn_tokenizer_query *query) {
   if (query != NULL) {
-    if (query->str != NULL) {
-      grn_str_close(ctx, query->str);
+    if (query->normalized_query != NULL) {
+      grn_obj_unlink(ctx, query->normalized_query);
+    }
+    if (query->query_buf != NULL) {
+      GRN_PLUGIN_FREE(ctx, query->query_buf);
     }
-    GRN_TOKENIZER_FREE(ctx, query);
+    GRN_PLUGIN_FREE(ctx, query);
   }
 }
 
@@ -265,8 +202,7 @@ grn_rc grn_tokenizer_register(grn_ctx *ctx, const char *plugin_name_ptr,
                                           GRN_PROC_TOKENIZER,
                                           init, next, fin, 3, vars);
     if (obj == NULL) {
-      GRN_TOKENIZER_ERROR(ctx, GRN_TOKENIZER_ERROR,
-                          "grn_proc_create() failed");
+      GRN_PLUGIN_ERROR(ctx, GRN_TOKENIZER_ERROR, "grn_proc_create() failed");
       return ctx->rc;
     }
   }




Groonga-commit メーリングリストの案内
Back to archive index