class Database: ''' Clase manejadora de operaciones con una base de datos/catalogo. ''' def __init__(self,rutaBD): u''' Costructor de la clase. ''' self.__pathBD = rutaBD self.__Busqueda = Busqueda() self.bd = sqlite.sqlite(self.__pathBD) ############### # METODOS BD # ############### def getPathBD(self): u''' Obtiene la ruta de la base de datos en uso. ''' return self.__pathBD def getLenguajes(self): u''' Obtiene los lenguajes para la actual BD. ''' resultado = self.bd.realizarConsulta('SELECT DISTINCT language FROM snippet ORDER BY language') return resultado def getLengAndTitles(self, consulta=None, favorito = None, tagsPresicion = None): u''' Obtiene los snippets por lenguajes de la actual BD. @return: una lista de tuplas con este formato (lenguaje,titulo)''' #por defecto busca los que no son favoritos if not consulta and not favorito: resultado = self.bd.realizarConsulta('''SELECT language,title FROM snippet ORDER BY language,title ''') else: #si no se pasa este parametro if favorito is None: favorito = 0 if tagsPresicion is None: tagsPresicion = False #genera un sql con la busqueda segun la consulta recibida consulta = self.__Busqueda.generarConsulta(consulta, int(favorito), tagsPresicion) #obtiene los resultados de la consulta resultado = self.realizarConsulta(consulta) return resultado def getAllSnippets(self): u''' Obtiene todos los snippets de la base de datos. ''' resultado = self.bd.realizarConsulta('''SELECT title,language,tags,contens, description,creation,reference, modified,uploader,starred FROM snippet ORDER BY language,title''') return resultado def getSnippet(self, lenguaje, titulo): u''' Obtiene un snippet por su lenguaje y titulo correspondiente. ''' resultado = self.bd.getDatosColumnas("snippet",criterios = {'language':lenguaje,'title':titulo}) return self.__convertirASnippet(resultado) def getSnippetsCount(self): u''' Obtiene la cantidad de snippets cargados en la actual bd. ''' cantidad = self.realizarConsulta('SELECT count(*) FROM snippet') return int(cantidad[0][0]) def realizarConsulta(self,consulta): return self.bd.realizarConsulta(consulta) ################################ # METODOS PARA MANEJAR SNIPPET # ################################ def agregarSnippet(self, datosSnippet): u''' Agrega un nuevo Snippet a la base de datos. datosSnippet = diccionario con los datos del snippet a agregar.''' # TODO: agregar los try-catch para contemplar: # º snippet repetido # º error al agregar un snippet #genera los sig de preguntas segun la cantidad de campos recibidos sp = str('('+'?,'*len(datosSnippet))[:-1] + ')' #genera un string con los nombre de los campos campos = '('+','.join(datosSnippet.keys())+')' #se convierten los campos a unicode/utf8 valores = [] for valor in datosSnippet.values(): valores.append(valor)#.encode('ascii','utf-8')) try: return self.bd.realizarAlta("snippet", datosSnippet) , None except Exception, msg: print 'agregarSnippet >> ',str(msg) return False, str(msg)
class Database: ''' Clase manejadora de operaciones con una base de datos/catalogo. ''' def __init__(self,rutaBD, database_name): u''' Costructor de la clase. ''' self.__pathBD = rutaBD self.__Busqueda = Busqueda() self.bd = couchdb.Server(rutaBD)[database_name] ############### # METODOS BD # ############### def getPathBD(self): u''' Obtiene la ruta de la base de datos en uso. ''' return self.__pathBD def getLenguajes(self): u''' Obtiene los lenguajes para la actual BD. ''' resultado = self.bd.query(""" function (doc) { if (doc.doc_type == 'snippet') { emit(doc.language, null); };}""") return list(tuple([doc['key'] for doc in resultado])) def getLengAndTitles(self, consulta=None, favorito = None, tagsPresicion = None): u''' Obtiene los snippets por lenguajes de la actual BD. @return: lista de tuplas con este formato: (lenguaje,titulo)''' #por defecto busca los que no son favoritoss if not consulta and not favorito: resultado = self.bd.query(''' function (doc) { if (doc.doc_type == 'snippet') { emit([doc.language, doc.title]); };}''') return [doc['key'] for doc in resultado] else: #si no se pasa este parametro if favorito is None: favorito = 0 if tagsPresicion is None: tagsPresicion = False #genera un sql con la busqueda segun la consulta recibida consulta = self.__Busqueda.generarConsulta(consulta, int(favorito), tagsPresicion) #obtiene los resultados de la consulta resultado = self.bd.query(consulta) return [(doc['key'],doc['value']) for doc in resultado] def getAllSnippets(self): u''' Obtiene todos los snippets de la base de datos. ''' orden = ['title','language','tags','code','description','creation','modified','uploader','starred','reference'] resultado = self.bd.query(""" function (doc) { if (doc.doc_type == 'snippet') { emit(doc.title, doc); };}""") self.cant_snippets = len(resultado) return [doc['value'] for doc in resultado] def getSnippet(self, lenguaje, titulo): u''' Obtiene un snippet por su lenguaje y titulo correspondiente. ''' resultado = self.bd.getDatosColumnas("snippet",criterios = {'language':lenguaje,'title':titulo}) return self.__convertirASnippet(resultado) def getSnippetsCount(self): u''' Obtiene la cantidad de snippets cargados en la actual bd. ''' resultado = self.bd.query(''' function (doc) { if (doc.doc_type == 'snippet') { emit(null, doc.title); };}''') return len([doc for doc in resultado]) def realizarConsulta(self,consulta): return [] ################################ # METODOS PARA MANEJAR SNIPPET # ################################ def agregarSnippet(self, datosSnippet): u''' Agrega un nuevo Snippet a la base de datos. datosSnippet = diccionario con los datos del snippet a agregar.''' try: from uuid import uuid4 doc_id = uuid4().hex datosSnippet['doc_type'] = 'snippet' self.bd[doc_id] = datosSnippet return True, '' except Exception, msg: return False, str(msg)