Kouhei Sutou
null+****@clear*****
Thu May 18 11:28:03 JST 2017
Kouhei Sutou 2017-05-18 11:28:03 +0900 (Thu, 18 May 2017) New Revision: 5adf311fa089f47353b7b1d29041cbd1521fe2cd https://github.com/groonga/groonga/commit/5adf311fa089f47353b7b1d29041cbd1521fe2cd Message: grn_column_name: return fully qualified name for accessor Before: grn_table_select() -> grn_obj_column("column1.column2") -> # _key.column1.column2 accessor grn_column_name() -> "_key" After: grn_table_select() -> grn_obj_column("column1.column2") -> # _key.column1.column2 accessor grn_column_name() -> "column1.column2" # internal "_key" is omitted. Modified files: lib/db.c Modified: lib/db.c (+49 -15) =================================================================== --- lib/db.c 2017-05-17 22:07:45 +0900 (b5b20d7) +++ lib/db.c 2017-05-18 11:28:03 +0900 (023d79c) @@ -11085,50 +11085,84 @@ grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) } } } else if (obj->header.type == GRN_ACCESSOR) { - const char *name = NULL; + grn_obj name; grn_accessor *a; + + GRN_TEXT_INIT(&name, 0); + +#define ADD_DELMITER() do { \ + if (GRN_TEXT_LEN(&name) > 0) { \ + GRN_TEXT_PUTC(ctx, &name, GRN_DB_DELIMITER); \ + } \ + } while (GRN_FALSE) + for (a = (grn_accessor *)obj; a; a = a->next) { switch (a->action) { case GRN_ACCESSOR_GET_ID : - name = GRN_COLUMN_NAME_ID; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_ID); break; case GRN_ACCESSOR_GET_KEY : - name = GRN_COLUMN_NAME_KEY; + if (!a->next) { + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_KEY); + } break; case GRN_ACCESSOR_GET_VALUE : - name = GRN_COLUMN_NAME_VALUE; + if (!a->next) { + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_VALUE); + } break; case GRN_ACCESSOR_GET_SCORE : - name = GRN_COLUMN_NAME_SCORE; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_SCORE); break; case GRN_ACCESSOR_GET_NSUBRECS : - name = GRN_COLUMN_NAME_NSUBRECS; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_NSUBRECS); break; case GRN_ACCESSOR_GET_MAX : - name = GRN_COLUMN_NAME_MAX; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_MAX); break; case GRN_ACCESSOR_GET_MIN : - name = GRN_COLUMN_NAME_MIN; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_MIN); break; case GRN_ACCESSOR_GET_SUM : - name = GRN_COLUMN_NAME_SUM; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_SUM); break; case GRN_ACCESSOR_GET_AVG : - name = GRN_COLUMN_NAME_AVG; + ADD_DELMITER(); + GRN_TEXT_PUTS(ctx, &name, GRN_COLUMN_NAME_AVG); break; case GRN_ACCESSOR_GET_COLUMN_VALUE : + ADD_DELMITER(); + { + char column_name[GRN_TABLE_MAX_KEY_SIZE]; + int column_name_size; + column_name_size = grn_column_name(ctx, a->obj, + column_name, + GRN_TABLE_MAX_KEY_SIZE); + GRN_TEXT_PUT(ctx, &name, column_name, column_name_size); + } + break; case GRN_ACCESSOR_GET_DB_OBJ : case GRN_ACCESSOR_LOOKUP : case GRN_ACCESSOR_FUNCALL : break; } } - if (name) { - len = strlen(name); - if (len <= buf_size) { - grn_memcpy(namebuf, name, len); - } +#undef ADD_DELIMITER + + len = GRN_TEXT_LEN(&name); + if (len > 0 && len <= buf_size) { + grn_memcpy(namebuf, GRN_TEXT_VALUE(&name), len); } + + GRN_OBJ_FIN(ctx, &name); } GRN_API_RETURN(len); } -------------- next part -------------- HTML����������������������������...下载