Changeset 807

Show
Ignore:
Timestamp:
03/07/07 23:06:10 (2 years ago)
Author:
mfenniak
Message:

add some types. It is necessary soon to define types as 'demand binary', 'demand text', etc, as that will help implement time related types.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pg8000/trunk/pg8000.py

    r806 r807  
    3434import datetime 
    3535import md5 
     36import decimal 
    3637 
    3738class Warning(StandardError): 
     
    770771        return struct.unpack("!h", data)[0] 
    771772 
     773    def int2in(data, description): 
     774        return int(data) 
     775 
    772776    def int4recv(data, description): 
    773777        return struct.unpack("!i", data)[0] 
     
    775779    def int4in(data, description): 
    776780        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) 
    777790 
    778791    def timestamp_recv(data, description): 
     
    786799        hour = int(data[11:13]) 
    787800        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)
    790803 
    791804    def numeric_in(data, description): 
     
    793806            return int(data) 
    794807        else: 
    795             return decimal(data) 
     808            return decimal.Decimal(data) 
    796809 
    797810    def numeric_out(v, ce): 
     
    801814        return unicode(data, "utf-8") 
    802815 
    803     def varcharout(v, ce): 
     816    def textout(v, ce): 
    804817        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) 
    805849 
    806850    py_types = { 
    807851        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), 
    810854    } 
    811855 
    812856    pg_types = { 
    813857        16: (boolin, boolrecv), 
    814         21: (None, int2recv), 
     858        17: (None, None), # bytea not supported yet 
     859        20: (int8in, None), 
     860        21: (int2in, int2recv), 
    815861        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 
    817867        1114: (timestamp_in, timestamp_recv), 
     868        1184: (timestamptz_in, None), # timestamp w/ tz 
     869        1186: (interval_in, None), 
    818870        1700: (numeric_in, None), 
    819871    } 
    820872 
    821  
  • pg8000/trunk/pg8000-test.py

    r805 r807  
    11#!/usr/bin/env python 
     2 
     3import datetime 
     4import decimal 
    25 
    36import pg8000 
     
    2730print "end query..." 
    2831 
    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..." 
     32print "Beginning type checks..." 
    3433 
     34cur1.execute("SELECT 5000::smallint") 
     35assert tuple(cur1) == ({"int2": 5000},) 
     36 
     37cur1.execute("SELECT 5000::integer") 
     38assert tuple(cur1) == ({"int4": 5000},) 
     39 
     40cur1.execute("SELECT 50000000000000::bigint") 
     41assert tuple(cur1) == ({"int8": 50000000000000},) 
     42 
     43cur1.execute("SELECT 5000.023232::decimal") 
     44assert tuple(cur1) == ({"numeric": decimal.Decimal("5000.023232")},) 
     45 
     46cur1.execute("SELECT 1.1::real") 
     47assert tuple(cur1) == ({"float4": 1.1000000000000001},) 
     48 
     49cur1.execute("SELECT 1.1::double precision") 
     50assert tuple(cur1) == ({"float8": 1.1000000000000001},) 
     51 
     52cur1.execute("SELECT 'hello'::varchar(50)") 
     53assert tuple(cur1) == ({"varchar": u"hello"},) 
     54 
     55cur1.execute("SELECT 'hello'::char(20)") 
     56assert tuple(cur1) == ({"bpchar": u"hello               "},) 
     57 
     58cur1.execute("SELECT 'hello'::text") 
     59assert tuple(cur1) == ({"text": u"hello"},) 
     60 
     61#cur1.execute("SELECT 'hell\007o'::bytea") 
     62#assert tuple(cur1) == ({"bytea": "hello"},) 
     63 
     64cur1.execute("SELECT '2001-02-03 04:05:06.17'::timestamp") 
     65assert 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 
     70cur1.execute("SELECT '1 day'::interval") 
     71print repr(tuple(cur1)) 
     72 
     73 
     74print "Type checks complete." 
     75