# # Functions for interacting with the initscripts table in the database # # Tony Mack # Copyright (C) 2006 The Trustees of Princeton University # from types import StringTypes from PLC.Faults import * from PLC.Parameter import Parameter from PLC.Storage.AlchemyObject import AlchemyObj class InitScript(AlchemyObj): """ Representation of a row in the initscripts table. To use, instantiate with a dict of values. """ tablename = 'initscripts' join_tables = [] fields = { 'initscript_id': Parameter(int, "Initscript identifier", primary_key=True), 'name': Parameter(str, "Initscript name", max = 254), 'enabled': Parameter(bool, "Initscript is active"), 'script': Parameter(str, "Initscript"), } def validate_name(self, name): """ validates the script name """ conflicts = InitScripts(self.api, name) for initscript in conflicts: if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']: raise PLCInvalidArgument, "Initscript name already in use" return name def sync(self, commit=True, validate=True): AlchemyObj.sync(self, commit, validate) if 'initscript_id' not in self: AlchemyObj.insert(self, dict(self)) else: AlchemyObj.update(self, {'initscript_id': self['initscript_id']}, dict(self)) def delete(self, commit=True): assert 'initscript_id' in self AlchemyObj.delete(self, dict(self)) class InitScripts(list): """ Representation of the initscripts table in the database. """ def __init__(self, api, initscript_filter = None, columns = None): if not initscript_filter: initscripts = InitScript().select() elif isinstance(initscript_filter, (list, tuple, set)): # Separate the list into integers and strings ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter) strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter) initscripts = InitScript().select(filter={'initscript_id': ints, 'name': strs }) elif isinstance(initscript_filter, dict): initscripts = InitScript().select(filter=initscript_filter) elif isinstance(initscript_filter, (int, long)): initscripts = InitScript().select(filter={'initscript_id': initscript_filter }) elif isinstance(initscript_filter, StringTypes): initscripts = InitScript().select(filter={'name': initscript_filter }) else: raise PLCInvalidArgument, "Wrong initscript filter %r"%initscript_filter for initscript in initscripts: self.append(initscript)