예제 #1
0
 /// <summary>
 /// Create query
 /// </summary>
 /// <param name="model"></param>
 public ApplicationRecordQueryApiModel(ApplicationRecordQueryModel model)
 {
     ApplicationName    = model.ApplicationName;
     ApplicationUri     = model.ApplicationUri;
     ApplicationType    = model.ApplicationType;
     ProductUri         = model.ProductUri;
     ServerCapabilities = model.ServerCapabilities;
     MaxRecordsToReturn = model.MaxRecordsToReturn;
     StartingRecordId   = model.StartingRecordId;
 }
 /// <inheritdoc/>
 public Task <ApplicationRecordListModel> QueryApplicationsAsync(
     ApplicationRecordQueryModel query, CancellationToken ct)
 {
     return(_database.QueryApplicationsAsync(query, ct));
 }
        /// <inheritdoc/>
        public async Task <ApplicationRecordListModel> QueryApplicationsAsync(
            ApplicationRecordQueryModel request, CancellationToken ct)
        {
            // TODO: implement last query time
            var lastCounterResetTime = DateTime.MinValue;
            var records      = new List <ApplicationDocument>();
            var matchQuery   = false;
            var complexQuery =
                !string.IsNullOrEmpty(request.ApplicationName) ||
                !string.IsNullOrEmpty(request.ApplicationUri) ||
                !string.IsNullOrEmpty(request.ProductUri) ||
                (request.ServerCapabilities != null && request.ServerCapabilities.Count > 0);

            if (complexQuery)
            {
                matchQuery =
                    Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern(
                        request.ApplicationName) ||
                    Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern(
                        request.ApplicationUri) ||
                    Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern(
                        request.ProductUri);
            }

            var nextRecordId       = request.StartingRecordId ?? 0;
            var maxRecordsToReturn = request.MaxRecordsToReturn ?? 0;
            var lastQuery          = false;

            do
            {
                var queryRecords = complexQuery ? kDefaultRecordsPerQuery : maxRecordsToReturn;
                var query        = CreateServerQuery(nextRecordId, (int)queryRecords);
                nextRecordId++;
                var applications = await query.ReadAsync();

                lastQuery = queryRecords == 0 || applications.Count() < queryRecords;
                foreach (var application in applications.Select(a => a.Value))
                {
                    nextRecordId = application.ID + 1;
                    if (!string.IsNullOrEmpty(request.ApplicationName))
                    {
                        if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match(
                                application.ApplicationName, request.ApplicationName))
                        {
                            continue;
                        }
                    }
                    if (!string.IsNullOrEmpty(request.ApplicationUri))
                    {
                        if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match(
                                application.ApplicationUri, request.ApplicationUri))
                        {
                            continue;
                        }
                    }
                    if (!string.IsNullOrEmpty(request.ProductUri))
                    {
                        if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match(
                                application.ProductUri, request.ProductUri))
                        {
                            continue;
                        }
                    }

                    string[] capabilities = null;
                    if (!string.IsNullOrEmpty(application.ServerCapabilities))
                    {
                        capabilities = application.ServerCapabilities.Split(',');
                    }
                    if (request.ServerCapabilities != null && request.ServerCapabilities.Count > 0)
                    {
                        var match = true;
                        foreach (var cap in request.ServerCapabilities)
                        {
                            if (capabilities == null || !capabilities.Contains(cap))
                            {
                                match = false;
                                break;
                            }
                        }
                        if (!match)
                        {
                            continue;
                        }
                    }
                    records.Add(application);
                    if (maxRecordsToReturn > 0 && --maxRecordsToReturn == 0)
                    {
                        break;
                    }
                }
            } while (maxRecordsToReturn > 0 && !lastQuery);
            if (lastQuery)
            {
                nextRecordId = 0;
            }
            return(new ApplicationRecordListModel {
                Applications = records.Select(a => new ApplicationRecordModel {
                    Application = a.ToServiceModel(),
                    RecordId = a.ID
                }).ToList(),
                LastCounterResetTime = lastCounterResetTime,
                NextRecordId = nextRecordId
            });
        }