@@ -84,6 +84,11 @@ public function __construct($databaseFile)
84
84
'dit ' => $ dit ,
85
85
'version ' => $ tmp ['ver ' ],
86
86
];
87
+ if ($ this ->meta ['version ' ] !== self ::VERSION ) {
88
+ fclose ($ this ->db );
89
+ $ this ->errors [] = 'file ' .$ databaseFile .' is not database version ' .self ::VERSION ;
90
+ return ;
91
+ }
87
92
$ registersCount = $ tmp ['count ' ];
88
93
$ registersFormatLen = $ tmp ['formatLen ' ];
89
94
$ tmp = unpack ('A*format ' ,substr ($ header ,$ offset ,$ registersFormatLen ));
@@ -136,13 +141,16 @@ public function find($ip)
136
141
$ data = array ();
137
142
$ octet = (int )$ ip ;
138
143
$ long = pack ('N ' ,ip2long ($ ip ));
139
- $ start = $ stop = $ this ->meta ['index ' ][$ octet ];
144
+ $ start = $ this ->meta ['index ' ][$ octet ];
145
+ $ stop = $ this ->meta ['index ' ][$ octet ];
140
146
while ($ octet < 255 && $ this ->meta ['index ' ][$ octet ] == $ start ) {
141
- $ stop = $ this ->meta ['index ' ][$ octet ];
142
147
$ octet ++;
148
+ $ stop = $ this ->meta ['index ' ][$ octet ];
143
149
}
144
150
if ($ stop == $ start ) {
145
151
$ stop = $ this ->meta ['networks ' ]['items ' ];
152
+ } elseif ($ stop < $ this ->meta ['networks ' ]['items ' ]) {
153
+ $ stop ++;
146
154
}
147
155
if ($ start > 0 ) {
148
156
$ start --;
@@ -151,23 +159,24 @@ public function find($ip)
151
159
$ seek = $ this ->meta ['networks ' ]['offset ' ]+($ start *$ this ->meta ['networks ' ]['len ' ]);
152
160
fseek ($ this ->db ,$ seek );
153
161
$ blocks = fread ($ this ->db ,$ blockCount *$ this ->meta ['networks ' ]['len ' ]);
162
+ $ blocksLength = strlen ($ blocks );
154
163
$ offset = 0 ;
155
- $ step = ceil (sqrt ($ blockCount ));
156
-
157
- $ check = substr ($ blocks , $ offset + ($ this ->meta ['networks ' ]['len ' ] * $ step ), 4 );
158
- while ($ check && $ long >= $ check && ($ offset < ($ blockCount )*$ this ->meta ['networks ' ]['len ' ])) {
159
- $ offset += $ this ->meta ['networks ' ]['len ' ] * $ step ;
164
+ if ($ blockCount > 10 ) {
165
+ $ step = ceil (sqrt ($ blockCount ));
160
166
$ check = substr ($ blocks , $ offset + ($ this ->meta ['networks ' ]['len ' ] * $ step ), 4 );
167
+ while ($ check && $ long >= $ check && ($ offset < ($ blockCount ) * $ this ->meta ['networks ' ]['len ' ])) {
168
+ $ offset += $ this ->meta ['networks ' ]['len ' ] * $ step ;
169
+ $ check = substr ($ blocks , $ offset + ($ this ->meta ['networks ' ]['len ' ] * $ step ), 4 );
170
+ }
161
171
}
162
-
163
172
do {
164
- if ($ offset > strlen ( $ blocks ) ) {
165
- $ offset = strlen ( $ blocks ) -$ this ->meta ['networks ' ]['len ' ];
173
+ if ($ offset > $ blocksLength ) {
174
+ $ offset = $ blocksLength -$ this ->meta ['networks ' ]['len ' ];
166
175
}
167
176
$ block = substr ($ blocks ,$ offset ,$ this ->meta ['networks ' ]['len ' ]);
168
177
$ first = substr ($ block ,0 ,4 );
169
178
$ next = substr ($ blocks ,$ offset +$ this ->meta ['networks ' ]['len ' ],4 );
170
- if ($ first <= $ long && ($ long < $ next || $ next === false )) {
179
+ if ($ first <= $ long && ($ long < $ next || $ next == false )) {
171
180
$ registers = unpack ($ this ->meta ['networks ' ]['pack ' ],substr ($ block ,4 ));
172
181
}
173
182
$ offset += $ this ->meta ['networks ' ]['len ' ];
0 commit comments