CUBRID Engine  latest
compactdb_common.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 #include "config.h"
21 
22 #include <stdio.h>
23 #include <errno.h>
24 #include <string.h>
25 #include <assert.h>
26 
27 #include "porting.h"
28 #include "dbtype.h"
29 #include "load_object.h"
30 #include "db.h"
31 #include "locator_cl.h"
32 #include "schema_manager.h"
33 #include "object_accessor.h"
34 #include "set_object.h"
35 #include "message_catalog.h"
36 #include "network_interface_cl.h"
37 #include "server_interface.h"
38 #include "system_parameter.h"
39 #include "utility.h"
40 #include "authenticate.h"
41 #include "transaction_cl.h"
42 #include "execute_schema.h"
43 #include "object_primitive.h"
44 
45 int get_class_mops (char **class_names, int num_class, MOP ** class_list, int *num_class_list);
46 int get_class_mops_from_file (const char *input_filename, MOP ** class_list, int *num_class_mops);
47 
48 /*
49  * get_num_requested_class - Get the number of class from specified
50  * input file
51  * return: error code
52  * input_filename(in): input file name
53  * num_class(out) : pointer to returned number of classes
54  */
55 static int
56 get_num_requested_class (const char *input_filename, int *num_class)
57 {
58  FILE *input_file;
59  char buffer[DB_MAX_IDENTIFIER_LENGTH];
60 
61  if (input_filename == NULL || num_class == NULL)
62  {
63  return ER_FAILED;
64  }
65 
66  input_file = fopen (input_filename, "r");
67  if (input_file == NULL)
68  {
69  perror (input_filename);
70  return ER_FAILED;
71  }
72 
73  *num_class = 0;
74  while (fgets ((char *) buffer, DB_MAX_IDENTIFIER_LENGTH, input_file) != NULL)
75  {
76  (*num_class)++;
77  }
78 
79  fclose (input_file);
80 
81  return NO_ERROR;
82 }
83 
84 /*
85  * get_class_mops - Get the list of mops of specified classes
86  * return: error code
87  * class_names(in): the names of the classes
88  * num_class(in): the number of classes
89  * class_list(out): pointer to returned list of mops
90  * num_class_list(out): pointer to returned number of mops
91  */
92 int
93 get_class_mops (char **class_names, int num_class, MOP ** class_list, int *num_class_list)
94 {
95  int i;
96  char downcase_class_name[SM_MAX_IDENTIFIER_LENGTH];
97  DB_OBJECT *class_ = NULL;
98 
99  if (class_names == NULL || num_class <= 0 || class_list == NULL || num_class_list == NULL)
100  {
101  return ER_FAILED;
102  }
103 
104  *num_class_list = 0;
105  *class_list = (DB_OBJECT **) malloc (DB_SIZEOF (DB_OBJECT *) * (num_class));
106  if (*class_list == NULL)
107  {
108  return ER_FAILED;
109  }
110 
111  for (i = 0; i < num_class; ++i)
112  {
113  (*class_list)[i] = NULL;
114  }
115 
116  for (i = 0; i < num_class; i++)
117  {
118  if (class_names[i] == NULL || strlen (class_names[i]) == 0)
119  {
120  goto error;
121  }
122 
123  sm_downcase_name (class_names[i], downcase_class_name, SM_MAX_IDENTIFIER_LENGTH);
124 
125  class_ = locator_find_class (downcase_class_name);
126  if (class_ != NULL)
127  {
128  (*class_list)[(*num_class_list)] = class_;
129  (*num_class_list)++;
130  }
131  else
132  {
134  downcase_class_name);
135 
137  }
138  }
139 
140  return NO_ERROR;
141 
142 error:
143  if (*class_list)
144  {
145  free (*class_list);
146  *class_list = NULL;
147  }
148 
149  if (num_class_list)
150  {
151  *num_class_list = 0;
152  }
153 
154  return ER_FAILED;
155 }
156 
157 /*
158  * get_class_mops_from_file - Get a list of class mops from specified file
159  * return: error code
160  * input_filename(in): input file name
161  * class_list(out): pointer to returned list of class mops
162  * num_class_mops(out): pointer to returned number of mops
163  */
164 int
165 get_class_mops_from_file (const char *input_filename, MOP ** class_list, int *num_class_mops)
166 {
167  int status = NO_ERROR;
168  int i = 0;
169  FILE *input_file;
170  char buffer[DB_MAX_IDENTIFIER_LENGTH];
171  char **class_names = NULL;
172  int num_class = 0;
173  int len = 0;
174  char *ptr = NULL;
175 
176  if (input_filename == NULL || class_list == NULL || num_class_mops == NULL)
177  {
178  return ER_FAILED;
179  }
180 
181  *class_list = NULL;
182  *num_class_mops = 0;
183  if (get_num_requested_class (input_filename, &num_class) != NO_ERROR || num_class == 0)
184  {
185  return ER_FAILED;
186  }
187 
188  input_file = fopen (input_filename, "r");
189  if (input_file == NULL)
190  {
191  perror (input_filename);
192  return ER_FAILED;
193  }
194 
195  class_names = (char **) malloc (DB_SIZEOF (char *) * num_class);
196  if (class_names == NULL)
197  {
198  if (input_file != nullptr)
199  {
200  fclose (input_file);
201  }
202  return ER_FAILED;
203  }
204  for (i = 0; i < num_class; i++)
205  {
206  class_names[i] = NULL;
207  }
208 
209  for (i = 0; i < num_class; ++i)
210  {
211  if (fgets ((char *) buffer, DB_MAX_IDENTIFIER_LENGTH, input_file) == NULL)
212  {
213  status = ER_FAILED;
214  goto end;
215  }
216 
217  ptr = strchr (buffer, '\n');
218  if (ptr)
219  {
220  len = CAST_BUFLEN (ptr - buffer);
221  }
222  else
223  {
224  len = (int) strlen (buffer);
225  }
226 
227  if (len < 1)
228  {
229  status = ER_FAILED;
230  goto end;
231  }
232 
233  class_names[i] = (char *) malloc (DB_SIZEOF (char) * (len + 1));
234  if (class_names[i] == NULL)
235  {
236  status = ER_FAILED;
237  goto end;
238  }
239 
240  strncpy (class_names[i], buffer, len);
241  class_names[i][len] = 0;
242  }
243 
244  status = get_class_mops (class_names, num_class, class_list, num_class_mops);
245 
246 end:
247 
248  if (input_file)
249  {
250  fclose (input_file);
251  }
252 
253  if (class_names)
254  {
255  for (i = 0; i < num_class; i++)
256  {
257  free_and_init (class_names[i]);
258  }
259 
260  free (class_names);
261  class_names = NULL;
262  }
263 
264  return status;
265 }
#define NO_ERROR
Definition: error_code.h:46
#define ER_FAILED
Definition: error_code.h:47
#define SM_MAX_IDENTIFIER_LENGTH
void sm_downcase_name(const char *name, char *buf, int maxlen)
MOP locator_find_class(const char *classname)
Definition: locator_cl.c:3142
int get_class_mops(char **class_names, int num_class, MOP **class_list, int *num_class_list)
#define DB_MAX_IDENTIFIER_LENGTH
Definition: dbtype_def.h:495
#define DB_SIZEOF(val)
Definition: memory_alloc.h:54
#define NULL
Definition: freelistheap.h:34
char * input_filename
Definition: unloaddb.c:47
#define CAST_BUFLEN
Definition: porting.h:471
static void error(const char *msg)
Definition: gencat.c:331
static int get_num_requested_class(const char *input_filename, int *num_class)
#define free_and_init(ptr)
Definition: memory_alloc.h:147
#define strlen(s1)
Definition: intl_support.c:43
int i
Definition: dynamic_load.c:954
char * msgcat_message(int cat_id, int set_id, int msg_id)
int get_class_mops_from_file(const char *input_filename, MOP **class_list, int *num_class_mops)
#define MSGCAT_CATALOG_UTILS