public DatabaseAddinContentModel GetDatabaseContentModel(IDictionary<string, object> dbCommands) { var model = new DatabaseAddinContentModel(); if (dbCommands.ContainsKey("Table")) { var table = GetTableDesc(dbCommands); model.Table = table; } if (dbCommands.ContainsKey("Related")) { var relatedTable = GetRelatedTableDesc(dbCommands); model.Related = relatedTable; } return model; }
private void ProcessRelatedTableCommands(IDictionary<string, object> tableRow, DatabaseAddinContentModel dbContentModel) { var tableModel = dbContentModel.Table; var relatedTableModel = dbContentModel.Related; if (relatedTableModel != null) { db.TableName = relatedTableModel.TableName; var throughTable = relatedTableModel.Through; if (relatedTableModel.Id != null) { } else if (relatedTableModel.Uid != null) { var keyName = relatedTableModel.UidName; var keyValue = relatedTableModel.Uid; IEnumerable<dynamic> results = null; if (keyValue.GetType() == typeof(System.Collections.ArrayList)) { var whereClause = BuildInClause(keyName, keyValue); results = db.All(where: whereClause, args: keyValue.ToArray(typeof(String))); if (results.Count() != keyValue.Count) { throw new Exception("CompileError: Unknown values in related table."); } } else { results = db.All(where: string.Format("{0} = @0", keyName), args: keyValue); } // Process junction tables if (throughTable != null) { db.TableName = throughTable.TableName; foreach (var result in results) { var resultDict = (IDictionary<string, object>)result; var throughRecord = db.All( where: string.Format("{0} = @0 and {1} = @1", throughTable.IdName, throughTable.RelatedIdName), args: new[] { tableRow[tableModel.IdName], resultDict[relatedTableModel.IdName] }); if (throughRecord.Count() == 0) { IDictionary<string, object> newObj = new ExpandoObject(); newObj[throughTable.IdName] = tableRow[tableModel.IdName]; newObj[throughTable.RelatedIdName] = resultDict[relatedTableModel.IdName]; db.Insert(newObj); } else if (throughRecord.Count() == 1) { // do nothing } else { throw new Exception("MUltiple records found that match junction table record"); } } } } } }
private IDictionary<string, object> ProcessTableCommands(DatabaseAddinContentModel dbContentModel) { var tableModel = dbContentModel.Table; if (tableModel != null) { db.TableName = tableModel.TableName; IDictionary<string, object> result = null; if (!String.IsNullOrEmpty(tableModel.Id)) { result = GetOrInsertTable(db, tableModel, tableModel.IdName, tableModel.Id); if (result.ContainsKey("ID")) { result[tableModel.IdName] = result["ID"]; } mContentList.Add(result); } else if (!String.IsNullOrEmpty(dbContentModel.Table.Uid)) { Console.WriteLine("Table UidValue: {0}", dbContentModel.Table.Uid); result = GetOrInsertTable(db, tableModel, tableModel.UidName, tableModel.Uid); if (result.ContainsKey("ID")) { result[tableModel.IdName] = result["ID"]; } mContentList.Add(result); } // Check for changes to Values bool hasChanges = false; if (tableModel.Values != null) { foreach (var kv in tableModel.Values) { if (result.ContainsKey(kv.Key)) { if (!result[kv.Key].Equals(kv.Value)) { result[kv.Key] = kv.Value; hasChanges = true; } } else { result.Add(kv.Key, kv.Value); hasChanges = true; } } if (hasChanges) { db.Save(result); } } return result; } return null; }