📄 db_ran.c
字号:
/****************************************************************************/
/* */
/* */
/* db_ran.c v1.3 (c) 1987-1990 Ken Harris */
/* */
/* */
/****************************************************************************/
/* */
/* This software is made available on an AS-IS basis. Unrestricted */
/* use is granted provided that the copyright notice remains intact. */
/* The author makes no warranties expressed or implied. */
/* */
/****************************************************************************/
#include "dblib.h"
/*
* db_add_ran - Add a record to a random file
*/
void db_add_ran(df, user_data)
DATA_FILE df;
char *user_data;
{
FILE_HDR fh;
RANDOM_HDR rhdr, thdr;
RANDOM_REC rrec;
BUFFER buf, tmp;
short hval;
char *rbuf;
db_error = 0;
fh = (FILE_HDR) df->df_fhdr->buf_data;
buf = df->df_buf;
tmp = df->df_tmp;
rhdr = (RANDOM_HDR) buf->buf_data;
thdr = (RANDOM_HDR) tmp->buf_data;
hval = db_hash_ran(df, user_data);
db_get_blk(df, (long) hval, buf);
if (db_error) return;
if (rhdr->ran_stat != DB_INUSE)
{ db_error = DB_INVALID_RANDOM;
return;
}
if (db_search_blk_ran(df, user_data, buf))
{ db_error = DB_DUP_NOT_ALLOWED;
return;
}
while (rhdr->ran_next)
{ db_get_blk(df, (long) rhdr->ran_next, buf);
if (db_error) return;
if (db_search_blk_ran(df, user_data, buf))
{ db_error = DB_DUP_NOT_ALLOWED;
return;
}
}
tmp->buf_cur_blk = 0;
if (rhdr->ran_rec_cnt >= fh->fh_recs_per_blk)
{ buf = df->df_tmp;
tmp = df->df_buf;
df->df_buf = buf;
df->df_tmp = tmp;
rhdr = (RANDOM_HDR) buf->buf_data;
thdr = (RANDOM_HDR) tmp->buf_data;
db_get_next_avail(df, buf);
if (db_error) return;
rhdr->ran_next = 0;
thdr->ran_next = buf->buf_cur_blk;
}
rbuf = buf->buf_data + sizeof(struct db_random_uhdr)
+ rhdr->ran_rec_cnt * fh->fh_rec_size;
rrec = (RANDOM_REC) rbuf;
if (rrec->ran_stat != DB_FREE)
{ db_error = DB_INVALID_FREE;
printf("ran - free stat = %d\n", rrec->ran_stat);
return;
}
memcpy(rbuf+fh->fh_ctl_size, user_data, fh->fh_data_size);
rrec->ran_stat = DB_INUSE;
rhdr->ran_rec_cnt += 1;
db_add_blk = buf->buf_cur_blk;
db_add_rec = rhdr->ran_rec_cnt;
fh->fh_rec_cnt += 1;
db_put_blk(df, buf);
if (db_error) return;
if (tmp->buf_cur_blk)
{ db_put_blk(df, tmp);
if (db_error) return;
}
db_put_blk(df, df->df_fhdr);
}
/*
* db_find_ran - Find a Random record
*/
void db_find_ran(df, user_data, key)
DATA_FILE df;
char *user_data, *key;
{
RANDOM_HDR rhdr;
RANDOM_REC rrec;
FILE_HDR fh;
BUFFER buf;
short hval, rec;
char *rbuf;
db_error = 0;
fh = (FILE_HDR) df->df_fhdr->buf_data;
buf = df->df_buf;
rhdr = (RANDOM_HDR) buf->buf_data;
hval = db_hash_ran(df, key);
while (hval)
{ db_get_blk(df, (long)hval, buf);
if (db_error) return;
if (rec = db_search_blk_ran(df, key, buf))
{ buf->buf_rec_inx = rec;
rbuf = buf->buf_data + sizeof(struct db_random_uhdr)
+ (rec - 1) * fh->fh_rec_size;
rrec = (RANDOM_REC) rbuf;
if (rrec->ran_stat != DB_INUSE)
{ db_error = DB_INVALID_RANDOM;
return;
}
memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
return;
}
hval = rhdr->ran_next;
}
db_error = DB_REC_NOT_FOUND;
return;
}
/*
* db_read_first_ran - Read first record from a random file
*/
void db_read_first_ran(df, user_data)
DATA_FILE df;
char *user_data;
{
RANDOM_HDR rhdr;
RANDOM_REC rrec;
FILE_HDR fh;
BUFFER buf;
ulong blk;
char *rbuf;
db_error = 0;
fh = (FILE_HDR) df->df_fhdr->buf_data;
buf = df->df_buf;
rhdr = (RANDOM_HDR) buf->buf_data;
for (blk=1; blk <= fh->fh_last_block; blk++)
{ db_get_blk(df, blk, buf);
if (db_error) return;
if (rhdr->ran_stat == DB_INUSE && rhdr->ran_rec_cnt > 0)
{ buf->buf_rec_inx = 1;
rbuf = buf->buf_data + sizeof(struct db_random_uhdr);
rrec = (RANDOM_REC) rbuf;
if (rrec->ran_stat != DB_INUSE)
{ db_error = DB_INVALID_RANDOM;
return;
}
memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
return;
}
}
db_error = DB_END_OF_FILE;
return;
}
/*
* db_read_next_ran - Read next record from a random file
*/
void db_read_next_ran(df, user_data)
DATA_FILE df;
char *user_data;
{
RANDOM_HDR rhdr;
RANDOM_REC rrec;
FILE_HDR fh;
BUFFER buf;
ulong blk;
ushort rec;
char *rbuf;
db_error = 0;
fh = (FILE_HDR) df->df_fhdr->buf_data;
buf = df->df_buf;
rhdr = (RANDOM_HDR) buf->buf_data;
if (df->df_prev_rec < fh->fh_recs_per_blk)
{ blk = df->df_prev_blk;
rec = df->df_prev_rec;
}
else
{ blk = df->df_prev_blk + 1;
rec = 0;
}
for (; blk <= fh->fh_last_block; blk++, rec=0)
{ db_get_blk(df, blk, buf);
if (db_error) return;
if (rhdr->ran_stat != DB_INUSE) continue;
if (rhdr->ran_rec_cnt <= rec) continue;
buf->buf_rec_inx = rec + 1;
rbuf = buf->buf_data + sizeof(struct db_random_uhdr)
+ (buf->buf_rec_inx - 1) * fh->fh_rec_size;
rrec = (RANDOM_REC) rbuf;
if (rrec->ran_stat != DB_INUSE)
{ db_error = DB_INVALID_RANDOM;
return;
}
memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
return;
}
db_error = DB_END_OF_FILE;
return;
}
/*
* db_read_last_ran - Read last record from a random file
*/
void db_read_last_ran(df, user_data)
DATA_FILE df;
char *user_data;
{
RANDOM_HDR rhdr;
RANDOM_REC rrec;
FILE_HDR fh;
BUFFER buf;
ulong blk;
char *rbuf;
db_error = 0;
fh = (FILE_HDR) df->df_fhdr->buf_data;
buf = df->df_buf;
rhdr = (RANDOM_HDR) buf->buf_data;
for (blk=fh->fh_last_block; blk >= 1; blk--)
{ db_get_blk(df, blk, buf);
if (db_error) return;
if (rhdr->ran_stat == DB_INUSE && rhdr->ran_rec_cnt > 0)
{ buf->buf_rec_inx = rhdr->ran_rec_cnt;
rbuf = buf->buf_data + sizeof(struct db_random_uhdr)
+ (rhdr->ran_rec_cnt - 1) * fh->fh_rec_size;
rrec = (RANDOM_REC) rbuf;
if (rrec->ran_stat != DB_INUSE)
{ db_error = DB_INVALID_RANDOM;
return;
}
memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
return;
}
}
db_error = DB_END_OF_FILE;
return;
}
/*
* db_read_prev_ran - Read next record from a random file
*/
void db_read_prev_ran(df, user_data)
DATA_FILE df;
char *user_data;
{
RANDOM_HDR rhdr;
RANDOM_REC rrec;
FILE_HDR fh;
BUFFER buf;
ulong blk;
ushort rec;
char *rbuf;
db_error = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -