lib/python/Products/ZODBCDA/browse.dtml 100666 0 0 632 6636536566 20522 0 ustar 00unknown unknown 0 0
tables
lib/python/Products/ZODBCDA/CHANGES.txt 100666 0 0 4006 6646421052 20147 0 ustar 00unknown unknown 0 0
Z ODBC DA Changes
Z ODBC DA 3.0.3
New Features
- Added documentation of the connection string format
to the connection add form and README file.
- The source for the extension module used by the DA is
included.
Bugs Fixed
- Connection to MS SQL Server failed due to a failure
to check for unusual "success" conditions during connection.
- Errors were reported incorrectly due to a missing exception
definition in the internal error handling machinery.
Z ODBC DA 3.0.2
Bugs Fixed
- Added module aliases for b/w compatibility with older
databases containing AqueductODBC.DA objects.
Z ODBC DA 3.0.1
Bugs Fixed
- Changed the documentation to make it clear that no
external binaries are needed to use this DA, as it
is currently win32 only, and we provide the required
ODBC extension (sql.pyd) in the distribution.
Z ODBC DA 3.0.0
This is the first Zope version.
Aqueduct ODBC 2.0.1
Bugs Fixed
- Internal ODBC objects might be deleted in the wrong
order, leading to process crashes.
- The permission for adding ODBC permissions was not set correctly.
Aqueduct ODBC 2.0
This is a major release. It adds advanced features for
browsing database schema information.
Bugs Fixed
- Binary data were not handled correctly.
- Date-time and Date data for dates before 1970 were not handled
correctly.
- Data modifications were automatically committed.
- The interface could not distinguish between integer and
floating-point numbers.
Features Added
- AqueductODBC database connection objects now have a "Browse"
tab that can be used to browse tables and views and their
schemas.
- When adding a database connection, existing data sources are
listed. It is no longer necessary to enter a connection
string.
lib/python/Products/ZODBCDA/connectionAdd.dtml 100666 0 0 3701 6646416500 21773 0 ustar 00unknown unknown 0 0
Add Z ODBC Database Connection
Add Z ODBC Database Connection
- 1
-
The database connection string is of the form:
dsn user password
where the data source name, user id, and password are separated
by one or more spaces.
lib/python/Products/ZODBCDA/DA.py 100666 0 0 21330 6763507012 17214 0 ustar 00unknown unknown 0 0 ##############################################################################
#
# Zope Public License (ZPL) Version 1.0
# -------------------------------------
#
# Copyright (c) Digital Creations. All rights reserved.
#
# This license has been certified as Open Source(tm).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions in source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. Digital Creations requests that attribution be given to Zope
# in any manner possible. Zope includes a "Powered by Zope"
# button that is installed by default. While it is not a license
# violation to remove this button, it is requested that the
# attribution remain. A significant investment has been put
# into Zope, and this effort will continue if the Zope community
# continues to grow. This is one way to assure that growth.
#
# 4. All advertising materials and documentation mentioning
# features derived from or use of this software must display
# the following acknowledgement:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# In the event that the product being advertised includes an
# intact Zope distribution (with copyright and license included)
# then this clause is waived.
#
# 5. Names associated with Zope or Digital Creations must not be used to
# endorse or promote products derived from this software without
# prior written permission from Digital Creations.
#
# 6. Modified redistributions of any form whatsoever must retain
# the following acknowledgment:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# Intact (re-)distributions of any official Zope release do not
# require an external acknowledgement.
#
# 7. Modifications are encouraged but must be packaged separately as
# patches to official Zope releases. Distributions that do not
# clearly separate the patches from the original work must be clearly
# labeled as unofficial distributions. Modifications which do not
# carry the name Zope may be packaged in any form, as long as they
# conform to all of the clauses above.
#
#
# Disclaimer
#
# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This software consists of contributions made by Digital Creations and
# many individuals on behalf of Digital Creations. Specific
# attributions are listed in the accompanying credits file.
#
##############################################################################
database_type='ODBC'
__doc__='''%s Database Connection
$Id: DA.py,v 1.12 1999/09/02 14:47:38 petrilli Exp $''' % database_type
__version__='$Revision: 1.12 $'[11:-2]
from db import DB, manage_ODBCDataSources
import Shared.DC.ZRDB.Connection, sys
from Globals import HTMLFile
from ImageFile import ImageFile
from ExtensionClass import Base
manage_addZODBCConnectionForm=HTMLFile('connectionAdd',globals())
def manage_addZODBCConnection(self, id, title,
connection_string, connection='',
check=None, REQUEST=None):
"""Add a DB connection to a folder"""
self._setObject(id, Connection(
id, title, connection_string or connection, check))
if REQUEST is not None: return self.manage_main(self,REQUEST)
class Connection(Shared.DC.ZRDB.Connection.Connection):
" "
database_type=database_type
id='%s_database_connection' % database_type
meta_type=title='Z %s Database Connection' % database_type
icon='misc_/Z%sDA/conn' % database_type
_isAnSQLConnection=1
def factory(self): return DB
manage_options=Shared.DC.ZRDB.Connection.Connection.manage_options+(
{'label': 'Browse', 'action':'manage_browse'},
# {'label': 'Design', 'action':'manage_tables'},
)
# manage_tables=HTMLFile('tables',globals())
manage_browse=HTMLFile('browse',globals())
def table_info(self):
return self._v_database_connection.table_info()
info=None
def tpValues(self):
r=[]
c=self._v_database_connection
try:
for d in c.tables(rdb=0):
try:
d['_columns']=c.columns(d['TABLE_NAME'])
b=TableBrowser()
b._d=d
try: b.icon=table_icons[d['TABLE_TYPE']]
except: pass
r.append(b)
except:
# print d['TABLE_NAME'], sys.exc_type, sys.exc_value
pass
finally: pass
return r
def manage_wizard(self, tables):
" "
def manage_join(self, tables, select_cols, join_cols, REQUEST=None):
"""Create an SQL join"""
def manage_insert(self, table, cols, REQUEST=None):
"""Create an SQL insert"""
def manage_update(self, table, keys, cols, REQUEST=None):
"""Create an SQL update"""
class Browser(Base):
def __getattr__(self, name):
try: return self._d[name]
except KeyError: raise AttributeError, name
class TableBrowser(Browser):
icon='what'
Description=''
info=HTMLFile('table_info',globals())
def tpValues(self):
r=[]
for d in self._d['_columns']:
b=ColumnBrowser()
b._d=d
try: b.icon=field_icons[d['Type']]
except: pass
r.append(b)
return r
def tpId(self): return self._d['TABLE_NAME']
def tpURL(self): return "Table/%s" % self._d['TABLE_NAME']
def Name(self): return self._d['TABLE_NAME']
def Type(self): return self._d['TABLE_TYPE']
class ColumnBrowser(Browser):
icon='field'
def tpId(self): return self._d['Name']
def tpURL(self): return "Column/%s" % self._d['Name']
def Description(self):
d=self._d
if d['Scale']:
return " %(Type)s(%(Precision)s,%(Scale)s) %(Nullable)s" % d
else:
return " %(Type)s(%(Precision)s) %(Nullable)s" % d
classes=('DA.Connection',)
meta_types=(
{'name':'Z %s Database Connection' % database_type,
'action':'manage_addZ%sConnectionForm' % database_type,
},
)
folder_methods={
'manage_addZODBCConnection':
manage_addZODBCConnection,
'manage_addZODBCConnectionForm':
manage_addZODBCConnectionForm,
'manage_ODBCDataSources': manage_ODBCDataSources
}
__ac_permissions__=(
('Add Z ODBC Database Connections',
('manage_addZODBCConnectionForm',
'manage_addZODBCConnection')),
)
misc_={
'conn': ImageFile('Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif'),
}
for icon in ('table', 'view', 'stable', 'what',
'field', 'text','bin','int','float',
'date','time','datetime'):
misc_[icon]=ImageFile('icons/%s.gif' % icon, globals())
table_icons={
'TABLE': 'table',
'VIEW':'view',
'SYSTEM_TABLE': 'stable',
}
field_icons={
'BIGINT': 'int',
'BINARY': 'bin',
'BIT': 'bin',
'CHAR': 'text',
'DATE': 'date',
'DECIMAL': 'float',
'DOUBLE': 'float',
'FLOAT': 'float',
'INTEGER': 'int',
'LONGVARBINARY': 'bin',
'LONGVARCHAR': 'text',
'NUMERIC': 'float',
'REAL': 'float',
'SMALLINT': 'int',
'TIME': 'time',
'TIMESTAMP': 'datetime',
'TINYINT': 'int',
'VARBINARY': 'bin',
'VARCHAR': 'text',
}
lib/python/Products/ZODBCDA/db.py 100666 0 0 24024 6763754120 17324 0 ustar 00unknown unknown 0 0 ##############################################################################
#
# Zope Public License (ZPL) Version 1.0
# -------------------------------------
#
# Copyright (c) Digital Creations. All rights reserved.
#
# This license has been certified as Open Source(tm).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions in source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. Digital Creations requests that attribution be given to Zope
# in any manner possible. Zope includes a "Powered by Zope"
# button that is installed by default. While it is not a license
# violation to remove this button, it is requested that the
# attribution remain. A significant investment has been put
# into Zope, and this effort will continue if the Zope community
# continues to grow. This is one way to assure that growth.
#
# 4. All advertising materials and documentation mentioning
# features derived from or use of this software must display
# the following acknowledgement:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# In the event that the product being advertised includes an
# intact Zope distribution (with copyright and license included)
# then this clause is waived.
#
# 5. Names associated with Zope or Digital Creations must not be used to
# endorse or promote products derived from this software without
# prior written permission from Digital Creations.
#
# 6. Modified redistributions of any form whatsoever must retain
# the following acknowledgment:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# Intact (re-)distributions of any official Zope release do not
# require an external acknowledgement.
#
# 7. Modifications are encouraged but must be packaged separately as
# patches to official Zope releases. Distributions that do not
# clearly separate the patches from the original work must be clearly
# labeled as unofficial distributions. Modifications which do not
# carry the name Zope may be packaged in any form, as long as they
# conform to all of the clauses above.
#
#
# Disclaimer
#
# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This software consists of contributions made by Digital Creations and
# many individuals on behalf of Digital Creations. Specific
# attributions are listed in the accompanying credits file.
#
###############################################################################
from sql import *
from string import join, split, find, strip
import sys
from Shared.DC.ZRDB.THUNK import THUNKED_TM
rc=sys.getrefcount
error=DatabaseError='ODBC Database Error'
def manage_ODBCDataSources(*args):
r=[]
status, name, desc = SQLDataSources(SQL_FETCH_FIRST)
while status==SQL_SUCCESS:
r.append((name, desc))
status, name, desc = SQLDataSources(SQL_FETCH_NEXT)
return r
defs={
SQL_BIGINT: 'i',
SQL_BINARY: 't',
SQL_BIT: 'i',
SQL_CHAR: 't',
SQL_DATE: 'd',
SQL_DECIMAL: 'N',
SQL_DOUBLE: 'n',
SQL_FLOAT: 'n',
SQL_INTEGER: 'i',
SQL_LONGVARBINARY: 't',
SQL_LONGVARCHAR: 't',
SQL_NUMERIC: 'N',
SQL_REAL: 'n',
SQL_SMALLINT: 'i',
SQL_TIME: 't',
SQL_TIMESTAMP: 'd',
SQL_TINYINT: 'i',
SQL_VARBINARY: 't',
SQL_VARCHAR: 't',
}
tpnames={
SQL_BIGINT: 'BIGINT',
SQL_BINARY: 'BINARY',
SQL_BIT: 'BIT',
SQL_CHAR: 'CHAR',
SQL_DATE: 'DATE',
SQL_DECIMAL: 'DECIMAL',
SQL_DOUBLE: 'DOUBLE',
SQL_FLOAT: 'FLOAT',
SQL_INTEGER: 'INTEGER',
SQL_LONGVARBINARY: 'LONGVARBINARY',
SQL_LONGVARCHAR: 'LONGVARCHAR',
SQL_NUMERIC: 'NUMERIC',
SQL_REAL: 'REAL',
SQL_SMALLINT: 'SMALLINT',
SQL_TIME: 'TIME',
SQL_TIMESTAMP: 'TIMESTAMP',
SQL_TINYINT: 'TINYINT',
SQL_VARBINARY: 'VARBINARY',
SQL_VARCHAR: 'VARCHAR',
}
binary_types=SQL_BINARY, SQL_LONGVARBINARY, SQL_VARBINARY
class DB(THUNKED_TM):
def __init__(self, connection_string=''):
self.connection_string=connection_string
d=split(connection_string)
if len(d) < 1 or len(d) > 3:
raise 'Invalid Connection String', d
while len(d) < 3: d.append('')
self.connection=c=SQLConnection(d[0],d[1],d[2])
try: SQLSetConnectOption(c,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)
except: pass # Oh well
self.stmt=c()
def table_info(self):
SQLTables(self.stmt, None, None, None, 'TABLE')
r=[]
for row in split(self.query(), '\n')[2:-1]:
q, owner, name, type, remarks = tuple(split(row,'\t'))
if owner: owner="(owned by %s) " % owner
owner=owner+remarks
if owner: owner=', '+owner
r.append((name, owner))
return r
def tables(self, Qualifier=None, Owner=None, Name=None, Type=None, rdb=1):
SQLTables(self.stmt, Qualifier, Owner, Name, Type)
return self.query(rdb=rdb)
def query(self, src=None, max_rows=99999999, rdb=1):
stmt=self.stmt
self._register()
try:
if src is not None:
r=filter(strip,split(src,'\0'))
if not r: raise ValueError, 'null sql'
if len(r) > 1:
res=None
for s in r:
SQLExecDirect(stmt,s)
status, ncol = SQLNumResultCols(stmt)
if ncol:
if res is not None:
raise ValueError, (
'multiple selects are not allowed')
res=self.query(None, max_rows, rdb)
if res==None:
if rdb: res="x\n8s\n"
else: res=()
return res
SQLExecDirect(stmt,src)
except error, v:
state, native, mess = v
raise error, "%s (%s)" % (mess, state)
status, ncol = SQLNumResultCols(stmt)
if ncol==0:
if rdb: return "x\n8s\n"
else: return ()
r=[]
row=['']*ncol
names=['']*ncol
rdbdefs=['']*ncol
indexes=range(ncol)
binary_flags=[0]*ncol
for i in range(ncol):
status, name, tp, prec, scale, nullable=SQLDescribeCol(stmt,i+1)
names[i]=name
if prec < 1: prec=8
binary_flags[i]=tp in binary_types
if defs.has_key(tp): tp=defs[tp]
else: tp='t'
if tp=='N' and scale==0: tp='i'
rdbdefs[i]=tp
row[i]="%s%s" % (prec,tp)
if rdb:
r.append(join(names,'\t'))
r.append(join(row,'\t'))
status=SQLFetch(stmt)
while status==SQL_SUCCESS:
for i in range(ncol):
v=SQLGetString(stmt,i+1,binary_flags[i])
if rdbdefs[i]=='t':
if find(v,'\\') >= 0: v=join(split(v,'\\'),'\\\\')
if find(v,'\n') >= 0: v=join(split(v,'\n'),'\\n')
if find(v,'\t') >= 0: v=join(split(v,'\t'),'\\t')
row[i]=v
if rdb: rd=join(row,'\t')
else:
rd={}
for i in indexes: rd[names[i]]=row[i]
r.append(rd)
status=SQLFetch(stmt)
SQLFreeStmt(stmt, SQL_CLOSE);
if rdb: r=join(r,'\n')+'\n'
return r
def columns(self, table_name):
stmt=self.stmt
try: SQLExecDirect(stmt, 'select * from %s where 1=2' % table_name)
except error, v:
state, native, mess = v
raise error, "%s (%s)" % (mess, state)
status, ncol = SQLNumResultCols(stmt)
r=[]
standard_type=tpnames.has_key
for i in range(ncol):
status, name, tp, prec, scale, nullable=SQLDescribeCol(stmt,i+1)
if standard_type(tp): tp=tpnames[tp]
else: tp="Non-standard type %s" % tp
r.append({'Name': name, 'Type': tp, 'Precision': prec,
'Scale': scale,
'Nullable': nullable and 'with Null' or ''})
SQLFreeStmt(stmt, SQL_CLOSE);
return r
def _begin(self):
pass
def _finish(self):
SQLTransact(self.connection, SQL_COMMIT)
def _abort(self):
SQLTransact(self.connection, SQL_ROLLBACK)
if __name__=='__main__':
#print manage_ODBCDataSources()
db=DB('test')
#print db.table_info()
if len(sys.argv)==2: print db.query(sys.argv[1])
else: print db.tables(rdb=0)
#print db.columns('f')
lib/python/Products/ZODBCDA/icons/bin.gif 100666 0 0 1634 6501032314 20701 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @y HXB
!>3jܸʼn 8"(
ReH-+zrdM8Mbȓ̔@OJQ'| qiə7TN݊ubզ2: ٳ- ; lib/python/Products/ZODBCDA/icons/CVS/Entries 100666 0 0 1376 6763721220 21447 0 ustar 00unknown unknown 0 0 /bin.gif/1.1/Mon Mar 9 18:28:27 1998/-kb/TZODBC-3-1-0-beta2
/date.gif/1.1/Mon Mar 9 18:28:28 1998/-kb/TZODBC-3-1-0-beta2
/datetime.gif/1.1/Mon Mar 9 18:28:28 1998/-kb/TZODBC-3-1-0-beta2
/field.gif/1.1/Mon Mar 9 18:28:29 1998/-kb/TZODBC-3-1-0-beta2
/float.gif/1.1/Mon Mar 9 18:28:29 1998/-kb/TZODBC-3-1-0-beta2
/int.gif/1.1/Mon Mar 9 18:28:30 1998/-kb/TZODBC-3-1-0-beta2
/stable.gif/1.1/Mon Mar 9 18:28:30 1998/-kb/TZODBC-3-1-0-beta2
/table.gif/1.1/Mon Mar 9 18:28:30 1998/-kb/TZODBC-3-1-0-beta2
/text.gif/1.1/Mon Mar 9 18:28:32 1998/-kb/TZODBC-3-1-0-beta2
/time.gif/1.1/Mon Mar 9 18:28:33 1998/-kb/TZODBC-3-1-0-beta2
/view.gif/1.1/Mon Mar 9 18:28:33 1998/-kb/TZODBC-3-1-0-beta2
/what.gif/1.1/Mon Mar 9 18:28:34 1998/-kb/TZODBC-3-1-0-beta2
D
lib/python/Products/ZODBCDA/icons/CVS/Repository 100666 0 0 61 6763721220 22143 0 ustar 00unknown unknown 0 0 /cvs-repository/Packages/Products/ZODBCDA/icons
lib/python/Products/ZODBCDA/icons/CVS/Root 100666 0 0 62 6763721220 20710 0 ustar 00unknown unknown 0 0 :ext:petrilli@korak.digicool.com:/cvs-repository
lib/python/Products/ZODBCDA/icons/CVS/Tag 100666 0 0 24 6763721220 20476 0 ustar 00unknown unknown 0 0 NZODBC-3-1-0-beta2
lib/python/Products/ZODBCDA/icons/date.gif 100666 0 0 1642 6501032314 21045 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @ H@2tHB!VȱŌJi1dE\yFIM]zLY3Ϙ4Y
UѣH gNKQ6M'MTș@v*iӧbk&]˖! ; lib/python/Products/ZODBCDA/icons/datetime.gif 100666 0 0 1635 6501032314 21726 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @z H @B6QB)>ȱcG 6qI\yPǗ/A$IȊ2a O
JThƝHIHs͇SɊ8X*՜Xv5dѳh ; lib/python/Products/ZODBCDA/icons/field.gif 100666 0 0 1623 6501032316 21214 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @p HXȐ6\@`ĉ3fƏycD' #E0CvIS&ɛ"ɳϟ:-bPgQ*j4ҡM_}
1ʥT%V:#Я` ; lib/python/Products/ZODBCDA/icons/float.gif 100666 0 0 1641 6501032316 21236 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @~ HXpC
F(3jbE#Niɓ"X"ɖ*=|q͘ jrO+
JhP%dRHubYjΖX,fHU*
ʴȧ]@@ ; lib/python/Products/ZODBCDA/icons/int.gif 100666 0 0 1626 6501032316 20726 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @s HXȐ28Q E3bD`1ċ7"I H!#:(E
_ѥƛ8Yϟ@
qcLɔRFz,%TTc&Q)VCÊE ; lib/python/Products/ZODBCDA/icons/stable.gif 100666 0 0 1564 6501032316 21407 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @Q H *\ B:q"E/*̨GC)&QLrʗ*WG0kl&L:}$I4d@ ; lib/python/Products/ZODBCDA/icons/table.gif 100666 0 0 1556 6501032316 21225 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @K H@ Tp
#2lqBj,xQ"Ɗ'>2ȍ\ɒ0Ur&͕6of$'Ϟ ; lib/python/Products/ZODBCDA/icons/text.gif 100666 0 0 1626 6501032320 21113 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @s HXÅB@3jܘŎ
`IFS48cKQ$ə1?rϕ
JTN8uɳR#F=t՝2OڐbN EÊ ; lib/python/Products/ZODBCDA/icons/time.gif 100666 0 0 1636 6501032322 21070 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @{ HXPB (Q3jF|(VDH%=fYrM hr3O,
JhP5?|!R;'Bƥ0VS*I JltEhӲ ; lib/python/Products/ZODBCDA/icons/view.gif 100666 0 0 1575 6501032322 21106 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @Z H "$aB<`B(@ǎ-*IbÅ'+`# 0cʄHp̓r &N<}*tFsL`@ ; lib/python/Products/ZODBCDA/icons/what.gif 100666 0 0 1576 6501032322 21100 0 ustar 00unknown unknown 0 0 GIF89a PPP @ @ @ @ @ ! , @[ (ThBXذ`ÅL|ć
/bQG;fXPeA]4@dŃ(;̸Ç