initial.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 245 行

C
245
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database kernel                                             * *                                                                         * * 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.                                      *  *                                                                         * **************************************************************************/#include "db.star.h"typedef union INIT_PAGE_U{    struct    {        F_ADDR dchain;                   /* delete chain pointer */        F_ADDR next;                     /* next page or record slot */        DB_ULONG timestamp;              /* file's timestamp value */        time_t cdate;                    /* creation date,time */        time_t bdate;                    /* date/time of last backup */        DB_TCHAR vdb_id[LENVDBID];       /* db.* id mark */    } pg0;    struct    {        /* page 1 of key file */        time_t chg_date;                 /* date of last page change */        /* char arrays are used to avoid alignment problems */        char init_int[SHORT_SIZE];       /* # filled slots on key file;                                            System record # on data file */        char init_addr[DB_ADDR_SIZE];    /* NONE node pointer on key file;                                            System record db_addr on data file */        char init_crts[LONG_SIZE];       /* if system record is timestamped */        char init_upts[LONG_SIZE];       /* if system record is timestamped */    } pg1;} INIT_PAGE;/* ======================================================================    Database initialization function*/int INTERNAL_FCN dinitialize(DB_TASK *task, int dbn){    FILE_NO fno;    if (task->dboptions & READONLY)        return (dberr(S_READONLY));    if (!task->dbopen)        return (dberr(S_DBOPEN));    /* make sure we have the necessary locks */    if (task->dbopen == 1)           /* shared mode */    {        FILE_NO offset = task->curr_db_table->ft_offset;        for (fno = 0; fno < DB_REF(Size_ft); ++fno)        {            if (!task->excl_locks[fno + offset])                return (dberr(S_EXCLUSIVE));        }    }    /* initialize db files in task->file_table */    for (fno = 0; fno < DB_REF(Size_ft); ++fno)    {        if (dinitfile(fno, task, dbn) != S_OKAY)            break;    }    return (task->db_status);}/* ======================================================================    Initialize database file*/int INTERNAL_FCN dinitfile(    FILE_NO fno,            /* file table entry of file to be initialized */    DB_TASK *task,    int dbn){    INIT_PAGE    *page;    DB_ADDR       addr;    DB_ULONG      ts;    short         rno,                  rec;    short         pgsize;    FILE_ENTRY   *fptr;    RECORD_ENTRY *rec_ptr;    PSP_FH        dbfile;    const SG     *sg = NULL;    if (!task->dbopen)        return (dberr(S_DBOPEN));    if (task->dboptions & READONLY)        return (dberr(S_READONLY));    /* make sure file number is within proper range [435] */    if (fno < 0 || fno > DB_REF(Size_ft))        return (dberr(S_NOFILE));    fno += task->curr_db_table->ft_offset;    fptr = &task->file_table[fno];    pgsize = fptr->ft_pgsize;    if (task->dbopen == 1 && !task->excl_locks[fno])        return (dberr(S_EXCLUSIVE));    /* If file is open - close it */    if (fptr->ft_status == OPEN)        dio_close(fno, task);    /* clear file's pages from the cache */    dio_clrfile(fno, task);    dbfile = psp_fileOpen(fptr->ft_name, O_TRUNC | O_RDWR,                          PSP_FLAG_SYNC | PSP_FLAG_DENYRW);    if (!dbfile)        return (dberr(S_NOFILE));    if (fptr->ft_initial)    {        if (psp_fileSetSize(dbfile, fptr->ft_initial * pgsize) < 0)            return (dberr(S_NOFILE));    }    if ((page = (INIT_PAGE *) psp_cGetMemory(pgsize, 0)) == NULL)        return (dberr(S_NOMEMORY));    page->pg0.cdate = psp_timeSecs();    ddbver(DB_TEXT("%V"), page->pg0.vdb_id, 48);    page->pg0.bdate = 0;    sg = task->sgs[fno];    if (fptr->ft_type == KEY)    {        /* initialize key file */        page->pg0.dchain = DCH_NONE;        page->pg0.next = (F_ADDR) 2;        page->pg0.timestamp = (DB_ULONG) 0;   /* not really used by key file */        if (sg)            (*sg->enc)(sg->data, page, PGZEROSZ);        if (psp_fileSeekWrite(dbfile, 0, page, pgsize) != pgsize)            dberr(S_BADWRITE);        else        {            memset(page, '\0', pgsize);            page->pg1.chg_date = psp_timeSecs();            /* node 1, current # of filled slots */            memset(page->pg1.init_int, '\0', sizeof(short));            /* node 1, NONE page pointer */            addr = DBA_NONE;            memcpy(page->pg1.init_addr, &addr, sizeof(DB_ADDR));            if (sg)                (*sg->enc)(sg->data, page, pgsize);            if (psp_fileSeekWrite(dbfile, pgsize, page, pgsize) != pgsize)                dberr(S_BADWRITE);        }    }    else    {        /* initialize data file */        page->pg0.dchain = (F_ADDR) 0;        page->pg0.timestamp = (DB_ULONG) 1;        /* check to see if this file contains a system record */        for (rec = 0, rec_ptr = task->record_table; rec < task->size_rt;             ++rec, ++rec_ptr)        {            if (rec_ptr->rt_fdtot == -1 && rec_ptr->rt_file == fno)            {                /* this file contains the system record */                page->pg0.next = (F_ADDR) 2;                if (sg)                    (*sg->enc)(sg->data, page, PGZEROSZ);                if (psp_fileSeekWrite(dbfile, 0, page, pgsize) < pgsize)                {                    dberr(S_BADWRITE);                    break;                }                memset(page, '\0', pgsize);                page->pg1.chg_date = psp_timeSecs();                ENCODE_DBA(NUM2EXT(fno, ft_offset), 1L, &addr);                memcpy(page->pg1.init_addr, &addr, sizeof(DB_ADDR));                rno = (short) NUM2EXT(rec, rt_offset);                memcpy(page->pg1.init_int, &rno, sizeof(short));                if (rec_ptr->rt_flags & TIMESTAMPED)                {                    /* timestamp system record */                    ts = (DB_ULONG) 1;                    memcpy(page->pg1.init_crts, &ts, sizeof(DB_ULONG));                    memcpy(page->pg1.init_upts, &ts, sizeof(DB_ULONG));                }                if (sg)                    (*sg->enc)(sg->data, page, pgsize);                if (psp_fileSeekWrite(dbfile, pgsize, page, pgsize) < pgsize)                    dberr(S_BADWRITE);                break;            }        }        if (rec == task->size_rt && task->db_status == S_OKAY)        {            page->pg0.next = (F_ADDR) 1;            if (sg)                (*sg->enc)(sg->data, page, PGZEROSZ);            if (psp_fileSeekWrite(dbfile, 0, page, pgsize) < pgsize)                dberr(S_BADWRITE);        }    }    /* close database file */    psp_fileClose(dbfile);        /* re-read file header */    if (task->db_status == S_OKAY)    {        dio_pzread(fno, task);        dio_close(fno, task);    }    psp_freeMemory(page, 0);    return (task->db_status);}

⌨️ 快捷键说明

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