currency.c
来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 827 行 · 第 1/2 页
C
827 行
return (task->db_status);}/* ====================================================================== Read data from field of current set member*/int INTERNAL_FCN dcsmread( int nset, /* Set constant */ long field, /* Field constant */ void *data, /* Data area to contain field contents */ DB_TASK *task, int dbn){ int fld, rec, set; int dbopen_sv; char *recp; SET_ENTRY *set_ptr; RECORD_ENTRY *rec_ptr; FIELD_ENTRY *fld_ptr; if (nset_check(nset, &set, &set_ptr, task) != S_OKAY || nfld_check(field, &rec, &fld, &rec_ptr, &fld_ptr, task) != S_OKAY) return (task->db_status); /* Make sure we have a current member */ if (!task->curr_mem[set]) return (dberr(S_NOCM)); if (check_dba(task->curr_mem[set], task) != S_OKAY) return (task->db_status); /* set up to allow unlocked read */ dbopen_sv = task->dbopen; task->dbopen = 2; /* Read current member */ dio_read(task->curr_mem[set], (char **) &recp, NOPGHOLD, task); task->dbopen = dbopen_sv; if (task->db_status != S_OKAY) return (task->db_status); /* Get data from record */ r_gfld(fld_ptr, recp, data, task); if (dio_release(task->curr_mem[set], NOPGFREE, task) != S_OKAY) return (task->db_status); /* check and fetch timestamps */ if (task->db_status == S_OKAY) { if (task->db_tsrecs) dutscr(&task->cm_time[set], task, dbn); if (task->db_tssets) dutscs(nset, &task->cs_time[set], task, dbn); } return (task->db_status);}/* ====================================================================== Set current set member*/int INTERNAL_FCN dcsmset( int set, /* Set table entry */ DB_ADDR *dba, /* db address of record to become current */ DB_TASK *task, int dbn) /* database number */{ short type; char *ptr; SET_ENTRY *set_ptr; MEMBER_ENTRY *mem_ptr; int mem, memtot; int dbopen_sv; if (nset_check(set, &set, (SET_ENTRY **) &set_ptr, task) != S_OKAY) return (task->db_status); if (dba == NULL || *dba == NULL_DBA) task->curr_mem[set] = NULL_DBA; else if (check_dba(*dba, task) == S_OKAY) { /* get the record type */ /* check to make sure the record is not deleted */ dbopen_sv = task->dbopen; task->dbopen = 2; /* setup to allow unlocked read */ dio_read(*dba, (char **) &ptr, NOPGHOLD, task); task->dbopen = dbopen_sv; if (task->db_status != S_OKAY) /* from dio_read() */ return (task->db_status); memcpy(&type, ptr, sizeof(short)); if (dio_release(*dba, NOPGFREE, task) != S_OKAY) return (task->db_status); type &= ~RLBMASK; type += task->curr_db_table->rt_offset; for (mem = set_ptr->st_members, memtot = mem + set_ptr->st_memtot, mem_ptr = &task->member_table[mem]; mem < memtot; ++mem, ++mem_ptr) { if (mem_ptr->mt_record == type) { dbopen_sv = task->dbopen; task->dbopen = 2; /* setup to allow unlocked read */ r_smem(dba, set, task); task->dbopen = dbopen_sv; return (task->db_status); } } dberr(S_INVMEM); } return (task->db_status);}/* ====================================================================== Write data to a field in the current set member*/int INTERNAL_FCN dcsmwrite( int set, /* Set constant */ long field, /* Field constant */ const void *data, /* Data area to contain field contents */ DB_TASK *task, int dbn) /* database number */{ DB_ULONG timestamp; int rec, fld; char *recp; SET_ENTRY *set_ptr; RECORD_ENTRY *rec_ptr; FIELD_ENTRY *fld_ptr; DB_ADDR *cm_ptr; if (nset_check(set, &set, &set_ptr, task) != S_OKAY || nfld_check(field, &rec, &fld, &rec_ptr, &fld_ptr, task) != S_OKAY) return (task->db_status); /* compound keys cannot be updated directly */ if (fld_ptr->fd_type == COMKEY) return (dberr(S_ISCOMKEY)); /* field used in compound keys cannot be updated directly */ if (fld_ptr->fd_flags & COMKEYED) return (dberr(S_COMKEY)); /* Make sure we have a current member */ if (!*(cm_ptr = &task->curr_mem[set])) return (dberr(S_NOCM)); if (check_dba(task->curr_mem[set], task) != S_OKAY) return (task->db_status); /* Read current member */ if (dio_read(*cm_ptr, (char **) &recp, PGHOLD, task) != S_OKAY) return (task->db_status); /* check out the field */ if (r_chkfld((short)fld, fld_ptr, recp, data, task) != S_OKAY) { dio_release(*cm_ptr, PGFREE, task); return (task->db_status); } /* Put data into record */ if (r_pfld((short)fld, fld_ptr, recp, data, cm_ptr, task) != S_OKAY) { dio_release(*cm_ptr, PGFREE, task); return (task->db_status); } /* check for timestamp */ if (rec_ptr->rt_flags & TIMESTAMPED) { timestamp = dio_pzgetts(rec_ptr->rt_file, task); memcpy(recp + RECUPTIME, ×tamp, sizeof(long)); } dio_write(*cm_ptr, PGFREE, task); if ((task->db_status == S_OKAY) && (rec_ptr->rt_flags & TIMESTAMPED)) task->cm_time[set] = timestamp; return (task->db_status);}/* ====================================================================== Get current set owner*/int INTERNAL_FCN dcsoget( int set, /* Set table entry */ DB_ADDR *dba, /* db address of record to become current */ DB_TASK *task, int dbn) /* database number */{ SET_ENTRY *set_ptr; if (nset_check(set, &set, (SET_ENTRY **) &set_ptr, task) == S_OKAY) { if ((*dba = task->curr_own[set]) == NULL_DBA) task->db_status = S_NOCO; } return (task->db_status);}/* ====================================================================== Read data from field of current set owner*/int INTERNAL_FCN dcsoread( int nset, /* Set constant */ long field, /* Field constant */ void *data, /* Data area to contain field contents */ DB_TASK *task, int dbn){ int fld, rec, set; int dbopen_sv; char *recp; SET_ENTRY *set_ptr; RECORD_ENTRY *rec_ptr; FIELD_ENTRY *fld_ptr; if (nset_check(nset, &set, &set_ptr, task) != S_OKAY || nfld_check(field, &rec, &fld, &rec_ptr, &fld_ptr, task) != S_OKAY) return (task->db_status); /* Make sure we have a current owner */ if (!task->curr_own[set]) return (dberr(S_NOCO)); if (check_dba(task->curr_own[set], task) != S_OKAY) return (task->db_status); /* set up to allow unlocked read */ dbopen_sv = task->dbopen; task->dbopen = 2; /* Read current owner */ dio_read(task->curr_own[set], (char **) &recp, NOPGHOLD, task); task->dbopen = dbopen_sv; if (task->db_status != S_OKAY) return (task->db_status); /* Get data from record return */ r_gfld(fld_ptr, recp, data, task); if (dio_release(task->curr_own[set], NOPGFREE, task) != S_OKAY) return (task->db_status); /* check and fetch timestamps */ if (task->db_status == S_OKAY) { if (task->db_tsrecs) dutscr(&task->co_time[set], task, dbn); if (task->db_tssets) dutscs(nset, &task->cs_time[set], task, dbn); } return (task->db_status);}/* ====================================================================== Set current set owner*/int INTERNAL_FCN dcsoset( int set, /* Set table entry */ DB_ADDR *dba, /* db address of record to become current */ DB_TASK *task, int dbn) /* database number */{ short type; char *ptr; SET_ENTRY *set_ptr; int dbopen_sv; if (nset_check(set, &set, &set_ptr, task) != S_OKAY) return (task->db_status); if (dba == NULL || *dba == NULL_DBA) task->curr_own[set] = task->curr_mem[set] = NULL_DBA; else if (check_dba(*dba, task) == S_OKAY) { /* get the record type */ /* check to make sure the record is not deleted */ dbopen_sv = task->dbopen; task->dbopen = 2; /* setup to allow unlocked read */ dio_read(*dba, (char **) &ptr, NOPGHOLD, task); task->dbopen = dbopen_sv; if (task->db_status != S_OKAY) return (task->db_status); memcpy(&type, ptr, sizeof(short)); if (dio_release(*dba, NOPGFREE, task) != S_OKAY) return (task->db_status); type &= ~RLBMASK; type += task->curr_db_table->rt_offset; if (set_ptr->st_own_rt != type) return (dberr(S_INVOWN)); task->curr_own[set] = *dba; task->curr_mem[set] = NULL_DBA; } return (task->db_status);}/* ====================================================================== Write data to a field in the current set owner*/int INTERNAL_FCN dcsowrite( int set, /* Set constant */ long field, /* Field constant */ const void *data, /* Data area to contain field contents */ DB_TASK *task, int dbn) /* database number */{ DB_ULONG timestamp; int rec, fld; char *recp; SET_ENTRY *set_ptr; RECORD_ENTRY *rec_ptr; FIELD_ENTRY *fld_ptr; DB_ADDR *co_ptr; if (nset_check(set, &set, &set_ptr, task) != S_OKAY || nfld_check(field, &rec, &fld, &rec_ptr, &fld_ptr, task) != S_OKAY) return (task->db_status); /* compound keys cannot be updated directly */ if (fld_ptr->fd_type == COMKEY) return (dberr(S_ISCOMKEY)); /* field used in compound keys cannot be updated directly */ if (fld_ptr->fd_flags & COMKEYED) return (dberr(S_COMKEY)); /* Make sure we have a current owner */ if (!*(co_ptr = &task->curr_own[set])) return (dberr(S_NOCO)); if (check_dba(task->curr_own[set], task) != S_OKAY) return (task->db_status); /* Read current owner */ if (dio_read(*co_ptr, (char **) &recp, PGHOLD, task) != S_OKAY) return (task->db_status); /* check out the field */ if (r_chkfld((short)fld, fld_ptr, recp, data, task) != S_OKAY) { dio_release(*co_ptr, PGFREE, task); return (task->db_status); } /* Put data into record */ if (r_pfld((short)fld, fld_ptr, recp, data, co_ptr, task) != S_OKAY) { dio_release(*co_ptr, PGFREE, task); return (task->db_status); } /* check for timestamp */ if (rec_ptr->rt_flags & TIMESTAMPED) { timestamp = dio_pzgetts(rec_ptr->rt_file, task); memcpy(recp + RECUPTIME, ×tamp, sizeof(long)); } dio_write(*co_ptr, PGFREE, task); if ((task->db_status == S_OKAY) && (rec_ptr->rt_flags & TIMESTAMPED)) task->co_time[set] = timestamp; return (task->db_status);}/* ====================================================================== Test timestamp status of current set*/int INTERNAL_FCN dcsstat(int set, DB_TASK *task, int dbn){ DB_ULONG dbuts; if (dutscs(set, &dbuts, task, dbn) == S_OKAY) { if (dbuts) { if (dbuts > task->cs_time[NUM2INT(set - SETMARK, st_offset)]) task->db_status = S_UPDATED; } else dberr(S_TIMESTAMP); } return (task->db_status);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?