Exemple #1
0
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
Exemple #2
0
    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>')