[cura-tools] master: introduce dictionary-based filtering (04d89ce)
by phatina@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/cura-tools.git
On branch : master
>---------------------------------------------------------------
commit 04d89ce5b2080d1b5c0e6db269e003da7bc1c6eb
Author: Peter Hatina <phatina(a)redhat.com>
Date: Tue Jun 25 13:56:26 2013 +0200
introduce dictionary-based filtering
using key=something, value=something is deprecated
>---------------------------------------------------------------
cli-tools/lmi/lmi_client_base.py | 41 +++++++++++++++++++++++++++++++-----
cli-tools/lmi/lmi_client_shell.py | 32 +++++++++++++++++-----------
2 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/cli-tools/lmi/lmi_client_base.py b/cli-tools/lmi/lmi_client_base.py
index 7707098..5e5f790 100644
--- a/cli-tools/lmi/lmi_client_base.py
+++ b/cli-tools/lmi/lmi_client_base.py
@@ -100,9 +100,13 @@ class LmiBaseClient(object):
self._cliconn = pywbem.WBEMConnection(self._hostname,
(self._username, password))
- def _get_instance_names(self, class_name, namespace = None, **kwargs):
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
+ def _get_instance_names(self, class_name, namespace = None, inst_filter = None, **kwargs):
filter_value = ""
filter_key = "Name"
+ if inst_filter is None:
+ inst_filter = {}
if "key" in kwargs:
filter_key = kwargs["key"]
kwargs.pop("key")
@@ -115,10 +119,21 @@ class LmiBaseClient(object):
if "Value" in kwargs:
filter_value = kwargs["Value"]
kwargs.pop("Value")
+ if filter_value:
+ inst_filter[filter_key] = filter_value
try:
inst_name_list = self._cliconn.EnumerateInstanceNames(class_name, namespace, **kwargs)
- if filter_value:
- inst_name_list = filter(lambda n: n[filter_key] == filter_value, inst_name_list)
+ if inst_filter:
+ inst_name_list_filtered = []
+ for inst_name in inst_name_list:
+ append = True
+ for (filter_key, filter_value) in inst_filter.iteritems():
+ if inst_name[filter_key] != filter_value:
+ append = False
+ break
+ if append:
+ inst_name_list_filtered.append(inst_name)
+ inst_name_list = inst_name_list_filtered
except KeyError, e:
errorstr = "Can not filter by '%s'" % filter_key
raise_or_dump_exception(LmiFilterError(errorstr))
@@ -142,9 +157,13 @@ class LmiBaseClient(object):
return LmiReturnValue(rval = None, errorstr = e.args[0])
return LmiReturnValue(rval = inst)
- def _get_instances(self, class_name, namespace = None, **kwargs):
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
+ def _get_instances(self, class_name, namespace = None, inst_filter = None, **kwargs):
filter_value = ""
filter_key = "Name"
+ if inst_filter is None:
+ inst_filter = {}
if "key" in kwargs:
filter_key = kwargs["key"]
kwargs.pop("key")
@@ -157,9 +176,19 @@ class LmiBaseClient(object):
if "Value" in kwargs:
filter_value = kwargs["Value"]
kwargs.pop("Value")
- query = "select * from %s" % class_name
if filter_value:
- query += " where %s = \"%s\"" % (filter_key, filter_value)
+ inst_filter[filter_key] = filter_value
+ query = "select * from %s" % class_name
+ if inst_filter:
+ more = False
+ query += " where"
+ for (filter_key, filter_value) in inst_filter.iteritems():
+ if more:
+ query += " and"
+ quotes = isinstance(filter_value, basestring)
+ query += " %s =" % filter_key
+ query += " \"%s\"" % filter_value if quotes else " %s" % filter_value
+ more = True
(inst_list, _, errorstr) = self._exec_query(LmiBaseClient.QUERY_LANG_WQL, query, namespace)
if not inst_list:
return LmiReturnValue(rval = None, errorstr = errorstr)
diff --git a/cli-tools/lmi/lmi_client_shell.py b/cli-tools/lmi/lmi_client_shell.py
index 48a93df..8c7321d 100644
--- a/cli-tools/lmi/lmi_client_shell.py
+++ b/cli-tools/lmi/lmi_client_shell.py
@@ -520,10 +520,12 @@ class _LmiClass(BaseObject):
def doc(self):
_LmiXmlFormatter(self._cim_class.tocimxml()).fancy_format(self._client.interactive)
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
@lmi_return_val_if_fail("_namespace", [])
- def instance_names(self, **kwargs):
+ def instance_names(self, inst_filter = None, **kwargs):
(inst_name_list, _, errorstr) = self._client._get_instance_names(
- self._cim_classname, namespace = self._namespace.name, **kwargs)
+ self._cim_classname, self._namespace.name, inst_filter, **kwargs)
if not inst_name_list:
return []
result = []
@@ -531,33 +533,37 @@ class _LmiClass(BaseObject):
result.append(_LmiInstanceName(self._client, i))
return result
- def first_instance_name(self, **kwargs):
- inst_name_list = self.instance_names(**kwargs)
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
+ def first_instance_name(self, inst_filter = None, **kwargs):
+ inst_name_list = self.instance_names(inst_filter, **kwargs)
if not inst_name_list:
return None
return inst_name_list[0]
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
@lmi_return_val_if_fail("_namespace", [])
- def instances(self, **kwargs):
+ def instances(self, inst_filter = None, **kwargs):
(instance_list, _, errorstr) = self._client._get_instances(
- self._cim_classname, self._namespace.name, **kwargs)
+ self._cim_classname, self._namespace.name, inst_filter, **kwargs)
if not instance_list:
return []
return map(lambda inst: _LmiInstance(self._client, self, inst), instance_list)
- def first_instance(self, **kwargs):
+ # NOTE: usage with Key=something, Value=something is deprecated
+ # NOTE: inst_filter is either None or dict
+ def first_instance(self, inst_filter = None, **kwargs):
result = None
- keys = [k.lower() for k in kwargs.keys()]
- if "value" in keys:
+ filter_value = "value" in [k.lower() for k in kwargs.keys()]
+ if inst_filter or filter_value:
(instance_list, _, errorstr) = self._client._get_instances(
- self._cim_classname, self._namespace.name, **kwargs)
+ self._cim_classname, self._namespace.name, inst_filter, **kwargs)
if instance_list:
result = _LmiInstance(self._client, self, instance_list[0])
else:
- inst_name = self.first_instance_name(**kwargs)
+ inst_name = self.first_instance_name(inst_filter, **kwargs)
result = inst_name.to_instance() if inst_name else None
- if not result and LmiBaseClient._get_use_exceptions():
- raise
return result
@lmi_class_fetch_lazy