#!/usr/bin/python
# coding: utf-8
import sys
import re
class CRUD(object):
def __init__(self):
self.hash = {}
def insert(self, arg0, arg1):
h = self.hash
if h.has_key(arg0):
raise Exception, arg0 + ' は既に存在します。'
h[arg0] = arg1
def select(self, arg0):
h = self.hash
p = re.compile(arg0)
for key, val in h.iteritems():
if p.match(key):
print key + ' => ' + val
def update(self, arg0, arg1):
h = self.hash
if not h.has_key(arg0):
raise Exception, arg0 + ' が見つかりませんでした。'
h[arg0] = arg1
def delete(self, arg0):
h = self.hash
if not h.has_key(arg0):
raise Exception, arg0 + ' が見つかりませんでした。'
del h[arg0]
def parse(s):
p0 = re.compile('^$') # CRUD>
p1 = re.compile('^([a-z]+).*$') # CRUD> cmd .....
p2 = re.compile('^([a-z]+)$') # CRUD> cmd
p3 = re.compile('^([a-z]+)\s+"([^"]+)"$') # CRUD> cmd "arg0"
p4 = re.compile('^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$') # CRUD> cmd "arg0" => "arg1"
s = s.strip()
r = p0.match(s)
if r:
return { 'cmd': '' }
else:
r = p1.match(s)
if r:
if r.group(1) == 'exit':
r = p2.match(s)
if r:
return {
'cmd': r.group(1)
}
elif r.group(1) == 'select' or r.group(1) == 'delete':
r = p3.match(s)
if r:
return {
'cmd' : r.group(1),
'arg0': r.group(2)
}
elif r.group(1) == 'insert' or r.group(1) == 'update':
r = p4.match(s)
if r:
return {
'cmd' : r.group(1),
'arg0': r.group(2),
'arg1': r.group(3)
}
raise Exception, '文法エラーです。'
crud = CRUD()
while True:
try:
r = parse(raw_input('CRUD> '))
if r['cmd'] == 'insert':
crud.insert(r['arg0'], r['arg1'])
elif r['cmd'] == 'select':
crud.select(r['arg0'])
elif r['cmd'] == 'update':
crud.update(r['arg0'], r['arg1'])
elif r['cmd'] == 'delete':
crud.delete(r['arg0'])
elif r['cmd'] == 'exit':
sys.exit()
elif r['cmd'] =='':
pass
except Exception, e:
print e
|