Arquivos
hhvm/hphp/doc/apc_sample_serializer.php
T
Jordan Delong 363d1bb20f Code move src/ -> hphp/
This change is mostly for FB internal organizational reasons.
Building is not effected beyond the fact that the target now
lands in hphp/hhvm/hhvm rather than src/hhvm/hhvm.
2013-02-11 02:10:41 -08:00

163 linhas
4.0 KiB
PHP

<?php
/**
* Write .cpp files for building libapc_prime.so that can be loaded by an
* HPHP-compiled server at startup time.
*/
class CacheArchiveHphpSerializer extends CacheArchiveSerializer {
public function __construct($archive_name) {
$this->archive_name = $archive_name;
}
public function getName() { return 'hphp';}
public function unserialize($data) {}
public function serialize($data) {
$tmp = 0;
$out = "\n#include \"apc_prime.h\"\n\n";
$out .= "namespace HPHP {\n";
$out .= str_repeat('/', 79)."\n\n";
$out .= "APC_BEGIN(".$this->getArchiveId().");\n";
unset($data['dummy_key']);
$this->serializeStrings($out, $data);
$this->serializeInt64 ($out, $data);
$this->serializeObjects($out, $data);
$this->serializeChars ($out, $data);
$this->serializeThrifts($out, $data);
$this->serializeOthers ($out, $data);
$out .= "APC_END(".$this->getArchiveId().");\n\n";
$out .= str_repeat('/', 79)."\n";
$out .= "}\n";
return $out;
}
private function getArchiveId() {
return preg_replace('/-/', '_', $this->archive_name);
}
private function s($s) {
static $esc_chars = "\0\n\r\t\\\"?";
$slen = strlen($s);
$s = addcslashes($s, $esc_chars);
return "\"$s\",S($slen)";
}
private function serializeChars(&$out, &$data) {
$i = 0;
$keys = "static const char *char_keys[] = {\n";
$values = "static char char_values[] = {\n";
foreach ($data as $k => $v) {
if ($v === null || is_bool($v)) {
$keys .= $this->s($k).',';
if ($v === null) {
$values .= '2,';
} else if ($v) {
$values .= '1,';
} else {
$values .= '0,';
}
if (++$i % 10 == 0) {
$keys .= "\n";
$values .= "\n";
}
unset($data[$k]);
}
}
$keys .= "\nNULL};\n";
$values .= "\n};\n";
$out .= $keys;
$out .= $values;
}
private function serializeInt64(&$out, &$data) {
$i = 0;
$keys = "static const char *int_keys[] = {\n";
$values = "static int64 int_values[] = {\n";
foreach ($data as $k => $v) {
if (is_int($v)) {
$keys .= $this->s($k).',';
if ($v >= (1 << 32)) {
$values .= $v.'LL,';
} else {
$values .= $v.',';
}
if (++$i % 10 == 0) {
$keys .= "\n";
$values .= "\n";
}
unset($data[$k]);
}
}
$keys .= "\nNULL};\n";
$values .= "\n};\n";
$out .= $keys;
$out .= $values;
}
private function serializeStrings(&$out, &$data) {
$i = 0;
$kvs = "static const char *strings[] = {\n";
foreach ($data as $k => $v) {
if (is_string($v)) {
$kvs .= $this->s($k).','.$this->s($v).',';
if (++$i % 10 == 0) {
$kvs .= "\n";
}
unset($data[$k]);
}
}
$kvs .= "\nNULL};\n";
$out .= $kvs;
}
private function serializeObjects(&$out, &$data) {
$i = 0;
$kvs = "static const char *objects[] = {\n";
foreach ($data as $k => $v) {
if (is_object($v)) {
$kvs .= $this->s($k).','.$this->s(serialize($v)).',';
if (++$i % 10 == 0) {
$kvs .= "\n";
}
unset($data[$k]);
}
}
$kvs .= "\nNULL};\n";
$out .= $kvs;
}
private function serializeThrifts(&$out, &$data) {
$i = 0;
$kvs = "static const char *thrifts[] = {\n";
foreach ($data as $k => $v) {
$sv = fb_thrift_serialize($v);
if ($sv) {
$kvs .= $this->s($k).','.$this->s($sv).',';
if (++$i % 10 == 0) {
$kvs .= "\n";
}
unset($data[$k]);
}
}
$kvs .= "\nNULL};\n";
$out .= $kvs;
}
private function serializeOthers(&$out, &$data) {
$i = 0;
$kvs = "static const char *others[] = {\n";
foreach ($data as $k => $v) {
$kvs .= $this->s($k).','.$this->s(serialize($v)).',';
if (++$i % 10 == 0) {
$kvs .= "\n";
}
}
$kvs .= "\nNULL};\n";
$out .= $kvs;
}
}