File compactdb_common.c¶
File List > cubrid > src > executables > compactdb_common.c
Go to the documentation of this file
/*
* Copyright 2008 Search Solution Corporation
* Copyright 2016 CUBRID Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include "config.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <assert.h>
#include "porting.h"
#include "dbtype.h"
#include "load_object.h"
#include "db.h"
#include "locator_cl.h"
#include "schema_manager.h"
#include "object_accessor.h"
#include "set_object.h"
#include "message_catalog.h"
#include "network_interface_cl.h"
#include "server_interface.h"
#include "system_parameter.h"
#include "utility.h"
#include "authenticate.h"
#include "transaction_cl.h"
#include "execute_schema.h"
#include "object_primitive.h"
int get_class_mops (char **class_names, int num_class, MOP ** class_list, int *num_class_list);
int get_class_mops_from_file (const char *input_filename, MOP ** class_list, int *num_class_mops);
/*
* get_num_requested_class - Get the number of class from specified
* input file
* return: error code
* input_filename(in): input file name
* num_class(out) : pointer to returned number of classes
*/
static int
get_num_requested_class (const char *input_filename, int *num_class)
{
FILE *input_file;
char buffer[LINE_MAX];
if (input_filename == NULL || num_class == NULL)
{
return ER_FAILED;
}
input_file = fopen (input_filename, "r");
if (input_file == NULL)
{
perror (input_filename);
return ER_FAILED;
}
*num_class = 0;
while (fgets ((char *) buffer, LINE_MAX, input_file) != NULL)
{
(*num_class)++;
}
fclose (input_file);
return NO_ERROR;
}
/*
* get_class_mops - Get the list of mops of specified classes
* return: error code
* class_names(in): the names of the classes
* num_class(in): the number of classes
* class_list(out): pointer to returned list of mops
* num_class_list(out): pointer to returned number of mops
*/
int
get_class_mops (char **class_names, int num_class, MOP ** class_list, int *num_class_list)
{
int i;
char downcase_class_name[SM_MAX_IDENTIFIER_LENGTH];
DB_OBJECT *class_ = NULL;
const char *dot = NULL;
int len = 0;
if (class_names == NULL || num_class <= 0 || class_list == NULL || num_class_list == NULL)
{
return ER_FAILED;
}
*num_class_list = 0;
*class_list = (DB_OBJECT **) malloc (DB_SIZEOF (DB_OBJECT *) * (num_class));
if (*class_list == NULL)
{
return ER_FAILED;
}
for (i = 0; i < num_class; ++i)
{
(*class_list)[i] = NULL;
}
for (i = 0; i < num_class; i++)
{
const char *class_name_p = NULL;
const char *class_name_only = NULL;
char owner_name[DB_MAX_USER_LENGTH] = { '\0' };
if (class_names[i] == NULL || (len = STATIC_CAST (int, strlen (class_names[i]))) == 0)
{
goto error;
}
if (utility_check_class_name (class_names[i]) != NO_ERROR)
{
goto error;
}
sm_qualifier_name (class_names[i], owner_name, DB_MAX_USER_LENGTH);
class_name_only = sm_remove_qualifier_name (class_names[i]);
if (strcasecmp (owner_name, "dba") == 0 && sm_check_system_class_by_name (class_name_only))
{
class_name_p = class_name_only;
}
else
{
class_name_p = class_names[i];
}
sm_user_specified_name (class_name_p, downcase_class_name, SM_MAX_IDENTIFIER_LENGTH);
class_ = locator_find_class (downcase_class_name);
if (class_ != NULL)
{
(*class_list)[(*num_class_list)] = class_;
(*num_class_list)++;
}
else
{
printf (msgcat_message (MSGCAT_CATALOG_UTILS, MSGCAT_UTIL_SET_COMPACTDB, COMPACTDB_MSG_CLASS),
downcase_class_name);
printf (msgcat_message (MSGCAT_CATALOG_UTILS, MSGCAT_UTIL_SET_COMPACTDB, COMPACTDB_MSG_INVALID_CLASS));
}
}
return NO_ERROR;
error:
if (*class_list)
{
free (*class_list);
*class_list = NULL;
}
if (num_class_list)
{
*num_class_list = 0;
}
return ER_FAILED;
}
/*
* get_class_mops_from_file - Get a list of class mops from specified file
* return: error code
* input_filename(in): input file name
* class_list(out): pointer to returned list of class mops
* num_class_mops(out): pointer to returned number of mops
*/
int
get_class_mops_from_file (const char *input_filename, MOP ** class_list, int *num_class_mops)
{
int status = NO_ERROR;
int i = 0;
FILE *input_file;
char buffer[LINE_MAX];
char **class_names = NULL;
int num_class = 0;
int len = 0, sub_len = 0;
const char *dot = NULL;
if (input_filename == NULL || class_list == NULL || num_class_mops == NULL)
{
return ER_FAILED;
}
*class_list = NULL;
*num_class_mops = 0;
if (get_num_requested_class (input_filename, &num_class) != NO_ERROR || num_class == 0)
{
return ER_FAILED;
}
input_file = fopen (input_filename, "r");
if (input_file == NULL)
{
perror (input_filename);
return ER_FAILED;
}
class_names = (char **) calloc (num_class, DB_SIZEOF (char *));
if (class_names == NULL)
{
if (input_file != nullptr)
{
fclose (input_file);
}
return ER_FAILED;
}
for (i = 0; i < num_class; ++i)
{
if (fgets ((char *) buffer, LINE_MAX, input_file) == NULL)
{
status = ER_FAILED;
goto end;
}
trim (buffer);
len = STATIC_CAST (int, strlen (buffer));
sub_len = len;
if (len < 1)
{
status = ER_FAILED;
goto end;
}
if (utility_check_class_name (buffer) != NO_ERROR)
{
status = ER_FAILED;
goto end;
}
class_names[i] = (char *) malloc (len + 1);
if (class_names[i] == NULL)
{
status = ER_FAILED;
goto end;
}
memcpy (class_names[i], buffer, len);
class_names[i][len] = 0;
}
status = get_class_mops (class_names, num_class, class_list, num_class_mops);
end:
if (input_file)
{
fclose (input_file);
}
if (class_names)
{
for (i = 0; i < num_class; i++)
{
if (class_names[i])
{
free_and_init (class_names[i]);
}
}
free (class_names);
class_names = NULL;
}
return status;
}