Previous Topic

Next Topic

Define

The Define() step is where specific data definitions are established by your application and/or process. This involves defining columns/fields and creating the tables/files with optional indices.

Below is the code for Define():

//
// Define()
//
// Open the table, if it exists. Otherwise create and open the table
//

VOID Define(VOID)
{
   printf("DEFINE\n");

   Create_CustomerMaster_Table();
   Create_CustomerOrders_Table();
   Create_OrderItems_Table();
   Create_ItemMaster_Table();
}


//
// Create_CustomerMaster_Table()
//
// Open table CustomerMaster, if it exists. Otherwise create it
// along with its indices and open it
//

VOID Create_CustomerMaster_Table(VOID)
{
   CTBOOL   do_create = NO;

   // define table CustomerMaster
   printf("\ttable CustomerMaster\n");
   try
   {
      tableCustMast->Open("custmast", CTOPEN_NORMAL);
   }
   catch (CTException E)
   {
      // table does not exist
      do_create = YES;
   }

   if (do_create)
   {
      try
      {
         // define table fields
         CTField field1 = tableCustMast->AddField("cm_custnumb", CT_FSTRING, 4);
         tableCustMast->AddField("cm_custzipc", CT_FSTRING, 9);
         tableCustMast->AddField("cm_custstat", CT_FSTRING, 2);
         tableCustMast->AddField("cm_custratg", CT_FSTRING, 1);
         tableCustMast->AddField("cm_custname", CT_STRING, 47);
         tableCustMast->AddField("cm_custaddr", CT_STRING, 47);
         tableCustMast->AddField("cm_custcity", CT_STRING, 47);

         // define index
         CTIndex index1 = tableCustMast->AddIndex("cm_custnumb_idx", CTINDEX_FIXED, NO, NO);
         index1.AddSegment(field1, CTSEG_SCHSEG);

         // create table
         printf("\tCreate table...\n");
         tableCustMast->Create("custmast", CTCREATE_TRNLOG);

         // open table
         printf("\tOpen table...\n");
         tableCustMast->Open("custmast", CTOPEN_NORMAL);
      }
      catch (CTException E)
      {
         Handle_Exception(E);
      }
   }
   else
   {
      Check_Table_Mode(tableCustMast);

      // confirm the index exists, if not then add the index
      //
      // this scenario arises out of the fact that this table was created in tutorial 1
      // without indexes. The index is now created by the call to ctdbAlterTable

      do_create = NO;
      try
      {
         tableCustMast->GetIndex("cm_custnumb_idx");
      }
      catch (CTException E)
      {
         do_create = YES;
      }

      if (do_create)
      {
         try
         {
            CTField field1 = tableCustMast->GetField("cm_custnumb");
            CTIndex index1 = tableCustMast->AddIndex("cm_custnumb_idx", CTINDEX_FIXED, NO, NO);
            index1.AddSegment(field1, CTSEG_SCHSEG);
            tableCustMast->Alter(CTDB_ALTER_NORMAL);
         }
         catch (CTException E)
         {
            Handle_Exception(E);
         }
      }
   }
}


//
// Create_CustomerOrders_Table()
//
// Open table CustomerOrders, if it exists. Otherwise create it
// along with its indices and open it
//

VOID Create_CustomerOrders_Table(VOID)
{
   CTBOOL   do_create = NO;

   // define table CustomerOrders
   printf("\ttable CustomerOrders\n");
   try
   {
      tableCustOrdr->Open("custordr", CTOPEN_NORMAL);
   }
   catch (CTException E)
   {
      // table does not exist
      do_create = YES;
   }

   if (do_create)
   {
      try
      {
         // define table fields
         tableCustOrdr->AddField("co_ordrdate", CT_DATE, 4);
         tableCustOrdr->AddField("co_promdate", CT_DATE, 4);
         CTField field1 = tableCustOrdr->AddField("co_ordrnumb", CT_FSTRING, 6);
         CTField field2 = tableCustOrdr->AddField("co_custnumb", CT_FSTRING, 4);

         // define indices
         CTIndex index1 = tableCustOrdr->AddIndex("co_ordrnumb_idx", CTINDEX_LEADING, NO, NO);
         index1.AddSegment(field1, CTSEG_SCHSEG);
         CTIndex index2 = tableCustOrdr->AddIndex("co_custnumb_idx", CTINDEX_LEADING, YES, NO);
         index2.AddSegment(field2, CTSEG_SCHSEG);

         // create table
         printf("\tCreate table...\n");
         tableCustOrdr->Create("custordr", CTCREATE_TRNLOG);

         // open table
         printf("\tOpen table...\n");
         tableCustOrdr->Open("custordr", CTOPEN_NORMAL);
      }
      catch (CTException E)
      {
         Handle_Exception(E);
      }
   }
   else
      Check_Table_Mode(tableCustOrdr);
}


//
// Create_OrderItems_Table()
//
// Open table OrderItems, if it exists. Otherwise create it
// along with its indices and open it
//

VOID Create_OrderItems_Table(VOID)
{
   CTBOOL   do_create = NO;

   // define table OrderItems
   printf("\ttable OrderItems\n");
   try
   {
      tableOrdrItem->Open("ordritem", CTOPEN_NORMAL);
   }
   catch (CTException E)
   {
      // table does not exist
      do_create = YES;
   }

   if (do_create)
   {
      try
      {
         // define table fields
         CTField field1 = tableOrdrItem->AddField("oi_sequnumb", CT_INT2, 2);
         tableOrdrItem->AddField("oi_quantity", CT_INT2, 2);
         CTField field2 = tableOrdrItem->AddField("oi_ordrnumb", CT_FSTRING, 6);
         CTField field3 = tableOrdrItem->AddField("oi_itemnumb", CT_FSTRING, 5);

         // define indices
         CTIndex index1 = tableOrdrItem->AddIndex("oi_ordrnumb_idx", CTINDEX_LEADING, NO, NO);
         index1.AddSegment(field2, CTSEG_SCHSEG);
         index1.AddSegment(field1, CTSEG_SCHSEG);
         CTIndex index2 = tableOrdrItem->AddIndex("oi_itemnumb_idx", CTINDEX_LEADING, YES, NO);
         index2.AddSegment(field3, CTSEG_SCHSEG);

         // create table
         printf("\tCreate table...\n");
         tableOrdrItem->Create("ordritem", CTCREATE_TRNLOG);

         // open table
         printf("\tOpen table...\n");
         tableOrdrItem->Open("ordritem", CTOPEN_NORMAL);
      }
      catch (CTException E)
      {
         Handle_Exception(E);
      }
   }
   else
      Check_Table_Mode(tableOrdrItem);
}


//
// Create_ItemMaster_Table()
//
// Open table ItemMaster, if it exists. Otherwise create it
// along with its indices and open it
//

VOID Create_ItemMaster_Table(VOID)
{
   CTBOOL   do_create = NO;

   // define table ItemMaster
   printf("\ttable ItemMaster\n");
   try
   {
      tableItemMast->Open("itemmast", CTOPEN_NORMAL);
   }
   catch (CTException E)
   {
      // table does not exist
      do_create = YES;
   }

   if (do_create)
   {
      try
      {
         // define table fields
         tableItemMast->AddField("im_itemwght", CT_INT4, 4);
         tableItemMast->AddField("im_itempric", CT_MONEY, 4);
         CTField field1 = tableItemMast->AddField("im_itemnumb", CT_FSTRING, 5);
         tableItemMast->AddField("im_itemdesc", CT_STRING, 47);

         // define indices
         CTIndex index1 = tableItemMast->AddIndex("im_itemnumb_idx", CTINDEX_FIXED, NO, NO);
         index1.AddSegment(field1, CTSEG_SCHSEG);

         // create table
         printf("\tCreate table...\n");
         tableItemMast->Create("itemmast", CTCREATE_TRNLOG);

         // open table
         printf("\tOpen table...\n");
         tableItemMast->Open("itemmast", CTOPEN_NORMAL);
      }
      catch (CTException E)
      {
         Handle_Exception(E);
      }
   }
   else
      Check_Table_Mode(tableItemMast);
}


//
// Check_Table_Mode()
//
// Check if existing table has transaction processing flag enabled.
// If a table is not ready for transaction, modify the table mode to
// enable transaction processing
//

VOID Check_Table_Mode(CTTable* table)
{
   try
   {
      // get table create mode
      CTCREATE_MODE mode = table->GetCreateMode();

      // check if table is not under transaction processing control
      if (!(mode & CTCREATE_TRNLOG))
      {
         // change file mode to enable transaction processing
         mode |= CTCREATE_TRNLOG;
         table->UpdateCreateMode(mode);
      }
   }
   catch (CTException E)
   {
      Handle_Exception(E);
   }
}