parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

ясно :)

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}}
}
Другой вариант сериализации хэша таблиц (получаемый файл чуть более компактный):
используем ^json:string[...;$.table[array]] + ^json:parse[$.array[$self._aa2t]] +
@_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]
}
Далее тесты.
В них делается по два одинаковых запроса, результаты обоих выводятся рядышком.
В последующем sql логе видно, что реальных запросов string/int/double/table/hash в 2 раза меньше, т.е. каждый второй запрос кэшировался.

При повторной загрузки страницы видно, что в логе есть только один запрос, у которого принудительно отключено кэширование.
@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. было бы здорово, если бы кто-нить ещё потестировал.