Skip to content

Instantly share code, notes, and snippets.

@mizchi
Created July 17, 2010 06:50
Show Gist options
  • Select an option

  • Save mizchi/479313 to your computer and use it in GitHub Desktop.

Select an option

Save mizchi/479313 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
#-*- encoding:utf-8 -*-
__author__="mizchi"
"""
要: pytyrant
KVSのTokyoTytrantを、dict(またはjson)をスキーマにして扱います
実際はヘッダーのprefix_searchと末尾のIDによるマッピングのキーバリューです
サンプル
scheme = {"text":"",
"user":"",
"root":{"from":"",
"to":{"location":"",
"id":":"
}
}
}
ts = TScheme(scheme,header="myproj")
obj=scheme.copy()
obj["text"]="hello!"
ts.put(obj)
ret = ts.mget(where="text")
print ret[0]# => {"ids":"0","text":"hello!"}
"""
from pytyrant import PyTyrant
import pickle
class TScheme(object) :
VALUE_MAP={"str":str,"int":int}
def __init__(self,scheme,header=""):
scheme["++unique++"]="int"
self.__scheme = scheme
self.quantity = 0
self.header=header+":"
def dump(self):
self.__dump(self.__scheme)
def __dump(self,scheme,header="",paths=[]):
for k,v in scheme.iteritems():
if type(v)==dict :
self.__dump(v,header+"/"+k)
elif type(v) == str :
print header+"/"+k+"\t"+v
def raw_get(self,where="",number=0):
obj = {}
query = self.header+"/"+where
con = PyTyrant.open("127.0.0.1",1978)
ret = con.prefix_keys(query)
for i in sorted(ret):
if not number or int(i.split("_")[-1]) == number :
obj[i]=con[i]
con.close()
return obj
def mget(self,where="",number=0,join=True):
if type(where)==str : where = [where]
objs=[]
con = PyTyrant.open("127.0.0.1",1978)
ret = []
for i in where :
query = self.header+"/"+i
ret += con.prefix_keys(query)
for i in sorted(ret):
ids=i.split("_")[-1]
if not number or ids == number :
# objs.append(self.__parse(i,con[i]))
item = self.__parse(i,con[i])
item.update({"ids":ids})
objs.append(item )
con.close()
return sorted(objs)
def join(self,objs):
pass
def __parse(self,key,value):
params = key.split("_")[0].split("/")[1:]
item = self.__mkval(params,value)
return item # self.__mkval(params,value)
def put(self,dic,num=-1):
if num == -1: num=self.get_length()
dic["++unique++"]=str(num)
con = PyTyrant.open("127.0.0.1",1978)
self.__put(dic,str(num),self.header)
con.close()
def __put(self,scheme,num,header=""):
for k,v in scheme.iteritems():
if type(v)==dict :
self.__put(v,num,header+"/"+k)
elif type(v) == str :
query = header + "/" + k+"_"+num
con = PyTyrant.open("127.0.0.1",1978)
con[query] = v
con.close()
def get_length(self):
con = PyTyrant.open("127.0.0.1",1978)
query = self.header+"/"+"++unique++"
length= len(con.prefix_keys(query))
con.close()
return length
def __mkval(self,path,dic="val"):
if not path:
return dic
else :
ndic ={path[-1] :dic }
return self.__mkval(path[0:-1],ndic)
def __repr__(self):
print "===== TokyoSecretary ======="
print "namespace ' %s ' " % self.header
self.__dump(self.__scheme)
return str(self.get_length())+" items"
def delete_all(self):
con=PyTyrant.open("127.0.0.1",1978)
ret = con.prefix_keys(self.header)
for i in ret:
del con[i]
con.close()
def save(self,fname):
con=PyTyrant.open("127.0.0.1",1978)
ret = con.prefix_keys(self.header)
con.close()
def save(self,obj,fname):
con=PyTyrant.open("127.0.0.1",1978)
ret = con.prefix_keys(self.header)
con.close()
pickle.dump(ret,open(fname+".pkl","w"))
print "dump "+fname+".pkl"
def update(self):
con=PyTyrant.open("127.0.0.1",1978)
ret = con.prefix_keys(self.header)
rep = self.__scheme.copy()
rep.update(con[i])
con=rep
con.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment