Groonga組み込みコマンドの利用

# Groonga組み込みコマンド

## define_selector

define_selector - 検索コマンドを定義

**引数**

| 名前                       | Offset | 概要         |
|:--------------------------:|:------:|:------------:|
| name                       |  0     |              |
| table                      |  1     |              |
| match_columns              |  2     |              |
| query                      |  3     |              |
| filter                     |  4     |              |
| scorer                     |  5     |              |
| sortby                     |  6     |              |
| output_columns             |  7     |              |
| offset                     |  8     |              |
| limit                      |  9     |              |
| drilldown                  | 10     |              |
| drilldown_sortby           | 11     |              |
| drilldown_output_columns   | 12     |              |
| drilldown_offset           | 13     |              |
| drilldown_limit            | 14     |              |
| cache                      | 15     |              |
| match_escalation_threshold | 16     |              |
| query_expansion            | 17     |              |
| query_flags                | 18     |              |
| query_expander             | 19     |              |
| adjuster                   | 20     |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "define_selector", strlen("define_selector"));

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "user_selector");

  /* Offsetから引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var_by_offset(ctx, command, 1);
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "User");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

```js
true
```

## select

select はテーブルから指定された条件にマッチするレコードを検索し、見つかったレコードを出力します。

**引数**

| 名前                       | Offset | 概要         |
|:--------------------------:|:------:|:------------:|
| table                      |  0     |              |
| match_columns              |  1     |              |
| query                      |  2     |              |
| filter                     |  3     |              |
| scorer                     |  4     |              |
| sortby                     |  5     |              |
| output_columns             |  6     |              |
| offset                     |  7     |              |
| limit                      |  8     |              |
| drilldown                  |  9     |              |
| drilldown_sortby           | 10     |              |
| drilldown_output_columns   | 11     |              |
| drilldown_offset           | 12     |              |
| drilldown_limit            | 13     |              |
| cache                      | 14     |              |
| match_escalation_threshold | 15     |              |
| query_expansion            | 16     |              |
| query_flags                | 17     |              |
| query_expander             | 18     |              |
| adjuster                   | 19     |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "select", strlen("select"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entries");

  /* 実行と出力 */
  grn_expr_exec(ctx, command, 0);
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

```js
[
  [
    [
      5
    ],
    [
      [
        "_id",
        "UInt32"
      ],
      [
        "_key",
        "ShortText"
      ],
      [
        "content",
        "Text"
      ],
      [
        "n_likes",
        "UInt32"
      ]
    ],
    [
      1,
      "The first post!",
      "Welcome! This is my first post!",
      5
    ],
    [
      2,
      "Groonga",
      "I started to use groonga. It's very fast!",
      10
    ],
    [
      3,
      "Mroonga",
      "I also started to use mroonga. It's also very fast! Really fast!",
      15
    ],
    [
      4,
      "Good-bye Senna",
      "I migrated all Senna system!",
      3
    ],
    [
      5,
      "Good-bye Tritonn",
      "I also migrated all Tritonn system!",
      3
    ]
  ]
]
```

**結果の取得方法grn_ctx_recv**

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "select", strlen("select"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entries");

  /* 実行 */
  grn_expr_exec(ctx, command, 0);

  /* 結果の取得 */
  char *result;
  unsigned int result_length;
  int recv_flags;

  grn_ctx_recv(ctx, &result, &result_length, &recv_flags);
  printf("%.*s\n", result_length, result);

```


## load

load は、使用しているデータベースのテーブルにレコードを登録し、カラムの値を更新します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| values     | 0      |              |
| table      | 1      |              |
| columns    | 2      |              |
| ifexists   | 3      |              |
| input_type | 4      |              |
| each       | 5      |              |

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "load", strlen("load"));

  /* 引数を取得して値を設定 */
  grn_obj *values = grn_expr_get_var(ctx, command, "values", strlen("values"));
  grn_obj_reinit(ctx, values, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, values, "[{\"_key\":\"The first post!\", \"content\": \"Welcome! This is my first post!\", \"n_likes\": 5}]");

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entries");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

````js
1
````


## status

status - groongaプロセスの状態表示

**引数**

なし

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "status", strlen("status"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

````js
{
  "alloc_count": 141,
  "starttime": 1414132653,
  "uptime": 0,
  "version": "4.0.5",
  "n_queries": 0,
  "cache_hit_rate": 0,
  "command_version": 1,
  "default_command_version": 1,
  "max_command_version": 2
}
````

## table_list

table_list - DBに定義されているテーブルをリスト表示

**引数**

なし

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "table_list", strlen("table_list"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

````js
[
  [
    [
      "id",
      "UInt32"
    ],
    [
      "name",
      "ShortText"
    ],
    [
      "path",
      "ShortText"
    ],
    [
      "flags",
      "ShortText"
    ],
    [
      "domain",
      "ShortText"
    ],
    [
      "range",
      "ShortText"
    ],
    [
      "default_tokenizer",
      "ShortText"
    ],
    [
      "normalizer",
      "ShortText"
    ]
  ],
  [
    260,
    "Entries",
    "db/test.db.0000104",
    "TABLE_HASH_KEY|PERSISTENT",
    "ShortText",
    null,
    null,
    null
  ],
  [
    263,
    "Terms",
    "db/test.db.0000107",
    "TABLE_PAT_KEY|PERSISTENT",
    "ShortText",
    null,
    "TokenBigram",
    "NormalizerAuto"
  ],
  [
    256,
    "Users",
    "db/test.db.0000100",
    "TABLE_PAT_KEY|PERSISTENT",
    "ShortText",
    null,
    null,
    null
  ]
]
````


## column_list

column_list コマンドはテーブルにあるカラムの一覧を返します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "column_list", strlen("column_list"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entries");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));

```

**結果**

````js
[
  [
    [
      "id",
      "UInt32"
    ],
    [
      "name",
      "ShortText"
    ],
    [
      "path",
      "ShortText"
    ],
    [
      "type",
      "ShortText"
    ],
    [
      "flags",
      "ShortText"
    ],
    [
      "domain",
      "ShortText"
    ],
    [
      "range",
      "ShortText"
    ],
    [
      "source",
      "ShortText"
    ]
  ],
  [
    260,
    "_key",
    "",
    "",
    "COLUMN_SCALAR",
    "Entries",
    "ShortText",
    []
  ],
  [
    261,
    "content",
    "db/test.db.0000105",
    "var",
    "COLUMN_SCALAR|PERSISTENT",
    "Entries",
    "Text",
    []
  ],
  [
    262,
    "n_likes",
    "db/test.db.0000106",
    "fix",
    "COLUMN_SCALAR|PERSISTENT",
    "Entries",
    "UInt32",
    []
  ]
]
```

## table_create

table_create は現在のデータベースに新しいテーブルを作成します。データを保存したり検索したりするために、1つ以上のテーブルを作成する必要があります。

**引数**

| 名前              | Offset | 概要         |
|:-----------------:|:------:|:------------:|
| name              | 0      |              |
| flags             | 1      |              |
| key_type          | 2      |              |
| value_type        | 3      |              |
| default_tokenizer | 4      |              |
| normalizer        | 5      |              |
| token_filters     | 6      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "table_create", strlen("table_create"));

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "Lexicon");

  /* 引数を取得して値を設定 */
  grn_obj *flags = grn_expr_get_var(ctx, command, "flags", strlen("flags"));
  grn_obj_reinit(ctx, flags, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, flags, "TABLE_PAT_KEY");

  /* 引数を取得して値を設定 */
  grn_obj *type = grn_expr_get_var(ctx, command, "key_type", strlen("key_type"));
  grn_obj_reinit(ctx, type, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, type, "ShortText");

  /* 引数を取得して値を設定 */
  grn_obj *tokenizer = grn_expr_get_var(ctx, command, "default_tokenizer", strlen("default_tokenizer"));
  grn_obj_reinit(ctx, tokenizer, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, tokenizer, "TokenBigram");

  /* 引数を取得して値を設定 */
  grn_obj *normalizer = grn_expr_get_var(ctx, command, "normalizer", strlen("normalizer"));
  grn_obj_reinit(ctx, normalizer, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, normalizer, "NormalizerAuto");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## table_remove

table_remove - テーブルの削除

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| name       | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "table_remove", strlen("table_remove"));

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "Lexicon");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```



## table_rename

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| name       | 0      |              |
| new_name   | 1      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "table_rename", strlen("table_rename"));

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "Entries");

  /* 引数を取得して値を設定 */
  grn_obj *new = grn_expr_get_var(ctx, command, "new_name", strlen("new_name"));
  grn_obj_reinit(ctx, new, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, new, "Entry");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## column_create

column_create - カラムの追加

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |
| name       | 1      |              |
| flags      | 2      |              |
| type       | 3      |              |
| source     | 4      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "column_create", strlen("column_create"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entry");

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "body");

  /* 引数を取得して値を設定 */
  grn_obj *type = grn_expr_get_var(ctx, command, "type", strlen("type"));
  grn_obj_reinit(ctx, type, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, type, "ShortText");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```



## column_remove

column_remove - テーブルに定義されているカラムの削除

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |
| name       | 1      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "column_remove", strlen("column_remove"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entry");

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "body");


  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## column_rename

column_rename コマンドはカラム名を変更します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |
| name       | 1      |              |
| new_name   | 2      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "column_rename", strlen("column_rename"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Entry");

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "name", strlen("name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "body");

  /* 引数を取得して値を設定 */
  grn_obj *new = grn_expr_get_var(ctx, command, "new_name", strlen("new_name"));
  grn_obj_reinit(ctx, new, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, new, "body2");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```

## expr_missing

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| path       | 0      |              |


## quit

quit - セッション終了

**引数**

なし


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "quit", strlen("quit"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```

## shutdown

shutdown - サーバプロセスの停止

**引数**

なし

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "shutdown", strlen("shutdown"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```

## clearlock

clearlock - オブジェクトにセットされたロックを解除する

**引数**

| 名前        | Offset | 概要         |
|:-----------:|:------:|:------------:|
| target_name | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "clearlock", strlen("clearlock"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## defrag

defrag コマンドは指定されたオブジェクトのフラグメンテーションを解消します。

**引数**

| 名前        | Offset | 概要         |
|:-----------:|:------:|:------------:|
| target_name | 0      |              |
| threshold   | 1      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "defrag", strlen("defrag"));

  /* 引数を取得して値を設定 */
  grn_obj *name = grn_expr_get_var(ctx, command, "target_name", strlen("target_name"));
  grn_obj_reinit(ctx, name, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, name, "Entry.body");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## log_level

log_level - ログ出力レベルの設定

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| level      | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "log_level", strlen("log_level"));

  /* 引数を取得して値を設定 */
  grn_obj *level = grn_expr_get_var(ctx, command, "level", strlen("level"));
  grn_obj_reinit(ctx, level, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, level, "warning");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## log_put

log_put - ログ出力

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| level      | 0      |              |
| message    | 1      |              |

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "log_put", strlen("log_put"));

  /* 引数を取得して値を設定 */
  grn_obj *level = grn_expr_get_var(ctx, command, "level", strlen("level"));
  grn_obj_reinit(ctx, level, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, level, "ERROR");

  /* 引数を取得して値を設定 */
  grn_obj *message = grn_expr_get_var(ctx, command, "message", strlen("message"));
  grn_obj_reinit(ctx, message, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, message, "****MESSAGE****");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## log_reopen

**引数**

なし

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "log_reopen", strlen("log_reopen"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```

## delete

delete コマンドは指定したテーブルのレコードを削除します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |
| key        | 1      |              |
| id         | 2      |              |
| filter     | 3      |              |

```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "delete", strlen("delete"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Country");

  /* 引数を取得して値を設定 */
  grn_obj *key = grn_expr_get_var(ctx, command, "key", strlen("key"));
  grn_obj_reinit(ctx, key, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, key, "United States");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## cache_limit

cache_limit は最大クエリーキャッシュエントリー数を取得・設定します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| max        | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "cache_limit", strlen("cache_limit"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
100
```

## dump

dump - データベースのスキーマとデータを出力する

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| tables     | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "dump", strlen("dump"));

  /* 引数を取得して値を設定 */
  grn_obj *tables = grn_expr_get_var(ctx, command, "tables", strlen("tables"));
  grn_obj_reinit(ctx, tables, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, tables, "Users");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
table_create Country TABLE_HASH_KEY ShortText
table_create Users TABLE_HASH_KEY UInt32
column_create Users name COLUMN_SCALAR ShortText
column_create Users country COLUMN_SCALAR Country
load --table Users
[
["_key","country","name"],
[1,"","John"],
[2,"","Mike"],
[3,"Japan","Takashi"],
[4,"Japan","Hanako"]
]
```


## register

register コマンドはプラグインを登録します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| path       | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "register", strlen("register"));

  /* 引数を取得して値を設定 */
  grn_obj *path = grn_expr_get_var(ctx, command, "path", strlen("path"));
  grn_obj_reinit(ctx, path, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, path, "query_expanders/tsv");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```

## check

check - オブジェクトの状態表示

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| obj        | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "check", strlen("check"));

  /* 引数を取得して値を設定 */
  grn_obj *obj = grn_expr_get_var(ctx, command, "obj", strlen("obj"));
  grn_obj_reinit(ctx, obj, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, obj, "Users.name");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
[
  {
    "flags": "0000C000",
    "curr seg": 0,
    "curr pos": 4194304,
    "max_element_size": 4096,
    "segregate_threshold": 16,
    "n_element_variation": 14
  },
  [
    {
      "seg id": 0,
      "seg type": 3,
      "seg value": 0
    }
  ]
]
```


## truncate

truncate コマンドは指定したテーブルのレコードをすべて削除します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| table      | 0      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "truncate", strlen("truncate"));

  /* 引数を取得して値を設定 */
  grn_obj *table = grn_expr_get_var(ctx, command, "table", strlen("table"));
  grn_obj_reinit(ctx, table, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, table, "Users");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
true
```


## normalize

normalize コマンドは指定したノーマライザーでテキストを正規化します。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| normalizer | 0      |              |
| string     | 1      |              |
| flags      | 2      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "normalize", strlen("normalize"));

  /* 引数を取得して値を設定 */
  grn_obj *normalizer = grn_expr_get_var(ctx, command, "normalizer", strlen("normalizer"));
  grn_obj_reinit(ctx, normalizer, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, normalizer, "NormalizerAuto");

  /* 引数を取得して値を設定 */
  grn_obj *string = grn_expr_get_var(ctx, command, "string", strlen("string"));
  grn_obj_reinit(ctx, string, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, string, "aBcDe 123");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
{
  "normalized": "abcde 123",
  "types": [],
  "checks": []
}
```


## tokenize

tokenize コマンドは指定したトークナイザーでテキストをトークナイズします。これはトークナイズ処理のデバッグに便利です。

**引数**

| 名前       | Offset | 概要         |
|:----------:|:------:|:------------:|
| tokenizer  | 0      |              |
| string     | 1      |              |
| normalizer | 2      |              |
| flags      | 3      |              |
| mode       | 4      |              |


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "tokenize", strlen("tokenize"));

  /* 引数を取得して値を設定 */
  grn_obj *tokenizer = grn_expr_get_var(ctx, command, "tokenizer", strlen("tokenizer"));
  grn_obj_reinit(ctx, tokenizer, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, tokenizer, "TokenBigram");

  /* 引数を取得して値を設定 */
  grn_obj *string = grn_expr_get_var(ctx, command, "string", strlen("string"));
  grn_obj_reinit(ctx, string, GRN_DB_TEXT, 0);
  GRN_TEXT_PUTS(ctx, string, "Fulltext Search");

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
[
  {
    "value": "Fu",
    "position": 0
  },
  {
    "value": "ul",
    "position": 1
  },
  {
    "value": "ll",
    "position": 2
  },
  {
    "value": "lt",
    "position": 3
  },
  {
    "value": "te",
    "position": 4
  },
  {
    "value": "ex",
    "position": 5
  },
  {
    "value": "xt",
    "position": 6
  },
  {
    "value": "t ",
    "position": 7
  },
  {
    "value": " S",
    "position": 8
  },
  {
    "value": "Se",
    "position": 9
  },
  {
    "value": "ea",
    "position": 10
  },
  {
    "value": "ar",
    "position": 11
  },
  {
    "value": "rc",
    "position": 12
  },
  {
    "value": "ch",
    "position": 13
  },
  {
    "value": "h",
    "position": 14
  }
]
```


## tokenizer_list

tokenizer_list コマンドはデータベースに登録されているトークナイザーの一覧を返します。

**引数**

なし


```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "tokenizer_list", strlen("tokenizer_list"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
[
  {
    "name": "TokenDelimit"
  },
  {
    "name": "TokenUnigram"
  },
  {
    "name": "TokenBigram"
  },
  {
    "name": "TokenTrigram"
  },
  {
    "name": "TokenBigramSplitSymbol"
  },
  {
    "name": "TokenBigramSplitSymbolAlpha"
  },
  {
    "name": "TokenBigramSplitSymbolAlphaDigit"
  },
  {
    "name": "TokenBigramIgnoreBlank"
  },
  {
    "name": "TokenBigramIgnoreBlankSplitSymbol"
  },
  {
    "name": "TokenBigramIgnoreBlankSplitSymbolAlpha"
  },
  {
    "name": "TokenBigramIgnoreBlankSplitSymbolAlphaDigit"
  },
  {
    "name": "TokenDelimitNull"
  }
]
```


## normalizer_list

normalizer_list コマンドはデータベースに登録されているノーマライザーの一覧を返します。

**引数**

なし



```c
  /* コマンドを取得 */
  grn_obj *command = grn_ctx_get(ctx, "normalizer_list", strlen("normalizer_list"));

  /* コマンドの実行*/
  grn_expr_exec(ctx, command, 0);

  /* コマンド結果の取得 */
  grn_ctx_info info;
  grn_ctx_info_get(ctx, &info);
  printf("%.*s\n", (int)GRN_TEXT_LEN(info.outbuf), GRN_TEXT_VALUE(info.outbuf));
```

**結果**

````js
[
  {
    "name": "NormalizerAuto"
  },
  {
    "name": "NormalizerNFKC51"
  }
]
```