recfcns.c

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

C
758
字号
                !(file_ptr->ft_flags & STATIC))                return (dberr(S_NOTLOCKED));        }    }    /* if this is a key field, change the key file also */    if (cmp && fld_ptr->fd_key != NOKEY && (!(fld_ptr->fd_flags & OPTKEYMASK) ||        r_tstopt(fld_ptr, rec, task)))    {        /* delete the old key and insert the new one */        if (key_delete(field, fptr, dba, task) == S_OKAY)        {            if (key_insert(field, data, dba, task) != S_OKAY)                return (task->db_status);        }        else        {            if (task->db_status == S_NOTFOUND)                dberr(S_KEYERR);            return (task->db_status);        }    }    /* if subfield of struct field, check to see if struct is a key */    if (task->struct_key_chk && fld_ptr->fd_flags & STRUCTFLD)    {        strfld = field - 1;        for (sfld_ptr = &task->field_table[strfld];             sfld_ptr->fd_type != GROUPED;             --sfld_ptr)        {            /* find struct field */            --strfld;        }        /* make sure it is stored */        if (cmp && sfld_ptr->fd_key != NOKEY &&            (!(sfld_ptr->fd_flags & OPTKEYMASK) ||            r_tstopt(sfld_ptr, rec, task)))        {            /* delete the old struct key */            if (key_delete(strfld, rec + sfld_ptr->fd_ptr, dba, task) != S_OKAY)                return task->db_status;        }        else            strfld = -1;    }    else        strfld = -1;    /* copy data into record area */    switch (fld_ptr->fd_type)    {        case CHARACTER:            if (fld_ptr->fd_dim[1])                memcpy(fptr, data, fld_ptr->fd_len);            else if (fld_ptr->fd_dim[0])                strncpy(fptr, data, fld_ptr->fd_len);            else                *fptr = (char) *data;            break;        case WIDECHAR:            if (fld_ptr->fd_dim[0] > 0 && fld_ptr->fd_dim[1] == 0)            {                vwcsncpy((wchar_t *)fptr, (wchar_t *)data,                        fld_ptr->fd_len / sizeof(wchar_t));            }            else                memcpy(fptr, data, fld_ptr->fd_len);            break;        case GROUPED:            if (! fld_ptr->fd_dim[0])            {                /* non-arrayed structure */                task->struct_key_chk = 0;                for (i = (short) (field + 1), sfld_ptr = fld_ptr + 1;                     (i < task->size_fd) && (sfld_ptr->fd_flags & STRUCTFLD);                     ++i, ++sfld_ptr)                {                    tfptr = (char *) data + sfld_ptr->fd_ptr - fld_ptr->fd_ptr;                    if (r_pfld(i, sfld_ptr, rec, tfptr, &dba, task) != S_OKAY)                        break;                }                task->struct_key_chk = 1;                if (task->db_status != S_OKAY)                    return task->db_status;                break;            }            /* arrayed struct fall-thru to a full field copy */        default:            memcpy(fptr, data, fld_ptr->fd_len);            break;    }    /* if this field is part of an ordered set, reconnect */    if (cmp && (fld_ptr->fd_flags & SORTFLD))    {        for (s = 0, srt_ptr = task->sort_table; s < task->size_srt; ++s, ++srt_ptr)        {            if (srt_ptr->se_fld != field)                continue;                    sn = srt_ptr->se_set;            if (r_gmem(sn, rec, &memp, task) != S_OKAY)                return task->db_status;            if (null_dba(memp.owner))                continue;                    /* save currency */            odba = *(co_ptr = &task->curr_own[sn]);            mdba = *(cm_ptr = &task->curr_mem[sn]);            if (task->db_tssets)                co_ts = task->cs_time[sn];            if (task->db_tsrecs)                cm_ts = task->cm_time[sn];            *co_ptr = memp.owner;            *cm_ptr = dba;            /* calculate set constant */            set = NUM2EXT(sn + SETMARK, st_offset);            /* disconnect from prior order set and reconnect               in new order            */            if (ddiscon(set, task, task->curr_db) < S_OKAY)                return task->db_status;  /* S_EOS is good, others not possible */            task->db_status = S_OKAY;            if (dconnect(set, task, task->curr_db) != S_OKAY)                return task->db_status;            /* reset currency */            *co_ptr = odba;            *cm_ptr = mdba;            if (task->db_tssets)                task->cs_time[sn] = co_ts;            if (task->db_tsrecs)                task->cm_time[sn] = cm_ts;        }    }    if (cmp && (strfld >= 0))    {        /* insert the new struct key */        if (key_insert(strfld, rec + sfld_ptr->fd_ptr, dba, task) != S_OKAY)            return task->db_status;    }    return task->db_status;}/* ======================================================================    Put member pointer into record*/int INTERNAL_FCN r_pmem(    int      set,            /* set table entry number */    char    *rec,            /* pointer to record */    char    *mem_addr,       /* pointer to member pointer */    DB_TASK *task){    short         rt;    int           mem;    int           memtot;    SET_ENTRY    *set_ptr;    MEMBER_ENTRY *mem_ptr;    /* search member list of set for record */    set_ptr = &task->set_table[set];    memcpy(&rt, rec, sizeof(short));    rt &= ~RLBMASK;    for (mem = set_ptr->st_members, memtot = mem + set_ptr->st_memtot,         mem_ptr = &task->member_table[mem]; mem < memtot; ++mem, ++mem_ptr)    {        if (NUM2EXT(mem_ptr->mt_record, rt_offset) == rt)        {            /* have found correct member record */            memcpy(rec + mem_ptr->mt_mem_ptr, mem_addr, MEMPSIZE);            return (task->db_status);        }    }    /* this record is not member of set */    return (dberr(S_INVMEM));}/* ======================================================================    Put set pointer into record*/int INTERNAL_FCN r_pset(    int      set,          /* set table entry number */    char    *rec,          /* pointer to record */    char    *setptr,       /* pointer to set pointer */    DB_TASK *task){    short      rt;    int        len;    SET_ENTRY *set_ptr;    set_ptr = &task->set_table[set];    memcpy(&rt, rec, sizeof(short));    if (NUM2EXT(set_ptr->st_own_rt, rt_offset) == (rt & ~RLBMASK))    {        if (set_ptr->st_flags & TIMESTAMPED)            len = SETPSIZE;        else            len = SETPSIZE - sizeof(DB_ULONG);        memcpy(rec + set_ptr->st_own_ptr, setptr, len);        return (task->db_status);    }    return (dberr(S_INVOWN));}/* ======================================================================    Set the current set member from record*/int INTERNAL_FCN r_smem(    DB_ADDR *db_addr,    int      set,    DB_TASK *task){    int     nset;    MEM_PTR mem;    char   *ptr;    DB_ADDR dba;    int     stat;    memcpy(&dba, db_addr, DB_ADDR_SIZE);    /* make sure record is owned */    if (dio_read(dba, &ptr, NOPGHOLD, task) != S_OKAY)        return task->db_status;    if ((stat = r_gmem(set, ptr, &mem, task)) != S_OKAY)    {        if (dio_release(dba, NOPGFREE, task) != S_OKAY)            return task->db_status;        return (task->db_status = stat);    }    if (null_dba(mem.owner))        return (dberr(S_NOTCON));    task->curr_own[set] = mem.owner;    if (dio_release(dba, NOPGFREE, task) != S_OKAY)        return task->db_status;    /* ownership okay, set the member */    task->curr_mem[set] = dba;    nset = NUM2EXT(set + SETMARK, st_offset);    /* set timestamps */    if (task->db_tsrecs)    {        dutsco(nset, &task->co_time[set], task, task->curr_db);        dutscm(nset, &task->cm_time[set], task, task->curr_db);    }    if (task->db_tssets)        dutscs(nset, &task->cs_time[set], task, task->curr_db);    return (task->db_status);}/* ======================================================================    Set the optional key field "stored" bit*/int INTERNAL_FCN r_setopt(    FIELD_ENTRY *fld_ptr,    /* field table entry of optional key */    char        *rec,        /* Pointer to record */    DB_TASK     *task){    int offset;                      /* offset to the bit map */    int keyndx;                      /* index into bit map of this key */    int byteno, bitno;               /* position within bit map of this key */    /* calculate the position to the bit map */    offset = (task->record_table[fld_ptr->fd_rec].rt_flags & TIMESTAMPED) ?            (RECHDRSIZE + 2 * sizeof(long)) : RECHDRSIZE;    /* extract the index into the bit map of this key */    keyndx = (((fld_ptr->fd_flags & OPTKEYMASK) >> OPTKEYSHIFT) & OPTKEYNDX) - 1;    if (keyndx < 0)        return (dberr(SYS_BADOPTKEY));    /* determine which byte, and which bit within the byte */    byteno = keyndx / BITS_PER_BYTE;    bitno = keyndx - byteno * BITS_PER_BYTE;    /* set the bit */    rec[byteno + offset] |= 1 << (BITS_PER_BYTE - bitno - 1);    return (task->db_status);}/* ======================================================================    Clear the optional key field "stored" bit*/int INTERNAL_FCN r_clropt(    FIELD_ENTRY *fld_ptr,    /* Field table entry of optional key */    char        *rec,        /* Pointer to record */    DB_TASK     *task){    int offset;                      /* offset to the bit map */    int keyndx;                      /* index into bit map of this key */    int byteno, bitno;               /* position within bit map of this key */    /* calculate the position to the bit map */    offset = (task->record_table[fld_ptr->fd_rec].rt_flags & TIMESTAMPED) ?            (RECHDRSIZE + 2 * sizeof(long)) : RECHDRSIZE;    /* extract the index into the bit map of this key */    keyndx = (((fld_ptr->fd_flags & OPTKEYMASK) >> OPTKEYSHIFT) & OPTKEYNDX) - 1;    if (keyndx < 0)        return (dberr(SYS_BADOPTKEY));    /* determine which byte, and which bit within the byte */    byteno = keyndx / BITS_PER_BYTE;    bitno = keyndx - byteno * BITS_PER_BYTE;    /* clear the bit */    rec[byteno + offset] &= ~(1 << (BITS_PER_BYTE - bitno - 1));    return S_OKAY;}/* ======================================================================    Test the optional key field "stored" bit*/int EXTERNAL_FCN r_tstopt(    FIELD_ENTRY *fld_ptr,    /* Field table entry of optional key */    char        *rec,        /* Pointer to record */    DB_TASK     *task){    int offset;                      /* offset to the bit map */    int keyndx;                      /* index into bit map of this key */    int byteno, bitno;               /* position within bit map of this key */    /* calculate the position to the bit map */    offset = (task->record_table[fld_ptr->fd_rec].rt_flags & TIMESTAMPED) ?            (RECHDRSIZE + 2 * sizeof(long)) : RECHDRSIZE;    /* extract the index into the bit map of this key */    keyndx = (((fld_ptr->fd_flags & OPTKEYMASK) >> OPTKEYSHIFT) & OPTKEYNDX) - 1;    if (keyndx < 0)        return (dberr(SYS_BADOPTKEY));    /* determine which byte, and which bit within the byte */    byteno = keyndx / BITS_PER_BYTE;    bitno = keyndx - byteno * BITS_PER_BYTE;    /* extract the bit */    if (rec[byteno + offset] & (1 << (BITS_PER_BYTE - bitno - 1)))        return (task->db_status = S_DUPLICATE);    return (task->db_status);}

⌨️ 快捷键说明

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