Skip to content

Commit 67d44a5

Browse files
author
Ivan Dudarev
committed
Revert "String float support"
This reverts commit 7a9c1e4.
1 parent 7a9c1e4 commit 67d44a5

File tree

2 files changed

+61
-75
lines changed

2 files changed

+61
-75
lines changed

src/Wizard.php

Lines changed: 35 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,10 @@ class Wizard
8989
),
9090
'networks' => array(
9191
'format' => '',
92-
's' => 4,
93-
'n' => 0,
92+
'len' => 4,
93+
'items' => 0,
9494
'fields' => array(),
9595
),
96-
'maxItemLen' => 0,
9796
);
9897

9998
/**
@@ -609,8 +608,7 @@ protected function cleanTmpDb()
609608
foreach ($this->networks as $network) {
610609
foreach ($network['map'] as $register) {
611610
$innerSql = 'SELECT `_pk` FROM `'.$register.'` GROUP BY `_pk`';
612-
$sql = 'DELETE FROM `_ips` WHERE WHERE `parameter` = "'.$register.'" AND `value` NOT IN ('
613-
.$innerSql.');';
611+
$sql = 'DELETE FROM `_ips` WHERE WHERE `parameter` = "'.$register.'" AND `value` NOT IN ('.$innerSql.');';
614612
$this->pdo->exec($sql);
615613
}
616614
}
@@ -644,14 +642,12 @@ protected function definePackFormat() {
644642
}
645643
break;
646644
default:
647-
$fieldClassName = __NAMESPACE__.'\\Field\\'
648-
.mb_convert_case($data['type'], \MB_CASE_TITLE).'Field';
645+
$fieldClassName = __NAMESPACE__.'\\Field\\'.mb_convert_case($data['type'], \MB_CASE_TITLE).'Field';
649646
/**
650647
* @var FieldAbstract $validator
651648
*/
652649
$validator = new $fieldClassName($field, $data);
653-
$sql = 'SELECT MAX(`' . $field . '`) AS `max`, MIN(`' . $field . '`) AS `min` FROM `'
654-
. $table . '`;';
650+
$sql = 'SELECT MAX(`' . $field . '`) AS `max`, MIN(`' . $field . '`) AS `min` FROM `' . $table . '`;';
655651
$res = $this->pdo->query($sql);
656652
$row = $res->fetch();
657653
$validator->update($row['min']);
@@ -666,8 +662,8 @@ protected function definePackFormat() {
666662
$bin = Pack::pack($pack, $empty);
667663

668664
$this->meta['registers'][$table]['format'] = $pack;
669-
$this->meta['registers'][$table]['s'] = strlen($bin);
670-
$this->meta['registers'][$table]['n'] = 0;
665+
$this->meta['registers'][$table]['len'] = strlen($bin);
666+
$this->meta['registers'][$table]['items'] = 0;
671667
$this->meta['registers'][$table]['fields'] = $empty;
672668
}
673669
}
@@ -684,7 +680,7 @@ protected function compileRegister($register)
684680
$empty = $this->meta['registers'][$register]['fields'];
685681
$bin = Pack::pack($format, $empty);
686682
fwrite($file, $bin);
687-
$offset = strlen($bin);
683+
$offset = 0;
688684
$select = array(
689685
'*' => '`'.$register.'`.*',
690686
);
@@ -712,19 +708,13 @@ protected function compileRegister($register)
712708
if (!empty($cellValue)) $check = 1;
713709
}
714710
$bin = Pack::pack($format, $row);
715-
$binLen = strlen($bin);
716711
if ($check) {
717-
if ($binLen > $this->meta['maxItemLen']) {
718-
$this->meta['maxItemLen'] = $binLen;
719-
}
720-
$offset += $binLen;
712+
$offset ++;
721713
fwrite($file,$bin);
722714
}
723-
$sql = 'UPDATE `'.$register.'` SET `_offset` =\''.($check?$offset:0).'\' WHERE `_pk` = \''.$rowId.'\';';
724-
$this->pdo->exec($sql);
725-
$sql = 'UPDATE `_ips` SET `offset` =\''.($check?$offset:0).'\' WHERE `parameter` = \''
726-
.$register.'\' AND `value`=\''.$rowId.'\';';
727-
$this->pdo->exec($sql);
715+
716+
$this->pdo->exec('UPDATE `'.$register.'` SET `_offset` =\''.($check?$offset:0).'\' WHERE `_pk` = \''.$rowId.'\';');
717+
$this->pdo->exec('UPDATE `_ips` SET `offset` =\''.($check?$offset:0).'\' WHERE `parameter` = \''.$register.'\' AND `value`=\''.$rowId.'\';');
728718

729719
$transactionIterator += 2;
730720
if ($transactionIterator > 100000) {
@@ -733,7 +723,7 @@ protected function compileRegister($register)
733723
$transactionIterator = 0;
734724
}
735725
}
736-
$this->meta['registers'][$register]['n'] = $offset;
726+
$this->meta['registers'][$register]['items'] = $offset;
737727
$this->pdo->commit();
738728
fclose($file);
739729
}
@@ -757,19 +747,15 @@ protected function compileNetwork()
757747
$format = array();
758748
foreach ($fields as $register=>$null) {
759749
$values[$register] = array();
760-
$format[$register] = Pack::getOptimalFormat(
761-
0,
762-
$this->meta['registers'][$register]['n'],
763-
$register
764-
);
750+
$format[$register] = Pack::getOptimalFormat(0, $this->meta['registers'][$register]['items'], $register);
765751
}
766752

767753

768754
$this->meta['networks']['format'] = implode('/', $format);
769755

770756
$pack = $this->meta['networks']['format'];
771757
$binaryPrevData = Pack::pack($pack, $fields);
772-
$this->meta['networks']['s'] += strlen($binaryPrevData);
758+
$this->meta['networks']['len'] += strlen($binaryPrevData);
773759
$offset = 0;
774760
$this->meta['index'][0] = 0;
775761
$file = fopen($this->prefix.'.networks.dat','w');
@@ -810,7 +796,7 @@ protected function compileNetwork()
810796
fwrite($file, pack('N', $ip) . $binaryData);
811797
}
812798
}
813-
$this->meta['networks']['n'] = $offset;
799+
$this->meta['networks']['items'] = $offset;
814800
for($i=1;$i<=255;$i++) {
815801
if (!isset($this->meta['index'][$i])) $this->meta['index'][$i] = $this->meta['index'][$i-1];
816802
}
@@ -831,34 +817,27 @@ protected function compileHeader()
831817
*/
832818
$header = pack('C', self::FORMAT_VERSION);
833819

834-
/*
835-
* Maximal length of register item
836-
*/
837-
$header .= pack('I', $this->meta['maxItemLen']);
838-
839820
/*
840821
* Registers count.
841822
*/
842823
$header .= pack('C', count($this->meta['registers']));
843824

825+
844826
$rnmLen = 1;
845827
$pckLen = strlen($this->meta['networks']['format']);
846-
$numMax = $this->meta['networks']['n'];
847-
$registerOffset = filesize($this->prefix.'.networks.dat');;
828+
$lenMax = $this->meta['networks']['len'];
829+
$itmMax = $this->meta['networks']['items'];
848830
foreach ($this->meta['registers'] as $registerName => $register) {
849-
$this->meta['registers'][$registerName]['s'] = $registerOffset;
850-
$file = $this->prefix.'.reg.'.$registerName.'.dat';
851-
$registerOffset += filesize($file);
852831
if (strlen($registerName) > $rnmLen) $rnmLen = strlen($registerName);
853832
if (strlen($register['format']) > $pckLen) $pckLen = strlen($register['format']);
854-
if ($register['n'] > $numMax) $numMax = $register['n'];
833+
if ($register['len'] > $lenMax) $lenMax = $register['len'];
834+
if ($register['items'] > $itmMax) $itmMax = $register['items'];
855835
}
856836
$rnm = 'A'.$rnmLen.'name';
857837
$pck = 'A'.$pckLen.'format';
858-
$sizeMax = ($this->meta['networks']['s'] > $registerOffset)?$this->meta['networks']['s']:$registerOffset;
859-
$size = Pack::getOptimalFormat(0, $sizeMax, 's');
860-
$itm = Pack::getOptimalFormat(0, $numMax, 'n');
861-
$format = $rnm.'/'.$pck.'/'.$size.'/'.$itm;
838+
$len = Pack::getOptimalFormat(0, $lenMax, 'len');
839+
$itm = Pack::getOptimalFormat(0, $itmMax, 'items');
840+
$format = $rnm.'/'.$pck.'/'.$len.'/'.$itm;
862841

863842
/*
864843
* Size of registers definition unpack format.
@@ -871,8 +850,8 @@ protected function compileHeader()
871850
$empty = array(
872851
'name' => '',
873852
'format' => '',
874-
's' => 0,
875-
'n' => 0,
853+
'len' => 0,
854+
'items' => 0,
876855
);
877856
$header .= pack('S',strlen(Pack::pack($format, $empty)));
878857

@@ -923,8 +902,8 @@ protected function compileHeader()
923902
array(
924903
'name' => $registerName,
925904
'format' => $register['format'],
926-
's' => $register['s'],
927-
'n' => $register['n']
905+
'len' => $register['len'],
906+
'items' => $register['items']
928907
)
929908
);
930909
}
@@ -937,8 +916,8 @@ protected function compileHeader()
937916
array(
938917
'name' => 'n',
939918
'format' => $this->meta['networks']['format'],
940-
's' => $this->meta['networks']['s'],
941-
'n' => $this->meta['networks']['n']
919+
'len' => $this->meta['networks']['len'],
920+
'items' => $this->meta['networks']['items']
942921
)
943922
);
944923

@@ -999,13 +978,12 @@ protected function makeFile($fileName)
999978
fclose($stream);
1000979
if (is_writable($file)) unlink($file);
1001980
}
1002-
$data = array(
1003-
'time' => empty($this->time)?time():$this->time,
1004-
'author' => $this->author,
1005-
'license' => $this->license,
1006-
);
1007-
fwrite($database,pack::pack('Itime/~author/A*license', $data));
981+
982+
$time = empty($this->time)?time():$this->time;
983+
fwrite($database,pack('I1A128',$time,$this->author));
984+
fwrite($database,pack('A*',$this->license));
1008985
fclose($database);
986+
1009987
rename($tmp, $fileName);
1010988
}
1011989
}

tests/Functional/DatabaseTest.php

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ public function testSimple()
6060
$this->assertSame(1, $db['header']['RGC']);
6161
$this->assertSame(0, $db['header']['RLC']);
6262
$this->assertSame('A10name', $db['meta']['registers']['interval']['format']);
63-
$this->assertSame(20, $db['meta']['registers']['interval']['s']);
64-
$this->assertSame(50, $db['meta']['registers']['interval']['n']);
63+
$this->assertSame(10, $db['meta']['registers']['interval']['len']);
64+
$this->assertSame(4, $db['meta']['registers']['interval']['items']);
6565
$this->assertSame('Cinterval', $db['meta']['networks']['format']);
66-
$this->assertSame(5, $db['meta']['networks']['s']);
67-
$this->assertSame(4, $db['meta']['networks']['n']);
66+
$this->assertSame(5, $db['meta']['networks']['len']);
67+
$this->assertSame(4, $db['meta']['networks']['items']);
6868
$this->assertSame(0, $db['index'][0]);
6969
$this->assertSame(0, $db['index'][63]);
7070
$this->assertSame(1, $db['index'][64]);
@@ -142,18 +142,20 @@ public function testRelation()
142142
$db = $this->parseFile($dbFile);
143143

144144
$this->assertSame('ISD', $db['header']['control']);
145-
$this->assertSame('A2code/~name', $db['meta']['registers']['country']['format']);
146-
$this->assertSame(35, $db['meta']['registers']['country']['s']);
147-
$this->assertSame(38, $db['meta']['registers']['country']['n']);
148-
$this->assertSame('~name/CcountryId/r4latitude:8049909/R4longitude', $db['meta']['registers']['city']['format']);
149-
$this->assertSame(73, $db['meta']['registers']['city']['s']);
150-
$this->assertSame(87, $db['meta']['registers']['city']['n']);
145+
$this->assertSame('A2code/A10name', $db['meta']['registers']['country']['format']);
146+
$this->assertSame(12, $db['meta']['registers']['country']['len']);
147+
$this->assertSame(3, $db['meta']['registers']['country']['items']);
148+
$this->assertSame('A15name/CcountryId/r4latitude:8049909/R4longitude', $db['meta']['registers']['city']['format']);
149+
$this->assertSame(22, $db['meta']['registers']['city']['len']);
150+
$this->assertSame(5, $db['meta']['registers']['city']['items']);
151151
$this->assertSame('Ccity', $db['meta']['networks']['format']);
152-
$this->assertSame(5, $db['meta']['networks']['s']);
153-
$this->assertSame(7, $db['meta']['networks']['n']);
152+
$this->assertSame(5, $db['meta']['networks']['len']);
153+
$this->assertSame(7, $db['meta']['networks']['items']);
154154
$this->assertSame('city', $db['relations'][0]['p']);
155155
$this->assertSame('countryId', $db['relations'][0]['f']);
156156
$this->assertSame('country', $db['relations'][0]['c']);
157+
$this->assertArrayHasKey($db['registers']['city'][2]['countryId'], $db['registers']['country']);
158+
$this->assertSame('kz', $db['registers']['country'][$db['registers']['city'][2]['countryId']]['code']);
157159
$this->assertSame($time, $db['time']);
158160
$this->assertSame($author, $db['author']);
159161
$this->assertSame($license, $db['license']);
@@ -242,6 +244,7 @@ protected function parseFile($dbFile)
242244
'RLD' => 0,
243245
'RLUF' => '',
244246
'RGMUF' => '',
247+
245248
),
246249
'meta' => array(),
247250
'index' => array(),
@@ -258,9 +261,9 @@ protected function parseFile($dbFile)
258261
$result['header']['control'] = $meta['control'];
259262
$header = fread($db, $result['header']['size']);
260263
$offset = 0;
261-
$meta = Pack::unpack('Cversion/ImaxItemLen/CRGC/SRGF/SRGD/CRLC/CRLF/SRLD', substr($header,$offset,14));
264+
$meta = Pack::unpack('Cversion/CRGC/SRGF/SRGD/CRLC/CRLF/SRLD', substr($header,$offset,10));
262265
$result['header'] = array_replace($result['header'], $meta);
263-
$offset += 14;
266+
$offset += 10;
264267
$unpack = 'A'.$meta['RLF'].'RLUF/A'.$meta['RGF'].'RGMUF';
265268
$size = $meta['RLF']+$meta['RGF'];
266269
$meta = Pack::unpack($unpack, substr($header, $offset, $size));
@@ -292,20 +295,25 @@ protected function parseFile($dbFile)
292295
$offset += $result['header']['RGD'];
293296
$result['index'] = array_values(unpack('I*',substr($header, $offset)));
294297

295-
for ($i=0;$i<$result['meta']['networks']['n'];$i++) {
298+
for ($i=0;$i<$result['meta']['networks']['items'];$i++) {
296299
$data = Pack::unpack(
297300
'N_ip/'.$result['meta']['networks']['format'],
298-
fread($db, $result['meta']['networks']['s'])
301+
fread($db, $result['meta']['networks']['len'])
299302
);
300303
$data['_ip'] = long2ip($data['_ip']);
301304
$result['networks'][] = $data;
302305
}
303306

304307
foreach ($result['meta']['registers'] as $register=>$data) {
305-
$registerData[$register] = fread($db, $data['n']);
308+
for ($id=0;$id<=$data['items'];$id++) {
309+
$result['registers'][$register][$id] = Pack::unpack(
310+
$data['format'],
311+
fread($db, $data['len'])
312+
);
313+
}
306314
}
307315

308-
$meta = Pack::unpack('Itime/~author/A*license', fread($db, filesize($dbFile)));
316+
$meta = Pack::unpack('Itime/A128author/A*license', fread($db, filesize($dbFile)));
309317
$result = array_replace($result, $meta);
310318
fclose($db);
311319
return $result;

0 commit comments

Comments
 (0)