Created
July 17, 2010 06:50
-
-
Save mizchi/479313 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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