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

📄 corbaclient.c,v

📁 Perfession Linux Programming examples
💻 C,V
📖 第 1 页 / 共 4 页
字号:
    return err;

  if(rental.member_id == 0)
    return DVD_ERR_NOT_FOUND;

  *member_id = rental.member_id;
  strcpy(date_rented, rental.date);
a700 5
/*
  To return a disk we erase the record for that disk in the rental
  table, but also return the date the disk was rented, so that the
  store owner can charge a fine if needed.
*/
d703 18
a720 55
  dvd_rental rental;
  int err;

  err = dvd_rental_get(disk_id, &rental);
  if(err != DVD_SUCCESS)
    return err;
  strcpy(date, rental.date);

  /* Clear the entry in the rental table for this disk */
  memset((void *) &rental, 0, sizeof(dvd_rental));
  rental.disk_id = disk_id;
  return dvd_rental_set(disk_id, &rental);
}

/*
  Reservations

  Another table that mirrors the member table - we allow
  each member to reserve one title at a time, for one date.

  A record is kept of titles and requested date of hire.
  We can allow only as many reservations for any one date as
  we have disks of that title.

  When a member comes into the store and tries to rent a video
  the application should check to see if the title he wants to rent
  has a reservation for today. Then the reservation must be cancelled
  before an attempt is made to rent an actual disk.
*/

int dvd_title_available(int title_id, char *date, int *count)
{
  int copies = 0;
  int disk_id, member_id;
  dvd_disk disk;
  dvd_rental rental;
  dvd_reserve reserve;
  int err;

  /* Find out how many copies of this title we have */
  for(disk_id = 1; disk_id < disk_count; disk_id++) {
    err = dvd_disk_get(disk_id, &disk);
    if(err == DVD_ERR_NOT_FOUND)
      continue;
    if(err != DVD_SUCCESS)
      return err;
    if(title_id == disk.title_id) {
      copies++;
      /* Check the rental table to disregard copies already rented */
      err = dvd_rental_get(disk_id, &rental);
      if(err != DVD_SUCCESS)
        return err;
      if(rental.member_id != 0)
        copies--;
    }
d722 3
a724 14

  /* Scan the reservation table and count the times
     this title appears at this date */
  for(member_id = 1; member_id < member_count; member_id++) {
    err = dvd_reserve_get(member_id, &reserve);
    if(err != DVD_SUCCESS)
      return err;
    if(title_id == reserve.title_id &&
       strcmp(date, reserve.date) == 0)
      copies--;
  }

  /* All done */
  *count = copies;
d730 17
a746 12
  int count;
  dvd_reserve reserve;

  reserve.member_id = member_id;
  reserve.title_id = title_id;
  strcpy(reserve.date, date);

  /* Check title is available on this date */
  if(dvd_title_available(title_id, date, &count) == DVD_SUCCESS &&
     count > 0) {
    /* Make entry in the reservation table */
    return dvd_reserve_set(member_id, &reserve);
d748 4
a751 1
  return DVD_ERR_NOT_FOUND;
d756 19
a774 5
  /* Clear out entry in the reservation table */
  dvd_reserve reserve;
  memset((void *) &reserve, 0, sizeof(dvd_reserve));
  reserve.member_id = member_id;
  return dvd_reserve_set(member_id, &reserve);
d779 21
a799 7
  /* Retrieve a reservation for this member (if any) */
  dvd_reserve reserve;
  int err;
  err = dvd_reserve_get(member_id, &reserve);
  if(err != DVD_SUCCESS)
    return err;
  *title_id = reserve.title_id;
d803 2
a804 1
int dvd_reserve_title_query_by_titledate(int title_id, char *date, int *member_ids[])
d807 1
a807 1
  /* Null date means any date */
d813 1
a813 2
  /* Scan the rental table for disks whose rented date is after date1
     and before date2. Null dates mean beginning of epoch and tomorrow */
d820 1
a820 1
  /*  cgenrelist =  DVD_TITLING_genreList__alloc(); */
d822 5
d837 5
d855 1
a855 1
  printf("Getting error... %d\n", err_number);
d857 5
d872 5
d884 1
a884 1
    g_error ("Could not bind factory for interface %s", interfacename);
d887 6
d894 3
a896 42
int Build_Factories (int argc, char *argv[]) {
  FILE *ifp; 
  char *ior;
  char filebuffer[1024];
  CORBA_exception_init(&ev);
  orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
  ifp = fopen("../server/dvd-server.ior","r");
  if( ifp == NULL ) {
    g_error("No dvd-server.ior file!");
    exit(-1);
  }
  fgets(filebuffer,1024,ifp);
  ior = g_strdup(filebuffer);
  fclose(ifp);
  dvd_client = CORBA_ORB_string_to_object(orb, ior, &ev);
  if (!dvd_client) {
    g_error("Cannot bind to %s\n", ior);
    return 1;
  }

  /* A logical extension at this point would be to insert some
     security validation, so that only those interfaces that the user
     is permitted to access are in fact set by this process. 

     We'd add an "authentication token" as an argument to each of
     these factory functions; the instantiations of interfaces would
     then fail as "needed" in that the server would refuse to return
     the interface reference. */

  membership = DVD_FACTORY_MEMBERSHIPFactory( dvd_client, &ev);
  open_factory_error(membership, "membership");
  titling = DVD_FACTORY_TITLINGFactory( dvd_client, &ev); 
  open_factory_error(titling, "titling");
  disks = DVD_FACTORY_DISKSFactory( dvd_client, &ev); 
  open_factory_error(disks, "disks");
  rental = DVD_FACTORY_RENTALFactory( dvd_client, &ev); 
  open_factory_error(rental, "rental");
  reservations = DVD_FACTORY_RESERVATIONSFactory( dvd_client, &ev); 
  open_factory_error(reservations, "reservations");
  utilities = DVD_FACTORY_UTILITIESFactory( dvd_client, &ev); 
  open_factory_error(utilities, "utilities");
  return 1;
a897 3
#ifdef LEGACY
#include "flatfileold.c"
#endif
@


1.3
log
@*** empty log message ***
@
text
@d295 1
a295 1
  DVD_TITLING_get(titling, ttlid, ttlin, &ev);
d352 1
a352 1
  DVD_TITLING_create(titling, &ctitle, &cttlid, &ev);
d389 20
a408 33
  /* Search for title in title_text, or name in director and actors
     Note this a case sensitive match as there is
     no case insensitive strstr!
  */
  dvd_title a_title;
  int id = 1;
  int matches = 0;
  int *results = NULL;
  int results_size = 0;
  int err; 

  *count = 0;
  while(err = dvd_title_get(id, &a_title),
        err == DVD_SUCCESS || err == DVD_ERR_NOT_FOUND) {
    if(err == DVD_SUCCESS && a_title.title_id != 0) {
      /* Valid record */
      if((title && strstr(a_title.title_text, title)) ||
         (name && strstr(a_title.director, name)) ||
         (name && strstr(a_title.actor1, name)) ||
         (name && strstr(a_title.actor2, name))) {
        /* 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] = a_title.title_id;
        matches++;
      }
    }
    id++;
d410 1
d412 2
a413 1
  *count = matches;
d417 1
a417 1
int dvd_disk_set(dvd_disk *disk_record_to_update)
d419 3
a421 1
  if(disk_record_to_update == NULL)
d423 12
a434 6

  return 
    file_set(disk_file, 
             sizeof(dvd_disk) * (disk_record_to_update -> disk_id),
             sizeof(dvd_disk),
             (void *) disk_record_to_update);
a439 1

@


1.2
log
@*** empty log message ***
@
text
@a37 1

a60 1
  memout= DVD_MEMBERSHIP_storemembers__alloc();
d64 1
a95 3
  /* If we cannot get the member there may be an error
     with the data, or the member may not exist */
  /* EXCEPTION SAMPLE */
d113 1
a113 1
  if(member -> member_id == 0) 
a114 3
  if(member_id != cmember->memberid)
    return (int) DVD_ERR_BAD_MEMBER_TABLE;
  
a144 1
  memout= DVD_MEMBERSHIP_storemembers__alloc();
d148 1
d178 1
d258 1
a258 1
int dvd_title_set(dvd_title *title_record_to_update)
d260 2
a261 1
  if(title_record_to_update == NULL)
d263 13
d277 7
a283 5
  return 
    file_set(title_file, 
             sizeof(dvd_title) * (title_record_to_update -> title_id),
             sizeof(dvd_title),
             (void *) title_record_to_update);
d286 1
a286 1
int dvd_title_get(int title_id, dvd_title *title_record_to_complete)
d289 2
d292 1
a292 1
  if(title_record_to_complete == NULL)
d294 15
a308 9

  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)
a309 1

d311 19
a329 6
     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;

d333 1
a333 1
int dvd_title_create(dvd_title *title_record_to_add, int *title_id)
d335 16
a350 19
  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++;
d352 6
d363 22
a384 8
  /* 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),
                  sizeof(null_title), 
                  &null_title);
@


1.1
log
@Initial revision
@
text
@d47 1
d60 4
a63 2
  DVD_MEMBERSHIP_storemembers memout;
  if(member == NULL)
d65 14
a78 14
  else {
    memout.memberid = member->member_id;
    memout.memberno = member->member_no;
    memout.title = member->title;
    memout.fname = member->fname;
    memout.lname = member->lname;
    memout.houseflatref = member->house_flat_ref;
    memout.address1 = member->address1;
    memout.address2 = member->address2;
    memout.town = member->town;
    memout.state = member->state;
    memout.phone = member->phone;
    memout.zipcode = member->zipcode;
    DVD_MEMBERSHIP_set (membership, &memout, &ev);
d80 3
a82 2
      g_error("Got CORBA exception %d from DVD_MEMBERSHIP_set", ev._major);
      return DVD_ERR_CORBA_EXCEPTION;
d90 2
a91 1
  DVD_MEMBERSHIP_storemembers *memout;
d95 1
a95 13
    DVD_MEMBERSHIP_get (membership, member_id, &memout, &ev);
    member->member_id = memout->memberid; 
    strncpy(member->member_no, memout->memberno, 6);
    strncpy(member->title, memout->title, 4);
    strncpy(member->fname, memout->fname, 26);
    strncpy(member->lname, memout->lname, 26);
    strncpy(member->house_flat_ref, memout->houseflatref, 26);
    strncpy(member->address1, memout->address1, 51);
    strncpy(member->address2, memout->address2, 51);
    strncpy(member->town, memout->town, 51);
    strncpy(member->state, memout->state, 3);
    strncpy(member->phone, memout->phone, 31);
    strncpy(member->zipcode, memout->zipcode, 11);
a96 2
  /* Need to respond to NOSUCHMEMBER */
  
d99 13
a111 3
  if (ev._major != CORBA_NO_EXCEPTION) {
    g_error("Got CORBA exception %d from DVD_MEMBERSHIP_get", ev._major);
    return DVD_ERR_CORBA_EXCEPTION;
d113 2
d117 20
a136 4
  if(member -> member_id == 0)
    return DVD_ERR_NOT_FOUND;
  if(member_id != member->member_id)
    return DVD_ERR_BAD_MEMBER_TABLE;
d140 7
d149 20
a168 20
  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 = *newrec;

  /* 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);

d170 7
a176 14
  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++;

d182 21
a202 8
  /* 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);
d207 22
a228 14
  /* 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;
a229 1
    id++;
d231 1
a231 1
  return DVD_ERR_NOT_FOUND;
d236 20
a255 29
  /* 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++;
d257 1
d259 2
a260 1
  *count = matches;
d815 1
@

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -