⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_ran.c

📁 数据库C语言开发工具包,可以方便地移植到嵌入式系统中
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
/*                                                                          */
/*                                                                          */
/*      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 + -