亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flatfileold.c,v

?? Perfession Linux Programming examples
?? C,V
?? 第 1 頁 / 共 2 頁
字號:
head	1.3;
access;
symbols;
locks; strict;
comment	@ * @;


1.3
date	2000.06.25.02.09.10;	author cbbrowne;	state Exp;
branches;
next	1.2;

1.2
date	2000.06.19.06.17.58;	author cbbrowne;	state Exp;
branches;
next	1.1;

1.1
date	2000.06.09.03.41.53;	author cbbrowne;	state Exp;
branches;
next	;


desc
@@


1.3
log
@*** empty log message ***
@
text
@static int open_db_table(char *name, FILE **file_ptr, 
                         int *count_ptr, int record_size)
{
  long file_length;
  int file_records;
  FILE *file;

  /* We want to open for reading and writing, but
     create if necessary. Here we open for append
     to create if needed, then reopen as we need */
  file = fopen(name,"a+");
  if(!file)
    return DVD_ERR_NO_FILE;
  file_length = ftell(file);

  file = freopen(name, "r+", file);

  file_records = file_length/record_size;
  if(file_records * record_size != file_length)
    return DVD_ERR_BAD_TABLE;

  if(file_records == 0) {
    /* We just created the file. As we use id zero as a
       sentinel we need to reserve the first entry in the
       file, so add a dummy record here */
    file_records = 1;
  }

  *file_ptr = file;
  *count_ptr = file_records;
  return DVD_SUCCESS;
}

int dvd_open_db()
{
  /* Only open the database table once */
  if(dvd_db_ok)
    return DVD_SUCCESS;

  /*  if(open_db_table(MEMBER_FILE, &member_file, 
      &member_count, sizeof(dvd_store_member)))
      return DVD_ERR_BAD_MEMBER_TABLE; */

  if(open_db_table(TITLE_FILE, &title_file, 
                   &title_count, sizeof(dvd_title)))
    return DVD_ERR_BAD_TITLE_TABLE;

  if(open_db_table(DISK_FILE, &disk_file, 
                   &disk_count, sizeof(dvd_disk)))
    return DVD_ERR_BAD_DISK_TABLE;

  if(open_db_table(RENTAL_FILE, &rental_file, 
                   &rental_count, sizeof(dvd_rental)))
    return DVD_ERR_BAD_RENTAL_TABLE;

  if(open_db_table(RESERVE_FILE, &reserve_file, 
                   &reserve_count, sizeof(dvd_reserve)))
    return DVD_ERR_BAD_RESERVE_TABLE;

  dvd_db_ok = 1;
  return DVD_SUCCESS;
}

int dvd_close_db()
{
  /* Close the database tables
     Ought to check return result from the fclose
  */
  if(member_file) 
    fclose(member_file);
  if(title_file)
    fclose(title_file);
  if(disk_file)
    fclose(disk_file);
  dvd_db_ok = 0;
  
  return DVD_SUCCESS;
}

static int file_set(FILE *file, long file_position, int size, void *data)
{
  if(fseek(file, file_position, SEEK_SET) != 0)
    return DVD_ERR_BAD_SEEK;

  if(fwrite(data, size, 1, file) != 1)
    return DVD_ERR_BAD_WRITE;

  return DVD_SUCCESS;
}

static int file_get(FILE *file, long file_position, int size, void *data)
{
  if(fseek(file, file_position, SEEK_SET) != 0)
    return DVD_ERR_BAD_SEEK;

  if(fread(data, size, 1, file) != 1)
    return DVD_ERR_BAD_READ;

  return DVD_SUCCESS;
}
@


1.2
log
@*** empty log message ***
@
text
@d40 3
a42 3
  if(open_db_table(MEMBER_FILE, &member_file, 
                   &member_count, sizeof(dvd_store_member)))
    return DVD_ERR_BAD_MEMBER_TABLE;
@


1.1
log
@Initial revision
@
text
@a0 112
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "dvd.h"

/*

DVD Store Application Reference API Implementation

This file contains definitions of functions conforming
to the DVD Store application database APIs.

It is not intended to form the basis of a real
implementation - that will use a real database.
This implementation can be used to:
- confirm understanding of the API functionality
- allow testing to proceed at an early stage
- allow concurrent development of front and back ends

The implementation herein uses flat files to store
the data tables, one per file. A simplistic approach
is taken to data access. No thought has been given
to optimization, the code just needs to work.

All of the database files are created in the current
directory.

*/

/* Prototypes -- as in dvd.h */
/*int dvd_open_db(void);
int dvd_close_db(void);

int dvd_member_set(dvd_store_member *member_record_to_update);
int dvd_member_get(int member_id, dvd_store_member *member_record_to_complete);
int dvd_member_create(dvd_store_member *member_record_to_add, int *member_id);
int dvd_member_delete(int member_id);
int dvd_member_search(char *lname, int *result_ids[], int *count);
int dvd_member_get_id_from_number(char *member_no, int *member_id);

int dvd_title_set(dvd_title *title_record_to_update);
int dvd_title_get(int title_id, dvd_title *title_record_to_complete);
int dvd_title_create(dvd_title *title_record_to_add, int *title_id);
int dvd_title_delete(int title_id);
int dvd_title_search(char *title, char *name, int *result_ids[], int *count);

int dvd_disk_set(dvd_disk *disk_record_to_update);
int dvd_disk_get(int disk_id, dvd_disk *disk_record_to_complete);
int dvd_disk_create(dvd_disk *disk_record_to_add, int *disk_id);
int dvd_disk_delete(int disk_id);
int dvd_disk_search(int title_id, int *result_ids[], int *count);

int dvd_get_genre_list(char **genre_list[], int *count); 
int dvd_get_classification_list(char **class_list[], int *count); 
int dvd_err_text(int errno, char **message_to_show); 
int dvd_today(char **date);

int dvd_rent_title(int member_id, int title_id, int *disk_id);
int dvd_rented_disk_info(int disk_id, int *member_id, char *date_rented);
int dvd_disk_return(int disk_id, int *member_id, char *date);
int dvd_overdue_disks(char *date1, char *date2, int *disk_ids[], int *count);

int dvd_title_available(int title_id, char *date, int *count);
int dvd_reserve_title(char date[], int title_id, int member_id);
int dvd_reserve_title_cancel(int member_id);
int dvd_reserve_title_query_by_member(int member_id, int *title_id);
int dvd_reserve_title_query_by_titledate(int title_id, char *date, int *member_ids[]);
*/
/* Implementation */

/* Internal data structures for reservations and rentals */

typedef struct _reservation_struct {
  int member_id;
  int title_id;
  char date[9];
} dvd_reserve;

typedef struct _rental_struct {
  int disk_id;
  int member_id;
  char date[9];
} dvd_rental;

static int dvd_rental_set(int disk_id, dvd_rental *rental);
static int dvd_reserve_set(int member_id, dvd_reserve *reserve);

/* Database definitions */

#define MEMBER_FILE "member.dat"
static FILE *member_file = NULL;
static int member_count = 0;

#define TITLE_FILE "title.dat"
static FILE *title_file = NULL;
static int title_count = 0;

#define DISK_FILE "disk.dat"
static FILE *disk_file = NULL;
static int disk_count = 0;

#define RENTAL_FILE "rental.dat"
static FILE *rental_file = NULL;
static int rental_count = 0;

#define RESERVE_FILE "reserve.dat"
static FILE *reserve_file = NULL;
static int reserve_count = 0;

/* Helper functions to open files */

d2 1
a2 1
			 int *count_ptr, int record_size)
d10 1
a10 2
     to create if needed, then reopen as we need
  */
a33 3
/* This is a mandatory API */
static int dvd_db_ok = 0;

d41 1
a41 1
		   &member_count, sizeof(dvd_store_member)))
d45 1
a45 1
		   &title_count, sizeof(dvd_title)))
d49 1
a49 1
		   &disk_count, sizeof(dvd_disk)))
d53 1
a53 1
		   &rental_count, sizeof(dvd_rental)))
d57 1
a57 1
		   &reserve_count, sizeof(dvd_reserve)))
a99 740
}

int dvd_member_set(dvd_store_member *member_record_to_update)
{
  if(member_record_to_update == NULL)
    return DVD_ERR_NULL_POINTER;

  return 
    file_set(member_file, 
	     sizeof(dvd_store_member) * (member_record_to_update -> member_id),
	     sizeof(dvd_store_member),
	     (void *) member_record_to_update);
}

int dvd_member_get(int member_id, dvd_store_member *member_record_to_complete)
{
  int err = DVD_SUCCESS;

  if(member_record_to_complete == NULL)
    return DVD_ERR_NULL_POINTER;

  err = file_get(member_file, 
		 sizeof(dvd_store_member) * member_id,
		 sizeof(dvd_store_member),
		 (void *) member_record_to_complete);

  /* If we cannot get the member there may be an error
     with the data, or the member may not exist */
  if(err != DVD_SUCCESS)
    return err;

  /* If the retrieved member id is not as expected there
     may be an error, or the member may be deleted */
  if(member_record_to_complete -> member_id == 0)
    return DVD_ERR_NOT_FOUND;
  if(member_id != member_record_to_complete -> member_id)
    return DVD_ERR_BAD_MEMBER_TABLE;

  return DVD_SUCCESS;
}

int dvd_member_create(dvd_store_member *member_record_to_add, int *member_id)
{
  int err;
  dvd_store_member new_member;
  dvd_reserve null_reserve;

  /* Make a new member record. The caller does not need to fill-in
     the member_id or member_no fields, these will be created before
     the member record is added to the database. The new meber_id
     is returned in the output parameter member_id. This must be
     use to retrieve the new member record to discover or set the
     member_no.
  */

  /* Take a copy of the passed member, in case it is static */
  new_member = *member_record_to_add;

  /* The new member_id is the next available id */
  new_member.member_id = member_count;

  /* The new member_no (in this implementation) is 10000+id */
  sprintf(new_member.member_no, "%05d", member_count+10000);

  /* Add the new member to the member and reservations file */
  err = dvd_member_set(&new_member);
  if(err != DVD_SUCCESS)
    return err;

  memset((void *) &null_reserve, 0, sizeof(dvd_reserve));
  null_reserve.member_id = new_member.member_id;
  err = dvd_reserve_set(null_reserve.member_id, &null_reserve);
  if(err != DVD_SUCCESS)
    return err;

  /* Update member file state */
  *member_id = member_count;
  member_count++;

  return DVD_SUCCESS;
}

int dvd_member_delete(int member_id)
{
  /* Delete a member by setting the member_id to zero */
  dvd_store_member null_member;
  memset((void *)&null_member, 0, sizeof(null_member));

  return file_set(member_file, 
		  member_id * sizeof(null_member),
		  sizeof(null_member), 
		  &null_member);
}

int dvd_member_get_id_from_number(char *member_no, int *member_id)
{
  /* Search for a member by member number.
     Note that this is an case insensitive EXACT match 
     in case we ever want to use alpha member "numbers"
  */
  dvd_store_member member;
  int id = 1;
  int err;

  while(err = dvd_member_get(id, &member), 
	err == DVD_SUCCESS || err == DVD_ERR_NOT_FOUND) {
    if(err == DVD_SUCCESS &&
       strcasecmp(member_no, member.member_no) == 0) {
      *member_id = id;
      return DVD_SUCCESS;
    }
    id++;
  }
  return DVD_ERR_NOT_FOUND;
}

int dvd_member_search(char *lname, int *result_ids[], int *count)
{
  /* Search for member by surname
     Note this a case sensitive match as there is
     no case insensitive strstr!
  */
  dvd_store_member member;
  int id = 1;
  int matches = 0;
  int *results = NULL;
  int results_size = 0;
  int err; 

  *count = 0;
  while(err = dvd_member_get(id, &member),
	err == DVD_SUCCESS || err == DVD_ERR_NOT_FOUND) {
    if(err == DVD_SUCCESS &&
       strstr(member.lname, lname) != NULL &&
       member.member_id != 0) {
      /* Add a result to the list */
      /* Increase capacity if required */
      if(matches >= results_size) {
	results_size += 4;
	results = (int *)realloc(results, sizeof(int)*results_size);
	if(results == NULL)
	  return DVD_ERR_NO_MEMORY;
      }
      results[matches] = member.member_id;
      matches++;
    }
    id++;
  }
  *result_ids = results;
  *count = matches;
  return DVD_SUCCESS;
}

int dvd_title_set(dvd_title *title_record_to_update)
{
  if(title_record_to_update == NULL)
    return DVD_ERR_NULL_POINTER;

  return 
    file_set(title_file, 
	     sizeof(dvd_title) * (title_record_to_update -> title_id),
	     sizeof(dvd_title),
	     (void *) title_record_to_update);
}

int dvd_title_get(int title_id, dvd_title *title_record_to_complete)
{
  int err = DVD_SUCCESS;

  if(title_record_to_complete == NULL)
    return DVD_ERR_NULL_POINTER;

  err = file_get(title_file, 
		 sizeof(dvd_title) * title_id,
		 sizeof(dvd_title),
		 (void *) title_record_to_complete);

  /* If we cannot get the title there may be an error
     with the data, or the title may not exist */
  if(err != DVD_SUCCESS)
    return err;

  /* If the retrieved title id is not as expected there
     may be an error, or the title may be deleted */
  if(title_record_to_complete -> title_id == 0)
    return DVD_ERR_NOT_FOUND;
  if(title_id != title_record_to_complete -> title_id)
    return DVD_ERR_BAD_MEMBER_TABLE;

  return DVD_SUCCESS;
}

int dvd_title_create(dvd_title *title_record_to_add, int *title_id)
{
  int err;

  /* Make a new title record. See also notes in member_create. */

  /* Take a copy of the passed member, in case it is static */
  dvd_title new_title = *title_record_to_add;

  /* The new title_id is the next available id */
  new_title.title_id = title_count;

  /* Add the new title to the title file */
  err = dvd_title_set(&new_title);

  if(err != DVD_SUCCESS)
    return err;

  /* Update title file state */
  *title_id = title_count;
  title_count++;

  return DVD_SUCCESS;
}

int dvd_title_delete(int title_id)
{
  /* Delete a title by setting the title_id to zero */
  dvd_title null_title;
  memset((void *)&null_title, 0, sizeof(null_title));

  return file_set(title_file, 
		  title_id * sizeof(null_title),

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男女毛片无遮挡| 裸体一区二区三区| 亚洲成人av免费| 成人午夜视频在线| 欧美一区二区三区不卡| 亚洲品质自拍视频网站| 国产精品91一区二区| 日韩一区二区影院| 亚洲精品高清视频在线观看| 国产毛片精品国产一区二区三区| 欧美午夜理伦三级在线观看| 国产精品久久福利| 国产精品一区二区三区网站| 欧美精品亚洲一区二区在线播放| 成人免费在线视频观看| 国产福利一区在线| 精品国产精品网麻豆系列| 亚瑟在线精品视频| 91久久一区二区| 亚洲欧美日韩系列| 99re这里都是精品| 国产精品久久久久精k8| 成人精品一区二区三区四区| 国产区在线观看成人精品| 激情综合网av| 日韩美女视频在线| 久久精品国产网站| 精品免费视频.| 狠狠色丁香久久婷婷综合丁香| 91精品国产综合久久精品| 亚瑟在线精品视频| 欧美一区二区三区免费大片| 日本麻豆一区二区三区视频| 91精品国产一区二区三区香蕉| 丝袜诱惑制服诱惑色一区在线观看 | 日韩一区二区三区视频在线 | 一区二区三区四区在线免费观看 | 成人综合婷婷国产精品久久| 久久色.com| 成人小视频免费在线观看| 国产精品国产自产拍在线| 91在线云播放| 亚洲成av人片一区二区三区| 欧美一区二区三区系列电影| 美腿丝袜在线亚洲一区| 久久女同精品一区二区| 国产成人精品免费| 亚洲美女一区二区三区| 8x福利精品第一导航| 久久精品国产**网站演员| 久久久久国产一区二区三区四区| 成人精品一区二区三区中文字幕| 又紧又大又爽精品一区二区| 欧美久久一二区| 国产自产高清不卡| 一区二区三区国产| 日韩一级黄色大片| 国产成人免费视频一区| 夜夜夜精品看看| 欧美xxxx老人做受| 91亚洲精品久久久蜜桃网站| 视频一区国产视频| 亚洲国产精品av| 欧美日韩在线播放三区| 国产美女在线精品| 一区二区三区色| 久久综合国产精品| 日本高清免费不卡视频| 麻豆精品视频在线观看视频| 亚洲色图在线视频| 久久久久免费观看| 欧美军同video69gay| 99久久精品国产一区二区三区| 日韩成人免费看| 亚洲人成精品久久久久| 久久在线观看免费| 欧美日韩精品欧美日韩精品| 国产福利一区二区| 秋霞影院一区二区| 一区二区成人在线| 日本一二三四高清不卡| 欧美一级国产精品| 欧美视频在线观看一区| 成人激情综合网站| 久久99精品一区二区三区三区| 亚洲视频每日更新| 久久精品视频免费| 日韩色在线观看| 欧美日韩在线一区二区| 成人短视频下载| 国产一区二区三区在线观看免费| 亚洲一区二区三区在线播放| 精品91自产拍在线观看一区| 欧美日韩精品欧美日韩精品| 色呦呦一区二区三区| av电影天堂一区二区在线| 狠狠色2019综合网| 卡一卡二国产精品 | 亚洲女人小视频在线观看| 久久久夜色精品亚洲| 精品久久国产字幕高潮| 91精品啪在线观看国产60岁| 欧美三级电影一区| 欧美伊人精品成人久久综合97 | 制服丝袜国产精品| 欧美综合天天夜夜久久| 91麻豆福利精品推荐| 99精品国产一区二区三区不卡| 国v精品久久久网| 丁香亚洲综合激情啪啪综合| 国产精品一区二区黑丝| 国产黄色精品网站| 国产成人免费在线观看不卡| 国产高清精品久久久久| 国产成人在线影院 | 欧美日韩精品一区二区三区四区 | 在线不卡免费av| 777a∨成人精品桃花网| 欧美一区二区三区爱爱| 日韩一区二区三区三四区视频在线观看| 欧美区在线观看| 日韩欧美视频在线| 国产网站一区二区| 自拍偷在线精品自拍偷无码专区| 综合婷婷亚洲小说| 亚洲国产另类精品专区| 另类成人小视频在线| 国产毛片精品一区| 色综合久久88色综合天天| 欧美猛男男办公室激情| 欧美电视剧免费全集观看| 国产亚洲欧美中文| 一级中文字幕一区二区| 美女网站视频久久| 不卡的电影网站| 在线免费亚洲电影| 欧美电影免费观看高清完整版在线 | 青娱乐精品视频| 国产一区欧美二区| 色婷婷精品久久二区二区蜜臂av| 欧美日本在线一区| 国产亚洲自拍一区| 亚洲卡通欧美制服中文| 免费三级欧美电影| 成人性生交大片免费看视频在线 | 国产精品女同一区二区三区| 亚洲欧美激情在线| 精品在线观看视频| 91国产免费看| 精品国产a毛片| 亚洲激情网站免费观看| 免费在线欧美视频| 色综合天天综合网天天狠天天| 日韩亚洲欧美在线| 亚洲精品国产精华液| 国产在线一区观看| 欧美天堂亚洲电影院在线播放| 欧美电影免费观看高清完整版在线观看 | 日日骚欧美日韩| 成人午夜在线视频| 欧美成人bangbros| 亚洲天堂福利av| 国产乱码精品一区二区三区五月婷| a级精品国产片在线观看| 精品乱人伦小说| 亚洲国产视频a| 播五月开心婷婷综合| 欧美变态tickling挠脚心| 亚洲一区在线电影| 不卡一区在线观看| 欧美精品一区二区三| 午夜精品久久久久久久| 色香蕉久久蜜桃| 国产精品欧美极品| 国产精品一区二区久激情瑜伽| 精品视频一区二区不卡| 亚洲另类色综合网站| www.成人在线| 欧美韩日一区二区三区| 国产一区二区视频在线| 日韩欧美另类在线| 日日摸夜夜添夜夜添国产精品 | www精品美女久久久tv| 免费人成在线不卡| 欧美日韩视频在线观看一区二区三区| 国产精品不卡视频| 成人免费毛片高清视频| 国产三级一区二区| 国产精品性做久久久久久| 337p粉嫩大胆噜噜噜噜噜91av| 免费在线一区观看| 精品欧美一区二区久久| 久久 天天综合| 精品国产第一区二区三区观看体验 | 成人午夜精品一区二区三区| 久久综合久久久久88| 极品少妇xxxx偷拍精品少妇| 2024国产精品| 粉嫩av亚洲一区二区图片| 国产精品二三区|