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 + -
显示快捷键?