MCPcopy Create free account
hub / github.com/EASY233/Finger / Ip2Region

Class Ip2Region

lib/ip2Region.py:10–231  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

8import struct, io, socket, sys
9
10class Ip2Region(object):
11
12 def __init__(self, dbfile):
13 self.__INDEX_BLOCK_LENGTH = 12
14 self.__TOTAL_HEADER_LENGTH = 8192
15 self.__f = None
16 self.__headerSip = []
17 self.__headerPtr = []
18 self.__headerLen = 0
19 self.__indexSPtr = 0
20 self.__indexLPtr = 0
21 self.__indexCount = 0
22 self.__dbBinStr = ''
23 self.initDatabase(dbfile)
24
25 def memorySearch(self, ip):
26 """
27 " memory search method
28 " param: ip
29 """
30 if not ip.isdigit(): ip = self.ip2long(ip)
31
32 if self.__dbBinStr == '':
33 self.__dbBinStr = self.__f.read() #read all the contents in file
34 self.__indexSPtr = self.getLong(self.__dbBinStr, 0)
35 self.__indexLPtr = self.getLong(self.__dbBinStr, 4)
36 self.__indexCount = int((self.__indexLPtr - self.__indexSPtr)/self.__INDEX_BLOCK_LENGTH)+1
37
38 l, h, dataPtr = (0, self.__indexCount, 0)
39 while l <= h:
40 m = int((l+h) >> 1)
41 p = self.__indexSPtr + m*self.__INDEX_BLOCK_LENGTH
42 sip = self.getLong(self.__dbBinStr, p)
43
44 if ip < sip:
45 h = m -1
46 else:
47 eip = self.getLong(self.__dbBinStr, p+4)
48 if ip > eip:
49 l = m + 1;
50 else:
51 dataPtr = self.getLong(self.__dbBinStr, p+8)
52 break
53
54 if dataPtr == 0: raise Exception("Data pointer not found")
55
56 return self.returnData(dataPtr)
57
58 def binarySearch(self, ip):
59 """
60 " binary search method
61 " param: ip
62 """
63 if not ip.isdigit(): ip = self.ip2long(ip)
64
65 if self.__indexCount == 0:
66 self.__f.seek(0)
67 superBlock = self.__f.read(8)

Callers 2

__init__Method · 0.90
__init__Method · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected