@@ -84,6 +84,11 @@ public function __construct($databaseFile)
8484 'dit ' => $ dit ,
8585 'version ' => $ tmp ['ver ' ],
8686 ];
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+ }
8792 $ registersCount = $ tmp ['count ' ];
8893 $ registersFormatLen = $ tmp ['formatLen ' ];
8994 $ tmp = unpack ('A*format ' ,substr ($ header ,$ offset ,$ registersFormatLen ));
@@ -136,13 +141,16 @@ public function find($ip)
136141 $ data = array ();
137142 $ octet = (int )$ ip ;
138143 $ long = pack ('N ' ,ip2long ($ ip ));
139- $ start = $ stop = $ this ->meta ['index ' ][$ octet ];
144+ $ start = $ this ->meta ['index ' ][$ octet ];
145+ $ stop = $ this ->meta ['index ' ][$ octet ];
140146 while ($ octet < 255 && $ this ->meta ['index ' ][$ octet ] == $ start ) {
141- $ stop = $ this ->meta ['index ' ][$ octet ];
142147 $ octet ++;
148+ $ stop = $ this ->meta ['index ' ][$ octet ];
143149 }
144150 if ($ stop == $ start ) {
145151 $ stop = $ this ->meta ['networks ' ]['items ' ];
152+ } elseif ($ stop < $ this ->meta ['networks ' ]['items ' ]) {
153+ $ stop ++;
146154 }
147155 if ($ start > 0 ) {
148156 $ start --;
@@ -151,23 +159,24 @@ public function find($ip)
151159 $ seek = $ this ->meta ['networks ' ]['offset ' ]+($ start *$ this ->meta ['networks ' ]['len ' ]);
152160 fseek ($ this ->db ,$ seek );
153161 $ blocks = fread ($ this ->db ,$ blockCount *$ this ->meta ['networks ' ]['len ' ]);
162+ $ blocksLength = strlen ($ blocks );
154163 $ 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 ));
160166 $ 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+ }
161171 }
162-
163172 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 ' ];
166175 }
167176 $ block = substr ($ blocks ,$ offset ,$ this ->meta ['networks ' ]['len ' ]);
168177 $ first = substr ($ block ,0 ,4 );
169178 $ 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 )) {
171180 $ registers = unpack ($ this ->meta ['networks ' ]['pack ' ],substr ($ block ,4 ));
172181 }
173182 $ offset += $ this ->meta ['networks ' ]['len ' ];
0 commit comments