/// <summary>
        /// get records by query
        /// </summary>
        /// <param name="infoCenter"></param>
        /// <param name="query"></param>
        /// <param name="recordDetail"></param>
        /// <param name="rowAccess"></param>
        /// <param name="chunkSize"></param>
        /// <param name="tableInfo"></param>
        /// <returns></returns>
        public VisionMessage GetRecordsByQuery(string infoCenter,
                                               string query,
                                               RecordDetail recordDetail = RecordDetail.Empty,
                                               bool rowAccess            = false,
                                               int chunkSize             = 100,
                                               XElement tableInfo        = null)
        {
            try
            {
                VisionMessage _retval    = new VisionMessage();
                int           _nextChunk = 1;
                bool          _lastChunk = false;
                string        _sessionId = "";
                string        _connInfo  = GetConnectionInfo();
                XElement      _xQuery    = new XElement("Queries", new XElement("Query", query, new XAttribute("ID", 1)));

                do
                {
                    string _xmlretval = service.GetRecordsByQuery(
                        _connInfo,
                        GetInfoCenterXML(infoCenter, rowAccess, _nextChunk, chunkSize, tableInfo),
                        _xQuery.ToString(),
                        recordDetail.GetValueName()
                        );

                    //read loop moved into separate method...
                    _lastChunk = ReadResult(ref _sessionId, _xmlretval, ref _retval);
                    if (string.IsNullOrEmpty(_sessionId) == false)
                    {
                        _connInfo = GetVisionConnInfoXML(database, username, password, _sessionId);
                    }
                    _nextChunk += 1;
                } while (_lastChunk == false);

                return(_retval);
            }
            catch (Exception ex)
            {
                logger.Error(ex, $"GetRecordsByQuery() with query [{query}] call failed");
                return(VisionMessage.FromException(ex));
            }
        }
        /// <summary>
        /// retrieves record by UID
        /// </summary>
        /// <param name="udicName"></param>
        /// <param name="id"></param>
        /// <param name="recordDetail"></param>
        /// <returns></returns>
        public VisionMessage GetUDICRecordsByKey(string udicName, string id, RecordDetail recordDetail = RecordDetail.Empty)
        {
            try
            {
                VisionMessage _retval    = new VisionMessage();
                int           _nextChunk = 1;
                bool          _lastChunk = false;
                string        _sessionId = "";
                string        _connInfo  = GetConnectionInfo();

                do
                {
                    string _xmlretval = service.GetUDICByKey(
                        _connInfo,
                        udicName,
                        id,
                        recordDetail.GetValueName()
                        );

                    //read loop moved into separate method...
                    _lastChunk = ReadResult(ref _sessionId, _xmlretval, ref _retval);
                    if (string.IsNullOrEmpty(_sessionId) == false)
                    {
                        _connInfo = GetVisionConnInfoXML(database, username, password, _sessionId);
                    }
                    _nextChunk += 1;
                } while (_lastChunk == false);

                return(_retval);
            }
            catch (Exception ex)
            {
                logger.Error(ex, $"GetUDICRecordsByKey() for {udicName} with key [{id}] call failed");
                return(VisionMessage.FromException(ex));
            }
        }