Product Documentation

c-treeDB API for C++

Previous Topic

Next Topic

Manage

Manage() 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);

}

}

TOCIndex