Esempio n. 1
0
		/// <summary>
		/// Инициализирует структуры данных информацией из файла БД
		/// </summary>
		/// <param name="fileName">Путь к файлу БД</param>
		/// <param name="holder">Хранилище структур данных БД</param>
		public void Load(string fileName, DataHolder holder)
		{
			using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,
				FileShare.None, 64 * 1024, FileOptions.SequentialScan))
			{
				Reader reader = new Reader(fs, 64 * 1024);
				if (!ReadFile(reader, holder))
				{
					throw new Exception();
				}
			}
		}
Esempio n. 2
0
        /// <summary>
        /// Инициализирует структуры данных информацией из файла БД
        /// </summary>
        /// <param name="fileName">Путь к файлу БД</param>
        /// <param name="holder">Хранилище структур данных БД</param>
        public void Load(string fileName, DataHolder holder)
        {
            using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "a", 0, MemoryMappedFileAccess.Read))
            {
                using (MemoryMappedViewAccessor mmfa = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read))
                {
                    mmfa.Read(0, out holder.Header);

                    holder.IpTable             = new IpRecord[holder.Header.records];
                    holder.LocationTable       = new LocationRecord[holder.Header.records];
                    holder.LocationByNameIndex = new int[holder.Header.records];

                    mmfa.ReadArray(holder.Header.offset_ranges, holder.IpTable, 0, holder.Header.records);
                    mmfa.ReadArray(holder.Header.offset_locations, holder.LocationTable, 0, holder.Header.records);
                    mmfa.ReadArray(holder.Header.offset_cities, holder.LocationByNameIndex, 0, holder.Header.records);
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Диагностический метод
        /// </summary>
        internal static unsafe void WriteDbFiles(DataHolder holder, int ipTableSize)
        {
            using (StreamWriter sw = new StreamWriter("ip.txt", false, Encoding.UTF8))
            {
                for (int i = 0; i < ipTableSize; i++)
                {
                    IpRecord       rec  = holder.IpTable[i];
                    LocationRecord lrec = holder.GetLocationRecordById((int)rec.location_index);
                    string         str  =
                        Utils.ConvertUintToIp(rec.ip_from).PadRight(20) +
                        Utils.ConvertUintToIp(rec.ip_to).PadRight(20) +
                        new string(lrec.city).PadRight(24);
                    sw.WriteLine(str);
                }
            }

            using (StreamWriter sw = new StreamWriter("location.txt", false, Encoding.UTF8))
            {
                for (int i = 0; i < holder.RecordCount; i++)
                {
                    LocationRecord rec          = holder.GetLocationRecordByNameIndex(i);
                    string         city         = new string(rec.city);
                    string         country      = new string(rec.country);
                    string         region       = new string(rec.region);
                    string         postal       = new string(rec.postal);
                    string         organization = new string(rec.organization);
                    if (city.Length > 23 || country.Length > 7 || region.Length > 11 || postal.Length > 23 || organization.Length > 31)
                    {
                        throw new Exception();
                    }

                    string str = city.PadRight(24) +
                                 country.PadRight(8) +
                                 region.PadRight(12) +
                                 postal.PadRight(12) +
                                 organization.PadRight(32) +
                                 rec.latitude.ToString().PadRight(20) +
                                 rec.longitude.ToString().PadRight(20);
                    sw.WriteLine(str);
                }
            }
        }
Esempio n. 4
0
		private static unsafe bool ReadFile(Reader reader, DataHolder holder)
		{
			int blockSize = sizeof(DatabaseFileHeader);
			fixed (DatabaseFileHeader* headerPtr = &holder.Header)
			{
				if (!reader.ReadBytes((byte*)headerPtr, blockSize))
				{
					return false;
				}
			}

			holder.IpTable = new IpRecord[holder.Header.records];
			holder.LocationTable = new LocationRecord[holder.Header.records];
			holder.LocationByNameIndex = new int[holder.Header.records];

			blockSize = sizeof(IpRecord) * holder.Header.records;
			fixed (IpRecord* ipPtr = &holder.IpTable[0])
			{
				if (!reader.ReadBytes((byte*)ipPtr, blockSize))
				{
					return false;
				}
			}

			blockSize = sizeof(LocationRecord) * holder.Header.records;
			fixed (LocationRecord* locationPtr = &holder.LocationTable[0])
			{
				if (!reader.ReadBytes((byte*)locationPtr, blockSize))
				{
					return false;
				}
			}

			blockSize = sizeof(int) * holder.Header.records;
			fixed (int* indexPtr = &holder.LocationByNameIndex[0])
			{
				return reader.ReadBytes((byte*)indexPtr, blockSize);
			}
		}