diff --git a/xflaim/csharp/sample/sample.cs b/xflaim/csharp/sample/sample.cs new file mode 100644 index 0000000..d4991f3 --- /dev/null +++ b/xflaim/csharp/sample/sample.cs @@ -0,0 +1,320 @@ +//------------------------------------------------------------------------------ +// 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: + // + // + // + // Peter + // Jones + // + // + // San Francisco + // California + // + // 37 + // 307-888-1445 + // 307-612-1445 + // + // + // 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; + + // + rootNode = db.createRootElement( (uint)PredefinedXFlaimCollections.XFLM_DATA_COLLECTION, uiPersonElementId); + rootNode.setAttributeValueULong( uiUniqueIdAttributeId, 178442); + + // + parentNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiNameElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, parentNode); + + // Peter + childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiGivenElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, childNode); + childNode.setString( "Peter"); + + // Jones + childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiSurnameElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode); + childNode.setString( "Jones"); + + // + parentNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiAddressElementId, eNodeInsertLoc.XFLM_LAST_CHILD, parentNode); + + // San Francisco + childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiCityElementId, eNodeInsertLoc.XFLM_FIRST_CHILD, childNode); + childNode.setString( "San Francisco"); + + // California + childNode = parentNode.createNode( eDomNodeType.ELEMENT_NODE, uiStateElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode); + childNode.setString( "California"); + + // 37 + childNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiAgeElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode); + childNode.setUInt( 37); + + // 307-888-1445 + childNode = rootNode.createNode( eDomNodeType.ELEMENT_NODE, uiHomePhoneElementId, eNodeInsertLoc.XFLM_LAST_CHILD, childNode); + childNode.setString( "307-888-1445"); + + // 307-612-1445 + 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; + } + } + + } + } +}