2 # Functions for interacting with the initscripts table in the database
4 # Tony Mack <tmack@cs.princeton.edu>
5 # Copyright (C) 2006 The Trustees of Princeton University
8 from types import StringTypes
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Storage.AlchemyObject import AlchemyObj
13 class InitScript(AlchemyObj):
15 Representation of a row in the initscripts table. To use,
16 instantiate with a dict of values.
19 tablename = 'initscripts'
22 'initscript_id': Parameter(int, "Initscript identifier", primary_key=True),
23 'name': Parameter(str, "Initscript name", max = 254),
24 'enabled': Parameter(bool, "Initscript is active"),
25 'script': Parameter(str, "Initscript"),
28 def validate_name(self, name):
30 validates the script name
33 conflicts = InitScripts(self.api, name)
34 for initscript in conflicts:
35 if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']:
36 raise PLCInvalidArgument, "Initscript name already in use"
40 def sync(self, commit=True, validate=True):
41 AlchemyObj.sync(self, commit, validate)
42 if 'initscript_id' not in self:
43 AlchemyObj.insert(self, dict(self))
45 AlchemyObj.update(self, {'initscript_id': self['initscript_id']}, dict(self))
47 def delete(self, commit=True):
48 assert 'initscript_id' in self
49 AlchemyObj.delete(self, dict(self))
52 class InitScripts(list):
54 Representation of the initscripts table in the database.
57 def __init__(self, api, initscript_filter = None, columns = None):
58 if not initscript_filter:
59 initscripts = InitScript().select()
60 elif isinstance(initscript_filter, (list, tuple, set)):
61 # Separate the list into integers and strings
62 ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter)
63 strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter)
64 initscripts = InitScript().select(filter={'initscript_id': ints, 'name': strs })
65 elif isinstance(initscript_filter, dict):
66 initscripts = InitScript().select(filter=initscript_filter)
67 elif isinstance(initscript_filter, (int, long)):
68 initscripts = InitScript().select(filter={'initscript_id': initscript_filter })
69 elif isinstance(initscript_filter, StringTypes):
70 initscripts = InitScript().select(filter={'name': initscript_filter })
72 raise PLCInvalidArgument, "Wrong initscript filter %r"%initscript_filter
74 for initscript in initscripts:
75 self.append(initscript)