Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Misha v.3 27.04.2017 15:10 / 29.04.2017 10:50
в общем если ничего не напутал, то с json получается как-то так (в Sql.p заменить методы _save/_load на это):@_save[sType;sFileSpec;uValue][s] ^switch[$sType]{ ^case[int;double;string]{ ^uValue.save[$sFileSpec] } ^case[table]{ ^uValue.save[$sFileSpec;$.encloser["]] } ^case[hash]{ $s[^json:string[$uValue;$.table[object]$.indent(true)]] ^s.save[$sFileSpec] } ^case[file]{ ^uValue.save[binary;$sFileSpec] } ^case[void]{} } $result[] @_load[sType;sFileSpec;hOption][f;t;c] ^switch[$sType]{ ^case[int]{ $f[^file::load[text;$sFileSpec]] $result(^f.text.int(0)) } ^case[double]{ $f[^file::load[text;$sFileSpec]] $result(^f.text.double(0)) } ^case[string]{ $f[^file::load[text;$sFileSpec]] $result[$f.text] } ^case[table]{ $result[^table::load[$sFileSpec;$.encloser["]]] } ^case[hash]{ $f[^file::load[text;$sFileSpec]] $result[^json:parse[^taint[as-is][$f.text];$.array[$self._ao2t]]] } ^case[file]{ $result[^file::load[binary;$sFileSpec]] } ^case[void]{ $result[] } } @_ao2t[key;value][h;k;v] $h[^value._at(0)] $result[^table::create{^h.foreach[k;]{$k^#09}}] ^value.foreach[;h]{ ^result.append{^h.foreach[;v]{$v^#09}} }Другой вариант сериализации хэша таблиц (получаемый файл чуть более компактный):
@_aa2t[key;value][result;h;v] ^if(def $key){ ^value.foreach[;h]{ ^if($result is "table"){ ^result.append{^h.foreach[;v]{$v^#09}} }{ $result[^table::create{^h.foreach[;v]{$v^#09}}] } } }{ $result[$value] }Далее тесты.
@USE sql/MySql.p sql/SqlLog.p @main[] $oSQL[^MySql::create[$SQL.connect-string; $.bDebug(1) $.sCacheDir[$MAIN:CACHE_DIR/_sql] $.bCacheAuto(true) ]] $oSQLLog[^SqlLog::create[$oSQL]] ^oSQL.connect{ ^try{ ^oSQL.void{CREATE TABLE test (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, a TINYINT, b VARCHAR(31))} ^for[i](1;20){ ^oSQL.void{INSERT INTO test (a, b) VALUES (^eval($i % 2), 'x${i}y')} } }{ $exception.handled(true) } <style> pre {margin-bottom: 0} </style> <table border="1" cellspacing="0" cellpadding="2"> $z[^oSQL.int{SELECT 2+2}[;$.bAuto(false)]] $s[SELECT id FROM test WHERE id = 2] <tr> <td>^oSQL.int{$s}</td><td>^oSQL.int{$s}</td> <tr> $s[SELECT id / 2 FROM test WHERE id = 9] <tr> <td>^oSQL.double{$s}</td><td>^oSQL.double{$s}</td> <tr> $s[SELECT b FROM test WHERE id = 2] <tr> <td>^oSQL.string{$s}</td><td>^oSQL.string{$s}</td> <tr> $s[SELECT id, a, b FROM test WHERE id < 4] <tr> <td><pre>^json:string[^oSQL.table{$s};$.indent(true)]</pre></td><td><pre>^json:string[^oSQL.table{$s};$.indent(true)]</pre></td> <tr> $s[SELECT id, a, b FROM test WHERE id > 18] <tr> <td><pre>^json:string[^oSQL.hash{$s};$.indent(true)]</pre></td><td><pre>^json:string[^oSQL.hash{$s};$.indent(true)]</pre></td> <tr> $s[SELECT a, b FROM test WHERE id > 16] <tr> <td><pre>^json:string[^oSQL.hash{$s}[$.type[table]$.distinct(true)];$.indent(true)]</pre></td><td><pre>^json:string[^oSQL.hash{$s}[$.type[table]$.distinct(true)];$.indent(true)]</pre></td> <tr> $s[SELECT id, b FROM test WHERE id > 11 AND id < 15] <tr> <td><pre>^json:string[^oSQL.hash{$s}[$.type[string]];$.indent(true)]</pre></td><td><pre>^json:string[^oSQL.hash{$s}[$.type[string]];$.indent(true)]</pre></td> <tr> </table> <pre> ^oSQLLog.print[ $.bAll(true) ] </pre> }P.S. было бы здорово, если бы кто-нить ещё потестировал.