source: coopr.pyomo/trunk/coopr/pyomo/data/odbc_table.py @ 3009

Last change on this file since 3009 was 3009, checked in by wehart, 9 years ago

Setting up plugins for database interfaces.

File size: 2.8 KB
Line 
1#  _________________________________________________________________________
2#
3#  Coopr: A COmmon Optimization Python Repository
4#  Copyright (c) 2008 Sandia Corporation.
5#  This software is distributed under the BSD License.
6#  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
7#  the U.S. Government retains certain rights in this software.
8#  For more information, see the Coopr README.txt file.
9#  _________________________________________________________________________
10
11import os.path
12from TableData import TableData
13from pyutilib.component.core import alias
14
15# format=
16# using=
17# query=
18# user=
19# password=
20
21class db_Table(TableData):
22
23    def __init__(self):
24        TableData.__init__(self)
25
26    def open(self):
27        if self.filename is None:
28            raise IOError, "No data source name was specified"
29        #
30        # Initialize self.db
31        #
32        self.db = None
33        if self._data is not None:
34            self.db = self._data
35        else:
36            try:
37                self.db = self.connect(self.filename, self.options)
38            except pyutilib.ApplicationError:
39                raise
40
41    def read(self):
42        #
43        # Get the table from the database
44        #
45        if self.db is None:
46            return
47        tmp = self.db.get_table(self.options.table, raw=True)
48        #
49        # Process data from the table
50        #
51        if type(tmp) in (int,long,float):
52            if not self.options.param is None:
53                self._info = ["param",self.options.param,":=",tmp]
54            elif len(self.options.symbol_map) == 1:
55                self._info = ["param",self.options.symbol_map[self.options.symbol_map.keys()[0]],":=",tmp]
56            else:
57                raise IOError, "Data looks like a parameter, but multiple parameter names have been specified: %s" % str(self.options.symbol_map)
58        elif len(tmp) == 0:
59            raise IOError, "Empty range '%s'" % self.options.range
60        else:
61            self._set_data(tmp[0], tmp[1:])
62        return True
63
64    def close(self):
65        if self._data is None and not self.db is None:
66            del self.db
67
68    def connect(self, dsn, options):
69        try:
70            mod = __import__(options.using)
71            args = [dsn]
72            if not options.user is None:
73                args.append(options.user)
74            if not options.password is None:
75                args.append(options.password)
76            return mod.connect(*args)
77        except ImportError:
78            return None
79       
80
81for module in ['pyodbc', 'pymysql']:
82    try:
83        __import__(module)
84        class tmp(db_Table):
85            alias(module, "Manage IO with a %s database interface" % module)
86            def __init__(self):
87                db_Table.__init__(self)
88                self.using = module
89
90    except ImportError:
91        pass
92
Note: See TracBrowser for help on using the repository browser.