git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@954 0109f412-320b-0410-ab79-c3e0c5ffbbe6
321 lines
14 KiB
C#
321 lines
14 KiB
C#
//------------------------------------------------------------------------------
|
|
// Desc: Sample program
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using xflaim;
|
|
|
|
namespace sample
|
|
{
|
|
public class Sample
|
|
{
|
|
|
|
// Some global name ids to use when creating documents.
|
|
|
|
// Namespace for all elements and attributes used in this sample program.
|
|
|
|
public const string sNamespace = "http://MyNamespace.com";
|
|
|
|
// Element and attribute names
|
|
|
|
public const string sPersonElementName = "person";
|
|
public const string sUniqueIdAttributeName = "uniqueid";
|
|
public const string sNameElementName = "Name";
|
|
public const string sGivenElementName = "Given";
|
|
public const string sSurnameElementName = "Surname";
|
|
public const string sAddressElementName = "Address";
|
|
public const string sCityElementName = "City";
|
|
public const string sStateElementName = "State";
|
|
public const string sAgeElementName = "Age";
|
|
public const string sHomePhoneElementName = "HomePhone";
|
|
public const string sCellPhoneElementName = "CellPhone";
|
|
|
|
// Name ids that correspond to the element and attribute names
|
|
|
|
public uint uiPersonElementId = 0;
|
|
public uint uiUniqueIdAttributeId = 0;
|
|
public uint uiNameElementId = 0;
|
|
public uint uiGivenElementId = 0;
|
|
public uint uiSurnameElementId = 0;
|
|
public uint uiAddressElementId = 0;
|
|
public uint uiCityElementId = 0;
|
|
public uint uiStateElementId = 0;
|
|
public uint uiAgeElementId = 0;
|
|
public uint uiHomePhoneElementId = 0;
|
|
public uint uiCellPhoneElementId = 0;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// This method opens or creates the sample database.
|
|
//-----------------------------------------------------------------------
|
|
static Db createOrOpenDatabase( DbSystem dbSystem, out bool bCreatedDatabase)
|
|
{
|
|
Db db;
|
|
string sDbName = "sample.db";
|
|
|
|
// Try to open a database. If that fails, create it. The following
|
|
// example creates the database in the current directory. However,
|
|
// a full or partial file name may be specified.
|
|
// NOTE: Multiple threads should each do their own open of the
|
|
// database and get back their own Db object.
|
|
|
|
try
|
|
{
|
|
db = dbSystem.dbOpen( sDbName, null, null, null, false);
|
|
}
|
|
catch (XFlaimException ex)
|
|
{
|
|
if (ex.getRCode() != RCODE.NE_XFLM_IO_PATH_NOT_FOUND)
|
|
{
|
|
throw ex;
|
|
}
|
|
db = dbSystem.dbCreate( sDbName, null, null, null, null, null);
|
|
bCreatedDatabase = true;
|
|
}
|
|
return( db);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Create name Ids for elements and attributes in the dictionary. If
|
|
// we did NOT create the database, simply get the name IDs from the
|
|
// dictionary. The name IDs we need to create the document illustrated in
|
|
// the createADocument method are as follows:
|
|
//
|
|
// 1. "person" element, namespace: "http://MyNamespace.com", data type: none
|
|
// 2. "uniqueid" attributet, namespace: "http://MyNamespace.com", data type: number
|
|
// 3. "Name" element, namespace: "http://MyNamespace.com", data type: none
|
|
// 4. "Given" element, namespace: "http://MyNamespace.com", data type: text
|
|
// 5. "Address" element, namespace: "http://MyNamespace.com", data type: none
|
|
// 6. "City" element, namespace: "http://MyNamespace.com", data type: text
|
|
// 7. "State" element, namespace: "http://MyNamespace.com", data type: text
|
|
// 8. "Age" element, namespace: "http://MyNamespace.com", data type: number
|
|
// 9. "HomePhone" element, namespace: "http://MyNamespace.com", data type: text
|
|
// 10. "CellPhone" element, namespace: "http://MyNamespace.com", data type: text
|
|
//-----------------------------------------------------------------------
|
|
static void createOrGetNameIds( Db db, bool bCreatedDatabase)
|
|
{
|
|
if (bCreatedDatabase)
|
|
{
|
|
|
|
// Assume that the definitions need to be created in the dictionary.
|
|
|
|
uiPersonElementId = db.createElementDef( sNamespace, sPersonElementName, FlmDataType.XFLM_NODATA_TYPE, 0);
|
|
uiUniqueIdAttributeId = db.createAttributeDef( sNamespace, sUniqueIdAttributeName, FlmDataType.XFLM_NUMBER_TYPE, 0);
|
|
uiNameElementId = db.createElementDef( sNamespace, sNameElementName, FlmDataType.XFLM_NODATA_TYPE, 0);
|
|
uiGivenElementId = db.createElementDef( sNamespace, sGivenElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
uiSurnameElementId = db.createElementDef( sNamespace, sSurnameElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
uiAddressElementId = db.createElementDef( sNamespace, sAddressElementName, FlmDataType.XFLM_NODATA_TYPE, 0);
|
|
uiCityElementId = db.createElementDef( sNamespace, sCityElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
uiStateElementId = db.createElementDef( sNamespace, sStateElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
uiAgeElementId = db.createElementDef( sNamespace, sAgeElementName, FlmDataType.XFLM_NUMBER_TYPE, 0);
|
|
uiHomePhoneElementId = db.createElementDef( sNamespace, sHomePhoneElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
uiCellPhoneElementId = db.createElementDef( sNamespace, sCellPhoneElementName, FlmDataType.XFLM_TEXT_TYPE, 0);
|
|
}
|
|
else
|
|
{
|
|
|
|
// Assume that the definitions were created when we first created the database.
|
|
|
|
uiPersonElementId = db.getElementNameId( sNamespace, sPersonElementName);
|
|
uiUniqueIdAttributeId = db.getAttributeNameId( sNamespace, sUniqueIdAttributeName);
|
|
uiNameElementId = db.getElementNameId( sNamespace, sNameElementName);
|
|
uiGivenElementId = db.getElementNameId( sNamespace, sGivenElementName);
|
|
uiSurnameElementId = db.getElementNameId( sNamespace, sSurnameElementName);
|
|
uiAddressElementId = db.getElementNameId( sNamespace, sAddressElementName);
|
|
uiCityElementId = db.getElementNameId( sNamespace, sCityElementName);
|
|
uiStateElementId = db.getElementNameId( sNamespace, sStateElementName);
|
|
uiAgeElementId = db.getElementNameId( sNamespace, sAgeElementName);
|
|
uiHomePhoneElementId = db.getElementNameId( sNamespace, sHomePhoneElementName);
|
|
uiCellPhoneElementId = db.getElementNameId( sNamespace, sCellPhoneElementName);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Create the following document:
|
|
//
|
|
// <myNamespace:person xmlns:myNamespace="http://MyNamespace.com" myNamespace:uniqueid="178442">
|
|
// <myNamespace:Name>
|
|
// <myNamespace:Given>Peter</myNamespace:Given>
|
|
// <myNamespace:Surname>Jones</myNamespace:Surname>
|
|
// </myNamespace:Name>
|
|
// <myNamespace:Address>
|
|
// <myNamespace:City>San Francisco</myNamespace:City>
|
|
// <myNamespace:State>California</myNamespace:State>
|
|
// </myNamespace:Address>
|
|
// <myNamespace:Age>37</myNamespace:Age>
|
|
// <myNamespace:HomePhone>307-888-1445</myNamespace:HomePhone>
|
|
// <myNamespace:CellPhone>307-612-1445</myNamespace:CellPhone>
|
|
// </myNamespace:person>
|
|
//
|
|
// It is assumed that the db object has already started an update transaction.
|
|
//-----------------------------------------------------------------------
|
|
static void createADocument( Db db)
|
|
{
|
|
DOMNode rootNode = null;
|
|
DOMNode parentNode = null;
|
|
DOMNode childNode = null;
|
|
|
|
// <myNamespace:person myNamespace:uniqueid="178442">
|
|
rootNode = db.createRootElement( (uint)PredefinedXFlaimCollections.XFLM_DATA_COLLECTION, uiPersonElementId);
|
|
rootNode.setAttributeValueULong( uiUniqueIdAttributeId, 178442);
|
|
|
|
// <myNamespace:Name>
|
|
parentNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiNameElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, parentNode);
|
|
|
|
// <myNamespace:Given>Peter</myNamespace:Given>
|
|
childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiGivenElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, childNode);
|
|
childNode.setString( "Peter");
|
|
|
|
// <myNamespace:Surname>Jones</myNamespace:Surname>
|
|
childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiSurnameElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode);
|
|
childNode.setString( "Jones");
|
|
|
|
// <myNamespace:Address>
|
|
parentNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiAddressElementId, eNodeInsertLoc.XFLM_LAST_CHILD, parentNode);
|
|
|
|
// <myNamespace:City>San Francisco</myNamespace:City>
|
|
childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiCityElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, childNode);
|
|
childNode.setString( "San Francisco");
|
|
|
|
// <myNamespace:State>California</myNamespace:State>
|
|
childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiStateElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode);
|
|
childNode.setString( "California");
|
|
|
|
// <myNamespace:Age>37</myNamespace:Age>
|
|
childNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiAgeElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode);
|
|
childNode.setUInt( 37);
|
|
|
|
// <myNamespace:HomePhone>307-888-1445</myNamespace:HomePhone>
|
|
childNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiHomePhoneElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode);
|
|
childNode.setString( "307-888-1445");
|
|
|
|
// <myNamespace:CellPhone>307-612-1445</myNamespace:CellPhone>
|
|
childNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiCellPhoneElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode);
|
|
childNode.setString( "307-612-1445");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Find the document that has a given name of "Peter", state of "California", and
|
|
// return the "Age" element from the document. The XPATH query is as follows:
|
|
//
|
|
// person[Name/Given == "Peter" && Address/State == "California"]/Age
|
|
//-----------------------------------------------------------------------
|
|
static DOMNode queryDatabase( Db db)
|
|
{
|
|
Query query = new Query( db, (uint)PredefinedXFlaimCollections.XFLM_DATA_COLLECTION);
|
|
|
|
// First set up the query criteria. This method calls the Query.addXXXXX methods to
|
|
// set up the query. An alternative way to set up the query criteria is to call the
|
|
// Query.setupQueryExpr method, which is not illustrated here.
|
|
|
|
// person
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiPersonElementId);
|
|
|
|
// [
|
|
query.addOperator( eQueryOperators.XFLM_LBRACKET_OP, 0);
|
|
|
|
// Name/Given
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiNameElementId);
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiGivenElementId);
|
|
|
|
// == "Peter"
|
|
query.addOperator( eQueryOperators.XFLM_EQ_OP, 0);
|
|
query.addStringValue( "Peter");
|
|
|
|
// &&
|
|
query.addOperator( eQueryOperators.XFLM_AND_OP, 0);
|
|
|
|
// Address/State
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiAddressElementId);
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiStateElementId);
|
|
|
|
// == "California"
|
|
query.addOperator( eQueryOperators.XFLM_EQ_OP, 0);
|
|
query.addStringValue( "California");
|
|
|
|
// ]
|
|
query.addOperator( eQueryOperators.XFLM_RBRACKET_OP, 0);
|
|
|
|
// /Age
|
|
query.addXPathComponent( eXPathAxisTypes.CHILD_AXIS, eDomNodeType.ELEMENT_NODE, uiAgeElementId);
|
|
|
|
|
|
// Retrieve and return the first result
|
|
|
|
return( query.getFirst( null, 0));
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Main
|
|
//-----------------------------------------------------------------------
|
|
static void Main()
|
|
{
|
|
DbSystem dbSystem;
|
|
Db db;
|
|
bool bCreatedDatabase = false;
|
|
|
|
// Must first get a DbSystem object in order to do anything with an
|
|
// XFLAIM database.
|
|
|
|
dbSystem = new DbSystem();
|
|
|
|
// Create or open the database
|
|
|
|
db = createOrOpenDatabase( dbSystem, out bCreatedDatabase);
|
|
|
|
// Start an update transaction. The timeout of 255 specifies that
|
|
// the thread should wait forever to get the database lock. A value
|
|
// of zero would specify that it should not wait. In that case, or
|
|
// for any value other than 255, the application should check to see
|
|
// if the transaction failed to start because of a lock timeout
|
|
// error. -- In general, the application will want to catch and
|
|
// check for XFlaimException exceptions. Such checking is not
|
|
// shown in the following code.
|
|
|
|
db.transBegin( eDbTransType.XFLM_UPDATE_TRANS, 255, 0);
|
|
|
|
// Create a document (see createADocument above for illustration of the document as text)
|
|
// In order to get the document, we must first get or create the needed element and
|
|
// attribute name Ids in the dictionary.
|
|
|
|
createOrGetNameIds( db, bCreatedDatabase);
|
|
|
|
// Now create the document, as illustrated above. The document is created in a collection that
|
|
// is automatically created when the database is created,
|
|
// the PredefinedXFlaimCollections.XFLM_DATA_COLLECTION
|
|
|
|
createADocument( db);
|
|
|
|
// Now we simply commit the transaction. The document we created will be committed to
|
|
// the database, and the database will be unlocked.
|
|
|
|
db.transCommit();
|
|
|
|
// Find the document that has a given name of "Peter", state of "California", and
|
|
// return the "Age" element from the document. The XPATH query is as follows:
|
|
//
|
|
// person[Name/Given == "Peter" && Address/State == "California"]/Age
|
|
|
|
DOMNode node = queryDatabase( db);
|
|
|
|
// Output the age to the console.
|
|
|
|
System.Console.WriteLine( "Age = {0}", node.getUInt());
|
|
|
|
// Navigate to the cell phone element and print it out.
|
|
|
|
for (;;)
|
|
{
|
|
node = node.getNextSibling( node);
|
|
if (node.getNameId() == uiCellPhoneElementId)
|
|
{
|
|
System.Console.WriteLine( "Cell phone = {0}", node.getString());
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|