Skip to content

Instantly share code, notes, and snippets.

@naoa
Created October 1, 2013 11:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save naoa/6777040 to your computer and use it in GitHub Desktop.
Save naoa/6777040 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <groonga.h>
int
main(int argc, char **argv)
{
grn_ctx ctx;
grn_obj *db, *table, *column, *key_type, *value_type;
grn_id id;
grn_rc rc;
int added;
grn_obj value, bulk;
/* groongaのデータベースファイル名 */
const char *path = "test.grn";
/* -------------初期処理------------- */
/* groongaライブラリを初期化 */
/* https://github.com/groonga/groonga/blob/master/doc/API.rd#L15 */
if (grn_init()) {
fprintf(stderr, "grn_init() failed\n");
return -1;
}
/*grn_ctx構造体を初期化*/
/*https://github.com/groonga/groonga/blob/master/doc/API.rd#L51*/
if (grn_ctx_init(&ctx, 0)) {
fprintf(stderr, "grn_ctx_init() failed\n");
return -1;
}
/* -------------データベースオープン処理------------- */
/* データベースを開く */
/* http://groonga.org/ja/docs/reference/api/grn_db.html */
db = grn_db_open(&ctx, path);
/*データベースを開けなければつくる*/
/* http://groonga.org/ja/docs/reference/api/grn_db.html */
if (!db) { db = grn_db_create(&ctx, path, NULL); }
/* データベースを開けず、つくれなければエラー処理 */
if (!db) {
fprintf(stderr, "db initialize failed\n");
return -1;
}
/* -------------テーブルオープンor作成処理------------- */
/* dbからSHORT_TEXT型に対応するオブジェクトを検索して返す */
/*http://groonga.org/ja/docs/reference/api/grn_ctx.html */
key_type = grn_ctx_at(&ctx, GRN_DB_SHORT_TEXT);
/* GRN_TABLE_OPEN_OR_CREATE grn_ctx_get、grn_table_createを行うマクロ */
/* テーブルを開くまたはテーブルを作成する */
/* https://github.com/groonga/groonga/blob/master/include/groonga.h#L494 */
/* http://groonga.org/ja/docs/reference/api/grn_ctx.html */
/* http://groonga.org/ja/docs/reference/api/grn_table.html */
GRN_TABLE_OPEN_OR_CREATE(&ctx, "table", 5, NULL,
GRN_OBJ_TABLE_HASH_KEY|GRN_OBJ_PERSISTENT,
key_type, NULL, table);
/* -------------カラムオープンor作成処理------------- */
/* dbからTEXT型に対応するオブジェクトを検索して返す */
/*http://groonga.org/ja/docs/reference/api/grn_ctx.html*/
value_type = grn_ctx_at(&ctx, GRN_DB_TEXT);
/* GRN_COLUMN_OPEN_OR_CREATE grn_obj_column、grn_column_createを行うマクロ */
/* https://github.com/groonga/groonga/blob/master/include/groonga.h#L728 */
/* http://groonga.org/ja/docs/reference/api/grn_obj.html */
/* http://groonga.org/ja/docs/reference/api/grn_column.html */
GRN_COLUMN_OPEN_OR_CREATE(&ctx, table, "col", 3, NULL,
GRN_OBJ_PERSISTENT|GRN_OBJ_COLUMN_SCALAR,
value_type, column);
/* -------------テーブルへの新規レコード追加or既存レコードのID取得処理------------- */
/* http://groonga.org/ja/docs/reference/api/grn_table.html */
id = grn_table_add(&ctx, table, "rec1", 4, &added);
printf("id=%d, added=%d\n", id, added);
/* -------------レコードに対応するカラムへの値の更新処理------------- */
/* 更新値用バッファの初期処理 */
GRN_TEXT_INIT(&value, 0);
/* 更新値を格納 */
GRN_TEXT_PUT(&ctx, &value, "groonga world.", 14);
/* 更新値をカラムにセット */
/* http://groonga.org/ja/docs/reference/api/grn_obj.html */
rc = grn_obj_set_value(&ctx, column, id, &value, GRN_OBJ_SET);
printf("grn_obj_set_value: rc=%d\n", rc);
/* -------------レコードに対応するカラムからの値の取得処理------------- */
/* 取得値格納用バッファの初期処理 */
GRN_TEXT_INIT(&bulk, 0);
/* 取得値格納用バッファの先頭ポインタに巻き戻し */
GRN_BULK_REWIND(&bulk);
/* カラムから値を取得 */
/* http://groonga.org/ja/docs/reference/api/grn_obj.html */
grn_obj_get_value(&ctx, column, id, &bulk);
printf("grn_obj_get_value: bulk=%s\n", GRN_BULK_HEAD(&bulk));
/* -------------取得値格納用バッファ領域の解放------------- */
/* grn_obj構造体を開放 */
/* http://groonga.org/ja/docs/reference/api/grn_obj.html */
grn_obj_close(&ctx, &bulk);
/* -------------データベースクローズ処理------------- */
/* grn_obj構造体を開放 */
/* http://groonga.org/ja/docs/reference/api/grn_obj.html */
if (grn_obj_close(&ctx, db)) {
fprintf(stderr, "grn_obj_close() failed\n");
return -1;
}
/* -------------終了処理------------- */
/* grn_ctx構造体を開放 */
/* https://github.com/groonga/groonga/blob/master/doc/API.rd#L52 */
if (grn_ctx_fin(&ctx)) {
fprintf(stderr, "grn_ctx_fin() failed\n");
return -1;
}
/* groongaライブラリを開放 */
/* https://github.com/groonga/groonga/blob/master/doc/API.rd#L15 */
if (grn_fin()) {
fprintf(stderr, "grn_fin() failed\n");
return -1;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment