CUBRID Engine  latest
object_print.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * object_print.c - Routines to print dbvalues
21  */
22 
23 #ident "$Id$"
24 
25 #include "object_print.h"
26 
27 #include "authenticate.h"
28 #include "chartype.h"
29 #include "class_description.hpp"
30 #include "dbi.h"
31 #include "dbtype.h"
32 #include "error_manager.h"
33 #include "locator_cl.h"
34 #include "message_catalog.h"
35 #include "msgcat_help.hpp"
36 #include "network_interface_cl.h"
37 #include "object_description.hpp"
38 #include "object_print_util.hpp"
39 #include "object_printer.hpp"
40 #include "printer.hpp"
41 #include "schema_manager.h"
42 #include "string_buffer.hpp"
43 #include "trigger_description.hpp"
44 #include "trigger_manager.h"
45 
46 #if defined (SUPPRESS_STRLEN_WARNING)
47 #define strlen(s1) ((int) strlen(s1))
48 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
49 
50 #define MATCH_TOKEN(string, token) \
51  ((string == NULL) ? 0 : intl_mbs_casecmp(string, token) == 0)
52 
53 static char *obj_print_next_token (char *ptr, char *buf);
54 
55 /* This will be in one of the language directories under $CUBRID/msg */
56 
57 /* TRIGGER SUPPORT FUNCTIONS */
58 
59 /* TRIGGER HELP */
60 
61 /*
62  * help_trigger_names () - Returns an array of strings
63  * return: error code
64  * names_ptr(in):
65  *
66  * Note :
67  * Returns an array of strings. Each string is the name of
68  * a trigger accessible to the current user.
69  * The array must be freed with help_free_names().
70  * Changed to return an error and return the names through an
71  * argument so we can tell the difference between a system error
72  * and the absense of triggers.
73  * Class names should be the same but we always have classes in the
74  * system so it doesn't really matter.
75  */
76 
77 int
78 help_trigger_names (char ***names_ptr)
79 {
80  int error = NO_ERROR;
81  DB_OBJLIST *triggers, *t;
82  char **names;
83  char *name;
84  int count, i;
85  size_t buf_size;
86 
87  names = NULL;
88 
89  /* this should filter the list based on the current user */
90  error = tr_find_all_triggers (&triggers);
91  if (error == NO_ERROR)
92  {
93  count = ws_list_length ((DB_LIST *) triggers);
94  if (count)
95  {
96  buf_size = sizeof (char *) * (count + 1);
97 
98  names = (char **) malloc (buf_size);
99  if (names == NULL)
100  {
101  error = ER_OUT_OF_VIRTUAL_MEMORY;
103  }
104  else
105  {
106  for (i = 0, t = triggers; t != NULL; t = t->next)
107  {
108  if (tr_trigger_name (t->op, &name) == NO_ERROR)
109  {
110  names[i] = object_print::copy_string ((char *) name);
111  i++;
112 
113  ws_free_string (name);
114  }
115  }
116  names[i] = NULL;
117  }
118  }
119  if (triggers != NULL)
120  {
121  db_objlist_free (triggers);
122  }
123  }
124 
125  *names_ptr = names;
126  return error;
127 }
128 
129 /* HELP PRINTING */
130 /* These functions build help structures and print them to a file. */
131 
132 /*
133  * help_print_obj () - Prints the description of a class or instance object
134  * to a generic output.
135  * return: none
136  * fp(in):file pointer
137  * obj(in):class or instance to describe
138  */
139 
140 void
141 help_print_obj (print_output & output_ctx, MOP obj)
142 {
143  int i, status;
144 
145  status = locator_is_class (obj, DB_FETCH_READ);
146 
147  if (status < 0)
148  {
149  return;
150  }
151  else if (status > 0)
152  {
153  if (locator_is_root (obj))
154  {
156  }
157  else
158  {
159  class_description cinfo;
161  {
163  cinfo.class_type, cinfo.name);
164 
165  if (cinfo.supers != NULL)
166  {
168  for (i = 0; cinfo.supers[i] != NULL; i++)
169  {
170  output_ctx (" %s\n", cinfo.supers[i]);
171  }
172  }
173  if (cinfo.subs != NULL)
174  {
176  for (i = 0; cinfo.subs[i] != NULL; i++)
177  {
178  output_ctx (" %s\n", cinfo.subs[i]);
179  }
180  }
181  if (cinfo.attributes != NULL)
182  {
184  for (i = 0; cinfo.attributes[i] != NULL; i++)
185  {
186  output_ctx (" %s\n", cinfo.attributes[i]);
187  }
188  }
189  if (cinfo.methods != NULL)
190  {
192  for (i = 0; cinfo.methods[i] != NULL; i++)
193  {
194  output_ctx (" %s\n", cinfo.methods[i]);
195  }
196  }
197  if (cinfo.class_attributes != NULL)
198  {
200  for (i = 0; cinfo.class_attributes[i] != NULL; i++)
201  {
202  output_ctx (" %s\n", cinfo.class_attributes[i]);
203  }
204  }
205  if (cinfo.class_methods != NULL)
206  {
208  for (i = 0; cinfo.class_methods[i] != NULL; i++)
209  {
210  output_ctx (" %s\n", cinfo.class_methods[i]);
211  }
212  }
213  if (cinfo.resolutions != NULL)
214  {
216  for (i = 0; cinfo.resolutions[i] != NULL; i++)
217  {
218  output_ctx (" %s\n", cinfo.resolutions[i]);
219  }
220  }
221  if (cinfo.method_files != NULL)
222  {
224  for (i = 0; cinfo.method_files[i] != NULL; i++)
225  {
226  output_ctx (" %s\n", cinfo.method_files[i]);
227  }
228  }
229  if (cinfo.query_spec != NULL)
230  {
232  for (i = 0; cinfo.query_spec[i] != NULL; i++)
233  {
234  output_ctx (" %s\n", cinfo.query_spec[i]);
235  }
236  }
237  if (cinfo.triggers.size () > 0) //triggers
238  {
239  /* fprintf(fp, msgcat_message (MSGCAT_CATALOG_CUBRID, MSGCAT_SET_HELP, MSGCAT_HELP_TRIGGERS)); */
240  output_ctx ("Triggers:\n");
241  for (size_t n = cinfo.triggers.size (), i = 0; i < n; ++i)
242  {
243  output_ctx (" %s\n", cinfo.triggers[i]);
244  }
245  }
246  }
247  }
248  }
249  else
250  {
251  (void) tr_is_trigger (obj, &status);
252 
253  if (status)
254  {
255  trigger_description tinfo;
256 
257  if (tinfo.init (obj) == NO_ERROR)
258  {
259  output_ctx ("Trigger : %s", tinfo.name);
260  if (tinfo.status)
261  {
262  output_ctx (" (INACTIVE)\n");
263  }
264  else
265  {
266  output_ctx ("\n");
267  }
268 
269  output_ctx (" %s %s ", tinfo.condition_time, tinfo.event);
270  if (tinfo.class_name != NULL)
271  {
272  if (tinfo.attribute != NULL)
273  {
274  output_ctx ("%s ON %s ", tinfo.attribute, tinfo.class_name);
275  }
276  else
277  {
278  output_ctx ("ON %s ", tinfo.class_name);
279  }
280  }
281 
282  output_ctx ("PRIORITY %s\n", tinfo.priority);
283 
284  if (tinfo.condition)
285  {
286  output_ctx (" IF %s\n", tinfo.condition);
287  }
288 
289  if (tinfo.action != NULL)
290  {
291  output_ctx (" EXECUTE ");
292  if (strcmp (tinfo.condition_time, tinfo.action_time) != 0)
293  {
294  output_ctx ("%s ", tinfo.action_time);
295  }
296  output_ctx ("%s\n", tinfo.action);
297  }
298 
299  if (tinfo.comment != NULL && tinfo.comment[0] != '\0')
300  {
301  output_ctx (" ");
302  help_print_describe_comment (output_ctx, tinfo.comment);
303  output_ctx ("\n");
304  }
305  }
306  }
307  else
308  {
309  object_description oinfo;
310 
311  if (oinfo.init (obj) == NO_ERROR)
312  {
314  oinfo.classname);
315  if (oinfo.attributes != NULL)
316  {
317  for (i = 0; oinfo.attributes[i] != NULL; i++)
318  {
319  output_ctx ("%s\n", oinfo.attributes[i]);
320  }
321  }
322  if (oinfo.shared != NULL)
323  {
324  for (i = 0; oinfo.shared[i] != NULL; i++)
325  {
326  output_ctx ("%s\n", oinfo.shared[i]);
327  }
328  }
329  }
330  }
331  }
332 }
333 
334 /* CLASS LIST HELP */
335 
336 /*
337  * help_class_names () - Returns an array containing the names of
338  * all classes in the system.
339  * return: array of name strings
340  * qualifier(in):
341  *
342  * Note :
343  * The array must be freed with help_free_class_names().
344  */
345 
346 char **
347 help_class_names (const char *qualifier)
348 {
349  DB_OBJLIST *mops, *m;
350  char **names;
351  const char *cname, *tmp;
352  int count, i, outcount;
353  DB_OBJECT *requested_owner, *owner;
354  char buffer[2 * DB_MAX_IDENTIFIER_LENGTH + 4];
355  DB_VALUE owner_name;
356 
357  requested_owner = NULL;
358  owner = NULL;
359  if (qualifier && *qualifier && strcmp (qualifier, "*") != 0)
360  {
361  /* look up class in qualifiers' schema */
362  requested_owner = db_find_user (qualifier);
363  /* if this guy does not exist, it has no classes */
364  if (!requested_owner)
365  {
367  return NULL;
368  }
369  }
370 
371  names = NULL;
373 
374  /* vector fetch as many as possible (void)db_fetch_list(mops, DB_FETCH_READ, 0); */
375 
376  count = ws_list_length ((DB_LIST *) mops);
377  outcount = 0;
378  if (count)
379  {
380  names = (char **) malloc (sizeof (char *) * (count + 1));
381  if (names != NULL)
382  {
383  for (i = 0, m = mops; i < count; i++, m = m->next)
384  {
385  owner = db_get_owner (m->op);
386  if (!requested_owner || ws_is_same_object (requested_owner, owner))
387  {
388  cname = db_get_class_name (m->op);
389  buffer[0] = '\0';
390  if (!requested_owner && db_get (owner, "name", &owner_name) >= 0)
391  {
392  tmp = db_get_string (&owner_name);
393  if (tmp)
394  {
395  snprintf (buffer, sizeof (buffer) - 1, "%s.%s", tmp, cname);
396  }
397  else
398  {
399  snprintf (buffer, sizeof (buffer) - 1, "%s.%s", "unknown_user", cname);
400  }
401  db_value_clear (&owner_name);
402  }
403  else
404  {
405  snprintf (buffer, sizeof (buffer) - 1, "%s", cname);
406  }
407 
408  names[outcount++] = object_print::copy_string (buffer);
409  }
410  }
411  names[outcount] = NULL;
412  }
413  }
414 
415  if (mops != NULL)
416  {
417  db_objlist_free (mops);
418  }
419 
420  return names;
421 }
422 
423 /*
424  * help_free_names () - Frees an array of class names built by
425  * help_class_names() or help_base_class_names().
426  * return: class name array
427  * names(in): class name array
428  */
429 
430 void
431 help_free_names (char **names)
432 {
433  if (names != NULL)
434  {
436  }
437 }
438 
439 /*
440  * backward compatibility, should be using help_free_names() for all
441  * name arrays.
442  */
443 
444 /*
445  * help_free_class_names () -
446  * return: none
447  * names(in):
448  */
449 
450 void
451 help_free_class_names (char **names)
452 {
453  help_free_names (names);
454 }
455 
456 /*
457  * help_fprint_class_names () - Prints the names of all classes
458  * in the system to a file.
459  * return: none
460  * fp(in): file pointer
461  * qualifier(in):
462  */
463 
464 void
465 help_fprint_class_names (FILE * fp, const char *qualifier)
466 {
467  char **names;
468  int i;
469 
470  names = help_class_names (qualifier);
471  if (names != NULL)
472  {
473  for (i = 0; names[i] != NULL; i++)
474  {
475  fprintf (fp, "%s\n", names[i]);
476  }
477  help_free_class_names (names);
478  }
479 }
480 
481 /* MISC HELP FUNCTIONS */
482 
483 /*
484  * help_describe_mop () - This writes a description of the MOP
485  * to the given buffer.
486  * return: number of characters in the description
487  * obj(in): object pointer to describe
488  * buffer(in): buffer to contain the description
489  * maxlen(in): length of the buffer
490  *
491  * Note :
492  * Used to get a printed representation of a MOP.
493  * This should only be used in special cases since OID's aren't
494  * supposed to be visible.
495  */
496 
497 int
498 help_describe_mop (DB_OBJECT * obj, char *buffer, int maxlen)
499 {
500  SM_CLASS *class_;
501  char oidbuffer[64]; /* three integers, better be big enough */
502  int required, total;
503 
504  total = 0;
505  if ((buffer != NULL) && (obj != NULL) && (maxlen > 0))
506  {
507  if (au_fetch_class (obj, &class_, AU_FETCH_READ, AU_SELECT) == NO_ERROR)
508  {
509  sprintf (oidbuffer, "%ld.%ld.%ld", (DB_C_LONG) WS_OID (obj)->volid, (DB_C_LONG) WS_OID (obj)->pageid,
510  (DB_C_LONG) WS_OID (obj)->slotid);
511 
512  required = strlen (oidbuffer) + strlen (sm_ch_name ((MOBJ) class_)) + 2;
513  if (locator_is_class (obj, DB_FETCH_READ) > 0)
514  {
515  required++;
516  if (maxlen >= required)
517  {
518  sprintf (buffer, "*%s:%s", sm_ch_name ((MOBJ) class_), oidbuffer);
519  total = required;
520  }
521  }
522  else if (maxlen >= required)
523  {
524  sprintf (buffer, "%s:%s", sm_ch_name ((MOBJ) class_), oidbuffer);
525  total = required;
526  }
527  }
528  }
529 
530  return total;
531 }
532 
533 /* GENERAL INFO */
534 
535 /*
536  * This is used to dump random information about the database
537  * to the standard output device. The information requested
538  * comes in as a string that is "parsed" to determine the nature
539  * of the request. This is intended primarily as a backdoor
540  * for the "info" method on the root class. This allows us
541  * to get information dumped to stdout from batch CSQL
542  * files which isn't possible currently since session commands
543  * aren't allowed.
544  *
545  * The recognized commands are:
546  *
547  * schema display the names of all classes (;schema)
548  * schema foo display the definition of class foo (;schema foo)
549  * trigger display the names of all triggers (;trigger)
550  * trigger foo display the definition of trigger foo (;trigger foo)
551  * workspace dump the workspace statistics
552  *
553  */
554 
555 /*
556  * Little tokenizing hack for help_display_info.
557  */
558 
559 /*
560  * obj_print_next_token () -
561  * return: char *
562  * ptr(in):
563  * buffer(in):
564  */
565 
566 static char *
567 obj_print_next_token (char *ptr, char *buffer)
568 {
569  char *p;
570 
571  p = ptr;
572  while (char_isspace ((DB_C_INT) (*p)) && *p != '\0')
573  {
574  p++;
575  }
576  while (!char_isspace ((DB_C_INT) (*p)) && *p != '\0')
577  {
578  *buffer = *p;
579  buffer++;
580  p++;
581  }
582  *buffer = '\0';
583 
584  return p;
585 }
586 
587 /*
588  * help_print_info () -
589  * return: none
590  * command(in):
591  * fpp(in):
592  */
593 
594 void
595 help_print_info (const char *command, FILE * fpp)
596 {
597  char buffer[128];
598  char *ptr;
600  char **names;
601  int i;
602 
603  if (command == NULL)
604  {
605  return;
606  }
607 
608  ptr = obj_print_next_token ((char *) command, buffer);
609  if (fpp == NULL)
610  {
611  fpp = stdout;
612  }
613 
614  file_print_output output_ctx (fpp);
615  if (MATCH_TOKEN (buffer, "schema"))
616  {
617  ptr = obj_print_next_token (ptr, buffer);
618  if (!strlen (buffer))
619  {
621  }
622  else
623  {
624  class_mop = db_find_class (buffer);
625  if (class_mop != NULL)
626  {
627  help_print_obj (output_ctx, class_mop);
628  }
629  }
630  }
631  else if (MATCH_TOKEN (buffer, "trigger"))
632  {
633  ptr = obj_print_next_token (ptr, buffer);
634  if (!strlen (buffer))
635  {
636  if (!help_trigger_names (&names))
637  {
638  if (names == NULL)
639  {
640  fprintf (fpp, "No triggers defined.\n");
641  }
642  else
643  {
644  fprintf (fpp, "Triggers: \n");
645  for (i = 0; names[i] != NULL; i++)
646  {
647  fprintf (fpp, " %s\n", names[i]);
648  }
649  help_free_names (names);
650  }
651  }
652  }
653  else
654  {
655  //help_print_trigger (buffer, fpp);
657  if (td.init (buffer) == NO_ERROR)
658  {
659  td.fprint (fpp);
660  }
661  }
662  }
663  else if (MATCH_TOKEN (buffer, "deferred"))
664  {
665  tr_dump (fpp);
666  }
667  else if (MATCH_TOKEN (buffer, "workspace"))
668  {
669  ws_dump (fpp);
670  }
671  else if (MATCH_TOKEN (buffer, "lock"))
672  {
673  lock_dump (fpp);
674  }
675  else if (MATCH_TOKEN (buffer, "stats"))
676  {
677  ptr = obj_print_next_token (ptr, buffer);
678  if (!strlen (buffer))
679  {
680  fprintf (fpp, "Info stats class-name\n");
681  }
682  else
683  {
684  stats_dump (buffer, fpp);
685  }
686  }
687  else if (MATCH_TOKEN (buffer, "logstat"))
688  {
689  log_dump_stat (fpp);
690  }
691  else if (MATCH_TOKEN (buffer, "csstat"))
692  {
693  thread_dump_cs_stat (fpp);
694  }
695  else if (MATCH_TOKEN (buffer, "plan"))
696  {
697  qmgr_dump_query_plans (fpp);
698  }
699  else if (MATCH_TOKEN (buffer, "qcache"))
700  {
701  qmgr_dump_query_cache (fpp);
702  }
703  else if (MATCH_TOKEN (buffer, "trantable"))
704  {
705  logtb_dump_trantable (fpp);
706  }
707 }
708 
709 /*
710  * help_print_describe_comment() - Print description of a comment to a generic output.
711  * return: N/A
712  * output_ctx(in/out) : output context
713  * comment(in) : a comment string to be printed
714  */
715 void
716 help_print_describe_comment (print_output & output_ctx, const char *comment)
717 {
718  /* TODO : optimize printing directly to string_buffer of output_ctx */
719  string_buffer sb;
720  object_printer printer (sb);
721 
722  assert (comment != NULL);
723 
724  printer.describe_comment (comment);
725  output_ctx ("%.*s", int (sb.len ()), sb.get_buffer ());
726 }
DB_OBJECT * db_find_class(const char *name)
Definition: db_info.c:133
int help_trigger_names(char ***names_ptr)
Definition: object_print.c:78
int char_isspace(int c)
Definition: chartype.c:109
long DB_C_LONG
Definition: dbtype_def.h:1151
#define NO_ERROR
Definition: error_code.h:46
char * copy_string(const char *source)
int tr_is_trigger(DB_OBJECT *trigger_object, int *status)
const char * db_get_class_name(DB_OBJECT *class_)
Definition: db_info.c:608
int init(const char *name)
DB_OBJECT * db_get_owner(DB_OBJECT *class_obj)
Definition: db_admin.c:1892
char * MOBJ
Definition: work_space.h:174
#define MSGCAT_HELP_CLASS_METHODS
Definition: msgcat_help.hpp:43
void ws_dump(FILE *fpp)
Definition: work_space.c:3600
#define MSGCAT_HELP_ROOTCLASS_TITLE
Definition: msgcat_help.hpp:36
void qmgr_dump_query_plans(FILE *outfp)
char ** help_class_names(const char *qualifier)
Definition: object_print.c:347
void logtb_dump_trantable(FILE *outfp)
DB_OBJECT * db_find_user(const char *name)
Definition: db_admin.c:1606
void stats_dump(const char *classname, FILE *fp)
int tr_trigger_name(DB_OBJECT *trigger_object, char **name)
int init(struct db_object *op)
#define MSGCAT_HELP_SUB_CLASSES
Definition: msgcat_help.hpp:39
#define MSGCAT_HELP_CLASS_ATTRIBUTES
Definition: msgcat_help.hpp:42
bool ws_is_same_object(MOP mop1, MOP mop2)
Definition: work_space.c:5065
void ws_free_string(const char *str)
Definition: work_space.c:3480
void help_print_obj(print_output &output_ctx, MOP obj)
Definition: object_print.c:141
#define MSGCAT_HELP_METHOD_FILES
Definition: msgcat_help.hpp:45
int init(const char *name)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define MATCH_TOKEN(string, token)
Definition: object_print.c:50
const char * sm_ch_name(const MOBJ clobj)
#define MSGCAT_HELP_QUERY_SPEC
Definition: msgcat_help.hpp:46
#define assert(x)
int help_describe_mop(DB_OBJECT *obj, char *buffer, int maxlen)
Definition: object_print.c:498
int tr_find_all_triggers(DB_OBJLIST **list)
void log_dump_stat(FILE *outfp)
int au_fetch_class(MOP op, SM_CLASS **class_ptr, AU_FETCHMODE fetchmode, DB_AUTH type)
void help_print_info(const char *command, FILE *fpp)
Definition: object_print.c:595
#define ER_OUT_OF_VIRTUAL_MEMORY
Definition: error_code.h:50
void db_objlist_free(DB_OBJLIST *list)
Definition: db_admin.c:2612
#define MSGCAT_SET_HELP
#define DB_MAX_IDENTIFIER_LENGTH
Definition: dbtype_def.h:495
void thread_dump_cs_stat(FILE *outfp)
void tr_dump(FILE *fpp)
#define MSGCAT_HELP_SUPER_CLASSES
Definition: msgcat_help.hpp:38
#define NULL
Definition: freelistheap.h:34
void help_free_names(char **names)
Definition: object_print.c:431
const char * get_buffer() const
void free_strarray(char **strs)
struct db_objlist * next
Definition: dbtype_def.h:442
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
#define MSGCAT_CATALOG_CUBRID
size_t len() const
#define MSGCAT_HELP_RESOLUTIONS
Definition: msgcat_help.hpp:44
struct db_object * op
Definition: dbtype_def.h:443
static void error(const char *msg)
Definition: gencat.c:331
void describe_comment(const char *comment)
#define AU_SELECT
Definition: authenticate.h:69
#define ER_AU_INVALID_USER
Definition: error_code.h:229
#define ARG_FILE_LINE
Definition: error_manager.h:44
#define MSGCAT_HELP_OBJECT_TITLE
Definition: msgcat_help.hpp:47
#define WS_OID(mop)
Definition: work_space.h:293
#define strlen(s1)
Definition: intl_support.c:43
void help_print_describe_comment(print_output &output_ctx, const char *comment)
Definition: object_print.c:716
int db_get(DB_OBJECT *object, const char *attpath, DB_VALUE *value)
Definition: db_obj.c:233
void lock_dump(FILE *outfp)
int i
Definition: dynamic_load.c:954
char * msgcat_message(int cat_id, int set_id, int msg_id)
#define MSGCAT_HELP_METHODS
Definition: msgcat_help.hpp:41
#define MSGCAT_HELP_CLASS_TITLE
Definition: msgcat_help.hpp:37
int ws_list_length(DB_LIST *list)
Definition: work_space.c:3925
int db_value_clear(DB_VALUE *value)
Definition: db_macro.c:1588
struct db_object * class_mop
Definition: object_domain.h:81
int DB_C_INT
Definition: dbtype_def.h:1149
void help_fprint_class_names(FILE *fp, const char *qualifier)
Definition: object_print.c:465
int locator_is_class(MOP mop, DB_FETCH_MODE hint_purpose)
Definition: locator_cl.c:239
std::vector< char * > triggers
bool locator_is_root(MOP mop)
Definition: locator_cl.c:212
#define MSGCAT_HELP_ATTRIBUTES
Definition: msgcat_help.hpp:40
void help_free_class_names(char **names)
Definition: object_print.c:451
DB_OBJLIST * db_fetch_all_classes(DB_FETCH_MODE purpose)
Definition: db_info.c:203
void qmgr_dump_query_cache(FILE *outfp)
static char * obj_print_next_token(char *ptr, char *buf)
Definition: object_print.c:567
const char ** p
Definition: dynamic_load.c:945
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)