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 // VOID Manage(VOID) {
printf("MANAGE\n");
// populate the tables with data Add_CustomerMaster_Records(); Add_ItemMaster_Records(); Add_Transactions(); // display the orders and their items Display_CustomerOrders(); Display_OrderItems(); } // // Add_CustomerMaster_Records() // // This function adds records to table CustomerMaster from an // array of strings // VOID Add_CustomerMaster_Records(VOID) {
typedef struct {
cpTEXT number, zipcode, state, rating, name, address, city; } DATA_RECORD; DATA_RECORD data[] = {
"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" }; CTSIGNED nRecords = sizeof(data) / sizeof(DATA_RECORD); Delete_Records(recordCustMast); printf("\tAdd records in table CustomerMaster...\n");
try {
// start a transaction recordCustMast->Begin(); for (CTSIGNED i = 0; i < nRecords; i++) {
recordCustMast->Clear(); // populate record buffer with data recordCustMast->SetFieldAsString(0, data[i].number); recordCustMast->SetFieldAsString(1, data[i].zipcode); recordCustMast->SetFieldAsString(2, data[i].state); recordCustMast->SetFieldAsString(3, data[i].rating); recordCustMast->SetFieldAsString(4, data[i].name); recordCustMast->SetFieldAsString(5, data[i].address); recordCustMast->SetFieldAsString(6, data[i].city); // add record recordCustMast->Write(); } // commit transaction recordCustMast->Commit(); } catch(CTException E) {
Handle_Exception(E); } } // // Add_ItemMaster_Records() // // This function adds records to table ItemMaster from an // array of strings // VOID Add_ItemMaster_Records(VOID) {
typedef struct {
CTSIGNED weight; CTMONEY price; cpTEXT itemnum, description; } DATA_RECORD; DATA_RECORD data[] = {
{10, 1995, "1", "Hammer"},
{3, 999, "2", "Wrench"},
{4, 1659, "3", "Saw"},
{1, 398, "4", "Pliers"}
}; CTSIGNED nRecords = sizeof(data) / sizeof(DATA_RECORD); Delete_Records(recordItemMast); printf("\tAdd records in table ItemMaster...\n");
try {
// start a transaction recordItemMast->Begin(); for (CTSIGNED i = 0; i < nRecords; i++) {
recordItemMast->Clear(); // populate record buffer with data recordItemMast->SetFieldAsSigned(0, data[i].weight); recordItemMast->SetFieldAsMoney(1, data[i].price); recordItemMast->SetFieldAsString(2, data[i].itemnum); recordItemMast->SetFieldAsString(3, data[i].description); // add record recordItemMast->Write(); } // commit transaction recordItemMast->Commit(); } catch(CTException E) {
Handle_Exception(E); } } // // Delete_Records() // // This function deletes all the records in the table // VOID Delete_Records(CTRecord* record) {
CTBOOL found; printf("\tDelete records...\n");
try {
// write lock required for transaction updates record->Lock(CTLOCK_WRITE); // start a transaction record->Begin(); // read first record found = record->First(); while (found) // while records are found {
// delete record record->Delete(); // read next record found = record->Next(); } // commit transaction record->Commit(); // free locks record->Unlock(); } catch(CTException E) {
Handle_Exception(E); } } // // Add_Transactions() // // Add an Order and associated Items "as a transaction" to their // respective tables. A transaction is committed or aborted if the // customer number on the order is confirmed valid. Likewise each // item in the order is verified to be a valid item. SavePoints are // established as an order is processed, allowing a transaction to // rollback to the previously verified item // VOID Add_Transactions(VOID) {
typedef struct {
cpTEXT orderdate, promdate, ordernum, custnum; } ORDER_DATA; typedef struct {
cpTEXT ordernum; CTSIGNED seqnumber; CTSIGNED quantity; cpTEXT itemnum; } ITEM_DATA; ORDER_DATA orders[] = {
{"09/01/2002", "09/05/2002", "1", "1001"},
{"09/02/2002", "09/06/2002", "2", "9999"}, // bad customer number
{"09/22/2002", "09/26/2002", "3", "1003"}
}; ITEM_DATA items[] = {
{"1", 1, 2, "1"},
{"1", 2, 1, "2"},
{"2", 1, 1, "3"},
{"2", 2, 3, "4"},
{"3", 1, 2, "3"},
{"3", 2, 2, "99"} // bad item number
}; CTSIGNED nOrders = sizeof(orders) / sizeof(ORDER_DATA); CTSIGNED nItems = sizeof(items) / sizeof(ITEM_DATA); NINT savepoint; CTDate orderdate; CTDate promdate; CTSIGNED j = 0; Delete_Records(recordCustOrdr); Delete_Records(recordOrdrItem); printf("\tAdd transaction records... \n");
// process orders for (CTSIGNED i = 0; i < nOrders; i++) {
// start a transaction MySession->Begin(); try {
recordCustOrdr->Clear(); // populate record buffer with order data orderdate.StringToDate(orders[i].orderdate, CTDATE_MDCY); promdate.StringToDate(orders[i].promdate, CTDATE_MDCY); recordCustOrdr->SetFieldAsDate(0, orderdate); recordCustOrdr->SetFieldAsDate(1, promdate); recordCustOrdr->SetFieldAsString(2, orders[i].ordernum); recordCustOrdr->SetFieldAsString(3, orders[i].custnum); // add order record recordCustOrdr->Write(); } catch (CTException E) {
Handle_Exception(E); } // set transaction savepoint savepoint = recordCustOrdr->SetSavePoint(); // process order items while (!(strcmp(items[j].ordernum, orders[i].ordernum))) {
try {
recordOrdrItem->Clear(); // populate record buffer with order item data recordOrdrItem->SetFieldAsSigned(0, items[j].seqnumber); recordOrdrItem->SetFieldAsSigned(1, items[j].quantity); recordOrdrItem->SetFieldAsString(2, items[j].ordernum); recordOrdrItem->SetFieldAsString(3, items[j].itemnum); // add order item record recordOrdrItem->Write(); // check that item exists in ItemMaster table recordItemMast->Clear(); recordItemMast->SetFieldAsString(2, items[j].itemnum); if (!recordItemMast->Find(CTFIND_EQ)) // if not found, restore back to previous savepoint recordItemMast->RestoreSavePoint(savepoint); else // set transaction savepoint savepoint = recordItemMast->SetSavePoint(); } catch (CTException E) {
Handle_Exception(E); } // bump to next item j++; // exit the while loop on last item if (j >= nItems) break; } // check that customer exists in CustomerMaster table recordCustMast->Clear(); recordCustMast->SetFieldAsString(0, orders[i].custnum); // commit or abort the transaction if (!recordCustMast->Find(CTFIND_EQ)) recordCustMast->Abort(); else recordCustMast->Commit(); } } // // Display_CustomerOrders() // // This function displays the contents of a table. ctdbFirstRecord() and // ctdbNextRecord() fetch the record. Then each field is parsed and displayed // VOID Display_CustomerOrders(VOID) {
CTString custnumb; CTString ordrnumb; printf("\n\tCustomerOrder table...\n");
try {
// read first record if (recordCustOrdr->First()) {
do {
ordrnumb = recordCustOrdr->GetFieldAsString(2); custnumb = recordCustOrdr->GetFieldAsString(3); // display data printf("\t %s %s\n", ordrnumb.c_str(), custnumb.c_str());
} // read next record until end of file while (recordCustOrdr->Next()); } } catch (CTException E) {
Handle_Exception(E); } } // // Display_OrderItems() // // This function displays the contents of a table. ctdbFirstRecord() and // ctdbNextRecord() fetch the record. Then each field is parsed and displayed // VOID Display_OrderItems(VOID) {
CTString itemnumb; CTString ordrnumb; printf("\n\tOrderItems Table...\n");
try {
// read first record if (recordOrdrItem->First()) {
do {
// get field data from record buffer ordrnumb = recordOrdrItem->GetFieldAsString(2); itemnumb = recordOrdrItem->GetFieldAsString(3); // display data printf("\t %s %s\n", ordrnumb.c_str(), itemnumb.c_str());
} // read next record until end of file while (recordOrdrItem->Next()); } } catch (CTException E) {
Handle_Exception(E); } } |
|||