powered by nequal
Home » Net_TokyoTyrant » Timeline » 44

Diffs

Net_TokyoTyrant/trunk/sample/sample_1.php

@@ -0,0 +1,11 @@
+<?php
+require_once '../Net/TokyoTyrant.php';
+$tt = new Net_TokyoTyrant();
+$tt->connect('localhost', 1978);
+$tt->put('oyomesan', 'nounai');
+var_dump($tt->get('oyomesan'));
+$tt->put('kanozyo', 'pc no naka');
+$tt->put('kareshi', 'otoko ha chotto');
+var_dump($tt->mget(array('oyomesan', 'kanozyo')));
+var_dump($tt->fwmkeys('ka', 100)); //ka
+

Net_TokyoTyrant/trunk/tests/tmp_test.php

@@ -0,0 +1,90 @@
+<?php
+require_once dirname(dirname(__FILE__)) . '/Net/TokyoTyrant.php';
+
+$tt = new Net_TokyoTyrant();
+$key = 'keytest';
+$data = 'the test data';
+$key2 = 'keytest2';
+$data2 = 'the test2 data';
+$count_key = 'count';
+$extname = 'echo';
+$error = null;
+try {
+    $tt->connect('dummy', 1978);
+} catch (Net_TokyoTyrantException $e) {
+    $error = $e->getMessage();
+}
+assert(is_string($error) && strlen($error) > 1);
+
+
+$tt->connect('localhost', 1978);
+
+assert($tt->vanish() === true);
+assert($tt->put($key, $data) === true);
+$getdata = $tt->get($key);
+assert($getdata === $data);
+
+assert($tt->putkeep($key, $data . 'keep') === false);
+$getdata = $tt->get($key);
+assert($getdata === $data);
+$tt->out($key);
+assert($tt->putkeep($key, $data . 'keep') === true);
+$getdata = $tt->get($key);
+assert($getdata === $data . 'keep');
+
+assert($tt->put($key, $data) === true);
+$getdata = $tt->get($key);
+assert($getdata === $data);
+assert($tt->putcat($key, $data) === true);
+$getdata = $tt->get($key);
+assert($getdata === $data . $data);
+
+
+assert($tt->put($key, $data) === true);
+assert($tt->putrtt($key, $data, 2) === true);
+$getdata = $tt->get($key);
+assert($getdata === substr($data, strlen($data) - 2, 2));
+
+
+assert($tt->out($key) === true);
+$getdata = $tt->get($key);
+assert($getdata === false);
+
+assert($tt->put($key, $data));
+assert($tt->put($key2, $data2));
+assert(count($tt->mget(array($key, $key2))) === 2);
+assert(count($tt->fwmkeys('key', 2)) === 2);
+assert($tt->vsize($key) === strlen($data));
+assert($tt->vanish() === true);
+assert($tt->iterinit() === true);
+assert($tt->iternext() === false);
+
+assert($tt->put($key, $data));
+assert($tt->iterinit() === true);
+assert($tt->iternext() === $key);
+assert($tt->iternext() === false);
+
+assert($tt->addint($count_key, 1) === 1);
+assert($tt->addint($count_key, 2) === 3);
+assert($tt->addint($count_key, -2) === 1);
+assert($tt->putint($count_key, 1));
+assert($tt->getint($count_key) === 1);
+assert($tt->addint($count_key, 1) === 2);
+assert($tt->getint($count_key) === 2);
+assert($tt->addint($count_key, -3) === -1);
+
+//$value = 'data';
+//assert($tt->ext($extname, $key, $value) === $value);
+//assert($tt->ext($extname, $key, $value, Net_TokyoTyrant::RDBXOLCKNON) === $value);
+//assert($tt->ext($extname, $key, $value, Net_TokyoTyrant::RDBXOLCKREC) === $value);
+//assert($tt->ext($extname, $key, $value, Net_TokyoTyrant::RDBXOLCKGLB) === $value);
+
+
+assert($tt->sync() === true);
+assert(is_array($tt->size()));
+assert(is_array($tt->rnum()));
+
+assert($tt->copy('/tmp/test.net_tokyotyrant.db') === true);
+assert(file_exists('/tmp/test.net_tokyotyrant.db') === true);
+assert(strlen($tt->stat()) > 1);
+$tt->close();

Net_TokyoTyrant/trunk/Net/TokyoTyrant.php

@@ -0,0 +1,420 @@
+<?php
+class Net_TokyoTyrantException extends Exception {};
+class Net_TokyoTyrantNetworkException extends Net_TokyoTyrantException {};
+class Net_TokyoTyrantProtocolException extends Net_TokyoTyrantException {};
+
+// License: MIT
+
+class Net_TokyoTyrant
+{
+    private
+      $connect = false;
+    private
+      $socket;
+    private
+      $errorNo, $errorMessage;
+
+    const RDBXOLCKNON = 0;
+    const RDBXOLCKREC = 1;
+    const RDBXOLCKGLB = 2;
+
+    public function connect($server, $port, $timeout = 10)
+    {
+        $this->close();
+        $this->socket = @fsockopen($server,$port, $this->errorNo, $errorMessage);
+        if (! $this->socket) {
+            throw new Net_TokyoTyrantNetworkException(sprintf('%s, %s', $this->errorNo, $errorMessage));
+        }
+        $this->connect = true;
+    }
+
+    public function close()
+    {
+        if ($this->connect) {
+            fclose($this->socket);
+        }
+    }
+
+
+    private function _read($length)
+    {
+        if ($this->connect === false) {
+            throw new Net_TokyoTyrantException('not connected');
+        }
+
+        if (@feof($this->socket))
+        {
+            throw new Net_TokyoTyrantNetworkException('socket read eof error');
+        }
+
+        $result = fread($this->socket, $length);
+        if ($result === false) {
+            throw new Net_TokyoTyrantNetworkException('socket read error');
+        }
+        return $result;
+    }
+
+
+    private function _write($data)
+    {
+        $result = fwrite($this->socket, $data);
+        if ($result === false) {
+            throw new Net_TokyoTyrantNetworkException('socket read error');
+        }
+    }
+
+
+
+    private function _doRequest($cmd, $values = array())
+    {
+        $this->_write($cmd . $this->_makeBin($values));
+    }
+
+    private function _makeBin($values){
+        $int = '';
+        $str = '';
+
+        foreach ($values as  $value) {
+            if (is_array($value)) {
+                $str .= $this->_makeBin($value);
+                continue;
+            }
+
+            if (! is_int($value)) {
+                $int .= pack('N', strlen($value));
+                $str .= $value;
+                continue;
+            }
+
+            $int .= pack('N', $value);
+        }
+        return $int . $str;
+    }
+
+
+    protected function _getResponse()
+    {
+        $res = fread($this->socket, 1);
+        $res = unpack('c', $res);
+        if ($res[1] !== 0) {
+            throw new Net_TokyoTyrantProtocolException('Error Response');
+        }
+        return true;
+    }
+
+
+    protected function _getInt1()
+    {
+        $result = '';
+        $res = $this->_read(1);
+        $res = unpack('c', $res);
+        return $res[1];
+    }
+
+    protected function _getInt4()
+    {
+        $result = '';
+        $res = $this->_read(4);
+        $res = unpack('N', $res);
+        return $res[1];
+    }
+
+    protected function _getInt8()
+    {
+        $result = '';
+        $res = $this->_read(8);
+        $res = unpack('N*', $res);
+        return array($res[1], $res[2]);
+    }
+
+    protected function _getValue()
+    {
+        $result = '';
+        $size = $this->_getInt4();
+        return $this->_read($size);
+    }
+
+
+    protected function _getKeyValue()
+    {
+        $result = array();
+        $ksize = $this->_getInt4();
+        $vsize = $this->_getInt4();
+        $result[] = $this->_read($ksize);
+        $result[] = $this->_read($vsize);
+        return $result;
+    }
+
+    protected function _getData()
+    {
+        $result = '';
+        $size = $this->_getInt4();
+        if ($size === 0) {
+            return '';
+        }
+        return $this->_read((int) $size);
+    }
+
+    protected function _getDataList()
+    {
+        $result = array();
+
+        $listCount = $this->_getInt4();
+        for($i = 0;$i < $listCount; $i++) {
+            $result[] = $this->_getValue();
+        }
+        return $result;
+    }
+
+
+    protected function _getKeyValueList()
+    {
+        $result = array();
+
+        $listCount = $this->_getInt4();
+        for($i = 0;$i < $listCount; $i++) {
+            list($key, $value)  = $this->_getKeyValue();
+            $result[$key] = $value;
+        }
+        return $result;
+    }
+
+    public function put($key, $value)
+    {
+        $cmd = pack('c*', 0xC8,0x10);
+        $this->_doRequest($cmd, array($key, $value));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    public function putkeep($key, $value)
+    {
+        $cmd = pack('c*', 0xC8,0x11);
+        $this->_doRequest($cmd, array($key, $value));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    public function putcat($key, $value)
+    {
+        $cmd = pack('c*', 0xC8,0x12);
+        $this->_doRequest($cmd, array($key, $value));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    public function putrtt($key, $value, $width)
+    {
+        $cmd = pack('c*', 0xC8,0x13);
+        $this->_doRequest($cmd, array($key, $value, $width));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    public function putnr($key, $value)
+    {
+        $cmd = pack('c*', 0xC8,0x18);
+        $this->_doRequest($cmd, array($key, $value, $width));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return ;
+        }
+        return ;
+    }
+
+    public function out($key)
+    {
+        $cmd = pack('c*', 0xC8,0x20);
+        $this->_doRequest($cmd, array($key));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    public function get($key)
+    {
+        $cmd = pack('c*', 0xC8,0x30);
+        $this->_doRequest($cmd, array($key));
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return $this->_getData();
+    }
+
+    public function mget($keys)
+    {
+        $cmd = pack('c*', 0xC8,0x31);
+        $values = array();
+        $values[] = count($keys);
+        foreach($keys as $key) {
+          $values[] = array($key);
+        }
+
+        $this->_doRequest($cmd, $values);
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return $this->_getKeyValueList();
+    }
+
+    public function fwmkeys($prefix, $max)
+    {
+        $cmd = pack('c*', 0xC8,0x58);
+        $this->_doRequest($cmd, array($prefix, $max));
+        $this->_getResponse();
+        return $this->_getDataList();
+    }
+
+    public function addint($key, $num)
+    {
+        $cmd = pack('c*', 0xC8,0x60);
+        $this->_doRequest($cmd, array($key, $num));
+        $this->_getResponse();
+        return $this->_getInt4();
+    }
+
+    public function putint($key, $num)
+    {
+        //This Code is non support
+        $value = pack('V', $num);
+        return $this->put($key, $value);
+    }
+
+    public function getint($key)
+    {
+        return $this->addint($key, 0);
+    }
+
+    public function adddouble($key, $integ, $fract)
+    {
+        $cmd = pack('c*', 0xC8,0x61);
+        $this->_doRequest($cmd, array($key, $intteg, $fract));
+        $this->_getResponse();
+        return array($this->_getInt8(), $this->_getInt8());
+    }
+
+
+    public function ext($extname, $key, $value, $option = 0)
+    {
+        $cmd = pack('c*', 0xC8,0x68);
+        $this->_doRequest($cmd, array($extname, $option, $key, $value));
+        $this->_getResponse();
+        return $this->_getData();
+    }
+
+    public function vsize($key)
+    {
+        $cmd = pack('c*', 0xC8,0x38);
+        $this->_doRequest($cmd, array($key));
+        $this->_getResponse();
+        return $this->_getInt4();
+    }
+
+    public function iterinit()
+    {
+        $cmd = pack('c*', 0xC8,0x50);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return true;
+    }
+
+    public function iternext()
+    {
+        $cmd = pack('c*', 0xC8,0x51);
+        $this->_doRequest($cmd);
+        try {
+            $this->_getResponse();
+        } catch (Net_TokyoTyrantProtocolException $e) {
+            return false;
+        }
+        return $this->_getValue();
+    }
+
+    public function sync()
+    {
+        $cmd = pack('c*', 0xC8,0x70);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return true;
+    }
+
+    public function vanish()
+    {
+        $cmd = pack('c*', 0xC8,0x71);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return true;
+    }
+
+    public function copy($path)
+    {
+        $cmd = pack('c*', 0xC8,0x72);
+        $this->_doRequest($cmd, array($path));
+        $this->_getResponse();
+        return true;
+    }
+
+    public function restore($path)
+    {
+        $cmd = pack('c*', 0xC8,0x73);
+        $this->_doRequest($cmd, array($path));
+        $this->_getResponse();
+        return true;
+    }
+
+    public function setmst($host, $port)
+    {
+        $cmd = pack('c*', 0xC8,0x78);
+        $this->_doRequest($cmd, array($host,$port));
+        $this->_getResponse();
+        return true;
+    }
+
+    public function rnum()
+    {
+        $cmd = pack('c*', 0xC8,0x80);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return $this->_getInt8();
+    }
+
+    public function size()
+    {
+        $cmd = pack('c*', 0xC8,0x81);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return $this->_getInt8();
+    }
+
+    public function stat()
+    {
+        $cmd = pack('c*', 0xC8,0x88);
+        $this->_doRequest($cmd);
+        $this->_getResponse();
+        return $this->_getValue();
+    }
+}