[Senna-dev 1007] SISのとき追加したキーをsen_pat_delete_by_id()で消せない

Back to archive index

Kouhei Sutou kou****@cozmi*****
2008年 9月 10日 (水) 17:41:37 JST


須藤です。

SEN_TABLE_KEY_WITH_SISで作ったsen_patがあるとします。
このsen_patに追加したときに返ってきたIDを使って
sen_pat_delete_by_id()でそのレコードを消そうとしても失敗する
ことがあります。具体的には、他のレコードのSISと同じ内容の
レコードになっているときです。

例えば、この二つのレコードを追加したときは、最初に追加した
レコードのIDを使ったsen_pat_delete_by_id()が失敗します。

  1. "セナ"
  2. "セナセナ"

これは意図した挙動でしょうか?


テストプログラムとその出力は以下の通りです。
--
min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
セナ
セナセナ
ナ
ナセナ

sen_pat_delete_by_id() result: 4

min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
セナ
セナセナ
ナ
ナセナ
--

/* -*- c-basic-offset: 2 -*- */

#include <stdio.h>
#include <string.h>

#include <pat.h>

static sen_id
add(sen_ctx *context, sen_pat *pat, const char *key)
{
  sen_table_search_flags flags;

  flags = SEN_TABLE_ADD;
  return sen_pat_lookup(context, pat, key, strlen(key) + 1, NULL, &flags);
}

#define BUFFER_SIZE 4096

static void
dump(sen_ctx *context, sen_pat *pat, const char *min, const char *max,
int flags)
{
  sen_id id;
  sen_pat_cursor *cursor;

  printf("min: %s; max: %s; direction: %s; GT: %s; LT: %s\n",
         min ? min : "(null)",
         max ? max : "(null)",
         flags & SEN_CURSOR_ASCENDING ? "ASCENDING" : "DESCENDING",
         flags & SEN_CURSOR_GT ? "TRUE" : "FALSE",
         flags & SEN_CURSOR_LT ? "TRUE" : "FALSE");

  cursor = sen_pat_cursor_open(context, pat,
                               min, min ? strlen(min) + 1 : 0,
                               max, max ? strlen(max) + 1 : 0,
                               flags);

  id = sen_pat_cursor_next(context, cursor);
  while (id != SEN_ID_NIL) {
    char buffer[BUFFER_SIZE];
    sen_pat_get_key(context, pat, id, buffer, BUFFER_SIZE - 1);
    printf("%s\n", buffer);
    id = sen_pat_cursor_next(context, cursor);
  }

  printf("\n");

  sen_pat_cursor_close(context, cursor);
}

int
main(int argc, char **argv)
{
  sen_ctx *context;
  sen_pat *pat;
  sen_id id1, id2;

  sen_init();

  context = sen_ctx_open(NULL, SEN_CTX_USEQL);
  pat = sen_pat_create(context, "/tmp/xxx", 128, 64,
                       SEN_TABLE_KEY_WITH_SIS, sen_enc_utf8);

  id1 = add(context, pat, "セナ");
  id2 = add(context, pat, "セナセナ");

  dump(context, pat, NULL, NULL, SEN_CURSOR_ASCENDING);
  printf("sen_pat_delete_by_id() result: %d\n",
         sen_pat_delete_by_id(context, pat, id1));
  printf("\n");
  dump(context, pat, NULL, NULL, SEN_CURSOR_ASCENDING);

  sen_pat_close(context, pat);
  sen_ctx_close(context);

  sen_fin();

  return 0;
}




Senna-dev メーリングリストの案内
Back to archive index