• R/O
  • SSH
  • HTTPS

okuyama: 提交


Commit MetaInfo

修訂810 (tree)
時間2011-10-19 15:55:33
作者okuyamaoo

Log Message

(empty log message)

Change Summary

差異

--- trunk/etc_client/OkuyamaClient.class.php (revision 809)
+++ trunk/etc_client/OkuyamaClient.class.php (revision 810)
@@ -53,6 +53,9 @@
5353
5454 private $errormsg;
5555
56+ private $okuyamaVersionNo = 0.00;
57+
58+
5659 /**
5760 * MasterNodeの接続情報を設定する.<br>
5861 * 本メソッドでセットし、autoConnect()メソッドを<br>
@@ -184,7 +187,7 @@
184187
185188 /**
186189 * Clientを初期化する.<br>
187- * 今のところは最大保存サイズの初期化のみ<br>
190+ * 今のところは最大保存サイズの初期化とバージョンの取得<br>
188191 *
189192 * @return boolean true:開始成功 false:開始失敗
190193 * @throws Exception
@@ -240,6 +243,15 @@
240243 }
241244 }
242245
246+ // バージョン取得
247+ $versionRet = $this->getOkuyamaVersion();
248+
249+ if ($versionRet[0] === "true") {
250+
251+ $versionWork = explode("okuyama-", $versionRet[1]);
252+
253+ $this->okuyamaVersionNo = (double)$versionWork[1];
254+ }
243255 } catch (OkuyamaClientException $oe) {
244256 throw $oe;
245257 } catch (Exception $e) {
@@ -255,7 +267,72 @@
255267 return $ret;
256268 }
257269
270+ /**
271+ * 接続先のokuyamaのバージョンを返す<br>
272+ *
273+ * @return String[] 要素1(データ有無):"true" or "false",要素2(データ):okuyamaのバージョン文字列
274+ * @throws OkuyamaClientException
275+ */
276+ public function getOkuyamaVersion() {
277+ $ret = array();
258278
279+ $serverRetStr = null;
280+ $serverRet = null;
281+
282+ $serverRequestBuf = null;
283+
284+ try {
285+ // エラーチェック
286+ if ($this->socket == null) throw new OkuyamaClientException("No ServerConnect!!");
287+
288+ // 文字列バッファ初期化
289+ $serverRequestBuf = "";
290+
291+ // 処理番号連結
292+ $serverRequestBuf = $serverRequestBuf . "999";
293+
294+ // サーバ送信
295+ @fputs($this->socket, $serverRequestBuf . "\n");
296+
297+ $serverRetStr = @fgets($this->socket);
298+ $serverRetStr = str_replace("\r", "", $serverRetStr);
299+ $serverRetStr = str_replace("\n", "", $serverRetStr);
300+ $serverRet = explode($this->sepStr, $serverRetStr);
301+
302+ // 処理の妥当性確認
303+ if ($serverRet[0] === "999") {
304+ // 取得
305+ $ret[0] = "true";
306+ $ret[1] = $serverRet[1];
307+
308+ } else {
309+ if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
310+ if($this->autoConnect()) {
311+ $ret = $this->getOkuyamaVersion();
312+ }
313+ } else {
314+
315+ // 妥当性違反
316+ throw new OkuyamaClientException("Execute Violation of validity");
317+ }
318+ }
319+ } catch (OkuyamaClientException $oe) {
320+ throw $oe;
321+ } catch (Exception $e) {
322+ if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
323+ if($this->autoConnect()) {
324+ $ret = $this->getOkuyamaVersion();
325+ }
326+ } else {
327+
328+ // 妥当性違反
329+ throw e;
330+ }
331+ }
332+ return $ret;
333+ }
334+
335+
259336 /**
260337 * Transactionを開始する.<br>
261338 * データロック、ロックリリースを使用する場合は、<br>
@@ -560,14 +637,16 @@
560637 * マスタサーバへデータを送信する.<br>
561638 * データ保存を行う.<br>
562639 * Tag有り.<br>
640+ * 有効期限が秒単位で設定可能
563641 *
564642 * @param keyStr
643+ * @param value
565644 * @param tagStrs
566- * @param value
645+ * @param expireTime 有効期限(秒/単位)
567646 * @return boolean
568647 * @throws Exception
569648 */
570- public function setValue($keyStr, $value, $tagStrs = null) {
649+ public function setValue($keyStr, $value, $tagStrs = null, $expireTime = null) {
571650 $ret = false;
572651 $serverRetStr = null;
573652 $serverRet = null;
@@ -647,6 +726,22 @@
647726 // Value連結
648727 $serverRequestBuf = $serverRequestBuf . $encodeValue;
649728
729+ // 有効期限連結
730+ if ($expireTime != null) {
731+ // 有効期限あり
732+ if (0.880 > $this->okuyamaVersionNo) {
733+
734+ throw new OkuyamaClientException("The version of the server is old [The expiration date can be used since version 0.8.8]");
735+ } else {
736+ // セパレータ連結
737+ $serverRequestBuf = $serverRequestBuf . $this->sepStr;
738+ $serverRequestBuf = $serverRequestBuf . intval($expireTime);
739+ // セパレータ連結 最後に区切りを入れて送信データ終わりを知らせる
740+ $serverRequestBuf = $serverRequestBuf . $this->sepStr;
741+ }
742+ }
743+
744+
650745 // サーバ送信
651746 @fputs($this->socket, $serverRequestBuf . "\n");
652747
@@ -669,7 +764,7 @@
669764 } else {
670765 if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
671766 if($this->autoConnect()) {
672- $ret = $this->setValue($keyStr, $value, $tagStrs);
767+ $ret = $this->setValue($keyStr, $value, $tagStrs, $expireTime);
673768 }
674769 } else {
675770
@@ -682,7 +777,7 @@
682777 } catch (Exception $e) {
683778 if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
684779 if($this->autoConnect()) {
685- $ret = $this->setValue($keyStr, $value, $tagStrs);
780+ $ret = $this->setValue($keyStr, $value, $tagStrs, $expireTime);
686781 }
687782 } else {
688783
@@ -861,7 +956,7 @@
861956 * @return boolean
862957 * @throws Exception
863958 */
864- public function setNewValue($keyStr, $value, $tagStrs = null) {
959+ public function setNewValue($keyStr, $value, $tagStrs = null, $expireTime) {
865960 $ret = false;
866961 $serverRetStr = null;
867962 $serverRet = null;
@@ -939,6 +1034,21 @@
9391034 // Value連結
9401035 $serverRequestBuf = $serverRequestBuf . $encodeValue;
9411036
1037+ // 有効期限連結
1038+ if ($expireTime != null) {
1039+ // 有効期限あり
1040+ if (0.880 > $this->okuyamaVersionNo) {
1041+
1042+ throw new OkuyamaClientException("The version of the server is old [The expiration date can be used since version 0.8.8]");
1043+ } else {
1044+ // セパレータ連結
1045+ $serverRequestBuf = $serverRequestBuf . $this->sepStr;
1046+ $serverRequestBuf = $serverRequestBuf . intval($expireTime);
1047+ // セパレータ連結 最後に区切りを入れて送信データ終わりを知らせる
1048+ $serverRequestBuf = $serverRequestBuf . $this->sepStr;
1049+ }
1050+ }
1051+
9421052 // サーバ送信
9431053 @fputs($this->socket, $serverRequestBuf . "\n");
9441054
@@ -962,7 +1072,7 @@
9621072 } else {
9631073 if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
9641074 if($this->autoConnect()) {
965- $ret = $this->setNewValue($keyStr, $value, $tagStrs);
1075+ $ret = $this->setNewValue($keyStr, $value, $tagStrs, $expireTime);
9661076 }
9671077 } else {
9681078
@@ -975,7 +1085,7 @@
9751085 } catch (Exception $e) {
9761086 if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
9771087 if($this->autoConnect()) {
978- $ret = $this->setNewValue($keyStr, $value, $tagStrs);
1088+ $ret = $this->setNewValue($keyStr, $value, $tagStrs, $expireTime);
9791089 }
9801090 } else {
9811091
@@ -1552,6 +1662,106 @@
15521662
15531663 /**
15541664 * マスタサーバからKeyでデータを取得する.<br>
1665+ * 文字列エンコーディング指定あり.<br>
1666+ * 取得と同時に値の有効期限を取得時から最初に設定した時間分延長更新<br>
1667+ * 有効期限を設定していない場合は更新されない.<br>
1668+ * Sessionキャッシュなどでアクセスした時間から所定時間有効などの場合にこちらのメソッドで<br>
1669+ * 値を取得していれば自動的に有効期限が更新される<br>
1670+ *
1671+ * @param keyStr
1672+ * @param encoding
1673+ * @return String[] 要素1(データ有無):"true" or "false",要素2(データ):"データ文字列"
1674+ * @throws Exception
1675+ */
1676+ public function getValueAndUpdateExpireTime($keyStr, $encoding="UTF-8") {
1677+ $ret = array();
1678+ $serverRetStr = null;
1679+ $serverRet = null;
1680+
1681+ $serverRequestBuf = null;
1682+
1683+ try {
1684+ if ($this->socket == null) throw new OkuyamaClientException("No ServerConnect!!");
1685+
1686+ // エラーチェック
1687+ // Keyに対する無指定チェック
1688+ if ($keyStr == null || $keyStr === "") {
1689+ throw new OkuyamaClientException("The blank is not admitted on a key");
1690+ }
1691+
1692+ // 文字列バッファ初期化
1693+ $serverRequestBuf = "";
1694+
1695+ // 処理番号連結
1696+ $serverRequestBuf = $serverRequestBuf . "17";
1697+ // セパレータ連結
1698+ $serverRequestBuf = $serverRequestBuf . $this->sepStr;
1699+
1700+ // Key連結(Keyはデータ送信時には必ず文字列が必要)
1701+ $serverRequestBuf = $serverRequestBuf . $this->dataEncoding($keyStr);
1702+
1703+ // サーバ送信
1704+ @fputs($this->socket, $serverRequestBuf . "\n");
1705+
1706+ $serverRetStr = @fgets($this->socket);
1707+ $serverRetStr = str_replace("\r", "", $serverRetStr);
1708+ $serverRetStr = str_replace("\n", "", $serverRetStr);
1709+ $serverRet = explode($this->sepStr, $serverRetStr);
1710+
1711+ // 処理の妥当性確認
1712+ if ($serverRet[0] === "17") {
1713+ if ($serverRet[1] === "true") {
1714+
1715+ // データ有り
1716+ $ret[0] =$serverRet[1];
1717+
1718+ // Valueがブランク文字か調べる
1719+ if ($serverRet[2] === $this->blankStr) {
1720+ $ret[1] = "";
1721+ } else {
1722+
1723+ // Value文字列をBase64でデコード
1724+ $ret[1] = $this->dataDecoding($serverRet[2], $encoding);
1725+ }
1726+ } else if($serverRet[1] === "false") {
1727+
1728+ // データなし
1729+ $ret[0] = $serverRet[1];
1730+ $ret[1] = null;
1731+ } else if($serverRet[1] === "error") {
1732+
1733+ // エラー発生
1734+ $ret[0] = $serverRet[1];
1735+ $ret[1] = $serverRet[2];
1736+ }
1737+ } else {
1738+ if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
1739+ if($this->autoConnect()) {
1740+ $ret = $this->getValueAndUpdateExpireTime($keyStr, $encoding);
1741+ }
1742+ } else {
1743+
1744+ // 妥当性違反
1745+ throw new OkuyamaClientException("Execute Violation of validity");
1746+ }
1747+ }
1748+ } catch (OkuyamaClientException $oe) {
1749+ throw $oe;
1750+ } catch (Exception $e) {
1751+ if ($this->masterNodesList != null && count($this->masterNodesList) > 1) {
1752+ if($this->autoConnect()) {
1753+ $ret = $this->getValueAndUpdateExpireTime($keyStr, $encoding);
1754+ }
1755+ } else {
1756+ throw $e;
1757+ }
1758+ }
1759+ return $ret;
1760+ }
1761+
1762+
1763+ /**
1764+ * マスタサーバからKeyでデータを取得する.<br>
15551765 * 取得データに対してJavaScriptを実行する.<br>
15561766 * 文字列エンコーディング指定あり.<br>
15571767 *
--- trunk/etc_client/PhpAutoTest.bat (revision 809)
+++ trunk/etc_client/PhpAutoTest.bat (revision 810)
@@ -2,6 +2,8 @@
22 php PhpTestSock.php 1 127.0.0.1 8888 10
33 rem キー値をkey_aでバリュー値value_bを登録
44 php PhpTestSock.php 1.1 127.0.0.1 8888 key_a value_b
5+rem キー値をkey_aでバリュー値value_cを登録-有効期限テスト
6+php PhpTestSock.php 1.2 127.0.0.1 8888 key_c value_c 3
57 rem キー値を自動でインクリメントして10個valueを取得
68 php PhpTestSock.php 2 127.0.0.1 8888 10
79 rem キー値をkey_aでvalueを取得
@@ -10,6 +12,8 @@
1012 php PhpTestSock.php 2.3 127.0.0.1 8888 key_a "var dataValue; var retValue = dataValue.replace('b', 'dummy'); var execRet = '1';"
1113 rem キー値をkey_aで取得したvalueに対してJavaScriptを実行
1214 php PhpTestSock.php 2.4 127.0.0.1 8888 key_a "var dataValue; var dataKey; var retValue = dataValue.replace('b', 'dummy'); if(dataKey == 'key_a') {var execRet = '2'} else {var execRet = '1'}"
15+rem キー値をkey_aでバリュー値value_dを登録-有効期限設定を行って有効期限到達前に更新での取得
16+php PhpTestSock.php 2.5 127.0.0.1 8888 key_d value_d 3
1317 rem Tag値を自動で変えて、KeyとValueを10回登録
1418 php PhpTestSock.php 3 127.0.0.1 8888 10
1519 rem Tag値をtag1を指定して、tag1に属するKey値を取得(Key値存在指定有り(true))
@@ -22,8 +26,10 @@
2226 php PhpTestSock.php 9 127.0.0.1 8888 key_a 10 5
2327 rem 値の新規登録をおこなう
2428 php PhpTestSock.php 10 127.0.0.1 8888 newkey newvalue
25-rem gets
29+rem get
2630 php PhpTestSock.php 11 127.0.0.1 8888 newkey
31+rem 値の新規登録をおこなう-有効期限あり
32+php PhpTestSock.php 10.1 127.0.0.1 8888 newkeyT newvalueT 3
2733 rem cas
2834 php PhpTestSock.php 12 127.0.0.1 8888 newkey value_cas 0
2935 rem cas Miss
--- trunk/etc_client/PhpTestSock.php (revision 809)
+++ trunk/etc_client/PhpTestSock.php (revision 810)
@@ -54,7 +54,26 @@
5454 if(!$client->setValue($argv[4], $argv[5])) {
5555 print_r("Regist Error");
5656 }
57+ } else if ($argv[1] === "1.2") {
5758
59+ // データを有効期限付きで登録
60+ if(!$client->setValue($argv[4], $argv[5], null, $argv[6])) {
61+
62+ print_r("Regist Error");
63+ } else {
64+
65+ sleep(intval($argv[6]));
66+ sleep(1);
67+ $ret = $client->getValue($argv[4]);
68+ if ($ret[0] === "true") {
69+ print_r("ExpireData Get Error");
70+ print_r($ret[1]);
71+ print_r("\r\n");
72+ } else if ($ret[0] === "false") {
73+ print_r("ExpireData Get OK");
74+ print_r("\r\n");
75+ }
76+ }
5877 } else if ($argv[1] === "42") {
5978
6079 // データを引数の回数分登録
@@ -143,6 +162,29 @@
143162 print_r("There is no data");
144163 print_r("\r\n");
145164 }
165+ } else if ($argv[1] === "2.5") {
166+ // 指定のKey値でデータを取得
167+ // 有効期限を自動的に更新する
168+ // データを有効期限付きで登録
169+ if(!$client->setValue($argv[4], $argv[5], null, $argv[6])) {
170+
171+ print_r("Regist Error");
172+ } else {
173+
174+ sleep(intval($argv[6]) - 1);
175+ $ret = $client->getValueAndUpdateExpireTime($argv[4]);
176+ sleep(1);
177+ $ret = $client->getValue($argv[4]);
178+ if ($ret[0] === "false") {
179+ print_r("ExpireTimeUpdateGet Error");
180+ print_r($ret[1]);
181+ print_r("\r\n");
182+ } else if ($ret[0] === "true") {
183+ print_r("ExpireTimeUpdateGet OK");
184+ print_r("\r\n");
185+ }
186+ }
187+
146188 } else if ($argv[1] === "3") {
147189
148190 // データを引数の回数分登録(Tagを登録)
@@ -279,9 +321,23 @@
279321 var_dump($ret);
280322
281323 } else if ($argv[1] === "10") {
282- // データを引数の回数分登録
324+ // データを引数の新規登録
283325 var_dump($client->setNewValue($argv[4], $argv[5]));
284326
327+ } else if ($argv[1] === "10.1") {
328+ // データを引数の新規登録-有効期限あり
329+ var_dump($client->setNewValue($argv[4], $argv[5], null, $argv[6]));
330+ sleep($argv[6]);
331+ sleep(1);
332+ $ret = $client->getValue($argv[4]);
333+ if ($ret[0] === "true") {
334+ print_r("ExpireNewData Get Error");
335+ print_r($ret[1]);
336+ print_r("\r\n");
337+ } else if ($ret[0] === "false") {
338+ print_r("ExpireNewData Get OK");
339+ print_r("\r\n");
340+ }
285341 } else if ($argv[1] === "11") {
286342 // gets
287343 var_dump($client->getValueVersionCheck($argv[4]));
Show on old repository browser