Default repository for execsql.py
Révision | cd986a19a3513c11d38af7fb696000a90afbb8d2 (tree) |
---|---|
l'heure | 2019-10-12 03:32:57 |
Auteur | Dreas Nielsen <dnielsen@inte...> |
Commiter | Dreas Nielsen |
Initial code additions for Oracle support.
@@ -27,12 +27,12 @@ | ||
27 | 27 | # |
28 | 28 | # =============================================================================== |
29 | 29 | |
30 | -__version__ = "1.52.1" | |
30 | +__version__ = "1.52.2" | |
31 | 31 | __vdate = "2019-10-11" |
32 | 32 | |
33 | 33 | primary_vno = 1 |
34 | 34 | secondary_vno = 52 |
35 | -tertiary_vno = 1 | |
35 | +tertiary_vno = 2 | |
36 | 36 | |
37 | 37 | import os |
38 | 38 | import os.path |
@@ -2445,6 +2445,21 @@ | ||
2445 | 2445 | dbt_firebird.name_datatype(DT_Text, "BLOB") |
2446 | 2446 | dbt_firebird.name_datatype(DT_Binary, "BLOB") |
2447 | 2447 | |
2448 | +dbt_oracle = DbType("Oracle") | |
2449 | +dbt_oracle.name_datatype(DT_TimestampTZ, "TIMESTAMP WITH TIME ZONE") | |
2450 | +dbt_oracle.name_datatype(DT_Timestamp, "TIMESTAMP") | |
2451 | +dbt_oracle.name_datatype(DT_Date, "DATE") | |
2452 | +dbt_oracle.name_datatype(DT_Time, "VARCHAR2") | |
2453 | +dbt_oracle.name_datatype(DT_Integer, "NUMBER") | |
2454 | +dbt_oracle.name_datatype(DT_Long, "NUMBER") | |
2455 | +dbt_oracle.name_datatype(DT_Float, "FLOAT") | |
2456 | +dbt_oracle.name_datatype(DT_Decimal, "NUMBER") | |
2457 | +dbt_oracle.name_datatype(DT_Boolean, "CHAR", True) | |
2458 | +dbt_oracle.name_datatype(DT_Character, "CHAR", True) | |
2459 | +dbt_postgres.name_datatype(DT_Varchar, "NVARCHAR2", True) | |
2460 | +dbt_postgres.name_datatype(DT_Text, "CLOB") | |
2461 | +dbt_postgres.name_datatype(DT_Binary, "BLOB") | |
2462 | + | |
2448 | 2463 | # End of database types. |
2449 | 2464 | #=============================================================================================== |
2450 | 2465 |
@@ -3668,6 +3683,47 @@ | ||
3668 | 3683 | self.cursor().execute(sql, (psycopg2.Binary(filedata),)) |
3669 | 3684 | |
3670 | 3685 | |
3686 | +class OracleDatabase(Database): | |
3687 | + def __init__(self, server_name, db_name, user_name, need_passwd=False, port=5432, encoding='UTF8', password=None): | |
3688 | + global cx_Oracle | |
3689 | + try: | |
3690 | + import cx_Oracle | |
3691 | + except: | |
3692 | + fatal_error(u"The cx-Oracle module is required to connect to Oracle. See https://pypi.org/project/cx-Oracle/") | |
3693 | + self.type = dbt_oracle | |
3694 | + self.server_name = server_name | |
3695 | + self.db_name = db_name | |
3696 | + self.user = user_name | |
3697 | + self.need_passwd = need_passwd | |
3698 | + self.password = password | |
3699 | + self.port = port if port else 1521 | |
3700 | + self.encoding = encoding or 'UTF8' | |
3701 | + self.encode_commands = False | |
3702 | + self.paramstr = ':%s' | |
3703 | + self.conn = None | |
3704 | + self.autocommit = True | |
3705 | + self.open_db() | |
3706 | + def __repr__(self): | |
3707 | + return u"OracleDatabase(%r, %r, %r, %r, %r, %r)" % (self.server_name, self.db_name, self.user, | |
3708 | + self.need_passwd, self.port, self.encoding) | |
3709 | + def open_db(self): | |
3710 | + def db_conn(db, db_name): | |
3711 | + if db.user and db.password: | |
3712 | + return cx_Oracle.connect(host=str(db.server_name), database=str(db_name), port=db.port, user=db.user, password=db.password) | |
3713 | + else: | |
3714 | + return cx_Oracle.connect(host=str(db.server_name), database=db_name, port=db.port) | |
3715 | + def exec_cmd(self, querycommand): | |
3716 | + # The querycommand must be a stored function (/procedure) | |
3717 | + curs = self.cursor() | |
3718 | + cmd = u"select %s()" % querycommand | |
3719 | + try: | |
3720 | + curs.execute(cmd) | |
3721 | + subvars.add_substitution("$LAST_ROWCOUNT", curs.rowcount) | |
3722 | + except: | |
3723 | + self.rollback() | |
3724 | + raise | |
3725 | + | |
3726 | + | |
3671 | 3727 | class SQLiteDatabase(Database): |
3672 | 3728 | def __init__(self, SQLite_fn): |
3673 | 3729 | global sqlite3 |