prdbd.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 477 行 · 第 1/2 页

C
477
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database, prdbd utility                                     * *                                                                         * * Copyright (c) 2000 Centura Software Corporation. All rights reserved.   * *                                                                         * * Use of this software, whether in source code format, or in executable,  * * binary object code form, is governed by the CENTURA OPEN SOURCE LICENSE * * which is fully described in the LICENSE.TXT file, included within this  * * distribution of source code files.                                      *  *                                                                         * **************************************************************************//*-----------------------------------------------------------------------    prdbd.c - db.* Database Dictionary Report Utility    This program produces a formatted report of the database dictionary.-----------------------------------------------------------------------*/#define MOD prdbd#include "db.star.h"#include "version.h"/* ********************** LOCAL FUNCTION DECLARATIONS **************** */static int usage(void);void EXTERNAL_FCN prdbd_dberr(int errnum, DB_TCHAR *msg){    vtprintf(DB_TEXT("\n%s (errnum = %d)\n"), msg, errnum);}/* Print db.* Database Schema Tables*/int MAIN(int argc, DB_TCHAR *argv[]){    DB_TCHAR *dbname = NULL;    DB_TCHAR  version[80];    DB_TCHAR *pv = DB_TEXT("");    long      m;    int       i, j, v;    int       stat, symbolic = 1;    DB_TASK  *task = NULL;    SG       *sg = NULL;#if defined(SAFEGARDE)    DB_TCHAR *cp;    DB_TCHAR *password;    int       mode = NO_ENC;#endif    vtprintf(DBSTAR_UTIL_DESC(DB_TEXT("Database Dictionary Print")));    for (i = 1; i < argc && argv[i][0] == DB_TEXT('-'); i++)    {        switch (vtotlower(argv[i][1]))        {            case DB_TEXT('?'):            case DB_TEXT('h'):                return usage();            case DB_TEXT('c'):                symbolic = 0;                break;            case DB_TEXT('s'):                if (vtotlower(argv[i][2]) != DB_TEXT('g'))                {                    vftprintf(stderr, DB_TEXT("Invalid option: %s\n"), argv[i]);                    return usage();                }                if (i == argc - 1)                {                    vftprintf(stderr, DB_TEXT("No password specified\n"));                    return usage();                }#if defined(SAFEGARDE)                if ((cp = vtstrchr(argv[++i], DB_TEXT(','))) != NULL)                {                    *cp++ = DB_TEXT('\0');                    if (vtstricmp(argv[i], DB_TEXT("low")) == 0)                        mode = LOW_ENC;                    else if (vtstricmp(argv[i], DB_TEXT("med")) == 0)                        mode = MED_ENC;                    else if (vtstricmp(argv[i], DB_TEXT("high")) == 0)                        mode = HIGH_ENC;                    else                    {                        vftprintf(stderr, DB_TEXT("Invalid encryption mode\n"));                        return usage();                    }                    password = cp;                }                else                {                    mode = MED_ENC;                    password = argv[i];                }                break;#else                vftprintf(stderr, DB_TEXT("SafeGarde is not available in this version\n"));                return 1;#endif            default:                vftprintf(stderr, DB_TEXT("Invalid option: %s\n"), argv[i]);                return usage();        }    }    if (i == argc)    {        vftprintf(stderr, DB_TEXT("Database name not supplied\n"));        return usage();    }    dbname = argv[i++];    while (i == argc)        vftprintf(stderr, DB_TEXT("Ignoring option %s\n"), argv[i++]);    if ((stat = d_opentask(&task)) != S_OKAY)    {        vftprintf(stderr, DB_TEXT("Failed to open task (%d)\n"), stat);        return 1;    }#if defined(SAFEGARDE)    if (mode != NO_ENC && (sg = sg_create(mode, password)) == NULL)    {        vftprintf(stderr, DB_TEXT("Failed to create SafeGarde context\n"));        goto exit;    }#endif    if ((stat = d_set_dberr(prdbd_dberr, task)) != S_OKAY)    {        vftprintf(stderr, DB_TEXT("Failed to set error handler (%d)\n"), stat);        goto exit;    }    if ((stat = d_on_opt(READNAMES, task)) != S_OKAY)    {        vftprintf(stderr, DB_TEXT("Failed to set options (%d)\n"), stat);        goto exit;    }    if ((stat = d_open_sg(dbname, DB_TEXT("o"), sg, task)) != S_OKAY)    {        if (stat == S_INVDB)            vftprintf(stderr, DB_TEXT("Unable to locate database: %s\n"),                    dbname);        else if (stat == S_INCOMPAT)            vftprintf(stderr,                    DB_TEXT("Incompatible dictionary file. Re-run ddlp.\n"));        else            vftprintf(stderr,                    DB_TEXT("Error %d opening database, %s not printed.\n"),                    stat, dbname);        goto exit;    }            /* get dbd version */    v = (int) DB_REF(db_ver);    if (v < 0)    {        v *= -1;        pv = DB_TEXT(" Unicode");    }    /* compute memory reqts for dictionary tables */    m =  (long) task->size_ft  *  (long) sizeof(FILE_ENTRY);    m += (long) task->size_rt  *  (long) sizeof(RECORD_ENTRY);    m += (long) task->size_fd  *  (long) sizeof(FIELD_ENTRY);    m += (long) task->size_st  *  (long) sizeof(SET_ENTRY);    m += (long) task->size_mt  *  (long) sizeof(MEMBER_ENTRY);    m += (long) task->size_srt *  (long) sizeof(SORT_ENTRY);    m += (long) task->size_kt  *  (long) sizeof(KEY_ENTRY);    d_dbver(DB_TEXT("%n Version %v"), version, sizeof(version) / sizeof(DB_TCHAR));    vtprintf(DB_TEXT("%s\n"), version);    vtprintf(DB_TEXT("Database Dictionary Tables for Database: %s\n"), dbname);    vtprintf(DB_TEXT("DBD Version: %d.%02d%s\n\n"), v / 100, v % 100, pv);    vtprintf(DB_TEXT("REQUIRED MEMORY: %ld BYTES\n\n"), m);    vtprintf(DB_TEXT("\n\n------------------------------------------------------------------\n"));    vtprintf(DB_TEXT("FILE TABLE:\n\n"));    vtprintf(DB_TEXT("file sta type slots sl sz pg sz  initial     next pct flgs name\n"));    vtprintf(DB_TEXT("---- --- ---- ----- ----- ----- -------- -------- --- ---- ----\n"));    for (i = 0; i < task->size_ft; ++i)    {        vtprintf(DB_TEXT("%3d  "), i);        vtprintf(DB_TEXT("  %c  "), task->file_table[i].ft_status);        vtprintf(DB_TEXT("  %c  "), task->file_table[i].ft_type);        vtprintf(DB_TEXT("%4d  "), task->file_table[i].ft_slots);        vtprintf(DB_TEXT("%4d  "), task->file_table[i].ft_slsize);        vtprintf(DB_TEXT("%4d "), task->file_table[i].ft_pgsize);        vtprintf(DB_TEXT("%8ld "), task->file_table[i].ft_initial);        vtprintf(DB_TEXT("%8ld "), task->file_table[i].ft_next);        vtprintf(DB_TEXT("%3d "), task->file_table[i].ft_pctincrease);        vtprintf(DB_TEXT("%04x "), task->file_table[i].ft_flags);        vtprintf(DB_TEXT("%-24s\n"), task->file_table[i].ft_name);    }    vtprintf(DB_TEXT("\n\n------------------------------------------------------------------\n"));    vtprintf(DB_TEXT("RECORD TABLE:\n\n"));    if (!symbolic)    {        vtprintf(DB_TEXT("                          1st  tot\n"));        vtprintf(DB_TEXT("rec #  file #  len  data  fld  flds  flags\n"));        vtprintf(DB_TEXT("-----  ------ ----  ----  ---  ----  -----\n"));        for (i = 0; i < task->size_rt; ++i)        {            vtprintf(DB_TEXT("%4d   %4d   "), i, task->record_table[i].rt_file);            vtprintf(DB_TEXT("%4d  "), task->record_table[i].rt_len);            vtprintf(DB_TEXT("%4d  "), task->record_table[i].rt_data);            vtprintf(DB_TEXT("%3d  "), task->record_table[i].rt_fields);            vtprintf(DB_TEXT("%4d   "), task->record_table[i].rt_fdtot);            vtprintf(DB_TEXT("%04x\n"), task->record_table[i].rt_flags);        }    }    else    {        vtprintf(DB_TEXT("                                       [#]first          tot\n"));        vtprintf(DB_TEXT("   [#]record      file    len  data      field      flds flags\n"));        vtprintf(DB_TEXT("-------------- ---------- ---- ---- --------------- ---- -----\n"));        for (i = 0; i < task->size_rt; ++i)        {            vtprintf(DB_TEXT("[%2d]%-10.10s %-10.10s "),                i, task->record_names[i],                task->file_table[task->record_table[i].rt_file].ft_name);            vtprintf(DB_TEXT("%4d "), task->record_table[i].rt_len);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?