def DDL(statement, when=None, obj=None, bind=None, dialect=None, context=None): """ Construit un objet de type DDL en utilisant l'API correspondant à la version de SQLAlchemy en cours d'utilisation. Cette fonction peut être utilisée pour exécuter une commande SQL de deux manières distinctes. - Soit lorsqu'un événement se produit (par exemple, lors de la création d'une certaine table du modèle), en passant les paramètres when et obj. - Soit immédiatement en ne passant que le paramètre bind. Ces deux cas d'usage sont mutuellement exclusifs. @param statement: Commande SQL à exécuter touchant au schéma de la base (et donc, utilisant le DDL). @type statement: C{str} @param when: Nom de l'événement à attendre pour exécuter le DDL, par exemple "before-create". @type when: C{str} @param obj: Objet support du DDL à exécuter (généralement une Table). @param bind: Connexion à la base de données (Session ou Metadata), dans le cas où le DDL doit être exécuté immédiatement. @param dialect: Nom d'un dialecte SQL supporté par SQLAlchemy. Le DDL ne sera exécuté que si le dialecte utilisé par la base de données correspond à donné ici. @type dialect: C{str} @param context: Contexte qui sera passé au DDL (interpolé) au moment de son exécution. @type context: C{dict} """ # 2 cas d'utilisation exclusifs : # - soit lorsqu'un événement se produit # - soit en exécution immédiate assert (bind is None or when is not None) or \ (bind is not None or when is None) if context is None: context = {} # SQLAlchemy 0.5/0.6. if SaEvent is None: # Les dialectes "postgres" et "postgresql" sont définis # comme des aliases l'un par rapport à l'autre (sha:7d7d6c2). # On doit supporter le passage de l'un ou l'autre des noms. if dialect in ('postgres', 'postresql'): dialect = ('postgres', 'postgresql') if isinstance(dialect, (list, tuple)): # @HACK: Dans SQLAlchemy 0.5.x, seulement 3 arguments # positionnels sont passés : event, target & bind. # Dans SQLAlchemy 0.6.x, il y en a 4 : self, event, target & bind. # On ne s'intéresse qu'à bind (dernier argument à chaque fois). condition = lambda *args, **kwargs: args[-1].engine.name in dialect else: condition = dialect ddl = SaDDL(statement, on=condition, context=context) if when is None: ddl.execute(bind) else: # Les mots dans le nom de l'événement sont séparés par # des '-' dans cette version de SQLAlchemy. ddl.execute_at(when.replace('_', '-'), obj) # SQLAlchemy 0.7+ else: ddl = SaDDL(statement, context=context) if when is None: ddl.execute(bind) else: # Les mots dans le nom de l'événement sont séparés par # des '_' dans cette version de SQLAlchemy. SaEvent.listen(obj, when.replace('-', '_'), ddl.execute_if(dialect=dialect))
# A modifier already on a request is being voided direction = Decimal(-1) if isinstance(modifier, AbsoluteModifier): absolute += direction * modifier.value elif isinstance(modifier, RelativeModifier): relative += direction * modifier.value payout = (srp_request.base_payout + absolute) * \ (Decimal(1) + relative) srp_request.payout = PrettyDecimal(payout) # The next few lines are responsible for adding a full text search index on the # Request.details column for MySQL. _create_fts = DDL('CREATE FULLTEXT INDEX ix_%(table)s_details_fulltext ' 'ON %(table)s (details);') _drop_fts = DDL('DROP INDEX ix_%(table)s_details_fulltext ON %(table)s') event.listen( Request.__table__, 'after_create', _create_fts.execute_if(dialect='mysql') ) event.listen( Request.__table__, 'before_drop', _drop_fts.execute_if(dialect='mysql') )
relative = Decimal(0) # The modifier that's changed isn't reflected yet in the database, so we # apply it here. if isinstance(value, Request): # A modifier being added to the Request if modifier.voided: # The modifier being added is already void return direction = Decimal(1) else: # A modifier already on a request is being voided direction = Decimal(-1) if isinstance(modifier, AbsoluteModifier): absolute += direction * modifier.value elif isinstance(modifier, RelativeModifier): relative += direction * modifier.value payout = (srp_request.base_payout + absolute) * (Decimal(1) + relative) srp_request.payout = PrettyDecimal(payout) # The next few lines are responsible for adding a full text search index on the # Request.details column for MySQL. _create_fts = DDL("CREATE FULLTEXT INDEX ix_%(table)s_details_fulltext " "ON %(table)s (details);") _drop_fts = DDL("DROP INDEX ix_%(table)s_details_fulltext ON %(table)s") event.listen(Request.__table__, "after_create", _create_fts.execute_if(dialect="mysql")) event.listen(Request.__table__, "before_drop", _drop_fts.execute_if(dialect="mysql"))