78 indexDefinition, &afw_s_objectType, xctx);
81 if (objectTypes == NULL)
84 object_type_iterator = NULL;
86 objectTypes, &object_type_iterator, xctx);
87 if (nextObjectType == NULL)
91 while (nextObjectType) {
96 objectTypes, &object_type_iterator, xctx);
120 indexDefinition, &afw_s_filter, xctx);
123 afw_compile_type_expression, NULL, NULL, object->p, xctx);
149 afw_boolean_t afw_adaptor_impl_index_option_case_insensitive(
158 indexDefinition, &afw_s_options, xctx);
161 option_iterator = NULL;
174 options, &option_iterator, xctx->p, xctx);
197 indexDefinition, &afw_s_options, xctx);
200 option_iterator = NULL;
213 options, &option_iterator, xctx->p, xctx);
226 void afw_adaptor_impl_index_apply(
245 indexDefinition, &afw_s_options, xctx);
248 option_iterator = NULL;
257 case_sensitive =
false;
263 options, &option_iterator, xctx->p, xctx);
271 if (!case_sensitive) {
278 if (operation == afw_adaptor_impl_index_mode_add) {
280 object_id, key, value_string, unique, object->p, xctx);
283 else if (operation == afw_adaptor_impl_index_mode_delete) {
285 object_id, key, value_string, object->p, xctx);
305 afw_adaptor_impl_index_mode_t operation,
317 if (!afw_adaptor_impl_index_object_type_applicable(
318 indexDefinition, object_type_id, xctx)) {
324 object, indexDefinition, xctx)) {
331 indexDefinition, &afw_s_value, xctx);
332 if (value_expression)
335 afw_compile_type_expression, NULL, NULL, object->p, xctx);
383 "Error: value expression generated an object and cannot be used as an index.",
392 eval, object->p, xctx);
393 for (i = 0; index_values[i]; i++) {
394 index_value = index_values[i];
396 afw_adaptor_impl_index_apply(instance, indexDefinition,
397 object_type_id, object_id,
object, key, index_value, operation, xctx);
406 afw_adaptor_impl_index_apply(instance, indexDefinition,
407 object_type_id, object_id,
object, key, eval, operation, xctx);
413 "Error: value expression generated an unknown and unhandled index value.",
420 void afw_adaptor_impl_index_open_definition(
438 indexDefinition, &afw_s_options, xctx);
440 option_iterator = NULL;
457 options, &option_iterator, xctx->p, xctx);
462 indexDefinition, &afw_s_objectType, xctx);
465 object_type_iterator = NULL;
467 objectType, &object_type_iterator, xctx);
468 while (object_type_id) {
470 key, integer, unique, reverse, pool, xctx);
473 objectType, &object_type_iterator, xctx);
477 integer, unique, reverse, pool, xctx);
481 AFW_DEFINE(
void) afw_adaptor_impl_index_open_definitions(
491 index_iterator = NULL;
493 indexDefinitions, &index_iterator, &key, xctx);
495 while (indexDefinition) {
496 afw_adaptor_impl_index_open_definition(indexer, key,
497 indexDefinition, pool, xctx);
500 indexDefinitions, &index_iterator, &key, xctx);
520 if (
object == NULL) {
526 ctx->num_processed++;
532 "Error: unable to determine object_id for object.", xctx);
535 if (!object_type_id) {
537 "Error: unable to determine object_type_id for object.", xctx);
548 if (afw_adaptor_impl_index_try(ctx->instance, key,
object,
549 object_type_id, object_id, ctx->indexDefinition, ctx->mode, xctx)) {
583 if (instance == NULL) {
585 "Error: Cannot find index interface for adaptorId.", xctx);
588 result = instance->indexDefinitions;
590 if (object_type_id) {
593 index_iterator = NULL;
595 instance->indexDefinitions, &index_iterator, &key, xctx);
596 while (indexDefinition) {
597 if (afw_adaptor_impl_index_object_type_applicable(
598 indexDefinition, object_type_id, xctx)) {
600 key, indexDefinition, xctx);
604 instance->indexDefinitions, &index_iterator, &key, xctx);
630 if (indexer == NULL) {
632 "Error: unable to get index interface.", xctx);
638 if (indexer->indexDefinitions == NULL) {
640 "Error: there are no index definitions to remove.", xctx);
644 indexer->indexDefinitions, key, xctx);
645 if (indexDefinition == NULL) {
647 "Error there is no index definition by this key.", xctx);
655 indexer, indexer->indexDefinitions, xctx);
659 indexDefinition, &afw_s_objectType, xctx);
661 object_type_iterator = NULL;
664 objectTypes, &object_type_iterator, xctx);
669 object_type_id, key, pool, xctx);
671 ctx.instance = indexer;
673 ctx.indexDefinition = indexDefinition;
675 ctx.num_processed = 0;
676 ctx.mode = afw_adaptor_impl_index_mode_delete;
680 NULL, &ctx, afw_adaptor_impl_index_cb, NULL, pool, xctx);
686 objectTypes, &object_type_iterator, xctx);
688 }
while (object_type_id);
723 if (indexer == NULL) {
725 "Error: unable to get index interface.", xctx);
731 indexDefinitions = indexer->indexDefinitions;
734 if (indexDefinitions == NULL) {
739 indexDefinitions, key, xctx);
740 if (indexDefinition) {
743 "An index definition by this key already exists.", xctx);
752 &afw_s_value, value, xctx);
756 &afw_s_objectType, objectType, xctx);
760 &afw_s_filter, filter, xctx);
764 &afw_s_options, options, xctx);
766 ctx.instance = indexer;
768 ctx.indexDefinition = indexDefinition;
770 ctx.num_processed = 0;
771 ctx.mode = afw_adaptor_impl_index_mode_add;
775 afw_adaptor_impl_index_open_definition(indexer, key,
776 indexDefinition, pool, xctx);
786 NULL, &ctx, afw_adaptor_impl_index_cb, NULL, pool, xctx);
791 indexDefinitions, key, indexDefinition, xctx);
794 indexer, indexDefinitions, xctx);
801 result, &afw_s_num_indexed, ctx.num_indexed, xctx);
803 result, &afw_s_num_processed, ctx.num_processed, xctx);
824 if (instance->indexDefinitions) {
826 instance->indexDefinitions, property_name, xctx);
827 if (indexDefinition) {
828 if (afw_adaptor_impl_index_object_type_applicable(
829 indexDefinition, object_type_id, xctx)) {
845 const afw_object_t * afw_adaptor_impl_index_get_index_definition(
853 if (instance->indexDefinitions) {
855 instance->indexDefinitions, property_name, xctx);
856 if (indexDefinition) {
857 if (afw_adaptor_impl_index_object_type_applicable(
858 indexDefinition, object_type_id, xctx)) {
859 return indexDefinition;
861 indexDefinition = NULL;
866 return indexDefinition;
876 AFW_DEFINE(
void) afw_adaptor_impl_index_object(
887 if (instance->indexDefinitions) {
889 index_iterator = NULL;
891 instance->indexDefinitions, &index_iterator, &index_name, xctx);
892 while (indexDefinition) {
893 afw_adaptor_impl_index_try(instance, index_name,
object,
894 object_type_id, object_id, indexDefinition,
895 afw_adaptor_impl_index_mode_add, xctx);
898 instance->indexDefinitions, &index_iterator, &index_name, xctx);
911 AFW_DEFINE(
void) afw_adaptor_impl_index_unindex_object(
922 if (instance->indexDefinitions) {
924 index_iterator = NULL;
926 instance->indexDefinitions, &index_iterator, &index_name, xctx);
927 while (indexDefinition) {
928 afw_adaptor_impl_index_try(instance, index_name,
object,
929 object_type_id, object_id, indexDefinition,
930 afw_adaptor_impl_index_mode_delete, xctx);
933 instance->indexDefinitions, &index_iterator, &index_name, xctx);
948 AFW_DEFINE(
void) afw_adaptor_impl_index_reindex_object(
960 if (instance->indexDefinitions) {
961 index_iterator = NULL;
963 instance->indexDefinitions, &index_iterator, &index_name, xctx);
964 while (indexDefinition) {
966 afw_adaptor_impl_index_try(instance, index_name, old_object,
967 object_type_id, object_id, indexDefinition,
968 afw_adaptor_impl_index_mode_delete, xctx);
971 afw_adaptor_impl_index_try(instance, index_name, new_object,
972 object_type_id, object_id, indexDefinition,
973 afw_adaptor_impl_index_mode_add, xctx);
976 instance->indexDefinitions, &index_iterator, &index_name, xctx);
982 #define AFW_QUERY_CRITERIA_CONTINUE(x) \
983 (x != AFW_QUERY_CRITERIA_FALSE && x != AFW_QUERY_CRITERIA_TRUE)
1015 entry->op_id == afw_query_criteria_filter_op_id_eq ||
1016 entry->op_id == afw_query_criteria_filter_op_id_lt ||
1017 entry->op_id == afw_query_criteria_filter_op_id_le ||
1018 entry->op_id == afw_query_criteria_filter_op_id_gt ||
1019 entry->op_id == afw_query_criteria_filter_op_id_ge
1025 sargable = afw_adaptor_impl_index_is_property_indexed(instance,
1026 object_type_id, entry->property_name, xctx);
1035 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_true) &&
1036 AFW_QUERY_CRITERIA_CONTINUE(entry->on_false)) {
1037 on_true = afw_adaptor_impl_index_sargable_entry(
1038 instance, object_type_id, entry->on_true, xctx);
1040 on_false = afw_adaptor_impl_index_sargable_entry(
1041 instance, object_type_id, entry->on_false, xctx);
1043 return ((sargable || on_true) && (on_false));
1047 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_true)) {
1048 on_true = afw_adaptor_impl_index_sargable_entry(
1049 instance, object_type_id, entry->on_true, xctx);
1051 return (sargable || on_true);
1055 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_false)) {
1056 on_false = afw_adaptor_impl_index_sargable_entry(
1057 instance, object_type_id, entry->on_false, xctx);
1059 return (sargable && on_false);
1065 "Error: unexpected condition while parsing filter expression.", xctx);
1089 entry = (criteria) ? criteria->filter : NULL;
1093 return afw_adaptor_impl_index_sargable_entry(
1094 instance, object_type_id, entry, xctx);
1105 afw_boolean_t afw_adaptor_impl_index_cursor_list_cardinality(
1107 apr_array_header_t * cursor_list,
1108 size_t * cardinality,
1117 if (apr_is_empty_array(cursor_list))
1121 for (i = 0; i < cursor_list->nelts; i++) {
1123 cursor_list->elts)[i];
1146 apr_array_header_t * afw_adaptor_impl_index_cursor_list_join(
1148 apr_array_header_t * this_list,
1149 apr_array_header_t * that_list,
1152 size_t this_cardinality, that_cardinality;
1160 for (i = 0; i < this_list->nelts; i++) {
1162 cursor->inner_join =
false;
1165 for (i = 0; i < that_list->nelts; i++) {
1167 cursor->inner_join =
false;
1170 rc = afw_adaptor_impl_index_cursor_list_cardinality(
1171 instance, this_list, &this_cardinality, xctx);
1177 rc = afw_adaptor_impl_index_cursor_list_cardinality(
1178 instance, that_list, &that_cardinality, xctx);
1184 return (this_cardinality <= that_cardinality) ? this_list : that_list;
1196 apr_array_header_t * afw_adaptor_impl_index_cursor_list_merge(
1198 apr_array_header_t * this_list,
1199 apr_array_header_t * that_list,
1202 apr_array_header_t *merged_list;
1203 apr_array_header_t *temp;
1206 size_t this_cardinality, that_cardinality;
1211 merged_size = this_list->nelts + that_list->nelts;
1216 for (i = 0; i < this_list->nelts; i++) {
1221 this_list->elts)[i];
1224 this_cursor, &this_cardinality, xctx);
1225 if (!rc)
return NULL;
1227 for (j = 0; j < temp->nelts; j++) {
1232 that_cursor, &that_cardinality, xctx);
1234 if (this_cardinality > that_cardinality) {
1236 apr_array_push(merged_list) = this_cursor;
1238 this_cardinality = 0;
1242 apr_array_push(merged_list) = that_cursor;
1283 apr_array_header_t *cursor_list, *next_list;
1293 if (entry == NULL) {
1303 indexDefinition = afw_adaptor_impl_index_get_index_definition(
1304 instance, object_type_id, entry->property_name, xctx);
1305 if (indexDefinition)
1309 if (afw_adaptor_impl_index_option_case_insensitive(
1310 indexDefinition, xctx)) {
1313 unique = afw_adaptor_impl_index_option_unique(
1314 indexDefinition, xctx);
1320 entry->property_name, entry->op_id, value_string, unique, xctx->p, xctx);
1324 cursor->inner_join =
true;
1327 cursor->filter_entry = entry;
1330 apr_array_push(cursor_list) = cursor;
1342 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_true) &&
1343 AFW_QUERY_CRITERIA_CONTINUE(entry->on_false))
1357 instance, object_type_id, entry->on_true, xctx);
1360 cursor_list = afw_adaptor_impl_index_cursor_list_join(
1361 instance, cursor_list, next_list, xctx);
1368 instance, object_type_id, entry->on_false, xctx);
1370 cursor_list = afw_adaptor_impl_index_cursor_list_merge(instance,
1371 cursor_list, next_list, xctx);
1375 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_true))
1379 object_type_id, entry->on_true, xctx);
1381 cursor_list = afw_adaptor_impl_index_cursor_list_join(
1382 instance, cursor_list, next_list, xctx);
1386 else if (AFW_QUERY_CRITERIA_CONTINUE(entry->on_false))
1390 object_type_id, entry->on_false, xctx);
1392 cursor_list = afw_adaptor_impl_index_cursor_list_merge(instance,
1393 cursor_list, next_list, xctx);
1399 "Error: unexpected condition while parsing filter expression.", xctx);
1416 static int afw_adaptor_impl_index_compare(
1434 "Error: property value cannot be of type object.", xctx);
1440 for (i = 0; values[i]; i++) {
1484 switch (entry->op_id) {
1485 case afw_query_criteria_filter_op_id_eq:
1486 if (afw_adaptor_impl_index_compare(instance,
1487 entry, value, xctx) == 0)
1490 case afw_query_criteria_filter_op_id_ne:
1491 if (afw_adaptor_impl_index_compare(instance,
1492 entry, value, xctx) != 0)
1495 case afw_query_criteria_filter_op_id_lt:
1496 if (afw_adaptor_impl_index_compare(instance,
1497 entry, value, xctx) < 0)
1500 case afw_query_criteria_filter_op_id_le:
1501 if (afw_adaptor_impl_index_compare(instance,
1502 entry, value, xctx) <= 0)
1505 case afw_query_criteria_filter_op_id_gt:
1506 if (afw_adaptor_impl_index_compare(instance,
1507 entry, value, xctx) > 0)
1510 case afw_query_criteria_filter_op_id_ge:
1511 if (afw_adaptor_impl_index_compare(instance,
1512 entry, value, xctx) >= 0)
1516 case afw_query_criteria_filter_op_id_na:
1519 case afw_query_criteria_filter_op_id_match:
1520 case afw_query_criteria_filter_op_id_contains:
1521 case afw_query_criteria_filter_op_id_in:
1522 case afw_query_criteria_filter_op_id_differ:
1523 case afw_query_criteria_filter_op_id_excludes:
1524 case afw_query_criteria_filter_op_id_out:
1525 case afw_query_criteria_filter_op_id_and:
1526 case afw_query_criteria_filter_op_id_or:
1528 "Filter op not implemented", xctx);
1535 if (entry->op_id == afw_query_criteria_filter_op_id_ne)
1554 AFW_DEFINE(
void) afw_adaptor_impl_index_query(
1563 apr_array_header_t *cursors;
1568 int cursor_index = 0;
1573 object_type_id, (criteria ? criteria->filter : NULL), xctx);
1575 if (apr_is_empty_array(cursors)) {
1577 "Error: unable to parse filter into indexable cursors.", xctx);
1589 current_cursor, p, xctx);
1591 if (
object == NULL) {
1596 if (cursors->nelts == cursor_index) {
1598 callback(NULL, context, xctx);
1606 cursors->elts)[cursor_index];
1617 if (!current_cursor->inner_join &&
1631 for (i = cursor_index+1; i < cursors->nelts; i++) {
1639 if (afw_adaptor_impl_index_applies(instance,
1640 next_cursor,
object, xctx)) {
1655 callback(
object, context, xctx);
1659 callback(NULL, context, xctx);
afw_boolean_t afw_adaptor_impl_index_filter_applicable(const afw_object_t *object, const afw_object_t *indexDefinition, afw_xctx_t *xctx)
AFW_DEFINE(const afw_object_t *)
apr_array_header_t * afw_adaptor_impl_index_cursor_list(const afw_adaptor_impl_index_t *instance, const afw_utf8_t *object_type_id, const afw_query_criteria_filter_entry_t *entry, afw_xctx_t *xctx)
Helpers for afw_adaptor implementation index development.
Adaptive Framework Core Internal.
#define afw_adaptor_impl_index_cursor_get_next_object(instance, pool, xctx)
Call method get_next_object of interface afw_adaptor_impl_index_cursor.
#define afw_adaptor_impl_index_cursor_release(instance, xctx)
Call method release of interface afw_adaptor_impl_index_cursor.
#define afw_adaptor_impl_index_cursor_get_count(instance, count, xctx)
Call method get_count of interface afw_adaptor_impl_index_cursor.
#define afw_adaptor_impl_index_drop(instance, object_type_id, key, pool, xctx)
Call method drop of interface afw_adaptor_impl_index.
#define afw_adaptor_impl_index_open_cursor(instance, object_type_id, index_key, operator,value, unique, pool, xctx)
Call method open_cursor of interface afw_adaptor_impl_index.
#define afw_adaptor_impl_index_update_index_definitions(instance, indexDefinitions, xctx)
Call method update_index_definitions of interface afw_adaptor_impl_index.
#define afw_adaptor_impl_index_add(instance, object_type_id, object_id, key, value, unique, pool, xctx)
Call method add of interface afw_adaptor_impl_index.
#define afw_adaptor_impl_index_delete(instance, object_type_id, object_id, key, value, pool, xctx)
Call method delete of interface afw_adaptor_impl_index.
#define afw_adaptor_impl_index_open(instance, object_type_id, key, integer, unique, reverse, pool, xctx)
Call method open of interface afw_adaptor_impl_index.
#define afw_adaptor_session_retrieve_objects(instance, impl_request, object_type_id, criteria, context, callback, adaptor_type_specific, p, xctx)
Call method retrieve_objects of interface afw_adaptor_session.
#define afw_adaptor_session_begin_transaction(instance, xctx)
Call method begin_transaction of interface afw_adaptor_session.
#define afw_adaptor_session_get_index_interface(instance, xctx)
Call method get_index_interface of interface afw_adaptor_session.
#define afw_adaptor_transaction_release(instance, xctx)
Call method release of interface afw_adaptor_transaction.
#define afw_adaptor_transaction_commit(instance, xctx)
Call method commit of interface afw_adaptor_transaction.
afw_adaptor_session_get_cached(const afw_utf8_t *adaptor_id, afw_boolean_t begin_transaction, afw_xctx_t *xctx)
Get/create an active cached session for adaptor_id.
#define afw_value_is_boolean(A_VALUE)
Macro to determine if value is evaluated boolean.
afw_value_as_boolean(const afw_value_t *value, afw_xctx_t *xctx)
Typesafe cast of data type boolean.
afw_object_set_property_as_integer(const afw_object_t *object, const afw_utf8_t *property_name, afw_integer_t internal, afw_xctx_t *xctx)
Set property function for data type integer values.
#define afw_value_is_list(A_VALUE)
Macro to determine if value is evaluated list.
#define afw_object_old_get_property_as_list(object, property_name, xctx)
Get property function for data type list value.
afw_object_set_property_as_list(const afw_object_t *object, const afw_utf8_t *property_name, const afw_list_t *internal, afw_xctx_t *xctx)
Set property function for data type list values.
#define afw_value_is_null(A_VALUE)
Macro to determine if value is evaluated null.
#define afw_value_is_object(A_VALUE)
Macro to determine if value is evaluated object.
afw_object_set_property_as_object(const afw_object_t *object, const afw_utf8_t *property_name, const afw_object_t *internal, afw_xctx_t *xctx)
Set property function for data type object values.
#define afw_object_old_get_property_as_object(object, property_name, xctx)
Get property function for data type object value.
#define afw_object_old_get_next_property_as_object(object, iterator, property_name, xctx)
Get next property function for data type object value.
afw_value_create_object(const afw_object_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type object value.
afw_value_create_string(const afw_utf8_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type string value.
#define afw_object_old_get_property_as_string(object, property_name, xctx)
Get property function for data type string value.
#define afw_list_of_string_get_next(list, iterator, xctx)
Get next value from list of string.
#define afw_value_is_string(A_VALUE)
Macro to determine if value is evaluated string.
afw_object_set_property_as_string(const afw_object_t *object, const afw_utf8_t *property_name, const afw_utf8_t *internal, afw_xctx_t *xctx)
Set property function for data type string values.
afw_boolean_t(* afw_object_cb_t)(const afw_object_t *object, void *context, afw_xctx_t *xctx)
Typedef for afw_adaptor_session_object callback.
struct afw_iterator_s afw_iterator_t
#define afw_compile_to_value(string, source_location, compile_type, parent, shared, p, xctx)
Compile string to adaptive value.
#define AFW_FINALLY
Always executed regardless of error.
#define AFW_ENDTRY
Ends an AFW try block.
#define AFW_TRY
Begin an AFW TRY block.
#define AFW_THROW_ERROR_Z(code, message_z, xctx)
Macro used to set error and 0 rv in xctx and throw it.
#define afw_list_get_next_value(instance, iterator, p, xctx)
Call method get_next_value of interface afw_list.
#define afw_object_get_property(instance, property_name, xctx)
Call method get_property of interface afw_object.
#define afw_object_release(instance, xctx)
Call method release of interface afw_object.
afw_object_remove_property(const afw_object_t *instance, const afw_utf8_t *property_name, afw_xctx_t *xctx)
Remove a property from object.
#define afw_object_create_managed(p, xctx)
Create an empty entity object in its own pool.
afw_object_set_property_as_string_from_utf8_z(const afw_object_t *instance, const afw_utf8_t *property_name, const afw_utf8_z_t *string_z, afw_xctx_t *xctx)
Set an string property from utf8_z.
#define afw_pool_get_apr_pool(instance)
Call method get_apr_pool of interface afw_pool.
#define afw_pool_release(instance, xctx)
Call method release of interface afw_pool.
const afw_pool_t * afw_pool_create(const afw_pool_t *parent, afw_xctx_t *xctx)
Create a new pool.
afw_query_criteria_test_object(const afw_object_t *obj, const afw_query_criteria_t *criteria, const afw_pool_t *p, afw_xctx_t *xctx)
Test object against query criteria.
#define AFW_QUERY_CRITERIA_FALSE
#define AFW_QUERY_CRITERIA_TRUE
int afw_utf8_compare(const afw_utf8_t *s1, const afw_utf8_t *s2)
Compare two strings.
afw_boolean_t afw_utf8_equal(const afw_utf8_t *s1, const afw_utf8_t *s2)
Check to see if a string equals another string.
const afw_utf8_t * afw_utf8_to_lower(const afw_utf8_t *s, const afw_pool_t *p, afw_xctx_t *xctx)
Convert utf-8 sting to lower case in specified pool.
#define afw_value_evaluate(value, p, xctx)
Evaluate value if needed using specific pool.
afw_value_as_utf8(const afw_value_t *value, const afw_pool_t *p, afw_xctx_t *xctx)
#define afw_value_is_defined_and_evaluated(A_VALUE)
Macro to determine if value is defined and evaluated.
afw_value_as_array_of_values(const afw_value_t *value, const afw_pool_t *p, afw_xctx_t *xctx)
Return a NULL terminated list of values in a specified pool.
int afw_xctx_begin_stack_frame(afw_xctx_t *xctx)
Begin stack frame.
afw_xctx_set_local_variable(const afw_utf8_t *name, const afw_value_t *value, afw_xctx_t *xctx)
Set a variable then current xctx frame.
void afw_xctx_end_stack_frame(int top, afw_xctx_t *xctx)
Set stack top.
Interface afw_adaptor_impl_index_cursor public struct.
Interface afw_adaptor_impl_index public struct.
Interface afw_adaptor_session public struct.
Interface afw_adaptor_transaction public struct.
Interface afw_list public struct.
Interface afw_object public struct.
Interface afw_pool public struct.
Parsed filter entry from query string.
NFC normalized UTF-8 string.
Interface afw_value public struct.
Interface afw_xctx public struct.