Changeset 11832:d3f10458113d in orange for Orange/data/sql.py


Ignore:
Timestamp:
01/10/14 08:22:04 (3 months ago)
Author:
Slach@…
Branch:
default
Message:

adding ODBC support for SQL select widget

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/data/sql.py

    r10580 r11832  
    8282        pass 
    8383 
     84class __ODBCQuirkFix(object): 
     85    def __init__(self, dbmod): 
     86        self.dbmod = dbmod 
     87        self.typeDict = { 
     88            Descriptor.Continuous:'FLOAT', 
     89            Descriptor.Discrete:'VARCHAR', Descriptor.String:'VARCHAR'} 
     90 
     91    def beforeWrite(self, cursor): 
     92        pass 
     93 
     94    def beforeCreate(self, cursor): 
     95        pass 
     96 
     97 
    8498def _connection(uri): 
    8599        (schema, user, password, host, port, path, args) = _parseURI(uri) 
     
    92106            } 
    93107        if schema == 'postgres': 
    94             import psycopg2 as dbmod 
    95108            argTrans["database"] = "db" 
    96             quirks = __PostgresQuirkFix(dbmod) 
    97             quirks.parameter = "%s" 
    98         elif schema == 'mysql': 
    99             import MySQLdb as dbmod 
    100             quirks = __MySQLQuirkFix(dbmod) 
    101             quirks.parameter = "%s" 
    102         elif schema == "sqlite": 
    103             import sqlite3 as dbmod 
    104             quirks = __PostgresQuirkFix(dbmod) 
    105             quirks.parameter = "?" 
    106             return (quirks, dbmod.connect(host)) 
     109        elif schema == 'odbc': 
     110            argTrans["host"] = "server" 
     111            argTrans["user"] = "uid" 
     112            argTrans["password"] = "pwd" 
     113            argTrans['database'] = 'database' 
    107114 
    108115        dbArgDict = {} 
     
    117124        if path: 
    118125            dbArgDict[argTrans['database']] = path[1:] 
    119         return (quirks, dbmod.connect(**dbArgDict)) 
    120  
    121  
     126 
     127        if schema == 'postgres': 
     128            import psycopg2 as dbmod 
     129            quirks = __PostgresQuirkFix(dbmod) 
     130            quirks.parameter = "%s" 
     131            return (quirks, dbmod.connect(**dbArgDict)) 
     132        elif schema == 'mysql': 
     133            import MySQLdb as dbmod 
     134            quirks = __MySQLQuirkFix(dbmod) 
     135            quirks.parameter = "%s" 
     136            return (quirks, dbmod.connect(**dbArgDict)) 
     137        elif schema == "sqlite": 
     138            import sqlite3 as dbmod 
     139            quirks = __PostgresQuirkFix(dbmod) 
     140            quirks.parameter = "?" 
     141            return (quirks, dbmod.connect(host)) 
     142        elif schema == "odbc": 
     143            import pyodbc as dbmod 
     144            quirks = __ODBCQuirkFix(dbmod) 
     145            quirks.parameter = "?" 
     146            if args.has_key('DSN'): 
     147                connectionString = 'DSN=%s' % (args['DSN']) 
     148            elif args.has_key('Driver'): 
     149                connectionString = 'Driver=%s' % (args['Driver']) 
     150            else: 
     151                raise ValueError, "ODBC url schema must have DSN or Driver parameter" 
     152            for k in args: 
     153                if k not in ['DSN','Driver']: 
     154                    connectionString +=';%s=%s' % (k,args[k]) 
     155            #print connectionString, dbArgDict 
     156            return (quirks, dbmod.connect(connectionString,**dbArgDict)) 
    122157 
    123158class SQLReader(object): 
     
    227262 
    228263    def get_domain(self): 
    229         if not hasattr(self, '_domain'): 
     264        if not hasattr(self, '_domain') or self._domain is None: 
    230265            self._createDomain() 
    231266        return self._domain 
     
    245280 
    246281    def _createDomain(self): 
    247         if hasattr(self, '_domain'): 
     282        if hasattr(self, '_domain') and not self._domain is None: 
    248283            return 
    249284        attrNames = [] 
     
    263298            if name in discreteNames: 
    264299                attrName = 'D#' + name 
    265             elif typ is None or typ in [self.quirks.dbmod.STRING, self.quirks.dbmod.DATETIME]: 
     300            elif typ is None or typ in [unicode, self.quirks.dbmod.STRING, self.quirks.dbmod.DATETIME]: 
    266301                    attrName = 'S#' + name 
    267302            else: 
    268303                attrName = 'C#' + name 
    269              
     304 
    270305            if name == className: 
    271306                attrName = "c" + attrName 
     
    282317        Execute a pending SQL query. 
    283318        """ 
    284         if not self._dirty and hasattr(self, '_domain'): 
     319        if not self._dirty and hasattr(self, '_domain') and not self._domain is None: 
    285320            return self.exampleTable 
    286321        self.exampleTable = None 
     
    298333            attrNames = [] 
    299334            for i, name in enumerate(self.desc): 
    300             #    print name[0], '->', self.domain.index(name[0]) 
     335                #print name[0], '->', self._domain.index(name[0]) 
    301336                domainIndexes[self._domain.index(name[0])] = i 
    302337                attrNames.append(name[0]) 
Note: See TracChangeset for help on using the changeset viewer.