home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* */
- /* */
- /* db_seq.c (c) 1987 Ken Harris */
- /* */
- /* */
- /****************************************************************************/
- /* */
- /* This software is made available on an AS-IS basis. Unrestricted */
- /* use is granted provided that the copywrite notice remains intack. */
- /* The author makes no warranties expressed or implied. */
- /* */
- /****************************************************************************/
-
- #include <stdio.h>
- #ifdef MSC
- #include <fcntl.h>
- #include <sys\types.h>
- #include <sys\stat.h>
- #endif
- #include "db.h"
-
- /*
- * db_add_seq - Add a record to a sequential file
- */
-
- void db_add_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- db_get_next_avail(ds, buf);
- if (db_error) return;
-
- db_add_blk = buf->buf_cur_blk;
- db_add_rec = buf->buf_rec_inx;
-
- rbuf = buf->buf_data + (buf->buf_rec_inx - 1) * fh->fh_rec_size;
-
- memcpy(rbuf+fh->fh_ctl_size, user_data, fh->fh_data_size);
-
- fh->fh_rec_cnt++;
-
- db_put_blk(ds,ds->ds_fhdr);
- db_put_blk(ds,buf);
- }
-
- /*
- * db_read_first_seq - Read First Record in a Sequential File
- */
-
- void db_read_first_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- SEQ_REC seq;
- ulong blk;
- ushort rec;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- for (blk=1; blk <= fh->fh_last_block; blk++)
- { db_get_blk(ds, blk, buf);
- if (db_error) return;
-
- rbuf = buf->buf_data;
-
- for (rec=1; rec <= fh->fh_recs_per_blk; rec++)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size,
- fh->fh_data_size);
- return;
- }
- rbuf += fh->fh_rec_size;
- }
- }
- db_error= DB_END_OF_FILE;
- }
-
- /*
- * db_read_next_seq - Read Next Record in a Sequential File
- */
-
- void db_read_next_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- SEQ_REC seq;
- ulong blk;
- ushort rec;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- db_get_blk(ds, ds->ds_prev_blk, buf);
- if (db_error) return;
-
- buf->buf_rec_inx = ds->ds_prev_rec + 1;
-
- rbuf = buf->buf_data + (buf->buf_rec_inx - 1) * fh->fh_rec_size;
-
- for (rec=buf->buf_rec_inx; rec <= fh->fh_recs_per_blk; rec++)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
- return;
- }
- rbuf += fh->fh_rec_size;
- }
-
- for (blk=buf->buf_cur_blk+1; blk <= fh->fh_last_block; blk++)
- { db_get_blk(ds, blk, buf);
- if (db_error) return;
-
- rbuf = buf->buf_data;
-
- for (rec=1; rec <= fh->fh_recs_per_blk; rec++)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size,
- fh->fh_data_size);
- return;
- }
- rbuf += fh->fh_rec_size;
- }
- }
- db_error= DB_END_OF_FILE;
- }
-
- /*
- * db_read_last_seq - Read Last Record in a Sequential File
- */
-
- void db_read_last_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- SEQ_REC seq;
- ulong blk;
- ushort rec;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- for (blk=fh->fh_last_block; blk >= 1; blk--)
- { db_get_blk(ds, blk, buf);
- if (db_error) return;
-
- rbuf = buf->buf_data + (fh->fh_recs_per_blk - 1) * fh->fh_rec_size;
-
- for (rec=fh->fh_recs_per_blk; rec >= 1; rec--)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size,
- fh->fh_data_size);
- return;
- }
- rbuf -= fh->fh_rec_size;
- }
- }
- db_error= DB_END_OF_FILE;
- }
-
- /*
- * db_read_prev_seq - Read Prev Record in a Sequential File
- */
-
- void db_read_prev_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- SEQ_REC seq;
- ulong blk;
- ushort rec;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- db_get_blk(ds, ds->ds_prev_blk, buf);
- if (db_error) return;
-
- buf->buf_rec_inx = ds->ds_prev_rec - 1;
-
- rbuf = buf->buf_data + (buf->buf_rec_inx - 1) * fh->fh_rec_size;
-
- for (rec=buf->buf_rec_inx; rec >= 1; rec--)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size, fh->fh_data_size);
- return;
- }
- rbuf -= fh->fh_rec_size;
- }
-
- for (blk=buf->buf_cur_blk-1; blk >= 1; blk--)
- { db_get_blk(ds, blk, buf);
- if (db_error) return;
-
- rbuf = buf->buf_data + (fh->fh_recs_per_blk - 1) * fh->fh_rec_size;
-
- for (rec=fh->fh_recs_per_blk; rec >= 1; rec--)
- { seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat == DB_INUSE)
- { buf->buf_rec_inx = rec;
- memcpy(user_data, rbuf+fh->fh_ctl_size,
- fh->fh_data_size);
- return;
- }
- rbuf -= fh->fh_rec_size;
- }
- }
- db_error= DB_END_OF_FILE;
- }
-
- /*
- * db_update_seq - Update Record in a Sequential File
- */
-
- void db_update_seq(ds, user_data)
- DATA_SET ds;
- char *user_data;
- {
- FILE_HDR fh;
- BUFFER buf;
- SEQ_REC seq;
- char *rbuf;
-
- db_error = 0;
-
- fh = (FILE_HDR) ds->ds_fhdr->buf_data;
- buf = ds->ds_buf;
-
- if (buf->buf_cur_blk == 0 || buf->buf_rec_inx == 0)
- { db_error = DB_NO_CURRENT_REC;
- return;
- }
-
- rbuf = buf->buf_data + (buf->buf_rec_inx - 1) * fh->fh_rec_size;
-
- seq = (SEQ_REC) rbuf;
-
- if (seq->seq_stat != DB_INUSE)
- { db_error = DB_DELETED_REC;
- return;
- }
-
- memcpy(rbuf+fh->fh_ctl_size, user_data, fh->fh_data_size);
-
- db_put_blk(ds, buf);
- }
-