2
# This file is part of GNU Enterprise.
4
# GNU Enterprise is free software; you can redistribute it
5
# and/or modify it under the terms of the GNU General Public
6
# License as published by the Free Software Foundation; either
7
# version 2, or(at your option) any later version.
9
# GNU Enterprise is distributed in the hope that it will be
10
# useful, but WITHOUT ANY WARRANTY; without even the implied
11
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12
# PURPOSE. See the GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public
15
# License along with program; see the file COPYING. If not,
16
# write to the Free Software Foundation, Inc., 59 Temple Place
17
# - Suite 330, Boston, MA 02111-1307, USA.
19
# Copyright 2000-2005 Free Software Foundation
29
__all__ = ['Introspection']
32
from string import lower, join, split
35
from gnue.common.apps import GDebug, GConfig
36
from gnue.common.datasources import GIntrospection
38
class Introspection(GIntrospection.Introspection):
40
# list of the types of Schema objects this driver provides
41
types =[ ('view',_('Views'),1),
42
('table',_('Tables'),1) ]
45
# TODO: This is a quick hack to get this class
46
# TODO: into the new-style schema format.
47
# TODO: getSchema* should be merged into find()
49
def find(self, name=None, type=None):
51
return self.getSchemaList(type)
53
rs = self.getSchemaByName(name, type)
60
# TODO: Merge into find()
61
# Return a list of Schema objects
63
# Schema (metadata) functions
65
def getSchemaList(self, type=None):
67
statement = "select * from __table_names__"
69
cursor = self._connection.native.cursor()
70
GDebug.printMesg(3,"** Executing: %s **" % statement)
71
cursor.execute(statement)
74
for rs in cursor.fetchall():
75
# exclude any system tables and views. f.e. __table_names__
77
list.append(GIntrospection.Schema(attrs={'id':rs[1], 'name':rs[1], \
78
'type':rs[0] == 1 and 'view' or 'table',},
79
getChildSchema=self.__getFieldSchema))
85
# Find a schema object with specified name
86
def getSchemaByName(self, name, type=None):
87
statement = "SELECT * from __table_names__ WHERE TABLE_NAME='%s'" % (name)
89
cursor = self._connection.native.cursor()
90
GDebug.printMesg(3,"** Executing: %s **" % statement)
91
cursor.execute(statement)
93
rs = cursor.fetchone()
95
schema = GIntrospection.Schema(attrs={'id':rs[1], 'name':rs[1], \
96
'type':rs[0] == 1 and 'view' or 'table',},
97
getChildSchema=self.__getFieldSchema)
105
# Get fields for a table
106
def __getFieldSchema(self, parent):
108
# TODO: Read whole definitions from __DATADEFS__ and parse them
109
# to distinguish between varchar, float and integer
111
statement = "SELECT * FROM __COLUMNS__ WHERE TABLE_NAME='%s'" % parent.id
113
cursor = self._connection.native.cursor()
114
GDebug.printMesg(3,"** Executing: %s **" % statement)
115
cursor.execute(statement)
116
columns = cursor.description
119
for rs in cursor.fetchall():
121
#nativetype = string.split(string.replace(rs[1],')',''),'(')
124
attrs={'id': "%s.%s" % (parent.id, rs[0]), 'name': rs[0],
125
'type':'field', 'nativetype': 'varchar',
128
#if nativetype[0] in ('int','integer','bigint','mediumint',
129
# 'smallint','tinyint','float','real',
130
# 'double','decimal'):
131
# attrs['datatype']='number'
132
#elif nativetype[0] in ('date','time','timestamp','datetime'):
133
# attrs['datatype']='date'
135
# attrs['datatype']='text'
138
attrs['datatype']='text'
142
# if len(nativetype) == 2:
143
# attrs['length'] = int(string.split(nativetype[1])[0])
145
# GDebug.printMesg(1,'WARNING: mysql native type error: %s' % nativetype)
147
list.append(GIntrospection.Schema(attrs=attrs))