#!/usr/bin/env python2.4 #-*- coding: iso8859-15 -*- ########################################################## # OUT DB MYSQL v1.0 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Málaga, 12 de Noviembre de 2007 # # Descripción: Genera gráficas con MySQL # # Versión: 2007111200 # # Interpreta los formatos de fichero: # # - DB_MYSQL # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## # Librerías que voy a usar {{{1 import time import datetime import shutil from lib.MATH_GRA import calculadora from lib.MATH_EV import sqrtEV, escalarX, filtro_limites, particionar from lib.GRAFICAS import GRAFICADOR_CONFIG, GRAFICADOR from lib.DATE import coste_temporal, tiempo_str, siguientediasemana, epochdate from lib.FILTER import filtrar_texto, separar_operadores from lib.HERENCIA import BASE,DEFAULTCONFIG # }}}1 # ### CONFIG ### ###################################### ## Generador de graficas basadas en datos retroalimentados de y para MySQL: configuracion por defecto class CONFIG(DEFAULTCONFIG,GRAFICADOR_CONFIG): # Constructor {{{1 def __init__(self): # Cargo las acciones del padre DEFAULTCONFIG.__init__(self,"OUT_DB_MYSQL") # Anulo la obligación de definir el test en la clase heredada self.test(True) # }}}1 # Config Realimentador {{{1 # Host {{{2 ## Servidor SQL ## \param self - ## \param arg Direccion o nombre del servidor SQL def sql_host(self,arg=None): if (arg!=None): self._sql_host=arg return self._sql_host # }}}2 # Port {{{2 ## Puerto del servidor SQL ## \param self - ## \param arg Puerto del servidor SQL def sql_port(self,arg=None): if (arg!=None): self._sql_port=arg return self._sql_port # }}}2 # Sockect {{{2 ## Sockect del servidor SQL ## \param self - ## \param arg Socket del servidor SQL def sql_socket(self,arg=None): if (arg!=None): self._sql_socket=arg return self._sql_socket # }}}2 # User {{{2 ## Usuario de acceso al servidor SQL ## \param self - ## \param arg Usuario para acceder al servidor SQL def sql_user(self,arg=None): if (arg!=None): self._sql_user=arg return self._sql_user # }}}2 # Password {{{2 ## Clave de acceso al servidor SQL ## \param self - ## \param arg Clave del usuario para accder al servidor SQL def sql_passwd(self,arg=None): if (arg!=None): self._sql_passwd=arg return self._sql_passwd # }}}2 # Base de datos {{{2 ## Nombre de la base de datos ## \param self - ## \param arg Nombre de la base de datos def sql_db(self,arg=None): if (arg!=None): self._sql_db=arg return self._sql_db # }}}2 # Tabla de datos {{{2 ## Tabla de datos ## \param self - ## \param arg Tabla con los datos def sql_table(self,arg=None): if (arg!=None): self._sql_table=arg return self._sql_table # }}}2 # }}}1 # Checker {{{1 ## Comprueba que el conjunto minimo de datos requeridos por la clase han sido declarados por el usuario: \n ## - lector() ## \param self - def check(self): self._check("lector") self._check("memoria") # Test del graficador (clase heredada) self.check_graficador() # Test de la config por defecto (clase heredada) self.check_default() # }}}1 # ### TELEMANDO ### ################################### ## Generador de graficas basadas en datos retroalimentados de y para MySQL: grafica class GRAFICA(BASE,GRAFICADOR): # Constructor {{{1 ## Constructor ## \param self - ## \param nombre Cadena de texto que representa al nombre interno de la grafica ## \param senales Objeto de tipo src.etcbin.senales_cabecera.SENALES def __init__(self,nombre,senales): # Cargo las acciones del padre BASE.__init__(self,nombre,"OUT_DB_MYSQL") # Cargo las acciones de la extensión GRAFICADOR.__init__(self,nombre,senales) # Define NA como None (consulta el valor y por no estar declarado se redeclara como None) self.NA(None) # Todo self.__todo=None # }}}1 # Checker {{{1 ## Comprueba que el conjunto minimo de datos requeridos por la clase han sido declarados por el usuario: \n ## \param self - def check(self): # Chequeo de la configuracion base (Clase herededa) self.check_default() # }}}1 # All config {{{1 ## \internal ## All config: lineas ## \param self - def allconfig(self): dict={} dict["lineas"]=self.tablalineas() return dict # }}}1 # Devuelve un listado con los nombres de las lineas {{{1 ## Listado de nombre de las lineas def listlines(self): # Inicializo el listado temporal lista=[] # Obtengo el listado completo for linea in self.tablalineas(): # Inserta el nombre en la lista lista.append(linea[0]) # Devuelve la lista return lista # }}}1 # Carga/Devuelve el trabajo para hacer {{{1 def todo(self,todo=None): # Si solicita datos if (todo==None): # Si ya ha sido definido if (self.__todo!=None): lista=[] # Extraigo los nombres solo for linea in self.__todo: lista.append(linea[0]) return lista else: raise IOError,"La lista de tareas para hacer no ha sido definida aun" # Si indica datos else: # Si no ha sido definido aun if (self.__todo==None): self.__todo=[] # Para todas las lineas for linea in self.tablalineas(): # Si la linea existe en todo if (linea[0] in todo): # Salva la linea en la lista de tareas self.__todo.append(linea) else: raise IOError,"La lista de tareas para hacer ya ha sido definida y no puede redefinirse 2 veces" # }}}1 # Rango {{{1 ## Rango de los datos def range(self,ini,fin): self.__rango_ini=ini self.__rango_fin=fin # }}}1 # Inserta una linea {{{1 ## Inserta lineas en la grafica def addline(self,variable,ecuacion,senaltipo,ini=None,fin=None): # Comprueba que el destino existe en la lista de senales if (not self.tablasenales().search(None,variable)): raise IOError,"La variable destino no ha sido declarada en el listado de senales" # Asegura que los rangos son correctos if (ini==None): ini=self.__rango_ini if (fin==None): fin=self.__rango_fin # Asegura que la ecuacion no permite el operador "axis" ecu_split=ecuacion.split(" ") for ecu in ecu_split: if (ecu.lower()=="axis"): raise IOError,"El operador 'axis' no es un operador permitido en el realimentador" # Inserta la linea GRAFICADOR.addline(self,variable,ecuacion,senaltipo,"",ini,fin,None) # }}} # Ecuación de la recta segun dos puntos dados {{{1 ## \internal ## Ecuacion de la recta segun dos puntos dados ## \param self - ## \param x1 Punto 1, posicion X ## \param y1 Punto 1, posicion Y ## \param x2 Punto 2, posicion X ## \param y2 Punto 2, posicion Y ## \param x Posicion X de la que deseo conocer su Y ## \return Devuelve el resultado de computar la cadena ## \warning Esta funcion solo funciona si se ha importado la libreria rpy que da conexion al lenguaje de programacion R def eq_recta(self,x1,y1,x2,y2,x): if (y1==None): return None elif (y2==None): return None else: return ((((y2-y1)/(x2-x1))*(x-x1))+y1) # }}}1 # Ploter {{{1 ## Ploea a la base de datos def plot(self,variable,vector): self.debug(" > Ploteando %s" % (variable)) print vector,variable # }}}1 # Crear gráficas {{{1 ## Crea una grafica ## \param self - def out(self): # Comienzo a trabajar self.debug("Generando salida para '%s':" % (self.internal_id())) # Compruebo la configuracion self.debug("Comprobando configuracion") self.check() # Pinto la gráfica {{{2 self.debug("Generando lineas") lector=self.valor("lector") # Consigo las tareas a hacer tareas=self.todo() # Para todas las tareas for linea in self.tablalineas(): # Descompongo la linea (variable,(ecuacion,lineatipo),(tt1,tt2,ini,fin,tt3),tt4,tt5)=linea # Reviso si la linea debe ser procesada if (not (variable in tareas)): continue # Fecha de inicio ini_epoch=calculadora(ini) # Fecha de fin fin_epoch=calculadora(fin) if ((lineatipo=='a') or (lineatipo=='d')): solo_operaciones_digitales=(lineatipo=='d') # Proceso el calculo de la linea (casillas=1, minX=ini_epoch, maxX=fin_epoch, desviacion=0, minY=maxY=tickY=None) acumulador=self.calculadora_senales(ecuacion,solo_operaciones_digitales,ini_epoch,fin_epoch,1,ini_epoch,fin_epoch,0,None,None,None) else: acumulador=None # Compruebo que hay datos para pintar if ((acumulador==None) or (acumulador==[])): # Anotamos el error y seguimos self.debug(" Esta linea no realimenta porque faltan datos en el acumulador") else: # Ploteo self.plot(variable,acumulador) # Saco la linea de tareas por hacer lista=[] for todo in self.__todo: if (todo[0]==variable): continue else: lista.append(todo) self.__todo=lista # }}}2 # Fin de esta zona del debug self.debug("") # }}}1 # ### EXCEPTIONS ### ################################## # EXCEPTION CLASSES {{{1 # Excepciones básicas # Except (General Exception) {{{2 class Except(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string #}}}2 # IOError (Error de entrada/salida) {{{2 class IOError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # ExecutionError (Error de ejecucción) {{{2 class ExecutionError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # TypeError (Error de tipo) {{{2 class TypeError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # NoData (No hay datos que procesar) {{{2 class NoData(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # }}}1