def rocket_to_ae(field_type, rocket_value): if not rocket_value: ae_value = None elif field_type == TYPE_DATETIME or field_type == TYPE_TIMESTAMP: ae_value = utils.from_iso(rocket_value) elif field_type == TYPE_BOOL: ae_value = bool(int(rocket_value)) elif field_type == TYPE_LONG: ae_value = long(rocket_value) elif field_type == TYPE_FLOAT: ae_value = float(rocket_value) elif field_type == TYPE_INT: ae_value = int(rocket_value) elif field_type == TYPE_TEXT: ae_value = datastore_types.Text(rocket_value.replace('|','|')) elif field_type == TYPE_REFERENCE: slash = rocket_value.find("/") if slash > 0: kind = rocket_value[:slash] key_name_or_id = rocket_value[slash + 1:] if key_name_or_id[0] in "0123456789": key_name_or_id = int(key_name_or_id) ae_value = datastore.Key.from_path(kind, key_name_or_id) else: logging.error("invalid reference value: %s" % rocket_value) ae_value = None elif field_type == TYPE_BLOB: ae_value = datastore_types.Blob(base64.b64decode(rocket_value)) else: #str ae_value = (u"%s" % rocket_value).replace('|','|') return ae_value
def get(self): path = self.request.path.split("/") self.response.headers['Content-Type'] = 'text/xml' if self.request.get("secret_key") != SECRET_KEY: self.response.out.write(u'<error>Unauthorized</error>\n') return if len(path) < 3 or path[2] == '': self.response.out.write(u'<error>Please specify an entity kind</error>\n') return kind = path[2] self.response.out.write(u'<?xml version="1.0" encoding="UTF-8"?>\n') self.response.out.write(u'<updates>\n') query = datastore.Query(kind) timestamp_field = self.request.get("timestamp") if not timestamp_field: timestamp_field = DEFAULT_TIMESTAMP_FIELD batch_size = self.request.get("count") if not batch_size: batch_size = DEFAULT_BATCH_SIZE else: batch_size = int(batch_size) f = self.request.get("from") if f: query['%s >' % timestamp_field] = utils.from_iso(f) query.Order(timestamp_field) entities = query.Get(batch_size, 0) for entity in entities: self.response.out.write(u' <%s key="%s">\n' % (kind, ae_to_rocket(TYPE_KEY, entity.key()))) for field, value in entity.items(): if isinstance(value, list): if len(value) > 0 and value[0] != None: field_type = get_type(value[0]) self.response.out.write(u' <%s type="%s" list="true">\n' % (field, field_type)) for item in value: self.response.out.write(u" <item>%s</item>\n" % ae_to_rocket(field_type, item)) self.response.out.write(u'</%s>\n' % field) else: if value != None: if field == timestamp_field: field_type = TYPE_TIMESTAMP else: field_type = get_type(value) self.response.out.write(u' <%s type="%s">%s</%s>\n' % (field, field_type, ae_to_rocket(field_type, value), field)) self.response.out.write(u' </%s>\n' % kind) self.response.out.write(u'</updates>')