src/core/ngx_data.c - nginx-1.31.4 nginx/ @ 8d9666701

Global variables defined

Functions defined

Source code


  1. /*
  2. * Copyright (C) Nginx, Inc.
  3. */


  4. #include <ngx_config.h>
  5. #include <ngx_core.h>


  6. static size_t  ngx_data_sizes[] = {
  7.     sizeof(ngx_data_obj_t),            /* NGX_DATA_OBJECT_TYPE */
  8.     sizeof(ngx_data_obj_t),            /* NGX_DATA_LIST_TYPE */
  9.     sizeof(ngx_str_t),                 /* NGX_DATA_STRING_TYPE */
  10.     sizeof(int64_t),                   /* NGX_DATA_INTEGER_TYPE */
  11.     sizeof(ngx_uint_t),                /* NGX_DATA_BOOLEAN_TYPE */
  12.     0,                                 /* NGX_DATA_NULL_TYPE */
  13. };


  14. ngx_data_item_t *
  15. ngx_data_new_item(ngx_pool_t *pool, ngx_uint_t type)
  16. {
  17.     ngx_data_item_t  *item;

  18.     item = ngx_pcalloc(pool, offsetof(ngx_data_item_t, data)
  19.                              + ngx_data_sizes[type]);
  20.     if (item == NULL) {
  21.         return NULL;
  22.     }

  23.     item->type = type;

  24.     return item;
  25. }


  26. void
  27. ngx_data_add_item(ngx_data_item_t *obj, ngx_str_t *name, ngx_data_item_t *item)
  28. {
  29.     ngx_data_obj_t  *object;

  30.     if (obj->type != NGX_DATA_OBJECT_TYPE && obj->type != NGX_DATA_LIST_TYPE) {
  31.         return;
  32.     }

  33.     object = &obj->data.object;

  34.     if (name) {
  35.         item->name = *name;
  36.     }

  37.     if (object->next == NULL) {
  38.         object->next = &object->item;
  39.     }

  40.     *object->next = item;
  41.     object->next = &item->next;
  42. }


  43. ngx_data_item_t *
  44. ngx_data_obj_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  45. {
  46.     ngx_data_item_t  *obj, *item;
  47.     ngx_data_decl_t  *decl;

  48.     obj = ngx_data_new_object(pool);
  49.     if (obj == NULL) {
  50.         return NULL;
  51.     }

  52.     decl = (ngx_data_decl_t *) data;

  53.     while (decl->name.len) {

  54.         item = decl->handler(decl->data, pool, ctx);
  55.         if (item == NULL) {
  56.             return NULL;
  57.         }

  58.         if (item != NGX_DATA_DECLINE) {
  59.             ngx_data_add_item(obj, &decl->name, item);
  60.         }

  61.         decl++;
  62.     }

  63.     return obj;
  64. }


  65. ngx_data_item_t *
  66. ngx_data_obj_fields_handler(uintptr_t data, ngx_pool_t *pool, void *ctx,
  67.     ngx_array_t *fields)
  68. {
  69.     ngx_str_t        *value;
  70.     ngx_uint_t        i;
  71.     ngx_data_item_t  *obj, *item;
  72.     ngx_data_decl_t  *decl;

  73.     obj = ngx_data_new_object(pool);
  74.     if (obj == NULL) {
  75.         return NULL;
  76.     }

  77.     decl = (ngx_data_decl_t *) data;

  78.     while (decl->name.len) {

  79.         if (fields) {
  80.             value = fields->elts;

  81.             for (i = 0; i < fields->nelts; i++) {

  82.                 if (decl->name.len == value[i].len
  83.                     && ngx_strncmp(decl->name.data, value[i].data,
  84.                                    value[i].len)
  85.                     == 0)
  86.                 {
  87.                     goto found;
  88.                 }
  89.             }

  90.             decl++;
  91.             continue;
  92.         }

  93. found:

  94.         item = decl->handler(decl->data, pool, ctx);
  95.         if (item == NULL) {
  96.             return NULL;
  97.         }

  98.         if (item != NGX_DATA_DECLINE) {
  99.             ngx_data_add_item(obj, &decl->name, item);
  100.         }

  101.         decl++;
  102.     }

  103.     return obj;
  104. }


  105. ngx_data_item_t *
  106. ngx_data_number_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  107. {
  108.     ngx_data_item_t  *item;

  109.     item = ngx_data_new_integer(pool);
  110.     if (item == NULL) {
  111.         return NULL;
  112.     }

  113.     item->data.integer = data;

  114.     return item;
  115. }


  116. ngx_data_item_t *
  117. ngx_data_string_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  118. {
  119.     ngx_str_t        *value, *src;
  120.     ngx_data_item_t  *item;

  121.     item = ngx_data_new_string(pool);
  122.     if (item == NULL) {
  123.         return NULL;
  124.     }

  125.     value = &item->data.string;

  126.     src = (ngx_str_t *) data;

  127.     value->len = src->len;

  128.     value->data = ngx_pstrdup(pool, src);
  129.     if (value->data == NULL) {
  130.         return NULL;
  131.     }

  132.     return item;
  133. }


  134. ngx_data_item_t *
  135. ngx_data_boolean_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  136. {
  137.     ngx_data_item_t  *item;

  138.     item = ngx_data_new_boolean(pool);
  139.     if (item == NULL) {
  140.         return NULL;
  141.     }

  142.     item->data.boolean = data;

  143.     return item;
  144. }


  145. ngx_data_item_t *
  146. ngx_data_time_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  147. {
  148.     u_char      *p;
  149.     ngx_tm_t     tm;
  150.     ngx_str_t    src;
  151.     ngx_time_t  *tp;
  152.     u_char       iso8601[sizeof("1974-01-19T13:00:00.000Z") - 1];

  153.     tp = (ngx_time_t *) data;

  154.     ngx_gmtime(tp->sec, &tm);

  155.     p = ngx_sprintf(iso8601, "%4d-%02d-%02dT%02d:%02d:%02d",
  156.                     tm.ngx_tm_year, tm.ngx_tm_mon, tm.ngx_tm_mday,
  157.                     tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);

  158.     if (tp->msec) {
  159.         p = ngx_sprintf(p, ".%03ui", tp->msec);
  160.     }

  161.     *p++ = 'Z';

  162.     src.data = iso8601;
  163.     src.len = p - iso8601;

  164.     return ngx_data_string_handler((uintptr_t) &src, pool, NULL);
  165. }


  166. ngx_data_item_t *
  167. ngx_data_struct_int64_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  168. {
  169.     ngx_data_item_t  *item;

  170.     item = ngx_data_new_integer(pool);
  171.     if (item == NULL) {
  172.         return NULL;
  173.     }

  174.     item->data.integer = *(int64_t *) ((u_char *) ctx + data);

  175.     return item;
  176. }


  177. ngx_data_item_t *
  178. ngx_data_struct_int_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  179. {
  180.     ngx_int_t  value;

  181.     value = *(ngx_int_t *) ((u_char *) ctx + data);

  182.     return ngx_data_number_handler(value, pool, NULL);
  183. }


  184. ngx_data_item_t *
  185. ngx_data_struct_atomic_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  186. {
  187.     ngx_data_item_t  *item;

  188.     item = ngx_data_new_integer(pool);
  189.     if (item == NULL) {
  190.         return NULL;
  191.     }

  192.     item->data.integer = *(ngx_atomic_uint_t *) ((u_char *) ctx + data);

  193.     return item;
  194. }


  195. ngx_data_item_t *
  196. ngx_data_struct_str_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  197. {
  198.     ngx_str_t        *value, *src;
  199.     ngx_data_item_t  *item;

  200.     item = ngx_data_new_string(pool);
  201.     if (item == NULL) {
  202.         return NULL;
  203.     }

  204.     value = &item->data.string;

  205.     src = (ngx_str_t *) ((u_char *) ctx + data);

  206.     value->len = src->len;

  207.     value->data = ngx_pstrdup(pool, src);
  208.     if (value->data == NULL) {
  209.         return NULL;
  210.     }

  211.     return item;
  212. }


  213. ngx_data_item_t *
  214. ngx_data_struct_boolean_handler(uintptr_t data, ngx_pool_t *pool, void *ctx)
  215. {
  216.     ngx_uint_t  value;

  217.     value = *(ngx_uint_t *) ((u_char *) ctx + data);

  218.     return ngx_data_boolean_handler(value, pool, NULL);
  219. }