mirror of
https://github.com/shmilylty/OneForAll.git
synced 2026-10-24 16:46:14 +08:00
移除多余函数
This commit is contained in:
+2
-136
@@ -64,132 +64,6 @@ class IpRegInfo(object):
|
|||||||
|
|
||||||
return self.return_data(data_ptr)
|
return self.return_data(data_ptr)
|
||||||
|
|
||||||
def binary_search(self, ip):
|
|
||||||
"""
|
|
||||||
" binary search method
|
|
||||||
" param: ip
|
|
||||||
"""
|
|
||||||
if not ip.isdigit():
|
|
||||||
ip = self.ip2long(ip)
|
|
||||||
|
|
||||||
if self.__indexCount == 0:
|
|
||||||
self.__f.seek(0)
|
|
||||||
super_block = self.__f.read(8)
|
|
||||||
self.__indexSPtr = self.get_long(super_block, 0)
|
|
||||||
self.__indexLPtr = self.get_long(super_block, 4)
|
|
||||||
self.__indexCount = int((self.__indexLPtr - self.__indexSPtr) /
|
|
||||||
self.__INDEX_BLOCK_LENGTH) + 1
|
|
||||||
|
|
||||||
l, h, data_ptr = (0, self.__indexCount, 0)
|
|
||||||
while l <= h:
|
|
||||||
m = int((l + h) >> 1)
|
|
||||||
p = m * self.__INDEX_BLOCK_LENGTH
|
|
||||||
|
|
||||||
self.__f.seek(self.__indexSPtr + p)
|
|
||||||
buffer = self.__f.read(self.__INDEX_BLOCK_LENGTH)
|
|
||||||
sip = self.get_long(buffer, 0)
|
|
||||||
if ip < sip:
|
|
||||||
h = m - 1
|
|
||||||
else:
|
|
||||||
eip = self.get_long(buffer, 4)
|
|
||||||
if ip > eip:
|
|
||||||
l = m + 1
|
|
||||||
else:
|
|
||||||
data_ptr = self.get_long(buffer, 8)
|
|
||||||
break
|
|
||||||
|
|
||||||
if data_ptr == 0:
|
|
||||||
raise Exception("Data pointer not found")
|
|
||||||
|
|
||||||
return self.return_data(data_ptr)
|
|
||||||
|
|
||||||
def btree_search(self, ip):
|
|
||||||
"""
|
|
||||||
" b-tree search method
|
|
||||||
" param: ip
|
|
||||||
"""
|
|
||||||
if not ip.isdigit():
|
|
||||||
ip = self.ip2long(ip)
|
|
||||||
|
|
||||||
if len(self.__headerSip) < 1:
|
|
||||||
header_len = 0
|
|
||||||
# pass the super block
|
|
||||||
self.__f.seek(8)
|
|
||||||
# read the header block
|
|
||||||
b = self.__f.read(self.__TOTAL_HEADER_LENGTH)
|
|
||||||
# parse the header block
|
|
||||||
for i in range(0, len(b), 8):
|
|
||||||
sip = self.get_long(b, i)
|
|
||||||
ptr = self.get_long(b, i + 4)
|
|
||||||
if ptr == 0:
|
|
||||||
break
|
|
||||||
self.__headerSip.append(sip)
|
|
||||||
self.__headerPtr.append(ptr)
|
|
||||||
header_len += 1
|
|
||||||
self.__headerLen = header_len
|
|
||||||
|
|
||||||
l, h, sptr, eptr = (0, self.__headerLen, 0, 0)
|
|
||||||
while l <= h:
|
|
||||||
m = int((l + h) >> 1)
|
|
||||||
|
|
||||||
if ip == self.__headerSip[m]:
|
|
||||||
if m > 0:
|
|
||||||
sptr = self.__headerPtr[m - 1]
|
|
||||||
eptr = self.__headerPtr[m]
|
|
||||||
else:
|
|
||||||
sptr = self.__headerPtr[m]
|
|
||||||
eptr = self.__headerPtr[m + 1]
|
|
||||||
break
|
|
||||||
|
|
||||||
if ip < self.__headerSip[m]:
|
|
||||||
if m == 0:
|
|
||||||
sptr = self.__headerPtr[m]
|
|
||||||
eptr = self.__headerPtr[m + 1]
|
|
||||||
break
|
|
||||||
elif ip > self.__headerSip[m - 1]:
|
|
||||||
sptr = self.__headerPtr[m - 1]
|
|
||||||
eptr = self.__headerPtr[m]
|
|
||||||
break
|
|
||||||
h = m - 1
|
|
||||||
else:
|
|
||||||
if m == self.__headerLen - 1:
|
|
||||||
sptr = self.__headerPtr[m - 1]
|
|
||||||
eptr = self.__headerPtr[m]
|
|
||||||
break
|
|
||||||
elif ip <= self.__headerSip[m + 1]:
|
|
||||||
sptr = self.__headerPtr[m]
|
|
||||||
eptr = self.__headerPtr[m + 1]
|
|
||||||
break
|
|
||||||
l = m + 1
|
|
||||||
|
|
||||||
if sptr == 0:
|
|
||||||
raise Exception("Index pointer not found")
|
|
||||||
|
|
||||||
index_len = eptr - sptr
|
|
||||||
self.__f.seek(sptr)
|
|
||||||
index = self.__f.read(index_len + self.__INDEX_BLOCK_LENGTH)
|
|
||||||
|
|
||||||
l, h, data_prt = (0, int(index_len / self.__INDEX_BLOCK_LENGTH), 0)
|
|
||||||
while l <= h:
|
|
||||||
m = int((l + h) >> 1)
|
|
||||||
offset = int(m * self.__INDEX_BLOCK_LENGTH)
|
|
||||||
sip = self.get_long(index, offset)
|
|
||||||
|
|
||||||
if ip < sip:
|
|
||||||
h = m - 1
|
|
||||||
else:
|
|
||||||
eip = self.get_long(index, offset + 4)
|
|
||||||
if ip > eip:
|
|
||||||
l = m + 1
|
|
||||||
else:
|
|
||||||
data_prt = self.get_long(index, offset + 8)
|
|
||||||
break
|
|
||||||
|
|
||||||
if data_prt == 0:
|
|
||||||
raise Exception("Data pointer not found")
|
|
||||||
|
|
||||||
return self.return_data(data_prt)
|
|
||||||
|
|
||||||
def init_database(self, db_file):
|
def init_database(self, db_file):
|
||||||
"""
|
"""
|
||||||
" initialize the database for search
|
" initialize the database for search
|
||||||
@@ -204,7 +78,7 @@ class IpRegInfo(object):
|
|||||||
def return_data(self, data_ptr):
|
def return_data(self, data_ptr):
|
||||||
"""
|
"""
|
||||||
" get ip data from db file by data start ptr
|
" get ip data from db file by data start ptr
|
||||||
" param: dsptr
|
" param: data ptr
|
||||||
"""
|
"""
|
||||||
data_len = (data_ptr >> 24) & 0xFF
|
data_len = (data_ptr >> 24) & 0xFF
|
||||||
data_ptr = data_ptr & 0x00FFFFFF
|
data_ptr = data_ptr & 0x00FFFFFF
|
||||||
@@ -254,16 +128,8 @@ class IpRegData(IpRegInfo):
|
|||||||
path = settings.data_storage_dir.joinpath('ip2region.db')
|
path = settings.data_storage_dir.joinpath('ip2region.db')
|
||||||
IpRegInfo.__init__(self, path)
|
IpRegInfo.__init__(self, path)
|
||||||
|
|
||||||
def query(self, ip, algorithm='memory'):
|
def query(self, ip):
|
||||||
algorithms = ['memory', 'binary', 'btree']
|
|
||||||
if algorithm not in algorithms:
|
|
||||||
raise Exception(f"Only three query algorithms are supported: {algorithms}")
|
|
||||||
if algorithm == 'memory':
|
|
||||||
result = self.memory_search(ip)
|
result = self.memory_search(ip)
|
||||||
elif algorithm == 'binary':
|
|
||||||
result = self.binary_search(ip)
|
|
||||||
else:
|
|
||||||
result = self.btree_search(ip)
|
|
||||||
addr_list = result.get('region').split('|')
|
addr_list = result.get('region').split('|')
|
||||||
addr = ''.join(filter(lambda x: x != '0', addr_list[:-1]))
|
addr = ''.join(filter(lambda x: x != '0', addr_list[:-1]))
|
||||||
isp = addr_list[-1]
|
isp = addr_list[-1]
|
||||||
|
|||||||
Reference in New Issue
Block a user