/// <summary> /// Creates SQLite table in the passed connection for the passed object implementing iSQLitable. /// </summary> /// <param name="sqliteConnection">The SQLiteConnection object which points to the SQLite database.</param> /// <param name="sqliteEnabledType">Type of the object being </param> /// <returns>True on success. False on failure.</returns> public static bool CreateSQLiteTable(SQLiteConnection sqliteConnection, Type sqliteEnabledType) { // Will only work with classes that are sqliteEnabledType. if (sqliteEnabledType.BaseType != typeof(SQLiteEnabled)) { return(false); } string CreateCommandText = "Create Table " + sqliteEnabledType.Name + "("; foreach (var ThisMember in sqliteEnabledType.GetMembers().Where(m => m.MemberType == System.Reflection.MemberTypes.Property).ToList()) { if (!IsPropertySQLiteEnabledSerialized(ThisMember)) { continue; } string ThisPropertyType = ThisMember.ToString().Split(' ')[0].ToUpper(); // This type mapping relies on the fact that SQLite actually has only a couple actual data types that are mapped. CreateCommandText += ThisMember.Name + " "; if (ThisPropertyType.Contains("INT")) { CreateCommandText += "INTEGER"; // This needs to read the method on the type GetPrimaryKeyFieldName(). if (ThisMember.Name == "ID") { CreateCommandText += " PRIMARY KEY AUTOINCREMENT "; } } else if (ThisPropertyType.Contains("DEC") || ThisPropertyType.Contains("DOUBLE")) { CreateCommandText += "REAL"; } else if (ThisPropertyType.Contains("STRING") || ThisPropertyType.Contains("CHAR")) { CreateCommandText += "TEXT"; } else if (ThisPropertyType.Contains("DATE")) { CreateCommandText += "DATETIME"; } else if (ThisPropertyType.Contains("BOOLEAN")) { CreateCommandText += "BOOLEAN"; } CreateCommandText += ", "; } CreateCommandText = CreateCommandText.SubstringBeforeLast(',') + ")"; var CreateCommand = sqliteConnection.CreateCommand(); CreateCommand.CommandText = CreateCommandText; return(0 <= CreateCommand.ExecuteNonQuery()); }
/// <summary> /// Updates sqliteEnabledObject in the database indicated by sqliteConnection. /// </summary> /// <param name="sqliteConnection">The SQLiteConnection object which points to the SQLite database.</param> /// <param name="sqliteEnabledObject">The SQLiteEnabled object to update.</param> /// <param name="sqliteEnabledType">The type of SQLiteEnabled object.</param> /// <returns>True on success or throws on exception.</returns> public static bool UpdateObject(SQLiteConnection sqliteConnection, dynamic sqliteEnabledObject, Type sqliteEnabledType) { var UpdateCommand = sqliteConnection.CreateCommand(); UpdateCommand.CommandText = "UPDATE " + sqliteEnabledType.Name + " SET "; // Insert all the field settings except for ID. foreach (var ThisMember in sqliteEnabledType.GetMembers().Where(m => m.MemberType == System.Reflection.MemberTypes.Property).ToList()) { if (ThisMember.Name == "ID") { continue; } if (!IsPropertySQLiteEnabledSerialized(ThisMember)) { continue; } string ThisPropertyType = ThisMember.ToString().Split(' ')[0].ToUpper(); string ThisPropertyName = ThisMember.Name; UpdateCommand.CommandText += ThisPropertyName + "="; if (ThisPropertyType.Contains("INT") || ThisPropertyType.Contains("DEC") || ThisPropertyType.Contains("DOUBLE")) { // Numeric types can put into the command. UpdateCommand.CommandText += sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).ToString(); } else if (ThisPropertyType.Contains("STRING") || ThisPropertyType.Contains("CHAR")) { // Character and DateTime types get wrapped in quotes. UpdateCommand.CommandText += "'" + sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).ToString() + "'"; } else if (ThisPropertyType.Contains("DATE")) { // DateTime types must be parsed by SQLite properly. var DateValue = sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).GetDateTimeFormats('s')[0]; UpdateCommand.CommandText += "DateTime('" + DateValue + "')"; } else if (ThisPropertyType.Contains("BOOLEAN")) { // Boolean UpdateCommand.CommandText += sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject) ? "1" : "0"; } UpdateCommand.CommandText += ", "; } UpdateCommand.CommandText = UpdateCommand.CommandText.SubstringBeforeLast(','); UpdateCommand.CommandText += " WHERE ID=" + sqliteEnabledObject.ID.ToString(); // Execute update or insert. if (0 > UpdateCommand.ExecuteNonQuery()) { throw new Exception("Error committing data"); } return(true); }
/// <summary> /// Function computes all the fields contained in the SQLiteEnabled object to a single byte array which can be stored and compared /// later to check if the object has been modified. /// </summary> /// <returns>A byte array containing the values from all the fields on the object.</returns> private byte[] ComputeByteArrayValue() { var ComputedValue = new List <byte>(); foreach (var ThisMember in this.GetType().GetMembers().Where(m => m.MemberType == System.Reflection.MemberTypes.Property).ToList()) { if (!IsPropertySQLiteEnabledSerialized(ThisMember)) { continue; } string ThisPropertyType = ThisMember.ToString().Split(' ')[0].ToUpper(); string ThisPropertyName = ThisMember.Name; if (ThisPropertyType.Contains("INT") || ThisPropertyType.Contains("DEC") || ThisPropertyType.Contains("DOUBLE")) { if (ThisPropertyType.Contains("INT")) { // 64-bit integers map to long. long Value = (long)(this.GetType().GetProperty(ThisPropertyName).GetValue(this)); ComputedValue.AddRange(BitConverter.GetBytes(Value).ToList()); } else { Double Value = (double)(this.GetType().GetProperty(ThisPropertyName).GetValue(this)); ComputedValue.AddRange(BitConverter.GetBytes(Value).ToList()); } } else if (ThisPropertyType.Contains("STRING") || ThisPropertyType.Contains("CHAR")) { foreach (char c in this.GetType().GetProperty(ThisPropertyName).GetValue(this).ToString().ToCharArray()) { ComputedValue.AddRange(BitConverter.GetBytes(c).ToList()); } } else if (ThisPropertyType.Contains("DATE")) { DateTime Value = (DateTime)(this.GetType().GetProperty(ThisPropertyName).GetValue(this)); ComputedValue.AddRange(BitConverter.GetBytes(Value.Year).ToList()); ComputedValue.AddRange(BitConverter.GetBytes(Value.Month).ToList()); ComputedValue.AddRange(BitConverter.GetBytes(Value.Day).ToList()); } else if (ThisPropertyType.Contains("BOOLEAN")) { bool Value = (bool)(this.GetType().GetProperty(ThisPropertyName).GetValue(this)); ComputedValue.AddRange(BitConverter.GetBytes(Value)); } } return(ComputedValue.ToArray()); }
private void MedKitTreeViewItem_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { var member = this.GetSelectedMember(e); if (member != null && ThisMember.Equals(member)) { if (!this.IsExpanded) { this.IsExpanded = true; } } }
PairedMembers IMemberMappingDefinition.CreateMapping(MappingDefinitionInformation mappingDefinition, Type fromClass, Type toClass) { IMember memberFrom; if (this.aFromName == null) { memberFrom = new ThisMember <TFromType>(); } else { memberFrom = new MemberFromNameParser(fromClass).ParseRead(this.aFromName); } IMember memberTo; if (this.aToName == null) { memberTo = new ThisMember <TToType>(); } else { memberTo = new MemberFromNameParser(toClass).ParseWrite(this.aToName); } IUnresolvedMapping <TFromType, TToType> mapping; if (this.aRules == null) { mapping = mappingDefinition.UnresolvedMappings.GetUnresolvedMapping <TFromType, TToType>(); } else { mapping = this.aRules.Create(mappingDefinition).AsUnresolved(); } return(new PairedMembers(memberFrom, memberTo, mapping)); }
/// <summary> /// Inserts sqliteEnabledObject into the database indicated by sqliteConnection. /// </summary> /// <param name="sqliteConnection">The SQLiteConnection object which points to the SQLite database.</param> /// <param name="sqliteEnabledObject">The SQLiteEnabled object to insert.</param> /// <param name="sqliteEnabledType">The type of SQLiteEnabled object.</param> /// <returns>True on success or throws on exception.</returns> public static bool InsertObject(SQLiteConnection sqliteConnection, dynamic sqliteEnabledObject, Type sqliteEnabledType) { var InsertCommand = sqliteConnection.CreateCommand(); InsertCommand.CommandText = "INSERT INTO " + sqliteEnabledType.Name + "("; foreach (var ThisMember in sqliteEnabledType.GetMembers().Where(m => m.MemberType == System.Reflection.MemberTypes.Property).ToList()) { if (ThisMember.Name == "ID") { continue; } if (!IsPropertySQLiteEnabledSerialized(ThisMember)) { continue; } string ThisPropertyName = ThisMember.Name; InsertCommand.CommandText += ThisPropertyName + ", "; } InsertCommand.CommandText = InsertCommand.CommandText.SubstringBeforeLast(',') + ") VALUES ("; foreach (var ThisMember in sqliteEnabledType.GetMembers().Where(m => m.MemberType == System.Reflection.MemberTypes.Property).ToList()) { if (ThisMember.Name == "ID") { continue; } if (!IsPropertySQLiteEnabledSerialized(ThisMember)) { continue; } string ThisPropertyType = ThisMember.ToString().Split(' ')[0].ToUpper(); string ThisPropertyName = ThisMember.Name; if (ThisPropertyType.Contains("INT") || ThisPropertyType.Contains("DEC") || ThisPropertyType.Contains("DOUBLE")) { // Numeric types can put into the command. InsertCommand.CommandText += sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).ToString(); } else if (ThisPropertyType.Contains("STRING") || ThisPropertyType.Contains("CHAR")) { // Character and DateTime types get wrapped in quotes. InsertCommand.CommandText += "'" + sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).ToString() + "'"; } else if (ThisPropertyType.Contains("DATE")) { // DateTime types must be parsed by SQLite properly. var DateValue = sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject).GetDateTimeFormats('s')[0]; InsertCommand.CommandText += "DateTime('" + DateValue + "')"; } else if (ThisPropertyType.Contains("BOOLEAN")) { InsertCommand.CommandText += sqliteEnabledType.GetProperty(ThisPropertyName).GetValue(sqliteEnabledObject) ? "1" : "0"; } InsertCommand.CommandText += ", "; } InsertCommand.CommandText = InsertCommand.CommandText.SubstringBeforeLast(',') + ")"; // Execute update or insert. if (0 > InsertCommand.ExecuteNonQuery()) { throw new Exception("Error committing data"); } // Read back inserted id. var SelectCommand = sqliteConnection.CreateCommand(); SelectCommand.CommandText = "SELECT ID FROM " + sqliteEnabledType.Name + " ORDER BY ID DESC LIMIT 1"; var SQLiteReader = SelectCommand.ExecuteReader(); if (SQLiteReader.Read()) { sqliteEnabledObject.ID = (Int64)SQLiteReader["ID"]; } else { throw new Exception("Error getting last inserted id."); } return(true); }