Previous Topic

Next Topic

Manage

The manage step provides data management functionality for your application and/or process.

Below is the code for Manage():

/*
 * Manage()
 *
 * Populates table and perform a simple query
 *
 */
#ifdef PROTOTYPE
VOID Manage(VOID)
#else
VOID Manage()
#endif
{
   CTDBRET  retval;
   CTSIGNED quantity;
   CTFLOAT  price, total;
   TEXT     itemnumb[5+1], custnumb[4+1], ordrnumb[6+1], custname[47+1];
   CTBOOL   isOrderFound, isItemFound;

   printf("MANAGE\n");

   /* populate the tables with data */
   Add_CustomerMaster_Records();
   Add_CustomerOrders_Records();
   Add_OrderItems_Records();
   Add_ItemMaster_Records();

   /* perform a query:
      list customer name and total amount per order

      name               total
      @@@@@@@@@@@@@      $xx.xx

      for each order in the CustomerOrders table
         fetch order number
         fetch customer number
         fetch name from CustomerMaster table based on customer number
         for each order item in OrderItems table
            fetch item quantity
            fetch item number
            fetch item price from ItemMaster table based on item number
         next
      next
   */
   printf("\n\tQuery Results\n");

   /* get the first order */
   if (ctdbFirstRecord(hRecordCustOrdr))
      Handle_Error("Manage(): ctdbFirstRecord()");

   isOrderFound = YES;
   while (isOrderFound)   /* for each order in the CustomerOrders table */
   {
      /* fetch order number */
      retval = ctdbGetFieldAsString(hRecordCustOrdr, 2, ordrnumb, sizeof(ordrnumb));
      /* fetch customer number */
      retval |= ctdbGetFieldAsString(hRecordCustOrdr, 3, custnumb, sizeof(custnumb));
      if (retval)
         Handle_Error("Manage(): ctdbGetFieldAsString()");

      /* fetch name from CustomerMaster table based on customer number */
      if (ctdbClearRecord(hRecordCustMast))
         Handle_Error("Manage(): ctdbClearRecord()");
      if (ctdbSetFieldAsString(hRecordCustMast, 0, custnumb))
         Handle_Error("Manage(): ctdbSetFieldAsString()");
      if (ctdbFindRecord(hRecordCustMast, CTFIND_EQ))
         Handle_Error("Manage(): ctdbFindRecord()");
      if (ctdbGetFieldAsString(hRecordCustMast, 4, custname, sizeof(custname)))
         Handle_Error("Manage(): ctdbGetFieldAsString()");

      /* fetch item price from OrderItems table */
      if (ctdbClearRecord(hRecordOrdrItem))
         Handle_Error("Manage(): ctdbClearRecord()");
      if (ctdbSetFieldAsString(hRecordOrdrItem, 2, ordrnumb))
         Handle_Error("Manage(): ctdbSetFieldAsString()");
      /* define a recordset to scan only items applicable to this order */
      if (ctdbRecordSetOn(hRecordOrdrItem, 6))
         Handle_Error("Manage(): ctdbRecordSetOn()");
      if (ctdbFirstRecord(hRecordOrdrItem))
         Handle_Error("Manage(): ctdbFirstRecord()");
      isItemFound = YES;

      total = 0;
      while (isItemFound)   /* for each order item in OrderItems table */
      {
         /* fetch item quantity */
         if (ctdbGetFieldAsSigned(hRecordOrdrItem, 1, &quantity))
            Handle_Error("Manage(): ctdbGetFieldAsSigned()");
         /* fetch item number */
         if (ctdbGetFieldAsString(hRecordOrdrItem, 3, itemnumb, sizeof(itemnumb)))
            Handle_Error("Manage(): ctdbGetFieldAsString()");

         /* fetch item price from ItemMaster table based on item number */
         if (ctdbClearRecord(hRecordItemMast))
            Handle_Error("Manage(): ctdbClearRecord()");
         if (ctdbSetFieldAsString(hRecordItemMast, 2, itemnumb))
            Handle_Error("Manage(): ctdbSetFieldAsString()");
         if (ctdbFindRecord(hRecordItemMast, CTFIND_EQ))
            Handle_Error("Manage(): ctdbFindRecord()");
         if (ctdbGetFieldAsFloat(hRecordItemMast, 1, &price))
            Handle_Error("Manage(): ctdbGetFieldAsFloat()");

         /* calculate order total */
         total += (price * quantity);

         /* read next record */
         retval = ctdbNextRecord(hRecordOrdrItem);
         if (retval != CTDBRET_OK)
         {
            if (retval == END_OF_FILE)
               isItemFound = NO;
            else
                 Handle_Error("Manage(): ctdbNextRecord()");
         }
      }

      ctdbRecordSetOff(hRecordOrdrItem);

      /* output data to stdout */
      printf("\t\t%-20s %.2f\n", custname, total);

      /* read next order */
      retval = ctdbNextRecord(hRecordCustOrdr);
      if (retval != CTDBRET_OK)
      {
         if (retval == END_OF_FILE)
            isOrderFound = NO;
         else
            Handle_Error("Manage(): ctdbNextRecord()");
      }
   }
}


/*
 * Add_CustomerMaster_Records()
 *
 * This function adds records to table CustomerMaster from an
 * array of strings
 */
typedef struct {
   CTSTRING number, zipcode, state, rating, name, address, city;
} CUSTOMER_DATA;

CUSTOMER_DATA data4[] = {
   "1000", "92867", "CA", "1", "Bryan Williams", "2999 Regency",      "Orange",
   "1001", "61434", "CT", "1", "Michael Jordan", "13 Main",           "Harford",
   "1002", "73677", "GA", "1", "Joshua Brown",   "4356 Cambridge",    "Atlanta",
   "1003", "10034", "MO", "1", "Keyon Dooling",  "19771 Park Avenue", "Columbia"
};

#ifdef PROTOTYPE
VOID Add_CustomerMaster_Records(VOID)
#else
VOID Add_CustomerMaster_Records()
#endif
{
   CTDBRET  retval;
   CTSIGNED i;
   CTSIGNED nRecords = sizeof(data4) / sizeof(CUSTOMER_DATA);

   if ((hRecordCustMast = ctdbAllocRecord(hTableCustMast)) == NULL)
      Handle_Error("Add_Customer_Records(): ctdbAllocRecord()");

   Delete_Records(hRecordCustMast);

   printf("\tAdd records in table CustomerMaster...\n");

   /* add records to table */
   for (i = 0; i < nRecords; i++)
   {
      /* clear record buffer */
      ctdbClearRecord(hRecordCustMast);

      retval = 0;
      /* populate record buffer with data */
      retval |= ctdbSetFieldAsString(hRecordCustMast, 0, data4[i].number);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 1, data4[i].zipcode);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 2, data4[i].state);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 3, data4[i].rating);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 4, data4[i].name);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 5, data4[i].address);
      retval |= ctdbSetFieldAsString(hRecordCustMast, 6, data4[i].city);

      if(retval)
         Handle_Error("Add_Customer_Records(): ctdbSetFieldAsString()");

      /* add record */
      if (ctdbWriteRecord(hRecordCustMast))
         Handle_Error("Add_Customer_Records(): ctdbWriteRecord()");
   }
}


/*
 * Add_CustomerOrders_Records()
 *
 * This function adds records to table CustomerOrders from an
 * array of strings
 */
typedef struct {
   CTSTRING orderdate, promisedate, ordernum, customernum;
} ORDER_DATA;

ORDER_DATA data1[] = {
   {"09/01/2002", "09/05/2002",  "1",  "1001"},
   {"09/02/2002", "09/06/2002",  "2",  "1002"}
};

#ifdef PROTOTYPE
VOID Add_CustomerOrders_Records(VOID)
#else
VOID Add_CustomerOrders_Records()
#endif
{
   CTDBRET  retval;
   CTSIGNED i;
   CTSIGNED nRecords = sizeof(data1) / sizeof(ORDER_DATA);
   CTDATE   orderdate;
   CTDATE   promisedate;


   if ((hRecordCustOrdr = ctdbAllocRecord(hTableCustOrdr)) == NULL)
      Handle_Error("Add_CustomerOrders_Records(): ctdbAllocRecord()");

   Delete_Records(hRecordCustOrdr);

   printf("\tAdd records in table CustomerOrders...\n");

   /* add records to table */
   for (i = 0; i < nRecords; i++)
   {
      /* clear record buffer */
      ctdbClearRecord(hRecordCustOrdr);

      retval = 0;
      retval |= ctdbStringToDate(data1[i].orderdate, CTDATE_MDCY ,&orderdate);
      retval |= ctdbStringToDate(data1[i].promisedate, CTDATE_MDCY, &promisedate);
      /* populate record buffer with data */
      retval |= ctdbSetFieldAsDate(hRecordCustOrdr, 0, orderdate);
      retval |= ctdbSetFieldAsDate(hRecordCustOrdr, 1, promisedate);
      retval |= ctdbSetFieldAsString(hRecordCustOrdr, 2, data1[i].ordernum);
      retval |= ctdbSetFieldAsString(hRecordCustOrdr, 3, data1[i].customernum);

      if (retval)
         Handle_Error("Add_CustomerOrders_Records(): ctdbSetFieldAsString()|ctdbSetFieldAsDate()");

      /* add record */
      if (ctdbWriteRecord(hRecordCustOrdr))
         Handle_Error("Add_CustomerOrders_Records(): ctdbWriteRecord()");
   }
}


/*
 * Add_OrderItems_Records()
 *
 * This function adds records to table OrderItems from an
 * array of strings
 */
typedef struct {
   COUNT sequencenum, quantity;
   CTSTRING ordernum, itemnum;
} ORDERITEM_DATA;

ORDERITEM_DATA data2[] = {
   {1,   2, "1",  "1"},
   {2,   1, "1",  "2"},
   {3,   1, "1",  "3"},
   {1,   3, "2",  "3"}
};

#ifdef PROTOTYPE
VOID Add_OrderItems_Records(VOID)
#else
VOID Add_OrderItems_Records()
#endif
{
   CTDBRET  retval;
   CTSIGNED i;
   CTSIGNED nRecords = sizeof(data2) / sizeof(ORDERITEM_DATA);

   if ((hRecordOrdrItem = ctdbAllocRecord(hTableOrdrItem)) == NULL)
      Handle_Error("Add_OrderItems_Records(): ctdbAllocRecord()");

   Delete_Records(hRecordOrdrItem);

   printf("\tAdd records in table OrderItems...\n");

   /* add records to table */
   for (i = 0; i < nRecords; i++)
   {
      /* clear record buffer */
      ctdbClearRecord(hRecordOrdrItem);

      retval = 0;
      /* populate record buffer with data */
      retval |= ctdbSetFieldAsSigned(hRecordOrdrItem, 0, data2[i].sequencenum);
      retval |= ctdbSetFieldAsSigned(hRecordOrdrItem, 1, data2[i].quantity);
      retval |= ctdbSetFieldAsString(hRecordOrdrItem, 2, data2[i].ordernum);
      retval |= ctdbSetFieldAsString(hRecordOrdrItem, 3, data2[i].itemnum);

      if(retval)
         Handle_Error("Add_OrderItems_Records(): ctdbSetFieldAsString()");

      /* add record */
      if (ctdbWriteRecord(hRecordOrdrItem))
         Handle_Error("Add_OrderItems_Records(): ctdbWriteRecord()");
   }
}


/*
 * Add_ItemMaster_Records()
 *
 * This function adds records to table ItemMaster from an
 * array of strings
 */
typedef struct {
   CTSIGNED weight;
   CTMONEY  price;
   CTSTRING itemnum, description;
} ITEM_DATA;

ITEM_DATA data3[] = {
   {10,  1995, "1",  "Hammer"},
   {3,   999,  "2",  "Wrench"},
   {4,   1659, "3",  "Saw"},
   {1,   398,  "4",  "Pliers"}
};

#ifdef PROTOTYPE
VOID Add_ItemMaster_Records(VOID)
#else
VOID Add_ItemMaster_Records()
#endif
{
   CTDBRET  retval;
   CTSIGNED i;
   CTSIGNED nRecords = sizeof(data3) / sizeof(ITEM_DATA);

   if ((hRecordItemMast = ctdbAllocRecord(hTableItemMast)) == NULL)
      Handle_Error("Add_ItemMaster_Records(): ctdbAllocRecord()");

   Delete_Records(hRecordItemMast);

   printf("\tAdd records in table ItemMaster...\n");

   /* add records to table */
   for (i = 0; i < nRecords; i++)
   {
      /* clear record buffer */
      ctdbClearRecord(hRecordItemMast);

      retval = 0;
      /* populate record buffer with data */
      retval |= ctdbSetFieldAsSigned(hRecordItemMast, 0, data3[i].weight);
      retval |= ctdbSetFieldAsMoney(hRecordItemMast, 1, data3[i].price);
      retval |= ctdbSetFieldAsString(hRecordItemMast, 2, data3[i].itemnum);
      retval |= ctdbSetFieldAsString(hRecordItemMast, 3, data3[i].description);

      if(retval)
         Handle_Error("Add_ItemMaster_Records(): ctdbSetFieldAsString()|ctdbSetFieldAsSigned()");

      /* add record */
      if (ctdbWriteRecord(hRecordItemMast))
         Handle_Error("Add_ItemMaster_Records(): ctdbWriteRecord()");
   }
}


/*
 * Delete_Records()
 *
 * This function deletes all the records in the table based
 * on the input parameter
 */
#ifdef PROTOTYPE
VOID Delete_Records(CTHANDLE hRecord)
#else
VOID Delete_Records(hRecord)
CTHANDLE hRecord;
#endif
{
   CTDBRET  retval;
   CTBOOL   empty;

   printf("\tDelete records...\n");

   if (ctdbClearRecord(hRecord))
      Handle_Error("Delete_Records(): ctdbClearRecord()");


   empty = NO;
   retval = ctdbFirstRecord(hRecord);
   if (retval != CTDBRET_OK)
   {
      if (retval == END_OF_FILE)
         empty = YES;
      else
         Handle_Error("Delete_Records(): ctdbFirstRecord()");
   }

   while (empty == NO) /* while table is not empty */
   {
      /* delete record */
      if (ctdbDeleteRecord(hRecord))
         Handle_Error("Delete_Records(): ctdbDeleteRecord()");

      /* read next record */
      retval = ctdbNextRecord(hRecord);
      if (retval != CTDBRET_OK)
      {
         if (retval == END_OF_FILE)
            empty = YES;
         else
            Handle_Error("Delete_Records(): ctdbNextRecord()");
      }
   }
}