Exemplo n.º 1
0
        public void BinarySearchByIpAddressOutsideDbTest()
        {
            var ipString      = IpAddressHelpers.IpUintToString(7);
            var searchService = new SearchService(new ConverterService(), repository);

            var result = searchService.BinarySearchByIpAddress(ipString);

            Assert.Equal(result.Length, 0);
        }
Exemplo n.º 2
0
        public void BinarySearchByCorrectIpAddressTest()
        {
            var ipString      = IpAddressHelpers.IpUintToString(9);
            var searchService = new SearchService(new ConverterService(), repository);

            var result = searchService.BinarySearchByIpAddress(ipString);

            Assert.Equal(result.Length, 1);
            Assert.Equal(result[0].CityName, "cit_1");
        }
Exemplo n.º 3
0
        public City[] BinarySearchByIpAddress(string ip)
        {
            var intAddress = IpAddressHelpers.IpToUint(ip);

            if (_repository.Db == null)
            {
                throw new Exception("База данных не загружена");
            }

            var firstIndex = 0;
            var lastIndex  = _repository.Db.Header.Records;

            while (firstIndex <= lastIndex)
            {
                int midIndex = firstIndex + (lastIndex - firstIndex) / 2;

                var midRangeFrom = _repository.Db.IpRanges[midIndex, 0];
                var midRangeTo   = _repository.Db.IpRanges[midIndex, 1];

                if (intAddress >= midRangeFrom && intAddress <= midRangeTo)
                {
                    var index = _repository.Db.IpRanges[midIndex, 2];
                    return(new City[] { _converterService.ConvertToCity(_repository.Db.Cities, (int)index * Constants.CitySize) });
                }

                if (intAddress < midRangeFrom)
                {
                    lastIndex = midIndex - 1;
                }
                else
                {
                    firstIndex = midIndex + 1;
                }
            }
            return(new City[] { });
        }