Changeset 807
- Timestamp:
- 03/07/07 23:06:10 (2 years ago)
- Files:
-
- pg8000/trunk/pg8000.py (modified) (6 diffs)
- pg8000/trunk/pg8000-test.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pg8000/trunk/pg8000.py
r806 r807 34 34 import datetime 35 35 import md5 36 import decimal 36 37 37 38 class Warning(StandardError): … … 770 771 return struct.unpack("!h", data)[0] 771 772 773 def int2in(data, description): 774 return int(data) 775 772 776 def int4recv(data, description): 773 777 return struct.unpack("!i", data)[0] … … 775 779 def int4in(data, description): 776 780 return int(data) 781 782 def int8in(data, description): 783 return int(data) 784 785 def float4in(data, description): 786 return float(data) 787 788 def float8in(data, description): 789 return float(data) 777 790 778 791 def timestamp_recv(data, description): … … 786 799 hour = int(data[11:13]) 787 800 minute = int(data[14:16]) 788 sec = int(data[17:19])789 return datetime.datetime(year, month, day, hour, minute, sec)801 sec = decimal.Decimal(data[17:]) 802 return datetime.datetime(year, month, day, hour, minute, int(sec), int((sec - int(sec)) * 1000000)) 790 803 791 804 def numeric_in(data, description): … … 793 806 return int(data) 794 807 else: 795 return decimal (data)808 return decimal.Decimal(data) 796 809 797 810 def numeric_out(v, ce): … … 801 814 return unicode(data, "utf-8") 802 815 803 def varcharout(v, ce):816 def textout(v, ce): 804 817 return v.encode(ce) 818 819 def timestamptz_in(data, description): 820 year = int(data[0:4]) 821 month = int(data[5:7]) 822 day = int(data[8:10]) 823 hour = int(data[11:13]) 824 minute = int(data[14:16]) 825 tz_sep = data.rfind("-") 826 sec = decimal.Decimal(data[17:tz_sep]) 827 tz = data[tz_sep:] 828 print repr(data), repr(description) 829 print repr(tz) 830 return datetime.datetime(year, month, day, hour, minute, int(sec), int((sec - int(sec)) * 1000000), Types.FixedOffsetTz(tz)) 831 832 class FixedOffsetTz(datetime.tzinfo): 833 def __init__(self, hrs): 834 self.hrs = int(hrs) 835 self.name = hrs 836 837 def utcoffset(self, dt): 838 return datetime.timedelta(hours=1) * self.hrs 839 840 def tzname(self, dt): 841 return self.name 842 843 def dst(self, dt): 844 return datetime.timedelta(0) 845 846 # interval req. new patch for binary-output format prefered. 847 #def interval_in(data, description): 848 # print repr(data), repr(description) 805 849 806 850 py_types = { 807 851 int: (1700, numeric_out, None), 808 str: ( 1043, varcharout, None),809 unicode: ( 1043, varcharout, None),852 str: (25, textout, None), 853 unicode: (25, textout, None), 810 854 } 811 855 812 856 pg_types = { 813 857 16: (boolin, boolrecv), 814 21: (None, int2recv), 858 17: (None, None), # bytea not supported yet 859 20: (int8in, None), 860 21: (int2in, int2recv), 815 861 23: (int4in, int4recv), 816 1043: (varcharin, None), 862 25: (varcharin, None), # text 863 700: (float4in, None), 864 701: (float8in, None), 865 1042: (varcharin, None), # char 866 1043: (varcharin, None), # varchar 817 867 1114: (timestamp_in, timestamp_recv), 868 1184: (timestamptz_in, None), # timestamp w/ tz 869 1186: (interval_in, None), 818 870 1700: (numeric_in, None), 819 871 } 820 872 821 pg8000/trunk/pg8000-test.py
r805 r807 1 1 #!/usr/bin/env python 2 3 import datetime 4 import decimal 2 5 3 6 import pg8000 … … 27 30 print "end query..." 28 31 29 print "begin query..." 30 cur1.execute("SELECT 5000 + 1 as int_test, True as bool_test, '2000-01-02 03:04:05.67'::timestamp as timestamp_test, 99999999999999999999::numeric") 31 for row in cur1: 32 print repr(row) 33 print "end query..." 32 print "Beginning type checks..." 34 33 34 cur1.execute("SELECT 5000::smallint") 35 assert tuple(cur1) == ({"int2": 5000},) 36 37 cur1.execute("SELECT 5000::integer") 38 assert tuple(cur1) == ({"int4": 5000},) 39 40 cur1.execute("SELECT 50000000000000::bigint") 41 assert tuple(cur1) == ({"int8": 50000000000000},) 42 43 cur1.execute("SELECT 5000.023232::decimal") 44 assert tuple(cur1) == ({"numeric": decimal.Decimal("5000.023232")},) 45 46 cur1.execute("SELECT 1.1::real") 47 assert tuple(cur1) == ({"float4": 1.1000000000000001},) 48 49 cur1.execute("SELECT 1.1::double precision") 50 assert tuple(cur1) == ({"float8": 1.1000000000000001},) 51 52 cur1.execute("SELECT 'hello'::varchar(50)") 53 assert tuple(cur1) == ({"varchar": u"hello"},) 54 55 cur1.execute("SELECT 'hello'::char(20)") 56 assert tuple(cur1) == ({"bpchar": u"hello "},) 57 58 cur1.execute("SELECT 'hello'::text") 59 assert tuple(cur1) == ({"text": u"hello"},) 60 61 #cur1.execute("SELECT 'hell\007o'::bytea") 62 #assert tuple(cur1) == ({"bytea": "hello"},) 63 64 cur1.execute("SELECT '2001-02-03 04:05:06.17'::timestamp") 65 assert tuple(cur1) == ({'timestamp': datetime.datetime(2001, 2, 3, 4, 5, 6, 170000)},) 66 67 #cur1.execute("SELECT '2001-02-03 04:05:06.17'::timestamp with time zone") 68 #assert tuple(cur1) == ({'timestamp': datetime.datetime(2001, 2, 3, 4, 5, 6, 170000, pg8000.Types.FixedOffsetTz("-07"))},) 69 70 cur1.execute("SELECT '1 day'::interval") 71 print repr(tuple(cur1)) 72 73 74 print "Type checks complete." 75
