/usr/share/pyshared/pika/data.py is in python-pika 0.9.5-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | # ***** BEGIN LICENSE BLOCK *****
#
# For copyright and licensing please refer to COPYING.
#
# ***** END LICENSE BLOCK *****
import struct
import decimal
import calendar
from datetime import datetime
from pika.exceptions import *
def encode_table(pieces, table):
table = table or dict()
length_index = len(pieces)
pieces.append(None) # placeholder
tablesize = 0
for (key, value) in table.iteritems():
pieces.append(struct.pack('B', len(key)))
pieces.append(key)
tablesize = tablesize + 1 + len(key)
tablesize += encode_value(pieces, value)
pieces[length_index] = struct.pack('>I', tablesize)
return tablesize + 4
def encode_value(pieces, value):
if isinstance(value, str):
pieces.append(struct.pack('>cI', 'S', len(value)))
pieces.append(value)
return 5 + len(value)
elif isinstance(value, bool):
pieces.append(struct.pack('>cB', 't', int(value)))
return 2
elif isinstance(value, int):
pieces.append(struct.pack('>ci', 'I', value))
return 5
elif isinstance(value, long):
pieces.append(struct.pack('>cq', 'l', value))
return 9
elif isinstance(value, decimal.Decimal):
value = value.normalize()
if value._exp < 0:
decimals = -value._exp
raw = int(value * (decimal.Decimal(10) ** decimals))
pieces.append(struct.pack('>cBi', 'D', decimals, raw))
else:
# per spec, the "decimals" octet is unsigned (!)
pieces.append(struct.pack('>cBi', 'D', 0, int(value)))
return 6
elif isinstance(value, datetime):
pieces.append(struct.pack('>cQ', 'T',
calendar.timegm(value.utctimetuple())))
return 9
elif isinstance(value, dict):
pieces.append(struct.pack('>c', 'F'))
return 1 + encode_table(pieces, value)
elif isinstance(value, list):
p = []
for v in value:
encode_value(p, v)
piece = ''.join(p)
pieces.append(struct.pack('>cI', 'A', len(piece)))
pieces.append(piece)
return 5 + len(piece)
else:
raise InvalidTableError("Unsupported field kind during encoding",
pieces, value)
def decode_table(encoded, offset):
result = {}
tablesize = struct.unpack_from('>I', encoded, offset)[0]
offset += 4
limit = offset + tablesize
while offset < limit:
keylen = struct.unpack_from('B', encoded, offset)[0]
offset += 1
key = encoded[offset: offset + keylen]
offset += keylen
value, offset = decode_value(encoded, offset)
result[key] = value
return result, offset
def decode_value(encoded, offset):
kind = encoded[offset]
offset += 1
if kind == 'S':
length = struct.unpack_from('>I', encoded, offset)[0]
offset += 4
value = encoded[offset: offset + length]
offset += length
elif kind == 't':
value = struct.unpack_from('>B', encoded, offset)[0]
value = bool(value)
offset += 1
elif kind == 'I':
value = struct.unpack_from('>i', encoded, offset)[0]
offset += 4
elif kind == 'l':
value = long(struct.unpack_from('>q', encoded, offset)[0])
offset += 8
elif kind == 'D':
decimals = struct.unpack_from('B', encoded, offset)[0]
offset += 1
raw = struct.unpack_from('>i', encoded, offset)[0]
offset += 4
value = decimal.Decimal(raw) * (decimal.Decimal(10) ** -decimals)
elif kind == 'T':
value = datetime.utcfromtimestamp(struct.unpack_from('>Q', encoded,
offset)[0])
offset += 8
elif kind == 'F':
(value, offset) = decode_table(encoded, offset)
elif kind == 'A':
length = struct.unpack_from('>I', encoded, offset)[0]
offset += 4
offset_end = offset + length
value = []
while offset < offset_end:
v, offset = decode_value(encoded, offset)
value.append(v)
else:
raise InvalidTableError("Unsupported field kind %s during decoding" % \
kind)
return value, offset
def validate_type(field_name, value, data_type):
"""
Validate the data types passed into the RPC Command
"""
if data_type == 'bit' and not isinstance(value, bool):
raise InvalidRPCParameterType("%s must be a bool" % field_name)
if data_type == 'shortstr' and not isinstance(value, str):
raise InvalidRPCParameterType("%s must be a str" % field_name)
if data_type == 'short' and not isinstance(value, int):
raise InvalidRPCParameterType("%s must be a int" % field_name)
if data_type == 'long' and not (isinstance(value, long) or
isinstance(value, int)):
raise InvalidRPCParameterType("%s must be a long" % field_name)
|