#!/usr/bin/php
<?php
class CRUD {
private $hash = array();
public function insert($arg0, $arg1) {
$h =& $this->hash;
if (array_key_exists($arg0, $h)) {
throw new Exception($arg0.' は既に存在します。');
}
$h[$arg0] = $arg1;
}
public function select($arg0) {
$h =& $this->hash;
$p = "/{$arg0}/";
foreach ($h as $key => $val) {
if (preg_match($p, $key)) {
print $key.' => '.$val."\n";
}
}
}
public function update($arg0, $arg1) {
$h =& $this->hash;
if (!array_key_exists($arg0, $h)) {
throw new Exception($arg0.' が見つかりませんでした。');
}
$h[$arg0] = $arg1;
}
public function delete($arg0) {
$h =& $this->hash;
if (!array_key_exists($arg0, $h)) {
throw new Exception($arg0.' が見つかりませんでした。');
}
unset($h[$arg0]);
}
}
function parse($s) {
$p0 = '/^$/'; // CRUD>
$p1 = '/^([a-z]+).*$/'; // CRUD> cmd .....
$p2 = '/^([a-z]+)$/'; // CRUD> cmd
$p3 = '/^([a-z]+)\s+"([^"]+)"$/'; // CRUD> cmd "arg0"
$p4 = '/^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$/'; // CRUD> cmd "arg0" => "arg1"
$s = trim($s);
if (preg_match($p0, $s, $r)) {
return array('cmd'=>'');
}
else if (preg_match($p1, $s, $r)) {
switch ($r[1]) {
case 'exit':
if (preg_match($p2, $s, $r)) {
return array('cmd'=>$r[1]);
}
break;
case 'select':
case 'delete':
if (preg_match($p3, $s, $r)) {
return array('cmd'=>$r[1], 'arg0'=>$r[2]);
}
break;
case 'insert':
case 'update':
if (preg_match($p4, $s, $r)) {
return array('cmd'=>$r[1], 'arg0'=>$r[2], 'arg1'=>$r[3]);
}
break;
}
}
throw new Exception('文法エラーです。');
}
$crud = new CRUD();
while (true) {
try {
print 'CRUD> ';
$r = parse(fgets(STDIN));
switch ($r['cmd']) {
case 'insert':
$crud->insert($r['arg0'], $r['arg1']);
break;
case 'select':
$crud->select($r['arg0']);
break;
case 'update':
$crud->update($r['arg0'], $r['arg1']);
break;
case 'delete':
$crud->delete($r['arg0']);
break;
case 'exit':
exit;
break;
case '':
break;
}
}
catch (Exception $e) {
print $e->getMessage()."\n";
}
}
?>
|