From e476d8bdc15e862325752da46f9d23a76411a940 Mon Sep 17 00:00:00 2001 From: Travis Date: Thu, 20 Mar 2014 14:59:20 -0800 Subject: [PATCH] 'iniializing' --- psycopg2/__init__.py | 168 +++ psycopg2/_json.py | 194 +++ psycopg2/_psycopg.pyd | Bin 0 -> 1779200 bytes psycopg2/_range.py | 470 +++++++ psycopg2/errorcodes.py | 409 ++++++ psycopg2/extensions.py | 177 +++ psycopg2/extras.py | 974 ++++++++++++++ psycopg2/pool.py | 235 ++++ psycopg2/psycopg1.py | 95 ++ psycopg2/tests/__init__.py | 89 ++ psycopg2/tests/dbapi20.py | 872 ++++++++++++ psycopg2/tests/dbapi20_tpc.py | 144 ++ psycopg2/tests/test_async.py | 468 +++++++ psycopg2/tests/test_bugX000.py | 44 + psycopg2/tests/test_bug_gc.py | 48 + psycopg2/tests/test_cancel.py | 111 ++ psycopg2/tests/test_connection.py | 1053 +++++++++++++++ psycopg2/tests/test_copy.py | 283 ++++ psycopg2/tests/test_cursor.py | 421 ++++++ psycopg2/tests/test_dates.py | 569 ++++++++ psycopg2/tests/test_extras_dictcursor.py | 483 +++++++ psycopg2/tests/test_green.py | 116 ++ psycopg2/tests/test_lobject.py | 440 ++++++ psycopg2/tests/test_module.py | 302 +++++ psycopg2/tests/test_notify.py | 199 +++ psycopg2/tests/test_psycopg2_dbapi20.py | 62 + psycopg2/tests/test_quote.py | 173 +++ psycopg2/tests/test_transaction.py | 247 ++++ psycopg2/tests/test_types_basic.py | 467 +++++++ psycopg2/tests/test_types_extras.py | 1562 ++++++++++++++++++++++ psycopg2/tests/test_with.py | 208 +++ psycopg2/tests/testconfig.py | 36 + psycopg2/tests/testutils.py | 331 +++++ psycopg2/tz.py | 135 ++ setup.py | 42 + src/psycopg2-2.5.2-py2.7.egg-info | 40 + 36 files changed, 11667 insertions(+) create mode 100644 psycopg2/__init__.py create mode 100644 psycopg2/_json.py create mode 100644 psycopg2/_psycopg.pyd create mode 100644 psycopg2/_range.py create mode 100644 psycopg2/errorcodes.py create mode 100644 psycopg2/extensions.py create mode 100644 psycopg2/extras.py create mode 100644 psycopg2/pool.py create mode 100644 psycopg2/psycopg1.py create mode 100644 psycopg2/tests/__init__.py create mode 100644 psycopg2/tests/dbapi20.py create mode 100644 psycopg2/tests/dbapi20_tpc.py create mode 100644 psycopg2/tests/test_async.py create mode 100644 psycopg2/tests/test_bugX000.py create mode 100644 psycopg2/tests/test_bug_gc.py create mode 100644 psycopg2/tests/test_cancel.py create mode 100644 psycopg2/tests/test_connection.py create mode 100644 psycopg2/tests/test_copy.py create mode 100644 psycopg2/tests/test_cursor.py create mode 100644 psycopg2/tests/test_dates.py create mode 100644 psycopg2/tests/test_extras_dictcursor.py create mode 100644 psycopg2/tests/test_green.py create mode 100644 psycopg2/tests/test_lobject.py create mode 100644 psycopg2/tests/test_module.py create mode 100644 psycopg2/tests/test_notify.py create mode 100644 psycopg2/tests/test_psycopg2_dbapi20.py create mode 100644 psycopg2/tests/test_quote.py create mode 100644 psycopg2/tests/test_transaction.py create mode 100644 psycopg2/tests/test_types_basic.py create mode 100644 psycopg2/tests/test_types_extras.py create mode 100644 psycopg2/tests/test_with.py create mode 100644 psycopg2/tests/testconfig.py create mode 100644 psycopg2/tests/testutils.py create mode 100644 psycopg2/tz.py create mode 100644 setup.py create mode 100644 src/psycopg2-2.5.2-py2.7.egg-info diff --git a/psycopg2/__init__.py b/psycopg2/__init__.py new file mode 100644 index 0000000..cf8c06a --- /dev/null +++ b/psycopg2/__init__.py @@ -0,0 +1,168 @@ +"""A Python driver for PostgreSQL + +psycopg is a PostgreSQL_ database adapter for the Python_ programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock. + +Homepage: http://initd.org/projects/psycopg2 + +.. _PostgreSQL: http://www.postgresql.org/ +.. _Python: http://www.python.org/ + +:Groups: + * `Connections creation`: connect + * `Value objects constructors`: Binary, Date, DateFromTicks, Time, + TimeFromTicks, Timestamp, TimestampFromTicks +""" +# psycopg/__init__.py - initialization of the psycopg module +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +# Import modules needed by _psycopg to allow tools like py2exe to do +# their work without bothering about the module dependencies. + +# Note: the first internal import should be _psycopg, otherwise the real cause +# of a failed loading of the C module may get hidden, see +# http://archives.postgresql.org/psycopg/2011-02/msg00044.php + +# Import the DBAPI-2.0 stuff into top-level module. + +from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID + +from psycopg2._psycopg import Binary, Date, Time, Timestamp +from psycopg2._psycopg import DateFromTicks, TimeFromTicks, TimestampFromTicks + +from psycopg2._psycopg import Error, Warning, DataError, DatabaseError, ProgrammingError +from psycopg2._psycopg import IntegrityError, InterfaceError, InternalError +from psycopg2._psycopg import NotSupportedError, OperationalError + +from psycopg2._psycopg import _connect, apilevel, threadsafety, paramstyle +from psycopg2._psycopg import __version__ + +from psycopg2 import tz + + +# Register default adapters. + +import psycopg2.extensions as _ext +_ext.register_adapter(tuple, _ext.SQL_IN) +_ext.register_adapter(type(None), _ext.NoneAdapter) + +# Register the Decimal adapter here instead of in the C layer. +# This way a new class is registered for each sub-interpreter. +# See ticket #52 +try: + from decimal import Decimal +except ImportError: + pass +else: + from psycopg2._psycopg import Decimal as Adapter + _ext.register_adapter(Decimal, Adapter) + del Decimal, Adapter + +import re + +def _param_escape(s, + re_escape=re.compile(r"([\\'])"), + re_space=re.compile(r'\s')): + """ + Apply the escaping rule required by PQconnectdb + """ + if not s: return "''" + + s = re_escape.sub(r'\\\1', s) + if re_space.search(s): + s = "'" + s + "'" + + return s + +del re + + +def connect(dsn=None, + database=None, user=None, password=None, host=None, port=None, + connection_factory=None, cursor_factory=None, async=False, **kwargs): + """ + Create a new database connection. + + The connection parameters can be specified either as a string: + + conn = psycopg2.connect("dbname=test user=postgres password=secret") + + or using a set of keyword arguments: + + conn = psycopg2.connect(database="test", user="postgres", password="secret") + + The basic connection parameters are: + + - *dbname*: the database name (only in dsn string) + - *database*: the database name (only as keyword argument) + - *user*: user name used to authenticate + - *password*: password used to authenticate + - *host*: database host address (defaults to UNIX socket if not provided) + - *port*: connection port number (defaults to 5432 if not provided) + + Using the *connection_factory* parameter a different class or connections + factory can be specified. It should be a callable object taking a dsn + argument. + + Using the *cursor_factory* parameter, a new default cursor factory will be + used by cursor(). + + Using *async*=True an asynchronous connection will be created. + + Any other keyword parameter will be passed to the underlying client + library: the list of supported parameters depends on the library version. + + """ + items = [] + if database is not None: + items.append(('dbname', database)) + if user is not None: + items.append(('user', user)) + if password is not None: + items.append(('password', password)) + if host is not None: + items.append(('host', host)) + if port is not None: + items.append(('port', port)) + + items.extend([(k, v) for (k, v) in kwargs.iteritems() if v is not None]) + + if dsn is not None and items: + raise TypeError( + "'%s' is an invalid keyword argument when the dsn is specified" + % items[0][0]) + + if dsn is None: + if not items: + raise TypeError('missing dsn and no parameters') + else: + dsn = " ".join(["%s=%s" % (k, _param_escape(str(v))) + for (k, v) in items]) + + conn = _connect(dsn, connection_factory=connection_factory, async=async) + if cursor_factory is not None: + conn.cursor_factory = cursor_factory + + return conn diff --git a/psycopg2/_json.py b/psycopg2/_json.py new file mode 100644 index 0000000..536dd58 --- /dev/null +++ b/psycopg2/_json.py @@ -0,0 +1,194 @@ +"""Implementation of the JSON adaptation objects + +This module exists to avoid a circular import problem: pyscopg2.extras depends +on psycopg2.extension, so I can't create the default JSON typecasters in +extensions importing register_json from extras. +""" + +# psycopg/_json.py - Implementation of the JSON adaptation objects +# +# Copyright (C) 2012 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import sys + +from psycopg2._psycopg import ISQLQuote, QuotedString +from psycopg2._psycopg import new_type, new_array_type, register_type + + +# import the best json implementation available +if sys.version_info[:2] >= (2,6): + import json +else: + try: + import simplejson as json + except ImportError: + json = None + + +# oids from PostgreSQL 9.2 +JSON_OID = 114 +JSONARRAY_OID = 199 + +class Json(object): + """ + An `~psycopg2.extensions.ISQLQuote` wrapper to adapt a Python object to + :sql:`json` data type. + + `!Json` can be used to wrap any object supported by the provided *dumps* + function. If none is provided, the standard :py:func:`json.dumps()` is + used (`!simplejson` for Python < 2.6; + `~psycopg2.extensions.ISQLQuote.getquoted()` will raise `!ImportError` if + the module is not available). + + """ + def __init__(self, adapted, dumps=None): + self.adapted = adapted + + if dumps is not None: + self._dumps = dumps + elif json is not None: + self._dumps = json.dumps + else: + self._dumps = None + + def __conform__(self, proto): + if proto is ISQLQuote: + return self + + def dumps(self, obj): + """Serialize *obj* in JSON format. + + The default is to call `!json.dumps()` or the *dumps* function + provided in the constructor. You can override this method to create a + customized JSON wrapper. + """ + dumps = self._dumps + if dumps is not None: + return dumps(obj) + else: + raise ImportError( + "json module not available: " + "you should provide a dumps function") + + def getquoted(self): + s = self.dumps(self.adapted) + return QuotedString(s).getquoted() + + +def register_json(conn_or_curs=None, globally=False, loads=None, + oid=None, array_oid=None): + """Create and register typecasters converting :sql:`json` type to Python objects. + + :param conn_or_curs: a connection or cursor used to find the :sql:`json` + and :sql:`json[]` oids; the typecasters are registered in a scope + limited to this object, unless *globally* is set to `!True`. It can be + `!None` if the oids are provided + :param globally: if `!False` register the typecasters only on + *conn_or_curs*, otherwise register them globally + :param loads: the function used to parse the data into a Python object. If + `!None` use `!json.loads()`, where `!json` is the module chosen + according to the Python version (see above) + :param oid: the OID of the :sql:`json` type if known; If not, it will be + queried on *conn_or_curs* + :param array_oid: the OID of the :sql:`json[]` array type if known; + if not, it will be queried on *conn_or_curs* + + The connection or cursor passed to the function will be used to query the + database and look for the OID of the :sql:`json` type. No query is + performed if *oid* and *array_oid* are provided. Raise + `~psycopg2.ProgrammingError` if the type is not found. + + """ + if oid is None: + oid, array_oid = _get_json_oids(conn_or_curs) + + JSON, JSONARRAY = _create_json_typecasters(oid, array_oid, loads) + + register_type(JSON, not globally and conn_or_curs or None) + + if JSONARRAY is not None: + register_type(JSONARRAY, not globally and conn_or_curs or None) + + return JSON, JSONARRAY + +def register_default_json(conn_or_curs=None, globally=False, loads=None): + """ + Create and register :sql:`json` typecasters for PostgreSQL 9.2 and following. + + Since PostgreSQL 9.2 :sql:`json` is a builtin type, hence its oid is known + and fixed. This function allows specifying a customized *loads* function + for the default :sql:`json` type without querying the database. + All the parameters have the same meaning of `register_json()`. + """ + return register_json(conn_or_curs=conn_or_curs, globally=globally, + loads=loads, oid=JSON_OID, array_oid=JSONARRAY_OID) + +def _create_json_typecasters(oid, array_oid, loads=None): + """Create typecasters for json data type.""" + if loads is None: + if json is None: + raise ImportError("no json module available") + else: + loads = json.loads + + def typecast_json(s, cur): + if s is None: + return None + return loads(s) + + JSON = new_type((oid, ), 'JSON', typecast_json) + if array_oid is not None: + JSONARRAY = new_array_type((array_oid, ), "JSONARRAY", JSON) + else: + JSONARRAY = None + + return JSON, JSONARRAY + +def _get_json_oids(conn_or_curs): + # lazy imports + from psycopg2.extensions import STATUS_IN_TRANSACTION + from psycopg2.extras import _solve_conn_curs + + conn, curs = _solve_conn_curs(conn_or_curs) + + # Store the transaction status of the connection to revert it after use + conn_status = conn.status + + # column typarray not available before PG 8.3 + typarray = conn.server_version >= 80300 and "typarray" or "NULL" + + # get the oid for the hstore + curs.execute( + "SELECT t.oid, %s FROM pg_type t WHERE t.typname = 'json';" + % typarray) + r = curs.fetchone() + + # revert the status of the connection as before the command + if (conn_status != STATUS_IN_TRANSACTION and not conn.autocommit): + conn.rollback() + + if not r: + raise conn.ProgrammingError("json data type not found") + + return r + + + diff --git a/psycopg2/_psycopg.pyd b/psycopg2/_psycopg.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2adec7c75afe013dc9985525f197ef717530fd6a GIT binary patch literal 1779200 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≫Bc>Es-bA01U02zHhHWzW>jcOnJ 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଄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%0A7+`Y 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�FtS7Z{y(-?+pvyd>fu?m&zr)Aqe16 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Ð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

#CONk?(w(WlJ@Pp{K_WLFMKrI?wuU7skh50 zgA0tt;_1QxcEXYmOJMI$vCr7?B)Ss2an#Op(!;eu^+<$Xzd=-eEkDk5LCxpQjGPwz zreNkt{w8o1EWttprk1@L7}TbIg9Km|H!!%FibH5t7k&orxaxIb9tYG3Kj#j>GM254 z;;f)ojk_A$#!fyN$z!7q`d87W8gi-n^uL%x*96lHCeEJ$(MzTJM%gA+1I|gi4J3yv zniR3(&7OZ!_GfPov+?jIbm3mxeIcfN98Sl!2Yi|p7?uy)()eiim!tlu0j3b7=mn)B zj(s&lfFMs}P=QgoHJoQuj4nXLFByTkh{OT_b1~s3<=$kS((6+S;A*t44>!pFt=_vG z4S|i@S}B79dE|Vs-)UgKF{2Ptd(Y+;WFjm6C0AvA{wU`5D90ztF3wPs+IV#~PZ+H8 z$Lgl4UJx7DlQh%ZqUiXI_0s7b0XyYY(Y&7~&)ngLAx(pU_kGD zQ`?O|rpu8DElx<^Fx#ih)-NqvT1|YmKkCkMXkA5!ei$HR zx%=k3s;!5jj~|=ws?FNrPkd-K5N)L9HvJkfQz0SKEJv&}T$rRNm71?eoeJ@n1WZ4- z<&ZG>^dZb=hv_F75Cb~Sx(xG^f3h7p)qdV!KX136Vf#rrlr?Asp6pldnAowi?dLo@ zs@{nTl=|Ng&(0l z7_49>L1n=oSi>ui$#?w$zg76P;9>r6K}LaCzG5^8^sW;QUp zT+AdiVu(PG=x|XdearWx$4t{bJ!ambE1-nXCio{^D1;5$V#nV!?6~w^E0{W$)i7(H z!~>6F<+Oo@2u8??<64YY--Koq%jLhKWS)nEJ{ln~!SD1HXNOO=9{B^ieM7?sydt~d zfD6McQq^#foAC20J zOe}wt4Sdwd+KG}9Yt=ZERk?TGJ;BO%!xu#Vu@tkHD*}JPyTg63#QW1nP~%!V0HaV~ z#Ckt&hosD3xA;p+xB7`D-|;KtJ^` zpL(1-u;6HAua>RXbq`J13l~+7`S%}&V}*;Fe~FynM#E7p;Y46bo#aMOV1Ga@{*5yY zcUvRsZkSA=cPf{4kUk?Il1`#*i(36pIOK3E3y8s55&L2bW*GO-4@PnYXm)Ow4GqlOSer-2CB zsh;OA9p!o6Ke~07J8v~Uf}ZDtxM>$3{L|WI+rO1b4_lcP8MgNz;arwKP&pzH`GQVn zV5WydB=~{fwqKhmlP%yo_8qUBZ_~&DaAgtq`jeDO4eJE8^8`wK8)@mYSIcxf07rw5 zml2aBJ$XUDc^W4HGqxOby94)4VDKzp0Yb_+&Tn%ux&E%km~mJNHs4-faiuLsxL{?aqX{Vkfg%dr@n`Vfgvm5k6dpi-VB%XcwaS zPZxEn2HuqfzPw2AsFvVZ7l18EMqKm{fnEgq(OGX2Db=F=jt;m&0ye5zf}lv4#!o$s zwV?mYuV|W$qSZI0x+7tfAuI@kZ+hA8&JiVY_Him1B8Xgs|9{Zzpvi?osC}J)m{L!5 z7al(G#fFk2knL|PiR1*Vuj4(mZ&wL8z8a%AUp?{Q!31u{#vW=9(s>EGWDHuZp#t?x~ahng8gcY|L5kfDQm~uO& zE?j~#CJ;HNv^UCOPsXS_hV0kS7J6*w+Pz@x@)V*1)*--}8t#j~)5E=yiR^)y;yrCs z8l&QwdVDjC;$@JwT^0fcpU!IG=unQeUO zDeeYgXS3P*8m`@~-2v-gM#XbocB1D9H{A1Ob}!uLR6Mhb5y#*~@x|?F{vy}YyazkL zO9emG=q~BjQv#O84R@ycN4I3e`#B-}Kn5o|5h=j+2gTt6q>SVMfa8G-p+myi@EqvI z+d1K^=oY>V<4Y!9yb_m*c?AL4D1}M0Spfin*bv>C;eUx(LE4gV&*;`ne{@r3bSsi= z$|iqFATDG*M|@zd2R6b}@iWfAUWRp@&ma9LGu*4%S`hF@KXrp_|3OgISa2Qdw?+oe zsK=M7n-I@SBLl*?t^orPkt>jf)5ft}jJ`P-(y8K6MF~d8%@^%Qkz<6VoMJ>PTwFcp zDxV80%~$|T6KCCgNcTSOR>Q;=_VbuQw5vxL*X;F;92ecPe%H>N1{QS3NYJ|T+yM?tqkx%2T=|j%%cY}jNLH$@{69>7~9I~sN7IIRd!Xu8lZtJq(m{fy^2haQuOR=liUUKgX5N>6p`u|xckr; zw5zN|yQ08Qo{k^p%e(6l9kS|IKw9#5`br=%PK9=BYEk$Cm0M5lwio#HG|~_mIOWtb zS=E=4A8vty;Wj55^3*iQ=MeIngna9FAhUkqao-Df zX!Jl2$cP8}rXZi326+%6e?-Uy-+}D!T;mH5OSZZ`)#}gRO11hdLfB0RTcC=PrAo5Z z!hATxIIcswPw&oo3ZaJOXWKHv{q@pwtH^R>Zh3%oz}~wS3cir_bH)d)C_}BfLdz)X zTs=9G)7k0^pV$OJh=Ot~--mOeTkA*wK2~5-Tjy#RK{g@J_r_-<9&_0D#kVp)_}}-& zXM|5d^DAoVJP);ePaRslksCbCAGl|p*aWMI?}3B_xkvy(=6e!|><8kDya^d{IM5V` z`AgXi=jEasYM|dkJyI=CAzjONXATrhs|6GT$ZUZit}gYWH=J5vM~V@t=grPn@Y6I{8iRg?9K zeXEMkt~FGF_lv^JdNX=gz-8a5wkeL;{gB2Wh57&f0myFhf zx)vM#iOY#~a8ZGw_J>?9U*m47#(lGgR_>2nD3>ZDUP`o#sc|fE?Duf}fdsC7U$5HX zX&Mj+8V7Kn8;8b#bsOw%L27Pq@OSe?z9UHSA!&B#Gz?JVbsCAZtX+1ReD#m3fl>2C39u|mKFpi1 zey77F0N5=Bb{!K6sUPX5z$UtlX9%ibwczEhs~ihEQT^>*s)^UB;n#8Yp&~kbJq{jw z05oVK*IJ{hWa@a`3TXUk!skgt0e#e@}VaCj5ku6Y|4S8 zyHZ%*sKCQ179dn11OX|#uVIZxfjh!D4Y5)6MwxL))su=yjT_aqb{#bDV8$c^*C)Ch zd-#uWcmx~)YkV*J1MN9ox1<#pu?7YOnI5c4RNfo4_=ESsC5b;m-Yc z4s_s#3(U1EJMDF$=3h72@eQr@7=x0eZMG~O1D3xaFla*6&`&Xyy_R>Ei8XP$@Ru=~T|G1U-{}>~`h^VKw zTCIP`9tlve%Lbj=e>rItI0EwZh|dYKz!%96%oiufUostYZlK~tsv*MXH9v`OlrRw` zbX)1u`cd78GQ{py&$biWD(052a(TJ@DuC&Cbt_D|Jk6>P4)pMFh~;jtl7&ZmRcJ5E z$uljgr_e!lB=KDJWG=jR;T{4K!4f%`YVAZqM&_uq;1d9~m4MWuHAi`LxIldIDZs0k zdroA8Q6cS$RDfkomqIRg8JWo^8h7tr z4}DC1pWse<<%2KCQ?@G8jjcYr{a{zX($@1$0|IUg9um0EMTek z7iNDH3y`5?O zXGm$M!Whpp%olV;RyH9e5ZJFpMr3`RWI^` z+(!z+^fZn_0$cy~Iqp;vzEAzz@q$O+E(krWlC6JZ2`VsO>)(1waqt$7B7|xO-Ni+1 zR99_>uG;U!W~9o?k%Vakd%@T@&Q;s4U_aZ_$c|ckIMax|gPf!0U&$e;H;?lSm@{CY z+@iyTvE`_Z+4N?ZRFdSVw^~V-R!g!*>lqLgp5?+Vu3&&QV~8WosV7$PeWRKQ&szvf zF~wsuSfMBb_z!X9gSwHOSh*vP0sMzJ_Lq+9&p~ck>yiQM;Y9=iLIHvzcU+2+ZjpfB z=@do8r35^z1H8$AMLIx84JoKk{M9e_C)DmXY3we$FotjV?cs!aU5AqXr-wsmV2;NnJ^|8qha%se%;AfLmKwg^lV%Mv%Qbsz#Y% z^?dyB0B3fU{n=f>8OWAhf5Y!>LB==5}@`^o!r^}C} zx)khU!sHZ_xa?)#&KAdd7ryEk#jQ9G%)xr7;dVSjS=+gl8C@=&n3Vi+^9?e@;5Df|36QC@u(5VumUi!z-8r9fSBQ^5mr>sCCMUn0BU$dxC$-A zfq}01-7o*PvW6!Pb0Ig}g#sfVVd7qbCYVjUk&7H53D+M>+opUG@SjD7BioDY^~3;1 z^P^V1-U>=Wpg00@NWsKrCR1at=G-6UySCyNz%PPdHh%r^`z?Mi;O9Y)48iXjyvOjn z6z{H#{BHj;v-D?njuYIYr`vfw;)#7s=pUS;__q9>*I!7HSChld!XXfKq%>AH2jtkg z&XFxnBsu;J%Xjtey;{tcxs`{_Ma)*m4dIe;&J;N@iL4JJt0QRKz|6m9<`u~7qzJ7~ zrFfJn#&H*80a7HdsQULOa;#R*yieGu+;T8nq4bx5lVuCrX4nG)Kuap6A)=WmkRQ#sn zHycw%J(8P?Nh|G(Ig^4IFn!gNYPE2Ihm0L_<)f0Qh$+Bi%#|fNQK^2E<6*A!$=`qu z;&i0`SVmBby$s^~x0zFYtlyRY;-mL@e3&a&045$3pz(NCKbrKT1rK%B`CvU*Z3ze* zhXDV>_7Fm_r30X|5fZ%^uF5>H_Rnj_u*Z5{9yRb31&`jIfGt&AHxNZod596=18H~~ z?;yh4U({Q{)64A8S?X+bK0wGtdBNWILBq4S0t!(egy?Af9SlCFu>MUhfEbd~un8>`% z1$b{?OaaX0W8_Lu0UwXzp&ovKE7}D(!gJrV_?Esa;-qk5csTqbRi|aT>6XCsyZW#pjf}>*Kp(v#86vRB=zIrXfNK>lLw{cUgjZ< zjN_WfEHSLb5)|uaA*(qRlpq2Art=&ihB>uB-Kewc8JkzDSoblXdiPtP)-CHRj$i@E zL>iJLNA{>RE*o`T!m8^LPhaTJ={O`~y^>-WUF^Eg*mbo~H+5`)^k*+$MZa2fr8agb z?I)~_YKb=&y}H1j1GuvCay5V*0CmX189SQShtHL54$;&38$JR`68?s7@W}K8OD9MQ@Arx9V`LHaDyH!nj?}+8OQ2 zgzMK>RZe`AG-#C@Q2fzvvOIy-_(do)JJM71zVWl+@8MLqEeZGQtb*|uTwTgkR`Kj6 zbOaIs$G9U{>zL6kXkT|cIQnca(y5ldTB@NPM4}zSN*y|SPPsWJU|4k}hIuKnzp47~ z24$rSmaC|OILd1KmpYsSEj4>OdW!V^cJyUFr+nbBA1jrx!r#rp%C$sIH?5f*YKn>IBZpur1F z5n?(2z8H424F@uv@9me!cZT!*XCJ=d3NKX{-jMGxhC6|_{zsRt-s1{^3ZmENWM~Tn z9Y4~J|5J=A(sk;MnFkYU`#t(&JwFQT^~X#6cm#3|lda^(({uF4ulVst`{QT)Xt_zp zEaArv`(rLYKCwUU&wKZf!nGFpF}%a0}SUQPgB zepF)d#gD%H7;}IG`K8Klaurq%<1J$_M{@BBh&+Ly6`LWync%2{hBX!l+;RCfg zK?6Q53D~O(JXMFEnGAP-Px#*csK__f8t6=xu@}1Y#8I=~; zV_%oDLUAs!S#j56ZIR_0@$~x_1F}SUW~;Q(!o8Yg$uVH zMwdL55y90QFf4jQjYnq8@X!`|)QM1i8ts@|piF9sSF4Crsv4&aM{XjTd4bz&C&>S^qtur8&_}99*z#mn*m-_ zoxZ-!>j8-fIu~3~y}8iQuQ@(RV)oA6R<-*_L~-O?beVz$ z*uXhjzmAI_LM8hX`vEDTowF7WO=z89T_35lANqBRw@Q_DszYMBvrerU$qt~ZP7Iv; zur6azmytc2H`;BfVqJQpE*+Z@(tJDqgsjczKq!75QH52Uz83aptEt^WgWhbR@PNtN z)zOGQ(Qh&$XVhBy5CBb!;6;DQQ;4X=HZ~ry+uZ76Y~aU_jee6E@kxr{j>X_~B6#Ak2%kRkOJ5WhwCdgz;cn-DOGYye)>y_4Bpg39xo|A9hL zgCC&=T7Io%y?AqvS`7^l$4&Cghlnp?H@8{kY?Glk%mHxdAE}{NP7sd~#6p0ehO_24 z=h&;kR@kd7<56vu85@GOjoXJ&@oKo1$=CJ8D4Qbf5AB-}t?0o~hBFbR(`A%FGGJ8wZsTtwLlF-jc=PZFTOt(vp=P=pc3}4KtEI*L zC^P}2A{O^_ucG|7qW0!_y2fTD3?c|v5YmKrZd;_z2{?V=jK9XbBgfy_e@~6Swa88^ z1@Tl@&HMiGcgLXQ_&fNL-A5RIPJZaQT{AyxvovOz0 zNgIC)SQmTzt+U%QiFJw1{hsmn&?TwycOy~);XwfDHvTdrp5&++H?k`cFX5QH@(0Fb z^GZ5xPmRC3H1s?`Kl=DH;mbjfKP)0xk!>%sA~OEi7(M>l?$We-Vg+0NKOTR{{?ASC z|1(j_)5KZbT$=^6_ZO1NCZZe+Gtg3s`^s_|17RALt2XzY$J}z{#ox@svdquLm^xAF z309i~!Z|3N`*x%)Cq%y0{DFhdYcq*A+;(lbv?zl-1fZ%x`h1-V`iTJ^ofO_XgLFI= zytk%j^E-A;HgRoq{~YvvJ?dohUfe{WdGDjcrSH!Y!~zpOK#;63dia73d6n5OWA+MU z4_Ox3ZV2i#JV+6nIam8s!P5tz0pI0RBv%F$C#2kDMcyJLHzB=?yuz$Ds;OYTI4Ai5 zI06<%J#pDs3nFo}v9U=KB^AH84!+-Q@CTuO`X_XLO8r+9vp&&{uXPZzf%ZAPNKEqMOz2u$)Tc*po(Xb&vJl2^^`# zH#>;@`V|ysaQ7tEdkvz@oGe!0reuP5nBXiVFmra}6_lCWs+SqcUjJnaeWDMR0!XY* z#f*3Tt7KM=UynYB4xfU|aFIrhhG?6RbPkgGS5egz8`Y`Wkj{yjMIfUN_*bJdcOL_y1|hAX6#$tOHi zEnkSG4P1DzOFcX$2cw^j>gmrgc26>_-hT$L_AKNFU&1*U@MvtFt3epOhOSxu z4qmU;%&jJ`Y|SW@|;zPt@-DnQ&a4T^tXKv0i-AaF-j! zmCGZ1w(O^b2Ml)sM!3&#+Q&x*H?d3N7c^nn>WcrU3F%$&vzlPEAyG1#C}X5B80`Geh<<*CNJ7w<23wZ{9t zm_u0kFS0f9oEO;?IOhYje;U2|gY2q-Nt~qdTaAx&9WHX2Sf4Hx8)0@yDT8MtotXju zcRb#Lv{?ZY$4|B8Gf5WTrO}06U(geP55#<2?5TSL06dMGP+q7a;)-}wE_9%9qu9?A zrD-1_9pFVlYW+^}!}!ADL3=*-9o0G-R^o9yK7?x4k! z708>$(mWxUB>KHI`K~VfGL3v!K7M`iI~l*@@oU5nK9Mrv3MtEWhm?JUTcjUylhoty zfUz3CZTS5YzjyFkk6+&)VfV=F(W6Hee*BlMAIZNt9M91MIkPSdO<9ljo%*+Zi4j(# zS&%??X99i4jItWnlNy4i#$a2p9VoE}gI3L@)`wdDqr(Ed`hN9rmbMIl5qH_!P&b+< znEm}`ksr^ZXl{>aFLyMzAll1|jkQ{97dT=INSc#L9VZ_g!6WQCG7YsBw@I->2P7w) z>B$L4_+~%cFUHBn-sB&-v@_xVy9@lQ0@)*3f!y-|e`-4X6!2Sq2zb+t-GFyMC+>fd zL)Za+iq-QBnr>_RZIpJh)dq=8xUNx=^XT7uyPAE#n_raDum%1H2f04l@6XLH#%a5X zoV$?94+XS8FT2?8YMp3ZTB7liXmxWv zN=Zv;NbrVc@|3jHSJ|n_W71NO(y6T-X-WGa40T+SmMlvLZOmIIF5q-E`+fZqtGUf; z%iF$+9MEqTvi6@yaBJRb)?Hft6+<3s$*sl>;z+O?pF~0)zBh`HKt@#2+YXmTnzabY z`A9&mW=(XGW}Owtk_0FH1>a$J#YtoSjNRi*>wPZOr{>8<^8}`V;$SjHs_j~eV}bv) zD_;A6quwUT{Zrv#cB>M#6{sK)WfW0%|feRkL}-3I3OD zmKR-HWcxqboOs|_bPK7u8gqKs7g#jCFfuf-XlhYp2q<{^B4a>g(4yJi$eDpfvx~u~ z%#q4yAK8UWE~A|jw5xsOUOo~qUt5deGp@KUvBqEdIsL!N=|ZW`OXBAhz8sb+=SA6ZfaF zs>3wKp3;UZR&tE2tvDr^18kLdNf6%K1Lab!wfey%n&GZvz%q`gL$F zGr?_5$mh8uoEzE_K9`4w@U|v=Iw11xweSf%_mdM?^lsRLm+VFFh2c1v$a4d6|3y4=`FdH7`Mk_)EoAv$=5agu24%%eGqUK)eSoD6fTv?onKBY>;UHAB|$lL4gdq zJtBBAkuGC|2&%IQcX_b#pPt5(!0Up@3z)cY?y{nIHvSeERxkK?=~+3aH1cNrdY;(p z5m@w-!tf?|v*PP5Md4Nq624wPApAT6a~9p=4gV1da~A!iIQ(R1TUNL?4)CAe_7pak zvWvqH>~H%PEejV);P3g)a8Kh;v6qDAW<;)!;>L9eTl8au!Iw?=V&0gU9kNEDLZgZ( zoq)VXKquj604P8Q6d|A}Xx0^kOrBa;ZM2Udf(2On2<~XRIy}0V?8tS=Vj91JXo_My zjbF;k|F|et@+if1(4RVcF0CnzaPN#VwzDbQ*pv~_Kps)^@3bvwUW%(iMiqphg>4@p z1Di#nDQs0o03i8|qB1>;F2q-;azmsC(G-V$6cA4# zi#y(;RRKmg36Nx7MT6a+i=V6EjVKuqM5*d+Mc>9^on zuC)e3+>Yh{H}Ruhdy7jWQ9_*s6;cEV9Cg^Ii03L6r`qBF<7TSUIv5t3(njUcx?t4xFcO6p%|z(6gh=CY&NuEQ(hjc~ke~rcOi=Z0%-f>Mwm^UfceXS6Z;kf^46s$dA?-dM*F0k6b<3H>%ywM>+s;|7NJ-oGv3apexcA zu+TEdAU6as%gzpf5W)e9BzU=9{6nDz0gUd+a3J2X1?YC5_^C?4S7Dbmq7VZzBmg)| zRs>GpCisgCPlNuwfYCa_o&neaYa0+fJC4KQs0?@_;MPc;IOh%toDQezfD?iH#$>IJ zR#zM3DFSjQK!yntIjs=`0CI%1kdyp*fz#JX2S>`1AivXc8`^fXH(;#;wCRM#az}Up zt%4a)y@99iB!xuIO+xC1KO2e#C>E=9dpw&Ntx+XbYjjsuI3U^loh@16^ANJ`+ra6d zLNt>>kwNUDqrt0Wt@3nAR*QIPJwv9{fPa6Byp%Pp&%$gFIK5Q^)WMPB?}JIs=fI2( z#rbe+Mgh~>B#2uJMiisrB@6=+k2!rEhXpPY&?Fk~Z@&n#ZiweGogGAxVFAc#UdQud z0i|VSAux@g_#Mrkpm^}--A||X1J5UOevr(08Z>W71RqJWx_pcsz!Lt0As5FXr?gVy z7!zrqz}LKJS5Ej^`c7~BLMZy7V#>6Kx~CE#_Gp2+L&A;Gptyk_mtuEDPyClEhQM0fv^9H1P zIp5^WI+cHLn=e#L9X(MnMciF@fe_$n{3k!n6}Yz6SzYMx$yf!cWv_CpBq>Eafkb*6)8G7CfFPmX z!R}dmok$U_cqg-%K%%|IKqVl4L&wgysjyGS4kW$DRTm9X(mpl`?(^FGS>_OdyYCe9pEe%lMCI3!0-Lfn9}WN^?-gN_3Hwv4hQ- zfd1JS#(e}Ef-x?rfVX3PjZ?kSKjDuc<%Qp~8v|!b$^OA2CWSYMc|QDtC@6@6)&p%6P&-Asd6S%XK0B;b=$)Zy2`JtlzckKbv3X_HWUun;EsrFpn4RzwGYv!kv#Xlrs-?cmFf7PI;ez=1Q zQ&{`I(x7XS^n7Ih3`mi}|J(i{FP%6i&YN>U)WVj)E>@zP$(UTv`8E0V z(_px<{LOWc{kWX8>$P(e*M4H*0aR>O6SmUVNAF{hB?fo5v8ojJ{u8;k`zkT1z}%+i zGCf&vuH!s`39KFuS=n9#_oy}lPvi3_ImyZ$KHf}I9gH5~<2`Bei+lQh#X4iI!m@Ca zdNN;R0+`BingD*MLPsA%60kxQ0cwNMS9<#EhZPUC6u4dD74TGC_x+l`d`NNlSa`AK zwFdC=taX?GE==S3-Yoo9B3lp$id# zRqz2(DxiPKRZbCliq3Vr;GvbPj;(5?$!rs`3dPcw`3`Spz*co7ROU9uJ^a22=U4#m z_kb6Kc?k$1M_q=npm|Bq>Z89$;2TJJd!^X91fVFyCZsSYd4?)Y9Evg4%DoVocL|f(i z^FBwJm~>02>?jvK2Q``3(TOUR9{R&6U++J!{g;%i?)-p_$=UxK*{P;+sa8Fu`5bQp2C;A{(KOVCl??}0YRK99CKGf+*DM=8#l>kN^ z@~^s|F}WJX-3Ub9Ii~}uglBJ{tfwgJMLL(N!~Ixh&ee!>06mX)|Ek9k85?z2wT!?P ze$G&Yp^fEjDCkcT{|jdRwM3reL^|zv?3Z5oSTNvkdLD^UgQd(FGk&Z_uTPQ&tx6g0 zC}Mtvq^#U3!jE1dgAm#XxU0n>rXnyEnmPO|7uN;ECf2n_c>o0ep*J{DUGN^DnsOdb z4V3q)*~+V5CadFh>`qn%+YSQLuCVX&@w!X;Iu%|osScpdZe8cG>XCKHIuAsh8Sd2i zU8H86H{q$ajuG$M^*Vmhx4=#nLbM6iBybhofShKh0dXemg9dcGiZ{Rky&EMg zVW?{Vm`8_&fzmy2c`|!eGCO^FsI8YH`-76bsx)LyKs5x6RP-WMp8|6lz~mkU%prnV z0xhnY*INYkC8XlCr#q^yn5vl?9rK32*FZh5kdfP+b^AF6(sA$W9RB30K_R_ zsYZ@^^FnU#i9jbvq-zB#uk9eW`FSJ;0B$u5j!G|1_)}xP@+BY@db+n)K@N?)-TM0aGm+%qn z8Kcf)QD^K~y^Hha9Q^iq^J%R3YZud6WZ^8D)04&f$l?v%S!xKocnk*wy10KpzU&SU zRpKjlozvkUe5b#E1yk^3f3N9C?{7{KecKt$GB7uA5-7cn2b+`p?|r-8a-R-4-P2Ey zI^ik=_Ve$df$XVYvFeZ2r8u4Vr?@~pkF~X&%V`nQ`^A!#mWuvlR^EE1u1m|RmAUD> zjV#Wo&k(ylv3{2Un7`?7$i9jiM%CQLhREP%HAknF^?_YYf>vLSO;wW&nVHFuv$KUE z7in`xqy$5TNN@z7b>;`@UoLp<{(bztwEq3{7t+7)qks1ziQT^&So&AP*uS3pmPo06 zx_2>;weN$ixH{a3w#2S0vWGA9A;})xL0fWX#CE{#hMo{80uXrnHqzs+(#(z7UF0Xkj>PA|^yomFEW2BRy zcJUEH!z(O!Qk%lX#Xt<;;kHUxQay}Au+fF(C?ek%youTwF(Y5Ea^z|nwSI??euQCg+%ri{YpM-BN zo(E9sOw4S9*#C4CBj|p(U+2MEqE(sNj-WX5mq8mq9ZmI+IpDuy~uH8Mqj~Sd@!^5 z;yV4ob|9=kKSUrhUnH|fU7!F#yO7X|m`i$puVq_4oJd`BIULZ6(npo$6e(1#bf zRFAg>JN9i3R!7;}&VIRdJgNT^xY)pX-4g;Ks!5nQc3bQkZupH45>G8}788jD(7;KnJ znC&}2su9B$dk~x+k>s(t{MyL@R~*F?dlQeuQo|qnZ#Q1oP+vnbTrCF?QM> z!vz3;0yt-FHxvQ>RaYYxrp)T&AtaU;%JB&c%n0^L1bIg6g3n|KESWAb>oFbt+ksFZ z5GDzPgX&j+5U?f&s9%_jizFckZRHN#q8(M&R?0eLnsz%Ia?QTMD^}8BP zsRC#n-T?VcU zuk-$n1@L{e{KE`+FJSqbmJ`6@X4W69KC08=fIorr*c)0r2MOa5AXGA%vQ7=zU)Cey zeqh7F3>JxvT9>DB4-kc7g(pa{O)s%nx*|ZaRZ{HZEVdw7tWMh!8O&mTp^H5q38mdm zgO{pHMru4i0&x;}{z?j3EPzd6KB$&_S&y(PstnbNPjQfU=_4uR-Nk}P5-MJ;VOD9F zD*)5U(DHC9!x(0$Wrk)u!?BVfK7+(;iAxE34*L<)t<)`8f&#m>;663q&ip$3zT)`n z1-RpzD>@@K`gV#$cOS^W2Fnv10|9g5RLn-^6CB27Ruldr?AJ}wW(;aBNG3R}A|qRa_mg5B^}LFQttb&w4zGy2t81 zj~N~QRcndM=wRZh*30v}?R)v&WmK+>oMMNGRknIrPTJ#?@Mc7-I$($fRQ;U+cQb(c zS8?N=>X^ZR2tC~C?Tc5S8f>3oRo79-f(V2?lg){3$;-5?uXeeKMkxUl9smWl;55H=c?Dx_j6Mq7bMA5Pt*oZB0 z(BUGEspk3+%$XJUsgp{%-h^_FT*&LUCZ6MOuQ~@Hfg1|5v3@6F`KqqO@=cOCpf-b4 zfm8n~1yFu-;yG%^dF&&=1dSMu^seu_()3|ZLvdW=gK3BoJa&&__foEl)osVPzv^eQ zdU=l&-9QrXp>j@v;}9uzZ)D6(QWz9CK;P4!Lyp|7)hoE}ys|BfMXdCsPkM5L`hQq^ z8~CV->;Hc@4-g)2coI;nQBb2%i=s6#qPwuj27;ofVAYDIrC4o6+*PcKiJL&Smj$d( z_)x{xTCBBVZ81bE2?#+^K&=&PAMl~}#;C=rG>EXj_h;tbO+xMW|NDJke>8jN&Yg!d zXU?2CbLPw$?gRk(zu;Cm*utP|dQU_2w0$;fybqPA{K z(E&kr4Ze=l?%@EoJ-n-^tNkNNH~WfKXP7zv7*+Gh-G;#~(Sn00`%NFV z^C5HokX!@@-Zv0cx!zgwGtz2cMFROT?p|7sy4b0&=S%9wSSYc;XtF@WLm$xtmFtt= z4BaJ{m$gO`fRX(#$KzBL>dH zI@5O;Z2YZ74NLQ;P_zkA5x!K7>ZzMg)yVX~!TL(-@y7Ypx`ppnp@SZ4ZmC<&m$AF5 zYB;*{L255V$Yx4{yBd~$hrs|t)AsZj>oK1buo{acF(>xESDT{CIx${?>xMX*Gg!vN z{N&$)6aV+y&2iE>e3PYg{dJ_VYIAzK!M+(0gZ;Efk#lP+Sa5Yyf(U^sBC^4dXdlm5 z%vR4pjm~_H!Jkq<(C-)UJ-VjQ^!pdyrZU^_3?@K-#&nkfJsX+d)g(jO zzSLAPccxQ+6xpi*ULpc`19+%S7Xt9k|Do)(nE`B0Ju@xnv8C2F^0nf(CZW8f!nm51 z0l;5hW)y+l-AW%Q;QwwwG_7}dPW?HI^sz5^ zckF_g{B*Ih*09gF(Q^`=kg2Ykl8KGO5^N*q@7VI; zlFznDrRoW9>uxQncA#1L0Zq@}?)~-Q02jDN-s)}DtD2kWMf-oz(F<(kxu04Tl>OD+ zXwd*(D3N5Lj@dyI?pV^*gwxdovte@xP2l#Atj)J;(F!sZCyrNLHMyz})$4h=s*8m} zk&&W5f~2?}R_9O{C@lUoQDUBC2royJ-KNYy|Mu`EL&|aYo?76HyJ=xQ+7ya0_)`}H z21nlK@?Z{}!$WhBH*2rh)eS{v&SP6JZ4%<5ODT|Sl-`axGy?t*^5xqxl~f+7D7^mTFRUu|%LVM}cXE5@X@^ z5hRJZse^gM^KUQW;T=MUb{x_CAPFF&NVh(CTYYdnz3$zMCW{g2y2@DDnmB{*FAkfP zW!a{*iS0UFVzB~R`Z8Uw(gcTpq zbQqPa9mJ0_zBAC~Vl|a&l0+U#a@#`MXQ|1r2aX?xgTUs|0EFX*YgFk^3aRu$Dz*AX zvkh}8%N}!YOgvq;jiLgdWbQJlQM2cAS#ko2k)72yn7g=RM$ysiv=ZW*oaUN1$0g*V zv{CUGRJiAG4k1 z=gg|B)Hy}BGub!Qd1kUOGyk2A0wlLYYF}P*L?B-;nNq@8;i?RVN3cSoPry&KI2&1-YA8vtPz#j57CZQDc@o z?>DCKq%(5j>M8?4T`iAl*ND&DKUQ}?)s@I>Fw;~*F!7D(bD;?1b)`qTWEsQl$+R!P zOpG-{*hV=vmZVos+l7cgxRxmv2S^4X(yRrHcmD@LU z|gW%sxZQdnC+1u?hQB+i^u=vA>CLzT5;4#l&bI0v8m%F9uSbZ@TS%X3y=6Xxc< zg4wO_7tQXslc;>%y|*nrqkyYN03ej?=d9gWneQ}k_j71=bkt|Fqm`dK4W9`t+ZB+f z>eJNUUWn$^S@cu&^MtuBg?NRP+pZfKU8AC6Btb&^9b$`M`hzKAx?tL={F4eew^mq{ zSrVD3ChKMh$~wWce@3z2m;M-G(=S^bb3Li)J^-+(I>&GrmEb&E0}WM{wDC~Vc3!-7 z#YoXgyN|aZ@^MA7Y51Mz%uJW+j2PeXvm3PuHQ*K=&5u)t_xhozz)orXxG4Ynf@tMu z&aK++q!88PZAUG4MDLKpVk9p)Aj)bbT)ES^bz!$8zw4gl5VK1ald1Oe(v)PbLQ?)2 zUc6#Qf488cpMKq|3*z}#+XlXChUqa@X8_x2sMU@9Z-VlsgDTzbtOardcOJ~ItQWE1wH zyHL!o+FfEep?g<^H!~AHf*cEK8?`n`n?yLw*VlO3IPmw&rW6BE!0eoTvX99lQR~5V8(evZkKV zAPaHCB=wBQD8z~D^g(OSB-B2R%xh01M1gDl0;NmH%(x_T_B(j}`GL2RGTVnK-61wz zo1YGWjC9vz&fZ13sa~zpNf)v90Gn>9pYCIm?uN|S`$%`4H&f|0ki@Xec0m;6xY^I~ zW%nF6c}FUT2JzaVw&Wv77i}78Qr*a^4MzPQFWz2MI33?#JItnfqQN5QUX$*JnX@_j zHR&pEyAs8NDu3uF(qWIx3=8D=-riG6G%83m(N9#B$M&trREf_4#1R{ z^Id4#ilsbgnn?n$V6D%I%}OFFPajy`ZBUuk246Rff~GMfhU&0`OMcBeW1(4K^tb$d z=B3}F3LP0*Mw-;kLqmxH3_|p_?i=mD>EdOnCe1S;U5;m_j_kDgVpYq<&=!wg!6!B- z9JX`%8Ntsl)_2(N4;iQa&!h_o)2ZL0H|vq#tLX1DqTh6j9IZ$g(Vy4s%BJf_*YZgN zO2;6AN?&jq@!~YJ@>|ikL*e=#^P9>JcN)?Js{MvCAsER*G^BQU_pn-& zPC|`(hj6O%`~?>=I>PnLPczQRoV^z+I!?*g!BxE<9dCOy^}KDV56;*YR0*||r+@JZ zvuDgfdJ3&S7oZVEk7=TCoSyjrx77+@K@hJowI}+-Yi=%%=XZ7tY67>RvWcP8j^62s z+_}{m&%ZeY{Eb96_D(OHNj5jXwX>*kQn>EM_#ou8z-pl zuZ@%P!X3Sw)%lH+Fln=QFQwY@jj?4s)s`oD`Ix#&?T_7bxHq_|8y80jXwrKJ6N_5O z^=`=<`w+O8I2G5 za{_5`%vt@wC2AZBp>j~5&WSaSbXJ?P8l&Nq2^0d?3O;cui^@vhrOr!ULMDto?AXia z#CY}SNIHuC(+Dllln|S4eAtw4;$j?lNY}3FibyY8+3ls#E(GvLgt78mLXL<26^k-&rEtAzM?`*VUbZh%jc-T>9r{M`Dwz7J( z;?etQkF!vRa}n2<^AdAkN2{^mj4uCc!DwHpwAUSpU!8C?`%)FBHybAgf^k*0HQT7~ z(d;_1-@*Y8gTV@$=^MCn%lUJo0CvQ0r*Tw9A&ZMuFVwD>>;{UeG+@p9W7J*O{)0X+ zmn)A=R*8(C{FAR2PMpeXcDfiyV>KzD?Hn5V*9O#mj;I?8qmUOr#-gEwv=U=iQk4eb ztmi@{s{0w$-DWR@s(3;oMxsw3;35KT_P+a>l@?!RQ23x$Ji1Bg2Bg-Cse#!&NVoEl z?KJ#^RCqxrI#$`~)W6VM1L=Syn!}kNS7&Zhd#f`>Uhf#0>KvB*cGNf_;?pww=?)(5 zBEd1y-8`|ZC|cPXbH;Dd8O`I|yGx0Wx-4!MjUnW$F320-STHD>4P_VUQ+BB`MpLcX zf|e^e5I({O}+xzD_e;01Y4<4p42 zvDChTFob#l*7KSWd?I84!CqFWvCAe8RQ0Ml;WyjAfD^I^m}0bzhQfA*!cIda?-eWm zY%2M>`L@}6{S-BCv$vP0ri9@(-Y1&AbctfGfjV}XOGOG;O_+21KH(Oa(%v>vn;{Jn zhP;yDo!MrGkoLOSHVI*1(hNx%!r+Gy&kHPZ}4tQhQ5Gxq0@jly$9`*zS zuNg|IHKL+C=hlrB;jDggnF?6FMnZS`QGM#x6({Fb@1{q(dPA9_O%nFH_X(4-?UU3r zz6;dCYIkP`8aV?dOEJx|5KT3<5>q*H!TrV?n+qZaPf?b3v3_mQ>>pG6=(}%Gn2(&a z@dc+fRD{S>_S;VV00L%=w$EVdV04k=FfeFGSE_TU({K;Kq}Gb$`Svd9E6hzAPQx37 ztF0P3T3f+K?LtGqE9gq6ekm^&d)@GG6p*Z-Ja|$DpYOyigiCcmz08Yy6S*Fe%_;PJ?)@J0X6Abw!z<9K9v0zUkXU2S<1EFGyN|*4W~6d64Xu?YH|Czq%D3kGVHi?VC0ckJ7WW_ymU^kQAq=6(7O1M)$^{B;ZS7dP0p{mZoNJDIcp4t_589vcP3?+XV$^8Q6S1CYVsq#FfM zaUl@ZDdn?D>6h5#msrHt%nV!Nq;l^cqfray`CjqZc6ib zNldJGbcdefpi}l;`(Hb7Tru+QO})pJ@K`XExB=Iej4L^e%e6<2E9P<2;I=wtrLksz z>oLMT=;2aoxAbtCV5(DVo;n;TwGa>5eM}BSQO=}OmGaw4nO4f@N!g>!4t0#7F;nJ6 zN_nYL-b+fqqwNT9*D_Y@IKoQKMrr8!Onu6ruCd`APwy(_Hxy|(JNE++DO5>IppQqt z8pt7&C4wbm*dK^dCo7|wTRsKZE3bz-Gc#_U$f6w()etvB8k+bNz+nONnHm@{cdJpb-7v;bv|_tV$IAz%JWo)kO!7vg)d@GmqsTfrrHNN}U2 zVS|=O6w4rHvv{b*Mp~UIVR-RFimO68F9O`q)XZ;3ZzsS$+=%PN)!2vI znr;6hL=+{>!Aj#a{EAn9@CM6bWcFZLtfOkq5)CpIJi-xapQ`1NI6YYUCQgF7B~p9i z_kM1C=#2^@PEZ6(-u7RrTRe7B4iW^~2?Qy*6(#Ny01iE_;jpQu_b3d-XV-GlEFPm} z^`>2{Afv3GM*s}V$f|tX+Ks)3wJn@UoaWO1-xiY9E(?$Smyw$v?Y4}(nznjs{OiP~ zf@LJ@#x}DyqNOb6R?ii%I5gXD?HCo&T+EeHG=H*PJN_WSpp)0^ZfnO64xwo9rXK6L zZoE6{Jl$({I-I+_(%f1p?^tw7uvVm!Ktpd}%A8jSFu66Ohe#9iSB2^S&1!LCi&5pFY3x%dMyT(-ugV8%3h{CR-ZG( zTl}7UWjADRIUtwz52WS)Q2XOuCDb-)EMV7(g51CGnC$($$2Hw_3C*W`rKDy>G^A&h z!J)zryX0pBQ}$J|P2(F@&#J+QX&_xt=n!(L4_b3kL`~YvLc3N)@pw}u8j-Cfn&n8n z9Hz0OiFEth(Y1hYd|^id9>LB`57imYk*1NzYkRCaTWE`lU%`rYyDL`^s&aSYugx$E zz3Lx354AkJ=Uxg}?U|_?j}0XwKa)1J19^d=`31PZVT@#SzBr#l#V(;vO4d;f9 zO+&vY?VI*Cv;ryHt8-{t1fHaA@knlc>Y7c@YWHWVKj!|kvNPuHg$sMt`TNH1l37p{ zmMP+3vZiKy%(D_%ocf}C5f$MT&wY8S+ZJ^($J*?rkp$QSYmXvx_?WI(B_c>5G6$^8 zY?3)kzD643eWlSPeoRncDk9#Ns3f4loWLx~vb3u^ElWEri1?NwU}*>7893(dggZ9M zmb7C?PlmP&#NCnuMGP%Dw_?=}m0bz%Z6q)}c>;<%8bJ%7#NomzC561VxZu*=8R+k% z8b^QUEWMBR14S)K+UiuI5+nPMsH%C^=Z0J2`MU##*fDB?`2A1}Nub9n;^=j@;w<+Z=PTh(_A(E5Blby#_II%bKEpDhlrdeZmdXQ z;10u0BbJ+%Tpf^XmnQE1k+MM8oNfORnJ3C>>J9H#FH80I6BSpT{)x($=b+==J5^&B zCk?c2BDx$0o&TFy_;)6q4_W&6Du?{N{CG$(SWouQwf!WgYl|`1)e%P7)}X?qY%_sE zsnzl`ii@Rxr(S~eqv^%nxhX^xORp41^+}F#QJrpD)fEB2vGl5yT@j=gNA=G78^p#K zMSEW>0Nm}I;9f83&o~|4^ z4T}vvniRg_Ck7ua3V+{*Hz|CX4R2HUd>h`baFq@3Pt$-b)r zyr}^)39*mu_Mrw4sRr=aX&;_h;Cc$Exz`&pcb`NUltXv6K+5`qVCAiI&Fvm|Y$eU~vY%>upi3G*Z&3!!1 zel)E?F*Spa^K&1I?MKr_KB7fl+L-(J>B9!{oqn-gFtD`N|5)n%(S9^&VeT}up`pY7loI4I#y-mJBVr%Z>|>^V%(9O; z_A%E!=G%usc)G69zQuW@>kR*}=2 z!ZqOP)<0*}oQ^7*Z;nyT->n&lG3A>5tkW+uBeQU9Ai|pGby(MlY)lL(- zR+^y_dzNz9!R8d`ELqwsmMd$CO0 zz-4gnk4Z(V)Bu{J#`%fmiW8Bs#C!Y@W$HAUQUVzJEUa>;NgAK&{q3%QXQNFz5|?V} zeNXD0-udfLvt9Gu{-M^+{OTGnic6h?>V>%->cUF@T*yjLTqLc=Ou5>LKUG}nZ9Sr?(Y#Q)}e_9%oDRs*PL*eBhuH(p^NC` z39*M=FRIuKaLZ#lnG&s9^nL({N>0vwIZ#I6FiC?;jhxTkA#ObGX z@*8x~(jDg0B1>_mTA{wwo-%Tm3Y=;d5QS)%eJtN>`iN^CjQy}zd8hhFhbp`G(OIo7EXPg`YZL) z7H=IL-EkP2g^nZjV?qZjG+aM}^)rAUbK``uw^cQNxkDZKviCYqYjsN(&(fV5C&b;2 z<%i%HY7eL~j-gtz>ub4G=40dHsE$Qi_7?B=kBQ}O@g`Ea95`ht$Ef#&TNh8#tl)A55><^aj$6WN?>qMdTA6&(JSs;Q)r$lCkoN8z^qU{R% zo;Z|IYe{Rf4iWhbrYZ-qoeqNd6LRt0?3vxdyl?mKx}Nr>h_4xZ{yu{*x2{%oxw}_} zo%&NDqLplz>ekED8XW`+CCr7Ay?a50nE@UHKic#IzP3xz>8*O!*9JHZ9%)mz9E*lf z3<@UEe~!|Yka5isieXx?PG`Ii@LRGm6y6vKhc-s?20N>lrm4wXWd!?bjANs3#DKT|w9#j&mjh z0!t&bG3|0w%|gU(XbL#9p}Ez&?CW9O01hxT4xDW9w$_RI@DXE=D(Zk$a@E~nj5l@8rLLBgDPwIqJlWf=RUZY(auxXUZ3#)e zmV5j$BWF_AQg*bdmTP|2tVD+J@8>ip*g40?2}T;v>BzBoR?&B9HGaua8_6qZDpS=| z#-rXm9uy?rlkC!476U_(qelt}1Q<%PAep^v+1mN%(2fmYdegfMDa>EzVRpTfB12Yj zKH_rKZ`8khC?d1};lazgKDdn#7^6y#3VPS7A8iKiJe9<6;-C0Z+$o4(m5YDl)9&%x z{djqC`OA2`xRjsKy*M?=7PqafD?ZiK(goMkj4Y`emdZ56DrK4tlK-k3qilqCIpYGK z3$wQNkjne=Zod!T^iC-6!k63F9qOY5^{sdy@*8U$ zc<1ml#QVnrF{t}$DR64~DTB8hRsw7d@#^-7lyR0J8Kd%LT=BMU@wEgI3hG@r1o$G9#u^-{>pHt*9xgp%`{w4KA9+$g) zQJCnP`XWD3nEIku@)Z1=gn->!`#Ym9(**_RanvF3G50!%5%)WyKWVP)rK1Dw*U;6` z?90*A-V2;Xm#g11!=_F7G+R}(fqTvJ7O!EecJZyHJmUE;X5V%nTuCAA6^1|-)e?4> z3wiBF?H`j~Y2uyk@j`n0ULn*T4sl1c|I@w+Y%{asUJAwS%o3;Jb@L@Y6S{Kh*Yo0) z-XnEl#94xASg75S@~&i=nlyzb(c0@cC=qR%09egxtYzqRg{Gy8OnF9`i2N)`yF6E&TVtv&wa?&Gj_7qD_ThqWwc-$P+YUjBUmYl6N&@O#3CG zc(UJOvp1UT$xh9xO%T#H3511ns=665p2J_rVyA1jT^UrPepSa%XtQ#pmJ~4Fmvbw!M;ETH(jJWGGe|~7)-Yn7A z8DZ;bTj5h+BieKZncEwU8POJR*#jzmk*$wKaz8!_L@q}ZUT!0Yv={9&Nw4^IHa=}i zim0U1RZ{xt7KODgi=}^|jgNL6L#D$FgG%?Z8)50E_1gZB{j`H{oKG?-rUbpVFSMU_ z+E4DHP68b_f)NvAX4uSpf&8>0sLLdnE{W~uR|V(14$|vgdJU0C2Yt4Bzo=mRZ|^YY z{HAc=hw$OcHdQoX`cv%EY*o4|B~f)GK)w~8bBedLtW>+ zm~rC59Nw@x3KN%eGfN_(pF>i6PT<&E`e{wRftso-ac;cNjsH&{%m1g3Y1raI4c78&Iw>y#L7E0;6PgqvCz67C&!b9q+hzY@*9 z6HhHDVU^NoNcSu|2^edhQMa2(V8JzN9)lqO#Dbx1*;8;6?H$}V;PMH~)9~eJ$o$B6 zVIJvkm3(F1<^~_tw}5JTVPqq{FnK9#e5W@q`*}{~*M&>?Y~ru{~0s!qGh!Q@x=u$neBnu(6tpKPM3 z&M}F@a|rfqnJX!i?u<6cz_+~;U(LQVH6Zi#gvw2G6^h$XHG3Ttn0wjY{bgJ3r7j)NI~mG@PG8?6ddycx=Lkv4 znh8KPmA@JMUB=%J_`8w62l;E{Z#91}^9TO={J;Fm&m}GhLWO<$^y*#IL%Lu+IR{Gf z9$`_#j)b#%5T}2+u#U}>x)(z%S))cj)%uQ(1Izaa{;MwI7UDBeTtc2m9w>0-Jp@BV zyG)fA) z;NNfx1r`31n+stJ^FNBN9fXc1xJh;IupH(FPo0x7`Y6IHSAX8o*)u4 zmzewSXzKk)vTtNpTd`ArA?3tfkG-Ps>XboyH*$bG*^LbsMq5vR%+# zgwrFXPMjOB7@3$Fcl&sYfBr>w++CEKJRMjC)L8DZxm93s36E2sq5yn?3b3&)@SE|q zrxk@0{j#lYYgJ{-yqz82F|vLK{udfV5S(sMow#%>F`!Y!(W>HZz9lQZqKX9fe&>ph znDX_2F30>10M}Uf1b8->bTg**)EeO##2sW{X)xcc4i+r;Qe>*Blm|&H z`i#$q9EzO!R}Az9O-}vuym%vlA1P*b+^@sE&9-ndEhHV7oFYt)e>lKoQS`Uj=lit){=MYTjseWQC%)&MT*PGTvd!{QVgmK58Rm%jZDOWXuY8a= z4#ui>jD7XY^3i>heKO<2XO&Gm>Ba@33R(9PdR3>PE8V zv_{)zCGC$AlFmS*K+7Nm%JbwQaf|nGskqhrZ<)&(pW`zG>D2$uq|4Ous9huNDj0sq z#Mx32w35^1tZ$3=+7VKq8b;X}$GldRcAVCu`VLMub%Unkke;u&JF;IpIA26T!5+6b zW_EqRRxhHS%I(hLr#OVdr6|?p5ocvah{y$0^kQT8X<<5pv>ksT)qY>Q%}M^Y23Lk+ z{ur%0Rp(wXi(A1X>c%-8<21kB=i2@o^M)aR=WQGxK4AT>*1m}W8}st5?JrRU0j8T(+(D>kEU!rYP zBYKk2MRAM!g(Z+@G)gO9V2RtM&N6CQx9%iXXh>as66svR$ot$r617hm>qQxl1CZ zTD-o^(J{%yV>mm^mkq7ao~PDGFBD2Rb{&4v`nG5c4Eh4EsoQo^Jaxku3~c>w;{2bP z+}moU6;}yXZtCjLz}_r&i?6Y+t0k2d@J-4RN?ep`Do`MKZs4+|%A2&p-)KyZ^IP0D zAzlDpZ9Sx>1cQleZ8w#Bwsr?483@1w7H_68f#sVIzv~0AOeDoLQdC#22|ebHKQ=kA zsWy}siq>_GX#ui)m|WndJ=dV_`iTw#BOKvaPxVySNf_kV3zPwXQE8gW9gX% zJ+0L_Q6kaG>->#)#{w9oPT2^#-s>~9H+Nqx;b>~q9v?V2UeFd17m04l`|m&4(QxL?-I26AstfEt$PT-@{;ToSW)z^dm2%Lq zp{>@V8ET2Z3J{~cF~}LKR8c>``=qS2{s72MI5wJ@KEk+pz@%iepCvox*bdIIm>O)^ zLIMV*{(3sM6JwS^-P>pVYhHJgX%E8-LMv_Wjk?26WWQfvzjL3G^}qQ(9d8o^KDvG-KXyAq3VpIr^<@t(2-`_ef`v&V;dcIO7B@%Uan8nz_~A z2(tXbE(wek-})vI6^l1!D~E?TZ+PCOlUlv zUU-xZ7Q2N<5aI@H=jp;j3C&KAKe*`-f%;NJ?y2lb>604_3Dm8TskY|3D%UeMWw=kp z$VWcZ4X@*rvrw8u)h^GBOv{&EvOb=foF}8BIaQUL=2=H3{s-4?IAFjrSJqQ_kpT1VkerNRydd*ccDeK$<2^&jk4<0cqn{?P;|(C)QYE zN~NeQE;~`Abrsk+&6dWEA)7#wN;IFnH-DnNa}vh$H=7uI+w1JFQ{PH!bifoV!WT4g zZuNF^$b#`{w%V3c3fj~q3ABWZH0p3=G7E#Jc-f|^vMuq{?gFRrR>iA1rkIT(1|%=o zzgSp!nPr;R*##GD1jt%E)=wxBb;L^mLQW`P(fAo5IQYKVa(f0Jnq z%K26Lpnh9LgKSr!aAW!URlQaBg%obi(l_|k&9z&3#%tJL*bpyUkM&8MYl)pkZIK1t zi4#p)1W8dfYlHn8M1wPv!~fA&jmR5o$KdX`JMZ6t+YP;l_lqO z|J`maRX5m{_L_eRtt_^!yuOSUeo0SVceGmbciWorw8rciH)}D^F2fk_jrX<7(0(Y~ zvs)8!9cY_qic=HK5c-cc>T_*tUbjXLQvJc$=|YAQ2B~^_?$0Im=A!nkb{|yI>M%Dq zT8R|0#+Iu@ego%w?Z_r_FzwtbL$p}McTY=x4FWdHLv&1osw-9~oG5ZvmGkVl37naT z8kk(TX-e=5_sezacYILl zl|uHiE?3w8hA9r{6;+jfO0}aF7~X+o_*u8QdzrfD8}zE%$~LAt;RE;dq_9!;`^K*r zDiLnCu$>binFTeAGjr}ZUh`M(EV59o_ey}sCiNLtN1-kEZp{Mjx-Or@*4a#;uKJm2 zBg0u^dGxitA&))XxHBUF)fqJ2ldW35Rq|iIuwpbMRd~tOOlJY`@ieU|JXcX>_o47? z8)ROaN{GD&=Cw(LW~ZY}QYsGrn#ifX?Thz1*88Lgy}{}_+UTk{@Hu` z03+s3kb9fl`9VJk8ogKfEC#;Gi+{Nn0n1skRkUJ@$Rv8@W!HNTkfw6`O)nBFp;0o_ zu(7Xtr~ErOk=z$N>Ar)B?uQo5bZ@k5gL=5P)3|^y-3FNL3H<+^Y;ZAdCqvb=%2}%8 zkg1kJ=|3$miDs%#wv%0Vq+=&(tJ$cztlI=ZB1?dESm;1_9@MMf)Yk&VlQD zFOkM3w^z7=j*2~dv(fDH?xw~G;nv+njj%pbs<(`^oO!?L8Pnewd+RH536;ef=j=zJ zoRVC?nOciCTolgn!n-uk=uO$BDicJ74uL?9s5Ytt>=%m$ec83B7VH$5$viQ5V~9yl zB;ijE9mN4sf*3~LTy<8eX%+cGiE1Kh38b2eq3BQ&C5KPv48pgF*%;>VpRJYCD*pu@ z%HxYBTyOgX8lb83Niz481wP_abqxmURb?GjWgo{=dkf~@Xv*{_`&|15+K&8RP4>b)T2|MCRdHexRs*NS^!di;(gW+1=)ocX6PoyCi)QNG?torrWX?a?vVWnuDg+rReuc`Da-H;<8Ccb$SsQihjQMBTVg`O?N08QZM3WsZ zMkpEq3!sBDR|G7A3*JC=6XQ;;%|-Cx`gqZdayR0@Y*qnR*C6XDM`c5kJ#< z@pF!T&OL^o=?(mxm(S1ndHh_UpBa7lnW-EXD#tgK_#*vWtQ?mp$G4Q@QYD_HpUV#5 z=W^w!QI2mb@ptqyTRFa~9CMW83MKxYey$wuEbfp-itWBQG&DLcgM>+cmQsx8dpt2k zn8d^+hhDy607h92o>$a%v6RS#M6w-&B=}?$b&n^$$|;@}*h6 zX=x(o{M?p8in;qIm%#xv2wtGMp&>T0(SyWiUn{gjDeYUPh+rU!?(1CN~#US{cK z$m|%Kv$H2w{%DR~3tT3QgI-PjDckUBl8ue%;Hj0j&efLzyd22Od|ncT2eqWOBSIwy zR#~0d##(JYgfUmoLPq1=pUPES21lp zX)&nPt#R|3b7WIa!@OZv_>&F37K{=@hrCzt1#d7@Yd)DcHaj(cCpOyZ%G5)m$Sc`=df!5SfR9SDSDcdFgcffHacD6@80>5?_jhvqN%EJR zpatAlUNB0$-%k$KikGV(VdX*sZ7I!R{2ywUk^;;WCQqpIv7&9z)H7OFV1-l`WaEGx z*|rnQ|DpDI{LZf2?KJGRh^gh_3zSa7`FsS#xjd%2w@K=xTdiw0fy^cgjrf{#XiVrI zdO|(lo+hocdR?X(Ap#AX#}D3d>uD64Cp2~TFnH#U(W(e4Fhmi9GD@m5cC!xZfGWfi zE;VIY7pe5kVKwTT%URreOD5A>>C`MBG6L(#q=e1b0_3LFmX41l+*$D9ezOe-<`o}n zG~NWd_+iJ~*_B@;4_A|>x-Z#|@HR({Yw!9$ViOfzOZlOWD)8$hM=`Qe?cu~=RK`xj z-}sPnH4yVVj<$htM+pfBCJ*dc;ESi30voskp5=md8WD`Wh4m)VZXs4x?n+*Z2YO0o zCYD^s=>n>%B?N_ObckjV=`CTW?9rg)8QzR*_9NILrQI*tY0N$`K2+ba#G7W3@B-!z8Q-kuttGk)UDI*v<(-eQG| z^`!S&Z!HF$CDSO=Uc>eZF}or|cd!i_84;1=p{*==A0w6}@1NU`B4OR>+Fx}RTWf|T z5)CaI*dW5fj%t=jZ3i%~AszRJ#6@olZMv4Exu^Xdz9MlwLsF}T8cD%OT*rCS{_wf{ ztND8>IWyyUn-Ne|;6`A_q*lfN5J;OoaNyU7`@s%{0(`B#bsp zvOS(&XtT8>4+2i56Vi8D5X(s~Wt030#=b?%){LY$e7Sl@{sU9g)cU-tR7-)@N)xh3 z0aZ|Uv~kM5Bs_vuS9Ca%>hHT$s6T_NGI(#iY7uYt zZ8>8W0uMQKn<6Z_{a{{Ru324zjZcNa{!#s9rhS=d?=m5a5k{Ldb`ZD3v}8P#=#T8S zj4!f|Wf@pEQ@up|;a%~G1K7)7P8x}JWAJDdV>v#?-In?woH$WG!&6^`A*<9j(&(Sr zv0#HL=Yf9lea2^>-L^7QC(P5kj@Y0LJ+`yVeq?YpNy{wLhOuwi-EIhTw^M%ywfIdk zEVN$l70b5+K;lO4qm#8)W)ArbO+TneT(pQBv|i>=BdQ0@9}KN(E;sZQ6YjDd#ATN$ zIqg3T8Ix_YPFAoL;!(qB>jCfARf$Te0EZRwG=gyY&B4y)h;Cu9xA^xb;o^W!E z!Bl2Cm2dSH-D{E11&8_SqhqW0UA{Mw8@O_icJ-&B*WX@h={2=R6s3LyoQS&Ar_*AHmRKUDQhxch^L5sFWh~&(DG0f(ZBxl!i3igDR2(gzsxeoSC23F$m{}CPMVER(MbSGn|O( z=U@c5WECbe915h0Z9x@gY^&QNxv?>KxoRR=&R)cRR~C(uX?$<8FC>D1u_)c3Jxx?zKnR+F5AmUdQkA|a?jJ^h&f79otao%trT(HPq>*Kfl|prCDH6_OlOV1 zAc<4|FLLQ}m78Ok+2M}sV&L|4`!HqoZ<}ONza@Pomt*ENwAK4Mf}IN`#%z5-)N8UU2KT>XeyW(t!4Y zUK?y%S9sT6<4ROFVaLk6peEW>Rr442%Dms6qDt-{7`4h_%!TC7it0-!hU%y zzg?a?E{g~grd>L0;neG_V6~RizE*2njC02&-tOCIYK`n{rJ=Do^55{*-6t*jg6~0c zHZlzV^7`Mo7f*MD#L>&;tQo&<-s+bDm90yhbl=EXWbUnGI|D~_Ewl%J`c6DECC-vS z&ehJYH5YWIZ;Vx?4~aN;Zp@sCzc}xtmp{)ok(y!_8{*R%{EP;(1{d-DH;Ks|M2}?# zygai%*P|hiR}5`U4A5R4uFL2Bi-ED;jkOl!mhb+3sgHcqki4_{mDC4$i8C}4ouHpl z`WeQYlwiYz0aJ?82<$!XKA$!zupkKh{X9SBr64et06aICKV!Crn2Y!QdqPkN8m;bo zHG>sZw_B!2&SGPQi?v{psgwy#RG3;OY@{d5=WiCT+j*_3X<_N%ELmzkVY{Op`*?L` zR<`Pu4|R&1ZkZRZ%A%{iNq62xSd$o`{QybseUaRg6`30fI{F))(@|*Td+sB;rGGqi zT1O~(u(SHCthZfCBDmkcc)Fk?E`Efv9vE0wSEW7-Cm)jnIWEq_AeI3UC-QI~@QeV) z?7%CX4sv|>Q#Z~JB?o)MOw@$=UVj^)uxHdDCEtCnNv>DRt(a+Za*0Oc2;B-3;j{Pg zOrKSK;;WspS{(x>tKGYn^Bw#D3&Z?G^Z2P~eYdD8b47l??OKx`?WRYQ5Rr2Q30(}! zMZ=c+ur$Y(%UFo80@DJzVJ(S-TO7(<#coLE${~!f+6y$ohGL7N;g!c-r1GV@zO}t* zqc$;K*WPF*o{t}w#+iBE?3=@($(ia=`I#Axck&;0WivB|8;?29%Um<|D;;~p;&ZGI zyMR0jF<9V5-PiHRJY0K80gUHik9h#AG&yg1Ri0Od;G{r$eRiJ#v*E29CRl5xxe#gu z8_e~oY+mx~sXc>rG3He0U}D(4tC5jpuE(r=F*$^7{I-QUbg6&oh582FAwlGd5Iy^t zPs}iwM>#_>1S$CwIT3`)pU5#hd-xMM2NW^E&pluGGX6vkCW$v|e$JoB4yv^NM5HYP zw|AJd-y`Gx{zUGr{D1Q&^5UzIQ_i2rv%LL>KasXy`p6&uzx5~5(~rm^NI@gvKmCZz zw3xW=JYk~CkH};jeTIoPencukkXcT7ecJ*7NPa}R>&yJBk=oDq2f;CHz`%j6rZc@n zQ*GNqqxXQ(<1-N@SLzY<7fM_$TO(EO_NtoQc#G5;JLbMkNMknUwk9~jfbAdhEtB#V z?*Key`JbR9R8#wPs%~^|OQ(_`m1Xe% z-C1%I`J6**X_Z*g#iPZOVxz^B`j1u{Qvb}aNSHL8ErHh?l5hVF3eMT7 zJ^h`AM}P?hJT~@skkDCui6~@ac9XjYyLAoqUHa0#}S} z2l0b;k20xnKyoe)6Ce*$g5gxp6BH8Rm=g`F()LqSYa_#)*?$sNV`+bARI<{zjVu%E zpXb;-0l)6C_+?PtNuqLq&a<@^;$?;M0(#u6_U1PBwyP$mUN;HMj#Yl@+&b0*g!$iw z*%R|WO`9o-rLxm-14)DaHca(h%T!Ij)9Fh)DFjBmWDP}P@)HvY6gZ3DCOX$dv0>k3 zy19TZTGo=k-EE!ClQMUbz41xXBRa?NQoKTFU|pssb7#Kiees4?dUk~*87N+9Q!(!K zmU?c78pKiECqL!ne0rf?&4^dGLKEhlh0Wogm}Oi2(L|dWg_@U6WhVA#kYkDepBmfH zPv!X_s?p`D$X()@`d+|uMrPPqNHg9&p8<#8gqXXYYvpH1Ve}DhKU0Q@NH52O4F+=CjliNfP-%u8!~7h;T0A!r7I7 zOO`?hwG^J)O1ZClO}U-ej$^52pwsX>zV;;fUma$53;xh8pXimIGD5?b#G5s2*Q9ME z2P-vb{%(JPyJmAxt<#76nM65r#izY%e% zuCr7D@pNei=G2xOuqI4KQqRetIg~iXX?{e~-r#x1H6PCtL40kzOVc)*!b(Xeh1-Mh zZ13J@yKPSB;1?@(L_L-fGg)-o<6OQnk;ne$J-Yl&oy&G5XNr}1?%0;98n4=YC!RU& zm@4tEU0g&5koRrqil4sOB27vWdT)Agnk+3Dj z&^T>-CVCrBGRXn*Es(jXcNpuUYyZN_Z1|k>^d@KZq;R|+8j z^0n)KXLspeyY|9(W_&@sa{cwwWKGv)PpFN1XLVng=Xfi}inW-Hdp47`Zx8>3VmDRi zzgS(l`TD`LQ@ckcjzTUjsB&MSyz8E`Yp7{j6wlP6U>2AR+|;O}2DL3z>-pagSK>|n5all#<%3dQ7|&hen{vvOHl;Lyu~5g7ZbhmfL$9{a zOn>=Tb+4-O7Y<*bxI;gh9AIG`1BB?dt026O@Ds&>-OPac?7yJvSC&O9>R;J3X=EsI z03I9Scnh2NQIAX$-TGHv;ybFrY+{w$oAfVq`suOB*qy&$`lws~!k2tk@;VF>V~v<_ ze3j!spX7XcGyZTQG|lUX`;CZBtFDQD8}o)))%lSk`PO~Y`}lqqcAco{hDaq!xpV`| zGTO&lDz)zb?hbY*OpDh{Ctq7Ue_D~$r0EWbZ~82@LeJ}V^~YFu%D1cCDbu)1Z7K#8 z`7g$6UO@-E0vP;tx$exvnxVuUvPPZBLc&bZ`&S#j@!JN7vNzJxXPJ*6&;X<+s(o19 zBt~O$V_g3=l~9&fXj?heeRHC_gO*jC6L%Vpr5cQLaHDHX?xcpJeRF9}d6`&MwfjxzV*Jbw%v~F8#D$TV8)aEMK|L{)jC6tD89-nzlD8TPBeT&9h+jvjJ3DPw3dI}K_jac~-K}TMvK$(kmTKB0 zdQ2YGyqHID-Pi3gHV@7HT?18AK1sX>SAU-ExXE6sM^bQQiKM1UFh(o)B#sDfiu*R% zl}`q8nHk@-H^q(fE>Q`max8IXJhM#Amf^?tpGp!+OkB%~UeiyxpLdwadtv76x6y80 z?j1(n?w3tJbc?1^qg`7rZ~Ai<7sHMIX2c|6ty< zcZE=B^5uz{^TPR3_PpwKlo_8%N6-(&G}P`N_iiqwV)f^_YWLm0H7ci$39f?*2*rLp zoqt=yo>543H01|5W~y>`{DAeKSEB-PHLb73es%-^xC_OI(Loap|&qnE#^aj%)y zj6MzO-Qw*%#Iru%rYQLr6t(V#bSyR-`$}XL23gkn7!C-@ z#-q)SG|q>Z>}$T)XzK96_-izajhKbxZ|^~9XdD;MFjDsgMXB|>8^77hT@P)x^OCO# zfis0jcJ2iXuzv35%!Gp0_Tt8G=HrdVq-va;r+rP^{QF0n?yP%$4Dk5|ISc@L*BkQj zURm3}WtcA=``Q_B35^;|T|Ui?oJ*cG!t>+7aQ|xgI3gsU81ct!T`jL;KjKb%c2Q#p z$xQDnpM_^7u1uRJ7Z1}Obt7yDmpT3s4xvy$n4Fo`w1RASQZvPcALUALdwuN}% zO&kV4E;jgc6oKAm#A4JN(p1dMbeswrm!*5>l5`OcO zGkg&%edR2vXO{uv3JP|IR6`!xlZl%1x{NIZqaJq>w_j#D-EZiGQrZ$qmvV-?{Q#hE z*fsx1)&LlKo^ED5;i|*p>cZ1=xT+;j?HS?Zfzi4zYY&6542st6ty2JGZT1dD67-Sg ztaj1{^IA?gtFO;v8PIPhFZrmS`|Yg!?P!&C-5}KyqJH`$Og$aL>-NF8Z@Dh6554S% z&T#_3Y*1z9-`%`~jG4&`y~Cc^Z~mLF`Omg5U8*(DI2ypou!+pC(=ulk#A~*B2Ont| zoV-0gNwEPtSDC6&Is|XiuQf)y7o?pBzhUWBq5_G*vGkSj@putk!Feo0A_2v?*UogC zl&Y53&B;~MO5D-Fj{zegkJ(&+DSTY072`!ZA8a`B62;9_CTQSrk z`A56d%;^YFDhWG@bBm&wVR?Bwz@mGf&?JL_vGJNIP~H?W8w!yS&P~Y%P_uPs#BYD= zPJ$i=1VN+iFfiqFbVrlX98E@ZnOGxcly~h1cV8bZJI#zxZUfWogN1Zo?`zA1%1s?C zQeKo6b&4D2F0y37*ta?&sm?^QFf(&W$2Z0;r=ya+pD6^4j?!_*g1E%Nd3oV{{^OsRKqy2zdxgVA{0r%)`@h~j!T%3_XqPufRvJu4 zT~AI;KVgaS*{Klov=4FLA6@e_L_9X@wJv8ad@I2Q`jQf2I(icrK|uX5y7Filx<`v; z<}TXDDBjDfD*U9W>~! zph0)p2ED55GSF6di9%G1$M`+j?<}4J(myO7n+;m` zMTJ`T7r%9jse{(ZUHVqJon&~? zwLvGoY`t-&TBf0`D$2JO#8?k^VStx@^9uRuOz%Pl$5LA`j`ocag^Ux*yO1%8`h|>> zgpBPgEiz2a-P{J{HvD|ZjIF+pgu3Hj?%i1KacoANDfo!+AglYYM{>Wu3@W~xkK_`1TczF))YYr47GpJ9Q) z-;-|cwvyHEYIjzV({Lx_k|s*N6yG}3?OhR0j!fMU<4R-P^(j7tzw0$Cc!m;#tp|!l zm)O0RCgM0~U(3UMh-D_1RMoY#@b1+NHHz{j8g%X=34v9a#OMN!FIKxBH}=9+f#S?5 z(51DcL7r^UBYh^ODs`J|5ZT=Lt0Q(W!Rtw4Kc;7If+pvFc^(H-H)|2f&SF3|l?b}&4ph!i#yxyDqO&v%4 zR6NSvw-5X5GxN-HYMWx-R7?#LWinUELMkzQVEl=q`cJ6Kd*|o2k_eR`1;!e`#c4K{ zonT;c=Hf&0z=8F5KWH9@&g~Imx6zOU9nr`8@%GQNuE$pLM;Xq6W!I10g&8=9oKNVX z59Y+P$WxbFrIpval5AOyYp<{T+*w`JI3;@%2k5qL%;)~cZ4zvNprPfK9OQpK$)aaC z12r>Q=(*G@^&wwKc~dj>qs12EzNv42+=2OHUQ71J$!-~7%phE?KUib_J@jUXh#eE7 z8w*B)|#Rox}vGk?0+9nxogD<^p_3q_@ zS+TG-ZWp!2d zYzJGZJCpsQF5VEh;+%_})K#;j(wHf|C-;#Vi?Yp9dq;HfRk?Thz<}+d(b()w*Q?lW za+c5CIdTjp@{^Jf1%-T*4sEM@mPnFW#?gK)l2%*&=vpGABM@Yg#6a!kV_DGsn7GX3 zTWP=!@3x!4U+-19Ui1g>%NS zMCYnaINQdu1eDv?)V>mD(H^E#R48?oVIXuCuOLfx#berAaO$N70a0Q&)od~@=anJX z7AYQMKTIPP3Sq;jWFsScT_vi{AbF(LNes~XtR#E8%7YDzlfpqM;A^t~mm4dt9JVG! z*<}VscavXbJng&jw9s~t)`q&gAwH(6E0eM0_3XLBCD<;bRjQl_bfysjL;3ZUt^F$mM(kAqmI`Ki{p zcj@^$jOzE9)Wi8-(y*Z00z4US=wkwihXb)?ceA?zE{K0Eh`kj+d@CX2xHi7uZOld1 zs`TbuX>X4CiuPZt(pH=Ht2D_G>cX+Fj(s7!%=Bu_rg+$Prcf|+_ddA98`_-Q&1ojK zSaRj3|7-cJD*sfK{|7@|K6dPs0}1tUBgJVm>%=My(i7u-6uOg&E6j&Pu9_3Ss+zHC z#%rqPwFjx@`=**e+>!qNzaXbrZHl}qLU!tpK%CLi(ezoi#aTU#VP#(fxS~ECR~r3) z;>4h*9{;))5Hq1U$ZEg7`nSM3Oa!Z2*L^E-)nPa++fO>@s(v{RYvCnl<{M} zgPghMVW*;H|A(_Pfv>W-`hQjk>x~MPx(1Dcf*L_QBiSEiwiETC^w3V z5WI;dK37oqwTfFi*SO#o!G-+4znSN`_Xeo1{{2Yq z^UO2n%$YN1&di)Sb7s883SC@Sm*&!FkU7!0bUSj25Lok&P!Ul9RF+HC&5M*ica*kX zXU$QkuZKt(>covoZ=Ji6+;)9)>`L1Y4hU-h=Al7hC#W6l?$1P(@SbqM;n~j%V9t;L zU>N}TsQXm~WN#5QNFeQiOiUIW6{~QZ4>gSXin#4k(DdP30rcymO>x(U-%_EvK*;># z4{Srs2r{=EqEd$YrDS@(vR@&F-ly!*Ap2Eh*Qay&v>L}$$0&IdsIie;Ni5JG$WJ-I?`%&bE3`?*+GyYHY{8CDICQJ zgT?e8ZpYYaPEyB`MB8XB(K|&jTB&|uSB=29ld~0=_^MC*;3qX&!ua7Z zr&T;iPV5~`j-4h(ohX)1y@N)38+p-)dMIuZHZW5LD@}|Lx9q4 z>(UINC2aqOmh2zHa2r|vZc(()CX%}RN5blq=8tNR4}DS%4$h~CyJq?sr6*51J2~-f z==p_t?f1}uv%LmBxk5F}B74SOr9whWMyU*3Hg%kvvwnIQm%QY#{K`=ugl^Eblr}wP zvIKQ@$C>86XJq%$jhdl`=Rt^3AfH29(bAbr>3Qd{tRjIQ%BcnP*x8yt&7>(teQ^0a zdlBmMCQ*&cNX6eZJ9V-2Ks6tQlj9|4k!JS)2^UbjN&QDH! zACA6bnw7683*Qt!pIqY7oIlz8O!+pcE>}XS*_ET(?glD%QrZuu%nqrY*f8fVG_!4< zMh%kMwOWV6pgvYNk2Jf%N}7-XhHZvP-WTS7W=W*BfTo@-nd6nk@je`{EQuFJye~TT zu@TfK>Ang1x>T`zxcU%#FxEQHa^QsB1+zOY6xs{N+fy-37`zU#JhjL2V8p8j!~co9 z!v71Zyf4%M%c!cUznu!oH`y*8$@dibs@NUai=27Q*Ayw|D&_pg^@vN7n71*nFZ&0h zS7@zQXx_w?ySjNutoa(o8(V9tu~@aSpWFBxppIvw7T)#3I~%;!-XFxTNzHc&vf~iS zt!}<}rwA_vpyX!GHL{vxFC*MDLgcq9j18cN&vB9%F^Q%ZAMmcDEaYta*| zPS{U`vDIFu)*UhZu`7`2dJ6k%5stG+n?}7&sMBc-LQ=p^1l@9=Z~VNNXX8_cT5AUs z%@}QdY=_~EX~tWT=FJV&OREkJ6UJiw z`rXO9c8V@Fu;xRSOEW0}EiVppv9x}WuszH#uhwOaR(^2hw*9bqvHhGDN1Nz1Z%V^l z-MkYR`+0j9AlIGiKRPvP1~b5$$8xy%B)Uv6WRO>+)vrPcN+)f+U}EUh=pP zqRDX=sV_|~1nHx<(wqNR#$+mBaqU(buUf%oThJ+8ApCcwO6{%k8iM3UePf zv1pO+WC51=vS1}9(W1AUx&vC1{7|3f1D!g*5VDdJZa|zLH}Bm7b;VG}W_(TMuzy>> zz0~QLWkap+^bRF{i>QQ_>~4MG676}*-}W!`NS>Y-8TERm`bUF1(sFjU>R+wuH>iNW zfKMkP>F4o%b)QmWi$sw5<}m2m1z0!8=UY<6x;cW40jpl-y^*>B44K$i?Zm@5l^|8) zyD|iwxm$ON)*c{=&gw={v#@^pYbe?~L($v&Sc=-RDEcF?+fy`8uuFjTDf)s{n?*M?mOz2=~ySZ*Sh;b)5CUyWWjL7;o+eQ|e`?o#a&x zl5F3$*Oy(ms16EfSOeVl%z9ZgT$-WbVbwMr^zA#EFHOyLJ~eM-Q!~!&DQd+ zZ%0i@K+Wkpq2?V?^A>xPe$$l%)MPasNAH6vhts$;-ElJ*r8Vva?bkg|b@Tli98xbZ z@(0?dV?W2lk3_cBK2MknG9};JOD$RyYN$cl%r6_#Ejm4*zZC?In}z8X{Z{l3&S0qp z%lB!~**-Ca$WgjQN1IpY!^1pq_+7Gn58I%+)y8V7Q`015G*xdm#z$0BBz3^6r7n3%i4Dh0fMHZh~j-{(P$ z>6s?xp&wh$q=oC+oe(or#54ftb7lqLR@AeEYjAhL;p&z_=9B3HaeATS04as|zB^=# znP;=I1)mYg>Hf?H8QdfpoP<1euHbZOPm1qcQ4ng}23-xWg_=i;zFVyBu!V)iS*C@TG4EGeuA?A3$8c*DcO9)UvybI6o4a5SBlu{3C}K~Fh_w8~jtVCvkF(21saf;% zO*H+7)TWBP?ZPpxI;h%m*cEE9*OR|_GN~j@u}Qbm>tTfreVIJ1fYC5C|5Vaq9w+^) z*`@agea9L8=LJ$?UYzy~Yu`|VOs7ajRsJ?RV(d&ZUj1d3WE?`a@QwpZvnH?Rq3oO- zrtGwa6ib1su@9{E=d&>a8B9q}YMH>Z;xR&TqbkM6ayz3peN=Pgt9+7{e?6?{$o0FG>Gpq0Tt3rN)vQ-B{>7=^S{{zi zjgHzFA0DXCH2_CiE>{yxxIvwCl_2*6(vDQAm<0-%TFTUT=xeP%*)j)MEJWV{T(Hjx z_TM*t(G^M7jY#zalwE87Q=&cXt#jn6)V})=@VDaJ(y~zF zDReJl|8hc!2iZ;LMR|xMj^T2LW{TR5Np*dF1|=`yqbfYJI{CL!SvMkzv5JCtEu`~V zn&Z~<-iijxF~<;Lm>^zxx_8E34=vclhmQW4cQsl7g~~KP{X(7f*7~euoYUKQjX39# z3%}f1hJ~37F=g=SV7C#2j5(4d7xltVS15|G5((~0V4~+I<$oQ?|BN8Vq4^c~nYnW? z$>W*!-(qW7<&7)hD8SOoDMs=?G>W~f#OxjYQjtN*FewaO=DR!h+S{pO>8s=^rzelY z-Fe(tGoqRPcow{((=_hJZ*uxbB&%buKxth=X0>o33eOZM_hIA;DgtY&yjRR#pYN>l zZJEkX?A%#~g_#To+YFey0?eFpGy|3BuX5_iJIPze`ES$zS6{1-&p(%T4yrc+f<@*4 z$V^u+W=?8?V0pR*v#(G0bot)0Y|z?@mCH3|nDU*HmG5fuMOqX~AhQCSCn3*OPFZn- zeiZgGUMGzHLg@7y$i$hkoMknT4L@JoL+E~L(H)&UZly^5nb19|oc|&dK1D}Zl*^bk z38VT6@j=4a&A6D)L<W>|3 zBVxoUXD5$)58BT*8?Y83qiI`B4WVl@q{KXYxy>wLr#6~!%SmXBnQ#%S1yVF&b15^g zQVQzT98)7*y4I{_SVDisi$vh<)A{UoBXbAxXwTXN<_Tx6P~-q>n_!Pn<{3qEx$IaQ z&1D0xF8UodAm2a!M+1Gc4qgboFa!-v#V`26-k=ls<9t4#+wSuwnPsrVg{k-sThBS+ z?T$$tu72b;JUr{vnbAYTZ*Jr2`b> zr>U`fqu|WhjYvr=jS@+G-Q(JWpYn|gJu~?c`tiR|{#}&+Q02do{4qQ%{VgRTv@CyX zP;--Xslt%@J7CK<75AF!r{S?-x6bfEO{ZaMv}x&t!qAf01=h5k9N!}{YDGL2kkf>? z_~fU_*-Pa7v7x&M>b}Rxgew-XOHrd{bzJcyDZ0B7WY5^$-13#g{P!|Z;jB~6kN(2~ zIE=y~Ev2AmE%SynY<473<@X5>ykF{$3|y>p0y-5g2>|b#iQs6Hq<0kqQ2xmSog-iTT2+)u0gD<6PYX z`HSz`P5w4_lfR|*pi!3d!wwSou&Buh*Or1AX<^x85UnE(=FZeuVL4M3&!yriLS0jh zYo_3}96#7*3tIKl-O)hDOQ{YOuciuQ-F1Kz1H$l+Md8X^>#WR+^IFD-Sb~u*`YBLs zU-U)7bG`7aQG;fpo)wyfTQo=#)BAk zV^8^tf4@v+R?_J{QPu`!T}syMb4C>t|BICGr1|B~Rt6tToC9-N-Y>P?+aE(5&6{z4 z*@ySwpjLb=zVSZ|HVA31GV=u6Ag#Y55B0m|N3d-|f^>T>YoRFa3B~E&mnDpt#pSPA zoOK>39Y%QrYX!3|sdT&+8@6Bo65kJ}G%#ffpH|xIdM)oq{MLi)_Z*ozeLo}_-$v_J5O=7A&TJ+(=6XbY^D#kJnt_m{6xnH$wJZEY7i z$XXy-!4#%Wv2bh5v6Jl$tA~lUdt9Ds@>qS`dYdYfjC^9Qnk@yq*8J?UFS}9)ThLQW z?7aFpvo{#*DbqRjB*Y^Q$?hQOSenH<8(he8j`on7koX7NP}?J4%y5joI?J@fnGJI0 zp~M_h@MTw`t>^8Dw|nM4T}89zE#H#w8CodPR8Sgex}=ohl6*hvtr^Q&n#?@O>?HLz zjP`pRN0r7LXe!yGQ7vzG1diKHJp70nrY4ZGXcPWXc8;)}P#eqH*Xn-4uF3+QO}|477j_qKy3r8IzZ$ zLlJc-9?GEjgb8jp5g=CDPDB8we%rge6}awG5RSkjNKiFOsH$}fU0=!hdaNrVVyLCW zG@PpViUTK69?p*~Kc{$DYku*uWYwCK!zQOvOMg~pvBnPx8_o3gQqZzeHLIEPMp{@q z1H=iH4VwR!*=3#dYe~!_hT~dOLK)ibMaEvLp4yh2MtIpwi@6s#&OEk@m>UsuU-iEfxi7u=lKQ)!_O%nx_lilopEP{K zdxa90WDDnlMV9Ux+w_C)-GMRhMw`U5ZO&giyeHTaCm>&`^T1?II4gaQZ;L7Apd_<@ ziRFbOIT*-%z6pG-CHyf*HQERk^*l!^9%w_oGBk2!iDcH}5cG*yR$q+su--iQ6Ge%f zQ)p&fgAc%=?|sp=^dR!9Ee^+1Rtt=SF4-zB!De%4N=d)5i0xwDU)hU^H~(kHZwsM7 z->%@B^e-;-sCK0^*xYMP-w*T!@72gsL>5m1jsK(Qcw2F2S&JqBX@2kBN|~8SLR2O)ABp|={465T}dt@@(Y#E!jMDQV`LKG zZaJnVkv4ci~K_t~zu-kh@wa(ge$ht#o&DE&x=jS@a>FF(t>d0<=T|E-cOjHyR^`$HR= znaM;<0%TnuPX0)ZZKGkC+c8@CbZ~sb=J7||ibwV4g!)s*;lK4yccTT8GwYeU&b)Gg z=5#?_f&sW4pefBo1N$~FDw!NB~Fp0_52m@H*g)h^=H0f zh#hJ{TMSw|_A+EWDDnnSocZbs=HkzTSM%&3>lgj}$@ZA>%D9IzzMzcq5}S~`Y53!o zAY_=|N!}`RH99rov6FpM>7yhq?xPK(Lmfwt zq&~K8LH+MHd8*DUmRrH7tSN~rf1t`2zezDux|M7*IRT1Q{8?{=T%n|LSJG>JnVa0A zfoXiQ`j7(KFc6hBv7>eDlrAk!?11}4mAh8V3Rp+@ws84DbsvXXH}9*lBHf2$Q;oN( z+FNBODgK1ToOn=f4qbt{c!06BUNu;|&VNh^nbh-chP0M3r|&d6jo@xXPOmtMcAShusZ4fZTMd^Jq7nn(TP`+dk?KQI#Qn z+cq>~*!Yck8YZ_Ktzk0CN+Yl^o$~${8GBOI*-{fSPQBR|-NL!obFjerES=Mxci) z2%eC&txy;EVKY3BFOrzmlesm_9}XxODkqz zMb9pec}0!rJtoSalJNt5n>n9WbPEv}nvGR8A& zQ-0a3`B&h@$VQK4o-{_@CYy@EdAb#@mj0^y3n&O{x$RJq|5EM0Ijf56u&%N0PDQlw4x|Z3llhQ+?8vw40?t7_E&( zb+HvG@GDZNiln6fbk6rg732{+N4SHM2)2AnX+0PS3d~y` zy;J{7E($73X;S764Oe|{#4o-fTYTM9;@0a9@ud#&!Kt|*cE^qfx%0+W<85`hE+kjS znUX>~i3yX}veOsCRySX>vMAA-o}T|KB%*2F1GxAHWJmNvL zkB|LIigA2!6v|QhBE3MAzR!Mr`f${>e|4&I6U0hYJ~Y&+O6j1Cs(dH7%|-WhpAtFQ zIdez0KZ$y}5RT#9}c`4%uAQ zxNs3gY2t@-_N>yfNsaH;9oTxE(vtoD(nIEpXes9cZ&s6Bh7XW=mMzrOJ9N0JsnJqK z`NvB)l6w*c`Az(Cv2)$A1oo;z|7#RB9UBz8gb<=YfbtShV#Tv1L|R0Q5H||(WkP%v z**K{h&X;1Yt@8SQW46|aaeX<~!a8cB`CWsSM{8MF6m#{AJfmx=YHs{6Z++seUFx^) z5@LaXlIGM@I$Nl>xlX2YfIM zIM|#kK<$MBm?yvk3V1nMe=@XQ>H|KK2HejK6W~Y(Sl|Gu?9m$ZGl1iKz$emxCFavh z0Q`!oFpa9WKmP3-Lvg;+A|}-OpT42%ig;p*eVVpwMo6BYJzLAKc@D(76fEDAzf>o$ z@hd25&7t5><+GesoA*3e17^Kk;Mlw>O~CQXaMs7rzzSNb`)j>4CVndY;Lah8Tws_*6?mvdDMgCRQuI496mv}Z9* z$14;^fiMs3E@?c>>3H4#q!Tl~#d?ZNcALt#d}TW;_R*YOkrwZ*P^0FSl5z|KOtz!| z!=WXQOoN8Mm)K7jP&v5D>9545eTSJKph~#uN@4*L{DzEJ%L~m}`{rUuJDUUE)yMRR zYStZT8a~QYldRrRwz}uo%J!Z)9xfmqb@R7w< z6Tjq`9ufLYEEiHE=)hXNoeNEFjwf?XLgCF)%ND06Qhv1qd-mO11Lb5D4k5=9wzuch z^$FO;epql2CH&tGqENUZz_^fPab^RFdZ@_ktoaGfb$UR&zk4XKMbs6_n^Z30Sz)s{ zZ#o$TTEhpE<7fHl_TE`NMT(i9|w-Y{2Cee35Yf?w6k4DpQECG zUBwQBa!0smi!-Uh{&R<$!pJ`(U`mbRhn%s(Vdxh>#uv%8=&mC3<_PTiH$Xbt=A>`? zAiGJ@=Sam(!y0A|yO7x=bFsuqAB{VAHG87(QO?nvg6&Y=l!dZ5jq+zgdAU%&K5aXc ziXdAL2{G?tj@D{RgJB~~^uC+lW;ZxJj+kHL*zcPhwR^Mj8_4x{Z&U*naE%JMh5}M* zDEzOl&1u0rg;ZaQgUgm^X#5r}QHbzK-0=2FZ$0tAIVwfbo~5Ac>86I>?F?&GU2VEt ztL|-&Bfy-b+0t#IJkw2cXHA#SN@&SZ@@KL8R=Te<87;#sch^a~23kozRjY)`7+yKvI#B z{FRg#zpPt{1z9Do`8p`kT4C>3iIXW2AxzCfdb$CwEz6KP#{ouKrjbj;-YU=^i&%L? z_y?HI=P^AWf*&F?&6DIMhr$m|E&azfggv#iTBnvc17M!wu%Sj_*_9J~x3!E_@Tu+? z4Fz*(b86ok1ef2N+D48*T91S>5wrn<95Y+Z-1A+P6pyuAm9`v~snQ2u1-$r1@M~3} zm=Aazfc|mEy+haCxILOjve4X`MsvN;$mP)FIy4=}1UN3A(2b1CvfwMz@ZSpluYzBG zo~2&{;V&>1=fNB?;dBlwb)0EdfIY3Qq#NLRMq9M3B*p)XX57eIPMjz#O?m>^Upca9 zioxXPaiQp{Ib6YaJ0?k6hy8tP*CXxN)UErYldZk^6gOck{@m(hyGu7+st&D8hqc|f zrtV-Shjz6}3lhe(C{}Se7wc49Ruu2mJ~nna`8#^@a2XGCudzQ8irP>k_mHS6)A?Z@ zU(wXWL!5O7@ve5)?ADzrm1bajm38%rzU?nD*8{MgjM2 z4e?R4n$UpBWpMFbwSq{SYPt2zTjOnQdPpfnx2uFN3+?sFr=iVn7n(!OQ-=X8QSXvx@SbR~`RWQ;n|Ji%TiO;u-PW2H zA127}jB}gE)&_yL%*Tt=Ufnt8kL$rt#$KWZE3rXJ?D^6%3N{ZDIm7N^GhlX(e5T6# z$mH&YVK8}0!TF(6U(`aVwvwalOexIUmk?|G5Acf<;RFA=1wiky8X76aoEp2am8UA5 z@@R5W`AjTS`AOH<;iCPDUHzM0xI>873wXt(+~Q)lui^##QXf?Wc?CNYx9UMqY$@2{`5 zZvzdBsqX3O1}0Jf}V6ld%gNQ{|8w+ zb67iLuTa5CP86}tYI8vUWE({87)$P2bNs6TIk(e1 z;Iv;${jZPwGx&Oq`x+K(55Bf4AJtU-%=`BQ*(Q_Cr(JaCSUI5i)XUbpN@!4TPbly| z4=ORI7|)~dxg7&gm|?UBe%m=UNO$8}GSK|xsPB0HR&x0Te$w?1FCTAsY!Kp1s8QDL z_OUhscy+~$nz}>Gq8DVxkzabK;qQEH6=v=19?QKGN?b%@toh;^#uK$^%VVx9|B7T6 zK;@KG*2vT_M;Xbngkc&+Tk6N!pjlnvS_x;s{ffmp5nES->ulXbcrX*d_&(C_5iGlX zoRT+PIJ3Im!oG?ICgN*d6N`-cHokjnE>+}G2)~|$y6pM~{f)sbb;nkXqHE1t%t*m# z$NpYse=1qsJcAj9ZU4@k0vE2*gLHdHTkQjdj8$SckE2cK>23JaJ2kBVT=nUyZ%~=Z z!ppZ1GtZXaJhm+O7@j67XD3hH7mqYBcKxH{vQ_~wXSwYCK2UriAjt^}G-J7*NAvaR zX}gEy<2Z9QA^JN;>-$B}0bG@Z)82H)KqY_d(CuoIqrBJxz-j&huEhGTu8G6t5kbd& z-VEPB+d@)5>mdivEKzP|hN)q?X0S6Ml|_1HFNk&CqSN~282*)U=5!7JzT)4YGy3Jk z`FAt_I{3HOnWXdYy|en|+|R#u{=LroAO=k&t=oUOx!qnvd3oL6^YgpE7Zh}VFD&f- z-h=ec(n;+AkY?hXxu*!7)$IjcZPL&KMH*>5YhIr0ul+WrhdHl;Kka%n` z-w7*@`VPX1yV+v`pX$YTc6FugKMrGHTM4(;1GsbBN?=&AVdp~)e*?AONwUo+cFFHT zauMw6W-@i=hU3FpHP9fW13t-2$Pbp3UPHCbK2x$B9a()WB2iQE-Oc9{|J?jm7YU#q==DSbA0?Ek%` z?_uKN<~9G?I#MdTy(pz_l>ndx}H88g^XDT$U}QareB zn%AECH?Y*Pq?;_=W+Z?9o1V5l{b4muS`1H^h5MB9yLR7QBM7-$e2N-YU{$%i=#)0 zZrdp18j{eGiDZIgV4;Ssn7~{KoBFtM?oCp( zEGzT!WBK1|)$JM}-p4w4gc?tRS2ApMwcC$#w`sJ#Vno2_L2RW(T8go1#8{rW488=b_%gt=8ieKnlO1H4AaTEh_OC1mEiu?Vdm@ij$pP$az&P%Ys2cV173rG4+wtFOe!Y;LCuBMR z%i_GsTgAObvj^Jqf6?;cgtnNj0HuO+t55Ga zM*wq%2LQuF4ms~8r(@X^a{~YbtXTvXQ*DHE4+28kU_+6mC8Sr)ZCl7sM1etxkGxDf z1#=W2P^mTiOHH6azp2^grHzBIjFWjzhh_9*u}KCr$k4cJeZO`jLucy!n2h$$Gdn)Z zG#5@sWz^stgk(fFQLsF1u;kfg8k1F30!6yXe(~3Gi(2d(F zF(9?5yID|*usCjtrp&aYngXSoZp?2}0lSa#>mGFBXTqExvEe8)j5qR$;-!F{!U z9(#Mn7Lh)REO?AZN0r3)^gr4QE$qksd>mzFJ*)GuiF&eEH@DcOxBphLNN;s%o%yg4 ztwfaE39Va2>+{D!tG4pFze6XrQ8BxPmK0P(My*t@T+SU{qt?y(aMV9SH$6;oK_@uh z;?*8Rh6jP7EJTh?o$$^CuP@PcGXh3lej%i5R6&2KPHMwb%#oa6flpCy6YPm*-LJL- zfA%CNlzPQ-tB2fTkvnQb{2-_mt(&`6v0X8%omp7AH+@Sv+Myqa_UXVXpUt|Ce@1i# zj+OLg-_OdvK;I^xzCv?yeMX>ce{nsex`N%+jC7y#pR^LpXw=~njAO-=+DR~Fs;#;W zTw89I-Sb~MP~pkaA{)E)on650RMqxxvjE;X@ zW=5y)8()irVsE6L&7`E3@vNAIOZ?x5`3;tD_FP1<=H$#)-TiH4P-!avH(0Qh4OZ)H z4K+Ssn^NnxX+>TxK1;D=U4a61=Mp^D#_4XZ2b5i&h5B)Ex}EkOhmZH%#V!?-rj6l7 zhCTeS)}7&SUfu4Ar<6IT4pm}fcDIM4diURAQ)AJ@){@zF?X?O%FtuC!uD>R0{gjNH z^(iyS33fr2(xkuXxcy=-cz3m;yszG0dkbN0N+q7gaJbGiu!9&lA1au4vzlLyhX29h zDicB&r!C5_7a94uKQ%eC;xlzUoBGGPR(JHG^87Z9Blmjqrz>o$4YAZf-r#^d=3Il- z>0Vd2=%}(3c3e`OY|IJU@&p{cFx|lhDDPXYiXXnyCnq(C6&vngd5V(#T+<{MBU?UU zijW;0_AlJR@CiGdhT2(t?5pRiGMC8pf_*7Xp0r*l)8%pe=ho+^Yz&%vI#{yT=l!=^ zpI^rJ|F%9aR!Q&}c}m~+l|J8BOpBP0UbW@Kyuw>fOnbdDv1ehxMocQk%5x#i);9ml zD3?4n@ggtSnn|9$w;dm{$4l!;H0M5sSM0U18psJXPO|H=Mtz8R*HXtnXo2Fpt4Xe7 z!Z;nrwE=p-HI3!dB=6t)of7dn<=+)*SZKkoDM4e@oy^TGL$wze_f8zzqRlW4WiUW> zK3#;>DH^J5OT3-O&Y-(^*E!dZVbVvlPk38n+#V2+T8E3F?2NAt$H%A{%-;BtYVU$U zYJ`|3BejH)5Y_GVn-D!fa#F=KyaZsP!`9bgdr)8M!3L$oDmsmv9IEA9P*+_QloA`{ znfQUx)DYALm}#3~lcToJeK?dQ3i_u8E5k2vj~ieKsmv;TP1`@R-z zz3IF%ePGXmUF^W-0A_bFTYnFzJ&gCkIKWI+dl661_PXQY`!mE(uDEh&d~~Swo;#@H zfXhc1?^V0Y1n-U?YG%8ap|Oe?1kluIWGCJVr~v27D6V6^6!3w2*@J<$Ctc}2=JPRi zDLo0hJY)4#+A-4zV_BO=OQ)q2P`k3>!%#EZg>ZOcSW`=JIQG3byhaq+gBHJcg+9DV z9OhhiPU>m9$PPFxGf&)-_a~S07ILO;-v)V2|XO{P=i`AO^3fLM=&5p zxpn5UFSq)^fDWRNcit4M6bHx(ixnGHX$>@(B~fbpXpwLczX1y9RQoZfr_pMtyDqMK z40vWEk(N;b3PHat=$V3!Tj=%18|fd)Tjw9jlPzkf{*;)H_qB)eW`atG^4uR@yZA_XtUljVxAu0Ge`4=fuCcC!Rb6!dK`P2CD#KE=9#2Q(D_Su zoC(_Hyfnno&e_&sw(_FfEjGIq;*h4lB?vdFNXWvkRVxbTZr%gRdLBwa< z_v9M;&Z(?l+IQ=}Yk8@2hgx#i$}l)h{c^fm2R;1{+04KhKOyl|!L`+~sfc*>b5qR5 zHCacxVpGY)8PDd1TNXfS;;X#6ewMNsJ(BSrxg7=k&0`rc^=WI3OUzn1C8zE$X&Lo> zQrS5k6>9xCJIA==HB9b*?Y^NTv7%MsIQOzB>BDRY7 z2O0p~WVONiMI%h&$d#cbci77e#F>j!>HeWp?3wGAO}{TB&(E1%=vMORp9yoBUwv)mE|hrI@;W>E?8vtA z-1zS9e!rvn>Wg1neML^)$8wA3nEUt6k27kJ8!j+M*n+;0P4e0Dy!fsQcEBISnTUff zb2p*?=9oHeq9cHp){BZ~cy7*LgGSByGllVHXj;qEN2trqlEigO;6Do|Z z=70XIytme8C3lZY^}>TY%dn9Ae&DLb%HU7Y2&=ESRDU2z-clSTaZ@+Ncv_@H#ii<6 zJ1M`TGXEVyCd?me#}E2VwI7vglL+y`CB$jUM5VIEA$2eO#Ti4y4N1EUUUo#F>-_Y8 z`#9~!d}6co*B$CNw;U7no2yVPNMzUwh7QAoX>ui~<40Ea=o@LeBHvqWPn>c2G7p?M zCZb#HN(xE zso3uLSqzWrdXQTccmg@Mmx2@gl_ax`rx7^C_sU6F+u*R|lp5*he+DWenmlQuD*mu4 z{`;eYic2Wd#YndOCQ;+xvuI~++Xg{?+rGS0=~$S_@E94Y@UsfAR!?1R{wN?KJ#>?R zNeop>zO`q4r0E{m7?9l~t?8DD@V7??gtt=)4TRRFE33uIT#J>#BQ;vKw{57gf=N$9Um5kXLfwXLIZ9f-S^hHG|2P9a{WPg^~;O86$%WM0MDsvJI^_PZV;1&~FWM zFig`)qNNPA+@Elgf0?k|!z-r<^USlsVyt$s6audNS8A~2p5PeT|2FdIde~U<^a570 zg~81|=CUfvpSmU7G)hvS!7t(!aKG`Z-kPrVx!nH1XaDXVf7dp8bUxF1(P=D^9Gm(H+>Yf>FJdUUyHs<}y~QzoyZmrYP$6GE1gC_i zDQvvB$2@bsO8i@CJ?WLnOZLu#`i?zJ4XKHaJZ}Y8b8#XI@cgf%`5jF?pcu2$F3=o9 zL5T`o>Wim)mp|-rA1J1S2)l6k$8isJQLNeLAY+d!GukvQQ+~`lu4r{`zi`u4x)gp( zF^tx4QB#CwVQ@_!kD#&u%C$w`F^Va4N~qymTs4B@J)A69_mhs{LNQF@4e)d z&{dElkDsZ@3C&QxpZVY@X5O1|<>eHV7W~y-Yzm;EhS9u45*5r5M)2fg618lvdYEBOh)pE*I6EFy;m|{botO$kETFz&GyN-1u`53=a`G2 z0K037083!_Fb@I$C+ECl-YaqtQm7$w(AKWRma@7L-aPG+hnAd7z){3;)P}mk@=3Yz ziGD%5&nWi#cl&a<8BUW25s@aT%h;GmO&n(Q;~`b%8WV92tsD}A4dYme+W?g3kj;!I%b^;gOX{#nq zp6odJHZkV87XwZn)p@-bSVzw zfaJshw(TXC9RMN#KQkRiLdD0{0J79tKCs~cbb)}nUI6I$4A5r|sKhK0kS>Y0yXViF zd)t_sJ9B)R#1{pu6EI`GRDs_DYi0u{67K|*BQExYg*5KP%C8)%7BpsMm$>g|EEB0_h z*Hy!O={ZG!zVtZzk?L10&<6lb{e{LwtCb<7G{s_|&B!0oS`>~uU|W2O3+be*1!E=V zHt2NLE=EV9*u>tqN4!O0zchu#X*Ld5F;Snwb15nE6cx;|?ltLNwsO5DP!$l67V%Qx zkR8)Y6!w$&9s7-JMRvK2t#9stm-d^0?$P>C;&0PG7UTvBbxNG|>GfIvL22S^+k z>xw|e8_oYH|0+$;JbQeo#92kS43ps**)pH>*D-&)+&(2;Xr`JIROneC5nNeHhs6+D zI5y2j34Q5ZF=@`h0SWv2Buq(@u+Z$AhCUi-8*d5$YQG&#r2(m1ys4M&3gS(rQEtLM ztXiFuh4Q(>1A^YSb`j2Yn5Jiyw%+6zE23s2XVE2}W#;U!v(CmgTN~e#eDu3y)KiyK z>W;mUS=#`oV_mF}mv+>yZ>@7(@n#4KxbTPP9m(GYdV+@dF(gaLRFID|yab^67j?JK>?!&_&M)R=bUU7le02;{tWBaO^}=;2KdB?s7c;x zb8-rzyf;LP4piG9Ije1u9OZ~MJzlyCzvkw5aug)z2;~{q^!O3G@ry!q+N8;@FPPO7 zn(6l-cgab4<_QGQhC#J?s+(`Kd7S>KuDD-soHqAae$jJIL|W36FEO2mQpd;1hPJZv zQH#G=_`PmHcqVOMlFjYn@KpP8ct-fN@~*FS`voQE_$9B%DtQ(qcW~8bdX_=doSzf~ zlZ>E2T@)tu1YN}w?mo>BJHlTLD%d{Hrpjn=+<`wXDA9F3al0d^V{y+qI_67KE(&v)(cjpVyyt zt@(ZyPlx)2#Z;Idz-r~5Hr~8nwxS>gj}_AhV)Zy)NI^5*?xWnCM!D3yGThNG`xvYw zWZb=?o%)4K;G7p5L`auV>sv)Lgx5`+>kVHz29Vloh6Z#$RX@6%ZH>u!UE}x~neYq$ zBfERI0W&WomT2!pQ-lqg>HN`X#2^^l`P8uf+MKe?2=w_gjt{#t*>j4d$do{I3cX;P zeDvJ9-ZVY75Nuwd(ejn8!zdsD znk@Mhs@kk*PtKi-X_chcjnom$3mFlnM2bkEk)9Le_@D|#nziWprTOw;6qmQs z_kCDruKawPq*d2*GxT=k^BiM5t1)-l0;&n6G~g|bY;MBmj45vq(5ScGT*USd6_jbv zuG2iXbkiNR)9HvY&#m$l!Mn`9-&ATBm00Tj@($nUt_+h*e1$W#0UowtnRJ0=8+&hv-ju`HK%&>YGPxR@&_>1onFm$o}0o};!sX|}x* zli;FL4noXyzmr?*rtabqBI*uqZE|qqfnz$#v}=Uw)C9QMA0Uf2buQUePA2~lznuA2 zhHe6GviWQ%`Q?R_I)eP1Tw4R#goO5sDDXjklLqVjFt*QIaBF zr5`bcNB-_JdW~&{PUoWhQ<=qiFFInjfVG0sVKccC2Mz2mPQb|IOrx{u=OD z7s4HjUB;)NSk*~{e{e?n-VRw$zg;DT@9ymor^Nn;#QwX71i0TrnlYSN|Qp(v(1B)=Z8_yooEl)@&?#iW$x^FQothsjwH_>k%|K=(?jAT zRNGm$Y#x`t!?x0@ygnO8y%Cys753PGGZ%qU6rdb@&g^dfePBSy5Fv9Nt4$jU-~38G zU-8rAH1A@0F`+g;p|g=X*5;ffI{+^5ub9IQbJsgOMw>n9-(E4wFHSarU`hv%RpEApv1US!z@TR={Um<{4}gKZl(=d1E6OETLPSi2sr_MT@S zr5FIa!@G8q)aq431A3lZ>8igio1U@e-2$@BS`xvk`94T2d2q2wV#-;0N``6|S30S@FPPi~yT=@6?%t{Y)>bB#kKqPCP7Sno( zX%lRx#m13iTFGlWZLrrM)5DRN*3)AEBc8?p-BGIH1VcxQUYYpqZ(e^(!_*z6^?cwU zl0N9aK*J>lvjk#TGq=$1#Mr(5rpcijj}+?!7T7U~(etv`K{|J38{pOkeC9c46EBSY z3l1O!_dh>shtJ?t*7WU9Wkoo>hic4aLV_P2!)1vAyML$%JPeQ=*9$ewK|}jKoU+c= zQ<}E_%iYBn@^UCkY%LBoHt@mo7!z|km*>V0>0F){AKKci+{u3J%jrdvG+xS{G zuMsh#LIzs%H-Yw$l4PnhlZ|x5bNsiQez;&8hpD2va(X zwltmU-_l^F3ULSQ!==P}m-prQ`~{gaDf!^`HsrhP|6}lIP8$ z6m#q447k1&Uqung36kD}ye$%>mnh53ppfiaBtA1b-}52%Rh36wKb-{Onnb1DpKU-C zw|;zuk7CH)C-`ee>pzVpK+3^Ohz304HK}zsGzT~m_C|o5y0gq<>*PAK(f@Q`? zr2VdnZMJp5se2prR(pSv`3%#H+K>44MMMKVS|{qciEaMgq`}C^f42iVRI{*dUm%7$ zAHZ*I#pm1g4En$>g38RQ-2^pRrj%79G0zeg&YZB13fYLt3pG3il-=+3y}ZpW0E}8i z?6c7PyM)oA(ps4&F;@y3LLYiT#}kgPi6k3uR3?0?X5FmmR{UxO#l_gomMC`7)w%49 zvmj$r$KBJ&K)|K9CY6Du!>9XZp2Q{(bCP%NX<$hkvGXUB$0QCaUPBeS1-!pH~_s*+~ zXF>p+aXe-xe1#3jiS*=a_m{9TtR^70*tOs|*y9L+M`E%}va4_(aG!_R&j_E4BjxP8 z6XjQiypmY{3pR&6!e@&ArHPud;ha?N@~Y9R@`(;bvbi+%jdffqug2Aw zlu7Ft4jeX5`-md8hO&@73zPUfvWt%CutP3&b_qyX2y-@BADx4j7gc`)-;r;+MKeS z!Oqt^iXnK8JwBlOg-Q?=Ghk7mA9MDTsQok4s40RscZ($2tEx$~6{){IH&6Ywt``;@ zv{{Mt-dNXh6U&QMN4EUPO9%o73hM{4HR~03h_6CR?B{}lrpVVkzf9Jq$TvKFWuLxv z*{$mY_jKF5O%dAEKB1;Jlg-@poJ{n;S2?KKTS21DK3pI4w^6WGr(IO*CR+;Ob$dqY4FXJ(hlO>cSE76qe@ zcT%lXEG@u&ZpQ;mq(yEP z*ybL-k$&2osD)idTZDHIc2OG zFgdR?lXwjxgRL{6xr|R3_39xeRqSE9+kLV4G_3Ba6$>HA{?0={*-)RdLzxUX%I27;DC5wWy_wrP zE;}sQxS^DsW5)c`&W-0qK@ZdFNoyZxM@l~|*>SN{q)4>vvL8jy-=7jkJs(Pbg$0zr zWY8A`CX356ZR&F3lI1lm?w8};bX}C6SpKsLOSZ0gcGN6+64$DYjJ)#}WJ=?ki(#}M zxVSAqRc@YLYkpkA(yX1*NTWu?6;q{W4=n&w9I@tpAq6V4=pq?(2`BKOv$xSAlE3Un5E^fWKAqv1jd~Bo{42L_vEx}aM>fF%9YLIVyVqAk7{WSN>x*D z@#^#5C)$e)T2xTS0UAX;J91G;9e(`l44x`}A-b76v23HoT?3Y-QrC*fG`m*#7l1Hg zkBL)?zN?gLY$@~Vp~v@|@@fWn)89hcM8g%C)1G&l#8|z1Ana4a2b*aNaWk1CDos5oGuy8N7L6sKSg8YM5#3=(a)= zEsJ@}i5GS*FR1&uU%M*Lo)GZHz-E2Pi^pJc)SVSzpK)EJyzJrDAT}s0LP~M_q7Cc9u9;8?)4?tu4GO*bBrY{VM)qyU8vxr0Aw4agA9NL0yxgc zx!cAd!@tNNoP+(^ENvs7KU@MBs(ii~Rq-R>|`6{ufM9kQ0tmDwHNlHDM$qcy}Tz0UDdjHWu;dLf8#(~rV64Njc2wfXA z#1f+q&WUpyfi{#|*3e#6Q&+~4cNA$>8uR)dYGs1&`(d4FNi*naIO6(_ zkfnAdgNx!B{}DrYn9>IETPtOH{1(Ed^>#xE+2Cureq;~{`Qh-?$e%>IUh#TlI#H-` zCS}ADvul7T$SFbj9&CPlovi0>C9a8ctBR7$9-7eX99L};W6ftXEnH{*e6CI*gc@|G zfnP01PLw<~cXmtxM+sIVLX`EeD_oeo2L#Uh{FnvNd8K`#Qu$o0&Fsz0!Pkj42`W*pp81=TxZ&IE^prG5AsTaW!Vm zT(OHQL}u5R(Nr<9%#P=9p)MTkX*b)n=Gmi7>*ebAcdF8nuCZ|fqY)&GY2i4IuBojc zLd>D9-lF^`$>w4rNI)OuCCZ|0dVtncze0Jlm}taHg6Z06ce{zCnB}HxKR37banrTS zK)@_aeC?Q~skTnTF!?+ZnAEkTQcB11`ZGa)D)lFXLqWpgjY0z3sH36Vyw%%Ieti?1 zCcp9q&@M(jxmY2^bS(*+3{Cg;%Q=>Rv-r37ef@HN&c8MMyL(Z;oJ;TTm-8q7eZjv; z5A@5a=U?%I{c?WAzjZu+%)dMCVRe#|Q=I)@Zf;)oYjJ*lx7Xr=g6{8yh27tK^yvQH zvuF4BqN48ay?S+j@7=rm`}S{r`gBj}+qe6Bzkc1{`}gnu9tycdk~`mj1v6N}!g>9U z#x`uGONG5iN)G(xhxYBuBHj`!hqA;EpOgu~EGwZI=1_5j{{`-@ zj5!a9FkeQ#CL>BMu_B`0J5jGA>U|dVzGfS83jZeauZDlR-!RHQ7m5Lw`JN-&Qo05- zR&l$AfV!dzdlPTm#F7oAWl}jT;HEnbgRjFvQZ(;o7OUSluP7?kbvox!!DD4KF>n2#i7_NSao6c6*dvrTRdojq>(SOU%uW?SZEXSH=6!?xEv-( z`1Z#xK>|MVMRI&VLOzFkE-1KS7vUNNeo(*SC*QY{j7-t^Qs%x~Oc`#__clblHAHkW zE$l`L$6wl%`2b~B6+v^1&8$`+&_b7|J1)(QHa9K5m}Is5-ekOI1kNy;@G0XqW!!9j z<}!jU$6*UYl#2sErf-9Z2quWZu7e> z74IbwePSLaiG3_jkytdxok@$vJRG}=0hQR65q0zv<~5qgkYvZ2GV|rh8ZEK?Tgf&> zKa!BzS0~)2b6{4=Lg361P?XLi@izNqr%1j{F)0Za+*ferqTPS+QA)UxAZ1JV*twec}0ez<=*uLE2~ zUF{{~^?WnCWkZU?X0R%icuL*CmMQ7CJgW3o18Og+s3*;AwEL~Dzlbg7N*vd5mJjl? zCrEyK(TUB!NcjW)sqdH`R5oGzh$T|J!Y`>ENPAO@h5ThUq&kwB#nsgi=_Goj=F&Bh zrIO>IHNQ^t=J0G_$-SBHYUt$E0&^|1q%;8jDh>QOo&jl^CDrCc2keB`0#9~#ItRd8 z)4)$;153osK-(%|9&=_}*y_kq_3i-H?&H^!V6MrAl{PTVx_>z6^cFZ8S*orc0Ne9m z7WkNK;6(zy1AYZP+QP;nOVy79*v>T3dD*b)_omkI+I2q*9F8nirwf3;NCU4zlcm|E zPHOfSF#Bh<>V53{u|wsicesz>+N-%-%)6;HtY3DcK7WGWxhpjVO&>tjUO*JhHz+tm z-D1gVPWrn5dDY(AiYldPDU^)OoPK36j?8G?#1>b~Frg(nm%h`(>4!7xQ^Q~qJ_ zHJaZh4pnR1+Qa;DhI~MH-5#ZDgP;qhOE&$pOPa5ePNSrt5am-Lxf*<4TGiR5&0ANt z{OX^H4>X5R;*N!(r?TqGj{Ou3ZQ`JqN8~R&!OYv)W#6i@|5fbD4$4e)<<%Xg#c_UI z4L7NDaN}b?beB-;`@QT@4BqoP%IE$^=iu2cL3@R6N|0Fy^0E+IX%Vob z2rVI&V>oy2v$}Gjy7_?(pa)YxYM%|wzurjF_D!cIGY4c7zeL2BfL4rKS^`W^0}`fl zbK&vJ0h-=CR!rf2_FmP=!n;20gTVBAj-S@2L16OC=Uw`)PBSx>oEXy{`0~HV?#^J5 z#m_V=S$df}inC;8l?eH5s5=*hlheMlx$&d84B9&Kn+cFLb!>4^&;WA=rBr(VvhAX? zFV*qcVsTk$NrkSed~suVZKD!41CbO`E+(Ii$tNqDd%()ut{4G^~MrZ#_^)av^?xLyX3CW{B=45 zJB0^*MuYo*0JUV-SNti|_)on_^s1q63omm0(6C{9sk-cD5^0wbQ(g_SEe&l~DRS~? ztU_9PPD_cI6CgUVWpLe|uw#k}946ULMsv4C(FwxPQ6x2@r*1vlJk~F(VJxm~SSb=+ zgX?}mrRWeK8phz6Kbb|dBgXuNm}~TVOUAL;WUSEkYZmXSiO#-|4Do~2As6suMm|md zOlZOo^ii|m(oE;<=!X^Huh^elp6}q@|NJ1{eKTQaypzLos=w;{|HZp2xo11A04*-L z(|tGZW{lgBcNX*pKzGVJ&YAhV`;z0<&55>b-c9~xhIfIGVV<>_?8M0P7Arr}*w_3P zzj73a5|9(NGZ1l|`Tu}~`trL%jqmV)ES7wyEZU*VJV5+NZ}axTn9I1B!bR(cGSm`j zp1}7z%}1ys^3T$z;Y3KSoMeVZij;ykvjevd^tA-{m zt0d#DYo0pIXO)t6WR=$I{zPL@sIj-+zMoXBAGOZZ> zK0j|KifliwT_`74d{?fFiN^c3TNu_ebX;_t5IDwW>$n~kEwjn`ia&=Mx2R>lpEO2L zEjzOI46#-l=|7mYw&V8AX0655Q@Fm9wJii%+n%)+^f_qBX00X~Gf@lifoL`vK^5VW zC3-?kv${=*nwWH-iMU~a_Ngy_AkbcfZ=+gv>Y*A+YLaN#?N<9X!fJlYvxW@OmD3Z=Tgg#Lo6e!nhQ#GV;v_o&jQT~3|X3wST|}NGSRYf znL5-ys0FU4=f{!TO(-p{!AnVFOCdE<}FRS@GS3x<{ z1PM$;P*l_uqoTnYMJ;LMF(;YG1cF3CMMcf?1TEE8Q6?HhA#sAv^f-#QR;#vXTT7qX zmfDITT1@~6iUM9xtT(h?cARR#3l}fU@BP{POcJR5eZRl|etEqn=bU|Ad+oK?UVH7e z*M6pSZMd}4D}B~Wuif#2w_{`1uEV^porigcuT6Iz-W4ug%b~DAIAq-M0%m{V#H75z zUCs_XW0I?l-H~TGoA9h_-L5mrfWLdmA7)R;VW@K%^7RKgM`pt+F3Y?67(iu(U&(%R z@dc~=$$3@DaDG-r*EJt{cwWs$4Ut_v(ktb1(>x;OyxX1$Nk0=?kLB%y_t7zfWVt*( zwEUFpxfIi}1>9vdoy^ssExh1jv>;NEU-h5zp=B=xR@LrYmg%|8OT%O|w ziFgjzY2d}U3U#HI!^vYFx$YctUc4&L_wsCPKEVUxRb05?4UAXeC)FcM0f%L5ELTx@ z`^2koLE;ULR}JP-7_Tbyy+Rv1gzus8s-ZkW@v2Zi7zoLYt41nT{TzViD>w#CJ$Zyt zt18cTl>?J1rjNUbR1u;qfYFP4D1%)kq!(#j6hFabUdaARZ&* zRR{ApEM7H=$D#46LwFn#uR4^+sCd<3tDfV$&H%5y0Ge?Atcl?C6Sqom{KcI=-$~HU zc-1Z*JK|NGc=5K!t2pf9eG#wXq>J}?yy_bspT(;<;o^N7uSz#{eAe5e&fe$7s2$&C z!AfUg`pQ(SwRYx34~p%qjEKbICFV)yb7Bz+cti#GpTi)5??A< zZ|ic6?KypSdcp&=O~++!9Y|996>58&;)R8#itgxtO;|#T&?0;{qnN$9WD8I8_Fs`K zlKIVe=H)K;E0=FiuP9bL&EjMRTo$m#^vtBh-Yoz8i_P-r*EY+ckC27alY3`5x__3} z90G933hI2}TixqkyV)YS&-SQAIO2WV~4^OW8* zl}~mJp6;NZ@+hE;+5>I@kgDiSKNw&+?Vrrgagd&mF0~I*3+7WT6kzddVP%*5=92N2 zrv6$YMy(x^wb9FL#Z^S!CK-C1Z0}CBx&>J9dnF5%2E)njJgn;Mv+G9QR@}@6a7PC^B@H z_GGT}a-R=ZbX^^)@we2JzHc*!Lx1|P>w{dSS#%pUs-?1HVzMXuiM#!`&GC4`4IrJ+ zLXxWw1J^e=T>nb$%P$eGk6({K=h_qT?{tHrx2#U{!ChDnrSSxmbVpJhzi25tSuTDx zNqw$Oii`!-7OL^mud2nBZ68O^O;&#`z&as3*UHW2UJ4BR3@rZ@FX?^L^%3&PTk$*d zl!k!aUKiGCuY}|GjZ#S0M+JRx>B{(DZMxKyOsN<}Fc(jx%w+Xf6x5sBrb||TN%=tm z$?9GHD}Ci9tMO6oinERf4yU%3Cv1;rh1%|?A)0;XWGF}u?fh3t-&X5hRp4Ta>{XH6 zSNxReyi>`im(+uPB1hTC(p6@u!oiQedrL~cI_^c!U%g{TdTnfHcIZZQt?-{8mDKxh zC+DO?@~`i|lt~>a-Bg>qiCS~tj>JC6ZhAjV%Cb~*1QgEE$uzsKYs>eu!^w%Cv4_oU zoUqekp-Q=*x|sulf(b$yg~_ipL>Aexfbs zjUZ0X&B1d^@HD}5Yw+9|JY`;{^aVU?8&^+hWT*XE33uGri=J6gEmZ7Pd=a|oUh>G^ z%>TrHt7hDb<9<{!d)&;D>yW9^&!^XQeREjXSBEXaCvpzyNN;g15=|tPSNyY&x7lhiKpefQpsjEN_>>&b^nnEg$}Uc?;e_T`dP^O1<7K#3O692}Rkjoe%nUX~ z#6cGGkqM0W!{kFy`z4vNC68%hr_tH;6UW|zvW;h3 z6bvT?%3tRFLAWKw03OVH%p$^5Q(<2m?{w^oqlp?{EoGNl{?)S=|5AYrVN>@X3OrHa zv~h_lPKHZnWg2S!KA8nMQiy~L9q1njCC%bcd~bpkWEF`@NU&RadLpMk0PoT&na|#p zIQQY<((Rmf&90{MvS5|e8s`(k=2&|niL;tUa1_eE6t1AVvMx!)hpSBgmo^=mfMPQY z7XhKiSes~26#uZ(kRTCLu5jXBm4ZQ`QimRERo?7Y7v@UfB<*|8;$lzk$9zR#GLI&K zjWoAVF1x5_^)J7$m-tmq#2$x6Dj8e;J5#v1)Blv?$qOVx{q_|* z-FNcnkg1{hW4A=6SPOZ(tH-D#Hn!3W*FsSy8m5{#IVh|2`%Wr8CNLG8b@<0yw;K1}akwHmNcG4GB}Z)`$F) z1=JzGIpO#<--Hv(XYlFg+9UJVVSE(p-X}is^U(6#_{1+LP<3g~_AuOsm?g8mNaMSO z3p!mmK|fA#_moNHU>wU}34W9`hH5a*G5ioaTye|(tK2>XS~t4r9^B=Wd;vj0;n zeu7_T)EXRN%9T?Xu6pp&XB6OltU!egA!|7Mk2ZY(V&X}aM>$3EBC`RnwqK-!6qFd8 z<5?G+qVm#3(1s;x*ib`gd3-P(8Ap9$1Nq)Z-;+@9_${=}_s&kRcznz|?~;U;sW)Cg zU3QgtqhMg67_%=!f?f!+vGSR2F2*P&?EgaPx^EoGfBl6MzZk`9K%fv_II-l{eF2bR z9T%JR1wfSH#ImJ*0pNrzvd=arq7-v3l&ow4|K#d)D6Ag|+ci}0`iC>+oxor!evna> zyz>sD$Eix%iK#;&!ccGU@Z#iu>HXCk_qtinZbWh#CPIXpY;>u5D>IL2lj1X+?c8!Y zu%uVTzA6gcw3t`e)$k0TLZD*0eA#^NGv0TvHV-xg+3_4AR{k!9hy^dDZd)uF%pvT; z*E-j&Hmt6(sz@$bO`eNr$t1=-+!Ee{+g?6kPmXN;V>|m|*AlCm+L3@P6wub)i?B3zi6)_8k|!)^JBup$;*ov_s1-b1XVLTdG-QArSUg@YW8pA*7q_Aqz48 zU*F1i;LMCuM)Vit4T=O*bJR?M|U5U05W$yGq(ENkyE~+rEYq&ZiL) zDgVnx0-`wO7G6@{^(^!p0J@mcv5a17-jhs`h$$J&Hq=(7Y%tlGKa)EYYYP`i`kNK) zZxXMLU|+2v=5MiCWcIS`ZekOEaRJDRm}rrDgBfYVV=lb2=}fV~LIIi_@&*3rtqbks zq&qlgHpD#fvT&~HTTPH>IyFf>X|vOle}_@hlR`h|#aurIEQ6~omAVO0X~gd-*=ygI z&lQ>*O)d>|{-|2Wi9ae=u0yBG7p)J<8HWcWTnh!WQ*6y}>mUp)YP#sf;v}yCYKC1Cys)LVGv*u508TwU^CVY`EKR z$DkzuR4EA6KFdtf!Tti?eT+@&B;ibv<|G2C??mAHb;%NHTrk7@_g-~A0EBzh@fQ1Y z{er|}*V&+qI>JG0Ua^4>I~_&l?rat`5x=e^(p|}lf$5)PYE%5@;9#^7#x+KAU9qXS z&pF=`P#u;0GYL%R#I@rJDN@KaHiWv&5ZYmRbFoCA>X4T{t6Ww@&9axY-_h9Omt{X`L+ID0+=)MpbA{xj05b;!Udm309H z3V@S!l8A#*UhJFf=mIZhWQ;m4&(dEf3T80G|cfr3a0R>MdnUuqRzjFsq3PV zmJGDIZjhih13|4g;P1W4ZuQSOu4nGNU{Ctk1$}gaysYR&LPXiP*WG%X)0{09cX7qy z&EdeTDAy(y9%yc0FCRZ-XyU&ryKXbfGnX!*bmn4Yh&un5E{NiArD{u8Q2-V=!vY== zz1^W4836Xx%)J1sZQKf}s&x_nBeC&O+p~(B4#1D5luF~J`>M2M_7vX&M7_YbQJ3=k zJN)=MEIhDI`8SzD3;}vu@uE7lY_DSbV^8#bj`N)~Ed%E+!zHH-&=I@v*zC2Rjf`)V z&E^Fm$p2XjP-x<~!6MLsW4YR51;~pY`vChy5|cP8Itf%v8p*GiAG4FisoZEYGKB&2 z&0@;bjIyw_;|QC5$n8{{ag}(K=1Q4*n7=+JIRLywF1lcq7K`Jh1(=PJ4EjK)i;Vi- zxMw{7b93HI=Y-&Yg)OjGS?j-{dGV1q2}JVTOb$V z$`KH>s?X3HE!&=5+=K&ohoOUi(o1<$62B7Cf`LJs19U)ky?=o`>eem`&&x=oN3iG& zq|s%TimWtRhwuC%N~~?{$v978r^f#~s*dO&^A2+x>+IR%o)gr7i0nPE6ri!P5nvqr`|dWXrpPhC)oIuyS~rq8<*A-XXJ0Xo*?#|-n6V4atg?Qgh{o3$ zEWgH`c#vh4xrtzPd6~#_j;r<#CADDoJOluG3uJ*o0^9$V(k*=^N6hPA^jM0KiAevV zM+ViMXiJqiab$00Pw+`@C=K(9%$5JtLoLq7+lX zktVpQ*@w+;K6Aa$3v9%{eG55&+03@BQd3>kOG&Ce=%4-0 zz9LB|PW+%vh4N1WzBV`I<$hL+Z~U7-vfPzKrWhc_wQnvFY+98LZM8%%#LM?Zu$t)| z+`Png&AsM_qPN0NGd|O@KDR#8R(}@wOv9>2ckg7aYS)r@Rr{g#{}}uKX#4*d`@huw zA8Y>~YyW@O{y)zCmuIt8sF7A(vUn~fU(N42emC%o^Sg!Lo&0{zZwbGL_&v<;5q?kd zYY(1TLo0B7;YN`j4#J~ymKooQ8i zV><4q1bEsnaolcw99Dg-3F~$U-sG+cCM;WSAWUd`906fG4v*~mKEw2FRjtwn^v(l1 zlALI@t9m%;3^P|pm6<5#4bcihWdtDOq*T+K)u5J{o2~3c7{}|g$imF$Z%u{|$;#cD zyWRZpb33!A@iy+Y{}wQjIltt_MomG?bQ@XfH=RI(KI!L1h`?Q#+H97(W zJ0aWlS8X>6%}dmm*ChUs3_5VW(qbqmE4s)k$s>fdIi zW8}_LV%Lr;Zo+q*EvdUjDfLHyOKI=(W6_xRt%))~vRC9#74SDFFV32_Cp}=n)9W=q z-#m1KaN<^$89A~*%3LhL({bw z?v(cZ2-NBAUpdo4QwO;fQVHKBe1+&9eI;nC>&m5%GVg*hq5O z46@fHXE#KW&C^qOamqy7wN7$bv5Q7K+6>~KH-G)5o3($0L+^}&y9LQXYnrvT`L#Q? zso68a{s3L)TCW1oe2KVlk(pPkTXeQW*oLmneW5P*OLVOpYeIi|C$T^Gu7wu8V+qR_ z?U{DY`yDYbD}=E~PH0iLjd|WY_(nS2#?tFC`_0)(tznn&fk$?2g`Ipg!-?J75%+Ko zi?}?+O=(E_Yp3{AQa$+P3i|u@&HmZlv`WsBxjrYvPlzSH?3`md=t$uzRl<8 zM)I-f$O=t?{YBpRUeU>-&39g*HG9|31I4YYH83=LTa9u*d5TTCkwlrE(=!s)tt@qd zF(WdS<xF?6to{U#ga@45znqtS4P;T2+CO2mtvE7 zHApeqrU>BZ>`U>Ac{E5N6ABHoO6^f}f>H~qIXP&^JDEItw)3%P941y0%}(`39-+g6 z^?c9=duF&X$Z#7eMZ|kmcT@n)RsS9x^k{yNLe%^1nEeNRF3f({rua6@b_FS+r+ajuI|nwfLw zSRtqkQ~gC$coju1rnba(?lVytHliZ83sGg z)^_F&Gk(yTOfM<2o-H)n-c5<-Pm?U?@VAZoSg45$7=UcyIqn(%8~;sn!DLCM(UW0T zj=ln9b#2*a(VA#Zx;wpU@0>_AN7-CWF9D-kXs_1eDcep>8-AB2R85VVP#5#OX9uR< z*^$O4tmC9mm>mL!J!YKB&h@)&5}2`9sE_uB(mX!NYCi16=3;P_G#T0{c?B5zl-X;ivYY;uetK^tA?^IM)~Sa+fkwsg z=@N%{VN4wX`G_KVrcHR6sG8QBnr-BR4pm z-QGfhrY^FlTzrpu)bqF1`bOSVlJkexC6{)RvM#x7i87r3%3Reuhk)q z5DVF~b>8z*L_*s(0lB5u=uF)@Lh>3@m!u}a3*tXp+0 zbL+9Y-GZx!)qs3Y%Sc(QE9}o3<1fz2lRn@*FZN-M+zl=xf_U{qm~qk0Q|C)UZPiq? z-5Z-19TZC{cXn!E>^FMZU041a^mBk$O^T!087Nbzr|)-Z(jbn z*0;|`l7Cr32)_SvS8GH&2?Pe(%u1fgv|hO=6{WJ9(=ZV1R1t(R;my)!2;7!#(nr1c zF^4H;1s6+X7_Kf{FVZGTAG>X1=`U_0mne0~C+vKwh4C$J`Man^mH5wBCr6zeahvL_ z;Z?IaZxs{3%nX1UFTDVYSE(*0oD6vM*rl;Nn*^)l{|q9G@wR2q29qca>VuOjoh_V` zfs;A0Mb*i!m1ns8*Oq9a`_v^LwzFjFJGG7My*!*JKvKi^N-qP!_n;EZaP)OJ(U52U zpgnTvAx;L^yrpZ_pi^{TAshSa1Pgb9HlZ+?Mb}<<{nu>zKaT^v4xD&V$~rT7{@3{F z)?8L>P9<7YbPlE3lY~cPs3`2qSy*&L9pto_oE--Q*$c@oak2=YIw}b?=jm!aLe%vx zBoc(ERUO4jb8--}wKt@M5Gy&PjudCFg3jSQr~gTm?iIe{%Z_fv{g?f5BngcD4s37Vw)>ZZ(3@eUhh14>kjj z&ixdv+}VV;6A=iCRtS4vJxB74X51VsgZKTh1I}6HEJPS#=0%iPf_nOWA=hJC*&%Zz=mKm3^_w7LkW_ z#8NsIt!myzy9rg!&1h<`nuUn~lWaC~$-)_XC}JTA!Br*-@vS0O^2Uiw4#iEncC3Z? z#Ih~_mddJY_e@}~8*vAj8)e37X2U4;+*%?;f#*OcNf)wR;wUIXfmZ&L>{;CBr@E3_ zO>9C&1U#CHn5+nhJkRyrY`XiqYWy9GUJSLpYvD_1*qAeY`jXZo=-+As*h~hDwPqIz z@<5?-`NPtP4Y`6x#|q)`$ChndyMQ|Xw?@Uau9^W-STHvgO!5EKqqVVaY(4yfUFp_S zbpo1eKSMXGr&ahV6duf;=oz*D?5++?Y^EGD=O=wFv;h|>03Z(NYvIeb=pmbU zbiAQb{d<%q(?YQvT38&kFrOCU>X7DzXJWa6C9KALUHN08i%{Dv3IGwIHf`afAPBXg zE(RNgC6UItd8U{=`miH>92=G5k)hZ&>Oh$Qk+>m@eXt~o%twJgaDtWkM!Qqw2SvwRy4I+Du&_OJ|5tgdTcqvCNfIT-%iS);XB2FAL(FZYJTNOp1ZLD2ni-eJ@Aa z&0`X>YaW1IGfGNp+QdJM#yj?>WHGQYan>^aKui{QU|J4B_&%PyRC%0$pE@1F4VR1y zEw9ewd7?S8>1)YG)cT{`t=ZLissBddP#oKp9i2hg41Z17f8m}TyTYX}219XBO|mLI zHxvvkombE0EOSk=5VQF8Ud6WS55((h=_{8k#`1n7%S)~_&JM@J*=aUXv!`JWv<)lL z15mMH*u#OhXh|_roqVsqqXsCCJ+8i9U729xQr&_}<6rPfrwpIF&!X+v1BLGHOcl7d zJ3ARF*3A5ulpvGAt4P}`2M(jUp^;d15#}`2BMV~Hd8jI_^K?7f&HFbwQp9G+hMJcZ z04d&VcTIPK4o(E})EKTM7|ric6|7IoiKoWa?OWD=#%no7b)&&`t!kz4^zqY((+ z^|REX^NVanb&2yw!ZX;;Xm&asX1Cups?X50v#jKI85a%xqj!4SV{(JZVE@JTN&{^) z$Cvk?;n?$rlLYs)ayULZ%q&CC4pScli)!#@a@1RQfr<8Xk?~@lTt}wcrEY9dSYTIT zEs#c7`;m<|Ivk7{js?Zji0SMIq`8e0d!%PO4rN5a(d(A>E%5EkehnPO{PcHj3JU!y2J}yi+x;BGw~p~KUv5>@nI*2(^;ZDD}tk#8TUHuw!!LToJ^Ft zjDfH5{E)|-Z8btIW~iE9$5>(Ze^L@@RptSrH%BpNNv+>zvr>9G%TQls}y zquNMQ?9vp(KEP)3d2?{g4ceEqE7iCq5ELHez7+(87{B0Kb0H4~c$1Ksn0zUL3E@h>5`E5h^@$z55O%VpzTUSdGp zQIxNXM|tPmAe)#2dAprAkBvOiQ@xD!I|(7;4n=7Dk9SVOW;I3O`|34QcU@ue#pa_X`fRoyO)cJCA&?=UY1h^)9oyaGCZU7HTi;s|Rh5e$As} z2+IR=)#A^QcpP!rojJ;sde%{tBhp1IgB+RSbw)jI#twshqBn6w>jasRuCw1o0bS%hR(lc@@!qbh0n}Am>Qof<&l5SMgVqZfAJGCW9Pfb|H0T7p&r;McKjj991}*`cO2?;%XNWF8?B=uPnA{XtjkAE!xM4I-cN%vR9^5x;6}=e$^_!IK{)oDL zq$((yc8iOPjJXs)RBJH;0k^O{lm0nQA81KVg(u)k~E>$+(9O1tFy z%A_niGgf=}UpY$PCMR{|Rx(UUUR((y-^ptT-I@5 zR?{f|oC2?6@p!!#{p6fN@B52S(R-f1DwTh5XKXVAE!3vAMEnEDRM{_6q+h1Gy)#9x zsddJawQkjkCm^I8tG$P#ZKS}u;pqLJ)?Zd5iRd+%h(969yL_=sz!L&dsX+g5gb8|Rqa~M>}fA}j14KZ|NoPvV400Q z-u^$q{vT)mpJM-?X8%vL|Lg7l^X&gw_W$MfKRbogJIDUN(*D27{-3M=&Ia*k2M^8q zIlm?R9^&^fzeo7B^Q)p&Px4&N?^%8u`MtvL4Sw(PGyFc`_c^~W`DKxQ0KY7_x#>4XTexFWN4^p-%Q}J%*&zs4bQxe z$h;i7fA8A?y>BBAJm}z2hxF<<(5gsUkgqBAJ zkpNfy1thxetu?t>$?(a!UZRG>J~Cco3PrNg8n7V}TU}<&YI|oCH+9ZRdQiB$ssNIRt>kd=_p_R|rY!T>%9#vq(0GC( zl2g(ZUC|RWNIH#rGC&@q7F-EbW-H3FJkr;KQ`+fBh4d)$c4=lsT>=638!B-YD_wN%_EPtR8r@2`~Wp#l9IgG zuKeqd={V7K)mfk}8F>RL`JS3DyH~RfO`4;Q7-pT3*a`uX)igGf=XmmDkTyZN9#pQ! z_sF#-Cu>brb`DHHnJwv0%Bl5l2)+v9lXBNo<#JE~s}dO|)YeUOgv&QASA4yxSnrf!dDic3+`W#g!Ncy=x0u=OHe#Jd zP5rpEDPL#lZ?vN?77^>r$pn?pE{MWK)}_160eo_L^&c6yyYKFU+mgEx+}Xgr7qY0p znbWE{;z$|XMG`kUvdk+17&I znzLs&!&~?6H>e`j=~X-zwE|Ru3w=wFsh~b0|Gh2Ik&~T2 zgAw>GT{CBjB~n{Wkt^^ws^$+t6N3Q>%39P`PQjlWbl1r)r!|^5(B+Jg(`!G2kDgH| zBZFfOw%58__n>FXtJRO7oat1QWseTn{&fB+KlqOAIcA9_Y0Jm-{N}s5`C6AU1p#-K zb4$}MZ9E16zuHeJw0{-^RM~*szJTu#V27CQt*Tkk{F$5ge4y;`Lpd!^XoBkVsQNx}Lp+U5EG?D}}* zj!m)mv!mZPB_Dm0<{UR7QiOe(pRTr3RPiN?wJWmTe#e?ivZI`qS&#H{HStJ4?|S~n z{?ktiM>{r$lMB)ZKhydS^<}qeg}A>L>Ui(qxr6;K@9@&pMMmPS$h$FZk0cct~( zx-e2SOgv#?eVsq2K;}&?WJ3emPUIseUlnSBSVXpk*CIg-+M|8PdxT8;A^|{D4yP$ z)8NSQOQ4PoHSq;`Q<9etHfNb{aPNh+JQ^WPOE#Kc6HwR4Y1F1;#8Uzh?DE?+=rqA} zMERGTw8Z@WR_7|}e$^PiZ~(`fRumJ5E;fw6FRZ8Hr{z=UKvi4-Dn(H_x)n{nF}I9+ z5m5H=N}t2So}6GczDD{%fv%O)TAifhvDQ5{x`z}{K@txgcJk)jPC`ua&mA^jlCIDDem)p;eOc%8_fUBLkIu9ptU48IAqu2Ou;#WYkZ0 zr>7)qjtI~^;lm7?tzQ&r=SXzeZTLmG6I)x5SrfmYWO8!mAx8kD7q2-y*nr*lDvZK! zva+Nf-zflDJnv(M;Dd*aT$vJW_hjF~X`OK&vkqm4a=|g!Gt(Sp^0aPED4+SL6UmLm zD=D>jEr?G}U&raQ4Xj(uliHc;Txj_&EJ3i{yI3UfE;)O4%7ZFuq82_P$!TmqY?zW< zlvPQgcRi>}=Qm43FjDk`^rXyJlNsyUaL?b!%Kf)%YVxy7of6z%>BY~&cXSbr9N@2v zt(4ZD_kpcns>G`;3~a)vn28pKFxB=%DTrdS_ODG&VTbuUVgDu(I~{w3F4mi1heyb3 z-KoK|V89wLJDaPE;`3NwcIDvOd}l#T>6`I0vg6sDYWgaixTv8vc~(9x>7F=?@>%aZ znND|4jO+_@2!e<-cQN5{8ViTMH$Ows9pMCD7!B z*%$EThXAWBd$z6?ATZ~`13^yeEIXuV-L_i>Tcev_(GEr!YqrUz=4Ly}Qs0kte&t!c z80KG%@LsVinXB50Yz?;b2?nO$yiovIgS5ps0L(JH&;9x zn)+-aZt>vcs?rzg8u7r1o1QzfJ8kPGH%D5#v@2vj`!7}Ycnj~?NZa~aWCc07z9W4q z@o#hULx#fdcc8wJv=lzD=WV`YkBb&_x~n6_MU;TiNOf~}Wg%f8k=N?Ft-N+u&v9st zaKr;AHkbrq&pmmzw!*5wpqIxwbwJ!3;IfZ(iL09v&1E*EMIxKZH2*q6ogr6;`0q+o zm-Xxi5G@O{b3=U>|K?UY5&H0_7@ zD4vGvL7{=5=wbSY1N4alAil1Syh=C%$|QO)Jh;Ru51|nM z_o4*$C7ReXwUkine+;T@s~0^J3DxwZtH-K|$9->C`gd7n3`N#;>r649SQ8DME5b1E z(ph3+4gTCn>+bKs?-!oey1STXC^?=A5VeZPNm#C)XSVJRDejizY@FtY(5-SEO<7!x z7d8)~5=PO9bax4%>UWY5)6gReB}$`t(L$c}4%-vrK zOCmAwIRvl19XUV?TmUkAYO7K#`EOS145z~ovTVSu3ZOS8hV0P;IwXFBP5;Xl`*=+44Gc7` zx^R;XUTmF zi7q{&*q2vhows>zp})>1@6mVZ=FC?e1@$i=lmGJ~$9^fGJb_Gu7-PBM&BgRXziOqU z9pTrql#Wlz>DpPuqt)y|0jX?jHW0bHi0OlWU;zKW$};fJvhZUc6u^H`(@7m4 zJNSRz)~DaxDL$pWNz*0`ou_PAkQ?wCe}BcQUaY^ojq0VNU$r`c+T715>d0jM#SDrXI>ntY zsTWCkIgr%x3v8$KNPmu^ARNEQZe~?#cuqt^5!^U9I}DdAi+xjkO=)HPihTcRJQ|Y( z=7vS*fcQjKsdw1M#8yU3_6f8q_ls2Fnu&S9m=7=Lw(AZng><(prY;bYFGUL0WTV=e*6iQ#R}#i{7F}K1@mt=&;uSaa z4bA(7M@hP-=Q>B+=!NmQ*}Ae_i81g_cbQMA%dWAiBOcZGaTOUr%$Ct)!3?)7JHMv{ zz(r$~Sb*J4B6A1M$zkYFP`w4vQc%QihJxNDKGNtlcf2rKgrAxDV${1~3@kTqsC!TKdxm;(%2#T-d@FCnSFU!;+B3yKC2Ho`t? z0Nw7eK>}R*Mb?5SZ#xDAg*zWA6Ga0U-Hk(3{TihmH7l3W1?bcdN$9UZtMGAjJgz}izP6Y)$1C86}(omUmkPss0J+ccUL!PHub9` z6I4d1O?ra~LT6~v140nXpGc-6v-3THamSqA2>`!`rYt97MV zglYYdxa2u(4p5jb#h60?TV;0eV~Q#`YyH?#9t>Q!1ht=Vfqz4MXIPB8Jg_gU( zxSUr7*bB(9P9+6E2+%2hZGl-;jzbuInOXrHKomv^rlPqWs306izW(>Z2~so2poD#O z<*ucNrxg(dbt*;ah79kre87BXj1cE2J%Ufnw3>cxmITL^#|4Xt2$%{hlndyti@5~MLlzm)G6n@ z1JQ;4H>IN{=e*G=`JuL3Ns4{+c+GhmOyR+>6y=7cl+gw*4TYs#B9`(qv6Sns>6Ij0 z!LBY+4+~m+uWhk%oo7xbbzS2{a7qmi4r?D=Q;H&UgSogQsD=-F7^fG`b+k!pQLW+l zCzA&Da|mHB+Tbr$r$ibjHlXn48b<%k(#^WIV1J6MSatmfaonKk<^~GtS)`WqDtE66fah#SaK6{FYd}C0&t!;V$4Hv0BI)MI z^VQU)bnk2t#YQ#t2TcJ{^cIpyeJrV!>}8U1L6EC8AZPi2N0h7m;rA{dX+kEw|$n~^mgE& z)vpT2b{1cQTe{P;C9_C|8^qoyLGn%6w0ℜpu% zlQn~TjsyqhkCq2w!ilO%f(8EGq;)vzHyS9RHm#`K0?)LS>`s^48^xoCW_F|waYfcr zq}P5UX?tGapDB;3MZS>i$FAc)jt~{zHCnoRnZY*|#GX(0Xo15FVy8bpuHJEM_~^rx z&W3C6FkvnFndvy)L9b3MGBeIn)3(&1Wu&YFgvt{gDC?UAioj0Q#>Nkb+PHETx6;PF zsJLST4el^u$m&nvc{SkBkR@}Q* zllIxu1&OxzqL=oz^DGDWm)8gf>WS1zzAV}O$;HkYIA;+U9>u1;ai`Uc&a>t}GhMcq zY&PDrI-cO4H83%!U#WW5nf+;DYP5}jg~UmkF+j-^%2*g?nb9__U0(kvSU))J-X0bo z@}KXx<)`Uv&6b)b$8ASUFSa~$HdDo}&>~T%7&} z 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≺4iR}q4+>ie(=(wv`b+}uscR|RN-E$oPD*}s97JM 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%0D#7b3j4c7xvM`We;ba=x^|X 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≷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 literal 0 HcmV?d00001 diff --git a/psycopg2/_range.py b/psycopg2/_range.py new file mode 100644 index 0000000..0f15990 --- /dev/null +++ b/psycopg2/_range.py @@ -0,0 +1,470 @@ +"""Implementation of the Range type and adaptation + +""" + +# psycopg/_range.py - Implementation of the Range type and adaptation +# +# Copyright (C) 2012 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import re + +from psycopg2._psycopg import ProgrammingError, InterfaceError +from psycopg2.extensions import ISQLQuote, adapt, register_adapter, b +from psycopg2.extensions import new_type, new_array_type, register_type + +class Range(object): + """Python representation for a PostgreSQL |range|_ type. + + :param lower: lower bound for the range. `!None` means unbound + :param upper: upper bound for the range. `!None` means unbound + :param bounds: one of the literal strings ``()``, ``[)``, ``(]``, ``[]``, + representing whether the lower or upper bounds are included + :param empty: if `!True`, the range is empty + + """ + __slots__ = ('_lower', '_upper', '_bounds') + + def __init__(self, lower=None, upper=None, bounds='[)', empty=False): + if not empty: + if bounds not in ('[)', '(]', '()', '[]'): + raise ValueError("bound flags not valid: %r" % bounds) + + self._lower = lower + self._upper = upper + self._bounds = bounds + else: + self._lower = self._upper = self._bounds = None + + def __repr__(self): + if self._bounds is None: + return "%s(empty=True)" % self.__class__.__name__ + else: + return "%s(%r, %r, %r)" % (self.__class__.__name__, + self._lower, self._upper, self._bounds) + + @property + def lower(self): + """The lower bound of the range. `!None` if empty or unbound.""" + return self._lower + + @property + def upper(self): + """The upper bound of the range. `!None` if empty or unbound.""" + return self._upper + + @property + def isempty(self): + """`!True` if the range is empty.""" + return self._bounds is None + + @property + def lower_inf(self): + """`!True` if the range doesn't have a lower bound.""" + if self._bounds is None: return False + return self._lower is None + + @property + def upper_inf(self): + """`!True` if the range doesn't have an upper bound.""" + if self._bounds is None: return False + return self._upper is None + + @property + def lower_inc(self): + """`!True` if the lower bound is included in the range.""" + if self._bounds is None: return False + if self._lower is None: return False + return self._bounds[0] == '[' + + @property + def upper_inc(self): + """`!True` if the upper bound is included in the range.""" + if self._bounds is None: return False + if self._upper is None: return False + return self._bounds[1] == ']' + + def __contains__(self, x): + if self._bounds is None: return False + if self._lower is not None: + if self._bounds[0] == '[': + if x < self._lower: return False + else: + if x <= self._lower: return False + + if self._upper is not None: + if self._bounds[1] == ']': + if x > self._upper: return False + else: + if x >= self._upper: return False + + return True + + def __nonzero__(self): + return self._bounds is not None + + def __eq__(self, other): + if not isinstance(other, Range): + return False + return (self._lower == other._lower + and self._upper == other._upper + and self._bounds == other._bounds) + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash((self._lower, self._upper, self._bounds)) + + def __lt__(self, other): + raise TypeError( + 'Range objects cannot be ordered; please refer to the PostgreSQL' + ' documentation to perform this operation in the database') + + __le__ = __gt__ = __ge__ = __lt__ + + +def register_range(pgrange, pyrange, conn_or_curs, globally=False): + """Create and register an adapter and the typecasters to convert between + a PostgreSQL |range|_ type and a PostgreSQL `Range` subclass. + + :param pgrange: the name of the PostgreSQL |range| type. Can be + schema-qualified + :param pyrange: a `Range` strict subclass, or just a name to give to a new + class + :param conn_or_curs: a connection or cursor used to find the oid of the + range and its subtype; the typecaster is registered in a scope limited + to this object, unless *globally* is set to `!True` + :param globally: if `!False` (default) register the typecaster only on + *conn_or_curs*, otherwise register it globally + :return: `RangeCaster` instance responsible for the conversion + + If a string is passed to *pyrange*, a new `Range` subclass is created + with such name and will be available as the `~RangeCaster.range` attribute + of the returned `RangeCaster` object. + + The function queries the database on *conn_or_curs* to inspect the + *pgrange* type and raises `~psycopg2.ProgrammingError` if the type is not + found. If querying the database is not advisable, use directly the + `RangeCaster` class and register the adapter and typecasters using the + provided functions. + + """ + caster = RangeCaster._from_db(pgrange, pyrange, conn_or_curs) + caster._register(not globally and conn_or_curs or None) + return caster + + +class RangeAdapter(object): + """`ISQLQuote` adapter for `Range` subclasses. + + This is an abstract class: concrete classes must set a `name` class + attribute or override `getquoted()`. + """ + name = None + + def __init__(self, adapted): + self.adapted = adapted + + def __conform__(self, proto): + if self._proto is ISQLQuote: + return self + + def prepare(self, conn): + self._conn = conn + + def getquoted(self): + if self.name is None: + raise NotImplementedError( + 'RangeAdapter must be subclassed overriding its name ' + 'or the getquoted() method') + + r = self.adapted + if r.isempty: + return b("'empty'::" + self.name) + + if r.lower is not None: + a = adapt(r.lower) + if hasattr(a, 'prepare'): + a.prepare(self._conn) + lower = a.getquoted() + else: + lower = b('NULL') + + if r.upper is not None: + a = adapt(r.upper) + if hasattr(a, 'prepare'): + a.prepare(self._conn) + upper = a.getquoted() + else: + upper = b('NULL') + + return b(self.name + '(') + lower + b(', ') + upper \ + + b(", '%s')" % r._bounds) + + +class RangeCaster(object): + """Helper class to convert between `Range` and PostgreSQL range types. + + Objects of this class are usually created by `register_range()`. Manual + creation could be useful if querying the database is not advisable: in + this case the oids must be provided. + """ + def __init__(self, pgrange, pyrange, oid, subtype_oid, array_oid=None): + self.subtype_oid = subtype_oid + self._create_ranges(pgrange, pyrange) + + name = self.adapter.name or self.adapter.__class__.__name__ + + self.typecaster = new_type((oid,), name, self.parse) + + if array_oid is not None: + self.array_typecaster = new_array_type( + (array_oid,), name + "ARRAY", self.typecaster) + else: + self.array_typecaster = None + + def _create_ranges(self, pgrange, pyrange): + """Create Range and RangeAdapter classes if needed.""" + # if got a string create a new RangeAdapter concrete type (with a name) + # else take it as an adapter. Passing an adapter should be considered + # an implementation detail and is not documented. It is currently used + # for the numeric ranges. + self.adapter = None + if isinstance(pgrange, basestring): + self.adapter = type(pgrange, (RangeAdapter,), {}) + self.adapter.name = pgrange + else: + try: + if issubclass(pgrange, RangeAdapter) and pgrange is not RangeAdapter: + self.adapter = pgrange + except TypeError: + pass + + if self.adapter is None: + raise TypeError( + 'pgrange must be a string or a RangeAdapter strict subclass') + + self.range = None + try: + if isinstance(pyrange, basestring): + self.range = type(pyrange, (Range,), {}) + if issubclass(pyrange, Range) and pyrange is not Range: + self.range = pyrange + except TypeError: + pass + + if self.range is None: + raise TypeError( + 'pyrange must be a type or a Range strict subclass') + + @classmethod + def _from_db(self, name, pyrange, conn_or_curs): + """Return a `RangeCaster` instance for the type *pgrange*. + + Raise `ProgrammingError` if the type is not found. + """ + from psycopg2.extensions import STATUS_IN_TRANSACTION + from psycopg2.extras import _solve_conn_curs + conn, curs = _solve_conn_curs(conn_or_curs) + + if conn.server_version < 90200: + raise ProgrammingError("range types not available in version %s" + % conn.server_version) + + # Store the transaction status of the connection to revert it after use + conn_status = conn.status + + # Use the correct schema + if '.' in name: + schema, tname = name.split('.', 1) + else: + tname = name + schema = 'public' + + # get the type oid and attributes + try: + curs.execute("""\ +select rngtypid, rngsubtype, + (select typarray from pg_type where oid = rngtypid) +from pg_range r +join pg_type t on t.oid = rngtypid +join pg_namespace ns on ns.oid = typnamespace +where typname = %s and ns.nspname = %s; +""", (tname, schema)) + + except ProgrammingError: + if not conn.autocommit: + conn.rollback() + raise + else: + rec = curs.fetchone() + + # revert the status of the connection as before the command + if (conn_status != STATUS_IN_TRANSACTION + and not conn.autocommit): + conn.rollback() + + if not rec: + raise ProgrammingError( + "PostgreSQL type '%s' not found" % name) + + type, subtype, array = rec + + return RangeCaster(name, pyrange, + oid=type, subtype_oid=subtype, array_oid=array) + + _re_range = re.compile(r""" + ( \(|\[ ) # lower bound flag + (?: # lower bound: + " ( (?: [^"] | "")* ) " # - a quoted string + | ( [^",]+ ) # - or an unquoted string + )? # - or empty (not catched) + , + (?: # upper bound: + " ( (?: [^"] | "")* ) " # - a quoted string + | ( [^"\)\]]+ ) # - or an unquoted string + )? # - or empty (not catched) + ( \)|\] ) # upper bound flag + """, re.VERBOSE) + + _re_undouble = re.compile(r'(["\\])\1') + + def parse(self, s, cur=None): + if s is None: + return None + + if s == 'empty': + return self.range(empty=True) + + m = self._re_range.match(s) + if m is None: + raise InterfaceError("failed to parse range: %s") + + lower = m.group(3) + if lower is None: + lower = m.group(2) + if lower is not None: + lower = self._re_undouble.sub(r"\1", lower) + + upper = m.group(5) + if upper is None: + upper = m.group(4) + if upper is not None: + upper = self._re_undouble.sub(r"\1", upper) + + if cur is not None: + lower = cur.cast(self.subtype_oid, lower) + upper = cur.cast(self.subtype_oid, upper) + + bounds = m.group(1) + m.group(6) + + return self.range(lower, upper, bounds) + + def _register(self, scope=None): + register_type(self.typecaster, scope) + if self.array_typecaster is not None: + register_type(self.array_typecaster, scope) + + register_adapter(self.range, self.adapter) + + +class NumericRange(Range): + """A `Range` suitable to pass Python numeric types to a PostgreSQL range. + + PostgreSQL types :sql:`int4range`, :sql:`int8range`, :sql:`numrange` are + casted into `!NumericRange` instances. + """ + pass + +class DateRange(Range): + """Represents :sql:`daterange` values.""" + pass + +class DateTimeRange(Range): + """Represents :sql:`tsrange` values.""" + pass + +class DateTimeTZRange(Range): + """Represents :sql:`tstzrange` values.""" + pass + + +# Special adaptation for NumericRange. Allows to pass number range regardless +# of whether they are ints, floats and what size of ints are, which are +# pointless in Python world. On the way back, no numeric range is casted to +# NumericRange, but only to their subclasses + +class NumberRangeAdapter(RangeAdapter): + """Adapt a range if the subtype doesn't need quotes.""" + def getquoted(self): + r = self.adapted + if r.isempty: + return b("'empty'") + + if not r.lower_inf: + # not exactly: we are relying that none of these object is really + # quoted (they are numbers). Also, I'm lazy and not preparing the + # adapter because I assume encoding doesn't matter for these + # objects. + lower = adapt(r.lower).getquoted().decode('ascii') + else: + lower = '' + + if not r.upper_inf: + upper = adapt(r.upper).getquoted().decode('ascii') + else: + upper = '' + + return ("'%s%s,%s%s'" % ( + r._bounds[0], lower, upper, r._bounds[1])).encode('ascii') + +# TODO: probably won't work with infs, nans and other tricky cases. +register_adapter(NumericRange, NumberRangeAdapter) + + +# Register globally typecasters and adapters for builtin range types. + +# note: the adapter is registered more than once, but this is harmless. +int4range_caster = RangeCaster(NumberRangeAdapter, NumericRange, + oid=3904, subtype_oid=23, array_oid=3905) +int4range_caster._register() + +int8range_caster = RangeCaster(NumberRangeAdapter, NumericRange, + oid=3926, subtype_oid=20, array_oid=3927) +int8range_caster._register() + +numrange_caster = RangeCaster(NumberRangeAdapter, NumericRange, + oid=3906, subtype_oid=1700, array_oid=3907) +numrange_caster._register() + +daterange_caster = RangeCaster('daterange', DateRange, + oid=3912, subtype_oid=1082, array_oid=3913) +daterange_caster._register() + +tsrange_caster = RangeCaster('tsrange', DateTimeRange, + oid=3908, subtype_oid=1114, array_oid=3909) +tsrange_caster._register() + +tstzrange_caster = RangeCaster('tstzrange', DateTimeTZRange, + oid=3910, subtype_oid=1184, array_oid=3911) +tstzrange_caster._register() + + diff --git a/psycopg2/errorcodes.py b/psycopg2/errorcodes.py new file mode 100644 index 0000000..12c300f --- /dev/null +++ b/psycopg2/errorcodes.py @@ -0,0 +1,409 @@ +"""Error codes for PostgresSQL + +This module contains symbolic names for all PostgreSQL error codes. +""" +# psycopg2/errorcodes.py - PostgreSQL error codes +# +# Copyright (C) 2006-2010 Johan Dahlin +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. +# +# Based on: +# +# http://www.postgresql.org/docs/current/static/errcodes-appendix.html +# + +def lookup(code, _cache={}): + """Lookup an error code or class code and return its symbolic name. + + Raise `KeyError` if the code is not found. + """ + if _cache: + return _cache[code] + + # Generate the lookup map at first usage. + for k, v in globals().iteritems(): + if isinstance(v, str) and len(v) in (2, 5): + _cache[v] = k + + return lookup(code) + + +# autogenerated data: do not edit below this point. + +# Error classes +CLASS_SUCCESSFUL_COMPLETION = '00' +CLASS_WARNING = '01' +CLASS_NO_DATA = '02' +CLASS_SQL_STATEMENT_NOT_YET_COMPLETE = '03' +CLASS_CONNECTION_EXCEPTION = '08' +CLASS_TRIGGERED_ACTION_EXCEPTION = '09' +CLASS_FEATURE_NOT_SUPPORTED = '0A' +CLASS_INVALID_TRANSACTION_INITIATION = '0B' +CLASS_LOCATOR_EXCEPTION = '0F' +CLASS_INVALID_GRANTOR = '0L' +CLASS_INVALID_ROLE_SPECIFICATION = '0P' +CLASS_DIAGNOSTICS_EXCEPTION = '0Z' +CLASS_CASE_NOT_FOUND = '20' +CLASS_CARDINALITY_VIOLATION = '21' +CLASS_DATA_EXCEPTION = '22' +CLASS_INTEGRITY_CONSTRAINT_VIOLATION = '23' +CLASS_INVALID_CURSOR_STATE = '24' +CLASS_INVALID_TRANSACTION_STATE = '25' +CLASS_INVALID_SQL_STATEMENT_NAME = '26' +CLASS_TRIGGERED_DATA_CHANGE_VIOLATION = '27' +CLASS_INVALID_AUTHORIZATION_SPECIFICATION = '28' +CLASS_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST = '2B' +CLASS_INVALID_TRANSACTION_TERMINATION = '2D' +CLASS_SQL_ROUTINE_EXCEPTION = '2F' +CLASS_INVALID_CURSOR_NAME = '34' +CLASS_EXTERNAL_ROUTINE_EXCEPTION = '38' +CLASS_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION = '39' +CLASS_SAVEPOINT_EXCEPTION = '3B' +CLASS_INVALID_CATALOG_NAME = '3D' +CLASS_INVALID_SCHEMA_NAME = '3F' +CLASS_TRANSACTION_ROLLBACK = '40' +CLASS_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = '42' +CLASS_WITH_CHECK_OPTION_VIOLATION = '44' +CLASS_INSUFFICIENT_RESOURCES = '53' +CLASS_PROGRAM_LIMIT_EXCEEDED = '54' +CLASS_OBJECT_NOT_IN_PREREQUISITE_STATE = '55' +CLASS_OPERATOR_INTERVENTION = '57' +CLASS_SYSTEM_ERROR = '58' +CLASS_CONFIGURATION_FILE_ERROR = 'F0' +CLASS_FOREIGN_DATA_WRAPPER_ERROR = 'HV' +CLASS_PL_PGSQL_ERROR = 'P0' +CLASS_INTERNAL_ERROR = 'XX' + +# Class 00 - Successful Completion +SUCCESSFUL_COMPLETION = '00000' + +# Class 01 - Warning +WARNING = '01000' +NULL_VALUE_ELIMINATED_IN_SET_FUNCTION = '01003' +STRING_DATA_RIGHT_TRUNCATION = '01004' +PRIVILEGE_NOT_REVOKED = '01006' +PRIVILEGE_NOT_GRANTED = '01007' +IMPLICIT_ZERO_BIT_PADDING = '01008' +DYNAMIC_RESULT_SETS_RETURNED = '0100C' +DEPRECATED_FEATURE = '01P01' + +# Class 02 - No Data (this is also a warning class per the SQL standard) +NO_DATA = '02000' +NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED = '02001' + +# Class 03 - SQL Statement Not Yet Complete +SQL_STATEMENT_NOT_YET_COMPLETE = '03000' + +# Class 08 - Connection Exception +CONNECTION_EXCEPTION = '08000' +SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION = '08001' +CONNECTION_DOES_NOT_EXIST = '08003' +SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION = '08004' +CONNECTION_FAILURE = '08006' +TRANSACTION_RESOLUTION_UNKNOWN = '08007' +PROTOCOL_VIOLATION = '08P01' + +# Class 09 - Triggered Action Exception +TRIGGERED_ACTION_EXCEPTION = '09000' + +# Class 0A - Feature Not Supported +FEATURE_NOT_SUPPORTED = '0A000' + +# Class 0B - Invalid Transaction Initiation +INVALID_TRANSACTION_INITIATION = '0B000' + +# Class 0F - Locator Exception +LOCATOR_EXCEPTION = '0F000' +INVALID_LOCATOR_SPECIFICATION = '0F001' + +# Class 0L - Invalid Grantor +INVALID_GRANTOR = '0L000' +INVALID_GRANT_OPERATION = '0LP01' + +# Class 0P - Invalid Role Specification +INVALID_ROLE_SPECIFICATION = '0P000' + +# Class 0Z - Diagnostics Exception +DIAGNOSTICS_EXCEPTION = '0Z000' +STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER = '0Z002' + +# Class 20 - Case Not Found +CASE_NOT_FOUND = '20000' + +# Class 21 - Cardinality Violation +CARDINALITY_VIOLATION = '21000' + +# Class 22 - Data Exception +DATA_EXCEPTION = '22000' +STRING_DATA_RIGHT_TRUNCATION = '22001' +NULL_VALUE_NO_INDICATOR_PARAMETER = '22002' +NUMERIC_VALUE_OUT_OF_RANGE = '22003' +NULL_VALUE_NOT_ALLOWED = '22004' +ERROR_IN_ASSIGNMENT = '22005' +INVALID_DATETIME_FORMAT = '22007' +DATETIME_FIELD_OVERFLOW = '22008' +INVALID_TIME_ZONE_DISPLACEMENT_VALUE = '22009' +ESCAPE_CHARACTER_CONFLICT = '2200B' +INVALID_USE_OF_ESCAPE_CHARACTER = '2200C' +INVALID_ESCAPE_OCTET = '2200D' +ZERO_LENGTH_CHARACTER_STRING = '2200F' +MOST_SPECIFIC_TYPE_MISMATCH = '2200G' +NOT_AN_XML_DOCUMENT = '2200L' +INVALID_XML_DOCUMENT = '2200M' +INVALID_XML_CONTENT = '2200N' +INVALID_XML_COMMENT = '2200S' +INVALID_XML_PROCESSING_INSTRUCTION = '2200T' +INVALID_INDICATOR_PARAMETER_VALUE = '22010' +SUBSTRING_ERROR = '22011' +DIVISION_BY_ZERO = '22012' +INVALID_ARGUMENT_FOR_NTILE_FUNCTION = '22014' +INTERVAL_FIELD_OVERFLOW = '22015' +INVALID_ARGUMENT_FOR_NTH_VALUE_FUNCTION = '22016' +INVALID_CHARACTER_VALUE_FOR_CAST = '22018' +INVALID_ESCAPE_CHARACTER = '22019' +INVALID_REGULAR_EXPRESSION = '2201B' +INVALID_ARGUMENT_FOR_LOGARITHM = '2201E' +INVALID_ARGUMENT_FOR_POWER_FUNCTION = '2201F' +INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION = '2201G' +INVALID_ROW_COUNT_IN_LIMIT_CLAUSE = '2201W' +INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE = '2201X' +INVALID_LIMIT_VALUE = '22020' +CHARACTER_NOT_IN_REPERTOIRE = '22021' +INDICATOR_OVERFLOW = '22022' +INVALID_PARAMETER_VALUE = '22023' +UNTERMINATED_C_STRING = '22024' +INVALID_ESCAPE_SEQUENCE = '22025' +STRING_DATA_LENGTH_MISMATCH = '22026' +TRIM_ERROR = '22027' +ARRAY_SUBSCRIPT_ERROR = '2202E' +FLOATING_POINT_EXCEPTION = '22P01' +INVALID_TEXT_REPRESENTATION = '22P02' +INVALID_BINARY_REPRESENTATION = '22P03' +BAD_COPY_FILE_FORMAT = '22P04' +UNTRANSLATABLE_CHARACTER = '22P05' +NONSTANDARD_USE_OF_ESCAPE_CHARACTER = '22P06' + +# Class 23 - Integrity Constraint Violation +INTEGRITY_CONSTRAINT_VIOLATION = '23000' +RESTRICT_VIOLATION = '23001' +NOT_NULL_VIOLATION = '23502' +FOREIGN_KEY_VIOLATION = '23503' +UNIQUE_VIOLATION = '23505' +CHECK_VIOLATION = '23514' +EXCLUSION_VIOLATION = '23P01' + +# Class 24 - Invalid Cursor State +INVALID_CURSOR_STATE = '24000' + +# Class 25 - Invalid Transaction State +INVALID_TRANSACTION_STATE = '25000' +ACTIVE_SQL_TRANSACTION = '25001' +BRANCH_TRANSACTION_ALREADY_ACTIVE = '25002' +INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION = '25003' +INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION = '25004' +NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION = '25005' +READ_ONLY_SQL_TRANSACTION = '25006' +SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED = '25007' +HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL = '25008' +NO_ACTIVE_SQL_TRANSACTION = '25P01' +IN_FAILED_SQL_TRANSACTION = '25P02' + +# Class 26 - Invalid SQL Statement Name +INVALID_SQL_STATEMENT_NAME = '26000' + +# Class 27 - Triggered Data Change Violation +TRIGGERED_DATA_CHANGE_VIOLATION = '27000' + +# Class 28 - Invalid Authorization Specification +INVALID_AUTHORIZATION_SPECIFICATION = '28000' +INVALID_PASSWORD = '28P01' + +# Class 2B - Dependent Privilege Descriptors Still Exist +DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST = '2B000' +DEPENDENT_OBJECTS_STILL_EXIST = '2BP01' + +# Class 2D - Invalid Transaction Termination +INVALID_TRANSACTION_TERMINATION = '2D000' + +# Class 2F - SQL Routine Exception +SQL_ROUTINE_EXCEPTION = '2F000' +MODIFYING_SQL_DATA_NOT_PERMITTED = '2F002' +PROHIBITED_SQL_STATEMENT_ATTEMPTED = '2F003' +READING_SQL_DATA_NOT_PERMITTED = '2F004' +FUNCTION_EXECUTED_NO_RETURN_STATEMENT = '2F005' + +# Class 34 - Invalid Cursor Name +INVALID_CURSOR_NAME = '34000' + +# Class 38 - External Routine Exception +EXTERNAL_ROUTINE_EXCEPTION = '38000' +CONTAINING_SQL_NOT_PERMITTED = '38001' +MODIFYING_SQL_DATA_NOT_PERMITTED = '38002' +PROHIBITED_SQL_STATEMENT_ATTEMPTED = '38003' +READING_SQL_DATA_NOT_PERMITTED = '38004' + +# Class 39 - External Routine Invocation Exception +EXTERNAL_ROUTINE_INVOCATION_EXCEPTION = '39000' +INVALID_SQLSTATE_RETURNED = '39001' +NULL_VALUE_NOT_ALLOWED = '39004' +TRIGGER_PROTOCOL_VIOLATED = '39P01' +SRF_PROTOCOL_VIOLATED = '39P02' + +# Class 3B - Savepoint Exception +SAVEPOINT_EXCEPTION = '3B000' +INVALID_SAVEPOINT_SPECIFICATION = '3B001' + +# Class 3D - Invalid Catalog Name +INVALID_CATALOG_NAME = '3D000' + +# Class 3F - Invalid Schema Name +INVALID_SCHEMA_NAME = '3F000' + +# Class 40 - Transaction Rollback +TRANSACTION_ROLLBACK = '40000' +SERIALIZATION_FAILURE = '40001' +TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION = '40002' +STATEMENT_COMPLETION_UNKNOWN = '40003' +DEADLOCK_DETECTED = '40P01' + +# Class 42 - Syntax Error or Access Rule Violation +SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = '42000' +INSUFFICIENT_PRIVILEGE = '42501' +SYNTAX_ERROR = '42601' +INVALID_NAME = '42602' +INVALID_COLUMN_DEFINITION = '42611' +NAME_TOO_LONG = '42622' +DUPLICATE_COLUMN = '42701' +AMBIGUOUS_COLUMN = '42702' +UNDEFINED_COLUMN = '42703' +UNDEFINED_OBJECT = '42704' +DUPLICATE_OBJECT = '42710' +DUPLICATE_ALIAS = '42712' +DUPLICATE_FUNCTION = '42723' +AMBIGUOUS_FUNCTION = '42725' +GROUPING_ERROR = '42803' +DATATYPE_MISMATCH = '42804' +WRONG_OBJECT_TYPE = '42809' +INVALID_FOREIGN_KEY = '42830' +CANNOT_COERCE = '42846' +UNDEFINED_FUNCTION = '42883' +RESERVED_NAME = '42939' +UNDEFINED_TABLE = '42P01' +UNDEFINED_PARAMETER = '42P02' +DUPLICATE_CURSOR = '42P03' +DUPLICATE_DATABASE = '42P04' +DUPLICATE_PREPARED_STATEMENT = '42P05' +DUPLICATE_SCHEMA = '42P06' +DUPLICATE_TABLE = '42P07' +AMBIGUOUS_PARAMETER = '42P08' +AMBIGUOUS_ALIAS = '42P09' +INVALID_COLUMN_REFERENCE = '42P10' +INVALID_CURSOR_DEFINITION = '42P11' +INVALID_DATABASE_DEFINITION = '42P12' +INVALID_FUNCTION_DEFINITION = '42P13' +INVALID_PREPARED_STATEMENT_DEFINITION = '42P14' +INVALID_SCHEMA_DEFINITION = '42P15' +INVALID_TABLE_DEFINITION = '42P16' +INVALID_OBJECT_DEFINITION = '42P17' +INDETERMINATE_DATATYPE = '42P18' +INVALID_RECURSION = '42P19' +WINDOWING_ERROR = '42P20' +COLLATION_MISMATCH = '42P21' +INDETERMINATE_COLLATION = '42P22' + +# Class 44 - WITH CHECK OPTION Violation +WITH_CHECK_OPTION_VIOLATION = '44000' + +# Class 53 - Insufficient Resources +INSUFFICIENT_RESOURCES = '53000' +DISK_FULL = '53100' +OUT_OF_MEMORY = '53200' +TOO_MANY_CONNECTIONS = '53300' +CONFIGURATION_LIMIT_EXCEEDED = '53400' + +# Class 54 - Program Limit Exceeded +PROGRAM_LIMIT_EXCEEDED = '54000' +STATEMENT_TOO_COMPLEX = '54001' +TOO_MANY_COLUMNS = '54011' +TOO_MANY_ARGUMENTS = '54023' + +# Class 55 - Object Not In Prerequisite State +OBJECT_NOT_IN_PREREQUISITE_STATE = '55000' +OBJECT_IN_USE = '55006' +CANT_CHANGE_RUNTIME_PARAM = '55P02' +LOCK_NOT_AVAILABLE = '55P03' + +# Class 57 - Operator Intervention +OPERATOR_INTERVENTION = '57000' +QUERY_CANCELED = '57014' +ADMIN_SHUTDOWN = '57P01' +CRASH_SHUTDOWN = '57P02' +CANNOT_CONNECT_NOW = '57P03' +DATABASE_DROPPED = '57P04' + +# Class 58 - System Error (errors external to PostgreSQL itself) +SYSTEM_ERROR = '58000' +IO_ERROR = '58030' +UNDEFINED_FILE = '58P01' +DUPLICATE_FILE = '58P02' + +# Class F0 - Configuration File Error +CONFIG_FILE_ERROR = 'F0000' +LOCK_FILE_EXISTS = 'F0001' + +# Class HV - Foreign Data Wrapper Error (SQL/MED) +FDW_ERROR = 'HV000' +FDW_OUT_OF_MEMORY = 'HV001' +FDW_DYNAMIC_PARAMETER_VALUE_NEEDED = 'HV002' +FDW_INVALID_DATA_TYPE = 'HV004' +FDW_COLUMN_NAME_NOT_FOUND = 'HV005' +FDW_INVALID_DATA_TYPE_DESCRIPTORS = 'HV006' +FDW_INVALID_COLUMN_NAME = 'HV007' +FDW_INVALID_COLUMN_NUMBER = 'HV008' +FDW_INVALID_USE_OF_NULL_POINTER = 'HV009' +FDW_INVALID_STRING_FORMAT = 'HV00A' +FDW_INVALID_HANDLE = 'HV00B' +FDW_INVALID_OPTION_INDEX = 'HV00C' +FDW_INVALID_OPTION_NAME = 'HV00D' +FDW_OPTION_NAME_NOT_FOUND = 'HV00J' +FDW_REPLY_HANDLE = 'HV00K' +FDW_UNABLE_TO_CREATE_EXECUTION = 'HV00L' +FDW_UNABLE_TO_CREATE_REPLY = 'HV00M' +FDW_UNABLE_TO_ESTABLISH_CONNECTION = 'HV00N' +FDW_NO_SCHEMAS = 'HV00P' +FDW_SCHEMA_NOT_FOUND = 'HV00Q' +FDW_TABLE_NOT_FOUND = 'HV00R' +FDW_FUNCTION_SEQUENCE_ERROR = 'HV010' +FDW_TOO_MANY_HANDLES = 'HV014' +FDW_INCONSISTENT_DESCRIPTOR_INFORMATION = 'HV021' +FDW_INVALID_ATTRIBUTE_VALUE = 'HV024' +FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH = 'HV090' +FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER = 'HV091' + +# Class P0 - PL/pgSQL Error +PLPGSQL_ERROR = 'P0000' +RAISE_EXCEPTION = 'P0001' +NO_DATA_FOUND = 'P0002' +TOO_MANY_ROWS = 'P0003' + +# Class XX - Internal Error +INTERNAL_ERROR = 'XX000' +DATA_CORRUPTED = 'XX001' +INDEX_CORRUPTED = 'XX002' diff --git a/psycopg2/extensions.py b/psycopg2/extensions.py new file mode 100644 index 0000000..f210da4 --- /dev/null +++ b/psycopg2/extensions.py @@ -0,0 +1,177 @@ +"""psycopg extensions to the DBAPI-2.0 + +This module holds all the extensions to the DBAPI-2.0 provided by psycopg. + +- `connection` -- the new-type inheritable connection class +- `cursor` -- the new-type inheritable cursor class +- `lobject` -- the new-type inheritable large object class +- `adapt()` -- exposes the PEP-246_ compatible adapting mechanism used + by psycopg to adapt Python types to PostgreSQL ones + +.. _PEP-246: http://www.python.org/peps/pep-0246.html +""" +# psycopg/extensions.py - DBAPI-2.0 extensions specific to psycopg +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +from psycopg2._psycopg import UNICODE, INTEGER, LONGINTEGER, BOOLEAN, FLOAT +from psycopg2._psycopg import TIME, DATE, INTERVAL, DECIMAL +from psycopg2._psycopg import BINARYARRAY, BOOLEANARRAY, DATEARRAY, DATETIMEARRAY +from psycopg2._psycopg import DECIMALARRAY, FLOATARRAY, INTEGERARRAY, INTERVALARRAY +from psycopg2._psycopg import LONGINTEGERARRAY, ROWIDARRAY, STRINGARRAY, TIMEARRAY +from psycopg2._psycopg import UNICODEARRAY + +from psycopg2._psycopg import Binary, Boolean, Int, Float, QuotedString, AsIs +try: + from psycopg2._psycopg import MXDATE, MXDATETIME, MXINTERVAL, MXTIME + from psycopg2._psycopg import MXDATEARRAY, MXDATETIMEARRAY, MXINTERVALARRAY, MXTIMEARRAY + from psycopg2._psycopg import DateFromMx, TimeFromMx, TimestampFromMx + from psycopg2._psycopg import IntervalFromMx +except ImportError: + pass + +try: + from psycopg2._psycopg import PYDATE, PYDATETIME, PYINTERVAL, PYTIME + from psycopg2._psycopg import PYDATEARRAY, PYDATETIMEARRAY, PYINTERVALARRAY, PYTIMEARRAY + from psycopg2._psycopg import DateFromPy, TimeFromPy, TimestampFromPy + from psycopg2._psycopg import IntervalFromPy +except ImportError: + pass + +from psycopg2._psycopg import adapt, adapters, encodings, connection, cursor, lobject, Xid +from psycopg2._psycopg import string_types, binary_types, new_type, new_array_type, register_type +from psycopg2._psycopg import ISQLQuote, Notify, Diagnostics + +from psycopg2._psycopg import QueryCanceledError, TransactionRollbackError + +try: + from psycopg2._psycopg import set_wait_callback, get_wait_callback +except ImportError: + pass + +"""Isolation level values.""" +ISOLATION_LEVEL_AUTOCOMMIT = 0 +ISOLATION_LEVEL_READ_UNCOMMITTED = 4 +ISOLATION_LEVEL_READ_COMMITTED = 1 +ISOLATION_LEVEL_REPEATABLE_READ = 2 +ISOLATION_LEVEL_SERIALIZABLE = 3 + +"""psycopg connection status values.""" +STATUS_SETUP = 0 +STATUS_READY = 1 +STATUS_BEGIN = 2 +STATUS_SYNC = 3 # currently unused +STATUS_ASYNC = 4 # currently unused +STATUS_PREPARED = 5 + +# This is a useful mnemonic to check if the connection is in a transaction +STATUS_IN_TRANSACTION = STATUS_BEGIN + +"""psycopg asynchronous connection polling values""" +POLL_OK = 0 +POLL_READ = 1 +POLL_WRITE = 2 +POLL_ERROR = 3 + +"""Backend transaction status values.""" +TRANSACTION_STATUS_IDLE = 0 +TRANSACTION_STATUS_ACTIVE = 1 +TRANSACTION_STATUS_INTRANS = 2 +TRANSACTION_STATUS_INERROR = 3 +TRANSACTION_STATUS_UNKNOWN = 4 + +import sys as _sys + +# Return bytes from a string +if _sys.version_info[0] < 3: + def b(s): + return s +else: + def b(s): + return s.encode('utf8') + +def register_adapter(typ, callable): + """Register 'callable' as an ISQLQuote adapter for type 'typ'.""" + adapters[(typ, ISQLQuote)] = callable + + +# The SQL_IN class is the official adapter for tuples starting from 2.0.6. +class SQL_IN(object): + """Adapt any iterable to an SQL quotable object.""" + def __init__(self, seq): + self._seq = seq + self._conn = None + + def prepare(self, conn): + self._conn = conn + + def getquoted(self): + # this is the important line: note how every object in the + # list is adapted and then how getquoted() is called on it + pobjs = [adapt(o) for o in self._seq] + if self._conn is not None: + for obj in pobjs: + if hasattr(obj, 'prepare'): + obj.prepare(self._conn) + qobjs = [o.getquoted() for o in pobjs] + return b('(') + b(', ').join(qobjs) + b(')') + + def __str__(self): + return str(self.getquoted()) + + +class NoneAdapter(object): + """Adapt None to NULL. + + This adapter is not used normally as a fast path in mogrify uses NULL, + but it makes easier to adapt composite types. + """ + def __init__(self, obj): + pass + + def getquoted(self, _null=b("NULL")): + return _null + + +# Create default json typecasters for PostgreSQL 9.2 oids +from psycopg2._json import register_default_json + +try: + JSON, JSONARRAY = register_default_json() +except ImportError: + pass + +del register_default_json + + +# Create default Range typecasters +from psycopg2. _range import Range +del Range + +# Add the "cleaned" version of the encodings to the key. +# When the encoding is set its name is cleaned up from - and _ and turned +# uppercase, so an encoding not respecting these rules wouldn't be found in the +# encodings keys and would raise an exception with the unicode typecaster +for k, v in encodings.items(): + k = k.replace('_', '').replace('-', '').upper() + encodings[k] = v + +del k, v diff --git a/psycopg2/extras.py b/psycopg2/extras.py new file mode 100644 index 0000000..b21e223 --- /dev/null +++ b/psycopg2/extras.py @@ -0,0 +1,974 @@ +"""Miscellaneous goodies for psycopg2 + +This module is a generic place used to hold little helper functions +and classes until a better place in the distribution is found. +""" +# psycopg/extras.py - miscellaneous extra goodies for psycopg +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import os as _os +import sys as _sys +import time as _time +import re as _re + +try: + import logging as _logging +except: + _logging = None + +import psycopg2 +from psycopg2 import extensions as _ext +from psycopg2.extensions import cursor as _cursor +from psycopg2.extensions import connection as _connection +from psycopg2.extensions import adapt as _A +from psycopg2.extensions import b + + +class DictCursorBase(_cursor): + """Base class for all dict-like cursors.""" + + def __init__(self, *args, **kwargs): + if 'row_factory' in kwargs: + row_factory = kwargs['row_factory'] + del kwargs['row_factory'] + else: + raise NotImplementedError( + "DictCursorBase can't be instantiated without a row factory.") + super(DictCursorBase, self).__init__(*args, **kwargs) + self._query_executed = 0 + self._prefetch = 0 + self.row_factory = row_factory + + def fetchone(self): + if self._prefetch: + res = super(DictCursorBase, self).fetchone() + if self._query_executed: + self._build_index() + if not self._prefetch: + res = super(DictCursorBase, self).fetchone() + return res + + def fetchmany(self, size=None): + if self._prefetch: + res = super(DictCursorBase, self).fetchmany(size) + if self._query_executed: + self._build_index() + if not self._prefetch: + res = super(DictCursorBase, self).fetchmany(size) + return res + + def fetchall(self): + if self._prefetch: + res = super(DictCursorBase, self).fetchall() + if self._query_executed: + self._build_index() + if not self._prefetch: + res = super(DictCursorBase, self).fetchall() + return res + + def __iter__(self): + if self._prefetch: + res = super(DictCursorBase, self).__iter__() + first = res.next() + if self._query_executed: + self._build_index() + if not self._prefetch: + res = super(DictCursorBase, self).__iter__() + first = res.next() + + yield first + while 1: + yield res.next() + + +class DictConnection(_connection): + """A connection that uses `DictCursor` automatically.""" + def cursor(self, *args, **kwargs): + kwargs.setdefault('cursor_factory', DictCursor) + return super(DictConnection, self).cursor(*args, **kwargs) + +class DictCursor(DictCursorBase): + """A cursor that keeps a list of column name -> index mappings.""" + + def __init__(self, *args, **kwargs): + kwargs['row_factory'] = DictRow + super(DictCursor, self).__init__(*args, **kwargs) + self._prefetch = 1 + + def execute(self, query, vars=None): + self.index = {} + self._query_executed = 1 + return super(DictCursor, self).execute(query, vars) + + def callproc(self, procname, vars=None): + self.index = {} + self._query_executed = 1 + return super(DictCursor, self).callproc(procname, vars) + + def _build_index(self): + if self._query_executed == 1 and self.description: + for i in range(len(self.description)): + self.index[self.description[i][0]] = i + self._query_executed = 0 + +class DictRow(list): + """A row object that allow by-column-name access to data.""" + + __slots__ = ('_index',) + + def __init__(self, cursor): + self._index = cursor.index + self[:] = [None] * len(cursor.description) + + def __getitem__(self, x): + if not isinstance(x, (int, slice)): + x = self._index[x] + return list.__getitem__(self, x) + + def __setitem__(self, x, v): + if not isinstance(x, (int, slice)): + x = self._index[x] + list.__setitem__(self, x, v) + + def items(self): + return list(self.iteritems()) + + def keys(self): + return self._index.keys() + + def values(self): + return tuple(self[:]) + + def has_key(self, x): + return x in self._index + + def get(self, x, default=None): + try: + return self[x] + except: + return default + + def iteritems(self): + for n, v in self._index.iteritems(): + yield n, list.__getitem__(self, v) + + def iterkeys(self): + return self._index.iterkeys() + + def itervalues(self): + return list.__iter__(self) + + def copy(self): + return dict(self.iteritems()) + + def __contains__(self, x): + return x in self._index + + def __getstate__(self): + return self[:], self._index.copy() + + def __setstate__(self, data): + self[:] = data[0] + self._index = data[1] + + # drop the crusty Py2 methods + if _sys.version_info[0] > 2: + items = iteritems; del iteritems + keys = iterkeys; del iterkeys + values = itervalues; del itervalues + del has_key + + +class RealDictConnection(_connection): + """A connection that uses `RealDictCursor` automatically.""" + def cursor(self, *args, **kwargs): + kwargs.setdefault('cursor_factory', RealDictCursor) + return super(RealDictConnection, self).cursor(*args, **kwargs) + +class RealDictCursor(DictCursorBase): + """A cursor that uses a real dict as the base type for rows. + + Note that this cursor is extremely specialized and does not allow + the normal access (using integer indices) to fetched data. If you need + to access database rows both as a dictionary and a list, then use + the generic `DictCursor` instead of `!RealDictCursor`. + """ + def __init__(self, *args, **kwargs): + kwargs['row_factory'] = RealDictRow + super(RealDictCursor, self).__init__(*args, **kwargs) + self._prefetch = 0 + + def execute(self, query, vars=None): + self.column_mapping = [] + self._query_executed = 1 + return super(RealDictCursor, self).execute(query, vars) + + def callproc(self, procname, vars=None): + self.column_mapping = [] + self._query_executed = 1 + return super(RealDictCursor, self).callproc(procname, vars) + + def _build_index(self): + if self._query_executed == 1 and self.description: + for i in range(len(self.description)): + self.column_mapping.append(self.description[i][0]) + self._query_executed = 0 + +class RealDictRow(dict): + """A `!dict` subclass representing a data record.""" + + __slots__ = ('_column_mapping') + + def __init__(self, cursor): + dict.__init__(self) + # Required for named cursors + if cursor.description and not cursor.column_mapping: + cursor._build_index() + + self._column_mapping = cursor.column_mapping + + def __setitem__(self, name, value): + if type(name) == int: + name = self._column_mapping[name] + return dict.__setitem__(self, name, value) + + def __getstate__(self): + return (self.copy(), self._column_mapping[:]) + + def __setstate__(self, data): + self.update(data[0]) + self._column_mapping = data[1] + + +class NamedTupleConnection(_connection): + """A connection that uses `NamedTupleCursor` automatically.""" + def cursor(self, *args, **kwargs): + kwargs.setdefault('cursor_factory', NamedTupleCursor) + return super(NamedTupleConnection, self).cursor(*args, **kwargs) + +class NamedTupleCursor(_cursor): + """A cursor that generates results as `~collections.namedtuple`. + + `!fetch*()` methods will return named tuples instead of regular tuples, so + their elements can be accessed both as regular numeric items as well as + attributes. + + >>> nt_cur = conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) + >>> rec = nt_cur.fetchone() + >>> rec + Record(id=1, num=100, data="abc'def") + >>> rec[1] + 100 + >>> rec.data + "abc'def" + """ + Record = None + + def execute(self, query, vars=None): + self.Record = None + return super(NamedTupleCursor, self).execute(query, vars) + + def executemany(self, query, vars): + self.Record = None + return super(NamedTupleCursor, self).executemany(query, vars) + + def callproc(self, procname, vars=None): + self.Record = None + return super(NamedTupleCursor, self).callproc(procname, vars) + + def fetchone(self): + t = super(NamedTupleCursor, self).fetchone() + if t is not None: + nt = self.Record + if nt is None: + nt = self.Record = self._make_nt() + return nt._make(t) + + def fetchmany(self, size=None): + ts = super(NamedTupleCursor, self).fetchmany(size) + nt = self.Record + if nt is None: + nt = self.Record = self._make_nt() + return map(nt._make, ts) + + def fetchall(self): + ts = super(NamedTupleCursor, self).fetchall() + nt = self.Record + if nt is None: + nt = self.Record = self._make_nt() + return map(nt._make, ts) + + def __iter__(self): + it = super(NamedTupleCursor, self).__iter__() + t = it.next() + + nt = self.Record + if nt is None: + nt = self.Record = self._make_nt() + + yield nt._make(t) + + while 1: + yield nt._make(it.next()) + + try: + from collections import namedtuple + except ImportError, _exc: + def _make_nt(self): + raise self._exc + else: + def _make_nt(self, namedtuple=namedtuple): + return namedtuple("Record", [d[0] for d in self.description or ()]) + + +class LoggingConnection(_connection): + """A connection that logs all queries to a file or logger__ object. + + .. __: http://docs.python.org/library/logging.html + """ + + def initialize(self, logobj): + """Initialize the connection to log to `!logobj`. + + The `!logobj` parameter can be an open file object or a Logger + instance from the standard logging module. + """ + self._logobj = logobj + if _logging and isinstance(logobj, _logging.Logger): + self.log = self._logtologger + else: + self.log = self._logtofile + + def filter(self, msg, curs): + """Filter the query before logging it. + + This is the method to overwrite to filter unwanted queries out of the + log or to add some extra data to the output. The default implementation + just does nothing. + """ + return msg + + def _logtofile(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.write(msg + _os.linesep) + + def _logtologger(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.debug(msg) + + def _check(self): + if not hasattr(self, '_logobj'): + raise self.ProgrammingError( + "LoggingConnection object has not been initialize()d") + + def cursor(self, *args, **kwargs): + self._check() + kwargs.setdefault('cursor_factory', LoggingCursor) + return super(LoggingConnection, self).cursor(*args, **kwargs) + +class LoggingCursor(_cursor): + """A cursor that logs queries using its connection logging facilities.""" + + def execute(self, query, vars=None): + try: + return super(LoggingCursor, self).execute(query, vars) + finally: + self.connection.log(self.query, self) + + def callproc(self, procname, vars=None): + try: + return super(LoggingCursor, self).callproc(procname, vars) + finally: + self.connection.log(self.query, self) + + +class MinTimeLoggingConnection(LoggingConnection): + """A connection that logs queries based on execution time. + + This is just an example of how to sub-class `LoggingConnection` to + provide some extra filtering for the logged queries. Both the + `initialize()` and `filter()` methods are overwritten to make sure + that only queries executing for more than ``mintime`` ms are logged. + + Note that this connection uses the specialized cursor + `MinTimeLoggingCursor`. + """ + def initialize(self, logobj, mintime=0): + LoggingConnection.initialize(self, logobj) + self._mintime = mintime + + def filter(self, msg, curs): + t = (_time.time() - curs.timestamp) * 1000 + if t > self._mintime: + return msg + _os.linesep + " (execution time: %d ms)" % t + + def cursor(self, *args, **kwargs): + kwargs.setdefault('cursor_factory', MinTimeLoggingCursor) + return LoggingConnection.cursor(self, *args, **kwargs) + +class MinTimeLoggingCursor(LoggingCursor): + """The cursor sub-class companion to `MinTimeLoggingConnection`.""" + + def execute(self, query, vars=None): + self.timestamp = _time.time() + return LoggingCursor.execute(self, query, vars) + + def callproc(self, procname, vars=None): + self.timestamp = _time.time() + return LoggingCursor.execute(self, procname, vars) + + +# a dbtype and adapter for Python UUID type + +class UUID_adapter(object): + """Adapt Python's uuid.UUID__ type to PostgreSQL's uuid__. + + .. __: http://docs.python.org/library/uuid.html + .. __: http://www.postgresql.org/docs/current/static/datatype-uuid.html + """ + + def __init__(self, uuid): + self._uuid = uuid + + def __conform__(self, proto): + if proto is _ext.ISQLQuote: + return self + + def getquoted(self): + return b("'%s'::uuid" % self._uuid) + + def __str__(self): + return "'%s'::uuid" % self._uuid + +def register_uuid(oids=None, conn_or_curs=None): + """Create the UUID type and an uuid.UUID adapter. + + :param oids: oid for the PostgreSQL :sql:`uuid` type, or 2-items sequence + with oids of the type and the array. If not specified, use PostgreSQL + standard oids. + :param conn_or_curs: where to register the typecaster. If not specified, + register it globally. + """ + + import uuid + + if not oids: + oid1 = 2950 + oid2 = 2951 + elif isinstance(oids, (list, tuple)): + oid1, oid2 = oids + else: + oid1 = oids + oid2 = 2951 + + _ext.UUID = _ext.new_type((oid1, ), "UUID", + lambda data, cursor: data and uuid.UUID(data) or None) + _ext.UUIDARRAY = _ext.new_array_type((oid2,), "UUID[]", _ext.UUID) + + _ext.register_type(_ext.UUID, conn_or_curs) + _ext.register_type(_ext.UUIDARRAY, conn_or_curs) + _ext.register_adapter(uuid.UUID, UUID_adapter) + + return _ext.UUID + + +# a type, dbtype and adapter for PostgreSQL inet type + +class Inet(object): + """Wrap a string to allow for correct SQL-quoting of inet values. + + Note that this adapter does NOT check the passed value to make + sure it really is an inet-compatible address but DOES call adapt() + on it to make sure it is impossible to execute an SQL-injection + by passing an evil value to the initializer. + """ + def __init__(self, addr): + self.addr = addr + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self.addr) + + def prepare(self, conn): + self._conn = conn + + def getquoted(self): + obj = _A(self.addr) + if hasattr(obj, 'prepare'): + obj.prepare(self._conn) + return obj.getquoted() + b("::inet") + + def __conform__(self, proto): + if proto is _ext.ISQLQuote: + return self + + def __str__(self): + return str(self.addr) + +def register_inet(oid=None, conn_or_curs=None): + """Create the INET type and an Inet adapter. + + :param oid: oid for the PostgreSQL :sql:`inet` type, or 2-items sequence + with oids of the type and the array. If not specified, use PostgreSQL + standard oids. + :param conn_or_curs: where to register the typecaster. If not specified, + register it globally. + """ + if not oid: + oid1 = 869 + oid2 = 1041 + elif isinstance(oid, (list, tuple)): + oid1, oid2 = oid + else: + oid1 = oid + oid2 = 1041 + + _ext.INET = _ext.new_type((oid1, ), "INET", + lambda data, cursor: data and Inet(data) or None) + _ext.INETARRAY = _ext.new_array_type((oid2, ), "INETARRAY", _ext.INET) + + _ext.register_type(_ext.INET, conn_or_curs) + _ext.register_type(_ext.INETARRAY, conn_or_curs) + + return _ext.INET + + +def register_tstz_w_secs(oids=None, conn_or_curs=None): + """The function used to register an alternate type caster for + :sql:`TIMESTAMP WITH TIME ZONE` to deal with historical time zones with + seconds in the UTC offset. + + These are now correctly handled by the default type caster, so currently + the function doesn't do anything. + """ + import warnings + warnings.warn("deprecated", DeprecationWarning) + + +def wait_select(conn): + """Wait until a connection or cursor has data available. + + The function is an example of a wait callback to be registered with + `~psycopg2.extensions.set_wait_callback()`. This function uses + :py:func:`~select.select()` to wait for data available. + + """ + import select + from psycopg2.extensions import POLL_OK, POLL_READ, POLL_WRITE + + while 1: + state = conn.poll() + if state == POLL_OK: + break + elif state == POLL_READ: + select.select([conn.fileno()], [], []) + elif state == POLL_WRITE: + select.select([], [conn.fileno()], []) + else: + raise conn.OperationalError("bad state from poll: %s" % state) + + +def _solve_conn_curs(conn_or_curs): + """Return the connection and a DBAPI cursor from a connection or cursor.""" + if conn_or_curs is None: + raise psycopg2.ProgrammingError("no connection or cursor provided") + + if hasattr(conn_or_curs, 'execute'): + conn = conn_or_curs.connection + curs = conn.cursor(cursor_factory=_cursor) + else: + conn = conn_or_curs + curs = conn.cursor(cursor_factory=_cursor) + + return conn, curs + + +class HstoreAdapter(object): + """Adapt a Python dict to the hstore syntax.""" + def __init__(self, wrapped): + self.wrapped = wrapped + + def prepare(self, conn): + self.conn = conn + + # use an old-style getquoted implementation if required + if conn.server_version < 90000: + self.getquoted = self._getquoted_8 + + def _getquoted_8(self): + """Use the operators available in PG pre-9.0.""" + if not self.wrapped: + return b("''::hstore") + + adapt = _ext.adapt + rv = [] + for k, v in self.wrapped.iteritems(): + k = adapt(k) + k.prepare(self.conn) + k = k.getquoted() + + if v is not None: + v = adapt(v) + v.prepare(self.conn) + v = v.getquoted() + else: + v = b('NULL') + + # XXX this b'ing is painfully inefficient! + rv.append(b("(") + k + b(" => ") + v + b(")")) + + return b("(") + b('||').join(rv) + b(")") + + def _getquoted_9(self): + """Use the hstore(text[], text[]) function.""" + if not self.wrapped: + return b("''::hstore") + + k = _ext.adapt(self.wrapped.keys()) + k.prepare(self.conn) + v = _ext.adapt(self.wrapped.values()) + v.prepare(self.conn) + return b("hstore(") + k.getquoted() + b(", ") + v.getquoted() + b(")") + + getquoted = _getquoted_9 + + _re_hstore = _re.compile(r""" + # hstore key: + # a string of normal or escaped chars + "((?: [^"\\] | \\. )*)" + \s*=>\s* # hstore value + (?: + NULL # the value can be null - not catched + # or a quoted string like the key + | "((?: [^"\\] | \\. )*)" + ) + (?:\s*,\s*|$) # pairs separated by comma or end of string. + """, _re.VERBOSE) + + @classmethod + def parse(self, s, cur, _bsdec=_re.compile(r"\\(.)")): + """Parse an hstore representation in a Python string. + + The hstore is represented as something like:: + + "a"=>"1", "b"=>"2" + + with backslash-escaped strings. + """ + if s is None: + return None + + rv = {} + start = 0 + for m in self._re_hstore.finditer(s): + if m is None or m.start() != start: + raise psycopg2.InterfaceError( + "error parsing hstore pair at char %d" % start) + k = _bsdec.sub(r'\1', m.group(1)) + v = m.group(2) + if v is not None: + v = _bsdec.sub(r'\1', v) + + rv[k] = v + start = m.end() + + if start < len(s): + raise psycopg2.InterfaceError( + "error parsing hstore: unparsed data after char %d" % start) + + return rv + + @classmethod + def parse_unicode(self, s, cur): + """Parse an hstore returning unicode keys and values.""" + if s is None: + return None + + s = s.decode(_ext.encodings[cur.connection.encoding]) + return self.parse(s, cur) + + @classmethod + def get_oids(self, conn_or_curs): + """Return the lists of OID of the hstore and hstore[] types. + """ + conn, curs = _solve_conn_curs(conn_or_curs) + + # Store the transaction status of the connection to revert it after use + conn_status = conn.status + + # column typarray not available before PG 8.3 + typarray = conn.server_version >= 80300 and "typarray" or "NULL" + + rv0, rv1 = [], [] + + # get the oid for the hstore + curs.execute("""\ +SELECT t.oid, %s +FROM pg_type t JOIN pg_namespace ns + ON typnamespace = ns.oid +WHERE typname = 'hstore'; +""" % typarray) + for oids in curs: + rv0.append(oids[0]) + rv1.append(oids[1]) + + # revert the status of the connection as before the command + if (conn_status != _ext.STATUS_IN_TRANSACTION + and not conn.autocommit): + conn.rollback() + + return tuple(rv0), tuple(rv1) + +def register_hstore(conn_or_curs, globally=False, unicode=False, + oid=None, array_oid=None): + """Register adapter and typecaster for `!dict`\-\ |hstore| conversions. + + :param conn_or_curs: a connection or cursor: the typecaster will be + registered only on this object unless *globally* is set to `!True` + :param globally: register the adapter globally, not only on *conn_or_curs* + :param unicode: if `!True`, keys and values returned from the database + will be `!unicode` instead of `!str`. The option is not available on + Python 3 + :param oid: the OID of the |hstore| type if known. If not, it will be + queried on *conn_or_curs*. + :param array_oid: the OID of the |hstore| array type if known. If not, it + will be queried on *conn_or_curs*. + + The connection or cursor passed to the function will be used to query the + database and look for the OID of the |hstore| type (which may be different + across databases). If querying is not desirable (e.g. with + :ref:`asynchronous connections `) you may specify it in the + *oid* parameter, which can be found using a query such as :sql:`SELECT + 'hstore'::regtype::oid`. Analogously you can obtain a value for *array_oid* + using a query such as :sql:`SELECT 'hstore[]'::regtype::oid`. + + Note that, when passing a dictionary from Python to the database, both + strings and unicode keys and values are supported. Dictionaries returned + from the database have keys/values according to the *unicode* parameter. + + The |hstore| contrib module must be already installed in the database + (executing the ``hstore.sql`` script in your ``contrib`` directory). + Raise `~psycopg2.ProgrammingError` if the type is not found. + """ + if oid is None: + oid = HstoreAdapter.get_oids(conn_or_curs) + if oid is None or not oid[0]: + raise psycopg2.ProgrammingError( + "hstore type not found in the database. " + "please install it from your 'contrib/hstore.sql' file") + else: + array_oid = oid[1] + oid = oid[0] + + if isinstance(oid, int): + oid = (oid,) + + if array_oid is not None: + if isinstance(array_oid, int): + array_oid = (array_oid,) + else: + array_oid = tuple([x for x in array_oid if x]) + + # create and register the typecaster + if _sys.version_info[0] < 3 and unicode: + cast = HstoreAdapter.parse_unicode + else: + cast = HstoreAdapter.parse + + HSTORE = _ext.new_type(oid, "HSTORE", cast) + _ext.register_type(HSTORE, not globally and conn_or_curs or None) + _ext.register_adapter(dict, HstoreAdapter) + + if array_oid: + HSTOREARRAY = _ext.new_array_type(array_oid, "HSTOREARRAY", HSTORE) + _ext.register_type(HSTOREARRAY, not globally and conn_or_curs or None) + + +class CompositeCaster(object): + """Helps conversion of a PostgreSQL composite type into a Python object. + + The class is usually created by the `register_composite()` function. + You may want to create and register manually instances of the class if + querying the database at registration time is not desirable (such as when + using an :ref:`asynchronous connections `). + + """ + def __init__(self, name, oid, attrs, array_oid=None, schema=None): + self.name = name + self.schema = schema + self.oid = oid + self.array_oid = array_oid + + self.attnames = [ a[0] for a in attrs ] + self.atttypes = [ a[1] for a in attrs ] + self._create_type(name, self.attnames) + self.typecaster = _ext.new_type((oid,), name, self.parse) + if array_oid: + self.array_typecaster = _ext.new_array_type( + (array_oid,), "%sARRAY" % name, self.typecaster) + else: + self.array_typecaster = None + + def parse(self, s, curs): + if s is None: + return None + + tokens = self.tokenize(s) + if len(tokens) != len(self.atttypes): + raise psycopg2.DataError( + "expecting %d components for the type %s, %d found instead" % + (len(self.atttypes), self.name, len(tokens))) + + values = [ curs.cast(oid, token) + for oid, token in zip(self.atttypes, tokens) ] + + return self.make(values) + + def make(self, values): + """Return a new Python object representing the data being casted. + + *values* is the list of attributes, already casted into their Python + representation. + + You can subclass this method to :ref:`customize the composite cast + `. + """ + + return self._ctor(values) + + _re_tokenize = _re.compile(r""" + \(? ([,)]) # an empty token, representing NULL +| \(? " ((?: [^"] | "")*) " [,)] # or a quoted string +| \(? ([^",)]+) [,)] # or an unquoted string + """, _re.VERBOSE) + + _re_undouble = _re.compile(r'(["\\])\1') + + @classmethod + def tokenize(self, s): + rv = [] + for m in self._re_tokenize.finditer(s): + if m is None: + raise psycopg2.InterfaceError("can't parse type: %r" % s) + if m.group(1) is not None: + rv.append(None) + elif m.group(2) is not None: + rv.append(self._re_undouble.sub(r"\1", m.group(2))) + else: + rv.append(m.group(3)) + + return rv + + def _create_type(self, name, attnames): + try: + from collections import namedtuple + except ImportError: + self.type = tuple + self._ctor = self.type + else: + self.type = namedtuple(name, attnames) + self._ctor = self.type._make + + @classmethod + def _from_db(self, name, conn_or_curs): + """Return a `CompositeCaster` instance for the type *name*. + + Raise `ProgrammingError` if the type is not found. + """ + conn, curs = _solve_conn_curs(conn_or_curs) + + # Store the transaction status of the connection to revert it after use + conn_status = conn.status + + # Use the correct schema + if '.' in name: + schema, tname = name.split('.', 1) + else: + tname = name + schema = 'public' + + # column typarray not available before PG 8.3 + typarray = conn.server_version >= 80300 and "typarray" or "NULL" + + # get the type oid and attributes + curs.execute("""\ +SELECT t.oid, %s, attname, atttypid +FROM pg_type t +JOIN pg_namespace ns ON typnamespace = ns.oid +JOIN pg_attribute a ON attrelid = typrelid +WHERE typname = %%s AND nspname = %%s + AND attnum > 0 AND NOT attisdropped +ORDER BY attnum; +""" % typarray, (tname, schema)) + + recs = curs.fetchall() + + # revert the status of the connection as before the command + if (conn_status != _ext.STATUS_IN_TRANSACTION + and not conn.autocommit): + conn.rollback() + + if not recs: + raise psycopg2.ProgrammingError( + "PostgreSQL type '%s' not found" % name) + + type_oid = recs[0][0] + array_oid = recs[0][1] + type_attrs = [ (r[2], r[3]) for r in recs ] + + return self(tname, type_oid, type_attrs, + array_oid=array_oid, schema=schema) + +def register_composite(name, conn_or_curs, globally=False, factory=None): + """Register a typecaster to convert a composite type into a tuple. + + :param name: the name of a PostgreSQL composite type, e.g. created using + the |CREATE TYPE|_ command + :param conn_or_curs: a connection or cursor used to find the type oid and + components; the typecaster is registered in a scope limited to this + object, unless *globally* is set to `!True` + :param globally: if `!False` (default) register the typecaster only on + *conn_or_curs*, otherwise register it globally + :param factory: if specified it should be a `CompositeCaster` subclass: use + it to :ref:`customize how to cast composite types ` + :return: the registered `CompositeCaster` or *factory* instance + responsible for the conversion + """ + if factory is None: + factory = CompositeCaster + + caster = factory._from_db(name, conn_or_curs) + _ext.register_type(caster.typecaster, not globally and conn_or_curs or None) + + if caster.array_typecaster is not None: + _ext.register_type(caster.array_typecaster, not globally and conn_or_curs or None) + + return caster + + +# expose the json adaptation stuff into the module +from psycopg2._json import json, Json, register_json, register_default_json + + +# Expose range-related objects +from psycopg2._range import Range, NumericRange +from psycopg2._range import DateRange, DateTimeRange, DateTimeTZRange +from psycopg2._range import register_range, RangeAdapter, RangeCaster diff --git a/psycopg2/pool.py b/psycopg2/pool.py new file mode 100644 index 0000000..3b41c80 --- /dev/null +++ b/psycopg2/pool.py @@ -0,0 +1,235 @@ +"""Connection pooling for psycopg2 + +This module implements thread-safe (and not) connection pools. +""" +# psycopg/pool.py - pooling code for psycopg +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import psycopg2 +import psycopg2.extensions as _ext + + +class PoolError(psycopg2.Error): + pass + + +class AbstractConnectionPool(object): + """Generic key-based pooling code.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the connection pool. + + New 'minconn' connections are created immediately calling 'connfunc' + with given parameters. The connection pool will support a maximum of + about 'maxconn' connections. + """ + self.minconn = minconn + self.maxconn = maxconn + self.closed = False + + self._args = args + self._kwargs = kwargs + + self._pool = [] + self._used = {} + self._rused = {} # id(conn) -> key map + self._keys = 0 + + for i in range(self.minconn): + self._connect() + + def _connect(self, key=None): + """Create a new connection and assign it to 'key' if not None.""" + conn = psycopg2.connect(*self._args, **self._kwargs) + if key is not None: + self._used[key] = conn + self._rused[id(conn)] = key + else: + self._pool.append(conn) + return conn + + def _getkey(self): + """Return a new unique key.""" + self._keys += 1 + return self._keys + + def _getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._getkey() + + if key in self._used: + return self._used[key] + + if self._pool: + self._used[key] = conn = self._pool.pop() + self._rused[id(conn)] = key + return conn + else: + if len(self._used) == self.maxconn: + raise PoolError("connection pool exausted") + return self._connect(key) + + def _putconn(self, conn, key=None, close=False): + """Put away a connection.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._rused.get(id(conn)) + + if not key: + raise PoolError("trying to put unkeyed connection") + + if len(self._pool) < self.minconn and not close: + # Return the connection into a consistent state before putting + # it back into the pool + if not conn.closed: + status = conn.get_transaction_status() + if status == _ext.TRANSACTION_STATUS_UNKNOWN: + # server connection lost + conn.close() + elif status != _ext.TRANSACTION_STATUS_IDLE: + # connection in error or in transaction + conn.rollback() + self._pool.append(conn) + else: + # regular idle connection + self._pool.append(conn) + # If the connection is closed, we just discard it. + else: + conn.close() + + # here we check for the presence of key because it can happen that a + # thread tries to put back a connection after a call to close + if not self.closed or key in self._used: + del self._used[key] + del self._rused[id(conn)] + + def _closeall(self): + """Close all connections. + + Note that this can lead to some code fail badly when trying to use + an already closed connection. If you call .closeall() make sure + your code can deal with it. + """ + if self.closed: raise PoolError("connection pool is closed") + for conn in self._pool + list(self._used.values()): + try: + conn.close() + except: + pass + self.closed = True + + +class SimpleConnectionPool(AbstractConnectionPool): + """A connection pool that can't be shared across different threads.""" + + getconn = AbstractConnectionPool._getconn + putconn = AbstractConnectionPool._putconn + closeall = AbstractConnectionPool._closeall + + +class ThreadedConnectionPool(AbstractConnectionPool): + """A connection pool that works with the threading module.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + def getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, key=None, close=False): + """Put away an unused connection.""" + self._lock.acquire() + try: + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() + + +class PersistentConnectionPool(AbstractConnectionPool): + """A pool that assigns persistent connections to different threads. + + Note that this connection pool generates by itself the required keys + using the current thread id. This means that until a thread puts away + a connection it will always get the same connection object by successive + `!getconn()` calls. This also means that a thread can't use more than one + single connection from the pool. + """ + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import warnings + warnings.warn("deprecated: use ZPsycopgDA.pool implementation", + DeprecationWarning) + + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + # we we'll need the thread module, to determine thread ids, so we + # import it here and copy it in an instance variable + import thread + self.__thread = thread + + def getconn(self): + """Generate thread id and return a connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, close=False): + """Put away an unused connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + if not conn: conn = self._used[key] + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() diff --git a/psycopg2/psycopg1.py b/psycopg2/psycopg1.py new file mode 100644 index 0000000..7a24c5f --- /dev/null +++ b/psycopg2/psycopg1.py @@ -0,0 +1,95 @@ +"""psycopg 1.1.x compatibility module + +This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:: + + from psycopg2 import psycopg1 as psycopg +""" +# psycopg/psycopg1.py - psycopg 1.1.x compatibility module +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import _psycopg as _2psycopg +from psycopg2.extensions import cursor as _2cursor +from psycopg2.extensions import connection as _2connection + +from psycopg2 import * +import psycopg2.extensions as _ext +_2connect = connect + +def connect(*args, **kwargs): + """connect(dsn, ...) -> new psycopg 1.1.x compatible connection object""" + kwargs['connection_factory'] = connection + conn = _2connect(*args, **kwargs) + conn.set_isolation_level(_ext.ISOLATION_LEVEL_READ_COMMITTED) + return conn + +class connection(_2connection): + """psycopg 1.1.x connection.""" + + def cursor(self): + """cursor() -> new psycopg 1.1.x compatible cursor object""" + return _2connection.cursor(self, cursor_factory=cursor) + + def autocommit(self, on_off=1): + """autocommit(on_off=1) -> switch autocommit on (1) or off (0)""" + if on_off > 0: + self.set_isolation_level(_ext.ISOLATION_LEVEL_AUTOCOMMIT) + else: + self.set_isolation_level(_ext.ISOLATION_LEVEL_READ_COMMITTED) + + +class cursor(_2cursor): + """psycopg 1.1.x cursor. + + Note that this cursor implements the exact procedure used by psycopg 1 to + build dictionaries out of result rows. The DictCursor in the + psycopg.extras modules implements a much better and faster algorithm. + """ + + def __build_dict(self, row): + res = {} + for i in range(len(self.description)): + res[self.description[i][0]] = row[i] + return res + + def dictfetchone(self): + row = _2cursor.fetchone(self) + if row: + return self.__build_dict(row) + else: + return row + + def dictfetchmany(self, size): + res = [] + rows = _2cursor.fetchmany(self, size) + for row in rows: + res.append(self.__build_dict(row)) + return res + + def dictfetchall(self): + res = [] + rows = _2cursor.fetchall(self) + for row in rows: + res.append(self.__build_dict(row)) + return res + diff --git a/psycopg2/tests/__init__.py b/psycopg2/tests/__init__.py new file mode 100644 index 0000000..3e677d8 --- /dev/null +++ b/psycopg2/tests/__init__.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +# psycopg2 test suite +# +# Copyright (C) 2007-2011 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import sys +from testconfig import dsn +from testutils import unittest + +import test_async +import test_bugX000 +import test_bug_gc +import test_cancel +import test_connection +import test_copy +import test_cursor +import test_dates +import test_extras_dictcursor +import test_green +import test_lobject +import test_module +import test_notify +import test_psycopg2_dbapi20 +import test_quote +import test_transaction +import test_types_basic +import test_types_extras + +if sys.version_info[:2] >= (2, 5): + import test_with +else: + test_with = None + +def test_suite(): + # If connection to test db fails, bail out early. + import psycopg2 + try: + cnn = psycopg2.connect(dsn) + except Exception, e: + print "Failed connection to test db:", e.__class__.__name__, e + print "Please set env vars 'PSYCOPG2_TESTDB*' to valid values." + sys.exit(1) + else: + cnn.close() + + suite = unittest.TestSuite() + suite.addTest(test_async.test_suite()) + suite.addTest(test_bugX000.test_suite()) + suite.addTest(test_bug_gc.test_suite()) + suite.addTest(test_cancel.test_suite()) + suite.addTest(test_connection.test_suite()) + suite.addTest(test_copy.test_suite()) + suite.addTest(test_cursor.test_suite()) + suite.addTest(test_dates.test_suite()) + suite.addTest(test_extras_dictcursor.test_suite()) + suite.addTest(test_green.test_suite()) + suite.addTest(test_lobject.test_suite()) + suite.addTest(test_module.test_suite()) + suite.addTest(test_notify.test_suite()) + suite.addTest(test_psycopg2_dbapi20.test_suite()) + suite.addTest(test_quote.test_suite()) + suite.addTest(test_transaction.test_suite()) + suite.addTest(test_types_basic.test_suite()) + suite.addTest(test_types_extras.test_suite()) + if test_with: + suite.addTest(test_with.test_suite()) + return suite + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') diff --git a/psycopg2/tests/dbapi20.py b/psycopg2/tests/dbapi20.py new file mode 100644 index 0000000..b8d6a39 --- /dev/null +++ b/psycopg2/tests/dbapi20.py @@ -0,0 +1,872 @@ +#!/usr/bin/env python +''' Python DB API 2.0 driver compliance unit test suite. + + This software is Public Domain and may be used without restrictions. + + "Now we have booze and barflies entering the discussion, plus rumours of + DBAs on drugs... and I won't tell you what flashes through my mind each + time I read the subject line with 'Anal Compliance' in it. All around + this is turning out to be a thoroughly unwholesome unit test." + + -- Ian Bicking +''' + +__rcs_id__ = '$Id: dbapi20.py,v 1.11 2005/01/02 02:41:01 zenzen Exp $' +__version__ = '$Revision: 1.12 $'[11:-2] +__author__ = 'Stuart Bishop ' + +import unittest +import time +import sys + + +# Revision 1.12 2009/02/06 03:35:11 kf7xm +# Tested okay with Python 3.0, includes last minute patches from Mark H. +# +# Revision 1.1.1.1.2.1 2008/09/20 19:54:59 rupole +# Include latest changes from main branch +# Updates for py3k +# +# Revision 1.11 2005/01/02 02:41:01 zenzen +# Update author email address +# +# Revision 1.10 2003/10/09 03:14:14 zenzen +# Add test for DB API 2.0 optional extension, where database exceptions +# are exposed as attributes on the Connection object. +# +# Revision 1.9 2003/08/13 01:16:36 zenzen +# Minor tweak from Stefan Fleiter +# +# Revision 1.8 2003/04/10 00:13:25 zenzen +# Changes, as per suggestions by M.-A. Lemburg +# - Add a table prefix, to ensure namespace collisions can always be avoided +# +# Revision 1.7 2003/02/26 23:33:37 zenzen +# Break out DDL into helper functions, as per request by David Rushby +# +# Revision 1.6 2003/02/21 03:04:33 zenzen +# Stuff from Henrik Ekelund: +# added test_None +# added test_nextset & hooks +# +# Revision 1.5 2003/02/17 22:08:43 zenzen +# Implement suggestions and code from Henrik Eklund - test that cursor.arraysize +# defaults to 1 & generic cursor.callproc test added +# +# Revision 1.4 2003/02/15 00:16:33 zenzen +# Changes, as per suggestions and bug reports by M.-A. Lemburg, +# Matthew T. Kromer, Federico Di Gregorio and Daniel Dittmar +# - Class renamed +# - Now a subclass of TestCase, to avoid requiring the driver stub +# to use multiple inheritance +# - Reversed the polarity of buggy test in test_description +# - Test exception hierarchy correctly +# - self.populate is now self._populate(), so if a driver stub +# overrides self.ddl1 this change propogates +# - VARCHAR columns now have a width, which will hopefully make the +# DDL even more portible (this will be reversed if it causes more problems) +# - cursor.rowcount being checked after various execute and fetchXXX methods +# - Check for fetchall and fetchmany returning empty lists after results +# are exhausted (already checking for empty lists if select retrieved +# nothing +# - Fix bugs in test_setoutputsize_basic and test_setinputsizes +# +def str2bytes(sval): + if sys.version_info < (3,0) and isinstance(sval, str): + sval = sval.decode("latin1") + return sval.encode("latin1") + +class DatabaseAPI20Test(unittest.TestCase): + ''' Test a database self.driver for DB API 2.0 compatibility. + This implementation tests Gadfly, but the TestCase + is structured so that other self.drivers can subclass this + test case to ensure compiliance with the DB-API. It is + expected that this TestCase may be expanded in the future + if ambiguities or edge conditions are discovered. + + The 'Optional Extensions' are not yet being tested. + + self.drivers should subclass this test, overriding setUp, tearDown, + self.driver, connect_args and connect_kw_args. Class specification + should be as follows: + + import dbapi20 + class mytest(dbapi20.DatabaseAPI20Test): + [...] + + Don't 'import DatabaseAPI20Test from dbapi20', or you will + confuse the unit tester - just 'import dbapi20'. + ''' + + # The self.driver module. This should be the module where the 'connect' + # method is to be found + driver = None + connect_args = () # List of arguments to pass to connect + connect_kw_args = {} # Keyword arguments for connect + table_prefix = 'dbapi20test_' # If you need to specify a prefix for tables + + ddl1 = 'create table %sbooze (name varchar(20))' % table_prefix + ddl2 = 'create table %sbarflys (name varchar(20))' % table_prefix + xddl1 = 'drop table %sbooze' % table_prefix + xddl2 = 'drop table %sbarflys' % table_prefix + + lowerfunc = 'lower' # Name of stored procedure to convert string->lowercase + + # Some drivers may need to override these helpers, for example adding + # a 'commit' after the execute. + def executeDDL1(self,cursor): + cursor.execute(self.ddl1) + + def executeDDL2(self,cursor): + cursor.execute(self.ddl2) + + def setUp(self): + ''' self.drivers should override this method to perform required setup + if any is necessary, such as creating the database. + ''' + pass + + def tearDown(self): + ''' self.drivers should override this method to perform required cleanup + if any is necessary, such as deleting the test database. + The default drops the tables that may be created. + ''' + con = self._connect() + try: + cur = con.cursor() + for ddl in (self.xddl1,self.xddl2): + try: + cur.execute(ddl) + con.commit() + except self.driver.Error: + # Assume table didn't exist. Other tests will check if + # execute is busted. + pass + finally: + con.close() + + def _connect(self): + try: + return self.driver.connect( + *self.connect_args,**self.connect_kw_args + ) + except AttributeError: + self.fail("No connect method found in self.driver module") + + def test_connect(self): + con = self._connect() + con.close() + + def test_apilevel(self): + try: + # Must exist + apilevel = self.driver.apilevel + # Must equal 2.0 + self.assertEqual(apilevel,'2.0') + except AttributeError: + self.fail("Driver doesn't define apilevel") + + def test_threadsafety(self): + try: + # Must exist + threadsafety = self.driver.threadsafety + # Must be a valid value + self.failUnless(threadsafety in (0,1,2,3)) + except AttributeError: + self.fail("Driver doesn't define threadsafety") + + def test_paramstyle(self): + try: + # Must exist + paramstyle = self.driver.paramstyle + # Must be a valid value + self.failUnless(paramstyle in ( + 'qmark','numeric','named','format','pyformat' + )) + except AttributeError: + self.fail("Driver doesn't define paramstyle") + + def test_Exceptions(self): + # Make sure required exceptions exist, and are in the + # defined hierarchy. + if sys.version[0] == '3': #under Python 3 StardardError no longer exists + self.failUnless(issubclass(self.driver.Warning,Exception)) + self.failUnless(issubclass(self.driver.Error,Exception)) + else: + self.failUnless(issubclass(self.driver.Warning,StandardError)) + self.failUnless(issubclass(self.driver.Error,StandardError)) + + self.failUnless( + issubclass(self.driver.InterfaceError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.DatabaseError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.OperationalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.IntegrityError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.InternalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.ProgrammingError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.NotSupportedError,self.driver.Error) + ) + + def test_ExceptionsAsConnectionAttributes(self): + # OPTIONAL EXTENSION + # Test for the optional DB API 2.0 extension, where the exceptions + # are exposed as attributes on the Connection object + # I figure this optional extension will be implemented by any + # driver author who is using this test suite, so it is enabled + # by default. + con = self._connect() + drv = self.driver + self.failUnless(con.Warning is drv.Warning) + self.failUnless(con.Error is drv.Error) + self.failUnless(con.InterfaceError is drv.InterfaceError) + self.failUnless(con.DatabaseError is drv.DatabaseError) + self.failUnless(con.OperationalError is drv.OperationalError) + self.failUnless(con.IntegrityError is drv.IntegrityError) + self.failUnless(con.InternalError is drv.InternalError) + self.failUnless(con.ProgrammingError is drv.ProgrammingError) + self.failUnless(con.NotSupportedError is drv.NotSupportedError) + + + def test_commit(self): + con = self._connect() + try: + # Commit must work, even if it doesn't do anything + con.commit() + finally: + con.close() + + def test_rollback(self): + con = self._connect() + # If rollback is defined, it should either work or throw + # the documented exception + if hasattr(con,'rollback'): + try: + con.rollback() + except self.driver.NotSupportedError: + pass + + def test_cursor(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + def test_cursor_isolation(self): + con = self._connect() + try: + # Make sure cursors created from the same connection have + # the documented transaction isolation level + cur1 = con.cursor() + cur2 = con.cursor() + self.executeDDL1(cur1) + cur1.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + cur2.execute("select name from %sbooze" % self.table_prefix) + booze = cur2.fetchall() + self.assertEqual(len(booze),1) + self.assertEqual(len(booze[0]),1) + self.assertEqual(booze[0][0],'Victoria Bitter') + finally: + con.close() + + def test_description(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.description,None, + 'cursor.description should be none after executing a ' + 'statement that can return no rows (such as DDL)' + ) + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(len(cur.description),1, + 'cursor.description describes too many columns' + ) + self.assertEqual(len(cur.description[0]),7, + 'cursor.description[x] tuples must have 7 elements' + ) + self.assertEqual(cur.description[0][0].lower(),'name', + 'cursor.description[x][0] must return column name' + ) + self.assertEqual(cur.description[0][1],self.driver.STRING, + 'cursor.description[x][1] must return column type. Got %r' + % cur.description[0][1] + ) + + # Make sure self.description gets reset + self.executeDDL2(cur) + self.assertEqual(cur.description,None, + 'cursor.description not being set to None when executing ' + 'no-result statements (eg. DDL)' + ) + finally: + con.close() + + def test_rowcount(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount should be -1 after executing no-result ' + 'statements' + ) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number or rows inserted, or ' + 'set to -1 after executing an insert statement' + ) + cur.execute("select name from %sbooze" % self.table_prefix) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number of rows returned, or ' + 'set to -1 after executing a select statement' + ) + self.executeDDL2(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount not being reset to -1 after executing ' + 'no-result statements' + ) + finally: + con.close() + + lower_func = 'lower' + def test_callproc(self): + con = self._connect() + try: + cur = con.cursor() + if self.lower_func and hasattr(cur,'callproc'): + r = cur.callproc(self.lower_func,('FOO',)) + self.assertEqual(len(r),1) + self.assertEqual(r[0],'FOO') + r = cur.fetchall() + self.assertEqual(len(r),1,'callproc produced no result set') + self.assertEqual(len(r[0]),1, + 'callproc produced invalid result set' + ) + self.assertEqual(r[0][0],'foo', + 'callproc produced invalid results' + ) + finally: + con.close() + + def test_close(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + # cursor.execute should raise an Error if called after connection + # closed + self.assertRaises(self.driver.Error,self.executeDDL1,cur) + + # connection.commit should raise an Error if called after connection' + # closed.' + self.assertRaises(self.driver.Error,con.commit) + + # connection.close should raise an Error if called more than once + # Issue discussed on DB-SIG: consensus seem that close() should not + # raised if called on closed objects. Issue reported back to Stuart. + # self.assertRaises(self.driver.Error,con.close) + + def test_execute(self): + con = self._connect() + try: + cur = con.cursor() + self._paraminsert(cur) + finally: + con.close() + + def _paraminsert(self,cur): + self.executeDDL1(cur) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1)) + + if self.driver.paramstyle == 'qmark': + cur.execute( + 'insert into %sbooze values (?)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'numeric': + cur.execute( + 'insert into %sbooze values (:1)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'named': + cur.execute( + 'insert into %sbooze values (:beer)' % self.table_prefix, + {'beer':"Cooper's"} + ) + elif self.driver.paramstyle == 'format': + cur.execute( + 'insert into %sbooze values (%%s)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'pyformat': + cur.execute( + 'insert into %sbooze values (%%(beer)s)' % self.table_prefix, + {'beer':"Cooper's"} + ) + else: + self.fail('Invalid paramstyle') + self.failUnless(cur.rowcount in (-1,1)) + + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2,'cursor.fetchall returned too few rows') + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Cooper's", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + self.assertEqual(beers[1],"Victoria Bitter", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + + def test_executemany(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + largs = [ ("Cooper's",) , ("Boag's",) ] + margs = [ {'beer': "Cooper's"}, {'beer': "Boag's"} ] + if self.driver.paramstyle == 'qmark': + cur.executemany( + 'insert into %sbooze values (?)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'numeric': + cur.executemany( + 'insert into %sbooze values (:1)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'named': + cur.executemany( + 'insert into %sbooze values (:beer)' % self.table_prefix, + margs + ) + elif self.driver.paramstyle == 'format': + cur.executemany( + 'insert into %sbooze values (%%s)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'pyformat': + cur.executemany( + 'insert into %sbooze values (%%(beer)s)' % ( + self.table_prefix + ), + margs + ) + else: + self.fail('Unknown paramstyle') + self.failUnless(cur.rowcount in (-1,2), + 'insert using cursor.executemany set cursor.rowcount to ' + 'incorrect value %r' % cur.rowcount + ) + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2, + 'cursor.fetchall retrieved incorrect number of rows' + ) + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Boag's",'incorrect data retrieved') + self.assertEqual(beers[1],"Cooper's",'incorrect data retrieved') + finally: + con.close() + + def test_fetchone(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchone should raise an Error if called before + # executing a select-type query + self.assertRaises(self.driver.Error,cur.fetchone) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannot return rows + self.executeDDL1(cur) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if a query retrieves ' + 'no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannot return rows + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchone() + self.assertEqual(len(r),1, + 'cursor.fetchone should have retrieved a single row' + ) + self.assertEqual(r[0],'Victoria Bitter', + 'cursor.fetchone retrieved incorrect data' + ) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if no more rows available' + ) + self.failUnless(cur.rowcount in (-1,1)) + finally: + con.close() + + samples = [ + 'Carlton Cold', + 'Carlton Draft', + 'Mountain Goat', + 'Redback', + 'Victoria Bitter', + 'XXXX' + ] + + def _populate(self): + ''' Return a list of sql commands to setup the DB for the fetch + tests. + ''' + populate = [ + "insert into %sbooze values ('%s')" % (self.table_prefix,s) + for s in self.samples + ] + return populate + + def test_fetchmany(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchmany should raise an Error if called without + #issuing a query + self.assertRaises(self.driver.Error,cur.fetchmany,4) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() + self.assertEqual(len(r),1, + 'cursor.fetchmany retrieved incorrect number of rows, ' + 'default of arraysize is one.' + ) + cur.arraysize=10 + r = cur.fetchmany(3) # Should get 3 rows + self.assertEqual(len(r),3, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should get 2 more + self.assertEqual(len(r),2, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should be an empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence after ' + 'results are exhausted' + ) + self.failUnless(cur.rowcount in (-1,6)) + + # Same as above, using cursor.arraysize + cur.arraysize=4 + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() # Should get 4 rows + self.assertEqual(len(r),4, + 'cursor.arraysize not being honoured by fetchmany' + ) + r = cur.fetchmany() # Should get 2 more + self.assertEqual(len(r),2) + r = cur.fetchmany() # Should be an empty sequence + self.assertEqual(len(r),0) + self.failUnless(cur.rowcount in (-1,6)) + + cur.arraysize=6 + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchmany() # Should get all rows + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows),6) + self.assertEqual(len(rows),6) + rows = [r[0] for r in rows] + rows.sort() + + # Make sure we get the right data back out + for i in range(0,6): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved by cursor.fetchmany' + ) + + rows = cur.fetchmany() # Should return an empty list + self.assertEqual(len(rows),0, + 'cursor.fetchmany should return an empty sequence if ' + 'called after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,6)) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + r = cur.fetchmany() # Should get empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence if ' + 'query retrieved no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + finally: + con.close() + + def test_fetchall(self): + con = self._connect() + try: + cur = con.cursor() + # cursor.fetchall should raise an Error if called + # without executing a query that may return rows (such + # as a select) + self.assertRaises(self.driver.Error, cur.fetchall) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + # cursor.fetchall should raise an Error if called + # after executing a a statement that cannot return rows + self.assertRaises(self.driver.Error,cur.fetchall) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,len(self.samples))) + self.assertEqual(len(rows),len(self.samples), + 'cursor.fetchall did not retrieve all rows' + ) + rows = [r[0] for r in rows] + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'cursor.fetchall retrieved incorrect rows' + ) + rows = cur.fetchall() + self.assertEqual( + len(rows),0, + 'cursor.fetchall should return an empty list if called ' + 'after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,len(self.samples))) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,0)) + self.assertEqual(len(rows),0, + 'cursor.fetchall should return an empty list if ' + 'a select query returns no rows' + ) + + finally: + con.close() + + def test_mixedfetch(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows1 = cur.fetchone() + rows23 = cur.fetchmany(2) + rows4 = cur.fetchone() + rows56 = cur.fetchall() + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows23),2, + 'fetchmany returned incorrect number of rows' + ) + self.assertEqual(len(rows56),2, + 'fetchall returned incorrect number of rows' + ) + + rows = [rows1[0]] + rows.extend([rows23[0][0],rows23[1][0]]) + rows.append(rows4[0]) + rows.extend([rows56[0][0],rows56[1][0]]) + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved or inserted' + ) + finally: + con.close() + + def help_nextset_setUp(self,cur): + ''' Should create a procedure called deleteme + that returns two result sets, first the + number of rows in booze then "name from booze" + ''' + raise NotImplementedError('Helper not implemented') + #sql=""" + # create procedure deleteme as + # begin + # select count(*) from booze + # select name from booze + # end + #""" + #cur.execute(sql) + + def help_nextset_tearDown(self,cur): + 'If cleaning up is needed after nextSetTest' + raise NotImplementedError('Helper not implemented') + #cur.execute("drop procedure deleteme") + + def test_nextset(self): + con = self._connect() + try: + cur = con.cursor() + if not hasattr(cur,'nextset'): + return + + try: + self.executeDDL1(cur) + sql=self._populate() + for sql in self._populate(): + cur.execute(sql) + + self.help_nextset_setUp(cur) + + cur.callproc('deleteme') + numberofrows=cur.fetchone() + assert numberofrows[0]== len(self.samples) + assert cur.nextset() + names=cur.fetchall() + assert len(names) == len(self.samples) + s=cur.nextset() + assert s == None,'No more return sets, should return None' + finally: + self.help_nextset_tearDown(cur) + + finally: + con.close() + + def test_nextset(self): + raise NotImplementedError('Drivers need to override this test') + + def test_arraysize(self): + # Not much here - rest of the tests for this are in test_fetchmany + con = self._connect() + try: + cur = con.cursor() + self.failUnless(hasattr(cur,'arraysize'), + 'cursor.arraysize must be defined' + ) + finally: + con.close() + + def test_setinputsizes(self): + con = self._connect() + try: + cur = con.cursor() + cur.setinputsizes( (25,) ) + self._paraminsert(cur) # Make sure cursor still works + finally: + con.close() + + def test_setoutputsize_basic(self): + # Basic test is to make sure setoutputsize doesn't blow up + con = self._connect() + try: + cur = con.cursor() + cur.setoutputsize(1000) + cur.setoutputsize(2000,0) + self._paraminsert(cur) # Make sure the cursor still works + finally: + con.close() + + def test_setoutputsize(self): + # Real test for setoutputsize is driver dependant + raise NotImplementedError('Driver needed to override this test') + + def test_None(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + cur.execute('insert into %sbooze values (NULL)' % self.table_prefix) + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchall() + self.assertEqual(len(r),1) + self.assertEqual(len(r[0]),1) + self.assertEqual(r[0][0],None,'NULL value not returned as None') + finally: + con.close() + + def test_Date(self): + d1 = self.driver.Date(2002,12,25) + d2 = self.driver.DateFromTicks(time.mktime((2002,12,25,0,0,0,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(d1),str(d2)) + + def test_Time(self): + t1 = self.driver.Time(13,45,30) + t2 = self.driver.TimeFromTicks(time.mktime((2001,1,1,13,45,30,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Timestamp(self): + t1 = self.driver.Timestamp(2002,12,25,13,45,30) + t2 = self.driver.TimestampFromTicks( + time.mktime((2002,12,25,13,45,30,0,0,0)) + ) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Binary(self): + b = self.driver.Binary(str2bytes('Something')) + b = self.driver.Binary(str2bytes('')) + + def test_STRING(self): + self.failUnless(hasattr(self.driver,'STRING'), + 'module.STRING must be defined' + ) + + def test_BINARY(self): + self.failUnless(hasattr(self.driver,'BINARY'), + 'module.BINARY must be defined.' + ) + + def test_NUMBER(self): + self.failUnless(hasattr(self.driver,'NUMBER'), + 'module.NUMBER must be defined.' + ) + + def test_DATETIME(self): + self.failUnless(hasattr(self.driver,'DATETIME'), + 'module.DATETIME must be defined.' + ) + + def test_ROWID(self): + self.failUnless(hasattr(self.driver,'ROWID'), + 'module.ROWID must be defined.' + ) + diff --git a/psycopg2/tests/dbapi20_tpc.py b/psycopg2/tests/dbapi20_tpc.py new file mode 100644 index 0000000..d4790f7 --- /dev/null +++ b/psycopg2/tests/dbapi20_tpc.py @@ -0,0 +1,144 @@ +""" Python DB API 2.0 driver Two Phase Commit compliance test suite. + +""" + +import unittest + + +class TwoPhaseCommitTests(unittest.TestCase): + + driver = None + + def connect(self): + """Make a database connection.""" + raise NotImplementedError + + _last_id = 0 + _global_id_prefix = "dbapi20_tpc:" + + def make_xid(self, con): + id = TwoPhaseCommitTests._last_id + TwoPhaseCommitTests._last_id += 1 + return con.xid(42, "%s%d" % (self._global_id_prefix, id), "qualifier") + + def test_xid(self): + con = self.connect() + try: + xid = con.xid(42, "global", "bqual") + except self.driver.NotSupportedError: + self.fail("Driver does not support transaction IDs.") + + self.assertEquals(xid[0], 42) + self.assertEquals(xid[1], "global") + self.assertEquals(xid[2], "bqual") + + # Try some extremes for the transaction ID: + xid = con.xid(0, "", "") + self.assertEquals(tuple(xid), (0, "", "")) + xid = con.xid(0x7fffffff, "a" * 64, "b" * 64) + self.assertEquals(tuple(xid), (0x7fffffff, "a" * 64, "b" * 64)) + + def test_tpc_begin(self): + con = self.connect() + try: + xid = self.make_xid(con) + try: + con.tpc_begin(xid) + except self.driver.NotSupportedError: + self.fail("Driver does not support tpc_begin()") + finally: + con.close() + + def test_tpc_commit_without_prepare(self): + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + cursor = con.cursor() + cursor.execute("SELECT 1") + con.tpc_commit() + finally: + con.close() + + def test_tpc_rollback_without_prepare(self): + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + cursor = con.cursor() + cursor.execute("SELECT 1") + con.tpc_rollback() + finally: + con.close() + + def test_tpc_commit_with_prepare(self): + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + cursor = con.cursor() + cursor.execute("SELECT 1") + con.tpc_prepare() + con.tpc_commit() + finally: + con.close() + + def test_tpc_rollback_with_prepare(self): + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + cursor = con.cursor() + cursor.execute("SELECT 1") + con.tpc_prepare() + con.tpc_rollback() + finally: + con.close() + + def test_tpc_begin_in_transaction_fails(self): + con = self.connect() + try: + xid = self.make_xid(con) + + cursor = con.cursor() + cursor.execute("SELECT 1") + self.assertRaises(self.driver.ProgrammingError, + con.tpc_begin, xid) + finally: + con.close() + + def test_tpc_begin_in_tpc_transaction_fails(self): + con = self.connect() + try: + xid = self.make_xid(con) + + cursor = con.cursor() + cursor.execute("SELECT 1") + self.assertRaises(self.driver.ProgrammingError, + con.tpc_begin, xid) + finally: + con.close() + + def test_commit_in_tpc_fails(self): + # calling commit() within a TPC transaction fails with + # ProgrammingError. + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + + self.assertRaises(self.driver.ProgrammingError, con.commit) + finally: + con.close() + + def test_rollback_in_tpc_fails(self): + # calling rollback() within a TPC transaction fails with + # ProgrammingError. + con = self.connect() + try: + xid = self.make_xid(con) + con.tpc_begin(xid) + + self.assertRaises(self.driver.ProgrammingError, con.rollback) + finally: + con.close() diff --git a/psycopg2/tests/test_async.py b/psycopg2/tests/test_async.py new file mode 100644 index 0000000..981b49f --- /dev/null +++ b/psycopg2/tests/test_async.py @@ -0,0 +1,468 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# test_async.py - unit test for asynchronous API +# +# Copyright (C) 2010-2011 Jan UrbaÅ„ski +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +from testutils import unittest, skip_before_postgres + +import psycopg2 +from psycopg2 import extensions + +import time +import select +import StringIO + +from testutils import ConnectingTestCase + +class PollableStub(object): + """A 'pollable' wrapper allowing analysis of the `poll()` calls.""" + def __init__(self, pollable): + self.pollable = pollable + self.polls = [] + + def fileno(self): + return self.pollable.fileno() + + def poll(self): + rv = self.pollable.poll() + self.polls.append(rv) + return rv + + +class AsyncTests(ConnectingTestCase): + + def setUp(self): + ConnectingTestCase.setUp(self) + + self.sync_conn = self.conn + self.conn = self.connect(async=True) + + self.wait(self.conn) + + curs = self.conn.cursor() + curs.execute(''' + CREATE TEMPORARY TABLE table1 ( + id int PRIMARY KEY + )''') + self.wait(curs) + + def wait(self, cur_or_conn): + pollable = cur_or_conn + if not hasattr(pollable, 'poll'): + pollable = cur_or_conn.connection + while True: + state = pollable.poll() + if state == psycopg2.extensions.POLL_OK: + break + elif state == psycopg2.extensions.POLL_READ: + select.select([pollable], [], []) + elif state == psycopg2.extensions.POLL_WRITE: + select.select([], [pollable], []) + else: + raise Exception("Unexpected result from poll: %r", state) + + def test_connection_setup(self): + cur = self.conn.cursor() + sync_cur = self.sync_conn.cursor() + + self.assert_(self.conn.async) + self.assert_(not self.sync_conn.async) + + # the async connection should be in isolevel 0 + self.assertEquals(self.conn.isolation_level, 0) + + # check other properties to be found on the connection + self.assert_(self.conn.server_version) + self.assert_(self.conn.protocol_version in (2,3)) + self.assert_(self.conn.encoding in psycopg2.extensions.encodings) + + def test_async_named_cursor(self): + self.assertRaises(psycopg2.ProgrammingError, + self.conn.cursor, "name") + + def test_async_select(self): + cur = self.conn.cursor() + self.assertFalse(self.conn.isexecuting()) + cur.execute("select 'a'") + self.assertTrue(self.conn.isexecuting()) + + self.wait(cur) + + self.assertFalse(self.conn.isexecuting()) + self.assertEquals(cur.fetchone()[0], "a") + + @skip_before_postgres(8, 2) + def test_async_callproc(self): + cur = self.conn.cursor() + cur.callproc("pg_sleep", (0.1, )) + self.assertTrue(self.conn.isexecuting()) + + self.wait(cur) + self.assertFalse(self.conn.isexecuting()) + self.assertEquals(cur.fetchall()[0][0], '') + + def test_async_after_async(self): + cur = self.conn.cursor() + cur2 = self.conn.cursor() + + cur.execute("insert into table1 values (1)") + + # an async execute after an async one raises an exception + self.assertRaises(psycopg2.ProgrammingError, + cur.execute, "select * from table1") + # same for callproc + self.assertRaises(psycopg2.ProgrammingError, + cur.callproc, "version") + # but after you've waited it should be good + self.wait(cur) + cur.execute("select * from table1") + self.wait(cur) + + self.assertEquals(cur.fetchall()[0][0], 1) + + cur.execute("delete from table1") + self.wait(cur) + + cur.execute("select * from table1") + self.wait(cur) + + self.assertEquals(cur.fetchone(), None) + + def test_fetch_after_async(self): + cur = self.conn.cursor() + cur.execute("select 'a'") + + # a fetch after an asynchronous query should raise an error + self.assertRaises(psycopg2.ProgrammingError, + cur.fetchall) + # but after waiting it should work + self.wait(cur) + self.assertEquals(cur.fetchall()[0][0], "a") + + def test_rollback_while_async(self): + cur = self.conn.cursor() + + cur.execute("select 'a'") + + # a rollback should not work in asynchronous mode + self.assertRaises(psycopg2.ProgrammingError, self.conn.rollback) + + def test_commit_while_async(self): + cur = self.conn.cursor() + + cur.execute("begin") + self.wait(cur) + + cur.execute("insert into table1 values (1)") + + # a commit should not work in asynchronous mode + self.assertRaises(psycopg2.ProgrammingError, self.conn.commit) + self.assertTrue(self.conn.isexecuting()) + + # but a manual commit should + self.wait(cur) + cur.execute("commit") + self.wait(cur) + + cur.execute("select * from table1") + self.wait(cur) + self.assertEquals(cur.fetchall()[0][0], 1) + + cur.execute("delete from table1") + self.wait(cur) + + cur.execute("select * from table1") + self.wait(cur) + self.assertEquals(cur.fetchone(), None) + + def test_set_parameters_while_async(self): + cur = self.conn.cursor() + + cur.execute("select 'c'") + self.assertTrue(self.conn.isexecuting()) + + # getting transaction status works + self.assertEquals(self.conn.get_transaction_status(), + extensions.TRANSACTION_STATUS_ACTIVE) + self.assertTrue(self.conn.isexecuting()) + + # setting connection encoding should fail + self.assertRaises(psycopg2.ProgrammingError, + self.conn.set_client_encoding, "LATIN1") + + # same for transaction isolation + self.assertRaises(psycopg2.ProgrammingError, + self.conn.set_isolation_level, 1) + + def test_reset_while_async(self): + cur = self.conn.cursor() + cur.execute("select 'c'") + self.assertTrue(self.conn.isexecuting()) + + # a reset should fail + self.assertRaises(psycopg2.ProgrammingError, self.conn.reset) + + def test_async_iter(self): + cur = self.conn.cursor() + + cur.execute("begin") + self.wait(cur) + cur.execute(""" + insert into table1 values (1); + insert into table1 values (2); + insert into table1 values (3); + """) + self.wait(cur) + cur.execute("select id from table1 order by id") + + # iteration fails if a query is underway + self.assertRaises(psycopg2.ProgrammingError, list, cur) + + # but after it's done it should work + self.wait(cur) + self.assertEquals(list(cur), [(1, ), (2, ), (3, )]) + self.assertFalse(self.conn.isexecuting()) + + def test_copy_while_async(self): + cur = self.conn.cursor() + cur.execute("select 'a'") + + # copy should fail + self.assertRaises(psycopg2.ProgrammingError, + cur.copy_from, + StringIO.StringIO("1\n3\n5\n\\.\n"), "table1") + + def test_lobject_while_async(self): + # large objects should be prohibited + self.assertRaises(psycopg2.ProgrammingError, + self.conn.lobject) + + def test_async_executemany(self): + cur = self.conn.cursor() + self.assertRaises( + psycopg2.ProgrammingError, + cur.executemany, "insert into table1 values (%s)", [1, 2, 3]) + + def test_async_scroll(self): + cur = self.conn.cursor() + cur.execute(""" + insert into table1 values (1); + insert into table1 values (2); + insert into table1 values (3); + """) + self.wait(cur) + cur.execute("select id from table1 order by id") + + # scroll should fail if a query is underway + self.assertRaises(psycopg2.ProgrammingError, cur.scroll, 1) + self.assertTrue(self.conn.isexecuting()) + + # but after it's done it should work + self.wait(cur) + cur.scroll(1) + self.assertEquals(cur.fetchall(), [(2, ), (3, )]) + + cur = self.conn.cursor() + cur.execute("select id from table1 order by id") + self.wait(cur) + + cur2 = self.conn.cursor() + self.assertRaises(psycopg2.ProgrammingError, cur2.scroll, 1) + + self.assertRaises(psycopg2.ProgrammingError, cur.scroll, 4) + + cur = self.conn.cursor() + cur.execute("select id from table1 order by id") + self.wait(cur) + cur.scroll(2) + cur.scroll(-1) + self.assertEquals(cur.fetchall(), [(2, ), (3, )]) + + def test_scroll(self): + cur = self.sync_conn.cursor() + cur.execute("create table table1 (id int)") + cur.execute(""" + insert into table1 values (1); + insert into table1 values (2); + insert into table1 values (3); + """) + cur.execute("select id from table1 order by id") + cur.scroll(2) + cur.scroll(-1) + self.assertEquals(cur.fetchall(), [(2, ), (3, )]) + + def test_async_dont_read_all(self): + cur = self.conn.cursor() + cur.execute("select repeat('a', 10000); select repeat('b', 10000)") + + # fetch the result + self.wait(cur) + + # it should be the result of the second query + self.assertEquals(cur.fetchone()[0], "b" * 10000) + + def test_async_subclass(self): + class MyConn(psycopg2.extensions.connection): + def __init__(self, dsn, async=0): + psycopg2.extensions.connection.__init__(self, dsn, async=async) + + conn = self.connect(connection_factory=MyConn, async=True) + self.assert_(isinstance(conn, MyConn)) + self.assert_(conn.async) + conn.close() + + def test_flush_on_write(self): + # a very large query requires a flush loop to be sent to the backend + curs = self.conn.cursor() + for mb in 1, 5, 10, 20, 50: + size = mb * 1024 * 1024 + stub = PollableStub(self.conn) + curs.execute("select %s;", ('x' * size,)) + self.wait(stub) + self.assertEqual(size, len(curs.fetchone()[0])) + if stub.polls.count(psycopg2.extensions.POLL_WRITE) > 1: + return + + # This is more a testing glitch than an error: it happens + # on high load on linux: probably because the kernel has more + # buffers ready. A warning may be useful during development, + # but an error is bad during regression testing. + import warnings + warnings.warn("sending a large query didn't trigger block on write.") + + def test_sync_poll(self): + cur = self.sync_conn.cursor() + cur.execute("select 1") + # polling with a sync query works + cur.connection.poll() + self.assertEquals(cur.fetchone()[0], 1) + + def test_notify(self): + cur = self.conn.cursor() + sync_cur = self.sync_conn.cursor() + + sync_cur.execute("listen test_notify") + self.sync_conn.commit() + cur.execute("notify test_notify") + self.wait(cur) + + self.assertEquals(self.sync_conn.notifies, []) + + pid = self.conn.get_backend_pid() + for _ in range(5): + self.wait(self.sync_conn) + if not self.sync_conn.notifies: + time.sleep(0.5) + continue + self.assertEquals(len(self.sync_conn.notifies), 1) + self.assertEquals(self.sync_conn.notifies.pop(), + (pid, "test_notify")) + return + self.fail("No NOTIFY in 2.5 seconds") + + def test_async_fetch_wrong_cursor(self): + cur1 = self.conn.cursor() + cur2 = self.conn.cursor() + cur1.execute("select 1") + + self.wait(cur1) + self.assertFalse(self.conn.isexecuting()) + # fetching from a cursor with no results is an error + self.assertRaises(psycopg2.ProgrammingError, cur2.fetchone) + # fetching from the correct cursor works + self.assertEquals(cur1.fetchone()[0], 1) + + def test_error(self): + cur = self.conn.cursor() + cur.execute("insert into table1 values (%s)", (1, )) + self.wait(cur) + cur.execute("insert into table1 values (%s)", (1, )) + # this should fail + self.assertRaises(psycopg2.IntegrityError, self.wait, cur) + cur.execute("insert into table1 values (%s); " + "insert into table1 values (%s)", (2, 2)) + # this should fail as well + self.assertRaises(psycopg2.IntegrityError, self.wait, cur) + # but this should work + cur.execute("insert into table1 values (%s)", (2, )) + self.wait(cur) + # and the cursor should be usable afterwards + cur.execute("insert into table1 values (%s)", (3, )) + self.wait(cur) + cur.execute("select * from table1 order by id") + self.wait(cur) + self.assertEquals(cur.fetchall(), [(1, ), (2, ), (3, )]) + cur.execute("delete from table1") + self.wait(cur) + + def test_error_two_cursors(self): + cur = self.conn.cursor() + cur2 = self.conn.cursor() + cur.execute("select * from no_such_table") + self.assertRaises(psycopg2.ProgrammingError, self.wait, cur) + cur2.execute("select 1") + self.wait(cur2) + self.assertEquals(cur2.fetchone()[0], 1) + + def test_notices(self): + del self.conn.notices[:] + cur = self.conn.cursor() + if self.conn.server_version >= 90300: + cur.execute("set client_min_messages=debug1") + self.wait(cur) + cur.execute("create temp table chatty (id serial primary key);") + self.wait(cur) + self.assertEqual("CREATE TABLE", cur.statusmessage) + self.assert_(self.conn.notices) + + def test_async_cursor_gone(self): + import gc + cur = self.conn.cursor() + cur.execute("select 42;"); + del cur + gc.collect() + self.assertRaises(psycopg2.InterfaceError, self.wait, self.conn) + + # The connection is still usable + cur = self.conn.cursor() + cur.execute("select 42;"); + self.wait(self.conn) + self.assertEqual(cur.fetchone(), (42,)) + + def test_async_connection_error_message(self): + try: + cnn = psycopg2.connect('dbname=thisdatabasedoesntexist', async=True) + self.wait(cnn) + except psycopg2.Error, e: + self.assertNotEqual(str(e), "asynchronous connection failed", + "connection error reason lost") + else: + self.fail("no exception raised") + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() + diff --git a/psycopg2/tests/test_bugX000.py b/psycopg2/tests/test_bugX000.py new file mode 100644 index 0000000..efa593e --- /dev/null +++ b/psycopg2/tests/test_bugX000.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# bugX000.py - test for DateTime object allocation bug +# +# Copyright (C) 2007-2011 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import psycopg2 +import time +import unittest + +class DateTimeAllocationBugTestCase(unittest.TestCase): + def test_date_time_allocation_bug(self): + d1 = psycopg2.Date(2002,12,25) + d2 = psycopg2.DateFromTicks(time.mktime((2002,12,25,0,0,0,0,0,0))) + t1 = psycopg2.Time(13,45,30) + t2 = psycopg2.TimeFromTicks(time.mktime((2001,1,1,13,45,30,0,0,0))) + t1 = psycopg2.Timestamp(2002,12,25,13,45,30) + t2 = psycopg2.TimestampFromTicks( + time.mktime((2002,12,25,13,45,30,0,0,0))) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_bug_gc.py b/psycopg2/tests/test_bug_gc.py new file mode 100644 index 0000000..1551dc4 --- /dev/null +++ b/psycopg2/tests/test_bug_gc.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# bug_gc.py - test for refcounting/GC bug +# +# Copyright (C) 2010-2011 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import psycopg2 +import psycopg2.extensions +import unittest +import gc + +from testutils import ConnectingTestCase, skip_if_no_uuid + +class StolenReferenceTestCase(ConnectingTestCase): + @skip_if_no_uuid + def test_stolen_reference_bug(self): + def fish(val, cur): + gc.collect() + return 42 + UUID = psycopg2.extensions.new_type((2950,), "UUID", fish) + psycopg2.extensions.register_type(UUID, self.conn) + curs = self.conn.cursor() + curs.execute("select 'b5219e01-19ab-4994-b71e-149225dc51e4'::uuid") + curs.fetchone() + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_cancel.py b/psycopg2/tests/test_cancel.py new file mode 100644 index 0000000..0ffa742 --- /dev/null +++ b/psycopg2/tests/test_cancel.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# test_cancel.py - unit test for query cancellation +# +# Copyright (C) 2010-2011 Jan UrbaÅ„ski +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import threading + +import psycopg2 +import psycopg2.extensions +from psycopg2 import extras + +from testconfig import dsn +from testutils import unittest, ConnectingTestCase, skip_before_postgres + +class CancelTests(ConnectingTestCase): + + def setUp(self): + ConnectingTestCase.setUp(self) + + cur = self.conn.cursor() + cur.execute(''' + CREATE TEMPORARY TABLE table1 ( + id int PRIMARY KEY + )''') + self.conn.commit() + + def test_empty_cancel(self): + self.conn.cancel() + + @skip_before_postgres(8, 2) + def test_cancel(self): + errors = [] + + def neverending(conn): + cur = conn.cursor() + try: + self.assertRaises(psycopg2.extensions.QueryCanceledError, + cur.execute, "select pg_sleep(60)") + # make sure the connection still works + conn.rollback() + cur.execute("select 1") + self.assertEqual(cur.fetchall(), [(1, )]) + except Exception, e: + errors.append(e) + raise + + def canceller(conn): + cur = conn.cursor() + try: + conn.cancel() + except Exception, e: + errors.append(e) + raise + + thread1 = threading.Thread(target=neverending, args=(self.conn, )) + # wait a bit to make sure that the other thread is already in + # pg_sleep -- ugly and racy, but the chances are ridiculously low + thread2 = threading.Timer(0.3, canceller, args=(self.conn, )) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + + self.assertEqual(errors, []) + + @skip_before_postgres(8, 2) + def test_async_cancel(self): + async_conn = psycopg2.connect(dsn, async=True) + self.assertRaises(psycopg2.OperationalError, async_conn.cancel) + extras.wait_select(async_conn) + cur = async_conn.cursor() + cur.execute("select pg_sleep(10000)") + self.assertTrue(async_conn.isexecuting()) + async_conn.cancel() + self.assertRaises(psycopg2.extensions.QueryCanceledError, + extras.wait_select, async_conn) + cur.execute("select 1") + extras.wait_select(async_conn) + self.assertEqual(cur.fetchall(), [(1, )]) + + def test_async_connection_cancel(self): + async_conn = psycopg2.connect(dsn, async=True) + async_conn.close() + self.assertTrue(async_conn.closed) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_connection.py b/psycopg2/tests/test_connection.py new file mode 100644 index 0000000..26ad932 --- /dev/null +++ b/psycopg2/tests/test_connection.py @@ -0,0 +1,1053 @@ +#!/usr/bin/env python + +# test_connection.py - unit test for connection attributes +# +# Copyright (C) 2008-2011 James Henstridge +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import os +import time +import threading +from operator import attrgetter + +import psycopg2 +import psycopg2.errorcodes +import psycopg2.extensions + +from testutils import unittest, decorate_all_tests, skip_if_no_superuser +from testutils import skip_before_postgres, skip_after_postgres +from testutils import ConnectingTestCase, skip_if_tpc_disabled +from testconfig import dsn, dbname + + +class ConnectionTests(ConnectingTestCase): + def test_closed_attribute(self): + conn = self.conn + self.assertEqual(conn.closed, False) + conn.close() + self.assertEqual(conn.closed, True) + + def test_close_idempotent(self): + conn = self.conn + conn.close() + conn.close() + self.assert_(conn.closed) + + def test_cursor_closed_attribute(self): + conn = self.conn + curs = conn.cursor() + self.assertEqual(curs.closed, False) + curs.close() + self.assertEqual(curs.closed, True) + + # Closing the connection closes the cursor: + curs = conn.cursor() + conn.close() + self.assertEqual(curs.closed, True) + + @skip_before_postgres(8, 4) + @skip_if_no_superuser + def test_cleanup_on_badconn_close(self): + # ticket #148 + conn = self.conn + cur = conn.cursor() + try: + cur.execute("select pg_terminate_backend(pg_backend_pid())") + except psycopg2.OperationalError, e: + if e.pgcode != psycopg2.errorcodes.ADMIN_SHUTDOWN: + raise + except psycopg2.DatabaseError, e: + # curiously when disconnected in green mode we get a DatabaseError + # without pgcode. + if e.pgcode is not None: + raise + + self.assertEqual(conn.closed, 2) + conn.close() + self.assertEqual(conn.closed, 1) + + def test_reset(self): + conn = self.conn + # switch isolation level, then reset + level = conn.isolation_level + conn.set_isolation_level(0) + self.assertEqual(conn.isolation_level, 0) + conn.reset() + # now the isolation level should be equal to saved one + self.assertEqual(conn.isolation_level, level) + + def test_notices(self): + conn = self.conn + cur = conn.cursor() + if self.conn.server_version >= 90300: + cur.execute("set client_min_messages=debug1") + cur.execute("create temp table chatty (id serial primary key);") + self.assertEqual("CREATE TABLE", cur.statusmessage) + self.assert_(conn.notices) + + def test_notices_consistent_order(self): + conn = self.conn + cur = conn.cursor() + if self.conn.server_version >= 90300: + cur.execute("set client_min_messages=debug1") + cur.execute("create temp table table1 (id serial); create temp table table2 (id serial);") + cur.execute("create temp table table3 (id serial); create temp table table4 (id serial);") + self.assertEqual(4, len(conn.notices)) + self.assert_('table1' in conn.notices[0]) + self.assert_('table2' in conn.notices[1]) + self.assert_('table3' in conn.notices[2]) + self.assert_('table4' in conn.notices[3]) + + def test_notices_limited(self): + conn = self.conn + cur = conn.cursor() + if self.conn.server_version >= 90300: + cur.execute("set client_min_messages=debug1") + for i in range(0, 100, 10): + sql = " ".join(["create temp table table%d (id serial);" % j for j in range(i, i+10)]) + cur.execute(sql) + + self.assertEqual(50, len(conn.notices)) + self.assert_('table50' in conn.notices[0], conn.notices[0]) + self.assert_('table51' in conn.notices[1], conn.notices[1]) + self.assert_('table98' in conn.notices[-2], conn.notices[-2]) + self.assert_('table99' in conn.notices[-1], conn.notices[-1]) + + def test_server_version(self): + self.assert_(self.conn.server_version) + + def test_protocol_version(self): + self.assert_(self.conn.protocol_version in (2,3), + self.conn.protocol_version) + + def test_tpc_unsupported(self): + cnn = self.conn + if cnn.server_version >= 80100: + return self.skipTest("tpc is supported") + + self.assertRaises(psycopg2.NotSupportedError, + cnn.xid, 42, "foo", "bar") + + @skip_before_postgres(8, 2) + def test_concurrent_execution(self): + def slave(): + cnn = self.connect() + cur = cnn.cursor() + cur.execute("select pg_sleep(4)") + cur.close() + cnn.close() + + t1 = threading.Thread(target=slave) + t2 = threading.Thread(target=slave) + t0 = time.time() + t1.start() + t2.start() + t1.join() + t2.join() + self.assert_(time.time() - t0 < 7, + "something broken in concurrency") + + def test_encoding_name(self): + self.conn.set_client_encoding("EUC_JP") + # conn.encoding is 'EUCJP' now. + cur = self.conn.cursor() + psycopg2.extensions.register_type(psycopg2.extensions.UNICODE, cur) + cur.execute("select 'foo'::text;") + self.assertEqual(cur.fetchone()[0], u'foo') + + def test_connect_nonnormal_envvar(self): + # We must perform encoding normalization at connection time + self.conn.close() + oldenc = os.environ.get('PGCLIENTENCODING') + os.environ['PGCLIENTENCODING'] = 'utf-8' # malformed spelling + try: + self.conn = self.connect() + finally: + if oldenc is not None: + os.environ['PGCLIENTENCODING'] = oldenc + else: + del os.environ['PGCLIENTENCODING'] + + def test_weakref(self): + from weakref import ref + import gc + conn = psycopg2.connect(dsn) + w = ref(conn) + conn.close() + del conn + gc.collect() + self.assert_(w() is None) + + def test_commit_concurrency(self): + # The problem is the one reported in ticket #103. Because of bad + # status check, we commit even when a commit is already on its way. + # We can detect this condition by the warnings. + conn = self.conn + notices = [] + stop = [] + + def committer(): + while not stop: + conn.commit() + while conn.notices: + notices.append((2, conn.notices.pop())) + + cur = conn.cursor() + t1 = threading.Thread(target=committer) + t1.start() + i = 1 + for i in range(1000): + cur.execute("select %s;",(i,)) + conn.commit() + while conn.notices: + notices.append((1, conn.notices.pop())) + + # Stop the committer thread + stop.append(True) + + self.assert_(not notices, "%d notices raised" % len(notices)) + + def test_connect_cursor_factory(self): + import psycopg2.extras + conn = self.connect(cursor_factory=psycopg2.extras.DictCursor) + cur = conn.cursor() + cur.execute("select 1 as a") + self.assertEqual(cur.fetchone()['a'], 1) + + def test_cursor_factory(self): + self.assertEqual(self.conn.cursor_factory, None) + cur = self.conn.cursor() + cur.execute("select 1 as a") + self.assertRaises(TypeError, (lambda r: r['a']), cur.fetchone()) + + self.conn.cursor_factory = psycopg2.extras.DictCursor + self.assertEqual(self.conn.cursor_factory, psycopg2.extras.DictCursor) + cur = self.conn.cursor() + cur.execute("select 1 as a") + self.assertEqual(cur.fetchone()['a'], 1) + + self.conn.cursor_factory = None + self.assertEqual(self.conn.cursor_factory, None) + cur = self.conn.cursor() + cur.execute("select 1 as a") + self.assertRaises(TypeError, (lambda r: r['a']), cur.fetchone()) + + +class IsolationLevelsTestCase(ConnectingTestCase): + + def setUp(self): + ConnectingTestCase.setUp(self) + + conn = self.connect() + cur = conn.cursor() + try: + cur.execute("drop table isolevel;") + except psycopg2.ProgrammingError: + conn.rollback() + cur.execute("create table isolevel (id integer);") + conn.commit() + conn.close() + + def test_isolation_level(self): + conn = self.connect() + self.assertEqual( + conn.isolation_level, + psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED) + + def test_encoding(self): + conn = self.connect() + self.assert_(conn.encoding in psycopg2.extensions.encodings) + + def test_set_isolation_level(self): + conn = self.connect() + curs = conn.cursor() + + levels = [ + (None, psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT), + ('read uncommitted', psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED), + ('read committed', psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED), + ('repeatable read', psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ), + ('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE), + ] + for name, level in levels: + conn.set_isolation_level(level) + + # the only values available on prehistoric PG versions + if conn.server_version < 80000: + if level in ( + psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED, + psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ): + name, level = levels[levels.index((name, level)) + 1] + + self.assertEqual(conn.isolation_level, level) + + curs.execute('show transaction_isolation;') + got_name = curs.fetchone()[0] + + if name is None: + curs.execute('show default_transaction_isolation;') + name = curs.fetchone()[0] + + self.assertEqual(name, got_name) + conn.commit() + + self.assertRaises(ValueError, conn.set_isolation_level, -1) + self.assertRaises(ValueError, conn.set_isolation_level, 5) + + def test_set_isolation_level_abort(self): + conn = self.connect() + cur = conn.cursor() + + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_IDLE, + conn.get_transaction_status()) + cur.execute("insert into isolevel values (10);") + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_INTRANS, + conn.get_transaction_status()) + + conn.set_isolation_level( + psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE) + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_IDLE, + conn.get_transaction_status()) + cur.execute("select count(*) from isolevel;") + self.assertEqual(0, cur.fetchone()[0]) + + cur.execute("insert into isolevel values (10);") + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_INTRANS, + conn.get_transaction_status()) + conn.set_isolation_level( + psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_IDLE, + conn.get_transaction_status()) + cur.execute("select count(*) from isolevel;") + self.assertEqual(0, cur.fetchone()[0]) + + cur.execute("insert into isolevel values (10);") + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_IDLE, + conn.get_transaction_status()) + conn.set_isolation_level( + psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED) + self.assertEqual(psycopg2.extensions.TRANSACTION_STATUS_IDLE, + conn.get_transaction_status()) + cur.execute("select count(*) from isolevel;") + self.assertEqual(1, cur.fetchone()[0]) + + def test_isolation_level_autocommit(self): + cnn1 = self.connect() + cnn2 = self.connect() + cnn2.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) + + cur1 = cnn1.cursor() + cur1.execute("select count(*) from isolevel;") + self.assertEqual(0, cur1.fetchone()[0]) + cnn1.commit() + + cur2 = cnn2.cursor() + cur2.execute("insert into isolevel values (10);") + + cur1.execute("select count(*) from isolevel;") + self.assertEqual(1, cur1.fetchone()[0]) + + def test_isolation_level_read_committed(self): + cnn1 = self.connect() + cnn2 = self.connect() + cnn2.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED) + + cur1 = cnn1.cursor() + cur1.execute("select count(*) from isolevel;") + self.assertEqual(0, cur1.fetchone()[0]) + cnn1.commit() + + cur2 = cnn2.cursor() + cur2.execute("insert into isolevel values (10);") + cur1.execute("insert into isolevel values (20);") + + cur2.execute("select count(*) from isolevel;") + self.assertEqual(1, cur2.fetchone()[0]) + cnn1.commit() + cur2.execute("select count(*) from isolevel;") + self.assertEqual(2, cur2.fetchone()[0]) + + cur1.execute("select count(*) from isolevel;") + self.assertEqual(1, cur1.fetchone()[0]) + cnn2.commit() + cur1.execute("select count(*) from isolevel;") + self.assertEqual(2, cur1.fetchone()[0]) + + def test_isolation_level_serializable(self): + cnn1 = self.connect() + cnn2 = self.connect() + cnn2.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE) + + cur1 = cnn1.cursor() + cur1.execute("select count(*) from isolevel;") + self.assertEqual(0, cur1.fetchone()[0]) + cnn1.commit() + + cur2 = cnn2.cursor() + cur2.execute("insert into isolevel values (10);") + cur1.execute("insert into isolevel values (20);") + + cur2.execute("select count(*) from isolevel;") + self.assertEqual(1, cur2.fetchone()[0]) + cnn1.commit() + cur2.execute("select count(*) from isolevel;") + self.assertEqual(1, cur2.fetchone()[0]) + + cur1.execute("select count(*) from isolevel;") + self.assertEqual(1, cur1.fetchone()[0]) + cnn2.commit() + cur1.execute("select count(*) from isolevel;") + self.assertEqual(2, cur1.fetchone()[0]) + + cur2.execute("select count(*) from isolevel;") + self.assertEqual(2, cur2.fetchone()[0]) + + def test_isolation_level_closed(self): + cnn = self.connect() + cnn.close() + self.assertRaises(psycopg2.InterfaceError, getattr, + cnn, 'isolation_level') + self.assertRaises(psycopg2.InterfaceError, + cnn.set_isolation_level, 0) + self.assertRaises(psycopg2.InterfaceError, + cnn.set_isolation_level, 1) + + +class ConnectionTwoPhaseTests(ConnectingTestCase): + def setUp(self): + ConnectingTestCase.setUp(self) + + self.make_test_table() + self.clear_test_xacts() + + def tearDown(self): + self.clear_test_xacts() + ConnectingTestCase.tearDown(self) + + def clear_test_xacts(self): + """Rollback all the prepared transaction in the testing db.""" + cnn = self.connect() + cnn.set_isolation_level(0) + cur = cnn.cursor() + try: + cur.execute( + "select gid from pg_prepared_xacts where database = %s", + (dbname,)) + except psycopg2.ProgrammingError: + cnn.rollback() + cnn.close() + return + + gids = [ r[0] for r in cur ] + for gid in gids: + cur.execute("rollback prepared %s;", (gid,)) + cnn.close() + + def make_test_table(self): + cnn = self.connect() + cur = cnn.cursor() + try: + cur.execute("DROP TABLE test_tpc;") + except psycopg2.ProgrammingError: + cnn.rollback() + cur.execute("CREATE TABLE test_tpc (data text);") + cnn.commit() + cnn.close() + + def count_xacts(self): + """Return the number of prepared xacts currently in the test db.""" + cnn = self.connect() + cur = cnn.cursor() + cur.execute(""" + select count(*) from pg_prepared_xacts + where database = %s;""", + (dbname,)) + rv = cur.fetchone()[0] + cnn.close() + return rv + + def count_test_records(self): + """Return the number of records in the test table.""" + cnn = self.connect() + cur = cnn.cursor() + cur.execute("select count(*) from test_tpc;") + rv = cur.fetchone()[0] + cnn.close() + return rv + + def test_tpc_commit(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_commit');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_prepare() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_PREPARED) + self.assertEqual(1, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_commit() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(1, self.count_test_records()) + + def test_tpc_commit_one_phase(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_commit_1p');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_commit() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(1, self.count_test_records()) + + def test_tpc_commit_recovered(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_commit_rec');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_prepare() + cnn.close() + self.assertEqual(1, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + cnn.tpc_commit(xid) + + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(1, self.count_test_records()) + + def test_tpc_rollback(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_rollback');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_prepare() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_PREPARED) + self.assertEqual(1, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_rollback() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + def test_tpc_rollback_one_phase(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_rollback_1p');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_rollback() + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + def test_tpc_rollback_recovered(self): + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + + cnn.tpc_begin(xid) + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_BEGIN) + + cur = cnn.cursor() + cur.execute("insert into test_tpc values ('test_tpc_commit_rec');") + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn.tpc_prepare() + cnn.close() + self.assertEqual(1, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + cnn = self.connect() + xid = cnn.xid(1, "gtrid", "bqual") + cnn.tpc_rollback(xid) + + self.assertEqual(cnn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(0, self.count_xacts()) + self.assertEqual(0, self.count_test_records()) + + def test_status_after_recover(self): + cnn = self.connect() + self.assertEqual(psycopg2.extensions.STATUS_READY, cnn.status) + xns = cnn.tpc_recover() + self.assertEqual(psycopg2.extensions.STATUS_READY, cnn.status) + + cur = cnn.cursor() + cur.execute("select 1") + self.assertEqual(psycopg2.extensions.STATUS_BEGIN, cnn.status) + xns = cnn.tpc_recover() + self.assertEqual(psycopg2.extensions.STATUS_BEGIN, cnn.status) + + def test_recovered_xids(self): + # insert a few test xns + cnn = self.connect() + cnn.set_isolation_level(0) + cur = cnn.cursor() + cur.execute("begin; prepare transaction '1-foo';") + cur.execute("begin; prepare transaction '2-bar';") + + # read the values to return + cur.execute(""" + select gid, prepared, owner, database + from pg_prepared_xacts + where database = %s;""", + (dbname,)) + okvals = cur.fetchall() + okvals.sort() + + cnn = self.connect() + xids = cnn.tpc_recover() + xids = [ xid for xid in xids if xid.database == dbname ] + xids.sort(key=attrgetter('gtrid')) + + # check the values returned + self.assertEqual(len(okvals), len(xids)) + for (xid, (gid, prepared, owner, database)) in zip (xids, okvals): + self.assertEqual(xid.gtrid, gid) + self.assertEqual(xid.prepared, prepared) + self.assertEqual(xid.owner, owner) + self.assertEqual(xid.database, database) + + def test_xid_encoding(self): + cnn = self.connect() + xid = cnn.xid(42, "gtrid", "bqual") + cnn.tpc_begin(xid) + cnn.tpc_prepare() + + cnn = self.connect() + cur = cnn.cursor() + cur.execute("select gid from pg_prepared_xacts where database = %s;", + (dbname,)) + self.assertEqual('42_Z3RyaWQ=_YnF1YWw=', cur.fetchone()[0]) + + def test_xid_roundtrip(self): + for fid, gtrid, bqual in [ + (0, "", ""), + (42, "gtrid", "bqual"), + (0x7fffffff, "x" * 64, "y" * 64), + ]: + cnn = self.connect() + xid = cnn.xid(fid, gtrid, bqual) + cnn.tpc_begin(xid) + cnn.tpc_prepare() + cnn.close() + + cnn = self.connect() + xids = [ xid for xid in cnn.tpc_recover() + if xid.database == dbname ] + self.assertEqual(1, len(xids)) + xid = xids[0] + self.assertEqual(xid.format_id, fid) + self.assertEqual(xid.gtrid, gtrid) + self.assertEqual(xid.bqual, bqual) + + cnn.tpc_rollback(xid) + + def test_unparsed_roundtrip(self): + for tid in [ + '', + 'hello, world!', + 'x' * 199, # PostgreSQL's limit in transaction id length + ]: + cnn = self.connect() + cnn.tpc_begin(tid) + cnn.tpc_prepare() + cnn.close() + + cnn = self.connect() + xids = [ xid for xid in cnn.tpc_recover() + if xid.database == dbname ] + self.assertEqual(1, len(xids)) + xid = xids[0] + self.assertEqual(xid.format_id, None) + self.assertEqual(xid.gtrid, tid) + self.assertEqual(xid.bqual, None) + + cnn.tpc_rollback(xid) + + def test_xid_construction(self): + from psycopg2.extensions import Xid + + x1 = Xid(74, 'foo', 'bar') + self.assertEqual(74, x1.format_id) + self.assertEqual('foo', x1.gtrid) + self.assertEqual('bar', x1.bqual) + + def test_xid_from_string(self): + from psycopg2.extensions import Xid + + x2 = Xid.from_string('42_Z3RyaWQ=_YnF1YWw=') + self.assertEqual(42, x2.format_id) + self.assertEqual('gtrid', x2.gtrid) + self.assertEqual('bqual', x2.bqual) + + x3 = Xid.from_string('99_xxx_yyy') + self.assertEqual(None, x3.format_id) + self.assertEqual('99_xxx_yyy', x3.gtrid) + self.assertEqual(None, x3.bqual) + + def test_xid_to_string(self): + from psycopg2.extensions import Xid + + x1 = Xid.from_string('42_Z3RyaWQ=_YnF1YWw=') + self.assertEqual(str(x1), '42_Z3RyaWQ=_YnF1YWw=') + + x2 = Xid.from_string('99_xxx_yyy') + self.assertEqual(str(x2), '99_xxx_yyy') + + def test_xid_unicode(self): + cnn = self.connect() + x1 = cnn.xid(10, u'uni', u'code') + cnn.tpc_begin(x1) + cnn.tpc_prepare() + cnn.reset() + xid = [ xid for xid in cnn.tpc_recover() + if xid.database == dbname ][0] + self.assertEqual(10, xid.format_id) + self.assertEqual('uni', xid.gtrid) + self.assertEqual('code', xid.bqual) + + def test_xid_unicode_unparsed(self): + # We don't expect people shooting snowmen as transaction ids, + # so if something explodes in an encode error I don't mind. + # Let's just check uniconde is accepted as type. + cnn = self.connect() + cnn.set_client_encoding('utf8') + cnn.tpc_begin(u"transaction-id") + cnn.tpc_prepare() + cnn.reset() + + xid = [ xid for xid in cnn.tpc_recover() + if xid.database == dbname ][0] + self.assertEqual(None, xid.format_id) + self.assertEqual('transaction-id', xid.gtrid) + self.assertEqual(None, xid.bqual) + + def test_cancel_fails_prepared(self): + cnn = self.connect() + cnn.tpc_begin('cancel') + cnn.tpc_prepare() + self.assertRaises(psycopg2.ProgrammingError, cnn.cancel) + + def test_tpc_recover_non_dbapi_connection(self): + from psycopg2.extras import RealDictConnection + cnn = self.connect(connection_factory=RealDictConnection) + cnn.tpc_begin('dict-connection') + cnn.tpc_prepare() + cnn.reset() + + xids = cnn.tpc_recover() + xid = [ xid for xid in xids if xid.database == dbname ][0] + self.assertEqual(None, xid.format_id) + self.assertEqual('dict-connection', xid.gtrid) + self.assertEqual(None, xid.bqual) + + +decorate_all_tests(ConnectionTwoPhaseTests, skip_if_tpc_disabled) + + +class TransactionControlTests(ConnectingTestCase): + def test_closed(self): + self.conn.close() + self.assertRaises(psycopg2.InterfaceError, + self.conn.set_session, + psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE) + + def test_not_in_transaction(self): + cur = self.conn.cursor() + cur.execute("select 1") + self.assertRaises(psycopg2.ProgrammingError, + self.conn.set_session, + psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE) + + def test_set_isolation_level(self): + cur = self.conn.cursor() + self.conn.set_session( + psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE) + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], 'serializable') + self.conn.rollback() + + self.conn.set_session( + psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ) + cur.execute("SHOW default_transaction_isolation;") + if self.conn.server_version > 80000: + self.assertEqual(cur.fetchone()[0], 'repeatable read') + else: + self.assertEqual(cur.fetchone()[0], 'serializable') + self.conn.rollback() + + self.conn.set_session( + isolation_level=psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED) + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], 'read committed') + self.conn.rollback() + + self.conn.set_session( + isolation_level=psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED) + cur.execute("SHOW default_transaction_isolation;") + if self.conn.server_version > 80000: + self.assertEqual(cur.fetchone()[0], 'read uncommitted') + else: + self.assertEqual(cur.fetchone()[0], 'read committed') + self.conn.rollback() + + def test_set_isolation_level_str(self): + cur = self.conn.cursor() + self.conn.set_session("serializable") + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], 'serializable') + self.conn.rollback() + + self.conn.set_session("repeatable read") + cur.execute("SHOW default_transaction_isolation;") + if self.conn.server_version > 80000: + self.assertEqual(cur.fetchone()[0], 'repeatable read') + else: + self.assertEqual(cur.fetchone()[0], 'serializable') + self.conn.rollback() + + self.conn.set_session("read committed") + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], 'read committed') + self.conn.rollback() + + self.conn.set_session("read uncommitted") + cur.execute("SHOW default_transaction_isolation;") + if self.conn.server_version > 80000: + self.assertEqual(cur.fetchone()[0], 'read uncommitted') + else: + self.assertEqual(cur.fetchone()[0], 'read committed') + self.conn.rollback() + + def test_bad_isolation_level(self): + self.assertRaises(ValueError, self.conn.set_session, 0) + self.assertRaises(ValueError, self.conn.set_session, 5) + self.assertRaises(ValueError, self.conn.set_session, 'whatever') + + def test_set_read_only(self): + cur = self.conn.cursor() + self.conn.set_session(readonly=True) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + self.conn.rollback() + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + self.conn.rollback() + + cur = self.conn.cursor() + self.conn.set_session(readonly=None) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + self.conn.rollback() + + self.conn.set_session(readonly=False) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'off') + self.conn.rollback() + + def test_set_default(self): + cur = self.conn.cursor() + cur.execute("SHOW default_transaction_isolation;") + default_isolevel = cur.fetchone()[0] + cur.execute("SHOW default_transaction_read_only;") + default_readonly = cur.fetchone()[0] + self.conn.rollback() + + self.conn.set_session(isolation_level='serializable', readonly=True) + self.conn.set_session(isolation_level='default', readonly='default') + + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], default_isolevel) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], default_readonly) + + @skip_before_postgres(9, 1) + def test_set_deferrable(self): + cur = self.conn.cursor() + self.conn.set_session(readonly=True, deferrable=True) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + cur.execute("SHOW default_transaction_deferrable;") + self.assertEqual(cur.fetchone()[0], 'on') + self.conn.rollback() + cur.execute("SHOW default_transaction_deferrable;") + self.assertEqual(cur.fetchone()[0], 'on') + self.conn.rollback() + + self.conn.set_session(deferrable=False) + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + cur.execute("SHOW default_transaction_deferrable;") + self.assertEqual(cur.fetchone()[0], 'off') + self.conn.rollback() + + @skip_after_postgres(9, 1) + def test_set_deferrable_error(self): + self.assertRaises(psycopg2.ProgrammingError, + self.conn.set_session, readonly=True, deferrable=True) + + +class AutocommitTests(ConnectingTestCase): + def test_closed(self): + self.conn.close() + self.assertRaises(psycopg2.InterfaceError, + setattr, self.conn, 'autocommit', True) + + # The getter doesn't have a guard. We may change this in future + # to make it consistent with other methods; meanwhile let's just check + # it doesn't explode. + try: + self.assert_(self.conn.autocommit in (True, False)) + except psycopg2.InterfaceError: + pass + + def test_default_no_autocommit(self): + self.assert_(not self.conn.autocommit) + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + cur = self.conn.cursor() + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_BEGIN) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_INTRANS) + + self.conn.rollback() + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + def test_set_autocommit(self): + self.conn.autocommit = True + self.assert_(self.conn.autocommit) + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + cur = self.conn.cursor() + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + self.conn.autocommit = False + self.assert_(not self.conn.autocommit) + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_BEGIN) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_INTRANS) + + def test_set_intrans_error(self): + cur = self.conn.cursor() + cur.execute('select 1;') + self.assertRaises(psycopg2.ProgrammingError, + setattr, self.conn, 'autocommit', True) + + def test_set_session_autocommit(self): + self.conn.set_session(autocommit=True) + self.assert_(self.conn.autocommit) + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + cur = self.conn.cursor() + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + self.conn.set_session(autocommit=False) + self.assert_(not self.conn.autocommit) + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_BEGIN) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_INTRANS) + self.conn.rollback() + + self.conn.set_session('serializable', readonly=True, autocommit=True) + self.assert_(self.conn.autocommit) + cur.execute('select 1;') + self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY) + self.assertEqual(self.conn.get_transaction_status(), + psycopg2.extensions.TRANSACTION_STATUS_IDLE) + cur.execute("SHOW default_transaction_isolation;") + self.assertEqual(cur.fetchone()[0], 'serializable') + cur.execute("SHOW default_transaction_read_only;") + self.assertEqual(cur.fetchone()[0], 'on') + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_copy.py b/psycopg2/tests/test_copy.py new file mode 100644 index 0000000..7764be6 --- /dev/null +++ b/psycopg2/tests/test_copy.py @@ -0,0 +1,283 @@ +#!/usr/bin/env python + +# test_copy.py - unit test for COPY support +# +# Copyright (C) 2010-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import sys +import string +from testutils import unittest, ConnectingTestCase, decorate_all_tests +from testutils import skip_if_no_iobase +from cStringIO import StringIO +from itertools import cycle, izip + +import psycopg2 +import psycopg2.extensions +from testutils import skip_copy_if_green + +if sys.version_info[0] < 3: + _base = object +else: + from io import TextIOBase as _base + +class MinimalRead(_base): + """A file wrapper exposing the minimal interface to copy from.""" + def __init__(self, f): + self.f = f + + def read(self, size): + return self.f.read(size) + + def readline(self): + return self.f.readline() + +class MinimalWrite(_base): + """A file wrapper exposing the minimal interface to copy to.""" + def __init__(self, f): + self.f = f + + def write(self, data): + return self.f.write(data) + + +class CopyTests(ConnectingTestCase): + + def setUp(self): + ConnectingTestCase.setUp(self) + self._create_temp_table() + + def _create_temp_table(self): + curs = self.conn.cursor() + curs.execute(''' + CREATE TEMPORARY TABLE tcopy ( + id serial PRIMARY KEY, + data text + )''') + + def test_copy_from(self): + curs = self.conn.cursor() + try: + self._copy_from(curs, nrecs=1024, srec=10*1024, copykw={}) + finally: + curs.close() + + def test_copy_from_insane_size(self): + # Trying to trigger a "would block" error + curs = self.conn.cursor() + try: + self._copy_from(curs, nrecs=10*1024, srec=10*1024, + copykw={'size': 20*1024*1024}) + finally: + curs.close() + + def test_copy_from_cols(self): + curs = self.conn.cursor() + f = StringIO() + for i in xrange(10): + f.write("%s\n" % (i,)) + + f.seek(0) + curs.copy_from(MinimalRead(f), "tcopy", columns=['id']) + + curs.execute("select * from tcopy order by id") + self.assertEqual([(i, None) for i in range(10)], curs.fetchall()) + + def test_copy_from_cols_err(self): + curs = self.conn.cursor() + f = StringIO() + for i in xrange(10): + f.write("%s\n" % (i,)) + + f.seek(0) + def cols(): + raise ZeroDivisionError() + yield 'id' + + self.assertRaises(ZeroDivisionError, + curs.copy_from, MinimalRead(f), "tcopy", columns=cols()) + + def test_copy_to(self): + curs = self.conn.cursor() + try: + self._copy_from(curs, nrecs=1024, srec=10*1024, copykw={}) + self._copy_to(curs, srec=10*1024) + finally: + curs.close() + + @skip_if_no_iobase + def test_copy_text(self): + self.conn.set_client_encoding('latin1') + self._create_temp_table() # the above call closed the xn + + if sys.version_info[0] < 3: + abin = ''.join(map(chr, range(32, 127) + range(160, 256))) + about = abin.decode('latin1').replace('\\', '\\\\') + + else: + abin = bytes(range(32, 127) + range(160, 256)).decode('latin1') + about = abin.replace('\\', '\\\\') + + curs = self.conn.cursor() + curs.execute('insert into tcopy values (%s, %s)', + (42, abin)) + + import io + f = io.StringIO() + curs.copy_to(f, 'tcopy', columns=('data',)) + f.seek(0) + self.assertEqual(f.readline().rstrip(), about) + + @skip_if_no_iobase + def test_copy_bytes(self): + self.conn.set_client_encoding('latin1') + self._create_temp_table() # the above call closed the xn + + if sys.version_info[0] < 3: + abin = ''.join(map(chr, range(32, 127) + range(160, 255))) + about = abin.replace('\\', '\\\\') + else: + abin = bytes(range(32, 127) + range(160, 255)).decode('latin1') + about = abin.replace('\\', '\\\\').encode('latin1') + + curs = self.conn.cursor() + curs.execute('insert into tcopy values (%s, %s)', + (42, abin)) + + import io + f = io.BytesIO() + curs.copy_to(f, 'tcopy', columns=('data',)) + f.seek(0) + self.assertEqual(f.readline().rstrip(), about) + + @skip_if_no_iobase + def test_copy_expert_textiobase(self): + self.conn.set_client_encoding('latin1') + self._create_temp_table() # the above call closed the xn + + if sys.version_info[0] < 3: + abin = ''.join(map(chr, range(32, 127) + range(160, 256))) + abin = abin.decode('latin1') + about = abin.replace('\\', '\\\\') + + else: + abin = bytes(range(32, 127) + range(160, 256)).decode('latin1') + about = abin.replace('\\', '\\\\') + + import io + f = io.StringIO() + f.write(about) + f.seek(0) + + curs = self.conn.cursor() + psycopg2.extensions.register_type( + psycopg2.extensions.UNICODE, curs) + + curs.copy_expert('COPY tcopy (data) FROM STDIN', f) + curs.execute("select data from tcopy;") + self.assertEqual(curs.fetchone()[0], abin) + + f = io.StringIO() + curs.copy_expert('COPY tcopy (data) TO STDOUT', f) + f.seek(0) + self.assertEqual(f.readline().rstrip(), about) + + # same tests with setting size + f = io.StringIO() + f.write(about) + f.seek(0) + exp_size = 123 + # hack here to leave file as is, only check size when reading + real_read = f.read + def read(_size, f=f, exp_size=exp_size): + self.assertEqual(_size, exp_size) + return real_read(_size) + f.read = read + curs.copy_expert('COPY tcopy (data) FROM STDIN', f, size=exp_size) + curs.execute("select data from tcopy;") + self.assertEqual(curs.fetchone()[0], abin) + + def _copy_from(self, curs, nrecs, srec, copykw): + f = StringIO() + for i, c in izip(xrange(nrecs), cycle(string.ascii_letters)): + l = c * srec + f.write("%s\t%s\n" % (i,l)) + + f.seek(0) + curs.copy_from(MinimalRead(f), "tcopy", **copykw) + + curs.execute("select count(*) from tcopy") + self.assertEqual(nrecs, curs.fetchone()[0]) + + curs.execute("select data from tcopy where id < %s order by id", + (len(string.ascii_letters),)) + for i, (l,) in enumerate(curs): + self.assertEqual(l, string.ascii_letters[i] * srec) + + def _copy_to(self, curs, srec): + f = StringIO() + curs.copy_to(MinimalWrite(f), "tcopy") + + f.seek(0) + ntests = 0 + for line in f: + n, s = line.split() + if int(n) < len(string.ascii_letters): + self.assertEqual(s, string.ascii_letters[int(n)] * srec) + ntests += 1 + + self.assertEqual(ntests, len(string.ascii_letters)) + + def test_copy_expert_file_refcount(self): + class Whatever(object): + pass + + f = Whatever() + curs = self.conn.cursor() + self.assertRaises(TypeError, + curs.copy_expert, 'COPY tcopy (data) FROM STDIN', f) + + def test_copy_no_column_limit(self): + cols = [ "c%050d" % i for i in range(200) ] + + curs = self.conn.cursor() + curs.execute('CREATE TEMPORARY TABLE manycols (%s)' % ',\n'.join( + [ "%s int" % c for c in cols])) + curs.execute("INSERT INTO manycols DEFAULT VALUES") + + f = StringIO() + curs.copy_to(f, "manycols", columns = cols) + f.seek(0) + self.assertEqual(f.read().split(), ['\\N'] * len(cols)) + + f.seek(0) + curs.copy_from(f, "manycols", columns = cols) + curs.execute("select count(*) from manycols;") + self.assertEqual(curs.fetchone()[0], 2) + + +decorate_all_tests(CopyTests, skip_copy_if_green) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_cursor.py b/psycopg2/tests/test_cursor.py new file mode 100644 index 0000000..c35d26c --- /dev/null +++ b/psycopg2/tests/test_cursor.py @@ -0,0 +1,421 @@ +#!/usr/bin/env python + +# test_cursor.py - unit test for cursor attributes +# +# Copyright (C) 2010-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import time +import psycopg2 +import psycopg2.extensions +from psycopg2.extensions import b +from testutils import unittest, ConnectingTestCase, skip_before_postgres +from testutils import skip_if_no_namedtuple, skip_if_no_getrefcount + +class CursorTests(ConnectingTestCase): + + def test_close_idempotent(self): + cur = self.conn.cursor() + cur.close() + cur.close() + self.assert_(cur.closed) + + def test_empty_query(self): + cur = self.conn.cursor() + self.assertRaises(psycopg2.ProgrammingError, cur.execute, "") + self.assertRaises(psycopg2.ProgrammingError, cur.execute, " ") + self.assertRaises(psycopg2.ProgrammingError, cur.execute, ";") + + def test_executemany_propagate_exceptions(self): + conn = self.conn + cur = conn.cursor() + cur.execute("create temp table test_exc (data int);") + def buggygen(): + yield 1//0 + self.assertRaises(ZeroDivisionError, + cur.executemany, "insert into test_exc values (%s)", buggygen()) + cur.close() + + def test_mogrify_unicode(self): + conn = self.conn + cur = conn.cursor() + + # test consistency between execute and mogrify. + + # unicode query containing only ascii data + cur.execute(u"SELECT 'foo';") + self.assertEqual('foo', cur.fetchone()[0]) + self.assertEqual(b("SELECT 'foo';"), cur.mogrify(u"SELECT 'foo';")) + + conn.set_client_encoding('UTF8') + snowman = u"\u2603" + + # unicode query with non-ascii data + cur.execute(u"SELECT '%s';" % snowman) + self.assertEqual(snowman.encode('utf8'), b(cur.fetchone()[0])) + self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'), + cur.mogrify(u"SELECT '%s';" % snowman).replace(b("E'"), b("'"))) + + # unicode args + cur.execute("SELECT %s;", (snowman,)) + self.assertEqual(snowman.encode("utf-8"), b(cur.fetchone()[0])) + self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'), + cur.mogrify("SELECT %s;", (snowman,)).replace(b("E'"), b("'"))) + + # unicode query and args + cur.execute(u"SELECT %s;", (snowman,)) + self.assertEqual(snowman.encode("utf-8"), b(cur.fetchone()[0])) + self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'), + cur.mogrify(u"SELECT %s;", (snowman,)).replace(b("E'"), b("'"))) + + def test_mogrify_decimal_explodes(self): + # issue #7: explodes on windows with python 2.5 and psycopg 2.2.2 + try: + from decimal import Decimal + except: + return + + conn = self.conn + cur = conn.cursor() + self.assertEqual(b('SELECT 10.3;'), + cur.mogrify("SELECT %s;", (Decimal("10.3"),))) + + @skip_if_no_getrefcount + def test_mogrify_leak_on_multiple_reference(self): + # issue #81: reference leak when a parameter value is referenced + # more than once from a dict. + cur = self.conn.cursor() + i = lambda x: x + foo = i('foo') * 10 + import sys + nref1 = sys.getrefcount(foo) + cur.mogrify("select %(foo)s, %(foo)s, %(foo)s", {'foo': foo}) + nref2 = sys.getrefcount(foo) + self.assertEqual(nref1, nref2) + + def test_bad_placeholder(self): + cur = self.conn.cursor() + self.assertRaises(psycopg2.ProgrammingError, + cur.mogrify, "select %(foo", {}) + self.assertRaises(psycopg2.ProgrammingError, + cur.mogrify, "select %(foo", {'foo': 1}) + self.assertRaises(psycopg2.ProgrammingError, + cur.mogrify, "select %(foo, %(bar)", {'foo': 1}) + self.assertRaises(psycopg2.ProgrammingError, + cur.mogrify, "select %(foo, %(bar)", {'foo': 1, 'bar': 2}) + + def test_cast(self): + curs = self.conn.cursor() + + self.assertEqual(42, curs.cast(20, '42')) + self.assertAlmostEqual(3.14, curs.cast(700, '3.14')) + + try: + from decimal import Decimal + except ImportError: + self.assertAlmostEqual(123.45, curs.cast(1700, '123.45')) + else: + self.assertEqual(Decimal('123.45'), curs.cast(1700, '123.45')) + + from datetime import date + self.assertEqual(date(2011,1,2), curs.cast(1082, '2011-01-02')) + self.assertEqual("who am i?", curs.cast(705, 'who am i?')) # unknown + + def test_cast_specificity(self): + curs = self.conn.cursor() + self.assertEqual("foo", curs.cast(705, 'foo')) + + D = psycopg2.extensions.new_type((705,), "DOUBLING", lambda v, c: v * 2) + psycopg2.extensions.register_type(D, self.conn) + self.assertEqual("foofoo", curs.cast(705, 'foo')) + + T = psycopg2.extensions.new_type((705,), "TREBLING", lambda v, c: v * 3) + psycopg2.extensions.register_type(T, curs) + self.assertEqual("foofoofoo", curs.cast(705, 'foo')) + + curs2 = self.conn.cursor() + self.assertEqual("foofoo", curs2.cast(705, 'foo')) + + def test_weakref(self): + from weakref import ref + curs = self.conn.cursor() + w = ref(curs) + del curs + import gc; gc.collect() + self.assert_(w() is None) + + def test_null_name(self): + curs = self.conn.cursor(None) + self.assertEqual(curs.name, None) + + def test_invalid_name(self): + curs = self.conn.cursor() + curs.execute("create temp table invname (data int);") + for i in (10,20,30): + curs.execute("insert into invname values (%s)", (i,)) + curs.close() + + curs = self.conn.cursor(r'1-2-3 \ "test"') + curs.execute("select data from invname order by data") + self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)]) + + def test_withhold(self): + self.assertRaises(psycopg2.ProgrammingError, self.conn.cursor, + withhold=True) + + curs = self.conn.cursor() + try: + curs.execute("drop table withhold") + except psycopg2.ProgrammingError: + self.conn.rollback() + curs.execute("create table withhold (data int)") + for i in (10, 20, 30): + curs.execute("insert into withhold values (%s)", (i,)) + curs.close() + + curs = self.conn.cursor("W") + self.assertEqual(curs.withhold, False); + curs.withhold = True + self.assertEqual(curs.withhold, True); + curs.execute("select data from withhold order by data") + self.conn.commit() + self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)]) + curs.close() + + curs = self.conn.cursor("W", withhold=True) + self.assertEqual(curs.withhold, True); + curs.execute("select data from withhold order by data") + self.conn.commit() + self.assertEqual(curs.fetchall(), [(10,), (20,), (30,)]) + + curs = self.conn.cursor() + curs.execute("drop table withhold") + self.conn.commit() + + def test_scrollable(self): + self.assertRaises(psycopg2.ProgrammingError, self.conn.cursor, + scrollable=True) + + curs = self.conn.cursor() + curs.execute("create table scrollable (data int)") + curs.executemany("insert into scrollable values (%s)", + [ (i,) for i in range(100) ]) + curs.close() + + for t in range(2): + if not t: + curs = self.conn.cursor("S") + self.assertEqual(curs.scrollable, None); + curs.scrollable = True + else: + curs = self.conn.cursor("S", scrollable=True) + + self.assertEqual(curs.scrollable, True); + curs.itersize = 10 + + # complex enough to make postgres cursors declare without + # scroll/no scroll to fail + curs.execute(""" + select x.data + from scrollable x + join scrollable y on x.data = y.data + order by y.data""") + for i, (n,) in enumerate(curs): + self.assertEqual(i, n) + + curs.scroll(-1) + for i in range(99, -1, -1): + curs.scroll(-1) + self.assertEqual(i, curs.fetchone()[0]) + curs.scroll(-1) + + curs.close() + + def test_not_scrollable(self): + self.assertRaises(psycopg2.ProgrammingError, self.conn.cursor, + scrollable=False) + + curs = self.conn.cursor() + curs.execute("create table scrollable (data int)") + curs.executemany("insert into scrollable values (%s)", + [ (i,) for i in range(100) ]) + curs.close() + + curs = self.conn.cursor("S") # default scrollability + curs.execute("select * from scrollable") + self.assertEqual(curs.scrollable, None) + curs.scroll(2) + try: + curs.scroll(-1) + except psycopg2.OperationalError: + return self.skipTest("can't evaluate non-scrollable cursor") + curs.close() + + curs = self.conn.cursor("S", scrollable=False) + self.assertEqual(curs.scrollable, False) + curs.execute("select * from scrollable") + curs.scroll(2) + self.assertRaises(psycopg2.OperationalError, curs.scroll, -1) + + @skip_before_postgres(8, 2) + def test_iter_named_cursor_efficient(self): + curs = self.conn.cursor('tmp') + # if these records are fetched in the same roundtrip their + # timestamp will not be influenced by the pause in Python world. + curs.execute("""select clock_timestamp() from generate_series(1,2)""") + i = iter(curs) + t1 = (i.next())[0] # the brackets work around a 2to3 bug + time.sleep(0.2) + t2 = (i.next())[0] + self.assert_((t2 - t1).microseconds * 1e-6 < 0.1, + "named cursor records fetched in 2 roundtrips (delta: %s)" + % (t2 - t1)) + + @skip_before_postgres(8, 0) + def test_iter_named_cursor_default_itersize(self): + curs = self.conn.cursor('tmp') + curs.execute('select generate_series(1,50)') + rv = [ (r[0], curs.rownumber) for r in curs ] + # everything swallowed in one gulp + self.assertEqual(rv, [(i,i) for i in range(1,51)]) + + @skip_before_postgres(8, 0) + def test_iter_named_cursor_itersize(self): + curs = self.conn.cursor('tmp') + curs.itersize = 30 + curs.execute('select generate_series(1,50)') + rv = [ (r[0], curs.rownumber) for r in curs ] + # everything swallowed in two gulps + self.assertEqual(rv, [(i,((i - 1) % 30) + 1) for i in range(1,51)]) + + @skip_before_postgres(8, 0) + def test_iter_named_cursor_rownumber(self): + curs = self.conn.cursor('tmp') + # note: this fails if itersize < dataset: internally we check + # rownumber == rowcount to detect when to read anoter page, so we + # would need an extra attribute to have a monotonic rownumber. + curs.itersize = 20 + curs.execute('select generate_series(1,10)') + for i, rec in enumerate(curs): + self.assertEqual(i + 1, curs.rownumber) + + @skip_if_no_namedtuple + def test_namedtuple_description(self): + curs = self.conn.cursor() + curs.execute("""select + 3.14::decimal(10,2) as pi, + 'hello'::text as hi, + '2010-02-18'::date as now; + """) + self.assertEqual(len(curs.description), 3) + for c in curs.description: + self.assertEqual(len(c), 7) # DBAPI happy + for a in ('name', 'type_code', 'display_size', 'internal_size', + 'precision', 'scale', 'null_ok'): + self.assert_(hasattr(c, a), a) + + c = curs.description[0] + self.assertEqual(c.name, 'pi') + self.assert_(c.type_code in psycopg2.extensions.DECIMAL.values) + self.assert_(c.internal_size > 0) + self.assertEqual(c.precision, 10) + self.assertEqual(c.scale, 2) + + c = curs.description[1] + self.assertEqual(c.name, 'hi') + self.assert_(c.type_code in psycopg2.STRING.values) + self.assert_(c.internal_size < 0) + self.assertEqual(c.precision, None) + self.assertEqual(c.scale, None) + + c = curs.description[2] + self.assertEqual(c.name, 'now') + self.assert_(c.type_code in psycopg2.extensions.DATE.values) + self.assert_(c.internal_size > 0) + self.assertEqual(c.precision, None) + self.assertEqual(c.scale, None) + + @skip_before_postgres(8, 0) + def test_named_cursor_stealing(self): + # you can use a named cursor to iterate on a refcursor created + # somewhere else + cur1 = self.conn.cursor() + cur1.execute("DECLARE test CURSOR WITHOUT HOLD " + " FOR SELECT generate_series(1,7)") + + cur2 = self.conn.cursor('test') + # can call fetch without execute + self.assertEqual((1,), cur2.fetchone()) + self.assertEqual([(2,), (3,), (4,)], cur2.fetchmany(3)) + self.assertEqual([(5,), (6,), (7,)], cur2.fetchall()) + + @skip_before_postgres(8, 0) + def test_scroll(self): + cur = self.conn.cursor() + cur.execute("select generate_series(0,9)") + cur.scroll(2) + self.assertEqual(cur.fetchone(), (2,)) + cur.scroll(2) + self.assertEqual(cur.fetchone(), (5,)) + cur.scroll(2, mode='relative') + self.assertEqual(cur.fetchone(), (8,)) + cur.scroll(-1) + self.assertEqual(cur.fetchone(), (8,)) + cur.scroll(-2) + self.assertEqual(cur.fetchone(), (7,)) + cur.scroll(2, mode='absolute') + self.assertEqual(cur.fetchone(), (2,)) + + # on the boundary + cur.scroll(0, mode='absolute') + self.assertEqual(cur.fetchone(), (0,)) + self.assertRaises((IndexError, psycopg2.ProgrammingError), + cur.scroll, -1, mode='absolute') + cur.scroll(0, mode='absolute') + self.assertRaises((IndexError, psycopg2.ProgrammingError), + cur.scroll, -1) + + cur.scroll(9, mode='absolute') + self.assertEqual(cur.fetchone(), (9,)) + self.assertRaises((IndexError, psycopg2.ProgrammingError), + cur.scroll, 10, mode='absolute') + cur.scroll(9, mode='absolute') + self.assertRaises((IndexError, psycopg2.ProgrammingError), + cur.scroll, 1) + + @skip_before_postgres(8, 0) + def test_scroll_named(self): + cur = self.conn.cursor('tmp', scrollable=True) + cur.execute("select generate_series(0,9)") + cur.scroll(2) + self.assertEqual(cur.fetchone(), (2,)) + cur.scroll(2) + self.assertEqual(cur.fetchone(), (5,)) + cur.scroll(2, mode='relative') + self.assertEqual(cur.fetchone(), (8,)) + cur.scroll(9, mode='absolute') + self.assertEqual(cur.fetchone(), (9,)) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_dates.py b/psycopg2/tests/test_dates.py new file mode 100644 index 0000000..24c4a9a --- /dev/null +++ b/psycopg2/tests/test_dates.py @@ -0,0 +1,569 @@ +#!/usr/bin/env python + +# test_dates.py - unit test for dates handling +# +# Copyright (C) 2008-2011 James Henstridge +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import math +import psycopg2 +from psycopg2.tz import FixedOffsetTimezone, ZERO +from testutils import unittest, ConnectingTestCase + +class CommonDatetimeTestsMixin: + + def execute(self, *args): + self.curs.execute(*args) + return self.curs.fetchone()[0] + + def test_parse_date(self): + value = self.DATE('2007-01-01', self.curs) + self.assert_(value is not None) + self.assertEqual(value.year, 2007) + self.assertEqual(value.month, 1) + self.assertEqual(value.day, 1) + + def test_parse_null_date(self): + value = self.DATE(None, self.curs) + self.assertEqual(value, None) + + def test_parse_incomplete_date(self): + self.assertRaises(psycopg2.DataError, self.DATE, '2007', self.curs) + self.assertRaises(psycopg2.DataError, self.DATE, '2007-01', self.curs) + + def test_parse_time(self): + value = self.TIME('13:30:29', self.curs) + self.assert_(value is not None) + self.assertEqual(value.hour, 13) + self.assertEqual(value.minute, 30) + self.assertEqual(value.second, 29) + + def test_parse_null_time(self): + value = self.TIME(None, self.curs) + self.assertEqual(value, None) + + def test_parse_incomplete_time(self): + self.assertRaises(psycopg2.DataError, self.TIME, '13', self.curs) + self.assertRaises(psycopg2.DataError, self.TIME, '13:30', self.curs) + + def test_parse_datetime(self): + value = self.DATETIME('2007-01-01 13:30:29', self.curs) + self.assert_(value is not None) + self.assertEqual(value.year, 2007) + self.assertEqual(value.month, 1) + self.assertEqual(value.day, 1) + self.assertEqual(value.hour, 13) + self.assertEqual(value.minute, 30) + self.assertEqual(value.second, 29) + + def test_parse_null_datetime(self): + value = self.DATETIME(None, self.curs) + self.assertEqual(value, None) + + def test_parse_incomplete_datetime(self): + self.assertRaises(psycopg2.DataError, + self.DATETIME, '2007', self.curs) + self.assertRaises(psycopg2.DataError, + self.DATETIME, '2007-01', self.curs) + self.assertRaises(psycopg2.DataError, + self.DATETIME, '2007-01-01 13', self.curs) + self.assertRaises(psycopg2.DataError, + self.DATETIME, '2007-01-01 13:30', self.curs) + + def test_parse_null_interval(self): + value = self.INTERVAL(None, self.curs) + self.assertEqual(value, None) + + +class DatetimeTests(ConnectingTestCase, CommonDatetimeTestsMixin): + """Tests for the datetime based date handling in psycopg2.""" + + def setUp(self): + ConnectingTestCase.setUp(self) + self.curs = self.conn.cursor() + self.DATE = psycopg2.extensions.PYDATE + self.TIME = psycopg2.extensions.PYTIME + self.DATETIME = psycopg2.extensions.PYDATETIME + self.INTERVAL = psycopg2.extensions.PYINTERVAL + + def test_parse_bc_date(self): + # datetime does not support BC dates + self.assertRaises(ValueError, self.DATE, '00042-01-01 BC', self.curs) + + def test_parse_bc_datetime(self): + # datetime does not support BC dates + self.assertRaises(ValueError, self.DATETIME, + '00042-01-01 13:30:29 BC', self.curs) + + def test_parse_time_microseconds(self): + value = self.TIME('13:30:29.123456', self.curs) + self.assertEqual(value.second, 29) + self.assertEqual(value.microsecond, 123456) + + def test_parse_datetime_microseconds(self): + value = self.DATETIME('2007-01-01 13:30:29.123456', self.curs) + self.assertEqual(value.second, 29) + self.assertEqual(value.microsecond, 123456) + + def check_time_tz(self, str_offset, offset): + from datetime import time, timedelta + base = time(13, 30, 29) + base_str = '13:30:29' + + value = self.TIME(base_str + str_offset, self.curs) + + # Value has time zone info and correct UTC offset. + self.assertNotEqual(value.tzinfo, None), + self.assertEqual(value.utcoffset(), timedelta(seconds=offset)) + + # Time portion is correct. + self.assertEqual(value.replace(tzinfo=None), base) + + def test_parse_time_timezone(self): + self.check_time_tz("+01", 3600) + self.check_time_tz("-01", -3600) + self.check_time_tz("+01:15", 4500) + self.check_time_tz("-01:15", -4500) + # The Python datetime module does not support time zone + # offsets that are not a whole number of minutes. + # We round the offset to the nearest minute. + self.check_time_tz("+01:15:00", 60 * (60 + 15)) + self.check_time_tz("+01:15:29", 60 * (60 + 15)) + self.check_time_tz("+01:15:30", 60 * (60 + 16)) + self.check_time_tz("+01:15:59", 60 * (60 + 16)) + self.check_time_tz("-01:15:00", -60 * (60 + 15)) + self.check_time_tz("-01:15:29", -60 * (60 + 15)) + self.check_time_tz("-01:15:30", -60 * (60 + 16)) + self.check_time_tz("-01:15:59", -60 * (60 + 16)) + + def check_datetime_tz(self, str_offset, offset): + from datetime import datetime, timedelta + base = datetime(2007, 1, 1, 13, 30, 29) + base_str = '2007-01-01 13:30:29' + + value = self.DATETIME(base_str + str_offset, self.curs) + + # Value has time zone info and correct UTC offset. + self.assertNotEqual(value.tzinfo, None), + self.assertEqual(value.utcoffset(), timedelta(seconds=offset)) + + # Datetime is correct. + self.assertEqual(value.replace(tzinfo=None), base) + + # Conversion to UTC produces the expected offset. + UTC = FixedOffsetTimezone(0, "UTC") + value_utc = value.astimezone(UTC).replace(tzinfo=None) + self.assertEqual(base - value_utc, timedelta(seconds=offset)) + + def test_parse_datetime_timezone(self): + self.check_datetime_tz("+01", 3600) + self.check_datetime_tz("-01", -3600) + self.check_datetime_tz("+01:15", 4500) + self.check_datetime_tz("-01:15", -4500) + # The Python datetime module does not support time zone + # offsets that are not a whole number of minutes. + # We round the offset to the nearest minute. + self.check_datetime_tz("+01:15:00", 60 * (60 + 15)) + self.check_datetime_tz("+01:15:29", 60 * (60 + 15)) + self.check_datetime_tz("+01:15:30", 60 * (60 + 16)) + self.check_datetime_tz("+01:15:59", 60 * (60 + 16)) + self.check_datetime_tz("-01:15:00", -60 * (60 + 15)) + self.check_datetime_tz("-01:15:29", -60 * (60 + 15)) + self.check_datetime_tz("-01:15:30", -60 * (60 + 16)) + self.check_datetime_tz("-01:15:59", -60 * (60 + 16)) + + def test_parse_time_no_timezone(self): + self.assertEqual(self.TIME("13:30:29", self.curs).tzinfo, None) + self.assertEqual(self.TIME("13:30:29.123456", self.curs).tzinfo, None) + + def test_parse_datetime_no_timezone(self): + self.assertEqual( + self.DATETIME("2007-01-01 13:30:29", self.curs).tzinfo, None) + self.assertEqual( + self.DATETIME("2007-01-01 13:30:29.123456", self.curs).tzinfo, None) + + def test_parse_interval(self): + value = self.INTERVAL('42 days 12:34:56.123456', self.curs) + self.assertNotEqual(value, None) + self.assertEqual(value.days, 42) + self.assertEqual(value.seconds, 45296) + self.assertEqual(value.microseconds, 123456) + + def test_parse_negative_interval(self): + value = self.INTERVAL('-42 days -12:34:56.123456', self.curs) + self.assertNotEqual(value, None) + self.assertEqual(value.days, -43) + self.assertEqual(value.seconds, 41103) + self.assertEqual(value.microseconds, 876544) + + def test_parse_infinity(self): + value = self.DATETIME('-infinity', self.curs) + self.assertEqual(str(value), '0001-01-01 00:00:00') + value = self.DATETIME('infinity', self.curs) + self.assertEqual(str(value), '9999-12-31 23:59:59.999999') + value = self.DATE('infinity', self.curs) + self.assertEqual(str(value), '9999-12-31') + + def test_adapt_date(self): + from datetime import date + value = self.execute('select (%s)::date::text', + [date(2007, 1, 1)]) + self.assertEqual(value, '2007-01-01') + + def test_adapt_time(self): + from datetime import time + value = self.execute('select (%s)::time::text', + [time(13, 30, 29)]) + self.assertEqual(value, '13:30:29') + + def test_adapt_datetime(self): + from datetime import datetime + value = self.execute('select (%s)::timestamp::text', + [datetime(2007, 1, 1, 13, 30, 29)]) + self.assertEqual(value, '2007-01-01 13:30:29') + + def test_adapt_timedelta(self): + from datetime import timedelta + value = self.execute('select extract(epoch from (%s)::interval)', + [timedelta(days=42, seconds=45296, + microseconds=123456)]) + seconds = math.floor(value) + self.assertEqual(seconds, 3674096) + self.assertEqual(int(round((value - seconds) * 1000000)), 123456) + + def test_adapt_negative_timedelta(self): + from datetime import timedelta + value = self.execute('select extract(epoch from (%s)::interval)', + [timedelta(days=-42, seconds=45296, + microseconds=123456)]) + seconds = math.floor(value) + self.assertEqual(seconds, -3583504) + self.assertEqual(int(round((value - seconds) * 1000000)), 123456) + + def _test_type_roundtrip(self, o1): + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1), type(o2)) + return o2 + + def _test_type_roundtrip_array(self, o1): + o1 = [o1] + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1[0]), type(o2[0])) + + def test_type_roundtrip_date(self): + from datetime import date + self._test_type_roundtrip(date(2010,5,3)) + + def test_type_roundtrip_datetime(self): + from datetime import datetime + dt = self._test_type_roundtrip(datetime(2010,5,3,10,20,30)) + self.assertEqual(None, dt.tzinfo) + + def test_type_roundtrip_datetimetz(self): + from datetime import datetime + import psycopg2.tz + tz = psycopg2.tz.FixedOffsetTimezone(8*60) + dt1 = datetime(2010,5,3,10,20,30, tzinfo=tz) + dt2 = self._test_type_roundtrip(dt1) + self.assertNotEqual(None, dt2.tzinfo) + self.assertEqual(dt1, dt2) + + def test_type_roundtrip_time(self): + from datetime import time + self._test_type_roundtrip(time(10,20,30)) + + def test_type_roundtrip_interval(self): + from datetime import timedelta + self._test_type_roundtrip(timedelta(seconds=30)) + + def test_type_roundtrip_date_array(self): + from datetime import date + self._test_type_roundtrip_array(date(2010,5,3)) + + def test_type_roundtrip_datetime_array(self): + from datetime import datetime + self._test_type_roundtrip_array(datetime(2010,5,3,10,20,30)) + + def test_type_roundtrip_time_array(self): + from datetime import time + self._test_type_roundtrip_array(time(10,20,30)) + + def test_type_roundtrip_interval_array(self): + from datetime import timedelta + self._test_type_roundtrip_array(timedelta(seconds=30)) + + +# Only run the datetime tests if psycopg was compiled with support. +if not hasattr(psycopg2.extensions, 'PYDATETIME'): + del DatetimeTests + + +class mxDateTimeTests(ConnectingTestCase, CommonDatetimeTestsMixin): + """Tests for the mx.DateTime based date handling in psycopg2.""" + + def setUp(self): + ConnectingTestCase.setUp(self) + self.curs = self.conn.cursor() + self.DATE = psycopg2._psycopg.MXDATE + self.TIME = psycopg2._psycopg.MXTIME + self.DATETIME = psycopg2._psycopg.MXDATETIME + self.INTERVAL = psycopg2._psycopg.MXINTERVAL + + psycopg2.extensions.register_type(self.DATE, self.conn) + psycopg2.extensions.register_type(self.TIME, self.conn) + psycopg2.extensions.register_type(self.DATETIME, self.conn) + psycopg2.extensions.register_type(self.INTERVAL, self.conn) + psycopg2.extensions.register_type(psycopg2.extensions.MXDATEARRAY, self.conn) + psycopg2.extensions.register_type(psycopg2.extensions.MXTIMEARRAY, self.conn) + psycopg2.extensions.register_type(psycopg2.extensions.MXDATETIMEARRAY, self.conn) + psycopg2.extensions.register_type(psycopg2.extensions.MXINTERVALARRAY, self.conn) + + def tearDown(self): + self.conn.close() + + def test_parse_bc_date(self): + value = self.DATE('00042-01-01 BC', self.curs) + self.assert_(value is not None) + # mx.DateTime numbers BC dates from 0 rather than 1. + self.assertEqual(value.year, -41) + self.assertEqual(value.month, 1) + self.assertEqual(value.day, 1) + + def test_parse_bc_datetime(self): + value = self.DATETIME('00042-01-01 13:30:29 BC', self.curs) + self.assert_(value is not None) + # mx.DateTime numbers BC dates from 0 rather than 1. + self.assertEqual(value.year, -41) + self.assertEqual(value.month, 1) + self.assertEqual(value.day, 1) + self.assertEqual(value.hour, 13) + self.assertEqual(value.minute, 30) + self.assertEqual(value.second, 29) + + def test_parse_time_microseconds(self): + value = self.TIME('13:30:29.123456', self.curs) + self.assertEqual(math.floor(value.second), 29) + self.assertEqual( + int((value.second - math.floor(value.second)) * 1000000), 123456) + + def test_parse_datetime_microseconds(self): + value = self.DATETIME('2007-01-01 13:30:29.123456', self.curs) + self.assertEqual(math.floor(value.second), 29) + self.assertEqual( + int((value.second - math.floor(value.second)) * 1000000), 123456) + + def test_parse_time_timezone(self): + # Time zone information is ignored. + from mx.DateTime import Time + expected = Time(13, 30, 29) + self.assertEqual(expected, self.TIME("13:30:29+01", self.curs)) + self.assertEqual(expected, self.TIME("13:30:29-01", self.curs)) + self.assertEqual(expected, self.TIME("13:30:29+01:15", self.curs)) + self.assertEqual(expected, self.TIME("13:30:29-01:15", self.curs)) + self.assertEqual(expected, self.TIME("13:30:29+01:15:42", self.curs)) + self.assertEqual(expected, self.TIME("13:30:29-01:15:42", self.curs)) + + def test_parse_datetime_timezone(self): + # Time zone information is ignored. + from mx.DateTime import DateTime + expected = DateTime(2007, 1, 1, 13, 30, 29) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29+01", self.curs)) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29-01", self.curs)) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29+01:15", self.curs)) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29-01:15", self.curs)) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29+01:15:42", self.curs)) + self.assertEqual( + expected, self.DATETIME("2007-01-01 13:30:29-01:15:42", self.curs)) + + def test_parse_interval(self): + value = self.INTERVAL('42 days 05:50:05', self.curs) + self.assert_(value is not None) + self.assertEqual(value.day, 42) + self.assertEqual(value.hour, 5) + self.assertEqual(value.minute, 50) + self.assertEqual(value.second, 5) + + def test_adapt_time(self): + from mx.DateTime import Time + value = self.execute('select (%s)::time::text', + [Time(13, 30, 29)]) + self.assertEqual(value, '13:30:29') + + def test_adapt_datetime(self): + from mx.DateTime import DateTime + value = self.execute('select (%s)::timestamp::text', + [DateTime(2007, 1, 1, 13, 30, 29.123456)]) + self.assertEqual(value, '2007-01-01 13:30:29.123456') + + def test_adapt_bc_datetime(self): + from mx.DateTime import DateTime + value = self.execute('select (%s)::timestamp::text', + [DateTime(-41, 1, 1, 13, 30, 29.123456)]) + # microsecs for BC timestamps look not available in PG < 8.4 + # but more likely it's determined at compile time. + self.assert_(value in ( + '0042-01-01 13:30:29.123456 BC', + '0042-01-01 13:30:29 BC'), value) + + def test_adapt_timedelta(self): + from mx.DateTime import DateTimeDeltaFrom + value = self.execute('select extract(epoch from (%s)::interval)', + [DateTimeDeltaFrom(days=42, + seconds=45296.123456)]) + seconds = math.floor(value) + self.assertEqual(seconds, 3674096) + self.assertEqual(int(round((value - seconds) * 1000000)), 123456) + + def test_adapt_negative_timedelta(self): + from mx.DateTime import DateTimeDeltaFrom + value = self.execute('select extract(epoch from (%s)::interval)', + [DateTimeDeltaFrom(days=-42, + seconds=45296.123456)]) + seconds = math.floor(value) + self.assertEqual(seconds, -3583504) + self.assertEqual(int(round((value - seconds) * 1000000)), 123456) + + def _test_type_roundtrip(self, o1): + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1), type(o2)) + + def _test_type_roundtrip_array(self, o1): + o1 = [o1] + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1[0]), type(o2[0])) + + def test_type_roundtrip_date(self): + from mx.DateTime import Date + self._test_type_roundtrip(Date(2010,5,3)) + + def test_type_roundtrip_datetime(self): + from mx.DateTime import DateTime + self._test_type_roundtrip(DateTime(2010,5,3,10,20,30)) + + def test_type_roundtrip_time(self): + from mx.DateTime import Time + self._test_type_roundtrip(Time(10,20,30)) + + def test_type_roundtrip_interval(self): + from mx.DateTime import DateTimeDeltaFrom + self._test_type_roundtrip(DateTimeDeltaFrom(seconds=30)) + + def test_type_roundtrip_date_array(self): + from mx.DateTime import Date + self._test_type_roundtrip_array(Date(2010,5,3)) + + def test_type_roundtrip_datetime_array(self): + from mx.DateTime import DateTime + self._test_type_roundtrip_array(DateTime(2010,5,3,10,20,30)) + + def test_type_roundtrip_time_array(self): + from mx.DateTime import Time + self._test_type_roundtrip_array(Time(10,20,30)) + + def test_type_roundtrip_interval_array(self): + from mx.DateTime import DateTimeDeltaFrom + self._test_type_roundtrip_array(DateTimeDeltaFrom(seconds=30)) + + +# Only run the mx.DateTime tests if psycopg was compiled with support. +try: + if not hasattr(psycopg2._psycopg, 'MXDATETIME'): + del mxDateTimeTests +except AttributeError: + del mxDateTimeTests + + +class FromTicksTestCase(unittest.TestCase): + # bug "TimestampFromTicks() throws ValueError (2-2.0.14)" + # reported by Jozsef Szalay on 2010-05-06 + def test_timestamp_value_error_sec_59_99(self): + from datetime import datetime + s = psycopg2.TimestampFromTicks(1273173119.99992) + self.assertEqual(s.adapted, + datetime(2010, 5, 6, 14, 11, 59, 999920, + tzinfo=FixedOffsetTimezone(-5 * 60))) + + def test_date_value_error_sec_59_99(self): + from datetime import date + s = psycopg2.DateFromTicks(1273173119.99992) + self.assertEqual(s.adapted, date(2010, 5, 6)) + + def test_time_value_error_sec_59_99(self): + from datetime import time + s = psycopg2.TimeFromTicks(1273173119.99992) + self.assertEqual(s.adapted.replace(hour=0), + time(0, 11, 59, 999920)) + + +class FixedOffsetTimezoneTests(unittest.TestCase): + + def test_init_with_no_args(self): + tzinfo = FixedOffsetTimezone() + self.assert_(tzinfo._offset is ZERO) + self.assert_(tzinfo._name is None) + + def test_repr_with_positive_offset(self): + tzinfo = FixedOffsetTimezone(5 * 60) + self.assertEqual(repr(tzinfo), "psycopg2.tz.FixedOffsetTimezone(offset=300, name=None)") + + def test_repr_with_negative_offset(self): + tzinfo = FixedOffsetTimezone(-5 * 60) + self.assertEqual(repr(tzinfo), "psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)") + + def test_repr_with_name(self): + tzinfo = FixedOffsetTimezone(name="FOO") + self.assertEqual(repr(tzinfo), "psycopg2.tz.FixedOffsetTimezone(offset=0, name='FOO')") + + def test_instance_caching(self): + self.assert_(FixedOffsetTimezone(name="FOO") is FixedOffsetTimezone(name="FOO")) + self.assert_(FixedOffsetTimezone(7 * 60) is FixedOffsetTimezone(7 * 60)) + self.assert_(FixedOffsetTimezone(-9 * 60, 'FOO') is FixedOffsetTimezone(-9 * 60, 'FOO')) + self.assert_(FixedOffsetTimezone(9 * 60) is not FixedOffsetTimezone(9 * 60, 'FOO')) + self.assert_(FixedOffsetTimezone(name='FOO') is not FixedOffsetTimezone(9 * 60, 'FOO')) + + def test_pickle(self): + # ticket #135 + import pickle + + tz11 = FixedOffsetTimezone(60) + tz12 = FixedOffsetTimezone(120) + for proto in [-1, 0, 1, 2]: + tz21, tz22 = pickle.loads(pickle.dumps([tz11, tz12], proto)) + self.assertEqual(tz11, tz21) + self.assertEqual(tz12, tz22) + + tz11 = FixedOffsetTimezone(60, name='foo') + tz12 = FixedOffsetTimezone(120, name='bar') + for proto in [-1, 0, 1, 2]: + tz21, tz22 = pickle.loads(pickle.dumps([tz11, tz12], proto)) + self.assertEqual(tz11, tz21) + self.assertEqual(tz12, tz22) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_extras_dictcursor.py b/psycopg2/tests/test_extras_dictcursor.py new file mode 100644 index 0000000..f2fefff --- /dev/null +++ b/psycopg2/tests/test_extras_dictcursor.py @@ -0,0 +1,483 @@ +#!/usr/bin/env python +# +# extras_dictcursor - test if DictCursor extension class works +# +# Copyright (C) 2004-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import time +from datetime import timedelta +import psycopg2 +import psycopg2.extras +from testutils import unittest, ConnectingTestCase, skip_before_postgres +from testutils import skip_if_no_namedtuple + + +class ExtrasDictCursorTests(ConnectingTestCase): + """Test if DictCursor extension class works.""" + + def setUp(self): + ConnectingTestCase.setUp(self) + curs = self.conn.cursor() + curs.execute("CREATE TEMPORARY TABLE ExtrasDictCursorTests (foo text)") + curs.execute("INSERT INTO ExtrasDictCursorTests VALUES ('bar')") + self.conn.commit() + + def testDictConnCursorArgs(self): + self.conn.close() + self.conn = self.connect(connection_factory=psycopg2.extras.DictConnection) + cur = self.conn.cursor() + self.assert_(isinstance(cur, psycopg2.extras.DictCursor)) + self.assertEqual(cur.name, None) + # overridable + cur = self.conn.cursor('foo', cursor_factory=psycopg2.extras.NamedTupleCursor) + self.assertEqual(cur.name, 'foo') + self.assert_(isinstance(cur, psycopg2.extras.NamedTupleCursor)) + + def testDictCursorWithPlainCursorFetchOne(self): + self._testWithPlainCursor(lambda curs: curs.fetchone()) + + def testDictCursorWithPlainCursorFetchMany(self): + self._testWithPlainCursor(lambda curs: curs.fetchmany(100)[0]) + + def testDictCursorWithPlainCursorFetchManyNoarg(self): + self._testWithPlainCursor(lambda curs: curs.fetchmany()[0]) + + def testDictCursorWithPlainCursorFetchAll(self): + self._testWithPlainCursor(lambda curs: curs.fetchall()[0]) + + def testDictCursorWithPlainCursorIter(self): + def getter(curs): + for row in curs: + return row + self._testWithPlainCursor(getter) + + def testUpdateRow(self): + row = self._testWithPlainCursor(lambda curs: curs.fetchone()) + row['foo'] = 'qux' + self.failUnless(row['foo'] == 'qux') + self.failUnless(row[0] == 'qux') + + @skip_before_postgres(8, 0) + def testDictCursorWithPlainCursorIterRowNumber(self): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + self._testIterRowNumber(curs) + + def _testWithPlainCursor(self, getter): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = getter(curs) + self.failUnless(row['foo'] == 'bar') + self.failUnless(row[0] == 'bar') + return row + + + def testDictCursorWithPlainCursorRealFetchOne(self): + self._testWithPlainCursorReal(lambda curs: curs.fetchone()) + + def testDictCursorWithPlainCursorRealFetchMany(self): + self._testWithPlainCursorReal(lambda curs: curs.fetchmany(100)[0]) + + def testDictCursorWithPlainCursorRealFetchManyNoarg(self): + self._testWithPlainCursorReal(lambda curs: curs.fetchmany()[0]) + + def testDictCursorWithPlainCursorRealFetchAll(self): + self._testWithPlainCursorReal(lambda curs: curs.fetchall()[0]) + + def testDictCursorWithPlainCursorRealIter(self): + def getter(curs): + for row in curs: + return row + self._testWithPlainCursorReal(getter) + + @skip_before_postgres(8, 0) + def testDictCursorWithPlainCursorRealIterRowNumber(self): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + self._testIterRowNumber(curs) + + def _testWithPlainCursorReal(self, getter): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = getter(curs) + self.failUnless(row['foo'] == 'bar') + + + def testDictCursorWithNamedCursorFetchOne(self): + self._testWithNamedCursor(lambda curs: curs.fetchone()) + + def testDictCursorWithNamedCursorFetchMany(self): + self._testWithNamedCursor(lambda curs: curs.fetchmany(100)[0]) + + def testDictCursorWithNamedCursorFetchManyNoarg(self): + self._testWithNamedCursor(lambda curs: curs.fetchmany()[0]) + + def testDictCursorWithNamedCursorFetchAll(self): + self._testWithNamedCursor(lambda curs: curs.fetchall()[0]) + + def testDictCursorWithNamedCursorIter(self): + def getter(curs): + for row in curs: + return row + self._testWithNamedCursor(getter) + + @skip_before_postgres(8, 2) + def testDictCursorWithNamedCursorNotGreedy(self): + curs = self.conn.cursor('tmp', cursor_factory=psycopg2.extras.DictCursor) + self._testNamedCursorNotGreedy(curs) + + @skip_before_postgres(8, 0) + def testDictCursorWithNamedCursorIterRowNumber(self): + curs = self.conn.cursor('tmp', cursor_factory=psycopg2.extras.DictCursor) + self._testIterRowNumber(curs) + + def _testWithNamedCursor(self, getter): + curs = self.conn.cursor('aname', cursor_factory=psycopg2.extras.DictCursor) + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = getter(curs) + self.failUnless(row['foo'] == 'bar') + self.failUnless(row[0] == 'bar') + + + def testDictCursorRealWithNamedCursorFetchOne(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchone()) + + def testDictCursorRealWithNamedCursorFetchMany(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchmany(100)[0]) + + def testDictCursorRealWithNamedCursorFetchManyNoarg(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchmany()[0]) + + def testDictCursorRealWithNamedCursorFetchAll(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchall()[0]) + + def testDictCursorRealWithNamedCursorIter(self): + def getter(curs): + for row in curs: + return row + self._testWithNamedCursorReal(getter) + + @skip_before_postgres(8, 2) + def testDictCursorRealWithNamedCursorNotGreedy(self): + curs = self.conn.cursor('tmp', cursor_factory=psycopg2.extras.RealDictCursor) + self._testNamedCursorNotGreedy(curs) + + @skip_before_postgres(8, 0) + def testDictCursorRealWithNamedCursorIterRowNumber(self): + curs = self.conn.cursor('tmp', cursor_factory=psycopg2.extras.RealDictCursor) + self._testIterRowNumber(curs) + + def _testWithNamedCursorReal(self, getter): + curs = self.conn.cursor('aname', cursor_factory=psycopg2.extras.RealDictCursor) + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = getter(curs) + self.failUnless(row['foo'] == 'bar') + + + def _testNamedCursorNotGreedy(self, curs): + curs.itersize = 2 + curs.execute("""select clock_timestamp() as ts from generate_series(1,3)""") + recs = [] + for t in curs: + time.sleep(0.01) + recs.append(t) + + # check that the dataset was not fetched in a single gulp + self.assert_(recs[1]['ts'] - recs[0]['ts'] < timedelta(seconds=0.005)) + self.assert_(recs[2]['ts'] - recs[1]['ts'] > timedelta(seconds=0.0099)) + + def _testIterRowNumber(self, curs): + # Only checking for dataset < itersize: + # see CursorTests.test_iter_named_cursor_rownumber + curs.itersize = 20 + curs.execute("""select * from generate_series(1,10)""") + for i, r in enumerate(curs): + self.assertEqual(i + 1, curs.rownumber) + + def testPickleDictRow(self): + import pickle + curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + curs.execute("select 10 as a, 20 as b") + r = curs.fetchone() + d = pickle.dumps(r) + r1 = pickle.loads(d) + self.assertEqual(r, r1) + self.assertEqual(r[0], r1[0]) + self.assertEqual(r[1], r1[1]) + self.assertEqual(r['a'], r1['a']) + self.assertEqual(r['b'], r1['b']) + self.assertEqual(r._index, r1._index) + + def testPickleRealDictRow(self): + import pickle + curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + curs.execute("select 10 as a, 20 as b") + r = curs.fetchone() + d = pickle.dumps(r) + r1 = pickle.loads(d) + self.assertEqual(r, r1) + self.assertEqual(r['a'], r1['a']) + self.assertEqual(r['b'], r1['b']) + self.assertEqual(r._column_mapping, r1._column_mapping) + + +class NamedTupleCursorTest(ConnectingTestCase): + def setUp(self): + ConnectingTestCase.setUp(self) + from psycopg2.extras import NamedTupleConnection + + try: + from collections import namedtuple + except ImportError: + return + + self.conn = self.connect(connection_factory=NamedTupleConnection) + curs = self.conn.cursor() + curs.execute("CREATE TEMPORARY TABLE nttest (i int, s text)") + curs.execute("INSERT INTO nttest VALUES (1, 'foo')") + curs.execute("INSERT INTO nttest VALUES (2, 'bar')") + curs.execute("INSERT INTO nttest VALUES (3, 'baz')") + self.conn.commit() + + @skip_if_no_namedtuple + def test_cursor_args(self): + cur = self.conn.cursor('foo', cursor_factory=psycopg2.extras.DictCursor) + self.assertEqual(cur.name, 'foo') + self.assert_(isinstance(cur, psycopg2.extras.DictCursor)) + + @skip_if_no_namedtuple + def test_fetchone(self): + curs = self.conn.cursor() + curs.execute("select * from nttest order by 1") + t = curs.fetchone() + self.assertEqual(t[0], 1) + self.assertEqual(t.i, 1) + self.assertEqual(t[1], 'foo') + self.assertEqual(t.s, 'foo') + self.assertEqual(curs.rownumber, 1) + self.assertEqual(curs.rowcount, 3) + + @skip_if_no_namedtuple + def test_fetchmany_noarg(self): + curs = self.conn.cursor() + curs.arraysize = 2 + curs.execute("select * from nttest order by 1") + res = curs.fetchmany() + self.assertEqual(2, len(res)) + self.assertEqual(res[0].i, 1) + self.assertEqual(res[0].s, 'foo') + self.assertEqual(res[1].i, 2) + self.assertEqual(res[1].s, 'bar') + self.assertEqual(curs.rownumber, 2) + self.assertEqual(curs.rowcount, 3) + + @skip_if_no_namedtuple + def test_fetchmany(self): + curs = self.conn.cursor() + curs.execute("select * from nttest order by 1") + res = curs.fetchmany(2) + self.assertEqual(2, len(res)) + self.assertEqual(res[0].i, 1) + self.assertEqual(res[0].s, 'foo') + self.assertEqual(res[1].i, 2) + self.assertEqual(res[1].s, 'bar') + self.assertEqual(curs.rownumber, 2) + self.assertEqual(curs.rowcount, 3) + + @skip_if_no_namedtuple + def test_fetchall(self): + curs = self.conn.cursor() + curs.execute("select * from nttest order by 1") + res = curs.fetchall() + self.assertEqual(3, len(res)) + self.assertEqual(res[0].i, 1) + self.assertEqual(res[0].s, 'foo') + self.assertEqual(res[1].i, 2) + self.assertEqual(res[1].s, 'bar') + self.assertEqual(res[2].i, 3) + self.assertEqual(res[2].s, 'baz') + self.assertEqual(curs.rownumber, 3) + self.assertEqual(curs.rowcount, 3) + + @skip_if_no_namedtuple + def test_executemany(self): + curs = self.conn.cursor() + curs.executemany("delete from nttest where i = %s", + [(1,), (2,)]) + curs.execute("select * from nttest order by 1") + res = curs.fetchall() + self.assertEqual(1, len(res)) + self.assertEqual(res[0].i, 3) + self.assertEqual(res[0].s, 'baz') + + @skip_if_no_namedtuple + def test_iter(self): + curs = self.conn.cursor() + curs.execute("select * from nttest order by 1") + i = iter(curs) + self.assertEqual(curs.rownumber, 0) + + t = i.next() + self.assertEqual(t.i, 1) + self.assertEqual(t.s, 'foo') + self.assertEqual(curs.rownumber, 1) + self.assertEqual(curs.rowcount, 3) + + t = i.next() + self.assertEqual(t.i, 2) + self.assertEqual(t.s, 'bar') + self.assertEqual(curs.rownumber, 2) + self.assertEqual(curs.rowcount, 3) + + t = i.next() + self.assertEqual(t.i, 3) + self.assertEqual(t.s, 'baz') + self.assertRaises(StopIteration, i.next) + self.assertEqual(curs.rownumber, 3) + self.assertEqual(curs.rowcount, 3) + + def test_error_message(self): + try: + from collections import namedtuple + except ImportError: + # an import error somewhere + from psycopg2.extras import NamedTupleConnection + try: + self.conn = self.connect( + connection_factory=NamedTupleConnection) + curs = self.conn.cursor() + curs.execute("select 1") + curs.fetchone() + except ImportError: + pass + else: + self.fail("expecting ImportError") + else: + return self.skipTest("namedtuple available") + + @skip_if_no_namedtuple + def test_record_updated(self): + curs = self.conn.cursor() + curs.execute("select 1 as foo;") + r = curs.fetchone() + self.assertEqual(r.foo, 1) + + curs.execute("select 2 as bar;") + r = curs.fetchone() + self.assertEqual(r.bar, 2) + self.assertRaises(AttributeError, getattr, r, 'foo') + + @skip_if_no_namedtuple + def test_no_result_no_surprise(self): + curs = self.conn.cursor() + curs.execute("update nttest set s = s") + self.assertRaises(psycopg2.ProgrammingError, curs.fetchone) + + curs.execute("update nttest set s = s") + self.assertRaises(psycopg2.ProgrammingError, curs.fetchall) + + @skip_if_no_namedtuple + def test_minimal_generation(self): + # Instrument the class to verify it gets called the minimum number of times. + from psycopg2.extras import NamedTupleCursor + f_orig = NamedTupleCursor._make_nt + calls = [0] + def f_patched(self_): + calls[0] += 1 + return f_orig(self_) + + NamedTupleCursor._make_nt = f_patched + + try: + curs = self.conn.cursor() + curs.execute("select * from nttest order by 1") + curs.fetchone() + curs.fetchone() + curs.fetchone() + self.assertEqual(1, calls[0]) + + curs.execute("select * from nttest order by 1") + curs.fetchone() + curs.fetchall() + self.assertEqual(2, calls[0]) + + curs.execute("select * from nttest order by 1") + curs.fetchone() + curs.fetchmany(1) + self.assertEqual(3, calls[0]) + + finally: + NamedTupleCursor._make_nt = f_orig + + @skip_if_no_namedtuple + @skip_before_postgres(8, 0) + def test_named(self): + curs = self.conn.cursor('tmp') + curs.execute("""select i from generate_series(0,9) i""") + recs = [] + recs.extend(curs.fetchmany(5)) + recs.append(curs.fetchone()) + recs.extend(curs.fetchall()) + self.assertEqual(range(10), [t.i for t in recs]) + + @skip_if_no_namedtuple + def test_named_fetchone(self): + curs = self.conn.cursor('tmp') + curs.execute("""select 42 as i""") + t = curs.fetchone() + self.assertEqual(t.i, 42) + + @skip_if_no_namedtuple + def test_named_fetchmany(self): + curs = self.conn.cursor('tmp') + curs.execute("""select 42 as i""") + recs = curs.fetchmany(10) + self.assertEqual(recs[0].i, 42) + + @skip_if_no_namedtuple + def test_named_fetchall(self): + curs = self.conn.cursor('tmp') + curs.execute("""select 42 as i""") + recs = curs.fetchall() + self.assertEqual(recs[0].i, 42) + + @skip_if_no_namedtuple + @skip_before_postgres(8, 2) + def test_not_greedy(self): + curs = self.conn.cursor('tmp') + curs.itersize = 2 + curs.execute("""select clock_timestamp() as ts from generate_series(1,3)""") + recs = [] + for t in curs: + time.sleep(0.01) + recs.append(t) + + # check that the dataset was not fetched in a single gulp + self.assert_(recs[1].ts - recs[0].ts < timedelta(seconds=0.005)) + self.assert_(recs[2].ts - recs[1].ts > timedelta(seconds=0.0099)) + + @skip_if_no_namedtuple + @skip_before_postgres(8, 0) + def test_named_rownumber(self): + curs = self.conn.cursor('tmp') + # Only checking for dataset < itersize: + # see CursorTests.test_iter_named_cursor_rownumber + curs.itersize = 4 + curs.execute("""select * from generate_series(1,3)""") + for i, t in enumerate(curs): + self.assertEqual(i + 1, curs.rownumber) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_green.py b/psycopg2/tests/test_green.py new file mode 100644 index 0000000..506b38f --- /dev/null +++ b/psycopg2/tests/test_green.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python + +# test_green.py - unit test for async wait callback +# +# Copyright (C) 2010-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import unittest +import psycopg2 +import psycopg2.extensions +import psycopg2.extras + +from testutils import ConnectingTestCase + +class ConnectionStub(object): + """A `connection` wrapper allowing analysis of the `poll()` calls.""" + def __init__(self, conn): + self.conn = conn + self.polls = [] + + def fileno(self): + return self.conn.fileno() + + def poll(self): + rv = self.conn.poll() + self.polls.append(rv) + return rv + +class GreenTestCase(ConnectingTestCase): + def setUp(self): + self._cb = psycopg2.extensions.get_wait_callback() + psycopg2.extensions.set_wait_callback(psycopg2.extras.wait_select) + ConnectingTestCase.setUp(self) + + def tearDown(self): + ConnectingTestCase.tearDown(self) + psycopg2.extensions.set_wait_callback(self._cb) + + def set_stub_wait_callback(self, conn): + stub = ConnectionStub(conn) + psycopg2.extensions.set_wait_callback( + lambda conn: psycopg2.extras.wait_select(stub)) + return stub + + def test_flush_on_write(self): + # a very large query requires a flush loop to be sent to the backend + conn = self.conn + stub = self.set_stub_wait_callback(conn) + curs = conn.cursor() + for mb in 1, 5, 10, 20, 50: + size = mb * 1024 * 1024 + del stub.polls[:] + curs.execute("select %s;", ('x' * size,)) + self.assertEqual(size, len(curs.fetchone()[0])) + if stub.polls.count(psycopg2.extensions.POLL_WRITE) > 1: + return + + # This is more a testing glitch than an error: it happens + # on high load on linux: probably because the kernel has more + # buffers ready. A warning may be useful during development, + # but an error is bad during regression testing. + import warnings + warnings.warn("sending a large query didn't trigger block on write.") + + def test_error_in_callback(self): + # behaviour changed after issue #113: if there is an error in the + # callback for the moment we don't have a way to reset the connection + # without blocking (ticket #113) so just close it. + conn = self.conn + curs = conn.cursor() + curs.execute("select 1") # have a BEGIN + curs.fetchone() + + # now try to do something that will fail in the callback + psycopg2.extensions.set_wait_callback(lambda conn: 1//0) + self.assertRaises(ZeroDivisionError, curs.execute, "select 2") + + self.assert_(conn.closed) + + def test_dont_freak_out(self): + # if there is an error in a green query, don't freak out and close + # the connection + conn = self.conn + curs = conn.cursor() + self.assertRaises(psycopg2.ProgrammingError, + curs.execute, "select the unselectable") + + # check that the connection is left in an usable state + self.assert_(not conn.closed) + conn.rollback() + curs.execute("select 1") + self.assertEqual(curs.fetchone()[0], 1) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_lobject.py b/psycopg2/tests/test_lobject.py new file mode 100644 index 0000000..e62e0d8 --- /dev/null +++ b/psycopg2/tests/test_lobject.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python + +# test_lobject.py - unit test for large objects support +# +# Copyright (C) 2008-2011 James Henstridge +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import os +import shutil +import tempfile +from functools import wraps + +import psycopg2 +import psycopg2.extensions +from psycopg2.extensions import b +from testutils import unittest, decorate_all_tests, skip_if_tpc_disabled +from testutils import ConnectingTestCase, skip_if_green + +def skip_if_no_lo(f): + @wraps(f) + def skip_if_no_lo_(self): + if self.conn.server_version < 80100: + return self.skipTest("large objects only supported from PG 8.1") + else: + return f(self) + + return skip_if_no_lo_ + +skip_lo_if_green = skip_if_green("libpq doesn't support LO in async mode") + + +class LargeObjectTestCase(ConnectingTestCase): + def setUp(self): + ConnectingTestCase.setUp(self) + self.lo_oid = None + self.tmpdir = None + + def tearDown(self): + if self.tmpdir: + shutil.rmtree(self.tmpdir, ignore_errors=True) + + if self.conn.closed: + return + + if self.lo_oid is not None: + self.conn.rollback() + try: + lo = self.conn.lobject(self.lo_oid, "n") + except psycopg2.OperationalError: + pass + else: + lo.unlink() + + ConnectingTestCase.tearDown(self) + + +class LargeObjectTests(LargeObjectTestCase): + def test_create(self): + lo = self.conn.lobject() + self.assertNotEqual(lo, None) + self.assertEqual(lo.mode[0], "w") + + def test_connection_needed(self): + self.assertRaises(TypeError, + psycopg2.extensions.lobject, []) + + def test_open_non_existent(self): + # By creating then removing a large object, we get an Oid that + # should be unused. + lo = self.conn.lobject() + lo.unlink() + self.assertRaises(psycopg2.OperationalError, self.conn.lobject, lo.oid) + + def test_open_existing(self): + lo = self.conn.lobject() + lo2 = self.conn.lobject(lo.oid) + self.assertNotEqual(lo2, None) + self.assertEqual(lo2.oid, lo.oid) + self.assertEqual(lo2.mode[0], "r") + + def test_open_for_write(self): + lo = self.conn.lobject() + lo2 = self.conn.lobject(lo.oid, "w") + self.assertEqual(lo2.mode[0], "w") + lo2.write(b("some data")) + + def test_open_mode_n(self): + # Openning an object in mode "n" gives us a closed lobject. + lo = self.conn.lobject() + lo.close() + + lo2 = self.conn.lobject(lo.oid, "n") + self.assertEqual(lo2.oid, lo.oid) + self.assertEqual(lo2.closed, True) + + def test_close_connection_gone(self): + lo = self.conn.lobject() + self.conn.close() + lo.close() + + def test_create_with_oid(self): + # Create and delete a large object to get an unused Oid. + lo = self.conn.lobject() + oid = lo.oid + lo.unlink() + + lo = self.conn.lobject(0, "w", oid) + self.assertEqual(lo.oid, oid) + + def test_create_with_existing_oid(self): + lo = self.conn.lobject() + lo.close() + + self.assertRaises(psycopg2.OperationalError, + self.conn.lobject, 0, "w", lo.oid) + + def test_import(self): + self.tmpdir = tempfile.mkdtemp() + filename = os.path.join(self.tmpdir, "data.txt") + fp = open(filename, "wb") + fp.write(b("some data")) + fp.close() + + lo = self.conn.lobject(0, "r", 0, filename) + self.assertEqual(lo.read(), "some data") + + def test_close(self): + lo = self.conn.lobject() + self.assertEqual(lo.closed, False) + lo.close() + self.assertEqual(lo.closed, True) + + def test_write(self): + lo = self.conn.lobject() + self.assertEqual(lo.write(b("some data")), len("some data")) + + def test_write_large(self): + lo = self.conn.lobject() + data = "data" * 1000000 + self.assertEqual(lo.write(data), len(data)) + + def test_read(self): + lo = self.conn.lobject() + length = lo.write(b("some data")) + lo.close() + + lo = self.conn.lobject(lo.oid) + x = lo.read(4) + self.assertEqual(type(x), type('')) + self.assertEqual(x, "some") + self.assertEqual(lo.read(), " data") + + def test_read_binary(self): + lo = self.conn.lobject() + length = lo.write(b("some data")) + lo.close() + + lo = self.conn.lobject(lo.oid, "rb") + x = lo.read(4) + self.assertEqual(type(x), type(b(''))) + self.assertEqual(x, b("some")) + self.assertEqual(lo.read(), b(" data")) + + def test_read_text(self): + lo = self.conn.lobject() + snowman = u"\u2603" + length = lo.write(u"some data " + snowman) + lo.close() + + lo = self.conn.lobject(lo.oid, "rt") + x = lo.read(4) + self.assertEqual(type(x), type(u'')) + self.assertEqual(x, u"some") + self.assertEqual(lo.read(), u" data " + snowman) + + def test_read_large(self): + lo = self.conn.lobject() + data = "data" * 1000000 + length = lo.write("some" + data) + lo.close() + + lo = self.conn.lobject(lo.oid) + self.assertEqual(lo.read(4), "some") + data1 = lo.read() + # avoid dumping megacraps in the console in case of error + self.assert_(data == data1, + "%r... != %r..." % (data[:100], data1[:100])) + + def test_seek_tell(self): + lo = self.conn.lobject() + length = lo.write(b("some data")) + self.assertEqual(lo.tell(), length) + lo.close() + lo = self.conn.lobject(lo.oid) + + self.assertEqual(lo.seek(5, 0), 5) + self.assertEqual(lo.tell(), 5) + self.assertEqual(lo.read(), "data") + + # SEEK_CUR: relative current location + lo.seek(5) + self.assertEqual(lo.seek(2, 1), 7) + self.assertEqual(lo.tell(), 7) + self.assertEqual(lo.read(), "ta") + + # SEEK_END: relative to end of file + self.assertEqual(lo.seek(-2, 2), length - 2) + self.assertEqual(lo.read(), "ta") + + def test_unlink(self): + lo = self.conn.lobject() + lo.unlink() + + # the object doesn't exist now, so we can't reopen it. + self.assertRaises(psycopg2.OperationalError, self.conn.lobject, lo.oid) + # And the object has been closed. + self.assertEquals(lo.closed, True) + + def test_export(self): + lo = self.conn.lobject() + lo.write(b("some data")) + + self.tmpdir = tempfile.mkdtemp() + filename = os.path.join(self.tmpdir, "data.txt") + lo.export(filename) + self.assertTrue(os.path.exists(filename)) + f = open(filename, "rb") + try: + self.assertEqual(f.read(), b("some data")) + finally: + f.close() + + def test_close_twice(self): + lo = self.conn.lobject() + lo.close() + lo.close() + + def test_write_after_close(self): + lo = self.conn.lobject() + lo.close() + self.assertRaises(psycopg2.InterfaceError, lo.write, b("some data")) + + def test_read_after_close(self): + lo = self.conn.lobject() + lo.close() + self.assertRaises(psycopg2.InterfaceError, lo.read, 5) + + def test_seek_after_close(self): + lo = self.conn.lobject() + lo.close() + self.assertRaises(psycopg2.InterfaceError, lo.seek, 0) + + def test_tell_after_close(self): + lo = self.conn.lobject() + lo.close() + self.assertRaises(psycopg2.InterfaceError, lo.tell) + + def test_unlink_after_close(self): + lo = self.conn.lobject() + lo.close() + # Unlink works on closed files. + lo.unlink() + + def test_export_after_close(self): + lo = self.conn.lobject() + lo.write(b("some data")) + lo.close() + + self.tmpdir = tempfile.mkdtemp() + filename = os.path.join(self.tmpdir, "data.txt") + lo.export(filename) + self.assertTrue(os.path.exists(filename)) + f = open(filename, "rb") + try: + self.assertEqual(f.read(), b("some data")) + finally: + f.close() + + def test_close_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + # Closing outside of the transaction is okay. + lo.close() + + def test_write_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.write, b("some data")) + + def test_read_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.read, 5) + + def test_seek_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.seek, 0) + + def test_tell_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.tell) + + def test_unlink_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + # Unlink of stale lobject is okay + lo.unlink() + + def test_export_after_commit(self): + lo = self.conn.lobject() + lo.write(b("some data")) + self.conn.commit() + + self.tmpdir = tempfile.mkdtemp() + filename = os.path.join(self.tmpdir, "data.txt") + lo.export(filename) + self.assertTrue(os.path.exists(filename)) + f = open(filename, "rb") + try: + self.assertEqual(f.read(), b("some data")) + finally: + f.close() + + @skip_if_tpc_disabled + def test_read_after_tpc_commit(self): + self.conn.tpc_begin('test_lobject') + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.tpc_commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.read, 5) + + @skip_if_tpc_disabled + def test_read_after_tpc_prepare(self): + self.conn.tpc_begin('test_lobject') + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.tpc_prepare() + + try: + self.assertRaises(psycopg2.ProgrammingError, lo.read, 5) + finally: + self.conn.tpc_commit() + + +decorate_all_tests(LargeObjectTests, skip_if_no_lo, skip_lo_if_green) + + +def skip_if_no_truncate(f): + @wraps(f) + def skip_if_no_truncate_(self): + if self.conn.server_version < 80300: + return self.skipTest( + "the server doesn't support large object truncate") + + if not hasattr(psycopg2.extensions.lobject, 'truncate'): + return self.skipTest( + "psycopg2 has been built against a libpq " + "without large object truncate support.") + + return f(self) + + return skip_if_no_truncate_ + +class LargeObjectTruncateTests(LargeObjectTestCase): + def test_truncate(self): + lo = self.conn.lobject() + lo.write("some data") + lo.close() + + lo = self.conn.lobject(lo.oid, "w") + lo.truncate(4) + + # seek position unchanged + self.assertEqual(lo.tell(), 0) + # data truncated + self.assertEqual(lo.read(), "some") + + lo.truncate(6) + lo.seek(0) + # large object extended with zeroes + self.assertEqual(lo.read(), "some\x00\x00") + + lo.truncate() + lo.seek(0) + # large object empty + self.assertEqual(lo.read(), "") + + def test_truncate_after_close(self): + lo = self.conn.lobject() + lo.close() + self.assertRaises(psycopg2.InterfaceError, lo.truncate) + + def test_truncate_after_commit(self): + lo = self.conn.lobject() + self.lo_oid = lo.oid + self.conn.commit() + + self.assertRaises(psycopg2.ProgrammingError, lo.truncate) + +decorate_all_tests(LargeObjectTruncateTests, + skip_if_no_lo, skip_lo_if_green, skip_if_no_truncate) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_module.py b/psycopg2/tests/test_module.py new file mode 100644 index 0000000..b2f5279 --- /dev/null +++ b/psycopg2/tests/test_module.py @@ -0,0 +1,302 @@ +#!/usr/bin/env python + +# test_module.py - unit test for the module interface +# +# Copyright (C) 2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +from testutils import unittest, skip_before_python, skip_before_postgres +from testutils import ConnectingTestCase, skip_copy_if_green + +import psycopg2 + +class ConnectTestCase(unittest.TestCase): + def setUp(self): + self.args = None + def conect_stub(dsn, connection_factory=None, async=False): + self.args = (dsn, connection_factory, async) + + self._connect_orig = psycopg2._connect + psycopg2._connect = conect_stub + + def tearDown(self): + psycopg2._connect = self._connect_orig + + def test_there_has_to_be_something(self): + self.assertRaises(TypeError, psycopg2.connect) + self.assertRaises(TypeError, psycopg2.connect, + connection_factory=lambda dsn, async=False: None) + self.assertRaises(TypeError, psycopg2.connect, + async=True) + + def test_no_keywords(self): + psycopg2.connect('') + self.assertEqual(self.args[0], '') + self.assertEqual(self.args[1], None) + self.assertEqual(self.args[2], False) + + def test_dsn(self): + psycopg2.connect('dbname=blah x=y') + self.assertEqual(self.args[0], 'dbname=blah x=y') + self.assertEqual(self.args[1], None) + self.assertEqual(self.args[2], False) + + def test_supported_keywords(self): + psycopg2.connect(database='foo') + self.assertEqual(self.args[0], 'dbname=foo') + psycopg2.connect(user='postgres') + self.assertEqual(self.args[0], 'user=postgres') + psycopg2.connect(password='secret') + self.assertEqual(self.args[0], 'password=secret') + psycopg2.connect(port=5432) + self.assertEqual(self.args[0], 'port=5432') + psycopg2.connect(sslmode='require') + self.assertEqual(self.args[0], 'sslmode=require') + + psycopg2.connect(database='foo', + user='postgres', password='secret', port=5432) + self.assert_('dbname=foo' in self.args[0]) + self.assert_('user=postgres' in self.args[0]) + self.assert_('password=secret' in self.args[0]) + self.assert_('port=5432' in self.args[0]) + self.assertEqual(len(self.args[0].split()), 4) + + def test_generic_keywords(self): + psycopg2.connect(foo='bar') + self.assertEqual(self.args[0], 'foo=bar') + + def test_factory(self): + def f(dsn, async=False): + pass + + psycopg2.connect(database='foo', bar='baz', connection_factory=f) + self.assertEqual(self.args[0], 'dbname=foo bar=baz') + self.assertEqual(self.args[1], f) + self.assertEqual(self.args[2], False) + + psycopg2.connect("dbname=foo bar=baz", connection_factory=f) + self.assertEqual(self.args[0], 'dbname=foo bar=baz') + self.assertEqual(self.args[1], f) + self.assertEqual(self.args[2], False) + + def test_async(self): + psycopg2.connect(database='foo', bar='baz', async=1) + self.assertEqual(self.args[0], 'dbname=foo bar=baz') + self.assertEqual(self.args[1], None) + self.assert_(self.args[2]) + + psycopg2.connect("dbname=foo bar=baz", async=True) + self.assertEqual(self.args[0], 'dbname=foo bar=baz') + self.assertEqual(self.args[1], None) + self.assert_(self.args[2]) + + def test_empty_param(self): + psycopg2.connect(database='sony', password='') + self.assertEqual(self.args[0], "dbname=sony password=''") + + def test_escape(self): + psycopg2.connect(database='hello world') + self.assertEqual(self.args[0], "dbname='hello world'") + + psycopg2.connect(database=r'back\slash') + self.assertEqual(self.args[0], r"dbname=back\\slash") + + psycopg2.connect(database="quo'te") + self.assertEqual(self.args[0], r"dbname=quo\'te") + + psycopg2.connect(database="with\ttab") + self.assertEqual(self.args[0], "dbname='with\ttab'") + + psycopg2.connect(database=r"\every thing'") + self.assertEqual(self.args[0], r"dbname='\\every thing\''") + + def test_no_kwargs_swallow(self): + self.assertRaises(TypeError, + psycopg2.connect, 'dbname=foo', database='foo') + self.assertRaises(TypeError, + psycopg2.connect, 'dbname=foo', user='postgres') + self.assertRaises(TypeError, + psycopg2.connect, 'dbname=foo', no_such_param='meh') + + +class ExceptionsTestCase(ConnectingTestCase): + def test_attributes(self): + cur = self.conn.cursor() + try: + cur.execute("select * from nonexist") + except psycopg2.Error, exc: + e = exc + + self.assertEqual(e.pgcode, '42P01') + self.assert_(e.pgerror) + self.assert_(e.cursor is cur) + + def test_diagnostics_attributes(self): + cur = self.conn.cursor() + try: + cur.execute("select * from nonexist") + except psycopg2.Error, exc: + e = exc + + diag = e.diag + self.assert_(isinstance(diag, psycopg2.extensions.Diagnostics)) + for attr in [ + 'column_name', 'constraint_name', 'context', 'datatype_name', + 'internal_position', 'internal_query', 'message_detail', + 'message_hint', 'message_primary', 'schema_name', 'severity', + 'source_file', 'source_function', 'source_line', 'sqlstate', + 'statement_position', 'table_name', ]: + v = getattr(diag, attr) + if v is not None: + self.assert_(isinstance(v, str)) + + def test_diagnostics_values(self): + cur = self.conn.cursor() + try: + cur.execute("select * from nonexist") + except psycopg2.Error, exc: + e = exc + + self.assertEqual(e.diag.sqlstate, '42P01') + self.assertEqual(e.diag.severity, 'ERROR') + + def test_diagnostics_life(self): + import gc + from weakref import ref + + def tmp(): + cur = self.conn.cursor() + try: + cur.execute("select * from nonexist") + except psycopg2.Error, exc: + return cur, exc + + cur, e = tmp() + diag = e.diag + w = ref(cur) + + del e, cur + gc.collect() + assert(w() is not None) + + self.assertEqual(diag.sqlstate, '42P01') + + del diag + gc.collect(); gc.collect() + assert(w() is None) + + @skip_copy_if_green + def test_diagnostics_copy(self): + from StringIO import StringIO + f = StringIO() + cur = self.conn.cursor() + try: + cur.copy_to(f, 'nonexist') + except psycopg2.Error, exc: + diag = exc.diag + + self.assertEqual(diag.sqlstate, '42P01') + + def test_diagnostics_independent(self): + cur = self.conn.cursor() + try: + cur.execute("l'acqua e' poca e 'a papera nun galleggia") + except Exception, exc: + diag1 = exc.diag + + self.conn.rollback() + + try: + cur.execute("select level from water where ducks > 1") + except psycopg2.Error, exc: + diag2 = exc.diag + + self.assertEqual(diag1.sqlstate, '42601') + self.assertEqual(diag2.sqlstate, '42P01') + + def test_diagnostics_from_commit(self): + cur = self.conn.cursor() + cur.execute(""" + create temp table test_deferred ( + data int primary key, + ref int references test_deferred (data) + deferrable initially deferred) + """) + cur.execute("insert into test_deferred values (1,2)") + try: + self.conn.commit() + except psycopg2.Error, exc: + e = exc + self.assertEqual(e.diag.sqlstate, '23503') + + @skip_before_postgres(9, 3) + def test_9_3_diagnostics(self): + cur = self.conn.cursor() + cur.execute(""" + create temp table test_exc ( + data int constraint chk_eq1 check (data = 1) + )""") + try: + cur.execute("insert into test_exc values(2)") + except psycopg2.Error, exc: + e = exc + self.assertEqual(e.pgcode, '23514') + self.assertEqual(e.diag.schema_name[:7], "pg_temp") + self.assertEqual(e.diag.table_name, "test_exc") + self.assertEqual(e.diag.column_name, None) + self.assertEqual(e.diag.constraint_name, "chk_eq1") + self.assertEqual(e.diag.datatype_name, None) + + @skip_before_python(2, 5) + def test_pickle(self): + import pickle + cur = self.conn.cursor() + try: + cur.execute("select * from nonexist") + except psycopg2.Error, exc: + e = exc + + e1 = pickle.loads(pickle.dumps(e)) + + self.assertEqual(e.pgerror, e1.pgerror) + self.assertEqual(e.pgcode, e1.pgcode) + self.assert_(e1.cursor is None) + + @skip_before_python(2, 5) + def test_pickle_connection_error(self): + # segfaults on psycopg 2.5.1 - see ticket #170 + import pickle + try: + psycopg2.connect('dbname=nosuchdatabasemate') + except psycopg2.Error, exc: + e = exc + + e1 = pickle.loads(pickle.dumps(e)) + + self.assertEqual(e.pgerror, e1.pgerror) + self.assertEqual(e.pgcode, e1.pgcode) + self.assert_(e1.cursor is None) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_notify.py b/psycopg2/tests/test_notify.py new file mode 100644 index 0000000..d048241 --- /dev/null +++ b/psycopg2/tests/test_notify.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python + +# test_notify.py - unit test for async notifications +# +# Copyright (C) 2010-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +from testutils import unittest + +import psycopg2 +from psycopg2 import extensions +from testutils import ConnectingTestCase, script_to_py3 +from testconfig import dsn + +import sys +import time +import select +from subprocess import Popen, PIPE + + +class NotifiesTests(ConnectingTestCase): + + def autocommit(self, conn): + """Set a connection in autocommit mode.""" + conn.set_isolation_level(extensions.ISOLATION_LEVEL_AUTOCOMMIT) + + def listen(self, name): + """Start listening for a name on self.conn.""" + curs = self.conn.cursor() + curs.execute("LISTEN " + name) + curs.close() + + def notify(self, name, sec=0, payload=None): + """Send a notification to the database, eventually after some time.""" + if payload is None: + payload = '' + else: + payload = ", %r" % payload + + script = ("""\ +import time +time.sleep(%(sec)s) +import psycopg2 +import psycopg2.extensions +conn = psycopg2.connect(%(dsn)r) +conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) +print conn.get_backend_pid() +curs = conn.cursor() +curs.execute("NOTIFY " %(name)r %(payload)r) +curs.close() +conn.close() +""" + % { 'dsn': dsn, 'sec': sec, 'name': name, 'payload': payload}) + + return Popen([sys.executable, '-c', script_to_py3(script)], stdout=PIPE) + + def test_notifies_received_on_poll(self): + self.autocommit(self.conn) + self.listen('foo') + + proc = self.notify('foo', 1) + + t0 = time.time() + ready = select.select([self.conn], [], [], 5) + t1 = time.time() + self.assert_(0.99 < t1 - t0 < 4, t1 - t0) + + pid = int(proc.communicate()[0]) + self.assertEqual(0, len(self.conn.notifies)) + self.assertEqual(extensions.POLL_OK, self.conn.poll()) + self.assertEqual(1, len(self.conn.notifies)) + self.assertEqual(pid, self.conn.notifies[0][0]) + self.assertEqual('foo', self.conn.notifies[0][1]) + + def test_many_notifies(self): + self.autocommit(self.conn) + for name in ['foo', 'bar', 'baz']: + self.listen(name) + + pids = {} + for name in ['foo', 'bar', 'baz', 'qux']: + pids[name] = int(self.notify(name).communicate()[0]) + + self.assertEqual(0, len(self.conn.notifies)) + for i in range(10): + self.assertEqual(extensions.POLL_OK, self.conn.poll()) + self.assertEqual(3, len(self.conn.notifies)) + + names = dict.fromkeys(['foo', 'bar', 'baz']) + for (pid, name) in self.conn.notifies: + self.assertEqual(pids[name], pid) + names.pop(name) # raise if name found twice + + def test_notifies_received_on_execute(self): + self.autocommit(self.conn) + self.listen('foo') + pid = int(self.notify('foo').communicate()[0]) + self.assertEqual(0, len(self.conn.notifies)) + self.conn.cursor().execute('select 1;') + self.assertEqual(1, len(self.conn.notifies)) + self.assertEqual(pid, self.conn.notifies[0][0]) + self.assertEqual('foo', self.conn.notifies[0][1]) + + def test_notify_object(self): + self.autocommit(self.conn) + self.listen('foo') + self.notify('foo').communicate() + time.sleep(0.5) + self.conn.poll() + notify = self.conn.notifies[0] + self.assert_(isinstance(notify, psycopg2.extensions.Notify)) + + def test_notify_attributes(self): + self.autocommit(self.conn) + self.listen('foo') + pid = int(self.notify('foo').communicate()[0]) + time.sleep(0.5) + self.conn.poll() + self.assertEqual(1, len(self.conn.notifies)) + notify = self.conn.notifies[0] + self.assertEqual(pid, notify.pid) + self.assertEqual('foo', notify.channel) + self.assertEqual('', notify.payload) + + def test_notify_payload(self): + if self.conn.server_version < 90000: + return self.skipTest("server version %s doesn't support notify payload" + % self.conn.server_version) + self.autocommit(self.conn) + self.listen('foo') + pid = int(self.notify('foo', payload="Hello, world!").communicate()[0]) + time.sleep(0.5) + self.conn.poll() + self.assertEqual(1, len(self.conn.notifies)) + notify = self.conn.notifies[0] + self.assertEqual(pid, notify.pid) + self.assertEqual('foo', notify.channel) + self.assertEqual('Hello, world!', notify.payload) + + def test_notify_init(self): + n = psycopg2.extensions.Notify(10, 'foo') + self.assertEqual(10, n.pid) + self.assertEqual('foo', n.channel) + self.assertEqual('', n.payload) + (pid, channel) = n + self.assertEqual((pid, channel), (10, 'foo')) + + n = psycopg2.extensions.Notify(42, 'bar', 'baz') + self.assertEqual(42, n.pid) + self.assertEqual('bar', n.channel) + self.assertEqual('baz', n.payload) + (pid, channel) = n + self.assertEqual((pid, channel), (42, 'bar')) + + def test_compare(self): + data = [(10, 'foo'), (20, 'foo'), (10, 'foo', 'bar'), (10, 'foo', 'baz')] + for d1 in data: + for d2 in data: + n1 = psycopg2.extensions.Notify(*d1) + n2 = psycopg2.extensions.Notify(*d2) + self.assertEqual((n1 == n2), (d1 == d2)) + self.assertEqual((n1 != n2), (d1 != d2)) + + def test_compare_tuple(self): + from psycopg2.extensions import Notify + self.assertEqual((10, 'foo'), Notify(10, 'foo')) + self.assertEqual((10, 'foo'), Notify(10, 'foo', 'bar')) + self.assertNotEqual((10, 'foo'), Notify(20, 'foo')) + self.assertNotEqual((10, 'foo'), Notify(10, 'bar')) + + def test_hash(self): + from psycopg2.extensions import Notify + self.assertEqual(hash((10, 'foo')), hash(Notify(10, 'foo'))) + self.assertNotEqual(hash(Notify(10, 'foo', 'bar')), + hash(Notify(10, 'foo'))) + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() + diff --git a/psycopg2/tests/test_psycopg2_dbapi20.py b/psycopg2/tests/test_psycopg2_dbapi20.py new file mode 100644 index 0000000..744d322 --- /dev/null +++ b/psycopg2/tests/test_psycopg2_dbapi20.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# test_psycopg2_dbapi20.py - DB API conformance test for psycopg2 +# +# Copyright (C) 2006-2011 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import dbapi20 +import dbapi20_tpc +from testutils import skip_if_tpc_disabled +from testutils import unittest, decorate_all_tests +import psycopg2 + +from testconfig import dsn + +class Psycopg2Tests(dbapi20.DatabaseAPI20Test): + driver = psycopg2 + connect_args = () + connect_kw_args = {'dsn': dsn} + + lower_func = 'lower' # For stored procedure test + + def test_setoutputsize(self): + # psycopg2's setoutputsize() is a no-op + pass + + def test_nextset(self): + # psycopg2 does not implement nextset() + pass + + +class Psycopg2TPCTests(dbapi20_tpc.TwoPhaseCommitTests, unittest.TestCase): + driver = psycopg2 + + def connect(self): + return psycopg2.connect(dsn=dsn) + +decorate_all_tests(Psycopg2TPCTests, skip_if_tpc_disabled) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == '__main__': + unittest.main() diff --git a/psycopg2/tests/test_quote.py b/psycopg2/tests/test_quote.py new file mode 100644 index 0000000..e7b3c31 --- /dev/null +++ b/psycopg2/tests/test_quote.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python + +# test_quote.py - unit test for strings quoting +# +# Copyright (C) 2007-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import sys +from testutils import unittest, ConnectingTestCase + +import psycopg2 +import psycopg2.extensions +from psycopg2.extensions import b + +class QuotingTestCase(ConnectingTestCase): + r"""Checks the correct quoting of strings and binary objects. + + Since ver. 8.1, PostgreSQL is moving towards SQL standard conforming + strings, where the backslash (\) is treated as literal character, + not as escape. To treat the backslash as a C-style escapes, PG supports + the E'' quotes. + + This test case checks that the E'' quotes are used whenever they are + needed. The tests are expected to pass with all PostgreSQL server versions + (currently tested with 7.4 <= PG <= 8.3beta) and with any + 'standard_conforming_strings' server parameter value. + The tests also check that no warning is raised ('escape_string_warning' + should be on). + + http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS + http://www.postgresql.org/docs/current/static/runtime-config-compatible.html + """ + def test_string(self): + data = """some data with \t chars + to escape into, 'quotes' and \\ a backslash too. + """ + data += "".join(map(chr, range(1,127))) + + curs = self.conn.cursor() + curs.execute("SELECT %s;", (data,)) + res = curs.fetchone()[0] + + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + def test_binary(self): + data = b("""some data with \000\013 binary + stuff into, 'quotes' and \\ a backslash too. + """) + if sys.version_info[0] < 3: + data += "".join(map(chr, range(256))) + else: + data += bytes(range(256)) + + curs = self.conn.cursor() + curs.execute("SELECT %s::bytea;", (psycopg2.Binary(data),)) + if sys.version_info[0] < 3: + res = str(curs.fetchone()[0]) + else: + res = curs.fetchone()[0].tobytes() + + if res[0] in (b('x'), ord(b('x'))) and self.conn.server_version >= 90000: + return self.skipTest( + "bytea broken with server >= 9.0, libpq < 9") + + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + def test_unicode(self): + curs = self.conn.cursor() + curs.execute("SHOW server_encoding") + server_encoding = curs.fetchone()[0] + if server_encoding != "UTF8": + return self.skipTest( + "Unicode test skipped since server encoding is %s" + % server_encoding) + + data = u"""some data with \t chars + to escape into, 'quotes', \u20ac euro sign and \\ a backslash too. + """ + data += u"".join(map(unichr, [ u for u in range(1,65536) + if not 0xD800 <= u <= 0xDFFF ])) # surrogate area + self.conn.set_client_encoding('UNICODE') + + psycopg2.extensions.register_type(psycopg2.extensions.UNICODE, self.conn) + curs.execute("SELECT %s::text;", (data,)) + res = curs.fetchone()[0] + + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + def test_latin1(self): + self.conn.set_client_encoding('LATIN1') + curs = self.conn.cursor() + if sys.version_info[0] < 3: + data = ''.join(map(chr, range(32, 127) + range(160, 256))) + else: + data = bytes(range(32, 127) + range(160, 256)).decode('latin1') + + # as string + curs.execute("SELECT %s::text;", (data,)) + res = curs.fetchone()[0] + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + # as unicode + if sys.version_info[0] < 3: + psycopg2.extensions.register_type(psycopg2.extensions.UNICODE, self.conn) + data = data.decode('latin1') + + curs.execute("SELECT %s::text;", (data,)) + res = curs.fetchone()[0] + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + def test_koi8(self): + self.conn.set_client_encoding('KOI8') + curs = self.conn.cursor() + if sys.version_info[0] < 3: + data = ''.join(map(chr, range(32, 127) + range(128, 256))) + else: + data = bytes(range(32, 127) + range(128, 256)).decode('koi8_r') + + # as string + curs.execute("SELECT %s::text;", (data,)) + res = curs.fetchone()[0] + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + # as unicode + if sys.version_info[0] < 3: + psycopg2.extensions.register_type(psycopg2.extensions.UNICODE, self.conn) + data = data.decode('koi8_r') + + curs.execute("SELECT %s::text;", (data,)) + res = curs.fetchone()[0] + self.assertEqual(res, data) + self.assert_(not self.conn.notices) + + +class TestQuotedString(ConnectingTestCase): + def test_encoding(self): + q = psycopg2.extensions.QuotedString('hi') + self.assertEqual(q.encoding, 'latin1') + + self.conn.set_client_encoding('utf_8') + q.prepare(self.conn) + self.assertEqual(q.encoding, 'utf_8') + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() + diff --git a/psycopg2/tests/test_transaction.py b/psycopg2/tests/test_transaction.py new file mode 100644 index 0000000..724d0d8 --- /dev/null +++ b/psycopg2/tests/test_transaction.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python + +# test_transaction - unit test on transaction behaviour +# +# Copyright (C) 2007-2011 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import threading +from testutils import unittest, ConnectingTestCase, skip_before_postgres + +import psycopg2 +from psycopg2.extensions import ( + ISOLATION_LEVEL_SERIALIZABLE, STATUS_BEGIN, STATUS_READY) + +class TransactionTests(ConnectingTestCase): + + def setUp(self): + ConnectingTestCase.setUp(self) + self.conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE) + curs = self.conn.cursor() + curs.execute(''' + CREATE TEMPORARY TABLE table1 ( + id int PRIMARY KEY + )''') + # The constraint is set to deferrable for the commit_failed test + curs.execute(''' + CREATE TEMPORARY TABLE table2 ( + id int PRIMARY KEY, + table1_id int, + CONSTRAINT table2__table1_id__fk + FOREIGN KEY (table1_id) REFERENCES table1(id) DEFERRABLE)''') + curs.execute('INSERT INTO table1 VALUES (1)') + curs.execute('INSERT INTO table2 VALUES (1, 1)') + self.conn.commit() + + def test_rollback(self): + # Test that rollback undoes changes + curs = self.conn.cursor() + curs.execute('INSERT INTO table2 VALUES (2, 1)') + # Rollback takes us from BEGIN state to READY state + self.assertEqual(self.conn.status, STATUS_BEGIN) + self.conn.rollback() + self.assertEqual(self.conn.status, STATUS_READY) + curs.execute('SELECT id, table1_id FROM table2 WHERE id = 2') + self.assertEqual(curs.fetchall(), []) + + def test_commit(self): + # Test that commit stores changes + curs = self.conn.cursor() + curs.execute('INSERT INTO table2 VALUES (2, 1)') + # Rollback takes us from BEGIN state to READY state + self.assertEqual(self.conn.status, STATUS_BEGIN) + self.conn.commit() + self.assertEqual(self.conn.status, STATUS_READY) + # Now rollback and show that the new record is still there: + self.conn.rollback() + curs.execute('SELECT id, table1_id FROM table2 WHERE id = 2') + self.assertEqual(curs.fetchall(), [(2, 1)]) + + def test_failed_commit(self): + # Test that we can recover from a failed commit. + # We use a deferred constraint to cause a failure on commit. + curs = self.conn.cursor() + curs.execute('SET CONSTRAINTS table2__table1_id__fk DEFERRED') + curs.execute('INSERT INTO table2 VALUES (2, 42)') + # The commit should fail, and move the cursor back to READY state + self.assertEqual(self.conn.status, STATUS_BEGIN) + self.assertRaises(psycopg2.IntegrityError, self.conn.commit) + self.assertEqual(self.conn.status, STATUS_READY) + # The connection should be ready to use for the next transaction: + curs.execute('SELECT 1') + self.assertEqual(curs.fetchone()[0], 1) + + +class DeadlockSerializationTests(ConnectingTestCase): + """Test deadlock and serialization failure errors.""" + + def connect(self): + conn = ConnectingTestCase.connect(self) + conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE) + return conn + + def setUp(self): + ConnectingTestCase.setUp(self) + + curs = self.conn.cursor() + # Drop table if it already exists + try: + curs.execute("DROP TABLE table1") + self.conn.commit() + except psycopg2.DatabaseError: + self.conn.rollback() + try: + curs.execute("DROP TABLE table2") + self.conn.commit() + except psycopg2.DatabaseError: + self.conn.rollback() + # Create sample data + curs.execute(""" + CREATE TABLE table1 ( + id int PRIMARY KEY, + name text) + """) + curs.execute("INSERT INTO table1 VALUES (1, 'hello')") + curs.execute("CREATE TABLE table2 (id int PRIMARY KEY)") + self.conn.commit() + + def tearDown(self): + curs = self.conn.cursor() + curs.execute("DROP TABLE table1") + curs.execute("DROP TABLE table2") + self.conn.commit() + + ConnectingTestCase.tearDown(self) + + def test_deadlock(self): + self.thread1_error = self.thread2_error = None + step1 = threading.Event() + step2 = threading.Event() + + def task1(): + try: + conn = self.connect() + curs = conn.cursor() + curs.execute("LOCK table1 IN ACCESS EXCLUSIVE MODE") + step1.set() + step2.wait() + curs.execute("LOCK table2 IN ACCESS EXCLUSIVE MODE") + except psycopg2.DatabaseError, exc: + self.thread1_error = exc + step1.set() + conn.close() + def task2(): + try: + conn = self.connect() + curs = conn.cursor() + step1.wait() + curs.execute("LOCK table2 IN ACCESS EXCLUSIVE MODE") + step2.set() + curs.execute("LOCK table1 IN ACCESS EXCLUSIVE MODE") + except psycopg2.DatabaseError, exc: + self.thread2_error = exc + step2.set() + conn.close() + + # Run the threads in parallel. The "step1" and "step2" events + # ensure that the two transactions overlap. + thread1 = threading.Thread(target=task1) + thread2 = threading.Thread(target=task2) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + + # Exactly one of the threads should have failed with + # TransactionRollbackError: + self.assertFalse(self.thread1_error and self.thread2_error) + error = self.thread1_error or self.thread2_error + self.assertTrue(isinstance( + error, psycopg2.extensions.TransactionRollbackError)) + + def test_serialisation_failure(self): + self.thread1_error = self.thread2_error = None + step1 = threading.Event() + step2 = threading.Event() + + def task1(): + try: + conn = self.connect() + curs = conn.cursor() + curs.execute("SELECT name FROM table1 WHERE id = 1") + curs.fetchall() + step1.set() + step2.wait() + curs.execute("UPDATE table1 SET name='task1' WHERE id = 1") + conn.commit() + except psycopg2.DatabaseError, exc: + self.thread1_error = exc + step1.set() + conn.close() + def task2(): + try: + conn = self.connect() + curs = conn.cursor() + step1.wait() + curs.execute("UPDATE table1 SET name='task2' WHERE id = 1") + conn.commit() + except psycopg2.DatabaseError, exc: + self.thread2_error = exc + step2.set() + conn.close() + + # Run the threads in parallel. The "step1" and "step2" events + # ensure that the two transactions overlap. + thread1 = threading.Thread(target=task1) + thread2 = threading.Thread(target=task2) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + + # Exactly one of the threads should have failed with + # TransactionRollbackError: + self.assertFalse(self.thread1_error and self.thread2_error) + error = self.thread1_error or self.thread2_error + self.assertTrue(isinstance( + error, psycopg2.extensions.TransactionRollbackError)) + + +class QueryCancellationTests(ConnectingTestCase): + """Tests for query cancellation.""" + + def setUp(self): + ConnectingTestCase.setUp(self) + self.conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE) + + @skip_before_postgres(8, 2) + def test_statement_timeout(self): + curs = self.conn.cursor() + # Set a low statement timeout, then sleep for a longer period. + curs.execute('SET statement_timeout TO 10') + self.assertRaises(psycopg2.extensions.QueryCanceledError, + curs.execute, 'SELECT pg_sleep(50)') + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/test_types_basic.py b/psycopg2/tests/test_types_basic.py new file mode 100644 index 0000000..6c4cc97 --- /dev/null +++ b/psycopg2/tests/test_types_basic.py @@ -0,0 +1,467 @@ +#!/usr/bin/env python +# +# types_basic.py - tests for basic types conversions +# +# Copyright (C) 2004-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import decimal + +import sys +from functools import wraps +import testutils +from testutils import unittest, ConnectingTestCase, decorate_all_tests + +import psycopg2 +from psycopg2.extensions import b + + +class TypesBasicTests(ConnectingTestCase): + """Test that all type conversions are working.""" + + def execute(self, *args): + curs = self.conn.cursor() + curs.execute(*args) + return curs.fetchone()[0] + + def testQuoting(self): + s = "Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong quoting: " + s) + + def testUnicode(self): + s = u"Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong unicode quoting: " + s) + + def testNumber(self): + s = self.execute("SELECT %s AS foo", (1971,)) + self.failUnless(s == 1971, "wrong integer quoting: " + str(s)) + s = self.execute("SELECT %s AS foo", (1971L,)) + self.failUnless(s == 1971L, "wrong integer quoting: " + str(s)) + + def testBoolean(self): + x = self.execute("SELECT %s as foo", (False,)) + self.assert_(x is False) + x = self.execute("SELECT %s as foo", (True,)) + self.assert_(x is True) + + def testDecimal(self): + s = self.execute("SELECT %s AS foo", (decimal.Decimal("19.10"),)) + self.failUnless(s - decimal.Decimal("19.10") == 0, + "wrong decimal quoting: " + str(s)) + s = self.execute("SELECT %s AS foo", (decimal.Decimal("NaN"),)) + self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s)) + self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s)) + s = self.execute("SELECT %s AS foo", (decimal.Decimal("infinity"),)) + self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s)) + self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s)) + s = self.execute("SELECT %s AS foo", (decimal.Decimal("-infinity"),)) + self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s)) + self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s)) + + def testFloatNan(self): + try: + float("nan") + except ValueError: + return self.skipTest("nan not available on this platform") + + s = self.execute("SELECT %s AS foo", (float("nan"),)) + self.failUnless(str(s) == "nan", "wrong float quoting: " + str(s)) + self.failUnless(type(s) == float, "wrong float conversion: " + repr(s)) + + def testFloatInf(self): + try: + self.execute("select 'inf'::float") + except psycopg2.DataError: + return self.skipTest("inf::float not available on the server") + except ValueError: + return self.skipTest("inf not available on this platform") + s = self.execute("SELECT %s AS foo", (float("inf"),)) + self.failUnless(str(s) == "inf", "wrong float quoting: " + str(s)) + self.failUnless(type(s) == float, "wrong float conversion: " + repr(s)) + + s = self.execute("SELECT %s AS foo", (float("-inf"),)) + self.failUnless(str(s) == "-inf", "wrong float quoting: " + str(s)) + + def testBinary(self): + if sys.version_info[0] < 3: + s = ''.join([chr(x) for x in range(256)]) + b = psycopg2.Binary(s) + buf = self.execute("SELECT %s::bytea AS foo", (b,)) + self.assertEqual(s, str(buf)) + else: + s = bytes(range(256)) + b = psycopg2.Binary(s) + buf = self.execute("SELECT %s::bytea AS foo", (b,)) + self.assertEqual(s, buf.tobytes()) + + def testBinaryNone(self): + b = psycopg2.Binary(None) + buf = self.execute("SELECT %s::bytea AS foo", (b,)) + self.assertEqual(buf, None) + + def testBinaryEmptyString(self): + # test to make sure an empty Binary is converted to an empty string + if sys.version_info[0] < 3: + b = psycopg2.Binary('') + self.assertEqual(str(b), "''::bytea") + else: + b = psycopg2.Binary(bytes([])) + self.assertEqual(str(b), "''::bytea") + + def testBinaryRoundTrip(self): + # test to make sure buffers returned by psycopg2 are + # understood by execute: + if sys.version_info[0] < 3: + s = ''.join([chr(x) for x in range(256)]) + buf = self.execute("SELECT %s::bytea AS foo", (psycopg2.Binary(s),)) + buf2 = self.execute("SELECT %s::bytea AS foo", (buf,)) + self.assertEqual(s, str(buf2)) + else: + s = bytes(range(256)) + buf = self.execute("SELECT %s::bytea AS foo", (psycopg2.Binary(s),)) + buf2 = self.execute("SELECT %s::bytea AS foo", (buf,)) + self.assertEqual(s, buf2.tobytes()) + + def testArray(self): + s = self.execute("SELECT %s AS foo", ([[1,2],[3,4]],)) + self.failUnlessEqual(s, [[1,2],[3,4]]) + s = self.execute("SELECT %s AS foo", (['one', 'two', 'three'],)) + self.failUnlessEqual(s, ['one', 'two', 'three']) + + def testEmptyArrayRegression(self): + # ticket #42 + import datetime + curs = self.conn.cursor() + curs.execute("create table array_test (id integer, col timestamp without time zone[])") + + curs.execute("insert into array_test values (%s, %s)", (1, [datetime.date(2011,2,14)])) + curs.execute("select col from array_test where id = 1") + self.assertEqual(curs.fetchone()[0], [datetime.datetime(2011, 2, 14, 0, 0)]) + + curs.execute("insert into array_test values (%s, %s)", (2, [])) + curs.execute("select col from array_test where id = 2") + self.assertEqual(curs.fetchone()[0], []) + + def testEmptyArray(self): + s = self.execute("SELECT '{}' AS foo") + self.failUnlessEqual(s, []) + s = self.execute("SELECT '{}'::text[] AS foo") + self.failUnlessEqual(s, []) + s = self.execute("SELECT %s AS foo", ([],)) + self.failUnlessEqual(s, []) + s = self.execute("SELECT 1 != ALL(%s)", ([],)) + self.failUnlessEqual(s, True) + # but don't break the strings :) + s = self.execute("SELECT '{}'::text AS foo") + self.failUnlessEqual(s, "{}") + + def testArrayEscape(self): + ss = ['', '\\', '"', '\\\\', '\\"'] + for s in ss: + r = self.execute("SELECT %s AS foo", (s,)) + self.failUnlessEqual(s, r) + r = self.execute("SELECT %s AS foo", ([s],)) + self.failUnlessEqual([s], r) + + r = self.execute("SELECT %s AS foo", (ss,)) + self.failUnlessEqual(ss, r) + + def testArrayMalformed(self): + curs = self.conn.cursor() + ss = ['', '{', '{}}', '{' * 20 + '}' * 20] + for s in ss: + self.assertRaises(psycopg2.DataError, + psycopg2.extensions.STRINGARRAY, b(s), curs) + + @testutils.skip_from_python(3) + def testTypeRoundtripBuffer(self): + o1 = buffer("".join(map(chr, range(256)))) + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1), type(o2)) + + # Test with an empty buffer + o1 = buffer("") + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1), type(o2)) + self.assertEqual(str(o1), str(o2)) + + @testutils.skip_from_python(3) + def testTypeRoundtripBufferArray(self): + o1 = buffer("".join(map(chr, range(256)))) + o1 = [o1] + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(type(o1[0]), type(o2[0])) + self.assertEqual(str(o1[0]), str(o2[0])) + + @testutils.skip_before_python(3) + def testTypeRoundtripBytes(self): + o1 = bytes(range(256)) + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(memoryview, type(o2)) + + # Test with an empty buffer + o1 = bytes([]) + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(memoryview, type(o2)) + + @testutils.skip_before_python(3) + def testTypeRoundtripBytesArray(self): + o1 = bytes(range(256)) + o1 = [o1] + o2 = self.execute("select %s;", (o1,)) + self.assertEqual(memoryview, type(o2[0])) + + @testutils.skip_before_python(2, 6) + def testAdaptBytearray(self): + o1 = bytearray(range(256)) + o2 = self.execute("select %s;", (o1,)) + + if sys.version_info[0] < 3: + self.assertEqual(buffer, type(o2)) + else: + self.assertEqual(memoryview, type(o2)) + + self.assertEqual(len(o1), len(o2)) + for c1, c2 in zip(o1, o2): + self.assertEqual(c1, ord(c2)) + + # Test with an empty buffer + o1 = bytearray([]) + o2 = self.execute("select %s;", (o1,)) + + self.assertEqual(len(o2), 0) + if sys.version_info[0] < 3: + self.assertEqual(buffer, type(o2)) + else: + self.assertEqual(memoryview, type(o2)) + + @testutils.skip_before_python(2, 7) + def testAdaptMemoryview(self): + o1 = memoryview(bytearray(range(256))) + o2 = self.execute("select %s;", (o1,)) + if sys.version_info[0] < 3: + self.assertEqual(buffer, type(o2)) + else: + self.assertEqual(memoryview, type(o2)) + + # Test with an empty buffer + o1 = memoryview(bytearray([])) + o2 = self.execute("select %s;", (o1,)) + if sys.version_info[0] < 3: + self.assertEqual(buffer, type(o2)) + else: + self.assertEqual(memoryview, type(o2)) + + def testByteaHexCheckFalsePositive(self): + # the check \x -> x to detect bad bytea decode + # may be fooled if the first char is really an 'x' + o1 = psycopg2.Binary(b('x')) + o2 = self.execute("SELECT %s::bytea AS foo", (o1,)) + self.assertEqual(b('x'), o2[0]) + + def testNegNumber(self): + d1 = self.execute("select -%s;", (decimal.Decimal('-1.0'),)) + self.assertEqual(1, d1) + f1 = self.execute("select -%s;", (-1.0,)) + self.assertEqual(1, f1) + i1 = self.execute("select -%s;", (-1,)) + self.assertEqual(1, i1) + l1 = self.execute("select -%s;", (-1L,)) + self.assertEqual(1, l1) + + def testGenericArray(self): + a = self.execute("select '{1,2,3}'::int4[]") + self.assertEqual(a, [1,2,3]) + a = self.execute("select array['a','b','''']::text[]") + self.assertEqual(a, ['a','b',"'"]) + + @testutils.skip_before_postgres(8, 2) + def testGenericArrayNull(self): + def caster(s, cur): + if s is None: return "nada" + return int(s) * 2 + base = psycopg2.extensions.new_type((23,), "INT4", caster) + array = psycopg2.extensions.new_array_type((1007,), "INT4ARRAY", base) + + psycopg2.extensions.register_type(array, self.conn) + a = self.execute("select '{1,2,3}'::int4[]") + self.assertEqual(a, [2,4,6]) + a = self.execute("select '{1,2,NULL}'::int4[]") + self.assertEqual(a, [2,4,'nada']) + + +class AdaptSubclassTest(unittest.TestCase): + def test_adapt_subtype(self): + from psycopg2.extensions import adapt + class Sub(str): pass + s1 = "hel'lo" + s2 = Sub(s1) + self.assertEqual(adapt(s1).getquoted(), adapt(s2).getquoted()) + + def test_adapt_most_specific(self): + from psycopg2.extensions import adapt, register_adapter, AsIs + + class A(object): pass + class B(A): pass + class C(B): pass + + register_adapter(A, lambda a: AsIs("a")) + register_adapter(B, lambda b: AsIs("b")) + try: + self.assertEqual(b('b'), adapt(C()).getquoted()) + finally: + del psycopg2.extensions.adapters[A, psycopg2.extensions.ISQLQuote] + del psycopg2.extensions.adapters[B, psycopg2.extensions.ISQLQuote] + + @testutils.skip_from_python(3) + def test_no_mro_no_joy(self): + from psycopg2.extensions import adapt, register_adapter, AsIs + + class A: pass + class B(A): pass + + register_adapter(A, lambda a: AsIs("a")) + try: + self.assertRaises(psycopg2.ProgrammingError, adapt, B()) + finally: + del psycopg2.extensions.adapters[A, psycopg2.extensions.ISQLQuote] + + + @testutils.skip_before_python(3) + def test_adapt_subtype_3(self): + from psycopg2.extensions import adapt, register_adapter, AsIs + + class A: pass + class B(A): pass + + register_adapter(A, lambda a: AsIs("a")) + try: + self.assertEqual(b("a"), adapt(B()).getquoted()) + finally: + del psycopg2.extensions.adapters[A, psycopg2.extensions.ISQLQuote] + + +class ByteaParserTest(unittest.TestCase): + """Unit test for our bytea format parser.""" + def setUp(self): + try: + self._cast = self._import_cast() + except Exception, e: + self._cast = None + self._exc = e + + def _import_cast(self): + """Use ctypes to access the C function. + + Raise any sort of error: we just support this where ctypes works as + expected. + """ + import ctypes + lib = ctypes.cdll.LoadLibrary(psycopg2._psycopg.__file__) + cast = lib.typecast_BINARY_cast + cast.argtypes = [ctypes.c_char_p, ctypes.c_size_t, ctypes.py_object] + cast.restype = ctypes.py_object + return cast + + def cast(self, buffer): + """Cast a buffer from the output format""" + l = buffer and len(buffer) or 0 + rv = self._cast(buffer, l, None) + + if rv is None: + return None + + if sys.version_info[0] < 3: + return str(rv) + else: + return rv.tobytes() + + def test_null(self): + rv = self.cast(None) + self.assertEqual(rv, None) + + def test_blank(self): + rv = self.cast(b('')) + self.assertEqual(rv, b('')) + + def test_blank_hex(self): + # Reported as problematic in ticket #48 + rv = self.cast(b('\\x')) + self.assertEqual(rv, b('')) + + def test_full_hex(self, upper=False): + buf = ''.join(("%02x" % i) for i in range(256)) + if upper: buf = buf.upper() + buf = '\\x' + buf + rv = self.cast(b(buf)) + if sys.version_info[0] < 3: + self.assertEqual(rv, ''.join(map(chr, range(256)))) + else: + self.assertEqual(rv, bytes(range(256))) + + def test_full_hex_upper(self): + return self.test_full_hex(upper=True) + + def test_full_escaped_octal(self): + buf = ''.join(("\\%03o" % i) for i in range(256)) + rv = self.cast(b(buf)) + if sys.version_info[0] < 3: + self.assertEqual(rv, ''.join(map(chr, range(256)))) + else: + self.assertEqual(rv, bytes(range(256))) + + def test_escaped_mixed(self): + import string + buf = ''.join(("\\%03o" % i) for i in range(32)) + buf += string.ascii_letters + buf += ''.join('\\' + c for c in string.ascii_letters) + buf += '\\\\' + rv = self.cast(b(buf)) + if sys.version_info[0] < 3: + tgt = ''.join(map(chr, range(32))) \ + + string.ascii_letters * 2 + '\\' + else: + tgt = bytes(range(32)) + \ + (string.ascii_letters * 2 + '\\').encode('ascii') + + self.assertEqual(rv, tgt) + +def skip_if_cant_cast(f): + @wraps(f) + def skip_if_cant_cast_(self, *args, **kwargs): + if self._cast is None: + return self.skipTest("can't test bytea parser: %s - %s" + % (self._exc.__class__.__name__, self._exc)) + + return f(self, *args, **kwargs) + + return skip_if_cant_cast_ + +decorate_all_tests(ByteaParserTest, skip_if_cant_cast) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() + diff --git a/psycopg2/tests/test_types_extras.py b/psycopg2/tests/test_types_extras.py new file mode 100644 index 0000000..96ffcd3 --- /dev/null +++ b/psycopg2/tests/test_types_extras.py @@ -0,0 +1,1562 @@ +#!/usr/bin/env python +# +# types_extras.py - tests for extras types conversions +# +# Copyright (C) 2008-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import re +import sys +from decimal import Decimal +from datetime import date, datetime +from functools import wraps + +from testutils import unittest, skip_if_no_uuid, skip_before_postgres +from testutils import ConnectingTestCase, decorate_all_tests + +import psycopg2 +import psycopg2.extras +from psycopg2.extensions import b + + +def filter_scs(conn, s): + if conn.get_parameter_status("standard_conforming_strings") == 'off': + return s + else: + return s.replace(b("E'"), b("'")) + +class TypesExtrasTests(ConnectingTestCase): + """Test that all type conversions are working.""" + + def execute(self, *args): + curs = self.conn.cursor() + curs.execute(*args) + return curs.fetchone()[0] + + @skip_if_no_uuid + def testUUID(self): + import uuid + psycopg2.extras.register_uuid() + u = uuid.UUID('9c6d5a77-7256-457e-9461-347b4358e350') + s = self.execute("SELECT %s AS foo", (u,)) + self.failUnless(u == s) + # must survive NULL cast to a uuid + s = self.execute("SELECT NULL::uuid AS foo") + self.failUnless(s is None) + + @skip_if_no_uuid + def testUUIDARRAY(self): + import uuid + psycopg2.extras.register_uuid() + u = [uuid.UUID('9c6d5a77-7256-457e-9461-347b4358e350'), uuid.UUID('9c6d5a77-7256-457e-9461-347b4358e352')] + s = self.execute("SELECT %s AS foo", (u,)) + self.failUnless(u == s) + # array with a NULL element + u = [uuid.UUID('9c6d5a77-7256-457e-9461-347b4358e350'), None] + s = self.execute("SELECT %s AS foo", (u,)) + self.failUnless(u == s) + # must survive NULL cast to a uuid[] + s = self.execute("SELECT NULL::uuid[] AS foo") + self.failUnless(s is None) + # what about empty arrays? + s = self.execute("SELECT '{}'::uuid[] AS foo") + self.failUnless(type(s) == list and len(s) == 0) + + def testINET(self): + psycopg2.extras.register_inet() + i = psycopg2.extras.Inet("192.168.1.0/24") + s = self.execute("SELECT %s AS foo", (i,)) + self.failUnless(i.addr == s.addr) + # must survive NULL cast to inet + s = self.execute("SELECT NULL::inet AS foo") + self.failUnless(s is None) + + def testINETARRAY(self): + psycopg2.extras.register_inet() + i = psycopg2.extras.Inet("192.168.1.0/24") + s = self.execute("SELECT %s AS foo", ([i],)) + self.failUnless(i.addr == s[0].addr) + # must survive NULL cast to inet + s = self.execute("SELECT NULL::inet[] AS foo") + self.failUnless(s is None) + + def test_inet_conform(self): + from psycopg2.extras import Inet + i = Inet("192.168.1.0/24") + a = psycopg2.extensions.adapt(i) + a.prepare(self.conn) + self.assertEqual( + filter_scs(self.conn, b("E'192.168.1.0/24'::inet")), + a.getquoted()) + + # adapts ok with unicode too + i = Inet(u"192.168.1.0/24") + a = psycopg2.extensions.adapt(i) + a.prepare(self.conn) + self.assertEqual( + filter_scs(self.conn, b("E'192.168.1.0/24'::inet")), + a.getquoted()) + + def test_adapt_fail(self): + class Foo(object): pass + self.assertRaises(psycopg2.ProgrammingError, + psycopg2.extensions.adapt, Foo(), psycopg2.extensions.ISQLQuote, None) + try: + psycopg2.extensions.adapt(Foo(), psycopg2.extensions.ISQLQuote, None) + except psycopg2.ProgrammingError, err: + self.failUnless(str(err) == "can't adapt type 'Foo'") + + +def skip_if_no_hstore(f): + @wraps(f) + def skip_if_no_hstore_(self): + from psycopg2.extras import HstoreAdapter + oids = HstoreAdapter.get_oids(self.conn) + if oids is None or not oids[0]: + return self.skipTest("hstore not available in test database") + return f(self) + + return skip_if_no_hstore_ + +class HstoreTestCase(ConnectingTestCase): + def test_adapt_8(self): + if self.conn.server_version >= 90000: + return self.skipTest("skipping dict adaptation with PG pre-9 syntax") + + from psycopg2.extras import HstoreAdapter + + o = {'a': '1', 'b': "'", 'c': None} + if self.conn.encoding == 'UTF8': + o['d'] = u'\xe0' + + a = HstoreAdapter(o) + a.prepare(self.conn) + q = a.getquoted() + + self.assert_(q.startswith(b("((")), q) + ii = q[1:-1].split(b("||")) + ii.sort() + + self.assertEqual(len(ii), len(o)) + self.assertEqual(ii[0], filter_scs(self.conn, b("(E'a' => E'1')"))) + self.assertEqual(ii[1], filter_scs(self.conn, b("(E'b' => E'''')"))) + self.assertEqual(ii[2], filter_scs(self.conn, b("(E'c' => NULL)"))) + if 'd' in o: + encc = u'\xe0'.encode(psycopg2.extensions.encodings[self.conn.encoding]) + self.assertEqual(ii[3], filter_scs(self.conn, b("(E'd' => E'") + encc + b("')"))) + + def test_adapt_9(self): + if self.conn.server_version < 90000: + return self.skipTest("skipping dict adaptation with PG 9 syntax") + + from psycopg2.extras import HstoreAdapter + + o = {'a': '1', 'b': "'", 'c': None} + if self.conn.encoding == 'UTF8': + o['d'] = u'\xe0' + + a = HstoreAdapter(o) + a.prepare(self.conn) + q = a.getquoted() + + m = re.match(b(r'hstore\(ARRAY\[([^\]]+)\], ARRAY\[([^\]]+)\]\)'), q) + self.assert_(m, repr(q)) + + kk = m.group(1).split(b(", ")) + vv = m.group(2).split(b(", ")) + ii = zip(kk, vv) + ii.sort() + + def f(*args): + return tuple([filter_scs(self.conn, s) for s in args]) + + self.assertEqual(len(ii), len(o)) + self.assertEqual(ii[0], f(b("E'a'"), b("E'1'"))) + self.assertEqual(ii[1], f(b("E'b'"), b("E''''"))) + self.assertEqual(ii[2], f(b("E'c'"), b("NULL"))) + if 'd' in o: + encc = u'\xe0'.encode(psycopg2.extensions.encodings[self.conn.encoding]) + self.assertEqual(ii[3], f(b("E'd'"), b("E'") + encc + b("'"))) + + def test_parse(self): + from psycopg2.extras import HstoreAdapter + + def ok(s, d): + self.assertEqual(HstoreAdapter.parse(s, None), d) + + ok(None, None) + ok('', {}) + ok('"a"=>"1", "b"=>"2"', {'a': '1', 'b': '2'}) + ok('"a" => "1" ,"b" => "2"', {'a': '1', 'b': '2'}) + ok('"a"=>NULL, "b"=>"2"', {'a': None, 'b': '2'}) + ok(r'"a"=>"\"", "\""=>"2"', {'a': '"', '"': '2'}) + ok('"a"=>"\'", "\'"=>"2"', {'a': "'", "'": '2'}) + ok('"a"=>"1", "b"=>NULL', {'a': '1', 'b': None}) + ok(r'"a\\"=>"1"', {'a\\': '1'}) + ok(r'"a\""=>"1"', {'a"': '1'}) + ok(r'"a\\\""=>"1"', {r'a\"': '1'}) + ok(r'"a\\\\\""=>"1"', {r'a\\"': '1'}) + + def ko(s): + self.assertRaises(psycopg2.InterfaceError, + HstoreAdapter.parse, s, None) + + ko('a') + ko('"a"') + ko(r'"a\\""=>"1"') + ko(r'"a\\\\""=>"1"') + ko('"a=>"1"') + ko('"a"=>"1", "b"=>NUL') + + @skip_if_no_hstore + def test_register_conn(self): + from psycopg2.extras import register_hstore + + register_hstore(self.conn) + cur = self.conn.cursor() + cur.execute("select null::hstore, ''::hstore, 'a => b'::hstore") + t = cur.fetchone() + self.assert_(t[0] is None) + self.assertEqual(t[1], {}) + self.assertEqual(t[2], {'a': 'b'}) + + @skip_if_no_hstore + def test_register_curs(self): + from psycopg2.extras import register_hstore + + cur = self.conn.cursor() + register_hstore(cur) + cur.execute("select null::hstore, ''::hstore, 'a => b'::hstore") + t = cur.fetchone() + self.assert_(t[0] is None) + self.assertEqual(t[1], {}) + self.assertEqual(t[2], {'a': 'b'}) + + @skip_if_no_hstore + def test_register_unicode(self): + from psycopg2.extras import register_hstore + + register_hstore(self.conn, unicode=True) + cur = self.conn.cursor() + cur.execute("select null::hstore, ''::hstore, 'a => b'::hstore") + t = cur.fetchone() + self.assert_(t[0] is None) + self.assertEqual(t[1], {}) + self.assertEqual(t[2], {u'a': u'b'}) + self.assert_(isinstance(t[2].keys()[0], unicode)) + self.assert_(isinstance(t[2].values()[0], unicode)) + + @skip_if_no_hstore + def test_register_globally(self): + from psycopg2.extras import register_hstore, HstoreAdapter + + oids = HstoreAdapter.get_oids(self.conn) + try: + register_hstore(self.conn, globally=True) + conn2 = self.connect() + try: + cur2 = self.conn.cursor() + cur2.execute("select 'a => b'::hstore") + r = cur2.fetchone() + self.assert_(isinstance(r[0], dict)) + finally: + conn2.close() + finally: + psycopg2.extensions.string_types.pop(oids[0][0]) + + # verify the caster is not around anymore + cur = self.conn.cursor() + cur.execute("select 'a => b'::hstore") + r = cur.fetchone() + self.assert_(isinstance(r[0], str)) + + @skip_if_no_hstore + def test_roundtrip(self): + from psycopg2.extras import register_hstore + register_hstore(self.conn) + cur = self.conn.cursor() + + def ok(d): + cur.execute("select %s", (d,)) + d1 = cur.fetchone()[0] + self.assertEqual(len(d), len(d1)) + for k in d: + self.assert_(k in d1, k) + self.assertEqual(d[k], d1[k]) + + ok({}) + ok({'a': 'b', 'c': None}) + + ab = map(chr, range(32, 128)) + ok(dict(zip(ab, ab))) + ok({''.join(ab): ''.join(ab)}) + + self.conn.set_client_encoding('latin1') + if sys.version_info[0] < 3: + ab = map(chr, range(32, 127) + range(160, 255)) + else: + ab = bytes(range(32, 127) + range(160, 255)).decode('latin1') + + ok({''.join(ab): ''.join(ab)}) + ok(dict(zip(ab, ab))) + + @skip_if_no_hstore + def test_roundtrip_unicode(self): + from psycopg2.extras import register_hstore + register_hstore(self.conn, unicode=True) + cur = self.conn.cursor() + + def ok(d): + cur.execute("select %s", (d,)) + d1 = cur.fetchone()[0] + self.assertEqual(len(d), len(d1)) + for k, v in d1.iteritems(): + self.assert_(k in d, k) + self.assertEqual(d[k], v) + self.assert_(isinstance(k, unicode)) + self.assert_(v is None or isinstance(v, unicode)) + + ok({}) + ok({'a': 'b', 'c': None, 'd': u'\u20ac', u'\u2603': 'e'}) + + ab = map(unichr, range(1, 1024)) + ok({u''.join(ab): u''.join(ab)}) + ok(dict(zip(ab, ab))) + + @skip_if_no_hstore + def test_oid(self): + cur = self.conn.cursor() + cur.execute("select 'hstore'::regtype::oid") + oid = cur.fetchone()[0] + + # Note: None as conn_or_cursor is just for testing: not public + # interface and it may break in future. + from psycopg2.extras import register_hstore + register_hstore(None, globally=True, oid=oid) + try: + cur.execute("select null::hstore, ''::hstore, 'a => b'::hstore") + t = cur.fetchone() + self.assert_(t[0] is None) + self.assertEqual(t[1], {}) + self.assertEqual(t[2], {'a': 'b'}) + + finally: + psycopg2.extensions.string_types.pop(oid) + + @skip_if_no_hstore + @skip_before_postgres(8, 3) + def test_roundtrip_array(self): + from psycopg2.extras import register_hstore + register_hstore(self.conn) + + ds = [] + ds.append({}) + ds.append({'a': 'b', 'c': None}) + + ab = map(chr, range(32, 128)) + ds.append(dict(zip(ab, ab))) + ds.append({''.join(ab): ''.join(ab)}) + + self.conn.set_client_encoding('latin1') + if sys.version_info[0] < 3: + ab = map(chr, range(32, 127) + range(160, 255)) + else: + ab = bytes(range(32, 127) + range(160, 255)).decode('latin1') + + ds.append({''.join(ab): ''.join(ab)}) + ds.append(dict(zip(ab, ab))) + + cur = self.conn.cursor() + cur.execute("select %s", (ds,)) + ds1 = cur.fetchone()[0] + self.assertEqual(ds, ds1) + + @skip_if_no_hstore + @skip_before_postgres(8, 3) + def test_array_cast(self): + from psycopg2.extras import register_hstore + register_hstore(self.conn) + cur = self.conn.cursor() + cur.execute("select array['a=>1'::hstore, 'b=>2'::hstore];") + a = cur.fetchone()[0] + self.assertEqual(a, [{'a': '1'}, {'b': '2'}]) + + @skip_if_no_hstore + def test_array_cast_oid(self): + cur = self.conn.cursor() + cur.execute("select 'hstore'::regtype::oid, 'hstore[]'::regtype::oid") + oid, aoid = cur.fetchone() + + from psycopg2.extras import register_hstore + register_hstore(None, globally=True, oid=oid, array_oid=aoid) + try: + cur.execute("select null::hstore, ''::hstore, 'a => b'::hstore, '{a=>b}'::hstore[]") + t = cur.fetchone() + self.assert_(t[0] is None) + self.assertEqual(t[1], {}) + self.assertEqual(t[2], {'a': 'b'}) + self.assertEqual(t[3], [{'a': 'b'}]) + + finally: + psycopg2.extensions.string_types.pop(oid) + psycopg2.extensions.string_types.pop(aoid) + + @skip_if_no_hstore + def test_non_dbapi_connection(self): + from psycopg2.extras import RealDictConnection + from psycopg2.extras import register_hstore + + conn = self.connect(connection_factory=RealDictConnection) + try: + register_hstore(conn) + curs = conn.cursor() + curs.execute("select ''::hstore as x") + self.assertEqual(curs.fetchone()['x'], {}) + finally: + conn.close() + + conn = self.connect(connection_factory=RealDictConnection) + try: + curs = conn.cursor() + register_hstore(curs) + curs.execute("select ''::hstore as x") + self.assertEqual(curs.fetchone()['x'], {}) + finally: + conn.close() + + +def skip_if_no_composite(f): + @wraps(f) + def skip_if_no_composite_(self): + if self.conn.server_version < 80000: + return self.skipTest( + "server version %s doesn't support composite types" + % self.conn.server_version) + + return f(self) + + return skip_if_no_composite_ + +class AdaptTypeTestCase(ConnectingTestCase): + @skip_if_no_composite + def test_none_in_record(self): + curs = self.conn.cursor() + s = curs.mogrify("SELECT %s;", [(42, None)]) + self.assertEqual(b("SELECT (42, NULL);"), s) + curs.execute("SELECT %s;", [(42, None)]) + d = curs.fetchone()[0] + self.assertEqual("(42,)", d) + + def test_none_fast_path(self): + # the None adapter is not actually invoked in regular adaptation + ext = psycopg2.extensions + + class WonkyAdapter(object): + def __init__(self, obj): pass + def getquoted(self): return "NOPE!" + + curs = self.conn.cursor() + + orig_adapter = ext.adapters[type(None), ext.ISQLQuote] + try: + ext.register_adapter(type(None), WonkyAdapter) + self.assertEqual(ext.adapt(None).getquoted(), "NOPE!") + + s = curs.mogrify("SELECT %s;", (None,)) + self.assertEqual(b("SELECT NULL;"), s) + + finally: + ext.register_adapter(type(None), orig_adapter) + + def test_tokenization(self): + from psycopg2.extras import CompositeCaster + def ok(s, v): + self.assertEqual(CompositeCaster.tokenize(s), v) + + ok("(,)", [None, None]) + ok('(,"")', [None, '']) + ok('(hello,,10.234,2010-11-11)', ['hello', None, '10.234', '2010-11-11']) + ok('(10,"""")', ['10', '"']) + ok('(10,",")', ['10', ',']) + ok(r'(10,"\\")', ['10', '\\']) + ok(r'''(10,"\\',""")''', ['10', '''\\',"''']) + ok('(10,"(20,""(30,40)"")")', ['10', '(20,"(30,40)")']) + ok('(10,"(20,""(30,""""(40,50)"""")"")")', ['10', '(20,"(30,""(40,50)"")")']) + ok('(,"(,""(a\nb\tc)"")")', [None, '(,"(a\nb\tc)")']) + ok('(\x01,\x02,\x03,\x04,\x05,\x06,\x07,\x08,"\t","\n","\x0b",' + '"\x0c","\r",\x0e,\x0f,\x10,\x11,\x12,\x13,\x14,\x15,\x16,' + '\x17,\x18,\x19,\x1a,\x1b,\x1c,\x1d,\x1e,\x1f," ",!,"""",#,' + '$,%,&,\',"(",")",*,+,",",-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,' + '@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,"\\\\",],' + '^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},' + '~,\x7f)', + map(chr, range(1, 128))) + ok('(,"\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' + '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !' + '""#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]' + '^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f")', + [None, ''.join(map(chr, range(1, 128)))]) + + @skip_if_no_composite + def test_cast_composite(self): + oid = self._create_type("type_isd", + [('anint', 'integer'), ('astring', 'text'), ('adate', 'date')]) + + t = psycopg2.extras.register_composite("type_isd", self.conn) + self.assertEqual(t.name, 'type_isd') + self.assertEqual(t.schema, 'public') + self.assertEqual(t.oid, oid) + self.assert_(issubclass(t.type, tuple)) + self.assertEqual(t.attnames, ['anint', 'astring', 'adate']) + self.assertEqual(t.atttypes, [23,25,1082]) + + curs = self.conn.cursor() + r = (10, 'hello', date(2011,1,2)) + curs.execute("select %s::type_isd;", (r,)) + v = curs.fetchone()[0] + self.assert_(isinstance(v, t.type)) + self.assertEqual(v[0], 10) + self.assertEqual(v[1], "hello") + self.assertEqual(v[2], date(2011,1,2)) + + try: + from collections import namedtuple + except ImportError: + pass + else: + self.assert_(t.type is not tuple) + self.assertEqual(v.anint, 10) + self.assertEqual(v.astring, "hello") + self.assertEqual(v.adate, date(2011,1,2)) + + @skip_if_no_composite + def test_empty_string(self): + # issue #141 + self._create_type("type_ss", [('s1', 'text'), ('s2', 'text')]) + curs = self.conn.cursor() + psycopg2.extras.register_composite("type_ss", curs) + + def ok(t): + curs.execute("select %s::type_ss", (t,)) + rv = curs.fetchone()[0] + self.assertEqual(t, rv) + + ok(('a', 'b')) + ok(('a', '')) + ok(('', 'b')) + ok(('a', None)) + ok((None, 'b')) + ok(('', '')) + ok((None, None)) + + @skip_if_no_composite + def test_cast_nested(self): + self._create_type("type_is", + [("anint", "integer"), ("astring", "text")]) + self._create_type("type_r_dt", + [("adate", "date"), ("apair", "type_is")]) + self._create_type("type_r_ft", + [("afloat", "float8"), ("anotherpair", "type_r_dt")]) + + psycopg2.extras.register_composite("type_is", self.conn) + psycopg2.extras.register_composite("type_r_dt", self.conn) + psycopg2.extras.register_composite("type_r_ft", self.conn) + + curs = self.conn.cursor() + r = (0.25, (date(2011,1,2), (42, "hello"))) + curs.execute("select %s::type_r_ft;", (r,)) + v = curs.fetchone()[0] + + self.assertEqual(r, v) + + try: + from collections import namedtuple + except ImportError: + pass + else: + self.assertEqual(v.anotherpair.apair.astring, "hello") + + @skip_if_no_composite + def test_register_on_cursor(self): + self._create_type("type_ii", [("a", "integer"), ("b", "integer")]) + + curs1 = self.conn.cursor() + curs2 = self.conn.cursor() + psycopg2.extras.register_composite("type_ii", curs1) + curs1.execute("select (1,2)::type_ii") + self.assertEqual(curs1.fetchone()[0], (1,2)) + curs2.execute("select (1,2)::type_ii") + self.assertEqual(curs2.fetchone()[0], "(1,2)") + + @skip_if_no_composite + def test_register_on_connection(self): + self._create_type("type_ii", [("a", "integer"), ("b", "integer")]) + + conn1 = self.connect() + conn2 = self.connect() + try: + psycopg2.extras.register_composite("type_ii", conn1) + curs1 = conn1.cursor() + curs2 = conn2.cursor() + curs1.execute("select (1,2)::type_ii") + self.assertEqual(curs1.fetchone()[0], (1,2)) + curs2.execute("select (1,2)::type_ii") + self.assertEqual(curs2.fetchone()[0], "(1,2)") + finally: + conn1.close() + conn2.close() + + @skip_if_no_composite + def test_register_globally(self): + self._create_type("type_ii", [("a", "integer"), ("b", "integer")]) + + conn1 = self.connect() + conn2 = self.connect() + try: + t = psycopg2.extras.register_composite("type_ii", conn1, globally=True) + try: + curs1 = conn1.cursor() + curs2 = conn2.cursor() + curs1.execute("select (1,2)::type_ii") + self.assertEqual(curs1.fetchone()[0], (1,2)) + curs2.execute("select (1,2)::type_ii") + self.assertEqual(curs2.fetchone()[0], (1,2)) + finally: + # drop the registered typecasters to help the refcounting + # script to return precise values. + del psycopg2.extensions.string_types[t.typecaster.values[0]] + if t.array_typecaster: + del psycopg2.extensions.string_types[ + t.array_typecaster.values[0]] + + finally: + conn1.close() + conn2.close() + + @skip_if_no_composite + def test_composite_namespace(self): + curs = self.conn.cursor() + curs.execute(""" + select nspname from pg_namespace + where nspname = 'typens'; + """) + if not curs.fetchone(): + curs.execute("create schema typens;") + self.conn.commit() + + self._create_type("typens.typens_ii", + [("a", "integer"), ("b", "integer")]) + t = psycopg2.extras.register_composite( + "typens.typens_ii", self.conn) + self.assertEqual(t.schema, 'typens') + curs.execute("select (4,8)::typens.typens_ii") + self.assertEqual(curs.fetchone()[0], (4,8)) + + @skip_if_no_composite + @skip_before_postgres(8, 4) + def test_composite_array(self): + oid = self._create_type("type_isd", + [('anint', 'integer'), ('astring', 'text'), ('adate', 'date')]) + + t = psycopg2.extras.register_composite("type_isd", self.conn) + + curs = self.conn.cursor() + r1 = (10, 'hello', date(2011,1,2)) + r2 = (20, 'world', date(2011,1,3)) + curs.execute("select %s::type_isd[];", ([r1, r2],)) + v = curs.fetchone()[0] + self.assertEqual(len(v), 2) + self.assert_(isinstance(v[0], t.type)) + self.assertEqual(v[0][0], 10) + self.assertEqual(v[0][1], "hello") + self.assertEqual(v[0][2], date(2011,1,2)) + self.assert_(isinstance(v[1], t.type)) + self.assertEqual(v[1][0], 20) + self.assertEqual(v[1][1], "world") + self.assertEqual(v[1][2], date(2011,1,3)) + + @skip_if_no_composite + def test_wrong_schema(self): + oid = self._create_type("type_ii", [("a", "integer"), ("b", "integer")]) + from psycopg2.extras import CompositeCaster + c = CompositeCaster('type_ii', oid, [('a', 23), ('b', 23), ('c', 23)]) + curs = self.conn.cursor() + psycopg2.extensions.register_type(c.typecaster, curs) + curs.execute("select (1,2)::type_ii") + self.assertRaises(psycopg2.DataError, curs.fetchone) + + @skip_if_no_composite + @skip_before_postgres(8, 4) + def test_from_tables(self): + curs = self.conn.cursor() + curs.execute("""create table ctest1 ( + id integer primary key, + temp int, + label varchar + );""") + + curs.execute("""alter table ctest1 drop temp;""") + + curs.execute("""create table ctest2 ( + id serial primary key, + label varchar, + test_id integer references ctest1(id) + );""") + + curs.execute("""insert into ctest1 (id, label) values + (1, 'test1'), + (2, 'test2');""") + curs.execute("""insert into ctest2 (label, test_id) values + ('testa', 1), + ('testb', 1), + ('testc', 2), + ('testd', 2);""") + + psycopg2.extras.register_composite("ctest1", curs) + psycopg2.extras.register_composite("ctest2", curs) + + curs.execute(""" + select ctest1, array_agg(ctest2) as test2s + from ( + select ctest1, ctest2 + from ctest1 inner join ctest2 on ctest1.id = ctest2.test_id + order by ctest1.id, ctest2.label + ) x group by ctest1;""") + + r = curs.fetchone() + self.assertEqual(r[0], (1, 'test1')) + self.assertEqual(r[1], [(1, 'testa', 1), (2, 'testb', 1)]) + r = curs.fetchone() + self.assertEqual(r[0], (2, 'test2')) + self.assertEqual(r[1], [(3, 'testc', 2), (4, 'testd', 2)]) + + @skip_if_no_composite + def test_non_dbapi_connection(self): + from psycopg2.extras import RealDictConnection + from psycopg2.extras import register_composite + self._create_type("type_ii", [("a", "integer"), ("b", "integer")]) + + conn = self.connect(connection_factory=RealDictConnection) + try: + register_composite('type_ii', conn) + curs = conn.cursor() + curs.execute("select '(1,2)'::type_ii as x") + self.assertEqual(curs.fetchone()['x'], (1,2)) + finally: + conn.close() + + conn = self.connect(connection_factory=RealDictConnection) + try: + curs = conn.cursor() + register_composite('type_ii', conn) + curs.execute("select '(1,2)'::type_ii as x") + self.assertEqual(curs.fetchone()['x'], (1,2)) + finally: + conn.close() + + @skip_if_no_composite + def test_subclass(self): + oid = self._create_type("type_isd", + [('anint', 'integer'), ('astring', 'text'), ('adate', 'date')]) + + from psycopg2.extras import register_composite, CompositeCaster + + class DictComposite(CompositeCaster): + def make(self, values): + return dict(zip(self.attnames, values)) + + t = register_composite('type_isd', self.conn, factory=DictComposite) + + self.assertEqual(t.name, 'type_isd') + self.assertEqual(t.oid, oid) + + curs = self.conn.cursor() + r = (10, 'hello', date(2011,1,2)) + curs.execute("select %s::type_isd;", (r,)) + v = curs.fetchone()[0] + self.assert_(isinstance(v, dict)) + self.assertEqual(v['anint'], 10) + self.assertEqual(v['astring'], "hello") + self.assertEqual(v['adate'], date(2011,1,2)) + + def _create_type(self, name, fields): + curs = self.conn.cursor() + try: + curs.execute("drop type %s cascade;" % name) + except psycopg2.ProgrammingError: + self.conn.rollback() + + curs.execute("create type %s as (%s);" % (name, + ", ".join(["%s %s" % p for p in fields]))) + if '.' in name: + schema, name = name.split('.') + else: + schema = 'public' + + curs.execute("""\ + SELECT t.oid + FROM pg_type t JOIN pg_namespace ns ON typnamespace = ns.oid + WHERE typname = %s and nspname = %s; + """, (name, schema)) + oid = curs.fetchone()[0] + self.conn.commit() + return oid + + +def skip_if_json_module(f): + """Skip a test if a Python json module *is* available""" + @wraps(f) + def skip_if_json_module_(self): + if psycopg2.extras.json is not None: + return self.skipTest("json module is available") + + return f(self) + + return skip_if_json_module_ + +def skip_if_no_json_module(f): + """Skip a test if no Python json module is available""" + @wraps(f) + def skip_if_no_json_module_(self): + if psycopg2.extras.json is None: + return self.skipTest("json module not available") + + return f(self) + + return skip_if_no_json_module_ + +def skip_if_no_json_type(f): + """Skip a test if PostgreSQL json type is not available""" + @wraps(f) + def skip_if_no_json_type_(self): + curs = self.conn.cursor() + curs.execute("select oid from pg_type where typname = 'json'") + if not curs.fetchone(): + return self.skipTest("json not available in test database") + + return f(self) + + return skip_if_no_json_type_ + +class JsonTestCase(ConnectingTestCase): + @skip_if_json_module + def test_module_not_available(self): + from psycopg2.extras import Json + self.assertRaises(ImportError, Json(None).getquoted) + + @skip_if_json_module + def test_customizable_with_module_not_available(self): + from psycopg2.extras import Json + class MyJson(Json): + def dumps(self, obj): + assert obj is None + return "hi" + + self.assertEqual(MyJson(None).getquoted(), "'hi'") + + @skip_if_no_json_module + def test_adapt(self): + from psycopg2.extras import json, Json + + objs = [None, "te'xt", 123, 123.45, + u'\xe0\u20ac', ['a', 100], {'a': 100} ] + + curs = self.conn.cursor() + for obj in enumerate(objs): + self.assertEqual(curs.mogrify("%s", (Json(obj),)), + psycopg2.extensions.QuotedString(json.dumps(obj)).getquoted()) + + @skip_if_no_json_module + def test_adapt_dumps(self): + from psycopg2.extras import json, Json + + class DecimalEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + + curs = self.conn.cursor() + obj = Decimal('123.45') + dumps = lambda obj: json.dumps(obj, cls=DecimalEncoder) + self.assertEqual(curs.mogrify("%s", (Json(obj, dumps=dumps),)), + b("'123.45'")) + + @skip_if_no_json_module + def test_adapt_subclass(self): + from psycopg2.extras import json, Json + + class DecimalEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + + class MyJson(Json): + def dumps(self, obj): + return json.dumps(obj, cls=DecimalEncoder) + + curs = self.conn.cursor() + obj = Decimal('123.45') + self.assertEqual(curs.mogrify("%s", (MyJson(obj),)), + b("'123.45'")) + + @skip_if_no_json_module + def test_register_on_dict(self): + from psycopg2.extras import Json + psycopg2.extensions.register_adapter(dict, Json) + + try: + curs = self.conn.cursor() + obj = {'a': 123} + self.assertEqual(curs.mogrify("%s", (obj,)), + b("""'{"a": 123}'""")) + finally: + del psycopg2.extensions.adapters[dict, psycopg2.extensions.ISQLQuote] + + + def test_type_not_available(self): + curs = self.conn.cursor() + curs.execute("select oid from pg_type where typname = 'json'") + if curs.fetchone(): + return self.skipTest("json available in test database") + + self.assertRaises(psycopg2.ProgrammingError, + psycopg2.extras.register_json, self.conn) + + @skip_if_no_json_module + @skip_before_postgres(9, 2) + def test_default_cast(self): + curs = self.conn.cursor() + + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None}) + + curs.execute("""select array['{"a": 100.0, "b": null}']::json[]""") + self.assertEqual(curs.fetchone()[0], [{'a': 100.0, 'b': None}]) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_register_on_connection(self): + psycopg2.extras.register_json(self.conn) + curs = self.conn.cursor() + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None}) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_register_on_cursor(self): + curs = self.conn.cursor() + psycopg2.extras.register_json(curs) + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None}) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_register_globally(self): + old = psycopg2.extensions.string_types.get(114) + olda = psycopg2.extensions.string_types.get(199) + try: + new, newa = psycopg2.extras.register_json(self.conn, globally=True) + curs = self.conn.cursor() + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None}) + finally: + psycopg2.extensions.string_types.pop(new.values[0]) + psycopg2.extensions.string_types.pop(newa.values[0]) + if old: + psycopg2.extensions.register_type(old) + if olda: + psycopg2.extensions.register_type(olda) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_loads(self): + json = psycopg2.extras.json + loads = lambda x: json.loads(x, parse_float=Decimal) + psycopg2.extras.register_json(self.conn, loads=loads) + curs = self.conn.cursor() + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + data = curs.fetchone()[0] + self.assert_(isinstance(data['a'], Decimal)) + self.assertEqual(data['a'], Decimal('100.0')) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_no_conn_curs(self): + from psycopg2._json import _get_json_oids + oid, array_oid = _get_json_oids(self.conn) + + old = psycopg2.extensions.string_types.get(114) + olda = psycopg2.extensions.string_types.get(199) + loads = lambda x: psycopg2.extras.json.loads(x, parse_float=Decimal) + try: + new, newa = psycopg2.extras.register_json( + loads=loads, oid=oid, array_oid=array_oid) + curs = self.conn.cursor() + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + data = curs.fetchone()[0] + self.assert_(isinstance(data['a'], Decimal)) + self.assertEqual(data['a'], Decimal('100.0')) + finally: + psycopg2.extensions.string_types.pop(new.values[0]) + psycopg2.extensions.string_types.pop(newa.values[0]) + if old: + psycopg2.extensions.register_type(old) + if olda: + psycopg2.extensions.register_type(olda) + + @skip_if_no_json_module + @skip_before_postgres(9, 2) + def test_register_default(self): + curs = self.conn.cursor() + + loads = lambda x: psycopg2.extras.json.loads(x, parse_float=Decimal) + psycopg2.extras.register_default_json(curs, loads=loads) + + curs.execute("""select '{"a": 100.0, "b": null}'::json""") + data = curs.fetchone()[0] + self.assert_(isinstance(data['a'], Decimal)) + self.assertEqual(data['a'], Decimal('100.0')) + + curs.execute("""select array['{"a": 100.0, "b": null}']::json[]""") + data = curs.fetchone()[0] + self.assert_(isinstance(data[0]['a'], Decimal)) + self.assertEqual(data[0]['a'], Decimal('100.0')) + + @skip_if_no_json_module + @skip_if_no_json_type + def test_null(self): + psycopg2.extras.register_json(self.conn) + curs = self.conn.cursor() + curs.execute("""select NULL::json""") + self.assertEqual(curs.fetchone()[0], None) + curs.execute("""select NULL::json[]""") + self.assertEqual(curs.fetchone()[0], None) + + @skip_if_no_json_module + def test_no_array_oid(self): + curs = self.conn.cursor() + t1, t2 = psycopg2.extras.register_json(curs, oid=25) + self.assertEqual(t1.values[0], 25) + self.assertEqual(t2, None) + + curs.execute("""select '{"a": 100.0, "b": null}'::text""") + data = curs.fetchone()[0] + self.assertEqual(data['a'], 100) + self.assertEqual(data['b'], None) + + +class RangeTestCase(unittest.TestCase): + def test_noparam(self): + from psycopg2.extras import Range + r = Range() + + self.assert_(not r.isempty) + self.assertEqual(r.lower, None) + self.assertEqual(r.upper, None) + self.assert_(r.lower_inf) + self.assert_(r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + def test_empty(self): + from psycopg2.extras import Range + r = Range(empty=True) + + self.assert_(r.isempty) + self.assertEqual(r.lower, None) + self.assertEqual(r.upper, None) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + def test_nobounds(self): + from psycopg2.extras import Range + r = Range(10, 20) + self.assertEqual(r.lower, 10) + self.assertEqual(r.upper, 20) + self.assert_(not r.isempty) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(r.lower_inc) + self.assert_(not r.upper_inc) + + def test_bounds(self): + from psycopg2.extras import Range + for bounds, lower_inc, upper_inc in [ + ('[)', True, False), + ('(]', False, True), + ('()', False, False), + ('[]', True, True),]: + r = Range(10, 20, bounds) + self.assertEqual(r.lower, 10) + self.assertEqual(r.upper, 20) + self.assert_(not r.isempty) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assertEqual(r.lower_inc, lower_inc) + self.assertEqual(r.upper_inc, upper_inc) + + def test_keywords(self): + from psycopg2.extras import Range + r = Range(upper=20) + self.assertEqual(r.lower, None) + self.assertEqual(r.upper, 20) + self.assert_(not r.isempty) + self.assert_(r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + r = Range(lower=10, bounds='(]') + self.assertEqual(r.lower, 10) + self.assertEqual(r.upper, None) + self.assert_(not r.isempty) + self.assert_(not r.lower_inf) + self.assert_(r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + def test_bad_bounds(self): + from psycopg2.extras import Range + self.assertRaises(ValueError, Range, bounds='(') + self.assertRaises(ValueError, Range, bounds='[}') + + def test_in(self): + from psycopg2.extras import Range + r = Range(empty=True) + self.assert_(10 not in r) + + r = Range() + self.assert_(10 in r) + + r = Range(lower=10, bounds='[)') + self.assert_(9 not in r) + self.assert_(10 in r) + self.assert_(11 in r) + + r = Range(lower=10, bounds='()') + self.assert_(9 not in r) + self.assert_(10 not in r) + self.assert_(11 in r) + + r = Range(upper=20, bounds='()') + self.assert_(19 in r) + self.assert_(20 not in r) + self.assert_(21 not in r) + + r = Range(upper=20, bounds='(]') + self.assert_(19 in r) + self.assert_(20 in r) + self.assert_(21 not in r) + + r = Range(10, 20) + self.assert_(9 not in r) + self.assert_(10 in r) + self.assert_(11 in r) + self.assert_(19 in r) + self.assert_(20 not in r) + self.assert_(21 not in r) + + r = Range(10, 20, '(]') + self.assert_(9 not in r) + self.assert_(10 not in r) + self.assert_(11 in r) + self.assert_(19 in r) + self.assert_(20 in r) + self.assert_(21 not in r) + + r = Range(20, 10) + self.assert_(9 not in r) + self.assert_(10 not in r) + self.assert_(11 not in r) + self.assert_(19 not in r) + self.assert_(20 not in r) + self.assert_(21 not in r) + + def test_nonzero(self): + from psycopg2.extras import Range + self.assert_(Range()) + self.assert_(Range(10, 20)) + self.assert_(not Range(empty=True)) + + def test_eq_hash(self): + from psycopg2.extras import Range + def assert_equal(r1, r2): + self.assert_(r1 == r2) + self.assert_(hash(r1) == hash(r2)) + + assert_equal(Range(empty=True), Range(empty=True)) + assert_equal(Range(), Range()) + assert_equal(Range(10, None), Range(10, None)) + assert_equal(Range(10, 20), Range(10, 20)) + assert_equal(Range(10, 20), Range(10, 20, '[)')) + assert_equal(Range(10, 20, '[]'), Range(10, 20, '[]')) + + def assert_not_equal(r1, r2): + self.assert_(r1 != r2) + self.assert_(hash(r1) != hash(r2)) + + assert_not_equal(Range(10, 20), Range(10, 21)) + assert_not_equal(Range(10, 20), Range(11, 20)) + assert_not_equal(Range(10, 20, '[)'), Range(10, 20, '[]')) + + def test_eq_wrong_type(self): + from psycopg2.extras import Range + self.assertNotEqual(Range(10, 20), ()) + + def test_eq_subclass(self): + from psycopg2.extras import Range, NumericRange + + class IntRange(NumericRange): pass + class PositiveIntRange(IntRange): pass + + self.assertEqual(Range(10, 20), IntRange(10, 20)) + self.assertEqual(PositiveIntRange(10, 20), IntRange(10, 20)) + + def test_not_ordered(self): + from psycopg2.extras import Range + self.assertRaises(TypeError, lambda: Range(empty=True) < Range(0,4)) + self.assertRaises(TypeError, lambda: Range(1,2) > Range(0,4)) + self.assertRaises(TypeError, lambda: Range(1,2) <= Range()) + self.assertRaises(TypeError, lambda: Range(1,2) >= Range()) + + +def skip_if_no_range(f): + @wraps(f) + def skip_if_no_range_(self): + if self.conn.server_version < 90200: + return self.skipTest( + "server version %s doesn't support range types" + % self.conn.server_version) + + return f(self) + + return skip_if_no_range_ + + +class RangeCasterTestCase(ConnectingTestCase): + + builtin_ranges = ('int4range', 'int8range', 'numrange', + 'daterange', 'tsrange', 'tstzrange') + + def test_cast_null(self): + cur = self.conn.cursor() + for type in self.builtin_ranges: + cur.execute("select NULL::%s" % type) + r = cur.fetchone()[0] + self.assertEqual(r, None) + + def test_cast_empty(self): + from psycopg2.extras import Range + cur = self.conn.cursor() + for type in self.builtin_ranges: + cur.execute("select 'empty'::%s" % type) + r = cur.fetchone()[0] + self.assert_(isinstance(r, Range), type) + self.assert_(r.isempty) + + def test_cast_inf(self): + from psycopg2.extras import Range + cur = self.conn.cursor() + for type in self.builtin_ranges: + cur.execute("select '(,)'::%s" % type) + r = cur.fetchone()[0] + self.assert_(isinstance(r, Range), type) + self.assert_(not r.isempty) + self.assert_(r.lower_inf) + self.assert_(r.upper_inf) + + def test_cast_numbers(self): + from psycopg2.extras import NumericRange + cur = self.conn.cursor() + for type in ('int4range', 'int8range'): + cur.execute("select '(10,20)'::%s" % type) + r = cur.fetchone()[0] + self.assert_(isinstance(r, NumericRange)) + self.assert_(not r.isempty) + self.assertEqual(r.lower, 11) + self.assertEqual(r.upper, 20) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(r.lower_inc) + self.assert_(not r.upper_inc) + + cur.execute("select '(10.2,20.6)'::numrange") + r = cur.fetchone()[0] + self.assert_(isinstance(r, NumericRange)) + self.assert_(not r.isempty) + self.assertEqual(r.lower, Decimal('10.2')) + self.assertEqual(r.upper, Decimal('20.6')) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + def test_cast_date(self): + from psycopg2.extras import DateRange + cur = self.conn.cursor() + cur.execute("select '(2000-01-01,2012-12-31)'::daterange") + r = cur.fetchone()[0] + self.assert_(isinstance(r, DateRange)) + self.assert_(not r.isempty) + self.assertEqual(r.lower, date(2000,1,2)) + self.assertEqual(r.upper, date(2012,12,31)) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(r.lower_inc) + self.assert_(not r.upper_inc) + + def test_cast_timestamp(self): + from psycopg2.extras import DateTimeRange + cur = self.conn.cursor() + ts1 = datetime(2000,1,1) + ts2 = datetime(2000,12,31,23,59,59,999) + cur.execute("select tsrange(%s, %s, '()')", (ts1, ts2)) + r = cur.fetchone()[0] + self.assert_(isinstance(r, DateTimeRange)) + self.assert_(not r.isempty) + self.assertEqual(r.lower, ts1) + self.assertEqual(r.upper, ts2) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(not r.lower_inc) + self.assert_(not r.upper_inc) + + def test_cast_timestamptz(self): + from psycopg2.extras import DateTimeTZRange + from psycopg2.tz import FixedOffsetTimezone + cur = self.conn.cursor() + ts1 = datetime(2000,1,1, tzinfo=FixedOffsetTimezone(600)) + ts2 = datetime(2000,12,31,23,59,59,999, tzinfo=FixedOffsetTimezone(600)) + cur.execute("select tstzrange(%s, %s, '[]')", (ts1, ts2)) + r = cur.fetchone()[0] + self.assert_(isinstance(r, DateTimeTZRange)) + self.assert_(not r.isempty) + self.assertEqual(r.lower, ts1) + self.assertEqual(r.upper, ts2) + self.assert_(not r.lower_inf) + self.assert_(not r.upper_inf) + self.assert_(r.lower_inc) + self.assert_(r.upper_inc) + + def test_adapt_number_range(self): + from psycopg2.extras import NumericRange + cur = self.conn.cursor() + + r = NumericRange(empty=True) + cur.execute("select %s::int4range", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange)) + self.assert_(r1.isempty) + + r = NumericRange(10, 20) + cur.execute("select %s::int8range", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange)) + self.assertEqual(r1.lower, 10) + self.assertEqual(r1.upper, 20) + self.assert_(r1.lower_inc) + self.assert_(not r1.upper_inc) + + r = NumericRange(Decimal('10.2'), Decimal('20.5'), '(]') + cur.execute("select %s::numrange", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange)) + self.assertEqual(r1.lower, Decimal('10.2')) + self.assertEqual(r1.upper, Decimal('20.5')) + self.assert_(not r1.lower_inc) + self.assert_(r1.upper_inc) + + def test_adapt_numeric_range(self): + from psycopg2.extras import NumericRange + cur = self.conn.cursor() + + r = NumericRange(empty=True) + cur.execute("select %s::int4range", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange), r1) + self.assert_(r1.isempty) + + r = NumericRange(10, 20) + cur.execute("select %s::int8range", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange)) + self.assertEqual(r1.lower, 10) + self.assertEqual(r1.upper, 20) + self.assert_(r1.lower_inc) + self.assert_(not r1.upper_inc) + + r = NumericRange(Decimal('10.2'), Decimal('20.5'), '(]') + cur.execute("select %s::numrange", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, NumericRange)) + self.assertEqual(r1.lower, Decimal('10.2')) + self.assertEqual(r1.upper, Decimal('20.5')) + self.assert_(not r1.lower_inc) + self.assert_(r1.upper_inc) + + def test_adapt_date_range(self): + from psycopg2.extras import DateRange, DateTimeRange, DateTimeTZRange + from psycopg2.tz import FixedOffsetTimezone + cur = self.conn.cursor() + + d1 = date(2012, 01, 01) + d2 = date(2012, 12, 31) + r = DateRange(d1, d2) + cur.execute("select %s", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, DateRange)) + self.assertEqual(r1.lower, d1) + self.assertEqual(r1.upper, d2) + self.assert_(r1.lower_inc) + self.assert_(not r1.upper_inc) + + r = DateTimeRange(empty=True) + cur.execute("select %s", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, DateTimeRange)) + self.assert_(r1.isempty) + + ts1 = datetime(2000,1,1, tzinfo=FixedOffsetTimezone(600)) + ts2 = datetime(2000,12,31,23,59,59,999, tzinfo=FixedOffsetTimezone(600)) + r = DateTimeTZRange(ts1, ts2, '(]') + cur.execute("select %s", (r,)) + r1 = cur.fetchone()[0] + self.assert_(isinstance(r1, DateTimeTZRange)) + self.assertEqual(r1.lower, ts1) + self.assertEqual(r1.upper, ts2) + self.assert_(not r1.lower_inc) + self.assert_(r1.upper_inc) + + def test_register_range_adapter(self): + from psycopg2.extras import Range, register_range + cur = self.conn.cursor() + cur.execute("create type textrange as range (subtype=text)") + rc = register_range('textrange', 'TextRange', cur) + + TextRange = rc.range + self.assert_(issubclass(TextRange, Range)) + self.assertEqual(TextRange.__name__, 'TextRange') + + r = TextRange('a', 'b', '(]') + cur.execute("select %s", (r,)) + r1 = cur.fetchone()[0] + self.assertEqual(r1.lower, 'a') + self.assertEqual(r1.upper, 'b') + self.assert_(not r1.lower_inc) + self.assert_(r1.upper_inc) + + cur.execute("select %s", ([r,r,r],)) + rs = cur.fetchone()[0] + self.assertEqual(len(rs), 3) + for r1 in rs: + self.assertEqual(r1.lower, 'a') + self.assertEqual(r1.upper, 'b') + self.assert_(not r1.lower_inc) + self.assert_(r1.upper_inc) + + def test_range_escaping(self): + from psycopg2.extras import register_range + cur = self.conn.cursor() + cur.execute("create type textrange as range (subtype=text)") + rc = register_range('textrange', 'TextRange', cur) + + TextRange = rc.range + cur.execute(""" + create table rangetest ( + id integer primary key, + range textrange)""") + + bounds = [ '[)', '(]', '()', '[]' ] + ranges = [ TextRange(low, up, bounds[i % 4]) + for i, (low, up) in enumerate(zip( + [None] + map(chr, range(1, 128)), + map(chr, range(1,128)) + [None], + ))] + ranges.append(TextRange()) + ranges.append(TextRange(empty=True)) + + errs = 0 + for i, r in enumerate(ranges): + # not all the ranges make sense: + # fun fact: select ascii('#') < ascii('$'), '#' < '$' + # yelds... t, f! At least in en_GB.UTF-8 collation. + # which seems suggesting a supremacy of the pound on the dollar. + # So some of these ranges will fail to insert. Be prepared but... + try: + cur.execute(""" + savepoint x; + insert into rangetest (id, range) values (%s, %s); + """, (i, r)) + except psycopg2.DataError: + errs += 1 + cur.execute("rollback to savepoint x;") + + # ...not too many errors! in the above collate there are 17 errors: + # assume in other collates we won't find more than 30 + self.assert_(errs < 30, + "too many collate errors. Is the test working?") + + cur.execute("select id, range from rangetest order by id") + for i, r in cur: + self.assertEqual(ranges[i].lower, r.lower) + self.assertEqual(ranges[i].upper, r.upper) + self.assertEqual(ranges[i].lower_inc, r.lower_inc) + self.assertEqual(ranges[i].upper_inc, r.upper_inc) + self.assertEqual(ranges[i].lower_inf, r.lower_inf) + self.assertEqual(ranges[i].upper_inf, r.upper_inf) + + def test_range_not_found(self): + from psycopg2.extras import register_range + cur = self.conn.cursor() + self.assertRaises(psycopg2.ProgrammingError, + register_range, 'nosuchrange', 'FailRange', cur) + + def test_schema_range(self): + cur = self.conn.cursor() + cur.execute("create schema rs") + cur.execute("create type r1 as range (subtype=text)") + cur.execute("create type r2 as range (subtype=text)") + cur.execute("create type rs.r2 as range (subtype=text)") + cur.execute("create type rs.r3 as range (subtype=text)") + cur.execute("savepoint x") + + from psycopg2.extras import register_range + ra1 = register_range('r1', 'r1', cur) + ra2 = register_range('r2', 'r2', cur) + rars2 = register_range('rs.r2', 'r2', cur) + rars3 = register_range('rs.r3', 'r3', cur) + + self.assertNotEqual( + ra2.typecaster.values[0], + rars2.typecaster.values[0]) + + self.assertRaises(psycopg2.ProgrammingError, + register_range, 'r3', 'FailRange', cur) + cur.execute("rollback to savepoint x;") + + self.assertRaises(psycopg2.ProgrammingError, + register_range, 'rs.r1', 'FailRange', cur) + cur.execute("rollback to savepoint x;") + +decorate_all_tests(RangeCasterTestCase, skip_if_no_range) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() + diff --git a/psycopg2/tests/test_with.py b/psycopg2/tests/test_with.py new file mode 100644 index 0000000..d39016c --- /dev/null +++ b/psycopg2/tests/test_with.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python + +# test_ctxman.py - unit test for connection and cursor used as context manager +# +# Copyright (C) 2012 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + + +from __future__ import with_statement + +import psycopg2 +import psycopg2.extensions as ext + +from testutils import unittest, ConnectingTestCase + +class WithTestCase(ConnectingTestCase): + def setUp(self): + ConnectingTestCase.setUp(self) + curs = self.conn.cursor() + try: + curs.execute("delete from test_with") + self.conn.commit() + except psycopg2.ProgrammingError: + # assume table doesn't exist + self.conn.rollback() + curs.execute("create table test_with (id integer primary key)") + self.conn.commit() + + +class WithConnectionTestCase(WithTestCase): + def test_with_ok(self): + with self.conn as conn: + self.assert_(self.conn is conn) + self.assertEqual(conn.status, ext.STATUS_READY) + curs = conn.cursor() + curs.execute("insert into test_with values (1)") + self.assertEqual(conn.status, ext.STATUS_BEGIN) + + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), [(1,)]) + + def test_with_connect_idiom(self): + with self.connect() as conn: + self.assertEqual(conn.status, ext.STATUS_READY) + curs = conn.cursor() + curs.execute("insert into test_with values (2)") + self.assertEqual(conn.status, ext.STATUS_BEGIN) + + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), [(2,)]) + + def test_with_error_db(self): + def f(): + with self.conn as conn: + curs = conn.cursor() + curs.execute("insert into test_with values ('a')") + + self.assertRaises(psycopg2.DataError, f) + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), []) + + def test_with_error_python(self): + def f(): + with self.conn as conn: + curs = conn.cursor() + curs.execute("insert into test_with values (3)") + 1/0 + + self.assertRaises(ZeroDivisionError, f) + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), []) + + def test_with_closed(self): + def f(): + with self.conn: + pass + + self.conn.close() + self.assertRaises(psycopg2.InterfaceError, f) + + def test_subclass_commit(self): + commits = [] + class MyConn(ext.connection): + def commit(self): + commits.append(None) + super(MyConn, self).commit() + + with self.connect(connection_factory=MyConn) as conn: + curs = conn.cursor() + curs.execute("insert into test_with values (10)") + + self.assertEqual(conn.status, ext.STATUS_READY) + self.assert_(commits) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), [(10,)]) + + def test_subclass_rollback(self): + rollbacks = [] + class MyConn(ext.connection): + def rollback(self): + rollbacks.append(None) + super(MyConn, self).rollback() + + try: + with self.connect(connection_factory=MyConn) as conn: + curs = conn.cursor() + curs.execute("insert into test_with values (11)") + 1/0 + except ZeroDivisionError: + pass + else: + self.assert_("exception not raised") + + self.assertEqual(conn.status, ext.STATUS_READY) + self.assert_(rollbacks) + + curs = conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), []) + + +class WithCursorTestCase(WithTestCase): + def test_with_ok(self): + with self.conn as conn: + with conn.cursor() as curs: + curs.execute("insert into test_with values (4)") + self.assert_(not curs.closed) + self.assertEqual(self.conn.status, ext.STATUS_BEGIN) + self.assert_(curs.closed) + + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), [(4,)]) + + def test_with_error(self): + try: + with self.conn as conn: + with conn.cursor() as curs: + curs.execute("insert into test_with values (5)") + 1/0 + except ZeroDivisionError: + pass + + self.assertEqual(self.conn.status, ext.STATUS_READY) + self.assert_(not self.conn.closed) + self.assert_(curs.closed) + + curs = self.conn.cursor() + curs.execute("select * from test_with") + self.assertEqual(curs.fetchall(), []) + + def test_subclass(self): + closes = [] + class MyCurs(ext.cursor): + def close(self): + closes.append(None) + super(MyCurs, self).close() + + with self.conn.cursor(cursor_factory=MyCurs) as curs: + self.assert_(isinstance(curs, MyCurs)) + + self.assert_(curs.closed) + self.assert_(closes) + + +def test_suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == "__main__": + unittest.main() diff --git a/psycopg2/tests/testconfig.py b/psycopg2/tests/testconfig.py new file mode 100644 index 0000000..f83ded8 --- /dev/null +++ b/psycopg2/tests/testconfig.py @@ -0,0 +1,36 @@ +# Configure the test suite from the env variables. + +import os + +dbname = os.environ.get('PSYCOPG2_TESTDB', 'psycopg2_test') +dbhost = os.environ.get('PSYCOPG2_TESTDB_HOST', None) +dbport = os.environ.get('PSYCOPG2_TESTDB_PORT', None) +dbuser = os.environ.get('PSYCOPG2_TESTDB_USER', None) +dbpass = os.environ.get('PSYCOPG2_TESTDB_PASSWORD', None) + +# Check if we want to test psycopg's green path. +green = os.environ.get('PSYCOPG2_TEST_GREEN', None) +if green: + if green == '1': + from psycopg2.extras import wait_select as wait_callback + elif green == 'eventlet': + from eventlet.support.psycopg2_patcher import eventlet_wait_callback \ + as wait_callback + else: + raise ValueError("please set 'PSYCOPG2_TEST_GREEN' to a valid value") + + import psycopg2.extensions + psycopg2.extensions.set_wait_callback(wait_callback) + +# Construct a DSN to connect to the test database: +dsn = 'dbname=%s' % dbname +if dbhost is not None: + dsn += ' host=%s' % dbhost +if dbport is not None: + dsn += ' port=%s' % dbport +if dbuser is not None: + dsn += ' user=%s' % dbuser +if dbpass is not None: + dsn += ' password=%s' % dbpass + + diff --git a/psycopg2/tests/testutils.py b/psycopg2/tests/testutils.py new file mode 100644 index 0000000..708dd22 --- /dev/null +++ b/psycopg2/tests/testutils.py @@ -0,0 +1,331 @@ +# testutils.py - utility module for psycopg2 testing. + +# +# Copyright (C) 2010-2011 Daniele Varrazzo +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + + +# Use unittest2 if available. Otherwise mock a skip facility with warnings. + +import os +import sys +from functools import wraps +from testconfig import dsn + +try: + import unittest2 + unittest = unittest2 +except ImportError: + import unittest + unittest2 = None + +if hasattr(unittest, 'skipIf'): + skip = unittest.skip + skipIf = unittest.skipIf + +else: + import warnings + + def skipIf(cond, msg): + def skipIf_(f): + @wraps(f) + def skipIf__(self): + if cond: + warnings.warn(msg) + return + else: + return f(self) + return skipIf__ + return skipIf_ + + def skip(msg): + return skipIf(True, msg) + + def skipTest(self, msg): + warnings.warn(msg) + return + + unittest.TestCase.skipTest = skipTest + +# Silence warnings caused by the stubborness of the Python unittest maintainers +# http://bugs.python.org/issue9424 +if not hasattr(unittest.TestCase, 'assert_') \ +or unittest.TestCase.assert_ is not unittest.TestCase.assertTrue: + # mavaff... + unittest.TestCase.assert_ = unittest.TestCase.assertTrue + unittest.TestCase.failUnless = unittest.TestCase.assertTrue + unittest.TestCase.assertEquals = unittest.TestCase.assertEqual + unittest.TestCase.failUnlessEqual = unittest.TestCase.assertEqual + + +class ConnectingTestCase(unittest.TestCase): + """A test case providing connections for tests. + + A connection for the test is always available as `self.conn`. Others can be + created with `self.connect()`. All are closed on tearDown. + + Subclasses needing to customize setUp and tearDown should remember to call + the base class implementations. + """ + def setUp(self): + self._conns = [] + + def tearDown(self): + # close the connections used in the test + for conn in self._conns: + if not conn.closed: + conn.close() + + def connect(self, **kwargs): + try: + self._conns + except AttributeError, e: + raise AttributeError( + "%s (did you remember calling ConnectingTestCase.setUp()?)" + % e) + + import psycopg2 + conn = psycopg2.connect(dsn, **kwargs) + self._conns.append(conn) + return conn + + def _get_conn(self): + if not hasattr(self, '_the_conn'): + self._the_conn = self.connect() + + return self._the_conn + + def _set_conn(self, conn): + self._the_conn = conn + + conn = property(_get_conn, _set_conn) + + +def decorate_all_tests(cls, *decorators): + """ + Apply all the *decorators* to all the tests defined in the TestCase *cls*. + """ + for n in dir(cls): + if n.startswith('test'): + for d in decorators: + setattr(cls, n, d(getattr(cls, n))) + + +def skip_if_no_uuid(f): + """Decorator to skip a test if uuid is not supported by Py/PG.""" + @wraps(f) + def skip_if_no_uuid_(self): + try: + import uuid + except ImportError: + return self.skipTest("uuid not available in this Python version") + + try: + cur = self.conn.cursor() + cur.execute("select typname from pg_type where typname = 'uuid'") + has = cur.fetchone() + finally: + self.conn.rollback() + + if has: + return f(self) + else: + return self.skipTest("uuid type not available on the server") + + return skip_if_no_uuid_ + + +def skip_if_tpc_disabled(f): + """Skip a test if the server has tpc support disabled.""" + @wraps(f) + def skip_if_tpc_disabled_(self): + from psycopg2 import ProgrammingError + cnn = self.connect() + cur = cnn.cursor() + try: + cur.execute("SHOW max_prepared_transactions;") + except ProgrammingError: + return self.skipTest( + "server too old: two phase transactions not supported.") + else: + mtp = int(cur.fetchone()[0]) + cnn.close() + + if not mtp: + return self.skipTest( + "server not configured for two phase transactions. " + "set max_prepared_transactions to > 0 to run the test") + return f(self) + + return skip_if_tpc_disabled_ + + +def skip_if_no_namedtuple(f): + @wraps(f) + def skip_if_no_namedtuple_(self): + try: + from collections import namedtuple + except ImportError: + return self.skipTest("collections.namedtuple not available") + else: + return f(self) + + return skip_if_no_namedtuple_ + + +def skip_if_no_iobase(f): + """Skip a test if io.TextIOBase is not available.""" + @wraps(f) + def skip_if_no_iobase_(self): + try: + from io import TextIOBase + except ImportError: + return self.skipTest("io.TextIOBase not found.") + else: + return f(self) + + return skip_if_no_iobase_ + + +def skip_before_postgres(*ver): + """Skip a test on PostgreSQL before a certain version.""" + ver = ver + (0,) * (3 - len(ver)) + def skip_before_postgres_(f): + @wraps(f) + def skip_before_postgres__(self): + if self.conn.server_version < int("%d%02d%02d" % ver): + return self.skipTest("skipped because PostgreSQL %s" + % self.conn.server_version) + else: + return f(self) + + return skip_before_postgres__ + return skip_before_postgres_ + +def skip_after_postgres(*ver): + """Skip a test on PostgreSQL after (including) a certain version.""" + ver = ver + (0,) * (3 - len(ver)) + def skip_after_postgres_(f): + @wraps(f) + def skip_after_postgres__(self): + if self.conn.server_version >= int("%d%02d%02d" % ver): + return self.skipTest("skipped because PostgreSQL %s" + % self.conn.server_version) + else: + return f(self) + + return skip_after_postgres__ + return skip_after_postgres_ + +def skip_before_python(*ver): + """Skip a test on Python before a certain version.""" + def skip_before_python_(f): + @wraps(f) + def skip_before_python__(self): + if sys.version_info[:len(ver)] < ver: + return self.skipTest("skipped because Python %s" + % ".".join(map(str, sys.version_info[:len(ver)]))) + else: + return f(self) + + return skip_before_python__ + return skip_before_python_ + +def skip_from_python(*ver): + """Skip a test on Python after (including) a certain version.""" + def skip_from_python_(f): + @wraps(f) + def skip_from_python__(self): + if sys.version_info[:len(ver)] >= ver: + return self.skipTest("skipped because Python %s" + % ".".join(map(str, sys.version_info[:len(ver)]))) + else: + return f(self) + + return skip_from_python__ + return skip_from_python_ + +def skip_if_no_superuser(f): + """Skip a test if the database user running the test is not a superuser""" + @wraps(f) + def skip_if_no_superuser_(self): + from psycopg2 import ProgrammingError + try: + return f(self) + except ProgrammingError, e: + import psycopg2.errorcodes + if e.pgcode == psycopg2.errorcodes.INSUFFICIENT_PRIVILEGE: + self.skipTest("skipped because not superuser") + else: + raise + + return skip_if_no_superuser_ + +def skip_if_green(reason): + def skip_if_green_(f): + @wraps(f) + def skip_if_green__(self): + from testconfig import green + if green: + return self.skipTest(reason) + else: + return f(self) + + return skip_if_green__ + return skip_if_green_ + +skip_copy_if_green = skip_if_green("copy in async mode currently not supported") + +def skip_if_no_getrefcount(f): + @wraps(f) + def skip_if_no_getrefcount_(self): + if not hasattr(sys, 'getrefcount'): + return self.skipTest('skipped, no sys.getrefcount()') + else: + return f(self) + return skip_if_no_getrefcount_ + +def script_to_py3(script): + """Convert a script to Python3 syntax if required.""" + if sys.version_info[0] < 3: + return script + + import tempfile + f = tempfile.NamedTemporaryFile(suffix=".py", delete=False) + f.write(script.encode()) + f.flush() + filename = f.name + f.close() + + # 2to3 is way too chatty + import logging + logging.basicConfig(filename=os.devnull) + + from lib2to3.main import main + if main("lib2to3.fixes", ['--no-diffs', '-w', '-n', filename]): + raise Exception('py3 conversion failed') + + f2 = open(filename) + try: + return f2.read() + finally: + f2.close() + os.remove(filename) + diff --git a/psycopg2/tz.py b/psycopg2/tz.py new file mode 100644 index 0000000..695a925 --- /dev/null +++ b/psycopg2/tz.py @@ -0,0 +1,135 @@ +"""tzinfo implementations for psycopg2 + +This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors. +""" +# psycopg/tz.py - tzinfo implementation +# +# Copyright (C) 2003-2010 Federico Di Gregorio +# +# psycopg2 is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# In addition, as a special exception, the copyright holders give +# permission to link this program with the OpenSSL library (or with +# modified versions of OpenSSL that use the same license as OpenSSL), +# and distribute linked combinations including the two. +# +# You must obey the GNU Lesser General Public License in all respects for +# all of the code used other than OpenSSL. +# +# psycopg2 is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +# License for more details. + +import datetime +import time + +ZERO = datetime.timedelta(0) + +class FixedOffsetTimezone(datetime.tzinfo): + """Fixed offset in minutes east from UTC. + + This is exactly the implementation__ found in Python 2.3.x documentation, + with a small change to the `!__init__()` method to allow for pickling + and a default name in the form ``sHH:MM`` (``s`` is the sign.). + + The implementation also caches instances. During creation, if a + FixedOffsetTimezone instance has previously been created with the same + offset and name that instance will be returned. This saves memory and + improves comparability. + + .. __: http://docs.python.org/library/datetime.html#datetime-tzinfo + """ + _name = None + _offset = ZERO + + _cache = {} + + def __init__(self, offset=None, name=None): + if offset is not None: + self._offset = datetime.timedelta(minutes = offset) + if name is not None: + self._name = name + + def __new__(cls, offset=None, name=None): + """Return a suitable instance created earlier if it exists + """ + key = (offset, name) + try: + return cls._cache[key] + except KeyError: + tz = super(FixedOffsetTimezone, cls).__new__(cls, offset, name) + cls._cache[key] = tz + return tz + + def __repr__(self): + offset_mins = self._offset.seconds // 60 + self._offset.days * 24 * 60 + return "psycopg2.tz.FixedOffsetTimezone(offset=%r, name=%r)" \ + % (offset_mins, self._name) + + def __getinitargs__(self): + offset_mins = self._offset.seconds // 60 + self._offset.days * 24 * 60 + return (offset_mins, self._name) + + def utcoffset(self, dt): + return self._offset + + def tzname(self, dt): + if self._name is not None: + return self._name + else: + seconds = self._offset.seconds + self._offset.days * 86400 + hours, seconds = divmod(seconds, 3600) + minutes = seconds/60 + if minutes: + return "%+03d:%d" % (hours, minutes) + else: + return "%+03d" % hours + + def dst(self, dt): + return ZERO + + +STDOFFSET = datetime.timedelta(seconds = -time.timezone) +if time.daylight: + DSTOFFSET = datetime.timedelta(seconds = -time.altzone) +else: + DSTOFFSET = STDOFFSET +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(datetime.tzinfo): + """Platform idea of local timezone. + + This is the exact implementation from the Python 2.3 documentation. + """ + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 + +LOCAL = LocalTimezone() + +# TODO: pre-generate some interesting time zones? diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c205a7c --- /dev/null +++ b/setup.py @@ -0,0 +1,42 @@ +from distutils.core import setup + +setup( + name='psycopg2', + version='2.5.2', + summary='Python-PostgreSQL Database Adapter', + author='Federico Di Gregorio', + author_email='fog@initd.org', + description='Agnostic and easy to use ajax library for django', + url='http://initd.org/psycopg', + license='GPL with exceptions or ZPL', + package_data={'dajaxice': ['templates/dajaxice/*']}, + long_description=("psycopg2 is a PostgreSQL database adapter for the Python programming " + "language. psycopg2 was written with the aim of being very small and fast, " + "and stable as a rock. " + "" + "psycopg2 is different from the other database adapter because it was " + "designed for heavily multi-threaded applications that create and destroy " + "lots of cursors and make a conspicuous number of concurrent INSERTs or " + "UPDATEs. psycopg2 also provide full asynchronous operations and support " + "for coroutine libraries"), + classifiers=['Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', + 'License :: OSI Approved :: Zope Public License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.1', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: C', + 'Programming Language :: SQL', + 'Topic :: Database', + 'Topic :: Database :: Front-Ends', + 'Topic :: Software Development', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: Unix'] +) diff --git a/src/psycopg2-2.5.2-py2.7.egg-info b/src/psycopg2-2.5.2-py2.7.egg-info new file mode 100644 index 0000000..d731d13 --- /dev/null +++ b/src/psycopg2-2.5.2-py2.7.egg-info @@ -0,0 +1,40 @@ +Metadata-Version: 1.1 +Name: psycopg2 +Version: 2.5.2 +Summary: Python-PostgreSQL Database Adapter +Home-page: http://initd.org/psycopg/ +Author: Federico Di Gregorio +Author-email: fog@initd.org +License: GPL with exceptions or ZPL +Download-URL: http://initd.org/psycopg/tarballs/PSYCOPG-2-5/psycopg2-2.5.2.tar.gz +Description: psycopg2 is a PostgreSQL database adapter for the Python programming + language. psycopg2 was written with the aim of being very small and fast, + and stable as a rock. + + psycopg2 is different from the other database adapter because it was + designed for heavily multi-threaded applications that create and destroy + lots of cursors and make a conspicuous number of concurrent INSERTs or + UPDATEs. psycopg2 also provide full asynchronous operations and support + for coroutine libraries. + +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: License :: OSI Approved :: Zope Public License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: C +Classifier: Programming Language :: SQL +Classifier: Topic :: Database +Classifier: Topic :: Database :: Front-Ends +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: Unix