StringTypes has gone
[plcapi.git] / PLC / InitScripts.py
1 #
2 # Functions for interacting with the initscripts table in the database
3 #
4 # Tony Mack <tmack@cs.princeton.edu>
5 # Copyright (C) 2006 The Trustees of Princeton University
6 #
7
8 from PLC.Faults import *
9 from PLC.Parameter import Parameter
10 from PLC.Filter import Filter
11 from PLC.Table import Row, Table
12
13 class InitScript(Row):
14     """
15     Representation of a row in the initscripts table. To use,
16     instantiate with a dict of values.
17     """
18
19     table_name = 'initscripts'
20     primary_key = 'initscript_id'
21     join_tables = []
22     fields = {
23         'initscript_id': Parameter(int, "Initscript identifier"),
24         'name': Parameter(str, "Initscript name", max = 254),
25         'enabled': Parameter(bool, "Initscript is active"),
26         'script': Parameter(str, "Initscript"),
27         }
28
29     def validate_name(self, name):
30         """
31         validates the script name
32         """
33
34         conflicts = InitScripts(self.api, [name])
35         for initscript in conflicts:
36             if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']:
37                 raise PLCInvalidArgument("Initscript name already in use")
38
39         return name
40
41
42 class InitScripts(Table):
43     """
44     Representation of the initscripts table in the database.
45     """
46
47     def __init__(self, api, initscript_filter = None, columns = None):
48         Table.__init__(self, api, InitScript, columns)
49
50         sql = "SELECT %s FROM initscripts WHERE True" % \
51               ", ".join(self.columns)
52
53         if initscript_filter is not None:
54             if isinstance(initscript_filter, (list, tuple, set)):
55                 # Separate the list into integers and strings
56                 ints = [x for x in initscript_filter if isinstance(x, int)]
57                 strs = [x for x in initscript_filter if isinstance(x, str)]
58                 initscript_filter = Filter(InitScript.fields, {'initscript_id': ints, 'name': strs })
59                 sql += " AND (%s) %s" % initscript_filter.sql(api, "OR")
60             elif isinstance(initscript_filter, dict):
61                 initscript_filter = Filter(InitScript.fields, initscript_filter)
62                 sql += " AND (%s) %s" % initscript_filter.sql(api, "AND")
63             elif isinstance(initscript_filter, int):
64                 initscript_filter = Filter(InitScript.fields, {'initscript_id': initscript_filter})
65                 sql += " AND (%s) %s" % initscript_filter.sql(api, "AND")
66             elif isinstance(initscript_filter, str):
67                 initscript_filter = Filter(InitScript.fields, {'name': initscript_filter})
68                 sql += " AND (%s) %s" % initscript_filter.sql(api, "AND")
69             else:
70                 raise PLCInvalidArgument("Wrong initscript filter %r"%initscript_filter)
71
72         self.selectall(sql)