def array_from_db(from_db, data): data_oid, dims, elements = pgtype.unpack_array(data) if len(dims) != 1: raise InterfaceError('Cannot unpack multi-dimensional arrays - %s' % dims) try: cvt = from_db[data_oid] except KeyError: raise InterfaceError('No from_db function for oid %r' % data_oid) return [cvt(e) for e in elements]
def unpack_inet(buf): family, prefix, is_cidr, length = struct.unpack('!BBBB', buf[:4]) if length == 4: return ipaddress.IPv4Address(buf[4:]) elif length == 16: return ipaddress.IPv6Address(buf[4:]) else: raise InterfaceError('Unable to unpack \'inet\' value %r' % buf)
def unpack_cidr(buf): family, prefix, is_cidr, length = struct.unpack('!BBBB', buf[:4]) if length == 4: octets = struct.unpack('!4B', buf[4:]) return ipaddress.IPv4Network('%d.%d.%d.%d/%d' % (octets + (prefix, ))) elif length == 16: octets = struct.unpack('!8H', buf[4:]) return ipaddress.IPv6Network('%x:%x:%x:%x:%x:%x:%x:%x/%d' % (octets + (prefix, ))) else: raise InterfaceError('Unable to unpack \'inet\' value %r' % buf)
def unpack_cidr(buf): family, prefix, is_cidr, length = struct.unpack('!BBBB', buf[:4]) if length == 4: val = ipaddress.IPv4Network(buf[4:]) elif length == 16: val = ipaddress.IPv6Network(buf[4:]) else: raise InterfaceError('Unable to unpack \'inet\' value %r' % buf) # This is violates the documented interface, but the interface provides # no efficient way to create an IP*Network from packed data *with* a mask. val._prefixlen = prefix val.netmask = val._ip_int_from_prefix(val._prefixlen) return val
def value_from_db(from_db, cell): if cell.value is None: return None try: cvt = from_db[cell.type] except KeyError: raise InterfaceError( 'No from_db function for type %r (column %r, value %r)' % (cell.type, cell.name, cell.value)) try: if cvt is array_from_db: return cvt(from_db, cell.value) else: return cvt(cell.value) except Exception, e: raise InternalError, 'failed to convert column value %r (column %r, type %r): %s' % ( cell.value, cell.name, cell.type, e), sys.exc_info()[2]