Statistics
| Branch: | Tag: | Revision:

root / lib / qlang.py @ dd94e9f6

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