Skip to content

File util_admin.c

File List > cubrid > src > executables > util_admin.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.
 *
 */

/*
 * util_admin.c - a front end of admin utilities
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cubrid_getopt.h"
#include "utility.h"
#include "error_code.h"
#include "util_support.h"
#include "file_io.h"
#include "log_lsa.hpp"

static UTIL_ARG_MAP ua_Create_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {CREATE_PAGES_S, {ARG_INTEGER}, {(void *) -1}},
  {CREATE_COMMENT_S, {ARG_STRING}, {0}},
  {CREATE_FILE_PATH_S, {ARG_STRING}, {0}},
  {CREATE_LOG_PATH_S, {ARG_STRING}, {0}},
  {CREATE_LOB_PATH_S, {ARG_STRING}, {0}},
  {CREATE_SERVER_NAME_S, {ARG_STRING}, {0}},
  {CREATE_REPLACE_S, {ARG_BOOLEAN}, {0}},
  {CREATE_MORE_VOLUME_FILE_S, {ARG_STRING}, {0}},
  {CREATE_USER_DEFINITION_FILE_S, {ARG_STRING}, {0}},
  {CREATE_CSQL_INITIALIZATION_FILE_S, {ARG_STRING}, {0}},
  {CREATE_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {CREATE_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {CREATE_LOG_PAGE_COUNT_S, {ARG_INTEGER}, {(void *) -1}},
  {CREATE_PAGE_SIZE_S, {ARG_INTEGER}, {(void *) -1}},
  {CREATE_DB_PAGE_SIZE_S, {ARG_STRING}, {0}},
  {CREATE_LOG_PAGE_SIZE_S, {ARG_STRING}, {0}},
  {CREATE_DB_VOLUME_SIZE_S, {ARG_STRING}, {0}},
  {CREATE_LOG_VOLUME_SIZE_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Create_Option[] = {
  {CREATE_PAGES_L, 1, 0, CREATE_PAGES_S},
  {CREATE_COMMENT_L, 1, 0, CREATE_COMMENT_S},
  {CREATE_FILE_PATH_L, 1, 0, CREATE_FILE_PATH_S},
  {CREATE_LOG_PATH_L, 1, 0, CREATE_LOG_PATH_S},
  {CREATE_LOB_PATH_L, 1, 0, CREATE_LOB_PATH_S},
  {CREATE_SERVER_NAME_L, 1, 0, CREATE_SERVER_NAME_S},
  {CREATE_REPLACE_L, 0, 0, CREATE_REPLACE_S},
  {CREATE_MORE_VOLUME_FILE_L, 1, 0, CREATE_MORE_VOLUME_FILE_S},
  {CREATE_USER_DEFINITION_FILE_L, 1, 0, CREATE_USER_DEFINITION_FILE_S},
  {CREATE_CSQL_INITIALIZATION_FILE_L, 1, 0,
   CREATE_CSQL_INITIALIZATION_FILE_S},
  {CREATE_OUTPUT_FILE_L, 1, 0, CREATE_OUTPUT_FILE_S},
  {CREATE_VERBOSE_L, 0, 0, CREATE_VERBOSE_S},
  {CREATE_CHARSET_L, 1, 0, CREATE_CHARSET_S},
  {CREATE_LOG_PAGE_COUNT_L, 1, 0, CREATE_LOG_PAGE_COUNT_S},
  {CREATE_PAGE_SIZE_L, 1, 0, CREATE_PAGE_SIZE_S},
  {CREATE_DB_PAGE_SIZE_L, 1, 0, CREATE_DB_PAGE_SIZE_S},
  {CREATE_DB_VOLUME_SIZE_L, 1, 0, CREATE_DB_VOLUME_SIZE_S},
  {CREATE_LOG_PAGE_SIZE_L, 1, 0, CREATE_LOG_PAGE_SIZE_S},
  {CREATE_LOG_VOLUME_SIZE_L, 1, 0, CREATE_LOG_VOLUME_SIZE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Rename_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {RENAME_EXTENTED_VOLUME_PATH_S, {ARG_STRING}, {0}},
  {RENAME_CONTROL_FILE_S, {ARG_STRING}, {0}},
  {RENAME_DELETE_BACKUP_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Rename_Option[] = {
  {RENAME_EXTENTED_VOLUME_PATH_L, 1, 0, RENAME_EXTENTED_VOLUME_PATH_S},
  {RENAME_CONTROL_FILE_L, 1, 0, RENAME_CONTROL_FILE_S},
  {RENAME_DELETE_BACKUP_L, 0, 0, RENAME_DELETE_BACKUP_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Copy_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {COPY_SERVER_NAME_S, {ARG_STRING}, {0}},
  {COPY_FILE_PATH_S, {ARG_STRING}, {0}},
  {COPY_LOG_PATH_S, {ARG_STRING}, {0}},
  {COPY_EXTENTED_VOLUME_PATH_S, {ARG_STRING}, {0}},
  {COPY_CONTROL_FILE_S, {ARG_STRING}, {0}},
  {COPY_REPLACE_S, {ARG_BOOLEAN}, {0}},
  {COPY_DELETE_SOURCE_S, {ARG_BOOLEAN}, {0}},
  {COPY_LOB_PATH_S, {ARG_STRING}, {0}},
  {COPY_COPY_LOB_PATH_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Copy_Option[] = {
  {COPY_SERVER_NAME_L, 1, 0, COPY_SERVER_NAME_S},
  {COPY_FILE_PATH_L, 1, 0, COPY_FILE_PATH_S},
  {COPY_LOG_PATH_L, 1, 0, COPY_LOG_PATH_S},
  {COPY_EXTENTED_VOLUME_PATH_L, 1, 0, COPY_EXTENTED_VOLUME_PATH_S},
  {COPY_CONTROL_FILE_L, 1, 0, COPY_CONTROL_FILE_S},
  {COPY_REPLACE_L, 0, 0, COPY_REPLACE_S},
  {COPY_DELETE_SOURCE_L, 0, 0, COPY_DELETE_SOURCE_S},
  {COPY_LOB_PATH_L, 1, 0, COPY_LOB_PATH_S},
  {COPY_COPY_LOB_PATH_L, 0, 0, COPY_COPY_LOB_PATH_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Delete_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {DELETE_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {DELETE_DELETE_BACKUP_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Delete_Option[] = {
  {DELETE_OUTPUT_FILE_L, 1, 0, DELETE_OUTPUT_FILE_S},
  {DELETE_DELETE_BACKUP_L, 0, 0, DELETE_DELETE_BACKUP_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Backup_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {BACKUP_DESTINATION_PATH_S, {ARG_STRING}, {0}},
  {BACKUP_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {BACKUP_REMOVE_ARCHIVE_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_LEVEL_S, {ARG_INTEGER}, {(void *) FILEIO_BACKUP_FULL_LEVEL}},
  {BACKUP_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_NO_CHECK_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_THREAD_COUNT_S, {ARG_INTEGER}, {FILEIO_BACKUP_NUM_THREADS_AUTO}},
  {BACKUP_COMPRESS_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_NO_COMPRESS_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_EXCEPT_ACTIVE_LOG_S, {ARG_BOOLEAN}, {0}},
  {BACKUP_SLEEP_MSECS_S, {ARG_INTEGER}, {FILEIO_BACKUP_SLEEP_MSECS_AUTO}},
  {BACKUP_SEPARATE_KEYS_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Backup_Option[] = {
  {BACKUP_DESTINATION_PATH_L, 1, 0, BACKUP_DESTINATION_PATH_S},
  {BACKUP_REMOVE_ARCHIVE_L, 0, 0, BACKUP_REMOVE_ARCHIVE_S},
  {BACKUP_LEVEL_L, 1, 0, BACKUP_LEVEL_S},
  {BACKUP_OUTPUT_FILE_L, 1, 0, BACKUP_OUTPUT_FILE_S},
  {BACKUP_SA_MODE_L, 0, 0, BACKUP_SA_MODE_S},
  {BACKUP_CS_MODE_L, 0, 0, BACKUP_CS_MODE_S},
  {BACKUP_NO_CHECK_L, 0, 0, BACKUP_NO_CHECK_S},
  {BACKUP_THREAD_COUNT_L, 1, 0, BACKUP_THREAD_COUNT_S},
  {BACKUP_COMPRESS_L, 0, 0, BACKUP_COMPRESS_S},
  {BACKUP_NO_COMPRESS_L, 0, 0, BACKUP_NO_COMPRESS_S},
  {BACKUP_EXCEPT_ACTIVE_LOG_L, 0, 0, BACKUP_EXCEPT_ACTIVE_LOG_S},
  {BACKUP_SLEEP_MSECS_L, 1, 0, BACKUP_SLEEP_MSECS_S},
  {BACKUP_SEPARATE_KEYS_L, 0, 0, BACKUP_SEPARATE_KEYS_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Restore_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {RESTORE_UP_TO_DATE_S, {ARG_STRING}, {0}},
  {RESTORE_LIST_S, {ARG_BOOLEAN}, {0}},
  {RESTORE_BACKUP_FILE_PATH_S, {ARG_STRING}, {0}},
  {RESTORE_LEVEL_S, {ARG_INTEGER}, {0}},
  {RESTORE_PARTIAL_RECOVERY_S, {ARG_BOOLEAN}, {0}},
  {RESTORE_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {RESTORE_USE_DATABASE_LOCATION_PATH_S, {ARG_BOOLEAN}, {0}},
  {RESTORE_KEYS_FILE_PATH_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Restore_Option[] = {
  {RESTORE_UP_TO_DATE_L, 1, 0, RESTORE_UP_TO_DATE_S},
  {RESTORE_LIST_L, 0, 0, RESTORE_LIST_S},
  {RESTORE_BACKUP_FILE_PATH_L, 1, 0, RESTORE_BACKUP_FILE_PATH_S},
  {RESTORE_LEVEL_L, 1, 0, RESTORE_LEVEL_S},
  {RESTORE_PARTIAL_RECOVERY_L, 0, 0, RESTORE_PARTIAL_RECOVERY_S},
  {RESTORE_OUTPUT_FILE_L, 1, 0, RESTORE_OUTPUT_FILE_S},
  {RESTORE_USE_DATABASE_LOCATION_PATH_L, 0, 0,
   RESTORE_USE_DATABASE_LOCATION_PATH_S},
  {RESTORE_KEYS_FILE_PATH_L, 1, 0, RESTORE_KEYS_FILE_PATH_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Addvol_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {ADDVOL_VOLUME_NAME_S, {ARG_STRING}, {0}},
  {ADDVOL_VOLUME_SIZE_S, {ARG_STRING}, {0}},
  {ADDVOL_FILE_PATH_S, {ARG_STRING}, {0}},
  {ADDVOL_COMMENT_S, {ARG_STRING}, {0}},
  {ADDVOL_PURPOSE_S, {ARG_STRING}, {0}},
  {ADDVOL_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {ADDVOL_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {ADDVOL_MAX_WRITESIZE_IN_SEC_S, {ARG_STRING}, {0}},
  {ADDVOL_VOLTYPE_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Addvol_Option[] = {
  {ADDVOL_VOLUME_NAME_L, 1, 0, ADDVOL_VOLUME_NAME_S},
  {ADDVOL_VOLUME_SIZE_L, 1, 0, ADDVOL_VOLUME_SIZE_S},
  {ADDVOL_FILE_PATH_L, 1, 0, ADDVOL_FILE_PATH_S},
  {ADDVOL_COMMENT_L, 1, 0, ADDVOL_COMMENT_S},
  {ADDVOL_PURPOSE_L, 1, 0, ADDVOL_PURPOSE_S},
  {ADDVOL_SA_MODE_L, 0, 0, ADDVOL_SA_MODE_S},
  {ADDVOL_CS_MODE_L, 0, 0, ADDVOL_CS_MODE_S},
  {ADDVOL_MAX_WRITESIZE_IN_SEC_L, 1, 0, ADDVOL_MAX_WRITESIZE_IN_SEC_S},
  {ADDVOL_VOLTYPE_L, 1, 0, ADDVOL_VOLTYPE_S},
  {0, 0, 0, 0}
};

#if 0
static UTIL_ARG_MAP ua_Delvol_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {DELVOL_VOLUME_ID_S, {ARG_STRING}, {0}},
  {DELVOL_CLEAR_CACHE_S, {ARG_BOOLEAN}, {0}},
  {DELVOL_FORCE_S, {ARG_BOOLEAN}, {0}},
  {DELVOL_DBA_PASSWORD_S, {ARG_STRING}, {0}},
  {DELVOL_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {DELVOL_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Delvol_Option[] = {
  {DELVOL_VOLUME_ID_L, 1, 0, DELVOL_VOLUME_ID_S},
  {DELVOL_CLEAR_CACHE_L, 0, 0, DELVOL_CLEAR_CACHE_S},
  {DELVOL_FORCE_L, 0, 0, DELVOL_FORCE_S},
  {DELVOL_DBA_PASSWORD_L, 1, 0, DELVOL_DBA_PASSWORD_S},
  {DELVOL_SA_MODE_L, 0, 0, DELVOL_SA_MODE_S},
  {DELVOL_CS_MODE_L, 0, 0, DELVOL_CS_MODE_S},
  {0, 0, 0, 0}
};
#endif

static UTIL_ARG_MAP ua_Space_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {SPACE_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {SPACE_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {SPACE_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {SPACE_SIZE_UNIT_S, {ARG_STRING}, {(void *) "h"}},
  {SPACE_SUMMARIZE_S, {ARG_BOOLEAN}, {0}},
  {SPACE_PURPOSE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Space_Option[] = {
  {SPACE_OUTPUT_FILE_L, 1, 0, SPACE_OUTPUT_FILE_S},
  {SPACE_SA_MODE_L, 0, 0, SPACE_SA_MODE_S},
  {SPACE_CS_MODE_L, 0, 0, SPACE_CS_MODE_S},
  {SPACE_SIZE_UNIT_L, 1, 0, SPACE_SIZE_UNIT_S},
  {SPACE_SUMMARIZE_L, 0, 0, SPACE_SUMMARIZE_S},
  {SPACE_PURPOSE_L, 0, 0, SPACE_PURPOSE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Lock_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {LOCK_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {LOCK_DISPLAY_CONTENTION_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Lock_Option[] = {
  {LOCK_OUTPUT_FILE_L, 1, 0, LOCK_OUTPUT_FILE_S},
  {LOCK_DISPLAY_CONTENTION_L, 0, 0, LOCK_DISPLAY_CONTENTION_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Acl_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {ACLDB_RELOAD_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Acl_Option[] = {
  {ACLDB_RELOAD_L, 0, 0, ACLDB_RELOAD_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Optimize_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {OPTIMIZE_CLASS_NAME_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Optimize_Option[] = {
  {OPTIMIZE_CLASS_NAME_L, 1, 0, OPTIMIZE_CLASS_NAME_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Install_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {INSTALL_SERVER_NAME_S, {ARG_STRING}, {0}},
  {INSTALL_FILE_PATH_S, {ARG_STRING}, {0}},
  {INSTALL_LOG_PATH_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Install_Option[] = {
  {INSTALL_SERVER_NAME_L, 1, 0, INSTALL_SERVER_NAME_S},
  {INSTALL_FILE_PATH_L, 1, 0, INSTALL_FILE_PATH_S},
  {INSTALL_LOG_PATH_L, 1, 0, INSTALL_LOG_PATH_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Diag_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {DIAG_DUMP_TYPE_S, {ARG_INTEGER}, {(void *) -1}},
  {DIAG_DUMP_RECORDS_S, {ARG_BOOLEAN}, {0}},
  {DIAG_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {DIAG_EMERGENCY_S, {ARG_BOOLEAN}, {0}},
  {DIAG_CLASS_NAME_S, {ARG_STRING}, {0}},
  {DIAG_INPUT_FILE_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Diag_Option[] = {
  {DIAG_DUMP_TYPE_L, 1, 0, DIAG_DUMP_TYPE_S},
  {DIAG_DUMP_RECORDS_L, 0, 0, DIAG_DUMP_RECORDS_S},
  {DIAG_OUTPUT_FILE_L, 1, 0, DIAG_OUTPUT_FILE_S},
  {DIAG_EMERGENCY_L, 0, 0, DIAG_EMERGENCY_S},
  {DIAG_CLASS_NAME_L, 1, 0, DIAG_CLASS_NAME_S},
  {DIAG_INPUT_FILE_L, 1, 0, DIAG_INPUT_FILE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Filemgr_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {CLEANFILEDB_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {CLEANFILEDB_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {CLEANFILEDB_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {CLEANFILEDB_DUMP_FILE_LIST_S, {ARG_BOOLEAN}, {0}},
  {CLEANFILEDB_CLEAN_INVALID_FILE_S, {ARG_BOOLEAN}, {0}},
#if !defined(NDEBUG)
  {CLEANFILEDB_DELETE_TARGET_FILE_S, {ARG_STRING}, {0}},
#endif
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Filemgr_Option[] = {
  {CLEANFILEDB_SA_MODE_L, 0, 0, CLEANFILEDB_SA_MODE_S},
  {CLEANFILEDB_CS_MODE_L, 0, 0, CLEANFILEDB_CS_MODE_S},
  {CLEANFILEDB_OUTPUT_FILE_L, 1, 0, CLEANFILEDB_OUTPUT_FILE_S},
  {CLEANFILEDB_DUMP_FILE_LIST_L, 0, 0, CLEANFILEDB_DUMP_FILE_LIST_S},
  {CLEANFILEDB_CLEAN_INVALID_FILE_L, 0, 0, CLEANFILEDB_CLEAN_INVALID_FILE_S},
#if !defined(NDEBUG)
  {CLEANFILEDB_DELETE_TARGET_FILE_L, 1, 0, CLEANFILEDB_DELETE_TARGET_FILE_S},
#endif
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Patch_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {PATCH_RECREATE_LOG_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Patch_Option[] = {
  {PATCH_RECREATE_LOG_L, 0, 0, PATCH_RECREATE_LOG_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Check_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {CHECK_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {CHECK_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {CHECK_INDEXNAME_S, {ARG_STRING}, {0}},
  {CHECK_REPAIR_S, {ARG_BOOLEAN}, {0}},
  {CHECK_INPUT_FILE_S, {ARG_STRING}, {0}},
  {CHECK_CHECK_PREV_LINK_S, {ARG_BOOLEAN}, {0}},
  {CHECK_REPAIR_PREV_LINK_S, {ARG_BOOLEAN}, {0}},
  {CHECK_FILE_TRACKER_S, {ARG_BOOLEAN}, {0}},
  {CHECK_HEAP_ALLHEAPS_S, {ARG_BOOLEAN}, {0}},
  {CHECK_CAT_CONSISTENCY_S, {ARG_BOOLEAN}, {0}},
  {CHECK_BTREE_ALL_BTREES_S, {ARG_BOOLEAN}, {0}},
  {CHECK_LC_CLASSNAMES_S, {ARG_BOOLEAN}, {0}},
  {CHECK_LC_ALLENTRIES_OF_ALLBTREES_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Check_Option[] = {
  {CHECK_SA_MODE_L, 0, 0, CHECK_SA_MODE_S},
  {CHECK_CS_MODE_L, 0, 0, CHECK_CS_MODE_S},
  {CHECK_INDEXNAME_L, 1, 0, CHECK_INDEXNAME_S},
  {CHECK_REPAIR_L, 0, 0, CHECK_REPAIR_S},
  {CHECK_INPUT_FILE_L, 1, 0, CHECK_INPUT_FILE_S},
  {CHECK_CHECK_PREV_LINK_L, 0, 0, CHECK_CHECK_PREV_LINK_S},
  {CHECK_REPAIR_PREV_LINK_L, 0, 0, CHECK_REPAIR_PREV_LINK_S},
  {CHECK_FILE_TRACKER_L, 0, 0, CHECK_FILE_TRACKER_S},
  {CHECK_HEAP_ALLHEAPS_L, 0, 0, CHECK_HEAP_ALLHEAPS_S},
  {CHECK_CAT_CONSISTENCY_L, 0, 0, CHECK_CAT_CONSISTENCY_S},
  {CHECK_BTREE_ALL_BTREES_L, 0, 0, CHECK_BTREE_ALL_BTREES_S},
  {CHECK_LC_CLASSNAMES_L, 0, 0, CHECK_LC_CLASSNAMES_S},
  {CHECK_LC_ALLENTRIES_OF_ALLBTREES_L, 0, 0,
   CHECK_LC_ALLENTRIES_OF_ALLBTREES_S},
  {0, 0, 0, 0}
};

/* alterdbhost option list */
#define ALTERDBHOST_HOST_S                'h'

static UTIL_ARG_MAP ua_Alterdbhost_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {ALTERDBHOST_HOST_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Alterdbhost_Option[] = {
  {ALTERDBHOST_HOST_L, 1, 0, ALTERDBHOST_HOST_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Plandump_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {PLANDUMP_DROP_S, {ARG_BOOLEAN}, {0}},
  {PLANDUMP_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {PLANDUMP_SHA1_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Plandump_Option[] = {
  {PLANDUMP_DROP_L, 0, 0, PLANDUMP_DROP_S},
  {PLANDUMP_OUTPUT_FILE_L, 1, 0, PLANDUMP_OUTPUT_FILE_S},
  {PLANDUMP_SHA1_L, 1, 0, PLANDUMP_SHA1_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Killtran_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {KILLTRAN_KILL_TRANSACTION_INDEX_S, {ARG_STRING}, {0}},
  {KILLTRAN_KILL_USER_NAME_S, {ARG_STRING}, {(void *) ""}},
  {KILLTRAN_KILL_HOST_NAME_S, {ARG_STRING}, {(void *) ""}},
  {KILLTRAN_KILL_PROGRAM_NAME_S, {ARG_STRING}, {(void *) ""}},
  {KILLTRAN_KILL_SQL_ID_S, {ARG_STRING}, {0}},
  {KILLTRAN_DBA_PASSWORD_S, {ARG_STRING}, {0}},
  {KILLTRAN_DISPLAY_INFORMATION_S, {ARG_BOOLEAN}, {0}},
  {KILLTRAN_DISPLAY_QUERY_INFO_S, {ARG_BOOLEAN}, {0}},
  {KILLTRAN_FORCE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Killtran_Option[] = {
  {KILLTRAN_KILL_TRANSACTION_INDEX_L, 1, 0,
   KILLTRAN_KILL_TRANSACTION_INDEX_S},
  {KILLTRAN_KILL_USER_NAME_L, 1, 0, KILLTRAN_KILL_USER_NAME_S},
  {KILLTRAN_KILL_HOST_NAME_L, 1, 0, KILLTRAN_KILL_HOST_NAME_S},
  {KILLTRAN_KILL_PROGRAM_NAME_L, 1, 0, KILLTRAN_KILL_PROGRAM_NAME_S},
  {KILLTRAN_KILL_SQL_ID_L, 1, 0, KILLTRAN_KILL_SQL_ID_S},
  {KILLTRAN_DBA_PASSWORD_L, 1, 0, KILLTRAN_DBA_PASSWORD_S},
  {KILLTRAN_DISPLAY_INFORMATION_L, 0, 0, KILLTRAN_DISPLAY_INFORMATION_S},
  {KILLTRAN_DISPLAY_QUERY_INFO_L, 0, 0, KILLTRAN_DISPLAY_QUERY_INFO_S},
  {KILLTRAN_FORCE_L, 0, 0, KILLTRAN_FORCE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Tranlist_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
#if defined(NEED_PRIVILEGE_PASSWORD)
  {TRANLIST_USER_S, {ARG_STRING}, {0}},
  {TRANLIST_PASSWORD_S, {ARG_STRING}, {0}},
#endif
  {TRANLIST_SUMMARY_S, {ARG_BOOLEAN}, {0}},
  {TRANLIST_SORT_KEY_S, {ARG_INTEGER}, {0}},
  {TRANLIST_REVERSE_S, {ARG_BOOLEAN}, {0}},
  {TRANLIST_FULL_SQL_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Tranlist_Option[] = {
#if defined(NEED_PRIVILEGE_PASSWORD)
  {TRANLIST_USER_L, 1, 0, TRANLIST_USER_S},
  {TRANLIST_PASSWORD_L, 1, 0, TRANLIST_PASSWORD_S},
#endif
  {TRANLIST_SUMMARY_L, 0, 0, TRANLIST_SUMMARY_S},
  {TRANLIST_SORT_KEY_L, 1, 0, TRANLIST_SORT_KEY_S},
  {TRANLIST_REVERSE_L, 0, 0, TRANLIST_REVERSE_S},
  {TRANLIST_FULL_SQL_L, 0, 0, TRANLIST_FULL_SQL_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Load_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {LOAD_USER_S, {ARG_STRING}, {0}},
  {LOAD_PASSWORD_S, {ARG_STRING}, {0}},
  {LOAD_CHECK_ONLY_S, {ARG_BOOLEAN}, {0}},
  {LOAD_LOAD_ONLY_S, {ARG_BOOLEAN}, {0}},
  {LOAD_ESTIMATED_SIZE_S, {ARG_INTEGER}, {0}},
  {LOAD_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {LOAD_NO_STATISTICS_S, {ARG_BOOLEAN}, {0}},
  {LOAD_PERIODIC_COMMIT_S, {ARG_INTEGER}, {0}},
  {LOAD_NO_OID_S, {ARG_BOOLEAN}, {0}},
  {LOAD_SCHEMA_FILE_S, {ARG_STRING}, {0}},
  {LOAD_INDEX_FILE_S, {ARG_STRING}, {0}},
  {LOAD_TRIGGER_FILE_S, {ARG_STRING}, {0}},
  {LOAD_IGNORE_LOGGING_S, {ARG_BOOLEAN}, {0}},
  {LOAD_DATA_FILE_S, {ARG_STRING}, {0}},
  {LOAD_ERROR_CONTROL_FILE_S, {ARG_STRING}, {0}},
  {LOAD_IGNORE_CLASS_S, {ARG_STRING}, {0}},
  {LOAD_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {LOAD_SA_MODE_S, {ARG_BOOLEAN}, {(void *) 1}},
  {LOAD_TABLE_NAME_S, {ARG_STRING}, {0}},
  {LOAD_COMPARE_STORAGE_ORDER_S, {ARG_BOOLEAN}, {0}},
  {LOAD_NO_USER_SPECIFIED_NAME_S, {ARG_BOOLEAN}, {0}},
  {LOAD_SCHEMA_FILE_LIST_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Load_Option[] = {
  {LOAD_USER_L, 1, 0, LOAD_USER_S},
  {LOAD_PASSWORD_L, 1, 0, LOAD_PASSWORD_S},
  {LOAD_CHECK_ONLY_L, 0, 0, LOAD_CHECK_ONLY_S},
  {LOAD_LOAD_ONLY_L, 0, 0, LOAD_LOAD_ONLY_S},
  {LOAD_ESTIMATED_SIZE_L, 1, 0, LOAD_ESTIMATED_SIZE_S},
  {LOAD_VERBOSE_L, 0, 0, LOAD_VERBOSE_S},
  {LOAD_NO_STATISTICS_L, 0, 0, LOAD_NO_STATISTICS_S},
  {LOAD_PERIODIC_COMMIT_L, 1, 0, LOAD_PERIODIC_COMMIT_S},
  {LOAD_NO_OID_L, 0, 0, LOAD_NO_OID_S},
  {LOAD_SCHEMA_FILE_L, 1, 0, LOAD_SCHEMA_FILE_S},
  {LOAD_INDEX_FILE_L, 1, 0, LOAD_INDEX_FILE_S},
  {LOAD_TRIGGER_FILE_L, 1, 0, LOAD_TRIGGER_FILE_S},
  {LOAD_IGNORE_LOGGING_L, 0, 0, LOAD_IGNORE_LOGGING_S},
  {LOAD_DATA_FILE_L, 1, 0, LOAD_DATA_FILE_S},
  {LOAD_ERROR_CONTROL_FILE_L, 1, 0, LOAD_ERROR_CONTROL_FILE_S},
  {LOAD_IGNORE_CLASS_L, 1, 0, LOAD_IGNORE_CLASS_S},
  {LOAD_CS_MODE_L, 0, 0, LOAD_CS_MODE_S},
  {LOAD_SA_MODE_L, 0, 0, LOAD_SA_MODE_S},
  {LOAD_TABLE_NAME_L, 1, 0, LOAD_TABLE_NAME_S},
  {LOAD_COMPARE_STORAGE_ORDER_L, 0, 0, LOAD_COMPARE_STORAGE_ORDER_S},
  {LOAD_NO_USER_SPECIFIED_NAME_L, 0, 0, LOAD_NO_USER_SPECIFIED_NAME_S},
  {LOAD_SCHEMA_FILE_LIST_L, 1, 0, LOAD_SCHEMA_FILE_LIST_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Unload_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {UNLOAD_INPUT_CLASS_FILE_S, {ARG_STRING}, {0}},
  {UNLOAD_INCLUDE_REFERENCE_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_INPUT_CLASS_ONLY_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_LO_COUNT_S, {ARG_INTEGER}, {0}},
  {UNLOAD_ESTIMATED_SIZE_S, {ARG_INTEGER}, {0}},
  {UNLOAD_CACHED_PAGES_S, {ARG_INTEGER}, {(void *) 100}},
  {UNLOAD_OUTPUT_PATH_S, {ARG_STRING}, {0}},
  {UNLOAD_SCHEMA_ONLY_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_DATA_ONLY_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_LATEST_IMAGE_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_OUTPUT_PREFIX_S, {ARG_STRING}, {0}},
  {UNLOAD_HASH_FILE_S, {ARG_STRING}, {0}},
  {UNLOAD_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_USE_DELIMITER_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_DATAFILE_PER_CLASS_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_USER_S, {ARG_STRING}, {0}},
  {UNLOAD_PASSWORD_S, {ARG_STRING}, {0}},
  {UNLOAD_KEEP_STORAGE_ORDER_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_SPLIT_SCHEMA_FILES_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_AS_DBA_S, {ARG_BOOLEAN}, {0}},
  {UNLOAD_SKIP_INDEX_DETAIL_S, {ARG_BOOLEAN}, {0}}, /* support for SUPPORT_DEDUPLICATE_KEY_MODE */
  {UNLOAD_THREAD_COUNT_S, {ARG_INTEGER}, {(void *) 1}},
  {UNLOAD_STRING_BUFFER_SIZE_S, {ARG_INTEGER}, {(void *) 1024}},
  {UNLOAD_REQUEST_PAGES_S, {ARG_INTEGER}, {(void *) 100}},
  {UNLOAD_MT_PROCESS_S, {ARG_STRING}, {0}},
  {UNLOAD_SAMPLING_TEST_S, {ARG_INTEGER}, {(void *) (-1)}},
  {UNLOAD_ENHANCED_ESTIMATES_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Unload_Option[] = {
  {UNLOAD_INPUT_CLASS_FILE_L, 1, 0, UNLOAD_INPUT_CLASS_FILE_S},
  {UNLOAD_INCLUDE_REFERENCE_L, 0, 0, UNLOAD_INCLUDE_REFERENCE_S},
  {UNLOAD_INPUT_CLASS_ONLY_L, 0, 0, UNLOAD_INPUT_CLASS_ONLY_S},
  {UNLOAD_LO_COUNT_L, 1, 0, UNLOAD_LO_COUNT_S},
  {UNLOAD_ESTIMATED_SIZE_L, 1, 0, UNLOAD_ESTIMATED_SIZE_S},
  {UNLOAD_CACHED_PAGES_L, 1, 0, UNLOAD_CACHED_PAGES_S},
  {UNLOAD_OUTPUT_PATH_L, 1, 0, UNLOAD_OUTPUT_PATH_S},
  {UNLOAD_SCHEMA_ONLY_L, 0, 0, UNLOAD_SCHEMA_ONLY_S},
  {UNLOAD_DATA_ONLY_L, 0, 0, UNLOAD_DATA_ONLY_S},
  {UNLOAD_LATEST_IMAGE_L, 0, 0, UNLOAD_LATEST_IMAGE_S},
  {UNLOAD_OUTPUT_PREFIX_L, 1, 0, UNLOAD_OUTPUT_PREFIX_S},
  {UNLOAD_HASH_FILE_L, 1, 0, UNLOAD_HASH_FILE_S},
  {UNLOAD_VERBOSE_L, 0, 0, UNLOAD_VERBOSE_S},
  {UNLOAD_USE_DELIMITER_L, 0, 0, UNLOAD_USE_DELIMITER_S},
  {UNLOAD_DATAFILE_PER_CLASS_L, 0, 0, UNLOAD_DATAFILE_PER_CLASS_S},
  {UNLOAD_SA_MODE_L, 0, 0, UNLOAD_SA_MODE_S},
  {UNLOAD_CS_MODE_L, 0, 0, UNLOAD_CS_MODE_S},
  {UNLOAD_USER_L, 1, 0, LOAD_USER_S},
  {UNLOAD_PASSWORD_L, 1, 0, LOAD_PASSWORD_S},
  {UNLOAD_KEEP_STORAGE_ORDER_L, 0, 0, UNLOAD_KEEP_STORAGE_ORDER_S},
  {UNLOAD_SPLIT_SCHEMA_FILES_L, 0, 0, UNLOAD_SPLIT_SCHEMA_FILES_S},
  {UNLOAD_AS_DBA_L, 0, 0, UNLOAD_AS_DBA_S},
  {UNLOAD_SKIP_INDEX_DETAIL_L, 0, 0, UNLOAD_SKIP_INDEX_DETAIL_S},   /* support for SUPPORT_DEDUPLICATE_KEY_MODE */
  {UNLOAD_THREAD_COUNT_L, 1, 0, UNLOAD_THREAD_COUNT_S},
  {UNLOAD_STRING_BUFFER_SIZE_L, 1, 0, UNLOAD_STRING_BUFFER_SIZE_S},
  {UNLOAD_REQUEST_PAGES_L, 1, 0, UNLOAD_REQUEST_PAGES_S},
  {UNLOAD_MT_PROCESS_L, 1, 0, UNLOAD_MT_PROCESS_S},
  {UNLOAD_SAMPLING_TEST_L, 1, 0, UNLOAD_SAMPLING_TEST_S},
  {UNLOAD_ENHANCED_ESTIMATES_L, 0, 0, UNLOAD_ENHANCED_ESTIMATES_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Compact_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {COMPACT_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {COMPACT_INPUT_CLASS_FILE_S, {ARG_STRING}, {0}},
  {COMPACT_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {COMPACT_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {COMPACT_PAGES_COMMITED_ONCE_S, {ARG_INTEGER}, {(void *) 10}},
  {COMPACT_DELETE_OLD_REPR_S, {ARG_BOOLEAN}, {0}},
  {COMPACT_INSTANCE_LOCK_TIMEOUT_S, {ARG_INTEGER}, {(void *) 2}},
  {COMPACT_CLASS_LOCK_TIMEOUT_S, {ARG_INTEGER}, {(void *) 10}},
  {COMPACT_STANDBY_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Compact_Option[] = {
  {COMPACT_VERBOSE_L, 0, 0, COMPACT_VERBOSE_S},
  {COMPACT_INPUT_CLASS_FILE_L, 1, 0, COMPACT_INPUT_CLASS_FILE_S},
  {COMPACT_SA_MODE_L, 0, 0, COMPACT_SA_MODE_S},
  {COMPACT_CS_MODE_L, 0, 0, COMPACT_CS_MODE_S},
  {COMPACT_PAGES_COMMITED_ONCE_L, 1, 0, COMPACT_PAGES_COMMITED_ONCE_S},
  {COMPACT_DELETE_OLD_REPR_L, 0, 0, COMPACT_DELETE_OLD_REPR_S},
  {COMPACT_INSTANCE_LOCK_TIMEOUT_L, 1, 0, COMPACT_INSTANCE_LOCK_TIMEOUT_S},
  {COMPACT_CLASS_LOCK_TIMEOUT_L, 1, 0, COMPACT_CLASS_LOCK_TIMEOUT_S},
  {COMPACT_STANDBY_CS_MODE_L, 0, 0, COMPACT_STANDBY_CS_MODE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Paramdump_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {PARAMDUMP_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {PARAMDUMP_BOTH_S, {ARG_BOOLEAN}, {0}},
  {PARAMDUMP_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {PARAMDUMP_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {PARAMDUMP_HA_ONLY_S, {ARG_BOOLEAN}, {0}},
  {PARAMDUMP_EXCLUDE_HA_S, {ARG_BOOLEAN}, {0}},
  {PARAMDUMP_DUMP_FLAG_S, {ARG_STRING}, {0}},
  {PARAMDUMP_FOR_CM_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Paramdump_Option[] = {
  {PARAMDUMP_OUTPUT_FILE_L, 1, 0, PARAMDUMP_OUTPUT_FILE_S},
  {PARAMDUMP_BOTH_L, 0, 0, PARAMDUMP_BOTH_S},
  {PARAMDUMP_SA_MODE_L, 0, 0, PARAMDUMP_SA_MODE_S},
  {PARAMDUMP_CS_MODE_L, 0, 0, PARAMDUMP_CS_MODE_S},
  {PARAMDUMP_HA_ONLY_L, 0, 0, PARAMDUMP_HA_ONLY_S},
  {PARAMDUMP_EXCLUDE_HA_L, 0, 0, PARAMDUMP_EXCLUDE_HA_S},
  {PARAMDUMP_DUMP_FLAG_L, 1, 0, PARAMDUMP_DUMP_FLAG_S},
  {PARAMDUMP_FOR_CM_L, 0, 0, PARAMDUMP_FOR_CM_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Statdump_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {STATDUMP_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {STATDUMP_INTERVAL_S, {ARG_INTEGER}, {0}},
  {STATDUMP_CUMULATIVE_S, {ARG_BOOLEAN}, {0}},
  {STATDUMP_SUBSTR_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Statdump_Option[] = {
  {STATDUMP_OUTPUT_FILE_L, 1, 0, STATDUMP_OUTPUT_FILE_S},
  {STATDUMP_INTERVAL_L, 1, 0, STATDUMP_INTERVAL_S},
  {STATDUMP_CUMULATIVE_L, 0, 0, STATDUMP_CUMULATIVE_S},
  {STATDUMP_SUBSTR_L, 1, 0, STATDUMP_SUBSTR_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Changemode_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {CHANGEMODE_MODE_S, {ARG_STRING}, {0}},
  {CHANGEMODE_FORCE_S, {ARG_BOOLEAN}, {0}},
  {CHANGEMODE_TIMEOUT_S, {ARG_INTEGER}, {(void *) -1}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Changemode_Option[] = {
  {CHANGEMODE_MODE_L, 1, 0, CHANGEMODE_MODE_S},
  {CHANGEMODE_FORCE_L, 0, 0, CHANGEMODE_FORCE_S},
  {CHANGEMODE_TIMEOUT_L, 1, 0, CHANGEMODE_TIMEOUT_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Copylog_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {COPYLOG_LOG_PATH_S, {ARG_STRING}, {0}},
  {COPYLOG_MODE_S, {ARG_STRING}, {0}},
  {COPYLOG_START_PAGEID_S, {ARG_BIGINT}, {(void *) (-2L)}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Copylog_Option[] = {
  {COPYLOG_LOG_PATH_L, 1, 0, COPYLOG_LOG_PATH_S},
  {COPYLOG_MODE_L, 1, 0, COPYLOG_MODE_S},
  {COPYLOG_START_PAGEID_L, 1, 0, COPYLOG_START_PAGEID_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Applylog_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {APPLYLOG_LOG_PATH_S, {ARG_STRING}, {0}},
  {APPLYLOG_MAX_MEM_SIZE_S, {ARG_INTEGER}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Applylog_Option[] = {
  {APPLYLOG_LOG_PATH_L, 1, 0, APPLYLOG_LOG_PATH_S},
  {APPLYLOG_MAX_MEM_SIZE_L, 1, 0, APPLYLOG_MAX_MEM_SIZE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_ApplyInfo_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {APPLYINFO_COPIED_LOG_PATH_S, {ARG_STRING}, {0}},
  {APPLYINFO_PAGE_S, {ARG_BIGINT}, {(void *) NULL_LOG_PAGEID}},
  {APPLYINFO_REMOTE_NAME_S, {ARG_STRING}, {0}},
  {APPLYINFO_APPLIED_INFO_S, {ARG_BOOLEAN}, {0}},
  {APPLYINFO_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {APPLYINFO_INTERVAL_S, {ARG_INTEGER}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_ApplyInfo_Option[] = {
  {APPLYINFO_COPIED_LOG_PATH_L, 1, 0, APPLYINFO_COPIED_LOG_PATH_S},
  {APPLYINFO_PAGE_L, 1, 0, APPLYINFO_PAGE_S},
  {APPLYINFO_REMOTE_NAME_L, 1, 0, APPLYINFO_REMOTE_NAME_S},
  {APPLYINFO_APPLIED_INFO_L, 0, 0, APPLYINFO_APPLIED_INFO_S},
  {APPLYINFO_VERBOSE_L, 0, 0, APPLYINFO_VERBOSE_S},
  {APPLYINFO_INTERVAL_L, 1, 0, APPLYINFO_INTERVAL_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_GenLocale_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {GENLOCALE_INPUT_PATH_S, {ARG_STRING}, {0}},
  {GENLOCALE_VERBOSE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_GenLocale_Option[] = {
  {GENLOCALE_INPUT_PATH_L, 1, 0, GENLOCALE_INPUT_PATH_S},
  {GENLOCALE_VERBOSE_L, 0, 0, APPLYINFO_VERBOSE_S},
  {0, 0, 0, 0}
};


static UTIL_ARG_MAP ua_DumpLocale_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {DUMPLOCALE_INPUT_PATH_S, {ARG_STRING}, {0}},
  {DUMPLOCALE_CALENDAR_S, {ARG_BOOLEAN}, {0}},
  {DUMPLOCALE_NUMBERING_S, {ARG_BOOLEAN}, {0}},
  {DUMPLOCALE_ALPHABET_S, {ARG_STRING}, {0}},
  {DUMPLOCALE_IDENTIFIER_ALPHABET_S, {ARG_STRING}, {0}},
  {DUMPLOCALE_COLLATION_S, {ARG_BOOLEAN}, {0}},
  {DUMPLOCALE_WEIGHT_ORDER_S, {ARG_BOOLEAN}, {0}},
  {DUMPLOCALE_START_VALUE_S, {ARG_INTEGER}, {0}},
  {DUMPLOCALE_END_VALUE_S, {ARG_INTEGER}, {0}},
  {DUMPLOCALE_NORMALIZATION_S, {ARG_BOOLEAN}, {0}},
  {DUMPLOCALE_CONSOLE_CONV_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_DumpLocale_Option[] = {
  {DUMPLOCALE_INPUT_PATH_L, 1, 0, DUMPLOCALE_INPUT_PATH_S},
  {DUMPLOCALE_CALENDAR_L, 0, 0, DUMPLOCALE_CALENDAR_S},
  {DUMPLOCALE_NUMBERING_L, 0, 0, DUMPLOCALE_NUMBERING_S},
  {DUMPLOCALE_ALPHABET_L, 1, 0, DUMPLOCALE_ALPHABET_S},
  {DUMPLOCALE_IDENTIFIER_ALPHABET_L, 1, 0, DUMPLOCALE_IDENTIFIER_ALPHABET_S},
  {DUMPLOCALE_COLLATION_L, 0, 0, DUMPLOCALE_COLLATION_S},
  {DUMPLOCALE_WEIGHT_ORDER_L, 0, 0, DUMPLOCALE_WEIGHT_ORDER_S},
  {DUMPLOCALE_START_VALUE_L, 1, 0, DUMPLOCALE_START_VALUE_S},
  {DUMPLOCALE_END_VALUE_L, 1, 0, DUMPLOCALE_END_VALUE_S},
  {DUMPLOCALE_NORMALIZATION_L, 0, 0, DUMPLOCALE_NORMALIZATION_S},
  {DUMPLOCALE_CONSOLE_CONV_L, 0, 0, DUMPLOCALE_CONSOLE_CONV_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_SyncCollDB_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {SYNCCOLL_CHECK_S, {ARG_BOOLEAN}, {0}},
  {SYNCCOLL_FORCESYNC_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_SyncCollDB_Option[] = {
  {SYNCCOLL_CHECK_L, 0, 0, SYNCCOLL_CHECK_S},
  {SYNCCOLL_FORCESYNC_L, 0, 0, SYNCCOLL_FORCESYNC_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_GenTz_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {GEN_TZ_INPUT_FOLDER_S, {ARG_STRING}, {0}},
  {GEN_TZ_MODE_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_GenTz_Option[] = {
  {GEN_TZ_INPUT_FOLDER_L, 1, 0, GEN_TZ_INPUT_FOLDER_S},
  {GEN_TZ_MODE_L, 1, 0, GEN_TZ_MODE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_DumpTz_Map[] = {
  {DUMP_TZ_COUNTRIES_S, {ARG_BOOLEAN}, {0}},
  {DUMP_TZ_ZONES_S, {ARG_BOOLEAN}, {0}},
  {DUMP_TZ_ZONE_ID_S, {ARG_STRING}, {0}},
  {DUMP_TZ_LEAP_SEC_S, {ARG_BOOLEAN}, {0}},
  {DUMP_TZ_DUMP_SUM_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_DumpTz_Option[] = {
  {DUMP_TZ_COUNTRIES_L, 0, 0, DUMP_TZ_COUNTRIES_S},
  {DUMP_TZ_ZONES_L, 0, 0, DUMP_TZ_ZONES_S},
  {DUMP_TZ_ZONE_ID_L, 1, 0, DUMP_TZ_ZONE_ID_S},
  {DUMP_TZ_LEAP_SEC_L, 0, 0, DUMP_TZ_LEAP_SEC_S},
  {DUMP_TZ_DUMP_SUM_L, 0, 0, DUMP_TZ_DUMP_SUM_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_RestoreSlave_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {RESTORESLAVE_SOURCE_STATE_S, {ARG_STRING}, {0}},
  {RESTORESLAVE_MASTER_HOST_NAME_S, {ARG_STRING}, {0}},
  {RESTORESLAVE_LIST_S, {ARG_BOOLEAN}, {0}},
  {RESTORESLAVE_BACKUP_FILE_PATH_S, {ARG_STRING}, {0}},
  {RESTORESLAVE_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {RESTORESLAVE_USE_DATABASE_LOCATION_PATH_S, {ARG_BOOLEAN}, {0}},
  {RESTORESLAVE_KEYS_FILE_PATH_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_RestoreSlave_Option[] = {
  {RESTORESLAVE_SOURCE_STATE_L, 1, 0, RESTORESLAVE_SOURCE_STATE_S},
  {RESTORESLAVE_MASTER_HOST_NAME_L, 1, 0, RESTORESLAVE_MASTER_HOST_NAME_S},
  {RESTORESLAVE_LIST_L, 0, 0, RESTORESLAVE_LIST_S},
  {RESTORESLAVE_BACKUP_FILE_PATH_L, 1, 0, RESTORESLAVE_BACKUP_FILE_PATH_S},
  {RESTORESLAVE_OUTPUT_FILE_L, 1, 0, RESTORESLAVE_OUTPUT_FILE_S},
  {RESTORESLAVE_USE_DATABASE_LOCATION_PATH_L, 0, 0,
   RESTORESLAVE_USE_DATABASE_LOCATION_PATH_S},
  {RESTORESLAVE_KEYS_FILE_PATH_L, 1, 0, RESTORESLAVE_KEYS_FILE_PATH_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Vacuum_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {VACUUM_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {VACUUM_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {VACUUM_DUMP_S, {ARG_BOOLEAN}, {0}},
  {VACUUM_OUTPUT_FILE_S, {ARG_STRING}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Vacuum_Option[] = {
  {VACUUM_SA_MODE_L, 0, 0, VACUUM_SA_MODE_S},
  {VACUUM_CS_MODE_L, 0, 0, VACUUM_CS_MODE_S},
  {VACUUM_DUMP_L, 0, 0, VACUUM_DUMP_S},
  {VACUUM_OUTPUT_FILE_L, 1, 0, VACUUM_OUTPUT_FILE_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Checksum_Option_Map[] = {
  {OPTION_STRING_TABLE, {ARG_INTEGER}, {0}},
  {CHECKSUM_CHUNK_SIZE_S, {ARG_INTEGER}, {(void *) 500}},
  {CHECKSUM_RESUME_S, {ARG_BOOLEAN}, {0}},
  {CHECKSUM_SLEEP_S, {ARG_INTEGER}, {(void *) 100}},
  {CHECKSUM_CONT_ON_ERROR_S, {ARG_BOOLEAN}, {0}},
  {CHECKSUM_INCLUDE_CLASS_FILE_S, {ARG_STRING}, {0}},
  {CHECKSUM_EXCLUDE_CLASS_FILE_S, {ARG_STRING}, {0}},
  {CHECKSUM_TIMEOUT_S, {ARG_INTEGER}, {(void *) 1000}},
  {CHECKSUM_TABLE_NAME_S, {ARG_STRING}, {0}},
  {CHECKSUM_REPORT_ONLY_S, {ARG_BOOLEAN}, {0}},
  {CHECKSUM_SCHEMA_ONLY_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Checksum_Option[] = {
  {CHECKSUM_CHUNK_SIZE_L, 1, 0, CHECKSUM_CHUNK_SIZE_S},
  {CHECKSUM_RESUME_L, 0, 0, CHECKSUM_RESUME_S},
  {CHECKSUM_SLEEP_L, 1, 0, CHECKSUM_SLEEP_S},
  {CHECKSUM_CONT_ON_ERROR_L, 0, 0, CHECKSUM_CONT_ON_ERROR_S},
  {CHECKSUM_INCLUDE_CLASS_FILE_L, 1, 0, CHECKSUM_INCLUDE_CLASS_FILE_S},
  {CHECKSUM_EXCLUDE_CLASS_FILE_L, 1, 0, CHECKSUM_EXCLUDE_CLASS_FILE_S},
  {CHECKSUM_TIMEOUT_L, 1, 0, CHECKSUM_TIMEOUT_S},
  {CHECKSUM_TABLE_NAME_L, 1, 0, CHECKSUM_TABLE_NAME_S},
  {CHECKSUM_REPORT_ONLY_L, 0, 0, CHECKSUM_REPORT_ONLY_S},
  {CHECKSUM_SCHEMA_ONLY_L, 0, 0, CHECKSUM_SCHEMA_ONLY_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Tde_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {TDE_GENERATE_KEY_S, {ARG_BOOLEAN}, {0}},
  {TDE_SHOW_KEYS_S, {ARG_BOOLEAN}, {0}},
  {TDE_PRINT_KEY_VALUE_S, {ARG_BOOLEAN}, {0}},
  {TDE_SA_MODE_S, {ARG_BOOLEAN}, {0}},
  {TDE_CS_MODE_S, {ARG_BOOLEAN}, {0}},
  {TDE_CHANGE_KEY_S, {ARG_INTEGER}, {(void *) -1}},
  {TDE_DELETE_KEY_S, {ARG_INTEGER}, {(void *) -1}},
  {TDE_DBA_PASSWORD_S, {ARG_STRING}, {(void *) ""}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Tde_Option[] = {
  {TDE_GENERATE_KEY_L, 0, 0, TDE_GENERATE_KEY_S},
  {TDE_SHOW_KEYS_L, 0, 0, TDE_SHOW_KEYS_S},
  {TDE_PRINT_KEY_VALUE_L, 0, 0, TDE_PRINT_KEY_VALUE_S},
  {TDE_SA_MODE_L, 0, 0, TDE_SA_MODE_S},
  {TDE_CS_MODE_L, 0, 0, TDE_CS_MODE_S},
  {TDE_CHANGE_KEY_L, 1, 0, TDE_CHANGE_KEY_S},
  {TDE_DELETE_KEY_L, 1, 0, TDE_DELETE_KEY_S},
  {TDE_DBA_PASSWORD_L, 1, 0, TDE_DBA_PASSWORD_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Flashback_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {FLASHBACK_OUTPUT_S, {ARG_STRING}, {0}},
  {FLASHBACK_USER_S, {ARG_STRING}, {(void *) ""}},
  {FLASHBACK_DBA_PASSWORD_S, {ARG_STRING}, {(void *) ""}},
  {FLASHBACK_START_DATE_S, {ARG_STRING}, {0}},
  {FLASHBACK_END_DATE_S, {ARG_STRING}, {0}},
  {FLASHBACK_DETAIL_S, {ARG_BOOLEAN}, {0}},
  {FLASHBACK_OLDEST_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Flashback_Option[] = {
  {FLASHBACK_OUTPUT_L, 1, 0, FLASHBACK_OUTPUT_S},
  {FLASHBACK_USER_L, 1, 0, FLASHBACK_USER_S},
  {FLASHBACK_DBA_PASSWORD_L, 1, 0, FLASHBACK_DBA_PASSWORD_S},
  {FLASHBACK_START_DATE_L, 1, 0, FLASHBACK_START_DATE_S},
  {FLASHBACK_END_DATE_L, 1, 0, FLASHBACK_END_DATE_S},
  {FLASHBACK_DETAIL_L, 0, 0, FLASHBACK_DETAIL_S},
  {FLASHBACK_OLDEST_L, 0, 0, FLASHBACK_OLDEST_S},
  {0, 0, 0, 0}
};

static UTIL_ARG_MAP ua_Memmon_Option_Map[] = {
  {OPTION_STRING_TABLE, {0}, {0}},
  {MEMMON_OUTPUT_S, {ARG_STRING}, {0}},
  {MEMMON_DISABLE_FORCE_S, {ARG_BOOLEAN}, {0}},
  {0, {0}, {0}}
};

static GETOPT_LONG ua_Memmon_Option[] = {
  {MEMMON_OUTPUT_L, 1, 0, MEMMON_OUTPUT_S},
  {MEMMON_DISABLE_FORCE_L, 0, 0, MEMMON_DISABLE_FORCE_S},
  {0, 0, 0, 0}
};

static UTIL_MAP ua_Utility_Map[] = {
  {CREATEDB, SA_ONLY, 2, UTIL_OPTION_CREATEDB, "createdb", ua_Create_Option, ua_Create_Option_Map},
  {RENAMEDB, SA_ONLY, 2, UTIL_OPTION_RENAMEDB, "renamedb", ua_Rename_Option, ua_Rename_Option_Map},
  {COPYDB, SA_ONLY, 2, UTIL_OPTION_COPYDB, "copydb", ua_Copy_Option, ua_Copy_Option_Map},
  {DELETEDB, SA_ONLY, 1, UTIL_OPTION_DELETEDB, "deletedb", ua_Delete_Option, ua_Delete_Option_Map},
  {BACKUPDB, SA_CS, 1, UTIL_OPTION_BACKUPDB, "backupdb", ua_Backup_Option, ua_Backup_Option_Map},
  {RESTOREDB, SA_ONLY, 1, UTIL_OPTION_RESTOREDB, "restoredb", ua_Restore_Option, ua_Restore_Option_Map},
  {ADDVOLDB, SA_CS, 2, UTIL_OPTION_ADDVOLDB, "addvoldb", ua_Addvol_Option, ua_Addvol_Option_Map},
  {SPACEDB, SA_CS, 1, UTIL_OPTION_SPACEDB, "spacedb", ua_Space_Option, ua_Space_Option_Map},
  {LOCKDB, CS_ONLY, 1, UTIL_OPTION_LOCKDB, "lockdb", ua_Lock_Option, ua_Lock_Option_Map},
  {KILLTRAN, CS_ONLY, 1, UTIL_OPTION_KILLTRAN, "killtran", ua_Killtran_Option, ua_Killtran_Option_Map},
  {OPTIMIZEDB, SA_ONLY, 1, UTIL_OPTION_OPTIMIZEDB, "optimizedb", ua_Optimize_Option, ua_Optimize_Option_Map},
  {INSTALLDB, SA_ONLY, 1, UTIL_OPTION_INSTALLDB, "installdb", ua_Install_Option, ua_Install_Option_Map},
  {DIAGDB, SA_ONLY, 1, UTIL_OPTION_DIAGDB, "diagdb", ua_Diag_Option, ua_Diag_Option_Map},
  {CLEANFILEDB, SA_CS, 1, UTIL_OPTION_CLEANFILEDB, "cleanfiledb", ua_Filemgr_Option, ua_Filemgr_Option_Map},
  {PATCHDB, SA_ONLY, 2, UTIL_OPTION_PATCHDB, "patchdb", ua_Patch_Option, ua_Patch_Option_Map},
  {CHECKDB, SA_CS, 1, UTIL_OPTION_CHECKDB, "checkdb", ua_Check_Option, ua_Check_Option_Map},
  {ALTERDBHOST, SA_ONLY, 1, UTIL_OPTION_ALTERDBHOST, "alterdbhost", ua_Alterdbhost_Option, ua_Alterdbhost_Option_Map},
  {PLANDUMP, CS_ONLY, 1, UTIL_OPTION_PLANDUMP, "plandump", ua_Plandump_Option, ua_Plandump_Option_Map},
  {ESTIMATE_DATA, SA_ONLY, 2, UTIL_OPTION_ESTIMATE_DATA, "estimatedb_data", 0, 0},
  {ESTIMATE_INDEX, SA_ONLY, 2, UTIL_OPTION_ESTIMATE_INDEX, "edtimatedb_index", 0, 0},
  {LOADDB, SA_CS, 1, UTIL_OPTION_LOADDB, "loaddb_user", ua_Load_Option, ua_Load_Option_Map},
  {UNLOADDB, SA_CS, 1, UTIL_OPTION_UNLOADDB, "unloaddb", ua_Unload_Option, ua_Unload_Option_Map},
  {COMPACTDB, SA_CS, 1, UTIL_OPTION_COMPACTDB, "compactdb", ua_Compact_Option, ua_Compact_Option_Map},
  {PARAMDUMP, SA_CS, 1, UTIL_OPTION_PARAMDUMP, "paramdump", ua_Paramdump_Option, ua_Paramdump_Option_Map},
  {STATDUMP, CS_ONLY, 1, UTIL_OPTION_STATDUMP, "statdump", ua_Statdump_Option, ua_Statdump_Option_Map},
  {CHANGEMODE, CS_ONLY, 1, UTIL_OPTION_CHANGEMODE, "changemode", ua_Changemode_Option, ua_Changemode_Option_Map},
  {COPYLOGDB, CS_ONLY, 1, UTIL_OPTION_COPYLOGDB, "copylogdb", ua_Copylog_Option, ua_Copylog_Option_Map},
  {APPLYLOGDB, CS_ONLY, 1, UTIL_OPTION_APPLYLOGDB, "applylogdb", ua_Applylog_Option, ua_Applylog_Option_Map},
  {APPLYINFO, CS_ONLY, 1, UTIL_OPTION_APPLYINFO, "applyinfo", ua_ApplyInfo_Option, ua_ApplyInfo_Option_Map},
  {ACLDB, CS_ONLY, 1, UTIL_OPTION_ACLDB, "acldb", ua_Acl_Option, ua_Acl_Option_Map},
  {GENLOCALE, SA_ONLY, 1, UTIL_OPTION_GENERATE_LOCALE, "genlocale", ua_GenLocale_Option, ua_GenLocale_Map},
  {DUMPLOCALE, SA_ONLY, 1, UTIL_OPTION_DUMP_LOCALE, "dumplocale", ua_DumpLocale_Option, ua_DumpLocale_Map},
  {SYNCCOLLDB, SA_ONLY, 1, UTIL_OPTION_SYNCCOLLDB, "synccolldb", ua_SyncCollDB_Option, ua_SyncCollDB_Map},
  {TRANLIST, CS_ONLY, 1, UTIL_OPTION_TRANLIST, "tranlist", ua_Tranlist_Option, ua_Tranlist_Option_Map},
  {GEN_TZ, SA_ONLY, 1, UTIL_OPTION_GEN_TZ, "gen_tz", ua_GenTz_Option, ua_GenTz_Map},
  {DUMP_TZ, SA_ONLY, 1, UTIL_OPTION_DUMP_TZ, "dump_tz", ua_DumpTz_Option, ua_DumpTz_Map},
  {RESTORESLAVE, SA_ONLY, 1, UTIL_OPTION_RESTORESLAVE, "restoreslave", ua_RestoreSlave_Option,
   ua_RestoreSlave_Option_Map},
  {VACUUMDB, SA_CS, 1, UTIL_OPTION_VACUUMDB, "vacuumdb", ua_Vacuum_Option, ua_Vacuum_Option_Map},
  {CHECKSUMDB, CS_ONLY, 1, UTIL_OPTION_CHECKSUMDB, "checksumdb", ua_Checksum_Option, ua_Checksum_Option_Map},
  {TDE, SA_CS, 1, UTIL_OPTION_TDE, "tde", ua_Tde_Option, ua_Tde_Option_Map},
  {FLASHBACK, CS_ONLY, 2, UTIL_OPTION_FLASHBACK, "flashback", ua_Flashback_Option, ua_Flashback_Option_Map},
  {MEMMON, CS_ONLY, 1, UTIL_OPTION_MEMMON, "memmon", ua_Memmon_Option, ua_Memmon_Option_Map},
  {-1, -1, 0, 0, 0, 0, 0}
};

static const char *util_get_library_name (int utility_index);
static int util_get_function_name (const char **function_name, const char *utility_name);
static int util_get_utility_index (int *utility_index, const char *utility_name);
static void print_admin_usage (const char *argv0);
static void print_admin_version (const char *argv0);

/*
 * util_admin_usage - display an usage of this utility
 *
 * return:
 *
 * NOTE:
 */
static void
print_admin_usage (const char *argv0)
{
  typedef void (*ADMIN_USAGE) (const char *);

  DSO_HANDLE util_sa_library;
  DSO_HANDLE symbol;
  ADMIN_USAGE admin_usage;

  utility_load_library (&util_sa_library, LIB_UTIL_SA_NAME);
  if (util_sa_library == NULL)
    {
      utility_load_print_error (stderr);
      return;
    }
  utility_load_symbol (util_sa_library, &symbol, UTILITY_ADMIN_USAGE_FUNC_NAME);
  if (symbol == NULL)
    {
      utility_load_print_error (stderr);
      return;
    }

  admin_usage = (ADMIN_USAGE) symbol;
  (*admin_usage) (argv0);
}

/*
 * util_admin_version - display a version of this utility
 *
 * return:
 *
 * NOTE:
 */
static void
print_admin_version (const char *argv0)
{
  typedef void (*ADMIN_VERSION) (const char *);

  DSO_HANDLE util_sa_library;
  DSO_HANDLE symbol;
  ADMIN_VERSION admin_version;

  utility_load_library (&util_sa_library, LIB_UTIL_SA_NAME);
  if (util_sa_library == NULL)
    {
      utility_load_print_error (stderr);
      return;
    }
  utility_load_symbol (util_sa_library, &symbol, UTILITY_ADMIN_VERSION_FUNC_NAME);
  if (symbol == NULL)
    {
      utility_load_print_error (stderr);
      return;
    }

  admin_version = (ADMIN_VERSION) symbol;
  (*admin_version) (argv0);
}

/*
 * main() - a administrator utility's entry point
 *
 * return: EXIT_SUCCESS/EXIT_FAILURE
 *
 * NOTE:
 */
int
main (int argc, char *argv[])
{
  int status;
  DSO_HANDLE library_handle, symbol_handle;
  UTILITY_FUNCTION loaded_function;
  int utility_index;
  const char *library_name;
  bool is_valid_arg = true;

  if (argc > 1 && strcmp (argv[1], "--version") == 0)
    {
      print_admin_version (argv[0]);
      return EXIT_SUCCESS;
    }

  if (argc < 2 || util_get_utility_index (&utility_index, argv[1]) != NO_ERROR)
    {
      goto print_usage;
    }

  if (util_parse_argument (&ua_Utility_Map[utility_index], argc - 1, &argv[1]) != NO_ERROR)
    {
      is_valid_arg = false;
      argc = 2;
    }

  library_name = util_get_library_name (utility_index);
  status = utility_load_library (&library_handle, library_name);
  if (status == NO_ERROR)
    {
      const char *symbol_name;
      status = util_get_function_name (&symbol_name, argv[1]);
      if (status != NO_ERROR)
    {
      goto print_usage;
    }

      status = utility_load_symbol (library_handle, &symbol_handle, symbol_name);
      if (status == NO_ERROR)
    {
      UTIL_FUNCTION_ARG util_func_arg;
      util_func_arg.arg_map = ua_Utility_Map[utility_index].arg_map;
      util_func_arg.command_name = ua_Utility_Map[utility_index].utility_name;
      util_func_arg.argv0 = argv[0];
      util_func_arg.argv = argv;
      util_func_arg.valid_arg = is_valid_arg;
      loaded_function = (UTILITY_FUNCTION) symbol_handle;
      status = (*loaded_function) (&util_func_arg);
    }
      else
    {
      utility_load_print_error (stderr);
      goto error_exit;
    }
    }
  else
    {
      utility_load_print_error (stderr);
      goto error_exit;
    }
  return status;
print_usage:
  print_admin_usage (argv[0]);
error_exit:
  return EXIT_FAILURE;
}

/*
 * get_lib_util_name - check executable utility mode
 *
 * return:
 *
 * NOTE:
 */
static const char *
util_get_library_name (int utility_index)
{
  int utility_type = ua_Utility_Map[utility_index].utility_type;
  UTIL_ARG_MAP *arg_map = ua_Utility_Map[utility_index].arg_map;

  switch (utility_type)
    {
    case SA_ONLY:
      return LIB_UTIL_SA_NAME;
    case CS_ONLY:
      return LIB_UTIL_CS_NAME;
    case SA_CS:
      {
    int i;
    for (i = 0; arg_map[i].arg_ch; i++)
      {
        int key = arg_map[i].arg_ch;
        if (key == 'C' && arg_map[i].arg_value.p != NULL)
          {
        return LIB_UTIL_CS_NAME;
          }
        if (key == HIDDEN_CS_MODE_S && arg_map[i].arg_value.p != NULL)
          {
        return LIB_UTIL_CS_NAME;
          }
        if (key == 'S' && arg_map[i].arg_value.p != NULL)
          {
        return LIB_UTIL_SA_NAME;
          }
      }
      }
    }
  if (utility_index == VACUUMDB || utility_index == TDE)
    {
      return LIB_UTIL_SA_NAME;
    }
  else
    {
      return LIB_UTIL_CS_NAME;
    }
}

/*
 * util_get_function_name - get an utility name by a function name
 *
 * return:
 *
 * NOTE:
 */
static int
util_get_function_name (const char **function_name, const char *utility_name)
{
  int i;
  for (i = 0; ua_Utility_Map[i].utility_index != -1; i++)
    {
      if (strcasecmp (ua_Utility_Map[i].utility_name, utility_name) == 0)
    {
      (*function_name) = ua_Utility_Map[i].function_name;
      return NO_ERROR;
    }
    }
  return ER_GENERIC_ERROR;
}

/*
 * util_get_utility_index - get an index of the utility by the name
 *
 * return: utility index
 */
static int
util_get_utility_index (int *utility_index, const char *utility_name)
{
  int i;
  for (i = 0, *utility_index = -1; ua_Utility_Map[i].utility_index != -1; i++)
    {
      if (strcasecmp (ua_Utility_Map[i].utility_name, utility_name) == 0)
    {
      *utility_index = ua_Utility_Map[i].utility_index;
      break;
    }
    }

  return *utility_index == -1 ? ER_GENERIC_ERROR : NO_ERROR;
}