/// <summary> /// 按照目录分页获取指定节点、本体的数据 /// <remarks> /// 如果传入的目录为空则表示获取全部目录的数据 /// </remarks> /// </summary> /// <param name="ontology"></param> /// <param name="selectElements"></param> /// <param name="filters">过滤器列表</param> /// <param name="pagingData"></param> /// <returns></returns> public DataTuple GetPlist( OntologyDescriptor ontology, OrderedElementSet selectElements, List <FilterData> filters, PagingInput pagingData) { return(this.GetPlistInfoItems( ontology, this.GetEntityDb(ontology), selectElements, filters, pagingData)); }
/// <summary> /// 转换为数据传输对象。 /// </summary> /// <param name="ontology"></param> /// <returns></returns> public static OntologyData ToOntologyData(this OntologyDescriptor ontology) { if (ontology == null) { return(null); } var ontologyData = new OntologyData() { Code = ontology.Ontology.Code, Name = ontology.Ontology.Name, IsSystem = ontology.Ontology.IsSystem }; if (ontology.Actions != null && ontology.Actions.Count > 0) { foreach (var item in ontology.Actions.Values.OrderBy(a => a.Verb)) { ontologyData.Actions.Add(new ActionData { Verb = item.Verb, Name = item.Name }); } } if (ontology.Elements != null && ontology.Elements.Count > 0) { foreach (var item in ontology.Elements.Values.OrderBy(a => a.Element.SortCode)) { if (!item.IsRuntimeElement) { InfoDicState infoDic = null; if (item.Element.InfoDicId.HasValue) { ontology.Host.NodeHost.InfoDics.TryGetInfoDic(item.Element.InfoDicId.Value, out infoDic); } var infoDicCode = infoDic == null ? "" : infoDic.Code; var infoDicName = infoDic == null ? "" : infoDic.Name; var serializableElement = new ElementData() { Name = item.Element.Name, Key = item.Element.Code, Nullable = item.Element.Nullable, MaxLength = item.Element.MaxLength, OType = item.Element.OType, ValueDic = infoDicCode, IsEnabled = item.Element.IsEnabled }; ontologyData.Elements.Add(serializableElement); } } } return(ontologyData); }
/// <summary> /// /// </summary> /// <param name = "actionType"></param> /// <param name="ontology"></param> /// <param name="isDumb"></param> /// <param name="client"></param> /// <param name="commandId"></param> /// <param name="localEntityId"></param> /// <param name="infoValue"></param> internal DbCmd(DbActionType actionType, OntologyDescriptor ontology, bool isDumb, NodeDescriptor client, string commandId, string localEntityId, InfoItem[] infoValue) { this.ActionType = actionType; this.Ontology = ontology; this.IsDumb = isDumb; this.Client = client; this.CommandId = commandId; this.LocalEntityId = localEntityId; this.InfoValue = infoValue; }
/// <summary> /// /// </summary> /// <param name = "actionType"></param> /// <param name="ontology"></param> /// <param name="isDumb"></param> /// <param name="client"></param> /// <param name="commandId"></param> /// <param name="localEntityId"></param> /// <param name="infoValue"></param> internal DbCmd(DbActionType actionType, OntologyDescriptor ontology, bool isDumb, NodeDescriptor client, string commandId, string localEntityId, InfoItem[] infoValue) { this.ActionType = actionType; this.Ontology = ontology; this.IsDumb = isDumb; this.Client = client; this.CommandId = commandId; this.LocalEntityId = localEntityId; this.InfoValue = infoValue; }
/// <summary> /// 保存命令事件 /// </summary> /// <param name="ontology"></param> /// <param name="command"></param> public ProcessResult SaveCommand(OntologyDescriptor ontology, MessageEntity command) { if (ontology == null) { return(new ProcessResult(new ArgumentNullException("ontology", "ontology参数为null"))); } if (command == null) { return(new ProcessResult(new ArgumentNullException("command"))); } return(this.SaveCommands(ontology, new MessageEntity[] { command })); }
private static InfoItem GetProperty(OntologyDescriptor ontology, string propertyCode, string value) { if (propertyCode.Equals(ontology.Ontology.Code + "Id", System.StringComparison.OrdinalIgnoreCase)) { propertyCode = "Id"; } ElementDescriptor element; if (!ontology.Elements.TryGetValue(propertyCode, out element)) { throw new AnycmdException("意外的" + ontology.Ontology.Name + "实体属性编码" + propertyCode); } return InfoItem.Create(element, value); }
public ManagedObject(OntologyDescriptor ontology, InfoItem[] entity, InfoItem[] inputValues) { if (ontology == null) { throw new ArgumentNullException("ontology"); } if (entity == null) { throw new ArgumentNullException("entity"); } this.Ontology = ontology; this.Entity = entity; this.InputValues = inputValues; }
private static InfoItem GetProperty(OntologyDescriptor ontology, string propertyCode, string value) { if (propertyCode.Equals(ontology.Ontology.Code + "Id", System.StringComparison.OrdinalIgnoreCase)) { propertyCode = "Id"; } ElementDescriptor element; if (!ontology.Elements.TryGetValue(propertyCode, out element)) { throw new AnycmdException("意外的" + ontology.Ontology.Name + "实体属性编码" + propertyCode); } return(InfoItem.Create(element, value)); }
/// <summary> /// 获取给定本体码和存储标识的本节点的数据 /// <remarks>本节点通常是中心节点</remarks> /// </summary> /// <param name="ontology">本体</param> /// <param name="localEntityId"></param> /// <param name="selectElements"></param> /// <returns>数据记录,表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值</returns> public InfoItem[] Get( OntologyDescriptor ontology, string localEntityId, OrderedElementSet selectElements) { var topTwo = GetTopTwo(ontology, new InfoItem[] { InfoItem.Create(ontology.IdElement, localEntityId) }, selectElements); if (topTwo.BothHasValue || topTwo.BothNoValue) { return(new InfoItem[0]); } else { return(topTwo.SingleInfoTuple); } }
public ManagedObject(OntologyDescriptor ontology, InfoItem[] entity, InfoItem[] inputValues) { if (ontology == null) { throw new ArgumentNullException("ontology"); } if (entity == null) { throw new ArgumentNullException("entity"); } this.Ontology = ontology; this.Entity = entity; this.InputValues = inputValues; }
public MessageEntity GetCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id) { var db = this.GetCommandDb(ontology); var queryString = @"select * from " + GetTableName(commandType) + " as a where a.Id=@Id"; using (var reader = db.ExecuteReader(queryString, CreateParameter(db, "Id", id, DbType.Guid))) { if (reader.Read()) { return(CommandRecord.Create(ontology.Host, commandType, reader)); } } return(null); }
/// <summary> /// 分页查询命令展示对象 /// </summary> /// <typeparam name="T">命令展示模型类型参数</typeparam> /// <param name="messageProvider">命令提供程序</param> /// <param name="messageTypeKind"></param> /// <param name="ontology">本体</param> /// <param name="catalogCode">目录码</param> /// <param name="actionCode">动作码,空值表示忽略本查询条件</param> /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param> /// <param name="localEntityId"></param> /// <param name="pageIndex">页索引</param> /// <param name="pageSize">页尺寸</param> /// <param name="sortField">排序字段</param> /// <param name="sortOrder">排序方向</param> /// <param name="total"></param> /// <returns></returns> public static IList<MessageTr> GetPlistCommandTrs( this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, string catalogCode, string actionCode , Guid? nodeId, string localEntityId, int pageIndex, int pageSize , string sortField, string sortOrder, out Int64 total) { IList<MessageEntity> commands = messageProvider.GetPlistCommands(messageTypeKind, ontology, catalogCode, actionCode, nodeId, localEntityId, pageIndex, pageSize , sortField, sortOrder, out total); IList<MessageTr> list = new List<MessageTr>(); foreach (var command in commands) { list.Add(MessageTr.Create(ontology.Host, command)); } return list; }
/// <summary> /// 分页查询命令展示对象 /// </summary> /// <typeparam name="T">命令展示模型类型参数</typeparam> /// <param name="messageProvider">命令提供程序</param> /// <param name="messageTypeKind"></param> /// <param name="ontology">本体</param> /// <param name="catalogCode">目录码</param> /// <param name="actionCode">动作码,空值表示忽略本查询条件</param> /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param> /// <param name="localEntityId"></param> /// <param name="pageIndex">页索引</param> /// <param name="pageSize">页尺寸</param> /// <param name="sortField">排序字段</param> /// <param name="sortOrder">排序方向</param> /// <param name="total"></param> /// <returns></returns> public static IList <MessageTr> GetPlistCommandTrs( this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, string catalogCode, string actionCode , Guid?nodeId, string localEntityId, int pageIndex, int pageSize , string sortField, string sortOrder, out Int64 total) { IList <MessageEntity> commands = messageProvider.GetPlistCommands(messageTypeKind, ontology, catalogCode, actionCode, nodeId, localEntityId, pageIndex, pageSize , sortField, sortOrder, out total); IList <MessageTr> list = new List <MessageTr>(); foreach (var command in commands) { list.Add(MessageTr.Create(ontology.Host, command)); } return(list); }
/// <summary> /// /// </summary> public Sql(OntologyDescriptor ontology, string clientId, string commandId, DbActionType actionType, string localEntityId, InfoItem[] infoValue, Func <DbParameter> createParameter) { this._ontology = ontology; this._localEntityId = localEntityId; this._infoValue = infoValue; this._clientId = clientId; this._commandId = commandId; this._createParameter = createParameter; if (ontology == null || string.IsNullOrEmpty(localEntityId)) { this.IsValid = false; this.Description = "命令信息标识或信息值为空或本体为空或本地标识为空"; throw new ArgumentNullException("command"); } // 无需把switch流程选择逻辑重构掉,因为actionType枚举不存在变化 switch (actionType) { case DbActionType.Insert: if (infoValue == null || infoValue.Length == 0) { this.Description = "命令信息值为空"; break; } BuildInsertSql(); break; case DbActionType.Update: if (infoValue == null || infoValue.Length == 0) { this.Description = "命令信息值为空"; break; } BuildUpdateSql(); break; case DbActionType.Delete: BuildDeleteSql(); break; default: this.IsValid = false; this.Description = "意外的不能执行的动作码" + actionType.ToString(); break; } }
/// <summary> /// /// </summary> /// <param name="html"></param> /// <param name="ontology"></param> /// <returns></returns> public static IHtmlString ActionsJsonArray(this HtmlHelper html, OntologyDescriptor ontology) { var sb = new StringBuilder(); sb.Append("["); var l = sb.Length; foreach (var action in ontology.Actions) { if (sb.Length != l) { sb.Append(","); } sb.Append("{code:'").Append(action.Key) .Append("',name:'").Append(action.Key).Append(" | ").Append(action.Value.Name).Append("'}"); } sb.Append("]"); return html.Raw(sb.ToString()); }
/// <summary> /// /// </summary> private RdbDescriptor GetCommandDb(OntologyDescriptor ontology) { if (!_dbDic.ContainsKey(ontology)) { lock (_locker) { if (!_dbDic.ContainsKey(ontology)) { RdbDescriptor db; if (!ontology.Host.RdbSet.TryDb(ontology.Ontology.MessageDatabaseId, out db)) { throw new GeneralException("意外的数据库Id" + ontology.Ontology.MessageDatabaseId.ToString()); } _dbDic.Add(ontology, db); } } } return(_dbDic[ontology]); }
/// <summary> /// /// </summary> private RdbDescriptor GetEntityDb(OntologyDescriptor ontology) { if (!DbDic.ContainsKey(ontology)) { lock (Locker) { if (!DbDic.ContainsKey(ontology)) { RdbDescriptor db; if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.EntityDatabaseId, out db)) { throw new AnycmdException("意外的数据库Id" + ontology.Ontology.EntityDatabaseId.ToString()); } DbDic.Add(ontology, db); } } } return(DbDic[ontology]); }
private RdbDescriptor GetArchiveDb(OntologyDescriptor ontology, IArchive archive) { var entityDb = this.GetEntityDb(ontology).Database; var catalogName = string.Format( "Archive{0}{1}_{2}", ontology.Ontology.Code, archive.ArchiveOn.ToString("yyyyMMdd"), archive.NumberId.ToString()); var datasource = archive.DataSource; var userId = archive.UserId; var password = archive.Password; if (string.IsNullOrEmpty(datasource)) { datasource = entityDb.DataSource; } if (string.IsNullOrEmpty(userId)) { userId = entityDb.UserId; } if (string.IsNullOrEmpty(password)) { password = entityDb.Password; } return(new RdbDescriptor(ontology.Host, new RDatabase { CatalogName = catalogName, CreateBy = archive.CreateBy, CreateOn = DateTime.Now, CreateUserId = archive.CreateUserId, DataSource = datasource, Description = ontology.Ontology.Name + "归档", Id = Guid.NewGuid(), IsTemplate = false, Password = password, Profile = entityDb.Profile, ProviderName = entityDb.ProviderName, RdbmsType = archive.RdbmsType, UserId = userId })); }
/// <summary> /// /// </summary> /// <param name="html"></param> /// <param name="ontology"></param> /// <returns></returns> public static IHtmlString ActionsJsonArray(this HtmlHelper html, OntologyDescriptor ontology) { var sb = new StringBuilder(); sb.Append("["); var l = sb.Length; foreach (var action in ontology.Actions) { if (sb.Length != l) { sb.Append(","); } sb.Append("{code:'").Append(action.Key) .Append("',name:'").Append(action.Key).Append(" | ").Append(action.Value.Name).Append("'}"); } sb.Append("]"); return(html.Raw(sb.ToString())); }
/// <summary> /// /// </summary> /// <param name="ontology"></param> /// <param name="archive"></param> public void Archive(OntologyDescriptor ontology, IArchive archive) { var entityDb = this.GetEntityDb(ontology).Database; var archiveDb = this.GetArchiveDb(ontology, archive); if (archiveDb.Database.CatalogName.Equals(entityDb.CatalogName, StringComparison.OrdinalIgnoreCase)) { throw new AnycmdException("归档库的数据库名不能与本体库相同"); } // 创建归档库 archiveDb.Create(this.GetEntityDb(ontology), ontology.Host.Config.EntityArchivePath); string archiveTableName = string.Format( "{0}.{1}.{2}", archiveDb.Database.CatalogName, ontology.Ontology.EntitySchemaName, ontology.Ontology.EntityTableName); string sql = @"if OBJECT_ID('" + archiveTableName + "') IS NULL select * into " + archiveTableName + " from " + ontology.Ontology.EntityTableName; // 执行select into归档数据 this.GetEntityDb(ontology).ExecuteNonQuery(sql, null); }
/// <summary> /// 获取给定本体码和存储标识的本节点的数据 /// <remarks>本节点通常是中心节点</remarks> /// </summary> /// <param name="ontology">本体</param> /// <param name="localEntityId"></param> /// <param name="selectElements"></param> /// <returns>数据记录,表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值</returns> public InfoItem[] Get( OntologyDescriptor ontology, string localEntityId, OrderedElementSet selectElements) { var topTwo = GetTopTwo(ontology, new InfoItem[] { InfoItem.Create(ontology.IdElement, localEntityId) }, selectElements); if (topTwo.BothHasValue || topTwo.BothNoValue) { return new InfoItem[0]; } else { return topTwo.SingleInfoTuple; } }
/// <summary> /// 根据给定的本体码和信息标识获取本节点两条数据 /// </summary> /// <param name="ontology">本体</param> /// <param name="db"></param> /// <param name="infoIds">多列联合信息标识字典,键必须不区分大小写</param> /// <param name="selectElements">选择元素</param> /// <returns></returns> private TowInfoTuple GetTop2InfoItemSet(OntologyDescriptor ontology, RdbDescriptor db, IEnumerable <InfoItem> infoIds, OrderedElementSet selectElements) { if (infoIds == null || !infoIds.Any()) { return(new TowInfoTuple(null, null)); } var sb = new StringBuilder(); var sqlParameters = new List <DbParameter>(); var elementList = selectElements.ToList(); sb.Append("select top 2 "); int l = sb.Length; foreach (var element in elementList) { if (sb.Length != l) { sb.Append(","); } sb.Append("t.[").Append(element.Element.FieldCode).Append("]"); } sb.Append(" from [").Append(ontology.Ontology.EntityTableName).Append("] as t where"); if (ontology.Ontology.IsLogicalDeletionEntity) { sb.Append(" t.DeletionStateCode=0 "); } else { sb.Append(" 1=1 "); } foreach (var element in infoIds) { sb.Append(" and t.[").Append(element.Element.Element.FieldCode) .Append("]=").Append("@").Append(element.Element.Element.FieldCode); object obj = element.Value; if (obj == null) { obj = DBNull.Value; } sqlParameters.Add(CreateParameter(db, element.Element.Element.FieldCode, obj, DbType.String)); } var infoValue1 = new List <InfoItem>(); var infoValue2 = new List <InfoItem>(); using (var reader = db.ExecuteReader(sb.ToString(), sqlParameters.ToArray())) { if (reader.Read()) { for (int i = 0; i < elementList.Count; i++) { infoValue1.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString())); } } if (reader.Read()) { for (int i = 0; i < elementList.Count; i++) { infoValue2.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString())); } } reader.Close(); } return(new TowInfoTuple(infoValue1.ToArray(), infoValue2.ToArray())); }
/// <summary> /// 获取给定实体标识列表中的标识标识的每一个实体元组 /// </summary> /// <param name="ontology"></param> /// <param name="selectElements"></param> /// <param name="entityIDs"></param> /// <returns></returns> public DataTuple GetList(OntologyDescriptor ontology, OrderedElementSet selectElements, List <string> entityIDs) { if (ontology == null) { throw new ArgumentNullException("ontology"); } if (selectElements == null) { throw new ArgumentNullException("selectElements"); } if (entityIDs == null || entityIDs.Count == 0) { throw new ArgumentException("entityId"); } var ids = new StringBuilder("("); int len = ids.Length; foreach (var id in entityIDs) { if (ids.Length != len) { ids.Append(","); } ids.Append("'").Append(id).Append("'"); } ids.Append(")"); var tableName = ontology.Ontology.EntityTableName; if (selectElements.Count == 0) { selectElements.Add(ontology.Elements[ontology.IdElement.Element.Code]); } var sqlQuery = new StringBuilder("select "); int l = sqlQuery.Length; foreach (var item in selectElements) { if (sqlQuery.Length != l) { sqlQuery.Append(","); } sqlQuery.Append("t.[").Append(item.Element.Code).Append("]"); } sqlQuery.Append(" from [").Append(tableName).Append("] as t where t.[") .Append(ontology.IdElement.Element.Code).Append("] in ").Append(ids.ToString()); // TODO:参数化EntityIDs var list = new List <object[]>(); var reader = this.GetEntityDb(ontology).ExecuteReader(sqlQuery.ToString()); while (reader.Read()) { var values = new object[selectElements.Count]; for (int i = 0; i < selectElements.Count; i++) { values[i] = reader.GetValue(i); } list.Add(values); } reader.Close(); return(new DataTuple(selectElements, list.ToArray())); }
public TowInfoTuple GetTopTwo( OntologyDescriptor ontology, IEnumerable <InfoItem> infoIDs, OrderedElementSet selectElements) { return(GetTop2InfoItemSet(ontology, this.GetEntityDb(ontology), infoIDs, selectElements)); }
public string GetEntityDataSource(OntologyDescriptor ontology) { return(this.GetEntityDb(ontology).IsLocalhost ? "localhost" : this.GetEntityDb(ontology).Database.DataSource); }
public IEnumerable <InfoItem> GetValues(OntologyDescriptor ontology) { var properties = this.GetType().GetProperties(BindingFlags.Public & BindingFlags.SetProperty); return(properties.Select(property => GetProperty(ontology, property.Name, property.GetValue(this).ToString()))); }
/// <summary> /// 保存命令事件 /// </summary> /// <param name="ontology"></param> /// <param name="command"></param> public ProcessResult SaveCommand(OntologyDescriptor ontology, MessageEntity command) { if (ontology == null) { return new ProcessResult(new ArgumentNullException("ontology", "ontology参数为null")); } if (command == null) { return new ProcessResult(new ArgumentNullException("command")); } return this.SaveCommands(ontology, new MessageEntity[] { command }); }
/// <summary> /// 单条删除 /// </summary> /// <param name="ontology"></param> /// <param name="id">单条数据的Guid信息标识</param> /// <returns></returns> private IMessageDto DeleteEntity(OntologyDescriptor ontology, Guid id) { const string actionCode = "delete"; var node = AcDomain.NodeHost.Nodes.ThisNode; var ticks = DateTime.UtcNow.Ticks; var cmd = new Message() { Version = ApiVersion.V1.ToName(), IsDumb = false, MessageType = MessageType.Action.ToName(), Credential = new CredentialData { ClientType = ClientType.Node.ToName(), UserType = UserType.None.ToName(), CredentialType = CredentialType.Token.ToName(), ClientId = node.Node.Id.ToString(), UserName = AcSession.Account.Id.ToString(),// UserName Password = TokenObject.Token(node.Node.Id.ToString(), ticks, node.Node.SecretKey), Ticks = ticks }, Verb = actionCode, Ontology = ontology.Ontology.Code, TimeStamp = DateTime.UtcNow.Ticks, MessageId = Guid.NewGuid().ToString(), Body = new BodyData(new KeyValue[] { new KeyValue("Id", id.ToString()) }, new KeyValue[0]) { Event = new EventData { Status = (int)Status.ReceiveOk, ReasonPhrase = Status.ReceiveOk.ToName() } } }; return AnyMessage.Create(HecpRequest.Create(AcDomain, cmd), AcDomain.NodeHost.Nodes.ThisNode).Response(); }
/// <summary> /// 按照目录分页获取指定节点、本体的数据 /// <remarks> /// 如果传入的目录为空则表示获取全部目录的数据 /// </remarks> /// </summary> /// <param name="ontology"></param> /// <param name="selectElements"></param> /// <param name="filters">过滤器列表</param> /// <param name="pagingData"></param> /// <returns></returns> public DataTuple GetPlist( OntologyDescriptor ontology, OrderedElementSet selectElements, List<FilterData> filters, PagingInput pagingData) { return this.GetPlistInfoItems( ontology, this.GetEntityDb(ontology), selectElements, filters, pagingData); }
private bool ValidCatalogCode(OntologyDescriptor ontology, string catalogCode, out CatalogState org, out ProcessResult result) { if (string.IsNullOrEmpty(catalogCode)) { org = CatalogState.Empty; result = ProcessResult.Ok; return false; } if (!ontology.Host.CatalogSet.TryGetCatalog(catalogCode.Trim(), out org)) { result = new ProcessResult(false, Status.InvalidCatalog, string.Format("非法的目录码{0}", catalogCode)); return false; } OntologyCatalogState oorg; if (!ontology.Catalogs.TryGetValue(org, out oorg)) { result = new ProcessResult(false, Status.InvalidCatalog, string.Format("对于{0}来说{1}是非法的目录码", ontology.Ontology.Name, org.Code)); return false; } var orgCode = org.Code; if (ontology.Host.CatalogSet.Any(o => orgCode.Equals(o.ParentCode, StringComparison.OrdinalIgnoreCase))) { result = new ProcessResult(false, Status.InvalidCatalog, string.Format("{0}不是叶节点,不能容纳" + ontology.Ontology.Name, org.Name)); return false; } result = ProcessResult.Ok; return true; }
/// <summary> /// /// </summary> public Sql(OntologyDescriptor ontology, string clientId, string commandId, DbActionType actionType, string localEntityId, InfoItem[] infoValue, Func<DbParameter> createParameter) { this._ontology = ontology; this._localEntityId = localEntityId; this._infoValue = infoValue; this._clientId = clientId; this._commandId = commandId; this._createParameter = createParameter; if (ontology == null || string.IsNullOrEmpty(localEntityId)) { this.IsValid = false; this.Description = "命令信息标识或信息值为空或本体为空或本地标识为空"; throw new ArgumentNullException("command"); } // 无需把switch流程选择逻辑重构掉,因为actionType枚举不存在变化 switch (actionType) { case DbActionType.Insert: if (infoValue == null || infoValue.Length == 0) { this.Description = "命令信息值为空"; break; } BuildInsertSql(); break; case DbActionType.Update: if (infoValue == null || infoValue.Length == 0) { this.Description = "命令信息值为空"; break; } BuildUpdateSql(); break; case DbActionType.Delete: BuildDeleteSql(); break; default: this.IsValid = false; this.Description = "意外的不能执行的动作码" + actionType.ToString(); break; } }
/// <summary> /// 根据给定的本体码和信息标识获取本节点两条数据 /// </summary> /// <param name="ontology">本体</param> /// <param name="db"></param> /// <param name="infoIds">多列联合信息标识字典,键必须不区分大小写</param> /// <param name="selectElements">选择元素</param> /// <returns></returns> private TowInfoTuple GetTop2InfoItemSet(OntologyDescriptor ontology, RdbDescriptor db, IEnumerable<InfoItem> infoIds, OrderedElementSet selectElements) { if (infoIds == null || !infoIds.Any()) { return new TowInfoTuple(null, null); } var sb = new StringBuilder(); var sqlParameters = new List<DbParameter>(); var elementList = selectElements.ToList(); sb.Append("select top 2 "); int l = sb.Length; foreach (var element in elementList) { if (sb.Length != l) { sb.Append(","); } sb.Append("t.[").Append(element.Element.FieldCode).Append("]"); } sb.Append(" from [").Append(ontology.Ontology.EntityTableName).Append("] as t where"); if (ontology.Ontology.IsLogicalDeletionEntity) { sb.Append(" t.DeletionStateCode=0 "); } else { sb.Append(" 1=1 "); } foreach (var element in infoIds) { sb.Append(" and t.[").Append(element.Element.Element.FieldCode) .Append("]=").Append("@").Append(element.Element.Element.FieldCode); object obj = element.Value; if (obj == null) { obj = DBNull.Value; } sqlParameters.Add(CreateParameter(db, element.Element.Element.FieldCode, obj, DbType.String)); } var infoValue1 = new List<InfoItem>(); var infoValue2 = new List<InfoItem>(); using (var reader = db.ExecuteReader(sb.ToString(), sqlParameters.ToArray())) { if (reader.Read()) { for (int i = 0; i < elementList.Count; i++) { infoValue1.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString())); } } if (reader.Read()) { for (int i = 0; i < elementList.Count; i++) { infoValue2.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString())); } } reader.Close(); } return new TowInfoTuple(infoValue1.ToArray(), infoValue2.ToArray()); }
/// <summary> /// 根据目录获取给定节点和本体的数据,如果传入的目录为空表示获取本节点的数据 /// <remarks>本节点通常是中心节点</remarks> /// </summary> /// <param name="ontology"></param> /// <param name="db">模型</param> /// <param name="filters"></param> /// <param name="selectElements">sql select语句的选择列集合</param> /// <param name="pagingData"></param> /// <returns> /// 数据记录列表,数据记录表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值 /// </returns> private DataTuple GetPlistInfoItems( OntologyDescriptor ontology, RdbDescriptor db, OrderedElementSet selectElements, List<FilterData> filters, PagingInput pagingData) { if (string.IsNullOrEmpty(pagingData.SortField)) { pagingData.SortField = "IncrementId"; } if (string.IsNullOrEmpty(pagingData.SortOrder)) { pagingData.SortOrder = "asc"; } var elements = ontology.Elements; if (filters != null) { for (int i = 0; i < filters.Count; i++) { var filter = filters[i]; if (elements.ContainsKey(filter.field)) { // TODO:根据数据属性优化查询,比如对于身份证件号来说如果输入的值长度 // 为20或18的话可以将like替换为等于 filter.type = "string"; var element = elements[filter.field]; if (element.Element.IsEnabled != 1) { continue; } if (element.Element.InfoDicId.HasValue) { filter.comparison = "eq"; } else { filter.comparison = "like"; } } else { filters.RemoveAt(i); } } } var tableName = ontology.Ontology.EntityTableName; var sbSqlPredicate = new StringBuilder(); var l = sbSqlPredicate.Length; var pQueryList = new List<DbParameter>(); List<DbParameter> pFilters; var filterString = _filterStringBuilder.FilterString(db, filters, null, out pFilters); if (!string.IsNullOrEmpty(filterString)) { foreach (var pFilter in pFilters) { object obj = pFilter.Value; if (obj == null) { obj = DBNull.Value; } var p = db.CreateParameter(); p.ParameterName = pFilter.ParameterName; p.Value = obj; pQueryList.Add(p); } if (sbSqlPredicate.Length != l) { sbSqlPredicate.Append(" and "); } sbSqlPredicate.Append(filterString); } string sqlPredicateString = string.Empty; if (sbSqlPredicate.Length > 0) { sqlPredicateString = sbSqlPredicate.ToString(); } var sqlText = new StringBuilder(); OrderedElementSet elementList; if (selectElements == null || selectElements.Count == 0) { elementList = new OrderedElementSet { ontology.Elements["id"] }; } else { elementList = selectElements; } sqlText.Append("SELECT TOP {0} "); int len = sqlText.Length; foreach (var element in elementList) { if (sqlText.Length != len) { sqlText.Append(","); } sqlText.Append("[").Append(element.Element.FieldCode).Append("]"); } sqlText.Append(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY {1} {2}) AS RowNumber,"); len = sqlText.Length; foreach (var element in elementList) { if (sqlText.Length != len) { sqlText.Append(","); } sqlText.Append("[").Append(element.Element.FieldCode).Append("]"); } sqlText.Append(" FROM {3} where "); if (ontology.Ontology.IsLogicalDeletionEntity) { sqlText.Append("DeletionStateCode = 0"); } else { sqlText.Append("1 = 1"); } if (!string.IsNullOrEmpty(sqlPredicateString)) { sqlText.Append(" and ").Append(sqlPredicateString); } sqlText.Append(") a WHERE a.RowNumber > {4}"); string sqlQuery = string.Format( sqlText.ToString(), pagingData.PageSize.ToString(CultureInfo.InvariantCulture), pagingData.SortField, pagingData.SortOrder, tableName, (pagingData.SkipCount).ToString(CultureInfo.InvariantCulture)); pagingData.Count(() => { string where = ontology.Ontology.IsLogicalDeletionEntity ? "where DeletionStateCode = 0" : ""; string sqlCount = string.Format("select count(1) from {0} {1}", tableName, where); if (!string.IsNullOrEmpty(sqlPredicateString)) { sqlCount = sqlCount + " and " + sqlPredicateString; } return (int)db.ExecuteScalar( sqlCount, pQueryList.Select(p => ((ICloneable)p).Clone()).Cast<DbParameter>().ToArray()); }); var list = new List<object[]>(); var reader = db.ExecuteReader(sqlQuery, pQueryList.ToArray()); while (reader.Read()) { var values = new object[elementList.Count]; for (int i = 0; i < elementList.Count; i++) { values[i] = reader.GetValue(i); } list.Add(values); } reader.Close(); return new DataTuple(elementList, list.ToArray()); }
/// <summary> /// /// </summary> private RdbDescriptor GetEntityDb(OntologyDescriptor ontology) { if (!DbDic.ContainsKey(ontology)) { lock (Locker) { if (!DbDic.ContainsKey(ontology)) { RdbDescriptor db; if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.EntityDatabaseId, out db)) { throw new AnycmdException("意外的数据库Id" + ontology.Ontology.EntityDatabaseId.ToString()); } DbDic.Add(ontology, db); } } } return DbDic[ontology]; }
private RdbDescriptor GetArchiveDb(OntologyDescriptor ontology, IArchive archive) { var entityDb = this.GetEntityDb(ontology).Database; var catalogName = string.Format( "Archive{0}{1}_{2}", ontology.Ontology.Code, archive.ArchiveOn.ToString("yyyyMMdd"), archive.NumberId.ToString()); var datasource = archive.DataSource; var userId = archive.UserId; var password = archive.Password; if (string.IsNullOrEmpty(datasource)) { datasource = entityDb.DataSource; } if (string.IsNullOrEmpty(userId)) { userId = entityDb.UserId; } if (string.IsNullOrEmpty(password)) { password = entityDb.Password; } return new RdbDescriptor(ontology.Host, new RDatabase { CatalogName = catalogName, CreateBy = archive.CreateBy, CreateOn = DateTime.Now, CreateUserId = archive.CreateUserId, DataSource = datasource, Description = ontology.Ontology.Name + "归档", Id = Guid.NewGuid(), IsTemplate = false, Password = password, Profile = entityDb.Profile, ProviderName = entityDb.ProviderName, RdbmsType = archive.RdbmsType, UserId = userId }); }
public string GetEntityDataSource(OntologyDescriptor ontology) { return this.GetEntityDb(ontology).IsLocalhost ? "localhost" : this.GetEntityDb(ontology).Database.DataSource; }
/// <summary> /// 保存新数据 /// </summary> /// <param name="ontology"></param> /// <param name="infoIDs"></param> /// <param name="infoValues"></param> /// <param name="id"></param> /// <returns>命令状态模型</returns> /// <exception cref="AnycmdException">如果传入的信息ID字典或信息值字典为空则引发该异常,如果信息值 /// 字典不为空但仅包含一个键为Id的值则也引发本异常(Id应出现在信息标识中是不应该出现在信息值中的) /// </exception> private IMessageDto Save(OntologyDescriptor ontology , IList<InfoItem> infoIDs, IList<InfoItem> infoValues, out string id) { return SaveOrUpdate(false, ontology, infoIDs, infoValues, out id); }
public static OntologyTr Create(OntologyDescriptor ontology) { return new OntologyTr { CanAction = ontology.Ontology.CanAction, CanCommand = ontology.Ontology.CanCommand, CanEvent = ontology.Ontology.CanEvent, Code = ontology.Ontology.Code, CreateOn = ontology.Ontology.CreateOn, DispatcherLoadCount = ontology.Ontology.DispatcherLoadCount, DispatcherSleepTimeSpan = ontology.Ontology.DispatcherSleepTimeSpan, EntityDatabaseId = ontology.Ontology.EntityDatabaseId, EntitySchemaName = ontology.Ontology.EntitySchemaName, EntityTableName = ontology.Ontology.EntityTableName, ExecutorLoadCount = ontology.Ontology.ExecutorLoadCount, ExecutorSleepTimeSpan = ontology.Ontology.ExecutorSleepTimeSpan, Icon = ontology.Ontology.Icon, Id = ontology.Ontology.Id, IsEnabled = ontology.Ontology.IsEnabled, IsLogicalDeletionEntity = ontology.Ontology.IsLogicalDeletionEntity, IsCataloguedEntity = ontology.Ontology.IsCataloguedEntity, IsSystem = ontology.Ontology.IsSystem, MessageDatabaseId = ontology.Ontology.MessageDatabaseId, MessageSchemaName = ontology.Ontology.MessageSchemaName, Name = ontology.Ontology.Name, ServiceIsAlive = ontology.Ontology.ServiceIsAlive, SortCode = ontology.Ontology.SortCode }; }
/// <summary> /// 保存新数据或更新旧数据 /// </summary> /// <param name="isUpdate"></param> /// <param name="ontology"></param> /// <param name="infoIDs"></param> /// <param name="infoValues"></param> /// <param name="id"></param> /// <returns></returns> private IMessageDto SaveOrUpdate(bool isUpdate, OntologyDescriptor ontology , ICollection<InfoItem> infoIDs, ICollection<InfoItem> infoValues, out string id) { id = string.Empty; if (infoIDs == null || infoIDs.Count == 0) { throw new AnycmdException("infoIDs不能为空"); } if (infoValues == null || infoValues.Count == 0) { throw new AnycmdException("infoValues不能为空"); } if (!isUpdate) { var idItem = infoIDs.FirstOrDefault(a => a.Element == ontology.IdElement); if (idItem != null) { infoIDs.Remove(idItem); } } IInfoStringConverter converter; if (!AcDomain.NodeHost.InfoStringConverters.TryGetInfoStringConverter(AcDomain.Config.InfoFormat, out converter)) { throw new ValidationException("意外的信息字符串转化器,json信息格式转化器不存在或已被禁用"); } var node = AcDomain.NodeHost.Nodes.ThisNode; var ticks = DateTime.UtcNow.Ticks; var cmd = new Message() { Version = ApiVersion.V1.ToName(), IsDumb = false, MessageType = MessageType.Action.ToName(), Credential = new CredentialData { ClientType = ClientType.Node.ToName(), UserType = UserType.None.ToName(), CredentialType = CredentialType.Token.ToName(), ClientId = node.Node.Id.ToString(), UserName = AcSession.Account.Id.ToString(),// UserName Password = TokenObject.Token(node.Node.Id.ToString(), ticks, node.Node.SecretKey), Ticks = ticks }, MessageId = Guid.NewGuid().ToString(), Verb = isUpdate ? "update" : "create", Ontology = ontology.Ontology.Code, TimeStamp = DateTime.UtcNow.Ticks, Body = new BodyData(infoIDs.Select(a => new KeyValue(a.Key, a.Value)).ToArray(), infoValues.Select(a => new KeyValue(a.Key, a.Value)).ToArray()) { Event = new EventData { Status = (int)Status.ReceiveOk, ReasonPhrase = Status.ReceiveOk.ToName() } } }; var result = AnyMessage.Create(HecpRequest.Create(AcDomain, cmd), AcDomain.NodeHost.Nodes.ThisNode).Response(); id = result.Body.InfoValue.Single(a => a.Key.Equals("Id", StringComparison.OrdinalIgnoreCase)).Value; return result; }
/// <summary> /// 获取给定条目的给定类型的命令 /// </summary> /// <param name="commandType"></param> /// <param name="ontology"></param> /// <param name="n">条数</param> /// <param name="sortField"></param> /// <param name="sortOrder"></param> /// <returns>命令消息集合</returns> public IList<MessageEntity> GetTopNCommands(MessageTypeKind commandType, OntologyDescriptor ontology, int n, string sortField, string sortOrder) { if (ontology == null) { return new List<MessageEntity>(); } if (commandType == MessageTypeKind.Invalid || commandType == MessageTypeKind.AnyCommand) { return new List<MessageEntity>(); } var db = this.GetCommandDb(ontology); var sql = @"select top " + n.ToString(CultureInfo.InvariantCulture) + " * from [" + GetTableName(commandType) + "] as c where lower(c.Ontology)=@Ontology order by c." + sortField + " " + sortOrder; var pOntology = CreateParameter(db, "Ontology", ontology.Ontology.Code.ToLower(), DbType.String); IList<MessageEntity> list = new List<MessageEntity>(); using (var reader = db.ExecuteReader(sql, pOntology)) { while (reader.Read()) { list.Add(CommandRecord.Create(ontology.Host, commandType, reader)); } reader.Close(); return list; } }
/// <summary> /// 更新旧数据。调用者需自己找数据的变化,传入的infoValues是变化的数据 /// </summary> /// <param name="ontology"></param> /// <param name="infoIDs"></param> /// <param name="infoValues"></param> /// <returns>命令状态模型</returns> /// <exception cref="AnycmdException">如果传入的信息ID字典或信息值字典为空则引发该异常,如果信息值 /// 字典不为空但仅包含一个键为Id的值则也引发本异常(Id应出现在信息标识中是不应该出现在信息值中的) /// </exception> private IMessageDto Update(OntologyDescriptor ontology , IList<InfoItem> infoIDs, IList<InfoItem> infoValues) { string id; return SaveOrUpdate(true, ontology, infoIDs, infoValues, out id); }
public ProcessResult DeleteCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id, bool isDumb) { ProcessResult r; if (isDumb) { r = ProcessResult.Ok; } else { var db = this.GetCommandDb(ontology); var queryString = @"delete " + GetTableName(commandType) + " where Id=@Id"; int n = db.ExecuteNonQuery(queryString, CreateParameter(db, "Id", id, DbType.Guid)); if (n == 1) { r = ProcessResult.Ok; } else { r = new ProcessResult(new AnycmdException("意外的影响行数" + n.ToString(CultureInfo.InvariantCulture))); } } if (r.Exception != null) { ontology.Host.LoggingService.Error(r.Exception); } return r; }
/// <summary> /// 获取给定实体标识列表中的标识标识的每一个实体元组 /// </summary> /// <param name="ontology"></param> /// <param name="selectElements"></param> /// <param name="entityIDs"></param> /// <returns></returns> public DataTuple GetList(OntologyDescriptor ontology, OrderedElementSet selectElements, List<string> entityIDs) { if (ontology == null) { throw new ArgumentNullException("ontology"); } if (selectElements == null) { throw new ArgumentNullException("selectElements"); } if (entityIDs == null || entityIDs.Count == 0) { throw new ArgumentException("entityId"); } var ids = new StringBuilder("("); int len = ids.Length; foreach (var id in entityIDs) { if (ids.Length != len) { ids.Append(","); } ids.Append("'").Append(id).Append("'"); } ids.Append(")"); var tableName = ontology.Ontology.EntityTableName; if (selectElements.Count == 0) { selectElements.Add(ontology.Elements[ontology.IdElement.Element.Code]); } var sqlQuery = new StringBuilder("select "); int l = sqlQuery.Length; foreach (var item in selectElements) { if (sqlQuery.Length != l) { sqlQuery.Append(","); } sqlQuery.Append("t.[").Append(item.Element.Code).Append("]"); } sqlQuery.Append(" from [").Append(tableName).Append("] as t where t.[") .Append(ontology.IdElement.Element.Code).Append("] in ").Append(ids.ToString());// TODO:参数化EntityIDs var list = new List<object[]>(); var reader = this.GetEntityDb(ontology).ExecuteReader(sqlQuery.ToString()); while (reader.Read()) { var values = new object[selectElements.Count]; for (int i = 0; i < selectElements.Count; i++) { values[i] = reader.GetValue(i); } list.Add(values); } reader.Close(); return new DataTuple(selectElements, list.ToArray()); }
/// <summary> /// 根据节点分页获取命令 /// </summary> /// <typeparam name="T">命令类型参数</typeparam> /// <param name="commandType"></param> /// <param name="ontology">本体</param> /// <param name="catalogCode">目录码</param> /// <param name="actionCode">动作码,空值表示忽略本查询条件</param> /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param> /// <param name="localEntityId">本地实体标识</param> /// <param name="pageIndex">页索引</param> /// <param name="pageSize">页尺寸</param> /// <param name="sortField">排序字段</param> /// <param name="sortOrder">排序方向</param> /// <param name="total">总记录数</param> /// <returns></returns> public IList<MessageEntity> GetPlistCommands(MessageTypeKind commandType, OntologyDescriptor ontology, string catalogCode, string actionCode, Guid? nodeId, string localEntityId, int pageIndex, int pageSize, string sortField, string sortOrder, out Int64 total) { var tableName = GetTableName(commandType); var queryString = @"select top " + pageSize.ToString(CultureInfo.InvariantCulture) + " * from (SELECT ROW_NUMBER() OVER(ORDER BY " + sortField + " " + sortOrder + ") AS RowNumber,* from " + tableName + @" as a where a.Ontology=@Ontology {0}) b where b.RowNumber>" + (pageSize * pageIndex).ToString(CultureInfo.InvariantCulture); var countQs = @"select count(Id) from " + tableName + @" as a where a.Ontology=@Ontology {0}"; if (!string.IsNullOrEmpty(actionCode)) { queryString = string.Format(queryString, " and a.Verb=@Verb {0}"); countQs = string.Format(countQs, " and a.Verb=@Verb {0}"); } if (!string.IsNullOrEmpty(localEntityId)) { queryString = string.Format(queryString, " and a.LocalEntityID=@LocalEntityId {0}"); countQs = string.Format(countQs, " and a.LocalEntityID=@LocalEntityId {0}"); } if (!string.IsNullOrEmpty(catalogCode)) { queryString = string.Format(queryString, " and a.CatalogCode like @CatalogCode {0}"); countQs = string.Format(countQs, " and a.CatalogCode like @CatalogCode {0}"); } if (nodeId.HasValue) { queryString = string.Format(queryString, " and a.ClientID=@ClientId"); countQs = string.Format(countQs, " and a.ClientID=@ClientId"); } else { queryString = string.Format(queryString, ""); countQs = string.Format(countQs, ""); } var db = this.GetCommandDb(ontology); var parms = new List<DbParameter> { CreateParameter(db, "Ontology", ontology.Ontology.Code, DbType.String) }; if (!string.IsNullOrEmpty(actionCode)) { parms.Add(CreateParameter(db, "Verb", actionCode, DbType.String)); } if (nodeId.HasValue) { parms.Add(CreateParameter(db, "ClientId", nodeId.Value, DbType.Guid)); } if (!string.IsNullOrEmpty(localEntityId)) { parms.Add(CreateParameter(db, "LocalEntityId", localEntityId, DbType.String)); } if (!string.IsNullOrEmpty(catalogCode)) { parms.Add(CreateParameter(db, "CatalogCode", catalogCode + "%", DbType.String)); } var pArray = parms.ToArray(); IList<MessageEntity> list = new List<MessageEntity>(); using (var reader = this.GetCommandDb(ontology).ExecuteReader(queryString, pArray)) { while (reader.Read()) { list.Add(CommandRecord.Create(ontology.Host, commandType, reader)); } } total = (int)this.GetCommandDb(ontology).ExecuteScalar(countQs, parms.Select(p => ((ICloneable)p).Clone()).Cast<DbParameter>().ToArray()); return list; }
/// <summary> /// /// </summary> /// <param name="ontology"></param> /// <param name="archive"></param> public void Archive(OntologyDescriptor ontology, IArchive archive) { var entityDb = this.GetEntityDb(ontology).Database; var archiveDb = this.GetArchiveDb(ontology, archive); if (archiveDb.Database.CatalogName.Equals(entityDb.CatalogName, StringComparison.OrdinalIgnoreCase)) { throw new AnycmdException("归档库的数据库名不能与本体库相同"); } // 创建归档库 archiveDb.Create(this.GetEntityDb(ontology), ontology.Host.Config.EntityArchivePath); string archiveTableName = string.Format( "{0}.{1}.{2}", archiveDb.Database.CatalogName, ontology.Ontology.EntitySchemaName, ontology.Ontology.EntityTableName); string sql = @"if OBJECT_ID('" + archiveTableName + "') IS NULL select * into " + archiveTableName + " from " + ontology.Ontology.EntityTableName; // 执行select into归档数据 this.GetEntityDb(ontology).ExecuteNonQuery(sql, null); }
public MessageEntity GetCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id) { var db = this.GetCommandDb(ontology); var queryString = @"select * from " + GetTableName(commandType) + " as a where a.Id=@Id"; using (var reader = db.ExecuteReader(queryString, CreateParameter(db, "Id", id, DbType.Guid))) { if (reader.Read()) { return CommandRecord.Create(ontology.Host, commandType, reader); } } return null; }
/// <summary> /// 根据节点分页获取命令 /// </summary> /// <typeparam name="T">命令类型参数</typeparam> /// <param name="commandType"></param> /// <param name="ontology">本体</param> /// <param name="catalogCode">目录码</param> /// <param name="actionCode">动作码,空值表示忽略本查询条件</param> /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param> /// <param name="localEntityId">本地实体标识</param> /// <param name="pageIndex">页索引</param> /// <param name="pageSize">页尺寸</param> /// <param name="sortField">排序字段</param> /// <param name="sortOrder">排序方向</param> /// <param name="total">总记录数</param> /// <returns></returns> public IList <MessageEntity> GetPlistCommands(MessageTypeKind commandType, OntologyDescriptor ontology, string catalogCode, string actionCode, Guid?nodeId, string localEntityId, int pageIndex, int pageSize, string sortField, string sortOrder, out Int64 total) { var tableName = GetTableName(commandType); var queryString = @"select top " + pageSize.ToString(CultureInfo.InvariantCulture) + " * from (SELECT ROW_NUMBER() OVER(ORDER BY " + sortField + " " + sortOrder + ") AS RowNumber,* from " + tableName + @" as a where a.Ontology=@Ontology {0}) b where b.RowNumber>" + (pageSize * pageIndex).ToString(CultureInfo.InvariantCulture); var countQs = @"select count(Id) from " + tableName + @" as a where a.Ontology=@Ontology {0}"; if (!string.IsNullOrEmpty(actionCode)) { queryString = string.Format(queryString, " and a.Verb=@Verb {0}"); countQs = string.Format(countQs, " and a.Verb=@Verb {0}"); } if (!string.IsNullOrEmpty(localEntityId)) { queryString = string.Format(queryString, " and a.LocalEntityID=@LocalEntityId {0}"); countQs = string.Format(countQs, " and a.LocalEntityID=@LocalEntityId {0}"); } if (!string.IsNullOrEmpty(catalogCode)) { queryString = string.Format(queryString, " and a.CatalogCode like @CatalogCode {0}"); countQs = string.Format(countQs, " and a.CatalogCode like @CatalogCode {0}"); } if (nodeId.HasValue) { queryString = string.Format(queryString, " and a.ClientID=@ClientId"); countQs = string.Format(countQs, " and a.ClientID=@ClientId"); } else { queryString = string.Format(queryString, ""); countQs = string.Format(countQs, ""); } var db = this.GetCommandDb(ontology); var parms = new List <DbParameter> { CreateParameter(db, "Ontology", ontology.Ontology.Code, DbType.String) }; if (!string.IsNullOrEmpty(actionCode)) { parms.Add(CreateParameter(db, "Verb", actionCode, DbType.String)); } if (nodeId.HasValue) { parms.Add(CreateParameter(db, "ClientId", nodeId.Value, DbType.Guid)); } if (!string.IsNullOrEmpty(localEntityId)) { parms.Add(CreateParameter(db, "LocalEntityId", localEntityId, DbType.String)); } if (!string.IsNullOrEmpty(catalogCode)) { parms.Add(CreateParameter(db, "CatalogCode", catalogCode + "%", DbType.String)); } var pArray = parms.ToArray(); IList <MessageEntity> list = new List <MessageEntity>(); using (var reader = this.GetCommandDb(ontology).ExecuteReader(queryString, pArray)) { while (reader.Read()) { list.Add(CommandRecord.Create(ontology.Host, commandType, reader)); } } total = (int)this.GetCommandDb(ontology).ExecuteScalar(countQs, parms.Select(p => ((ICloneable)p).Clone()).Cast <DbParameter>().ToArray()); return(list); }
/// <summary> /// 根据目录获取给定节点和本体的数据,如果传入的目录为空表示获取本节点的数据 /// <remarks>本节点通常是中心节点</remarks> /// </summary> /// <param name="ontology"></param> /// <param name="db">模型</param> /// <param name="filters"></param> /// <param name="selectElements">sql select语句的选择列集合</param> /// <param name="pagingData"></param> /// <returns> /// 数据记录列表,数据记录表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值 /// </returns> private DataTuple GetPlistInfoItems( OntologyDescriptor ontology, RdbDescriptor db, OrderedElementSet selectElements, List <FilterData> filters, PagingInput pagingData) { if (string.IsNullOrEmpty(pagingData.SortField)) { pagingData.SortField = "IncrementId"; } if (string.IsNullOrEmpty(pagingData.SortOrder)) { pagingData.SortOrder = "asc"; } var elements = ontology.Elements; if (filters != null) { for (int i = 0; i < filters.Count; i++) { var filter = filters[i]; if (elements.ContainsKey(filter.field)) { // TODO:根据数据属性优化查询,比如对于身份证件号来说如果输入的值长度 // 为20或18的话可以将like替换为等于 filter.type = "string"; var element = elements[filter.field]; if (element.Element.IsEnabled != 1) { continue; } if (element.Element.InfoDicId.HasValue) { filter.comparison = "eq"; } else { filter.comparison = "like"; } } else { filters.RemoveAt(i); } } } var tableName = ontology.Ontology.EntityTableName; var sbSqlPredicate = new StringBuilder(); var l = sbSqlPredicate.Length; var pQueryList = new List <DbParameter>(); List <DbParameter> pFilters; var filterString = _filterStringBuilder.FilterString(db, filters, null, out pFilters); if (!string.IsNullOrEmpty(filterString)) { foreach (var pFilter in pFilters) { object obj = pFilter.Value; if (obj == null) { obj = DBNull.Value; } var p = db.CreateParameter(); p.ParameterName = pFilter.ParameterName; p.Value = obj; pQueryList.Add(p); } if (sbSqlPredicate.Length != l) { sbSqlPredicate.Append(" and "); } sbSqlPredicate.Append(filterString); } string sqlPredicateString = string.Empty; if (sbSqlPredicate.Length > 0) { sqlPredicateString = sbSqlPredicate.ToString(); } var sqlText = new StringBuilder(); OrderedElementSet elementList; if (selectElements == null || selectElements.Count == 0) { elementList = new OrderedElementSet { ontology.Elements["id"] }; } else { elementList = selectElements; } sqlText.Append("SELECT TOP {0} "); int len = sqlText.Length; foreach (var element in elementList) { if (sqlText.Length != len) { sqlText.Append(","); } sqlText.Append("[").Append(element.Element.FieldCode).Append("]"); } sqlText.Append(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY {1} {2}) AS RowNumber,"); len = sqlText.Length; foreach (var element in elementList) { if (sqlText.Length != len) { sqlText.Append(","); } sqlText.Append("[").Append(element.Element.FieldCode).Append("]"); } sqlText.Append(" FROM {3} where "); if (ontology.Ontology.IsLogicalDeletionEntity) { sqlText.Append("DeletionStateCode = 0"); } else { sqlText.Append("1 = 1"); } if (!string.IsNullOrEmpty(sqlPredicateString)) { sqlText.Append(" and ").Append(sqlPredicateString); } sqlText.Append(") a WHERE a.RowNumber > {4}"); string sqlQuery = string.Format( sqlText.ToString(), pagingData.PageSize.ToString(CultureInfo.InvariantCulture), pagingData.SortField, pagingData.SortOrder, tableName, (pagingData.SkipCount).ToString(CultureInfo.InvariantCulture)); pagingData.Count(() => { string where = ontology.Ontology.IsLogicalDeletionEntity ? "where DeletionStateCode = 0" : ""; string sqlCount = string.Format("select count(1) from {0} {1}", tableName, where); if (!string.IsNullOrEmpty(sqlPredicateString)) { sqlCount = sqlCount + " and " + sqlPredicateString; } return((int)db.ExecuteScalar( sqlCount, pQueryList.Select(p => ((ICloneable)p).Clone()).Cast <DbParameter>().ToArray())); }); var list = new List <object[]>(); var reader = db.ExecuteReader(sqlQuery, pQueryList.ToArray()); while (reader.Read()) { var values = new object[elementList.Count]; for (int i = 0; i < elementList.Count; i++) { values[i] = reader.GetValue(i); } list.Add(values); } reader.Close(); return(new DataTuple(elementList, list.ToArray())); }
/// <summary> /// 批量保存本地事件 /// </summary> /// <param name="ontology">本体</param> /// <param name="commands"></param> public ProcessResult SaveCommands(OntologyDescriptor ontology, MessageEntity[] commands) { if (ontology == null) { return new ProcessResult(new ArgumentNullException("ontology", @"ontology参数为null")); } if (commands == null) { return new ProcessResult(new ArgumentNullException("commands")); } foreach (var command in commands) { if (command == null) { return new ProcessResult(new ArgumentNullException("command", "命令数组中有null")); } else if (!ontology.Ontology.Code.Equals(command.Ontology, StringComparison.OrdinalIgnoreCase)) { return new ProcessResult(new ArgumentNullException("command.Ontology", "同一命令数组中的命令必须在相同本体下")); } } ProcessResult r = ProcessResult.Ok; // 存放异常信息 StringBuilder sb = new StringBuilder(); int l = sb.Length; // 按照命令类型分组,不同类型的命令可能存储在不同的数据库表 var gs = commands.GroupBy(c => c.CommandType); foreach (var g in gs) { // 本组命令类型所对应的数据库表 string tableId = string.Format("[{0}][{1}]", ontology.Ontology.MessageSchemaName, GetTableName(g.Key)); DbTable dbTable; if (!this.GetCommandDb(ontology).TryGetDbTable(tableId, out dbTable)) { r = new ProcessResult(new AnycmdException("意外的数据库表标识" + tableId)); } // 当前命令表模式克隆得到的新表 var dt = this.GetCommandDb(ontology).NewTable(dbTable); foreach (var command in g) { if (command.CommandType == MessageTypeKind.Invalid || command.CommandType == MessageTypeKind.AnyCommand) { r = new ProcessResult(false, Status.InvalidArgument, "Invalid和AnyCommand类型命令不能持久化"); } else if (string.IsNullOrEmpty(command.Verb.Code)) { r = new ProcessResult(false, Status.InvalidArgument, "Verb为空或null不能持久化"); } else if (string.IsNullOrEmpty(command.MessageId) || command.MessageId.Length > 50) { r = new ProcessResult(false, Status.InvalidArgument, "MessageID为空或null或者长度大于50字符不能持久化"); } else if (string.IsNullOrEmpty(command.LocalEntityId)) { r = new ProcessResult(false, Status.InvalidArgument, "LocalEntityID为空或null不能持久化"); } else if (command.DataTuple.IdItems.IsEmpty) { r = new ProcessResult(false, Status.InvalidArgument, "当前命令的信息标识为空则不能持久化"); } else if (!command.TimeStamp.IsValid()) { r = new ProcessResult(false, Status.InvalidArgument, "TimeStamp非法则不能持久化"); } else if (string.IsNullOrEmpty(command.Ontology)) { r = new ProcessResult(false, Status.InvalidArgument, "Ontology为空或null不能持久化"); } else if (string.IsNullOrEmpty(command.ClientId)) { r = new ProcessResult(false, Status.InvalidArgument, "ClientID为空或null不能持久化"); } if (r.IsSuccess) { // 将当前命令转化DataRow,一个命令对应一行 var row = command.ToDataRow(dt); int ll = sb.Length; // 检测每一列对应的值是否超出了数据库定义的长度 for (int i = 0; i < dt.Columns.Count; i++) { var dbCol = dt.Columns[i]; if (dbCol.MaxLength != -1) { if (row[i].ToString().Length > dbCol.MaxLength) { if (sb.Length != ll) { sb.Append(";"); } sb.Append(tableId).Append("表:"); sb.Append(dbCol.ColumnName + "超过最大长度,最长" + dbCol.MaxLength.ToString()); } } } if (sb.Length == ll) { // 如果不是哑命令。哑命令是不能爆炸的。 if (!command.IsDumb) { dt.Rows.Add(row); } } } else { sb.Append(r.Description); } } this.GetCommandDb(ontology).WriteToServer(dt); } if (sb.Length != l) { r = new ProcessResult(new AnycmdException(sb.ToString())); } else { r = ProcessResult.Ok; } if (r.Exception != null) { ontology.Host.LoggingService.Error(r.Exception); } return r; }
/// <summary> /// /// </summary> private RdbDescriptor GetCommandDb(OntologyDescriptor ontology) { if (!_dbDic.ContainsKey(ontology)) { lock (_locker) { if (!_dbDic.ContainsKey(ontology)) { RdbDescriptor db; if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.MessageDatabaseId, out db)) { throw new AnycmdException("意外的数据库Id" + ontology.Ontology.MessageDatabaseId.ToString()); } _dbDic.Add(ontology, db); } } } return _dbDic[ontology]; }
public TowInfoTuple GetTopTwo( OntologyDescriptor ontology, IEnumerable<InfoItem> infoIDs, OrderedElementSet selectElements) { return GetTop2InfoItemSet(ontology, this.GetEntityDb(ontology), infoIDs, selectElements); }
/// <summary> /// 批量保存本地事件 /// </summary> /// <param name="ontology">本体</param> /// <param name="commands"></param> public ProcessResult SaveCommands(OntologyDescriptor ontology, MessageEntity[] commands) { if (ontology == null) { return(new ProcessResult(new ArgumentNullException("ontology", @"ontology参数为null"))); } if (commands == null) { return(new ProcessResult(new ArgumentNullException("commands"))); } foreach (var command in commands) { if (command == null) { return(new ProcessResult(new ArgumentNullException("command", "命令数组中有null"))); } else if (!ontology.Ontology.Code.Equals(command.Ontology, StringComparison.OrdinalIgnoreCase)) { return(new ProcessResult(new ArgumentNullException("command.Ontology", "同一命令数组中的命令必须在相同本体下"))); } } ProcessResult r = ProcessResult.Ok; // 存放异常信息 StringBuilder sb = new StringBuilder(); int l = sb.Length; // 按照命令类型分组,不同类型的命令可能存储在不同的数据库表 var gs = commands.GroupBy(c => c.CommandType); foreach (var g in gs) { // 本组命令类型所对应的数据库表 string tableId = string.Format("[{0}][{1}]", ontology.Ontology.MessageSchemaName, GetTableName(g.Key)); DbTable dbTable; if (!this.GetCommandDb(ontology).TryGetDbTable(tableId, out dbTable)) { r = new ProcessResult(new GeneralException("意外的数据库表标识" + tableId)); } // 当前命令表模式克隆得到的新表 var dt = this.GetCommandDb(ontology).NewTable(dbTable); foreach (var command in g) { if (command.CommandType == MessageTypeKind.Invalid || command.CommandType == MessageTypeKind.AnyCommand) { r = new ProcessResult(false, Status.InvalidArgument, "Invalid和AnyCommand类型命令不能持久化"); } else if (string.IsNullOrEmpty(command.Verb.Code)) { r = new ProcessResult(false, Status.InvalidArgument, "Verb为空或null不能持久化"); } else if (string.IsNullOrEmpty(command.MessageId) || command.MessageId.Length > 50) { r = new ProcessResult(false, Status.InvalidArgument, "MessageID为空或null或者长度大于50字符不能持久化"); } else if (string.IsNullOrEmpty(command.LocalEntityId)) { r = new ProcessResult(false, Status.InvalidArgument, "LocalEntityID为空或null不能持久化"); } else if (command.DataTuple.IdItems.IsEmpty) { r = new ProcessResult(false, Status.InvalidArgument, "当前命令的信息标识为空则不能持久化"); } else if (!command.TimeStamp.IsValid()) { r = new ProcessResult(false, Status.InvalidArgument, "TimeStamp非法则不能持久化"); } else if (string.IsNullOrEmpty(command.Ontology)) { r = new ProcessResult(false, Status.InvalidArgument, "Ontology为空或null不能持久化"); } else if (string.IsNullOrEmpty(command.ClientId)) { r = new ProcessResult(false, Status.InvalidArgument, "ClientID为空或null不能持久化"); } if (r.IsSuccess) { // 将当前命令转化DataRow,一个命令对应一行 var row = command.ToDataRow(dt); int ll = sb.Length; // 检测每一列对应的值是否超出了数据库定义的长度 for (int i = 0; i < dt.Columns.Count; i++) { var dbCol = dt.Columns[i]; if (dbCol.MaxLength != -1) { if (row[i].ToString().Length > dbCol.MaxLength) { if (sb.Length != ll) { sb.Append(";"); } sb.Append(tableId).Append("表:"); sb.Append(dbCol.ColumnName + "超过最大长度,最长" + dbCol.MaxLength.ToString()); } } } if (sb.Length == ll) { // 如果不是哑命令。哑命令是不能爆炸的。 if (!command.IsDumb) { dt.Rows.Add(row); } } } else { sb.Append(r.Description); } } this.GetCommandDb(ontology).WriteToServer(dt); } if (sb.Length != l) { r = new ProcessResult(new GeneralException(sb.ToString())); } else { r = ProcessResult.Ok; } if (r.Exception != null) { ontology.Host.LoggingService.Error(r.Exception); } return(r); }
/// <summary> /// 根据Id查询命令详细信息 /// </summary> /// <typeparam name="T">命令详细信息展示模型类型参数</typeparam> /// <param name="messageProvider">命令提供程序</param> /// <param name="messageTypeKind"></param> /// <param name="ontology">本体</param> /// <param name="id">命令标识</param> /// <returns></returns> public static MessageTr GetCommandInfo( this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, Guid id) { var command = messageProvider.GetCommand(messageTypeKind, ontology, id); return MessageTr.Create(ontology.Host, command); }