const struct lookup_int *lookup; }; static const struct attribute attributes[] = { #define ATTR(s,t) { #s, s, type_##t, NULL } #define ATTR2(s,t,l) { #s, s, type_##t, l } ATTR(SQL_COLUMN_LENGTH, INTEGER), ATTR(SQL_COLUMN_PRECISION, INTEGER), ATTR(SQL_COLUMN_SCALE, INTEGER), ATTR(SQL_DESC_LENGTH, LEN), ATTR(SQL_DESC_OCTET_LENGTH, LEN), ATTR(SQL_DESC_PRECISION, SMALLINT), ATTR(SQL_DESC_SCALE, SMALLINT), ATTR(SQL_DESC_DISPLAY_SIZE, INTEGER), ATTR(SQL_DESC_TYPE_NAME, CHARP), ATTR2(SQL_DESC_CONCISE_TYPE, SMALLINT, sql_types), ATTR2(SQL_DESC_TYPE, SMALLINT, sql_types) #undef ATTR2 #undef ATTR }; static const struct attribute * lookup_attr(const char *name) { unsigned int i; if (!name) fatal("Line %u: NULL attribute\n", line_num); for (i = 0; i < sizeof(attributes) / sizeof(attributes[0]); ++i) if (strcmp(attributes[i].name, name) == 0 || strcmp(attributes[i].name + 4, name) == 0) return &attributes[i];
struct attribute { const char *name; int value; test_type_t type; const struct lookup_int *lookup; }; static const struct attribute attributes[] = { #define ATTR(s,t) { #s, s, type_##t, NULL } #define ATTR2(s,t,l) { #s, s, type_##t, l } ATTR(SQL_ATTR_APP_PARAM_DESC, DESC), ATTR(SQL_ATTR_APP_ROW_DESC, DESC), ATTR(SQL_ATTR_ASYNC_ENABLE, UINTEGER), ATTR2(SQL_ATTR_CONCURRENCY, UINTEGER, concurrency), ATTR2(SQL_ATTR_CURSOR_SCROLLABLE, UINTEGER, scrollable), ATTR2(SQL_ATTR_CURSOR_SENSITIVITY, UINTEGER, sensitivity), ATTR2(SQL_ATTR_CURSOR_TYPE, UINTEGER, cursor_type), ATTR(SQL_ATTR_ENABLE_AUTO_IPD, UINTEGER), ATTR(SQL_ATTR_FETCH_BOOKMARK_PTR, VOIDP), ATTR(SQL_ATTR_IMP_PARAM_DESC, DESC), ATTR(SQL_ATTR_IMP_ROW_DESC, DESC), ATTR(SQL_ATTR_KEYSET_SIZE, UINTEGER), ATTR(SQL_ATTR_MAX_LENGTH, UINTEGER), ATTR(SQL_ATTR_MAX_ROWS, UINTEGER), ATTR(SQL_ATTR_METADATA_ID, UINTEGER), ATTR2(SQL_ATTR_NOSCAN, UINTEGER, noscan), ATTR(SQL_ATTR_PARAM_BIND_OFFSET_PTR, VOIDP), ATTR(SQL_ATTR_PARAM_BIND_OFFSET_PTR, VOIDP), ATTR(SQL_ATTR_PARAM_BIND_TYPE, UINTEGER),