/* * stats_free_statistics () - Frees the given CLASS_STAT structure * return: void * class_statsp(in): class statistics to be freed */ void stats_free_statistics (CLASS_STATS * class_statsp) { ATTR_STATS *attr_statsp; int i, j; if (class_statsp) { if (class_statsp->attr_stats) { for (i = 0, attr_statsp = class_statsp->attr_stats; i < class_statsp->n_attrs; i++, attr_statsp++) { if (attr_statsp->bt_stats) { for (j = 0; j < attr_statsp->n_btstats; j++) { if (attr_statsp->bt_stats[j].pkeys) { db_ws_free (attr_statsp->bt_stats[j].pkeys); } } db_ws_free (attr_statsp->bt_stats); } } db_ws_free (class_statsp->attr_stats); } db_ws_free (class_statsp); } }
/* * db_private_free () - call free function for current private heap * return: * thrd(in): thread conext if it is server, otherwise NULL * ptr(in): memory pointer to free */ void db_private_free (void *thrd, void *ptr) { #if defined (SERVER_MODE) HL_HEAPID heap_id; #endif if (ptr == NULL) { return; } #if defined (CS_MODE) db_ws_free (ptr); #elif defined (SERVER_MODE) heap_id = (thrd ? ((THREAD_ENTRY *) thrd)->private_heap_id : css_get_private_heap (NULL)); if (heap_id) { hl_lea_free (heap_id, ptr); } else { free_and_init (ptr); } #else /* SA_MODE */ if (private_heap_id == 0) { free (ptr); } else { PRIVATE_MALLOC_HEADER *h; h = private_user2hl_ptr (ptr); if (h->magic != PRIVATE_MALLOC_HEADER_MAGIC) { /* assertion point */ return; } if (h->alloc_type == PRIVATE_ALLOC_TYPE_LEA) { hl_lea_free (private_heap_id, h); } else if (h->alloc_type == PRIVATE_ALLOC_TYPE_WS) { db_ws_free (ptr); /* not h */ } else { return; } } #endif /* SA_MODE */ }
/* * qst_client_unpack_statistics () - Unpack the buffer containing statistics * return: CLASS_STATS or NULL in case of error * bufp(in): buffer containing the class statistics * * Note: This function unpacks the statistics on the buffer received from the * server side, and builds a CLASS_STATS structure on the work space * area. This sturucture is returned to the caller. */ static CLASS_STATS * stats_client_unpack_statistics (char *buf_p) { CLASS_STATS *class_stats_p; ATTR_STATS *attr_stats_p; BTREE_STATS *btree_stats_p; int i, j, k; if (!buf_p) { return NULL; } class_stats_p = (CLASS_STATS *) db_ws_alloc (sizeof (CLASS_STATS)); if (!class_stats_p) { return NULL; } class_stats_p->time_stamp = (unsigned int) OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; class_stats_p->num_objects = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; class_stats_p->heap_size = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; class_stats_p->n_attrs = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; if (class_stats_p->n_attrs == 0) { db_ws_free (class_stats_p); return NULL; } class_stats_p->attr_stats = (ATTR_STATS *) db_ws_alloc (class_stats_p->n_attrs * sizeof (ATTR_STATS)); if (!class_stats_p->attr_stats) { db_ws_free (class_stats_p); return NULL; } for (i = 0, attr_stats_p = class_stats_p->attr_stats; i < class_stats_p->n_attrs; i++, attr_stats_p++) { attr_stats_p->id = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; attr_stats_p->type = (DB_TYPE) OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; switch (attr_stats_p->type) { case DB_TYPE_INTEGER: attr_stats_p->min_value.i = OR_GET_INT (buf_p); buf_p += STATS_MIN_MAX_SIZE; attr_stats_p->max_value.i = OR_GET_INT (buf_p); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_BIGINT: attr_stats_p->min_value.bigint = OR_GET_BIGINT (buf_p); buf_p += STATS_MIN_MAX_SIZE; attr_stats_p->max_value.bigint = OR_GET_BIGINT (buf_p); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_SHORT: /* stored these as full integers because of alignment */ attr_stats_p->min_value.i = OR_GET_INT (buf_p); buf_p += STATS_MIN_MAX_SIZE; attr_stats_p->max_value.i = OR_GET_INT (buf_p); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_FLOAT: OR_GET_FLOAT (buf_p, &(attr_stats_p->min_value.f)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_FLOAT (buf_p, &(attr_stats_p->max_value.f)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_DOUBLE: OR_GET_DOUBLE (buf_p, &(attr_stats_p->min_value.d)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_DOUBLE (buf_p, &(attr_stats_p->max_value.d)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_DATE: OR_GET_DATE (buf_p, &(attr_stats_p->min_value.date)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_DATE (buf_p, &(attr_stats_p->max_value.date)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_TIME: OR_GET_TIME (buf_p, &(attr_stats_p->min_value.time)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_TIME (buf_p, &(attr_stats_p->max_value.time)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_UTIME: OR_GET_UTIME (buf_p, &(attr_stats_p->min_value.utime)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_UTIME (buf_p, &(attr_stats_p->max_value.utime)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_DATETIME: OR_GET_DATETIME (buf_p, &(attr_stats_p->min_value.datetime)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_DATETIME (buf_p, &(attr_stats_p->max_value.datetime)); buf_p += STATS_MIN_MAX_SIZE; break; case DB_TYPE_MONETARY: OR_GET_MONETARY (buf_p, &(attr_stats_p->min_value.money)); buf_p += STATS_MIN_MAX_SIZE; OR_GET_MONETARY (buf_p, &(attr_stats_p->max_value.money)); buf_p += STATS_MIN_MAX_SIZE; break; default: break; } attr_stats_p->n_btstats = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; if (attr_stats_p->n_btstats <= 0) { attr_stats_p->bt_stats = NULL; continue; } attr_stats_p->bt_stats = (BTREE_STATS *) db_ws_alloc (attr_stats_p->n_btstats * sizeof (BTREE_STATS)); if (!attr_stats_p->bt_stats) { stats_free_statistics (class_stats_p); return NULL; } for (j = 0, btree_stats_p = attr_stats_p->bt_stats; j < attr_stats_p->n_btstats; j++, btree_stats_p++) { OR_GET_BTID (buf_p, &btree_stats_p->btid); buf_p += OR_BTID_ALIGNED_SIZE; btree_stats_p->leafs = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->pages = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->height = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->keys = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->oids = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->nulls = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; btree_stats_p->ukeys = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; buf_p = or_unpack_domain (buf_p, &btree_stats_p->key_type, 0); if (btree_stats_p->key_type != NULL && btree_stats_p->key_type->type->id == DB_TYPE_MIDXKEY) { btree_stats_p->key_size = tp_domain_size (btree_stats_p->key_type->setdomain); } else { btree_stats_p->key_size = 1; } btree_stats_p->pkeys = (int *) db_ws_alloc (btree_stats_p->key_size * sizeof (int)); if (!btree_stats_p->pkeys) { stats_free_statistics (class_stats_p); return NULL; } for (k = 0; k < btree_stats_p->key_size; k++) { btree_stats_p->pkeys[k] = OR_GET_INT (buf_p); buf_p += OR_INT_SIZE; } } } return class_stats_p; }