예제 #1
0
def f_schema_liste_classes(regle, _):
    '''#aide||cree des objets virtuels ou reels a partir des schemas (1 objet par classe)
     #helper||chargeur
    #pattern||;;;liste_schema;C;?=reel
    '''
    schema = regle.stock_params.schemas.get(regle.params.cmp1.val)
    if schema is None:
        return False
    virtuel = True
    if regle.params.cmp2.val:
        virtuel = False
    for i in schema.classes:
        niveau, classe = i
        obj2 = Objet(niveau,
                     classe,
                     format_natif='interne',
                     conversion='virtuel' if virtuel else None,
                     schema=schema.classes[i])
        obj2.initattr()
        try:
            regle.stock_param.moteur.traite_objet(
                obj2, regle.branchements.brch["next:"])
        except StopIteration as abort:
            #            print("intercepte abort",abort.args[0])
            if abort.args[0] == '2':
                break
            raise
    return True
예제 #2
0
def f_schema_liste_classes(regle, _):
    """#aide||cree des objets virtuels ou reels a partir des schemas (1 objet par classe)
    #aide_spec||liste_schema;nom;?reel
    #aide_spec2||cree des objets virtuels par defaut sauf si on precise reel
    #helper||chargeur
    #schema||change_schema
    #pattern||?=#schema;?C;?A;liste_schema;C;?=reel
    """
    schema = regle.getschema(regle.params.cmp1.val)
    if schema is None:
        return False
    virtuel = not regle.params.cmp2.val
    classes = list(schema.classes)
    for i in classes:
        niveau, classe = i
        obj2 = Objet(
            niveau,
            classe,
            format_natif="interne",
            conversion="virtuel" if virtuel else None,
            schema=schema.classes[i],
        )
        obj2.initattr()
        try:
            regle.stock_param.moteur.traite_objet(
                obj2, regle.branchements.brch["gen"])
        except StopIteration as abort:
            #            print("intercepte abort",abort.args[0])
            if abort.args[0] == 2:
                break
            raise
    return True
예제 #3
0
def _execbatch(regle, obj):
    """execute un batch"""
    if obj is None:  # pas d'objet on en fabrique un sur mesure
        obj = Objet("_batch", "_batch", format_natif="interne")
        obj.attributs["nom"] = regle.getvar("_nom_batch", "batch")
        # on lui donne un nom
    _, commande, entree, sortie, params = regle.prepare(regle, obj)
    processor = regle.stock_param.getpyetl(commande,
                                           liste_params=params,
                                           entree=entree,
                                           rep_sortie=sortie)
    if processor is None:
        return False

    processor.process(debug=1)
    renseigne_attributs_batch(regle, obj, processor.retour)
    return True
예제 #4
0
    def traitement_virtuel(self, unique=0):
        ''' cree un objet virtuel et le traite pour toutes les classes non utilisees '''

        #        if self.debug != 0:
        #        print("moteur: traitement virtuel", unique)
        LOGGER.info("traitement virtuel" + str(unique))
        #        for i in self.regles:
        #            print (i.chargeur, i)
        if unique:  # on lance un virtuel unique pour les traitements sans entree
            # on lance un virtuel unique puis on verifie toutes les regles de chargement
            self.traite_regles_chargement()
        else:
            for sch in list(self.mapper.schemas.values()):

                if sch.origine in 'LB' and not sch.nom.startswith('#'):
                    print('moteur: traitement schema', sch.nom, sch.origine,
                          len(sch.classes))
                    LOGGER.info("traitement schema" + sch.nom + ' ' +
                                sch.origine)

                    #(on ne traite que les schemas d'entree')
                    for schemaclasse in list(sch.classes.values()):
                        if schemaclasse.utilise:
                            #                            print ('traitement virtuel classe ignoree',j.identclasse)
                            continue
                        print('traitement objet virtuel ',
                              schemaclasse.identclasse)
                        groupe, classe = schemaclasse.identclasse
                        obj = Objet(groupe,
                                    classe,
                                    conversion='virtuel',
                                    schema=schemaclasse)
                        obj.attributs['#categorie'] = 'traitement_virtuel'
                        #                        obj = Objet(groupe, classe)
                        #                        obj.virtuel = True
                        #                        obj.setschema(schemaclasse)
                        #                        obj.initattr()
                        obj.attributs['#type_geom'] = schemaclasse.info[
                            "type_geom"]
                        self.traite_objet(obj, self.regles[0])
예제 #5
0
def f_creobj(regle, obj):
    """#aide||cree des objets de test pour les tests fonctionnels
    #aide_spec||parametres:liste d'attributs,liste valeurs,nom(niv,classe),nombre
    #pattern||L;LC;?L;creobj;C;?N||sortie
    #test||obj||^A;1;;creobj;essai;2||cnt;3
    """

    noms = regle.params.att_sortie.liste
    vals = regle.getlist_entree(obj)
    tmp = regle.params.cmp1.liste
    #    print ('testobj: ',regle.params.cmp1,noms,vals)

    ident = (tmp[0], tmp[1]) if len(tmp) == 2 else ("niv_test", tmp[0])

    schema = regle.getschema(regle.getvar("schema_entree"))
    if schema is None:
        schema = regle.stock_param.init_schema("schema_test",
                                               origine="B",
                                               stable=False)
    gen_schema = ident not in schema.classes
    schemaclasse = schema.setdefault_classe(ident)
    if gen_schema:
        schemaclasse.info["type_geom"] = "0"
    # TODO gérer les dates
    for nom, val in zip(noms, vals):
        try:
            int(val)
            type_attribut = "E"
        except (ValueError, TypeError):
            try:
                float(val)
                type_attribut = "F"
            except (ValueError, TypeError):
                type_attribut = "T"
        if gen_schema:
            schemaclasse.stocke_attribut(nom, type_attribut=type_attribut)
    nombre = int(
        regle.params.cmp2.num) if regle.params.cmp2.num is not None else 1
    for i in range(nombre):
        obj2 = Objet(ident[0], ident[1], format_natif="interne")
        obj2.setschema(schemaclasse)
        obj2.attributs.update([j for j in zip(noms, vals)])
        #        print ("objet_test",obj2.attributs,obj2.schema.schema.nom)
        obj2.setorig(i)
        try:
            regle.stock_param.moteur.traite_objet(
                obj2, regle.branchements.brch["gen"])
        except StopIteration as abort:
            #            print("intercepte abort",abort.args[0])
            if abort.args[0] == 1:
                continue
            elif abort.args[0] == 2:
                break
            else:
                raise
    return True
예제 #6
0
def f_start(regle, obj):
    """#aide||ne fait rien mais envoie un objet virtuel dans le circuit
    #pattern||;;;start;;
    #test||rien||^;;;start||^;;;reel||cnt;1
    """
    if obj:  # on a deja un objet pas la peirn d'en refaire un
        return True
    obj2 = Objet('_declencheur',
                 '_autostart',
                 format_natif='interne',
                 conversion='virtuel')
    print('start: declenchement ', obj2)
    regle.stock_param.moteur.traite_objet(obj2,
                                          regle.branchements.brch["next:"])
    return True
예제 #7
0
def execbatch(regle, obj):
    '''execute un batch'''
    if obj is None:  # pas d'objet on en fabrique un sur mesure
        obj = Objet('_batch', '_batch', format_natif='interne')
    _, commande, entree, sortie, params = prepare_batch_from_object(regle, obj)
    processor = regle.stock_param.getpyetl(commande,
                                           liste_params=params,
                                           entree=entree,
                                           rep_sortie=sortie)
    if processor is None:
        return False

    processor.process(debug=1)
    renseigne_attributs_batch(regle, obj, processor.retour)
    return True
예제 #8
0
def f_start(regle, obj):
    """#aide||ne fait rien mais envoie un objet virtuel dans le circuit
    #pattern||;;;start;;
    #test||rien||^;;;start||^;;;reel||cnt;1
    """
    #    print ('start',obj)
    if obj:  # on a deja un objet pas la peine d'en refaire un
        return True
    obj2 = Objet("_declencheur",
                 "_start",
                 format_natif="interne",
                 conversion="virtuel")
    #    print('commande start: declenchement ', obj2)
    regle.stock_param.moteur.traite_objet(obj2,
                                          regle.branchements.brch["next"])
    return True
예제 #9
0
 def traite_regles_chargement(self):
     ''' declenche les regles de chargement pour les traitements sans entree'''
     #        if self.debug:
     #        print('moteur: regles de chargement pour un traitement sans entree')
     self.regles[0].chargeur = True  # on force la premiere
     if self.regles[0].mode == "start":  #on prends la main dans le script
         self.regles[0].fonc(self.regles[0], None)
         return
     for i in self.regles:
         #            print ('-------------------------------traite_charge ', i.declenchee ,i.chargeur,i )
         if not i.declenchee and i.chargeur:
             obj = Objet('_declencheur',
                         '_chargement',
                         format_natif='interne',
                         conversion='virtuel')
             i.mode_chargeur = True
             self.traite_objet(obj, i)
             i.mode_chargeur = False
예제 #10
0
def f_creobj(regle, obj):
    '''#aide||cree des objets de test pour les tests fonctionnels
       #aide_spec||parametres:liste d'attributs,liste valeurs,nom(niv,classe),nombre
       #pattern||L;LC;?L;creobj;C;?N||sortie
       #test||obj||^A;1;;creobj;essai;2||cnt;3
    '''

    noms = regle.params.att_sortie.liste
    vals = regle.params.val_entree.liste
    tmp = regle.params.cmp1.liste
    #    print ('testobj: ',regle.params.cmp1)

    ident = (tmp[0], tmp[1]) if len(tmp) == 2 else ('niv_test', tmp[0])

    if regle.getvar("schema_entree"):
        schema = regle.stock_param.schemas[regle.getvar("schema_entree")]
    else:
        schema = regle.stock_param.init_schema('schema_test',
                                               origine='B',
                                               stable=False)
    gen_schema = ident not in schema.classes
    schemaclasse = schema.setdefault_classe(ident)
    #TODO gérer les dates
    for nom, val in zip(noms, vals):
        try:
            int(val)
            type_attribut = 'E'
        except (ValueError, TypeError):
            try:
                float(val)
                type_attribut = 'F'
            except (ValueError, TypeError):
                type_attribut = 'T'
        if gen_schema:
            schemaclasse.stocke_attribut(nom, type_attribut=type_attribut)
    nombre = int(
        regle.params.cmp2.num) if regle.params.cmp2.num is not None else 1
    for i in range(nombre):
        obj2 = Objet(ident[0], ident[1], format_natif='interne')
        obj2.setschema(schemaclasse)
        obj2.attributs.update([j for j in zip(noms, vals)])
        #        print ("objet_test",obj2.attributs,obj2.schema.schema.nom)
        obj2.setorig(i)
        try:
            regle.stock_param.moteur.traite_objet(
                obj2, regle.branchements.brch["next:"])
        except StopIteration as abort:
            #            print("intercepte abort",abort.args[0])
            if abort.args[0] == '2':
                break
            raise
    return True
예제 #11
0
 def traite_regles_chargement(self):
     """ declenche les regles de chargement pour les traitements sans entree"""
     #        if self.debug:
     #        print('moteur: regles de chargement pour un traitement sans entree', self.regles[0].mode)
     self.regles[0].chargeur = True  # on force la premiere
     #        if self.regles[0].mode == "start": #on prends la main dans le script
     #            self.regles[0].fonc(self.regles[0], None)
     #            return
     for i in self.regles:
         #            print ('-------------------------------traite_charge ', i.declenchee ,i.chargeur,i )
         if not i.declenchee and i.chargeur:
             if i.mode == "start":  # on prends la main dans le script
                 i.fonc(i, None)
             obj = Objet(
                 "_declencheur",
                 "_chargement",
                 format_natif="interne",
                 conversion="virtuel",
             )
             i.mode_chargeur = True
             self.traite_objet(obj, i)
             i.mode_chargeur = False
def liste_table_traite_stock(regle):
    """retourne la liste des tables du schema"""
    liste = regle.schema_courant.classes.keys()
    nom_groupe = regle.schema_courant.nom
    nom_classe = "liste_tables"
    schemaclasse = regle.schema_courant.setdefault_classe((nom_groupe, nom_classe))
    schemaclasse.stocke_attribut("nom_schema", "T")
    schemaclasse.stocke_attribut("nom_classe", "T")
    for i in liste:
        sch, nom = i
        obj = Objet(nom_groupe, nom_classe)
        obj.attributs["nom_schema"] = sch
        obj.attributs["nom_classe"] = nom
        obj.setschema(schemaclasse)
        regle.stock_param.moteur.traite_objet(obj, regle.branchements.brch["gen"])
    regle.nbstock = 0
    regle.store = False
예제 #13
0
    def traitement_virtuel(self, unique=0):
        """ cree un objet virtuel et le traite pour toutes les classes non utilisees """

        #        if self.debug != 0:
        #        print("moteur: traitement virtuel", unique)
        LOGGER.info("traitement virtuel :%s", "chargement" if unique else "virtuel")
        #        for i in self.regles:
        #            print (i.chargeur, i)
        if unique:  # on lance un virtuel unique pour les traitements sans entree
            # on lance un virtuel unique puis on verifie toutes les regles de chargement
            self.traite_regles_chargement()
        else:
            f_v = self.mapper.getvar("force_virtuel")
            force_virtuel = False
            if f_v == "1" or f_v.lower() == "all" or f_v.lower() == "true":
                force_virtuel = True
            elif self.mapper.worker and (f_v == "worker" or f_v == "w"):
                force_virtuel = True
            elif not self.mapper.worker and (f_v == "master" or f_v == "m"):
                force_virtuel = True

            for sch in list(self.mapper.schemas.values()):
                # print("traitement virtuel: schema a traiter", sch.nom, sch.origine)
                if sch.origine in "LB" and not sch.nom.startswith("#"):
                    # print(
                    #     "moteur: traitement schema",
                    #     sch.nom,
                    #     sch.origine,
                    #     len(sch.classes),
                    # )
                    LOGGER.info("traitement schema" + sch.nom + " " + sch.origine)

                    # (on ne traite que les schemas d'entree')

                    for schemaclasse in list(sch.classes.values()):
                        # print(
                        #     "traitement virtuel", schemaclasse.nom, schemaclasse.utilise
                        # )
                        if schemaclasse.utilise and not force_virtuel:
                            # print(
                            #     "traitement virtuel classe ignoree",
                            #     schemaclasse.identclasse,
                            # )
                            continue
                            # if schemaclasse.identclasse == ("ELYEA", "E_PROGRA"):
                            # print(
                            #     self.mapper.getvar("_wid"),
                            #     "traitement virtuel classe",
                            #     sch.nom,
                            #     schemaclasse.identclasse,
                            #     schemaclasse.utilise,
                            #     schemaclasse.maxobj,
                            # )

                        # if not self.mapper.worker:
                        #     print("traitement objet virtuel ", schemaclasse.identclasse)
                        groupe, classe = schemaclasse.identclasse
                        obj = Objet(
                            groupe, classe, conversion="virtuel", schema=schemaclasse
                        )
                        obj.attributs["#categorie"] = "traitement_virtuel"

                        obj.attributs["#type_geom"] = schemaclasse.info["type_geom"]
                        # print("tv:traitement obj", obj)
                        self.traite_objet(obj, self.regles[0])
def f_liste_selecteur(regle, obj):
    """#aide||cree des objets virtuels ou reels a partir d un selecteur (1 objet par classe)
    #parametres_c||type tables;nom du schema
    #parametres1||idclasse resultante;;#1;#2
    #parametres2||;;#1;#2
    #parametres3||;#1;#2
    #aide_spec||cree des objets reels par defaut sauf si on mets la variable virtuel a 1
    #aide_spec3||cree un objet par classe
    #schema||change_schema
    #pattern1||A.C;;;dblist;?C;?C
    #pattern2||=#obj;;;dblist;?C;?C
    #pattern3||;;;dblist;?C;?C
    """
    selecteur = setdb(regle, obj)
    virtuel = regle.getvar("virtuel") == "1"
    if regle.idclasse:
        niveau, classe = regle.idclasse
        schemaclasse = regle.schema.get_classe(
            regle.idclasse) if regle.schema else None
    # print("traitement liste selecteur", selecteur)
    for i in selecteur.get_classes():
        idbase, selinfo = i
        idsel, description = selinfo
        # print(" lecture selecteur", i, "->", idbase, idsel, description)
        nsel, csel = idsel
        server = ""
        infos = {
            "#sel_codebase": idbase,
            "#sel_niveau": nsel,
            "#sel_classe": csel,
            "#sel_host": regle.getvar("server_" + idbase),
            "#sel_user": regle.getvar("user_" + idbase),
            "#sel_base": regle.getvar("base_" + idbase),
            "#sel_type_base": regle.getvar("db_" + idbase),
        }
        # print("infos selecteur", infos)
        schemabase = selecteur.baseselectors[idbase].schemabase
        infoschema = {
            i if i.startswith("#") else ("#" + i): j
            for i, j in itertools.chain(schemabase.metas.items(),
                                        schemabase.classes[idsel].info.items())
        }
        infos.update(infoschema)
        infos["#alias_niveau"] = schemabase.alias_groupes.get(nsel, "")
        if regle.params.pattern == "2":
            obj2 = obj.dupplique()
            obj2.attributs.update(infos)
            if regle.idclasse:
                obj2.setschema(schemaclasse)
        else:
            if not regle.idclasse:
                niveau, classe = idsel
                if regle.schema:
                    schemaclasse = selecteur.schemabase.get_classe(idsel)
                else:
                    schemaclasse = None

            obj2 = Objet(
                niveau,
                classe,
                format_natif="interne",
                conversion="virtuel" if virtuel else None,
                attributs=infos,
                schema=schemaclasse,
            )
            obj2.initattr()
        if regle.debug:
            obj2.debug("cree", attlist=regle.champsdebug)
            regle.debug -= 1
        try:
            regle.stock_param.moteur.traite_objet(
                obj2, regle.branchements.brch["gen"])
        except StopIteration as abort:
            #            print("intercepte abort",abort.args[0])
            if abort.args[0] == 2:
                break
            raise
    return True