[Senna-dev 978] sen_pat_delete_by_id() with SIS

アーカイブの一覧に戻る

Kouhei Sutou kou****@cozmi*****
2008年 7月 23日 (水) 09:54:13 JST


須藤です。

SEN_PAT_WITH_SIS指定のsen_patでは同じIDで2回以上
sen_pat_delete_by_id()をしてもsen_successが返ってくる
ことがあるようです。これは意図した挙動でしょうか?
2回目以降は存在しないIDを削除することになるので
sen_invalid_argumentかなぁと思いました。

最後のプログラムの実行結果:
  min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
  Senna
  セ
  セナ
  セナ + Ruby
  セナセ
  セナセナ
  ナ
  ナ + Ruby
  ナセ
  ナセナ
  ナセナセ

  sen_pat_delete_by_id() result: 0
  sen_pat_delete_by_id() result: 0
  min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
  Senna
  セ
  セナ + Ruby
  セナセ
  ナ + Ruby
  ナセ
  ナセナセ

  sen_pat_delete_by_id() result: 0

テストプログラム:
  #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_PAT_ASCENDING ? "ASCENDING" : "DESCENDING",
           flags & SEN_PAT_GT ? "TRUE" : "FALSE",
           flags & SEN_PAT_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 id;

    sen_init();

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

    add(context, pat, "セナ");
    add(context, pat, "ナセナセ");
    add(context, pat, "Senna");
    add(context, pat, "セナ + Ruby");
    id = add(context, pat, "セナセナ");

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

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

    sen_fin();

    return 0;
  }




Senna-dev メーリングリストの案内
アーカイブの一覧に戻る