sets.c

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

C
656
字号
    /* Make sure we have a current record */    if (!task->curr_rec)        return (dberr(S_NOCR));    /* Read current record */    if (dio_read(task->curr_rec, (char **) &task->crloc, NOPGHOLD, task) != S_OKAY)        return (task->db_status);    /* Get the member ptr for this set */    stat = r_gmem(set, task->crloc, &mem, task);    if (dio_release(task->curr_rec, NOPGFREE, task) != S_OKAY)        return (task->db_status);    if (stat != S_OKAY)        return (task->db_status = stat);    if (mem.owner == NULL_DBA)            /* Record not connected to set */        return (dberr(S_NOTCON));    /* set the new current owner and member */    task->curr_own[set] = mem.owner;    task->curr_mem[set] = task->curr_rec;    task->curr_rec = mem.owner;    /* set any timestamps */    if (task->db_tsrecs)    {        dutscr(&task->cr_time, task, dbn);        dutscm(nset, &task->cm_time[set], task, dbn);        task->co_time[set] = task->cr_time;    }    if (task->db_tssets)        dutscs(nset, &task->cs_time[set], task, dbn);    return (task->db_status);}/* ======================================================================    Find first member of set*/int INTERNAL_FCN dfindfm(int nset, DB_TASK *task, int dbn){    SET_PTR setp;    char *recp;    int set;    int stat;    short crt;    SET_ENTRY *set_ptr;    if (nset_check(nset, &set, &set_ptr, task) != S_OKAY)        return (task->db_status);    /* make sure we have a current owner */    if (!task->curr_own[set])        return (dberr(S_NOCO));    /* read current owner of set */    if (dio_read(task->curr_own[set], (char **) &recp, NOPGHOLD, task) != S_OKAY)        return (task->db_status);    /* Test whether current owner has been deleted */    memcpy(&crt, recp, sizeof(short));    if (crt < 0)    {        /* record is deleted */        stat = S_DELETED;    }    else    {        /* get set pointer from record */        stat = r_gset(set, recp, &setp, task);    }    if (dio_release(task->curr_own[set], NOPGFREE, task) != S_OKAY)        return (task->db_status);    if (stat != S_OKAY)        return (task->db_status = stat);    /* set current record and member */    task->curr_mem[set] = setp.first;    if (!setp.first)                       /* end of set if no first member */        return (task->db_status = S_EOS);    task->curr_rec = setp.first;    /* set timestamps */    if (task->db_tsrecs)    {        dutscr(&task->cr_time, task, dbn);        task->cm_time[set] = task->cr_time;    }    if (task->db_tssets)    {        /* only needed for system record support */        dutscs(nset, &task->cs_time[set], task, dbn);    }    return (task->db_status);}/* ======================================================================    Find last member of set*/int INTERNAL_FCN dfindlm(int nset, DB_TASK *task, int dbn){    SET_PTR setp;    char *recp;    int set;    int stat;    short crt;    SET_ENTRY *set_ptr;    if (nset_check(nset, &set, &set_ptr, task) != S_OKAY)        return (task->db_status);    /* make sure we have a current owner */    if (!task->curr_own[set])        return (dberr(S_NOCO));    /* read current owner of set */    if (dio_read(task->curr_own[set], (char **) &recp, NOPGHOLD, task) != S_OKAY)        return (task->db_status);    /* Test whether current owner has been deleted */    memcpy(&crt, recp, sizeof(short));    if (crt < 0)    {        /* record is deleted */        stat = S_DELETED;    }    else    {        /* get set pointer from record */        stat = r_gset(set, recp, &setp, task);    }    if (dio_release(task->curr_own[set], NOPGFREE, task) != S_OKAY)        return (task->db_status);    if (stat != S_OKAY)        return (task->db_status = stat);    /* set current record and member */    task->curr_mem[set] = setp.last;    if (!setp.last)                           /* end of set if no first member */        return (task->db_status = S_EOS);    task->curr_rec = setp.last;    /* set timestamps */    if (task->db_tsrecs)    {        dutscr(&task->cr_time, task, dbn);        task->cm_time[set] = task->cr_time;    }    if (task->db_tssets)    {        /* only needed for system record support */        dutscs(nset, &task->cs_time[set], task, dbn);    }    return (task->db_status);}/* ======================================================================    Find next member of set*/int INTERNAL_FCN dfindnm(int nset, DB_TASK *task, int dbn){    int set;    short crt;    MEM_PTR memp;    int stat;    char *recp;    DB_ADDR *cm_ptr;    DB_ADDR mem_dba;    SET_ENTRY *set_ptr;    if (nset_check(nset, &set, &set_ptr, task) != S_OKAY)        return (task->db_status);    /* make sure we have a current owner */    if (!task->curr_own[set])        return (dberr(S_NOCO));    /* find first member if no current member */    if (!*(cm_ptr = &task->curr_mem[set]))        return (dfindfm(nset, task, dbn));    mem_dba = *cm_ptr;    /* read current member of set and get member pointer from record */    if (dio_read(mem_dba, (char **) &recp, NOPGHOLD, task) != S_OKAY)        return (task->db_status);    /* Test whether current member has been deleted */    memcpy(&crt, recp, sizeof(short));    if (crt < 0)    {        /* record is deleted */        stat = S_DELETED;    }    else    {        stat = r_gmem(set, recp, &memp, task);        if (memp.owner != task->curr_own[set])        {            /* set consistancy clash with another user between locks */            *cm_ptr = NULL_DBA;            stat = S_SETCLASH;        }    }    if (dio_release(mem_dba, NOPGFREE, task) != S_OKAY)        return (task->db_status);    if (stat != S_OKAY)        return (task->db_status = stat);    /* set current record and member */    *cm_ptr = memp.next;    if (!memp.next)                           /* end of set */        return (task->db_status = S_EOS);    task->curr_rec = memp.next;    /* set timestamps */    if (task->db_tsrecs)    {        dutscr(&task->cr_time, task, dbn);        task->cm_time[set] = task->cr_time;    }    return (task->db_status);}/* ======================================================================    Find previous member of set*/int INTERNAL_FCN dfindpm(int nset, DB_TASK *task, int dbn){    int set;    int stat;    short crt;    MEM_PTR memp;    char *recp;    DB_ADDR *cm_ptr;    DB_ADDR mem_dba;    SET_ENTRY *set_ptr;    if (nset_check(nset, &set, &set_ptr, task) != S_OKAY)        return (task->db_status);    /* make sure we have a current owner */    if (!task->curr_own[set])        return (dberr(S_NOCO));    /* find last member if no current member */    if (!*(cm_ptr = &task->curr_mem[set]))        return (dfindlm(nset, task, dbn));    mem_dba = *cm_ptr;    /* read current member of set and get member pointer from record */    if (dio_read(mem_dba, (char **) &recp, NOPGHOLD, task) != S_OKAY)        return (task->db_status);    /* Test whether current member has been deleted */    memcpy(&crt, recp, sizeof(short));    if (crt < 0)    {        /* record is deleted */        stat = S_DELETED;    }    else    {        stat = r_gmem(set, recp, &memp, task);        if (memp.owner != task->curr_own[set])        {            /* set consistancy clash with another user between locks */            *cm_ptr = NULL_DBA;            stat = S_SETCLASH;        }    }    if (dio_release(mem_dba, NOPGFREE, task) != S_OKAY)        return (task->db_status);    if (stat != S_OKAY)        return (task->db_status = stat);    /* set current record and member */    *cm_ptr = memp.prev;    if (!memp.prev)                           /* end of set */        return (task->db_status = S_EOS);    task->curr_rec = memp.prev;    /* set timestamps */    if (task->db_tsrecs)    {        dutscr(&task->cr_time, task, dbn);        task->cm_time[set] = task->cr_time;    }    return (task->db_status);}

⌨️ 快捷键说明

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