def _parse_value(value, field_type): if value is None: return None if field_type.code == TypeCode.STRING: result = value elif field_type.code == TypeCode.BYTES: result = value.encode("utf8") elif field_type.code == TypeCode.BOOL: result = value elif field_type.code == TypeCode.INT64: result = int(value) elif field_type.code == TypeCode.FLOAT64: if isinstance(value, str): result = float(value) else: result = value elif field_type.code == TypeCode.DATE: result = _date_from_iso8601_date(value) elif field_type.code == TypeCode.TIMESTAMP: DatetimeWithNanoseconds = datetime_helpers.DatetimeWithNanoseconds result = DatetimeWithNanoseconds.from_rfc3339(value) elif field_type.code == TypeCode.ARRAY: result = [ _parse_value(item, field_type.array_element_type) for item in value ] elif field_type.code == TypeCode.STRUCT: result = [ _parse_value(item, field_type.struct_type.fields[i].type_) for (i, item) in enumerate(value) ] elif field_type.code == TypeCode.NUMERIC: result = decimal.Decimal(value) else: raise ValueError("Unknown type: %s" % (field_type, )) return result
def _parse_value_pb(value_pb, field_type): """Convert a Value protobuf to cell data. :type value_pb: :class:`~google.protobuf.struct_pb2.Value` :param value_pb: protobuf to convert :type field_type: :class:`~google.cloud.spanner_v1.types.Type` :param field_type: type code for the value :rtype: varies on field_type :returns: value extracted from value_pb :raises ValueError: if unknown type is passed """ type_code = field_type.code if value_pb.HasField("null_value"): return None if type_code == TypeCode.STRING: return value_pb.string_value elif type_code == TypeCode.BYTES: return value_pb.string_value.encode("utf8") elif type_code == TypeCode.BOOL: return value_pb.bool_value elif type_code == TypeCode.INT64: return int(value_pb.string_value) elif type_code == TypeCode.FLOAT64: if value_pb.HasField("string_value"): return float(value_pb.string_value) else: return value_pb.number_value elif type_code == TypeCode.DATE: return _date_from_iso8601_date(value_pb.string_value) elif type_code == TypeCode.TIMESTAMP: DatetimeWithNanoseconds = datetime_helpers.DatetimeWithNanoseconds return DatetimeWithNanoseconds.from_rfc3339(value_pb.string_value) elif type_code == TypeCode.ARRAY: return [ _parse_value_pb(item_pb, field_type.array_element_type) for item_pb in value_pb.list_value.values ] elif type_code == TypeCode.STRUCT: return [ _parse_value_pb(item_pb, field_type.struct_type.fields[i].type_) for (i, item_pb) in enumerate(value_pb.list_value.values) ] elif type_code == TypeCode.NUMERIC: return decimal.Decimal(value_pb.string_value) elif type_code == TypeCode.JSON: return value_pb.string_value else: raise ValueError("Unknown type: %s" % (field_type, ))
def _parse_value_pb(value_pb, field_type): """Convert a Value protobuf to cell data. :type value_pb: :class:`~google.protobuf.struct_pb2.Value` :param value_pb: protobuf to convert :type field_type: :class:`~google.cloud.spanner_v1.proto.type_pb2.Type` :param field_type: type code for the value :rtype: varies on field_type :returns: value extracted from value_pb :raises ValueError: if unknown type is passed """ if value_pb.HasField('null_value'): return None if field_type.code == type_pb2.STRING: result = value_pb.string_value elif field_type.code == type_pb2.BYTES: result = value_pb.string_value.encode('utf8') elif field_type.code == type_pb2.BOOL: result = value_pb.bool_value elif field_type.code == type_pb2.INT64: result = int(value_pb.string_value) elif field_type.code == type_pb2.FLOAT64: if value_pb.HasField('string_value'): result = float(value_pb.string_value) else: result = value_pb.number_value elif field_type.code == type_pb2.DATE: result = _date_from_iso8601_date(value_pb.string_value) elif field_type.code == type_pb2.TIMESTAMP: DatetimeWithNanoseconds = datetime_helpers.DatetimeWithNanoseconds result = DatetimeWithNanoseconds.from_rfc3339(value_pb.string_value) elif field_type.code == type_pb2.ARRAY: result = [ _parse_value_pb(item_pb, field_type.array_element_type) for item_pb in value_pb.list_value.values ] elif field_type.code == type_pb2.STRUCT: result = [ _parse_value_pb(item_pb, field_type.struct_type.fields[i].type) for (i, item_pb) in enumerate(value_pb.list_value.values) ] else: raise ValueError("Unknown type: %s" % (field_type, )) return result
def _parse_value_pb(value_pb, field_type): """Convert a Value protobuf to cell data. :type value_pb: :class:`~google.protobuf.struct_pb2.Value` :param value_pb: protobuf to convert :type field_type: :class:`~google.cloud.spanner_v1.proto.type_pb2.Type` :param field_type: type code for the value :rtype: varies on field_type :returns: value extracted from value_pb :raises ValueError: if unknown type is passed """ if value_pb.HasField("null_value"): return None if field_type.code == type_pb2.STRING: result = value_pb.string_value elif field_type.code == type_pb2.BYTES: result = value_pb.string_value.encode("utf8") elif field_type.code == type_pb2.BOOL: result = value_pb.bool_value elif field_type.code == type_pb2.INT64: result = int(value_pb.string_value) elif field_type.code == type_pb2.FLOAT64: if value_pb.HasField("string_value"): result = float(value_pb.string_value) else: result = value_pb.number_value elif field_type.code == type_pb2.DATE: result = _date_from_iso8601_date(value_pb.string_value) elif field_type.code == type_pb2.TIMESTAMP: DatetimeWithNanoseconds = datetime_helpers.DatetimeWithNanoseconds result = DatetimeWithNanoseconds.from_rfc3339(value_pb.string_value) elif field_type.code == type_pb2.ARRAY: result = [ _parse_value_pb(item_pb, field_type.array_element_type) for item_pb in value_pb.list_value.values ] elif field_type.code == type_pb2.STRUCT: result = [ _parse_value_pb(item_pb, field_type.struct_type.fields[i].type) for (i, item_pb) in enumerate(value_pb.list_value.values) ] else: raise ValueError("Unknown type: %s" % (field_type,)) return result
def _date_from_json(value, field): """Coerce 'value' to a datetime date, if set or not nullable""" if _not_null(value, field): # value will be a string, in YYYY-MM-DD form. return _date_from_iso8601_date(value)
def _call_fut(self, value): from google.cloud._helpers import _date_from_iso8601_date return _date_from_iso8601_date(value)
def _date_from_json(value, field): """Coerce 'value' to a datetime date, if set or not nullable""" if _not_null(value, field): return _date_from_iso8601_date(value)