174 lines
4.4 KiB
Python

from .sor import SQLor
from .ddl_template_oracle import oracle_ddl_tmpl
select_stmt = """
select
$[fields]$
from
$[tables]$
$[whereclause]$
$[groupbyclause]$
$[havingclause]$
$[orderbyclause]$
"""
class Oracleor(SQLor):
ddl_template = oracle_ddl_tmpl
db2modelTypeMapping = {
'char':'char',
'nchar':'str',
'varchar':'str',
'varchar2':'str',
'nvarchar2':'str',
'number':'long',
'integer':'long',
'binary_float':'float',
'binary_double':'float',
'float':'float',
'timestamp':'timestamp',
'timestamp with time zone':'timestamp',
'timestamp with local time zone':'timestamp',
'interval year to moth':'date',
'interval day to second':'timestamp',
'clob':'text',
'nclob':'text',
'blob':'file',
'bfile':'file',
'date':'date',
}
model2dbTypemapping = {
'date':'date',
'time':'date',
'timestamp':'date',
'str':'varchar2',
'char':'char',
'short':'number',
'long':'number',
'float':'number',
'text':'nclob',
'file':'blob',
}
@classmethod
def isMe(self,name):
return name=='cx_Oracle'
def grammar(self):
return {
'select':select_stmt,
}
def placeHolder(self,varname,pos=None):
if varname=='__mainsql__' :
return ''
return ':%s' % varname
def dataConvert(self,dataList):
if type(dataList) == type({}):
return dataList
d = {}
[ d.update({i['name']:i['value']}) for i in dataList ]
return d
def pagingSQLmodel(self):
return u"""select *
from (
select page_s.*,rownum row_id
from (%s) page_s
order by $[sort]$
)
where row_id >=$[from_line]$ and row_id < $[end_line]$"""
def test_sqlstr(self):
return "select 1 from dual"
def tablesSQL(self):
sqlcmd = """select
lower(table_name) as name,
lower(decode(comments,null,table_name,comments)) as title
from USER_TAB_COMMENTS where table_type = 'TABLE'"""
return sqlcmd
def fieldsSQL(self,tablename=None):
sqlcmd="""select lower(utc.COLUMN_NAME) name
,utc.DATA_TYPE type
,utc.DATA_LENGTH length
,utc.data_scale dec
,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable
,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title
,lower(utc.table_name) as table_name
from user_tab_cols utc left join USER_COL_COMMENTS ucc on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME"""
if tablename is not None:
sqlcmd = sqlcmd + """ where lower(utc.table_name) = '%s'""" % tablename.lower()
return sqlcmd
def fkSQL(self,tablename=None):
tablename = tablename.lower()
sqlcmd = """select
distinct(ucc.column_name) as field,rela.table_name as fk_table,rela.column_name as fk_field
from
user_constraints uc,user_cons_columns ucc,
(
select t2.table_name,t2.column_name,t1.r_constraint_name
from user_constraints t1,user_cons_columns t2
where t1.r_constraint_name=t2.constraint_name
) rela
where
uc.constraint_name=ucc.constraint_name
and uc.r_constraint_name=rela.r_constraint_name"""
if tablename is not None:
sqlcmd = sqlcmd + """ and lower(uc.table_name)='%s'""" % tablename.lower()
return sqlcmd
def pkSQL(self,tablename=None):
sqlcmd = """
select
lower(col.table_name) table_name,
lower(col.column_name) as field_name
from
user_constraints con,user_cons_columns col
where
con.constraint_name=col.constraint_name and con.constraint_type='P'"""
if tablename is not None:
sqlcmd = sqlcmd + """ and lower(col.table_name)='%s'""" % tablename.lower()
return sqlcmd
def indexesSQL(self,tablename=None):
sqlcmd = """select
lower(a.index_name) index_name,
lower(a.UNIQUENESS) is_unique,
lower(b.column_name) column_name
from user_indexes a, user_ind_columns b
where a.index_name = b.index_name"""
if tablename is not None:
sqlcmd += """ and lower(a.table_name) = lower('%s')""" % tablename.lower()
return sqlcmd
async def connect(self):
"""
Note: cx_Oracle is synchronous. Using thread pool for async support.
"""
import asyncio
import cx_Oracle
dbdesc = self.dbdesc
# cx_Oracle connection string format
dsn = cx_Oracle.makedsn(
host=dbdesc.get('host', 'localhost'),
port=dbdesc.get('port', 1521),
service_name=dbdesc.get('service_name', dbdesc.get('sid', 'XE'))
)
loop = asyncio.get_event_loop()
self.conn = await loop.run_in_executor(
None,
cx_Oracle.connect,
dbdesc.get('user'),
dbdesc.get('password'),
dsn
)
self.dbname = dbdesc.get('service_name', dbdesc.get('sid', ''))
async def close(self):
import asyncio
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, self.conn.close)