dtl


// "Example" class to hold rows from our database table

class Example

{

  public:                                        // tablename.columnname:

	int exampleInt;                         // DB_EXAMPLE.INT_VALUE

	string exampleStr;                      // DB_EXAMPLE.STRING_VALUE

	double exampleDouble;                   // DB_EXAMPLE.DOUBLE_VALUE

	long exampleLong;                       // DB_EXAMPLE.EXAMPLE_LONG

	TIMESTAMP_STRUCT exampleDate;           // DB_EXAMPLE.EXAMPLE_DATE



	Example(int exInt, const string &exStr, double exDouble, long exLong,

		const TIMESTAMP_STRUCT &exDate) :

	   exampleInt(exInt), exampleStr(exStr), exampleDouble(exDouble), exampleLong(exLong),

	   exampleDate(exDate)

	{ }



};



// Parameter object to hold parameters for dynamic SQL query below 

class ParamObjExample

{

    public:

	int lowIntValue;

	int highIntValue;

	string strValue;

	TIMESTAMP_STRUCT dateValue;

};



// Create an association between table columns and fields in our object

class BCAExampleObj

{

public:

	void operator()(BoundIOs &boundIOs, Example &rowbuf)

    	{

	   boundIOs["INT_VALUE"]	== rowbuf.exampleInt;

	   boundIOs["STRING_VALUE"]	== rowbuf.exampleStr;

	   boundIOs["DOUBLE_VALUE"]	== rowbuf.exampleDouble;

	   boundIOs["EXAMPLE_LONG"]	== rowbuf.exampleLong;

	   boundIOs["EXAMPLE_DATE"]	== rowbuf.exampleDate;

	}

};



// Create an association between query parameters and fields in our parameters object

class BPAExampleObj

{

public:

	void operator()(BoundIOs &boundIOs, ParamObjExample &paramObj)

	{

	  boundIOs[0] == paramObj.lowIntValue;

	  boundIOs[1] == paramObj.highIntValue;

	  boundIOs[2] == paramObj.strValue;

	  boundIOs[3] == paramObj.dateValue;

	}



};



// Set parameters function for Example ... used by IndexedDBView<Example> to set dynamic query parameters

// Dynamic query parameters are indicated by (?) in our query string for the IndexedDBView

void SetParamsExample(ParamObjExample &params)

{

	// set parameter values

	params.lowIntValue = 2;

	params.highIntValue = 8;

	params.strValue = "Example";

	

	TIMESTAMP_STRUCT paramDate = {2000, 1, 1, 0, 0, 0, 0};

	params.dateValue = paramDate;

}





// Example of using an IndexDBView to read, insert and update records in a container / database

void IndexedViewExample()

{

	typedef DBView<Example, ParamObjExample> DBV;



	DBV view("DB_EXAMPLE",   BCAExampleObj(), 

	  "WHERE INT_VALUE BETWEEN (?) AND (?) OR "

	  "STRING_VALUE = (?) OR EXAMPLE_DATE <= (?) ORDER BY EXAMPLE_LONG",

	  BPAExampleObj());



	IndexedDBView<DBV> indexed_view(view, "UNIQUE PrimaryIndex; STRING_VALUE; AlternateIndex; EXAMPLE_LONG, EXAMPLE_DATE", 

	  BOUND, USE_ALL_FIELDS, cb_ptr_fun(SetParamsExample));

   		



	// Find the item where the STRING_VALUE matches the string "Foozle"

	IndexedDBView<DBV>::iterator idxview_it = indexed_view.find(string("Foozle"));

		



	// Update the item with the key of "Foozle", to read "Fizzle" instead

	if (idxview_it != indexed_view.end()) {

		Example replacement;

		replacement = *idxview_it;

		replacement.exampleStr = "Fizzle";

		indexed_view.replace(idxview_it, replacement);

	}



	// Now find a second set of items using AlternateIndex

	// The STL convention for equal_range is to return a pair consisting of:  

	// 1. an iterator referring to the beginning of the list of found items

	// 2. an iterator pointing to the end of the list of found items. 

	// We will remove all items in this range.

	const TIMESTAMP_STRUCT date_criteria = {2000, 1, 1, 0, 0, 0, 0};

	long long_criteria = 33;

	pair<IndexedDBView<DBV>::iterator, IndexedDBView<DBV>::iterator> pr = 

		indexed_view.equal_range_AK ("AlternateIndex", long_criteria, date_criteria);



	idxview_it = pr.first;



	cout << "*** Size before erase calls: " << indexed_view.size() << " ***"

	     << endl;

		

	// Remove all items that match the criteria in our equal_range_AK lookup

	while (idxview_it != pr.second)

	{

		// As iterator is invalidated upon an erase(), use a

		// temporary iterator to point to DataObj to erase.

		// Increment idxview_it before we erase so it will still be valid

		// when we erase the DataObj.

		IndexedDBView<DBV>::iterator deleteMe = idxview_it;



		idxview_it++;



		indexed_view.erase(deleteMe);



	}



	cout << "*** Size after erase calls: " << indexed_view.size() << " ***"

	     << endl;





	// Finally, insert a new item into the container

	pair<IndexedDBView<DBV>::iterator, bool> ins_pr;



	ins_pr = indexed_view.insert(Example(459, "Unique String #1", 3.4, 1, date_criteria));



	cout << "insertion succeded = " << (ins_pr.second == true ? "true": "false") << endl;



}


[DTL Home]

Copyright © 2002, Michael Gradman and Corwin Joy.

Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Corwin Joy and Michael Gradman make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

SourceForge Logo

This site written using the ORB. [The ORB]