root / lib / qlang.py @ d833acc6
History | View | Annotate | Download (2.6 kB)
1 | a123dc19 | Michael Hanselmann | #
|
---|---|---|---|
2 | a123dc19 | Michael Hanselmann | #
|
3 | a123dc19 | Michael Hanselmann | |
4 | a123dc19 | Michael Hanselmann | # Copyright (C) 2010 Google Inc.
|
5 | a123dc19 | Michael Hanselmann | #
|
6 | a123dc19 | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | a123dc19 | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | a123dc19 | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | a123dc19 | Michael Hanselmann | # (at your option) any later version.
|
10 | a123dc19 | Michael Hanselmann | #
|
11 | a123dc19 | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | a123dc19 | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | a123dc19 | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | a123dc19 | Michael Hanselmann | # General Public License for more details.
|
15 | a123dc19 | Michael Hanselmann | #
|
16 | a123dc19 | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | a123dc19 | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | a123dc19 | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | a123dc19 | Michael Hanselmann | # 02110-1301, USA.
|
20 | a123dc19 | Michael Hanselmann | |
21 | a123dc19 | Michael Hanselmann | |
22 | a123dc19 | Michael Hanselmann | """Module for a simple query language"""
|
23 | a123dc19 | Michael Hanselmann | |
24 | a123dc19 | Michael Hanselmann | from ganeti import errors |
25 | a123dc19 | Michael Hanselmann | |
26 | a123dc19 | Michael Hanselmann | |
27 | a123dc19 | Michael Hanselmann | OP_OR = "|"
|
28 | a123dc19 | Michael Hanselmann | OP_EQUAL = "="
|
29 | a123dc19 | Michael Hanselmann | |
30 | a123dc19 | Michael Hanselmann | |
31 | a123dc19 | Michael Hanselmann | def ReadSimpleFilter(namefield, filter_): |
32 | a123dc19 | Michael Hanselmann | """Function extracting wanted names from restricted filter.
|
33 | a123dc19 | Michael Hanselmann |
|
34 | a123dc19 | Michael Hanselmann | This should only be used until proper filtering is implemented. The filter
|
35 | a123dc19 | Michael Hanselmann | must either be empty or of the format C{["|", ["=", field, "name1"], ["=",
|
36 | a123dc19 | Michael Hanselmann | field, "name2"], ...]}.
|
37 | a123dc19 | Michael Hanselmann |
|
38 | a123dc19 | Michael Hanselmann | """
|
39 | a123dc19 | Michael Hanselmann | if filter_ is None: |
40 | a123dc19 | Michael Hanselmann | return []
|
41 | a123dc19 | Michael Hanselmann | |
42 | a123dc19 | Michael Hanselmann | if not isinstance(filter_, list): |
43 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Filter should be list") |
44 | a123dc19 | Michael Hanselmann | |
45 | a123dc19 | Michael Hanselmann | if not filter_ or filter_[0] != OP_OR: |
46 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Filter should start with OR operator") |
47 | a123dc19 | Michael Hanselmann | |
48 | a123dc19 | Michael Hanselmann | if len(filter_) < 2: |
49 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Invalid filter, OR operator should have" |
50 | a123dc19 | Michael Hanselmann | " operands")
|
51 | a123dc19 | Michael Hanselmann | |
52 | a123dc19 | Michael Hanselmann | result = [] |
53 | a123dc19 | Michael Hanselmann | |
54 | a123dc19 | Michael Hanselmann | for idx, item in enumerate(filter_[1:]): |
55 | a123dc19 | Michael Hanselmann | if not isinstance(item, list): |
56 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Invalid OR operator, operand %s not a" |
57 | a123dc19 | Michael Hanselmann | " list" % idx)
|
58 | a123dc19 | Michael Hanselmann | |
59 | a123dc19 | Michael Hanselmann | if len(item) != 3 or item[0] != OP_EQUAL: |
60 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Invalid OR operator, operand %s is not an" |
61 | a123dc19 | Michael Hanselmann | " equality filter" % idx)
|
62 | a123dc19 | Michael Hanselmann | |
63 | a123dc19 | Michael Hanselmann | (_, name, value) = item |
64 | a123dc19 | Michael Hanselmann | |
65 | a123dc19 | Michael Hanselmann | if not isinstance(value, basestring): |
66 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Operand %s for OR should compare against a" |
67 | a123dc19 | Michael Hanselmann | " string" % idx)
|
68 | a123dc19 | Michael Hanselmann | |
69 | a123dc19 | Michael Hanselmann | if name != namefield:
|
70 | a123dc19 | Michael Hanselmann | raise errors.ParameterError("Operand %s for OR should filter field '%s'," |
71 | a123dc19 | Michael Hanselmann | " not '%s'" % (idx, namefield, name))
|
72 | a123dc19 | Michael Hanselmann | |
73 | a123dc19 | Michael Hanselmann | result.append(value) |
74 | a123dc19 | Michael Hanselmann | |
75 | a123dc19 | Michael Hanselmann | return result
|
76 | 60cba7f8 | Michael Hanselmann | |
77 | 60cba7f8 | Michael Hanselmann | |
78 | 60cba7f8 | Michael Hanselmann | def MakeSimpleFilter(namefield, values): |
79 | 60cba7f8 | Michael Hanselmann | """Builds a filter for use with L{ReadSimpleFilter}.
|
80 | 60cba7f8 | Michael Hanselmann |
|
81 | 60cba7f8 | Michael Hanselmann | @param namefield: Name of field containing item name
|
82 | 60cba7f8 | Michael Hanselmann | @param values: List of names
|
83 | 60cba7f8 | Michael Hanselmann |
|
84 | 60cba7f8 | Michael Hanselmann | """
|
85 | 60cba7f8 | Michael Hanselmann | if values:
|
86 | 60cba7f8 | Michael Hanselmann | return [OP_OR] + [[OP_EQUAL, namefield, i] for i in values] |
87 | 60cba7f8 | Michael Hanselmann | |
88 | 60cba7f8 | Michael Hanselmann | return None |