| Новости | 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. было бы здорово, если бы кто-нить ещё потестировал.