37 #include <sys/timeb.h> 72 #define MARK_CLASS_REQUESTED(cl_no) \ 73 (class_requested[cl_no / 8] |= 1 << cl_no % 8) 74 #define MARK_CLASS_REFERENCED(cl_no) \ 75 (class_referenced[cl_no / 8] |= 1 << cl_no % 8) 76 #define MARK_CLASS_PROCESSED(cl_no) \ 77 (class_processed[cl_no / 8] |= 1 << cl_no % 8) 78 #define IS_CLASS_REQUESTED(cl_no) \ 79 (class_requested[cl_no / 8] & 1 << cl_no % 8) 80 #define IS_CLASS_REFERENCED(cl_no) \ 81 (class_referenced[cl_no / 8] & 1 << cl_no % 8) 82 #define IS_CLASS_PROCESSED(cl_no) \ 83 (class_processed[cl_no / 8] & 1 << cl_no % 8) 85 #define GAUGE_INTERVAL 1 160 #define OBJECT_SUFFIX "_objects" 162 #define HEADER_FORMAT "-------------------------------+--------------------------------\n"" %-25s | %23s \n""-------------------------------+--------------------------------\n" 163 #define MSG_FORMAT " %-25s | %10ld (%3d%% / %5d%%)" 199 *est_objects += nobjs;
218 bool check_reference_chain =
false;
231 check_reference_chain =
true;
240 check_reference_chain =
true;
247 #if defined(CUBRID_DEBUG) 248 fprintf (stdout,
"cls_no_ptr is NULL\n");
253 if (class_ptr ==
NULL)
258 if (check_reference_chain)
292 bool found_object_dom;
297 found_object_dom =
false;
299 for (dom = dom_list; dom && !found_object_dom; dom =
db_domain_next (dom))
331 return found_object_dom;
350 if (obj_table !=
NULL)
358 if (cl_table !=
NULL)
392 if (class_ptr ==
NULL)
436 int64_t est_objects = 0;
441 int num_unload_classes = 0;
446 void (*prev_intr_handler) (
int sig);
447 void (*prev_term_handler) (
int sig);
448 #if !defined (WINDOWS) 449 void (*prev_quit_handler) (
int sig);
452 char unloadlog_filename[PATH_MAX];
457 #if !defined(WINDOWS) 467 if (
page_size < (ssize_t) (
sizeof (
OID) +
sizeof (
int)))
477 if (output_dirname ==
NULL)
478 output_dirname =
".";
479 if (
strlen (output_dirname) > PATH_MAX - 8)
498 fprintf (stderr,
"%s: %s.\n\n", exec_name, strerror (errno));
509 if (stat (output_dirname, &stbuf) == -1)
515 #if defined (WINDOWS) 518 blksize = stbuf.st_blksize;
552 unload_class_table[
i] =
NULL;
580 if (cl_table ==
NULL)
592 #if defined(CUBRID_DEBUG) 593 fprintf (stdout,
"----- all class dump -----\n");
609 if (class_ptr ==
NULL)
624 #if defined(CUBRID_DEBUG) 672 for (attribute = class_ptr->shared; attribute !=
NULL;
678 #if defined(CUBRID_DEBUG) 679 fprintf (stdout,
"found OBJECT domain: %s%s%s->%s\n",
689 for (attribute = class_ptr->class_attributes; attribute !=
NULL;
695 #if defined(CUBRID_DEBUG) 696 fprintf (stdout,
"found OBJECT domain: %s%s%s->%s\n",
706 for (attribute = class_ptr->ordered_attributes; attribute; attribute = attribute->
order_link)
715 if (has_obj_ref ==
true)
717 #if defined(CUBRID_DEBUG) 718 fprintf (stdout,
"found OBJECT domain: %s%s%s->%s\n",
726 unload_class_table[num_unload_classes] =
class_table->mops[
i];
727 num_unload_classes++;
744 #if defined(CUBRID_DEBUG) 745 fprintf (stdout,
"has_obj_ref = %d, num_cls_ref = %d\n", has_obj_ref, num_cls_ref);
748 if (has_obj_ref || num_cls_ref > 0)
770 if (class_ptr ==
NULL)
791 if (num_cls_ref != num_set)
793 #if defined(CUBRID_DEBUG) 794 fprintf (stdout,
"num_cls_ref = %d, num_set = %d\n", num_cls_ref, num_set);
802 #if defined(CUBRID_DEBUG) 804 int total_req_cls = 0;
805 int total_ref_cls = 0;
807 fprintf (stdout,
"----- referenced class dump -----\n");
818 if (class_ptr ==
NULL)
827 fprintf (stdout,
"class_table->num = %d, total_req_cls = %d, total_ref_cls = %d\n",
class_table->num, total_req_cls,
862 if (obj_table ==
NULL)
872 snprintf (unloadlog_filename,
sizeof (unloadlog_filename) - 1,
"%s_unloaddb.log", output_prefix);
880 fprintf (stdout,
HEADER_FORMAT,
"Class Name",
"Total Instances");
893 char outfile[PATH_MAX];
896 if (class_ptr ==
NULL)
902 snprintf (outfile, PATH_MAX - 1,
"%s/%s_%s%s", output_dirname, output_prefix,
991 #if !defined (WINDOWS) 1020 #if !defined(WINDOWS) 1045 int nobjects, nfetched;
1050 int requested_class = 0;
1051 int referenced_class = 0;
1052 void (*prev_handler) (
int sig) =
NULL;
1053 unsigned int prev_alarm = 0;
1054 #if defined(WINDOWS) 1055 struct _timeb timebuffer;
1070 requested_class = 1;
1072 referenced_class = 1;
1074 if (!requested_class && !referenced_class)
1084 if (class_ptr ==
NULL)
1089 class_oid =
ws_oid (class_);
1102 (
obj_out,
NULL, 0,
"%cclass %s%s%s shared (%s%s%s",
'%',
1153 (
obj_out,
NULL, 0,
"%cclass %s%s%s class (%s%s%s",
'%',
1195 attribute = class_ptr->ordered_attributes;
1268 #if !defined (WINDOWS) 1276 while (nobjects != nfetched)
1281 if (fetch_area !=
NULL)
1317 #if defined(WINDOWS) 1320 _ftime (&timebuffer);
1323 start = timebuffer.time;
1330 start = timebuffer.time;
1370 #if !defined(WINDOWS) 1409 class_ptr = desc_obj->
class_;
1473 int check_nelem = 0;
1492 if (check_nelem >= 10)
1535 int *cls_no_ptr, cls_no;
1558 classop =
is_class (ref_oid, &ref_class_oid);
1559 if (classop !=
NULL)
1562 if (class_ptr ==
NULL)
1575 if (classop !=
NULL)
1620 error =
fh_get (cl_table, &ref_class_oid, (
FH_DATA *) (&cls_no_ptr));
1627 cls_no = *cls_no_ptr;
1634 error =
fh_get (cl_table, &ref_class_oid, (
FH_DATA *) (&temp));
1649 error =
fh_get (cl_table, &ref_class_oid, (
FH_DATA *) (&temp));
1763 perror (
"SYSTEM ERROR related with hash-file\n==>unloaddb is NOT completed");
1768 perror (
"SYSTEM ERROR related with hash-file\n==>unloaddb is NOT completed");
1844 while (*begin !=
'\0')
1846 if (isspace (*begin))
1869 int i, j, is_partition = 0,
error;
1870 int len_clsname = 0;
1876 char scan_format[16];
1879 if (input_filename ==
NULL)
1884 input_file = fopen (input_filename,
"r");
1885 if (input_file ==
NULL)
1887 perror (input_filename);
1890 snprintf (scan_format,
sizeof (scan_format),
"%%%ds\n", (
int) (
sizeof (buffer) - 1));
1897 trimmed_buf =
ltrim (buffer);
1898 len_clsname = (int)
strlen (trimmed_buf);
1901 if (len_clsname > 0 && trimmed_buf[len_clsname - 1] ==
'\n')
1903 trimmed_buf[len_clsname - 1] = 0;
1907 if (len_clsname >= 1)
1909 sscanf ((
char *) buffer, scan_format, (
char *) class_name);
1916 class_list[
i] = class_;
1918 if (is_partition == 1 && sub_partitions !=
NULL)
1920 for (j = 0; sub_partitions[j]; j++)
1923 class_list[
i] = sub_partitions[j];
1926 if (sub_partitions !=
NULL)
1935 fclose (input_file);
void fh_dump(FH_TABLE *ht)
int get_requested_classes(const char *input_filename, DB_OBJECT *class_list[])
int locator_does_exist(OID *oidp, int chn, LOCK lock, OID *class_oid, int class_chn, int need_fetching, int prefetch, LC_COPYAREA **fetch_copyarea, LC_FETCH_VERSION_TYPE fetch_version_type)
static void update_hash(OID *object_oid, OID *class_oid, int *data)
#define WS_IS_DELETED(mop)
int heap_get_class_num_objects_pages(HFID *hfid, int approximation, int *nobjs, int *npages)
int locator_get_append_lsa(struct log_lsa *lsa)
DB_COLLECTION * db_get_set(const DB_VALUE *value)
static int process_set(DB_SET *set)
int sm_is_system_class(MOP op)
static FILE * unloadlog_file
MOP ws_mop(const OID *oid, MOP class_mop)
FH_TABLE * fh_create(const char *name, int est_size, int page_size, int cached_pages, const char *hash_filename, FH_KEY_TYPE key_type, int data_size, HASH_FUNC hfun, CMP_FUNC cmpfun)
static DB_OBJECT * is_class(OID *obj_oid, OID *class_oid)
static void begin(char *test_name)
MOBJ locator_fetch_set(int num_mops, MOP *mop_set, DB_FETCH_MODE inst_purpose, DB_FETCH_MODE class_purpose, int quit_on_errors)
void locator_free_copy_area(LC_COPYAREA *copyarea)
int text_print(TEXT_OUTPUT *tout, const char *buf, int buflen, char const *fmt,...)
static bool check_referenced_domain(DB_DOMAIN *dom_list, bool set_cls_ref, int *num_cls_refp)
#define LC_START_ONEOBJ_PTR_IN_COPYAREA(manyobjs_ptr)
void set_iterator_free(SET_ITERATOR *it)
static bool mark_referenced_domain(SM_CLASS *class_ptr, int *num_set)
static char * class_processed
DESC_OBJ * make_desc_obj(SM_CLASS *class_)
static char * gauge_class_name
DB_DOMAIN * db_domain_next(const DB_DOMAIN *domain)
int is_req_class(DB_OBJECT *class_)
#define SM_MAX_IDENTIFIER_LENGTH
static void gauge_alarm_handler(int sig)
static int64_t class_objects
SM_DEFAULT_VALUE default_value
static char * output_filename
struct sm_component * next
#define OID_SET_NULL(oidp)
void sm_downcase_name(const char *name, char *buf, int maxlen)
int set_iterator_next(SET_ITERATOR *it)
MOP locator_find_class(const char *classname)
#define ER_TF_BUFFER_UNDERFLOW
const char * db_attribute_name(DB_ATTRIBUTE *attribute)
const char * output_dirname
#define IS_CLASS_REFERENCED(cl_no)
DB_ELO * db_get_elo(const DB_VALUE *value)
static int process_object(DESC_OBJ *desc_obj, OID *obj_oid, int referenced_class)
MOBJ locator_fetch_class(MOP class_mop, DB_FETCH_MODE purpose)
#define LC_RECDES_TO_GET_ONEOBJ(copy_area_ptr, oneobj_ptr, recdes_ptr)
const char * sm_ch_name(const MOBJ clobj)
int desc_disk_to_obj(MOP classop, SM_CLASS *class_, RECDES *record, DESC_OBJ *obj)
#define CHECK_EXIT_ERROR(e)
#define OR_PUT_NULL_OID(ptr)
int au_fetch_class(MOP op, SM_CLASS **class_ptr, AU_FETCHMODE fetchmode, DB_AUTH type)
DB_TYPE db_value_type(const DB_VALUE *value)
SM_ATTRIBUTE * class_attributes
HFID * sm_ch_heap(MOBJ clobj)
#define IS_CLASS_PROCESSED(cl_no)
#define DB_MAX_IDENTIFIER_LENGTH
DB_OBJECT * db_domain_class(const DB_DOMAIN *domain)
int fh_get(FH_TABLE *ht, FH_KEY key, FH_DATA *data)
static int64_t total_objects
DB_OBJECT * db_get_object(const DB_VALUE *value)
#define OID_EQ(oidp1, oidp2)
#define TP_DOMAIN_TYPE(dom)
static const char * prohibited_classes[]
#define LC_NEXT_ONEOBJ_PTR_IN_COPYAREA(oneobj_ptr)
int extract_objects(const char *exec_name, const char *output_dirname, const char *output_prefix)
#define CHECK_PRINT_ERROR(print_fnc)
#define TM_TRAN_READ_FETCH_VERSION()
static int64_t total_approximate_class_objects
unsigned int oid_hash(const void *key_oid, unsigned int htsize)
static int set_referenced_subclasses(DB_OBJECT *class_)
int desc_value_special_fprint(TEXT_OUTPUT *tout, DB_VALUE *value)
FILE * fopen_ex(const char *filename, const char *type)
#define IS_CLASS_REQUESTED(cl_no)
int oid_compare_equals(const void *key_oid1, const void *key_oid2)
static int64_t approximate_class_objects
static int process_value(DB_VALUE *value)
static int failed_objects
static void error(const char *msg)
static void extractobjects_term_handler(int sig)
void fh_destroy(FH_TABLE *ht)
#define HFID_IS_NULL(hfid)
static char * ltrim(char *s)
static int all_classes_processed(void)
int sm_partitioned_class_type(DB_OBJECT *classop, int *partition_type, char *keyattr, MOP **partitions)
OID * db_get_oid(const DB_VALUE *value)
static char * class_referenced
static FH_TABLE * cl_table
#define MARK_CLASS_PROCESSED(cl_no)
#define PRINT_IDENTIFIER(s)
#define free_and_init(ptr)
static void extractobjects_cleanup(void)
#define LC_MANYOBJS_PTR_IN_COPYAREA(copy_areaptr)
static int process_class(int cl_no)
DB_VALUE * set_iterator_value(SET_ITERATOR *it)
int locator_fetch_all(const HFID *hfid, LOCK *lock, LC_FETCH_VERSION_TYPE fetch_version_type, OID *class_oidp, int *nobjects, int *nfetched, OID *last_oidp, LC_COPYAREA **fetch_copyarea)
#define DB_VALUE_TYPE(value)
int locator_flush_all_instances(MOP class_mop, bool decache)
char * msgcat_message(int cat_id, int set_id, int msg_id)
int fh_put(FH_TABLE *ht, FH_KEY key, FH_DATA data)
struct sm_attribute * order_link
#define MARK_CLASS_REFERENCED(cl_no)
void desc_free(DESC_OBJ *obj)
SM_ATTRIBUTE * ordered_attributes
int ws_find(MOP mop, MOBJ *obj)
static char * class_requested
static int get_estimated_objs(HFID *hfid, int64_t *est_objects)
DB_OBJECT ** req_class_table
SIGNAL_HANDLER_FUNCTION os_set_signal_handler(const int sig_no, SIGNAL_HANDLER_FUNCTION sig_handler)
SET_ITERATOR * set_iterate(DB_COLLECTION *set)
static FH_TABLE * obj_table
int text_print_flush(TEXT_OUTPUT *tout)
DB_DOMAIN * db_domain_set(const DB_DOMAIN *domain)
#define MARK_CLASS_REQUESTED(cl_no)
#define MSGCAT_CATALOG_UTILS