" binary search method " param: ip
(self, ip)
| 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) |
| 68 | self.__indexSPtr = self.getLong(superBlock, 0) |
| 69 | self.__indexLPtr = self.getLong(superBlock, 4) |
| 70 | self.__indexCount = int((self.__indexLPtr - self.__indexSPtr) / self.__INDEX_BLOCK_LENGTH) + 1 |
| 71 | |
| 72 | l, h, dataPtr = (0, self.__indexCount, 0) |
| 73 | while l <= h: |
| 74 | m = int((l+h) >> 1) |
| 75 | p = m*self.__INDEX_BLOCK_LENGTH |
| 76 | |
| 77 | self.__f.seek(self.__indexSPtr+p) |
| 78 | buffer = self.__f.read(self.__INDEX_BLOCK_LENGTH) |
| 79 | sip = self.getLong(buffer, 0) |
| 80 | if ip < sip: |
| 81 | h = m - 1 |
| 82 | else: |
| 83 | eip = self.getLong(buffer, 4) |
| 84 | if ip > eip: |
| 85 | l = m + 1 |
| 86 | else: |
| 87 | dataPtr = self.getLong(buffer, 8) |
| 88 | break |
| 89 | |
| 90 | if dataPtr == 0: raise Exception("Data pointer not found") |
| 91 | |
| 92 | return self.returnData(dataPtr) |
| 93 | |
| 94 | def btreeSearch(self, ip): |
| 95 | """ |
no test coverage detected