Index: tools/telemetry/third_party/gsutil/third_party/boto/boto/sdb/db/manager/xmlmanager.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/boto/boto/sdb/db/manager/xmlmanager.py b/tools/telemetry/third_party/gsutil/third_party/boto/boto/sdb/db/manager/xmlmanager.py |
deleted file mode 100644 |
index f457347ad376d0cf5fef4b2e6926d1f115ae1e8d..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/boto/boto/sdb/db/manager/xmlmanager.py |
+++ /dev/null |
@@ -1,517 +0,0 @@ |
-# Copyright (c) 2006-2008 Mitch Garnaat http://garnaat.org/ |
-# |
-# Permission is hereby granted, free of charge, to any person obtaining a |
-# copy of this software and associated documentation files (the |
-# "Software"), to deal in the Software without restriction, including |
-# without limitation the rights to use, copy, modify, merge, publish, dis- |
-# tribute, sublicense, and/or sell copies of the Software, and to permit |
-# persons to whom the Software is furnished to do so, subject to the fol- |
-# lowing conditions: |
-# |
-# The above copyright notice and this permission notice shall be included |
-# in all copies or substantial portions of the Software. |
-# |
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
-# IN THE SOFTWARE. |
-import boto |
-from boto.utils import find_class, Password |
-from boto.sdb.db.key import Key |
-from boto.sdb.db.model import Model |
-from boto.compat import six, encodebytes |
-from datetime import datetime |
-from xml.dom.minidom import getDOMImplementation, parse, parseString, Node |
- |
-ISO8601 = '%Y-%m-%dT%H:%M:%SZ' |
- |
-class XMLConverter(object): |
- """ |
- Responsible for converting base Python types to format compatible with underlying |
- database. For SimpleDB, that means everything needs to be converted to a string |
- when stored in SimpleDB and from a string when retrieved. |
- |
- To convert a value, pass it to the encode or decode method. The encode method |
- will take a Python native value and convert to DB format. The decode method will |
- take a DB format value and convert it to Python native format. To find the appropriate |
- method to call, the generic encode/decode methods will look for the type-specific |
- method by searching for a method called "encode_<type name>" or "decode_<type name>". |
- """ |
- def __init__(self, manager): |
- self.manager = manager |
- self.type_map = { bool : (self.encode_bool, self.decode_bool), |
- int : (self.encode_int, self.decode_int), |
- Model : (self.encode_reference, self.decode_reference), |
- Key : (self.encode_reference, self.decode_reference), |
- Password : (self.encode_password, self.decode_password), |
- datetime : (self.encode_datetime, self.decode_datetime)} |
- if six.PY2: |
- self.type_map[long] = (self.encode_long, self.decode_long) |
- |
- def get_text_value(self, parent_node): |
- value = '' |
- for node in parent_node.childNodes: |
- if node.nodeType == node.TEXT_NODE: |
- value += node.data |
- return value |
- |
- def encode(self, item_type, value): |
- if item_type in self.type_map: |
- encode = self.type_map[item_type][0] |
- return encode(value) |
- return value |
- |
- def decode(self, item_type, value): |
- if item_type in self.type_map: |
- decode = self.type_map[item_type][1] |
- return decode(value) |
- else: |
- value = self.get_text_value(value) |
- return value |
- |
- def encode_prop(self, prop, value): |
- if isinstance(value, list): |
- if hasattr(prop, 'item_type'): |
- new_value = [] |
- for v in value: |
- item_type = getattr(prop, "item_type") |
- if Model in item_type.mro(): |
- item_type = Model |
- new_value.append(self.encode(item_type, v)) |
- return new_value |
- else: |
- return value |
- else: |
- return self.encode(prop.data_type, value) |
- |
- def decode_prop(self, prop, value): |
- if prop.data_type == list: |
- if hasattr(prop, 'item_type'): |
- item_type = getattr(prop, "item_type") |
- if Model in item_type.mro(): |
- item_type = Model |
- values = [] |
- for item_node in value.getElementsByTagName('item'): |
- value = self.decode(item_type, item_node) |
- values.append(value) |
- return values |
- else: |
- return self.get_text_value(value) |
- else: |
- return self.decode(prop.data_type, value) |
- |
- def encode_int(self, value): |
- value = int(value) |
- return '%d' % value |
- |
- def decode_int(self, value): |
- value = self.get_text_value(value) |
- if value: |
- value = int(value) |
- else: |
- value = None |
- return value |
- |
- def encode_long(self, value): |
- value = long(value) |
- return '%d' % value |
- |
- def decode_long(self, value): |
- value = self.get_text_value(value) |
- return long(value) |
- |
- def encode_bool(self, value): |
- if value == True: |
- return 'true' |
- else: |
- return 'false' |
- |
- def decode_bool(self, value): |
- value = self.get_text_value(value) |
- if value.lower() == 'true': |
- return True |
- else: |
- return False |
- |
- def encode_datetime(self, value): |
- return value.strftime(ISO8601) |
- |
- def decode_datetime(self, value): |
- value = self.get_text_value(value) |
- try: |
- return datetime.strptime(value, ISO8601) |
- except: |
- return None |
- |
- def encode_reference(self, value): |
- if isinstance(value, six.string_types): |
- return value |
- if value is None: |
- return '' |
- else: |
- val_node = self.manager.doc.createElement("object") |
- val_node.setAttribute('id', value.id) |
- val_node.setAttribute('class', '%s.%s' % (value.__class__.__module__, value.__class__.__name__)) |
- return val_node |
- |
- def decode_reference(self, value): |
- if not value: |
- return None |
- try: |
- value = value.childNodes[0] |
- class_name = value.getAttribute("class") |
- id = value.getAttribute("id") |
- cls = find_class(class_name) |
- return cls.get_by_ids(id) |
- except: |
- return None |
- |
- def encode_password(self, value): |
- if value and len(value) > 0: |
- return str(value) |
- else: |
- return None |
- |
- def decode_password(self, value): |
- value = self.get_text_value(value) |
- return Password(value) |
- |
- |
-class XMLManager(object): |
- |
- def __init__(self, cls, db_name, db_user, db_passwd, |
- db_host, db_port, db_table, ddl_dir, enable_ssl): |
- self.cls = cls |
- if not db_name: |
- db_name = cls.__name__.lower() |
- self.db_name = db_name |
- self.db_user = db_user |
- self.db_passwd = db_passwd |
- self.db_host = db_host |
- self.db_port = db_port |
- self.db_table = db_table |
- self.ddl_dir = ddl_dir |
- self.s3 = None |
- self.converter = XMLConverter(self) |
- self.impl = getDOMImplementation() |
- self.doc = self.impl.createDocument(None, 'objects', None) |
- |
- self.connection = None |
- self.enable_ssl = enable_ssl |
- self.auth_header = None |
- if self.db_user: |
- base64string = encodebytes('%s:%s' % (self.db_user, self.db_passwd))[:-1] |
- authheader = "Basic %s" % base64string |
- self.auth_header = authheader |
- |
- def _connect(self): |
- if self.db_host: |
- if self.enable_ssl: |
- from httplib import HTTPSConnection as Connection |
- else: |
- from httplib import HTTPConnection as Connection |
- |
- self.connection = Connection(self.db_host, self.db_port) |
- |
- def _make_request(self, method, url, post_data=None, body=None): |
- """ |
- Make a request on this connection |
- """ |
- if not self.connection: |
- self._connect() |
- try: |
- self.connection.close() |
- except: |
- pass |
- self.connection.connect() |
- headers = {} |
- if self.auth_header: |
- headers["Authorization"] = self.auth_header |
- self.connection.request(method, url, body, headers) |
- resp = self.connection.getresponse() |
- return resp |
- |
- def new_doc(self): |
- return self.impl.createDocument(None, 'objects', None) |
- |
- def _object_lister(self, cls, doc): |
- for obj_node in doc.getElementsByTagName('object'): |
- if not cls: |
- class_name = obj_node.getAttribute('class') |
- cls = find_class(class_name) |
- id = obj_node.getAttribute('id') |
- obj = cls(id) |
- for prop_node in obj_node.getElementsByTagName('property'): |
- prop_name = prop_node.getAttribute('name') |
- prop = obj.find_property(prop_name) |
- if prop: |
- if hasattr(prop, 'item_type'): |
- value = self.get_list(prop_node, prop.item_type) |
- else: |
- value = self.decode_value(prop, prop_node) |
- value = prop.make_value_from_datastore(value) |
- setattr(obj, prop.name, value) |
- yield obj |
- |
- def reset(self): |
- self._connect() |
- |
- def get_doc(self): |
- return self.doc |
- |
- def encode_value(self, prop, value): |
- return self.converter.encode_prop(prop, value) |
- |
- def decode_value(self, prop, value): |
- return self.converter.decode_prop(prop, value) |
- |
- def get_s3_connection(self): |
- if not self.s3: |
- self.s3 = boto.connect_s3(self.aws_access_key_id, self.aws_secret_access_key) |
- return self.s3 |
- |
- def get_list(self, prop_node, item_type): |
- values = [] |
- try: |
- items_node = prop_node.getElementsByTagName('items')[0] |
- except: |
- return [] |
- for item_node in items_node.getElementsByTagName('item'): |
- value = self.converter.decode(item_type, item_node) |
- values.append(value) |
- return values |
- |
- def get_object_from_doc(self, cls, id, doc): |
- obj_node = doc.getElementsByTagName('object')[0] |
- if not cls: |
- class_name = obj_node.getAttribute('class') |
- cls = find_class(class_name) |
- if not id: |
- id = obj_node.getAttribute('id') |
- obj = cls(id) |
- for prop_node in obj_node.getElementsByTagName('property'): |
- prop_name = prop_node.getAttribute('name') |
- prop = obj.find_property(prop_name) |
- value = self.decode_value(prop, prop_node) |
- value = prop.make_value_from_datastore(value) |
- if value is not None: |
- try: |
- setattr(obj, prop.name, value) |
- except: |
- pass |
- return obj |
- |
- def get_props_from_doc(self, cls, id, doc): |
- """ |
- Pull out the properties from this document |
- Returns the class, the properties in a hash, and the id if provided as a tuple |
- :return: (cls, props, id) |
- """ |
- obj_node = doc.getElementsByTagName('object')[0] |
- if not cls: |
- class_name = obj_node.getAttribute('class') |
- cls = find_class(class_name) |
- if not id: |
- id = obj_node.getAttribute('id') |
- props = {} |
- for prop_node in obj_node.getElementsByTagName('property'): |
- prop_name = prop_node.getAttribute('name') |
- prop = cls.find_property(prop_name) |
- value = self.decode_value(prop, prop_node) |
- value = prop.make_value_from_datastore(value) |
- if value is not None: |
- props[prop.name] = value |
- return (cls, props, id) |
- |
- |
- def get_object(self, cls, id): |
- if not self.connection: |
- self._connect() |
- |
- if not self.connection: |
- raise NotImplementedError("Can't query without a database connection") |
- url = "/%s/%s" % (self.db_name, id) |
- resp = self._make_request('GET', url) |
- if resp.status == 200: |
- doc = parse(resp) |
- else: |
- raise Exception("Error: %s" % resp.status) |
- return self.get_object_from_doc(cls, id, doc) |
- |
- def query(self, cls, filters, limit=None, order_by=None): |
- if not self.connection: |
- self._connect() |
- |
- if not self.connection: |
- raise NotImplementedError("Can't query without a database connection") |
- |
- from urllib import urlencode |
- |
- query = str(self._build_query(cls, filters, limit, order_by)) |
- if query: |
- url = "/%s?%s" % (self.db_name, urlencode({"query": query})) |
- else: |
- url = "/%s" % self.db_name |
- resp = self._make_request('GET', url) |
- if resp.status == 200: |
- doc = parse(resp) |
- else: |
- raise Exception("Error: %s" % resp.status) |
- return self._object_lister(cls, doc) |
- |
- def _build_query(self, cls, filters, limit, order_by): |
- import types |
- if len(filters) > 4: |
- raise Exception('Too many filters, max is 4') |
- parts = [] |
- properties = cls.properties(hidden=False) |
- for filter, value in filters: |
- name, op = filter.strip().split() |
- found = False |
- for property in properties: |
- if property.name == name: |
- found = True |
- if types.TypeType(value) == list: |
- filter_parts = [] |
- for val in value: |
- val = self.encode_value(property, val) |
- filter_parts.append("'%s' %s '%s'" % (name, op, val)) |
- parts.append("[%s]" % " OR ".join(filter_parts)) |
- else: |
- value = self.encode_value(property, value) |
- parts.append("['%s' %s '%s']" % (name, op, value)) |
- if not found: |
- raise Exception('%s is not a valid field' % name) |
- if order_by: |
- if order_by.startswith("-"): |
- key = order_by[1:] |
- type = "desc" |
- else: |
- key = order_by |
- type = "asc" |
- parts.append("['%s' starts-with ''] sort '%s' %s" % (key, key, type)) |
- return ' intersection '.join(parts) |
- |
- def query_gql(self, query_string, *args, **kwds): |
- raise NotImplementedError("GQL queries not supported in XML") |
- |
- def save_list(self, doc, items, prop_node): |
- items_node = doc.createElement('items') |
- prop_node.appendChild(items_node) |
- for item in items: |
- item_node = doc.createElement('item') |
- items_node.appendChild(item_node) |
- if isinstance(item, Node): |
- item_node.appendChild(item) |
- else: |
- text_node = doc.createTextNode(item) |
- item_node.appendChild(text_node) |
- |
- def save_object(self, obj, expected_value=None): |
- """ |
- Marshal the object and do a PUT |
- """ |
- doc = self.marshal_object(obj) |
- if obj.id: |
- url = "/%s/%s" % (self.db_name, obj.id) |
- else: |
- url = "/%s" % (self.db_name) |
- resp = self._make_request("PUT", url, body=doc.toxml()) |
- new_obj = self.get_object_from_doc(obj.__class__, None, parse(resp)) |
- obj.id = new_obj.id |
- for prop in obj.properties(): |
- try: |
- propname = prop.name |
- except AttributeError: |
- propname = None |
- if propname: |
- value = getattr(new_obj, prop.name) |
- if value: |
- setattr(obj, prop.name, value) |
- return obj |
- |
- |
- def marshal_object(self, obj, doc=None): |
- if not doc: |
- doc = self.new_doc() |
- if not doc: |
- doc = self.doc |
- obj_node = doc.createElement('object') |
- |
- if obj.id: |
- obj_node.setAttribute('id', obj.id) |
- |
- obj_node.setAttribute('class', '%s.%s' % (obj.__class__.__module__, |
- obj.__class__.__name__)) |
- root = doc.documentElement |
- root.appendChild(obj_node) |
- for property in obj.properties(hidden=False): |
- prop_node = doc.createElement('property') |
- prop_node.setAttribute('name', property.name) |
- prop_node.setAttribute('type', property.type_name) |
- value = property.get_value_for_datastore(obj) |
- if value is not None: |
- value = self.encode_value(property, value) |
- if isinstance(value, list): |
- self.save_list(doc, value, prop_node) |
- elif isinstance(value, Node): |
- prop_node.appendChild(value) |
- else: |
- text_node = doc.createTextNode(six.text_type(value).encode("ascii", "ignore")) |
- prop_node.appendChild(text_node) |
- obj_node.appendChild(prop_node) |
- |
- return doc |
- |
- def unmarshal_object(self, fp, cls=None, id=None): |
- if isinstance(fp, six.string_types): |
- doc = parseString(fp) |
- else: |
- doc = parse(fp) |
- return self.get_object_from_doc(cls, id, doc) |
- |
- def unmarshal_props(self, fp, cls=None, id=None): |
- """ |
- Same as unmarshalling an object, except it returns |
- from "get_props_from_doc" |
- """ |
- if isinstance(fp, six.string_types): |
- doc = parseString(fp) |
- else: |
- doc = parse(fp) |
- return self.get_props_from_doc(cls, id, doc) |
- |
- def delete_object(self, obj): |
- url = "/%s/%s" % (self.db_name, obj.id) |
- return self._make_request("DELETE", url) |
- |
- def set_key_value(self, obj, name, value): |
- self.domain.put_attributes(obj.id, {name: value}, replace=True) |
- |
- def delete_key_value(self, obj, name): |
- self.domain.delete_attributes(obj.id, name) |
- |
- def get_key_value(self, obj, name): |
- a = self.domain.get_attributes(obj.id, name) |
- if name in a: |
- return a[name] |
- else: |
- return None |
- |
- def get_raw_item(self, obj): |
- return self.domain.get_item(obj.id) |
- |
- def set_property(self, prop, obj, name, value): |
- pass |
- |
- def get_property(self, prop, obj, name): |
- pass |
- |
- def load_object(self, obj): |
- if not obj._loaded: |
- obj = obj.get_by_id(obj.id) |
- obj._loaded = True |
- return obj |