source: orange/Orange/OrangeWidgets/Prototypes/OWSQL.py @ 10466:b52f4c49e735

Revision 10466:b52f4c49e735, 5.5 KB checked in by Ales Erjavec <ales.erjavec@…>, 2 years ago (diff)

Added unicode filename support for the rest of save/load widget dialogs.

Line 
1"""<name>SQL</name>
2<description>Constructs Data Using SQL Queries</description>
3<icon>icons/SQL.png</icon>
4<priority>30</priority>
5<contact>Janez Demsar (janez.demsar@fri.uni-lj.si)</contact>"""
6
7from OWWidget import *
8from OWGUI import *
9import orngSQL, orngEnviron
10from urllib import quote
11
12class OWSQL(OWWidget):
13    settingsList = ["host", "username", "password", "showPassword", "database", "query", "library", "lastDir", "databaseType"]
14    def __init__(self,parent=None, signalManager = None):
15        OWWidget.__init__(self, parent, signalManager, "Compare Examples", wantMainArea=0)
16        self.outputs = [("Data", ExampleTable, Default)]
17
18        self.host = "localhost"
19        self.username = "root"
20        self.password = self.database = self.query = ""
21        self.showPassword = False
22        self.library = []
23        self.lastDir = orngEnviron.defaultReportsDir
24        self.databaseType = 0
25        self.resize(600, 300)
26        self.loadSettings()
27       
28        self.error = ""
29        self.databaseTypes = ["MySQL", "Postgres"]
30               
31        self.currentName = ""
32        b1 = OWGUI.widgetBox(self.controlArea, box="Server", orientation=0)
33        OWGUI.comboBox(b1, self, "databaseType", label="Type", items = self.databaseTypes)
34        OWGUI.lineEdit(b1, self, "host", label="Host")
35        OWGUI.lineEdit(b1, self, "username", label="Username")
36        self.lePwd = OWGUI.lineEdit(b1, self, "password", label="Password")
37        OWGUI.lineEdit(b1, self, "database", label="Database")
38        self.showPasswordChanged()
39       
40        b1 = OWGUI.widgetBox(self.controlArea, box="Query")
41        self.queryEdit = QTextEdit() # don't put the string here, it's interpreted as HTML
42        self.queryEdit.setText(self.query)
43        b1.layout().addWidget(self.queryEdit)
44        b2 = OWGUI.widgetBox(b1, orientation=0)
45        errorIconName = os.path.join(orngEnviron.canvasDir, "icons", "error.png")
46        self.errorIcon = OWGUI.widgetLabel(b2, "")
47        self.errorIcon.setPixmap(QPixmap(errorIconName))
48        self.errorIcon.setVisible(False)
49        OWGUI.label(b2, self, "%(error)s")
50        OWGUI.rubber(b2)
51        OWGUI.button(b2, self, "Save to Library", callback=self.saveToLibrary)
52        OWGUI.separator(b2, width=40)
53        OWGUI.button(b2, self, "Execute", callback=self.executeQuery)
54
55        OWGUI.separator(b1)
56        OWGUI.widgetLabel(b1, "Library")
57        self.libraryList = QListWidget(self)
58        for name, query in self.library:
59            li = QListWidgetItem(name)
60            li.setToolTip(query)
61            self.libraryList.addItem(li)
62        b1.layout().addWidget(self.libraryList)
63        b2 = OWGUI.widgetBox(b1, orientation=0)
64        OWGUI.button(b2, self, "Load Query", callback=self.loadFromLibrary)
65        OWGUI.button(b2, self, "Add to Query", callback=self.addFromLibrary)
66        OWGUI.button(b2, self, "Remove from library", callback=self.removeFromLibrary)
67        OWGUI.rubber(b2)
68        OWGUI.button(b2, self, "Save Library to File", callback=self.saveToFile)
69       
70
71    def showPasswordChanged(self):
72        self.lePwd.setEchoMode(QLineEdit.Normal if self.showPassword else QLineEdit.Password)
73
74    def executeQuery(self):
75        self.query = str(self.queryEdit.toPlainText()).strip()
76        try:
77            sqlReader = orngSQL.SQLReader("%s://%s:%s@%s/%s" % 
78                                          (self.databaseTypes[self.databaseType].lower(),
79                                           quote(self.username), quote(self.password), quote(self.host), quote(self.database)))
80            sqlReader.execute(self.query)
81            data = sqlReader.data()
82            self.error = ""
83            self.errorIcon.setVisible(False)
84        except Exception, d:
85            for m in reversed(d.args):
86                if isinstance(m, (str, unicode)):
87                    self.error = "Error: " + m
88                    break
89            else:
90                self.error = "Error: " + str(d)
91            self.errorIcon.setVisible(True)
92            data = None
93        self.send("Data", data)
94       
95    def saveToLibrary(self):
96        ci = self.libraryList.currentItem()
97        name, ok = QInputDialog.getText(self, "Query name", "Query name", QLineEdit.Normal, ci and ci.text() or "")
98        if not ok:
99            return
100        name = str(name)
101        query = str(self.queryEdit.toPlainText()).strip()
102        for row, (sname, squery) in enumerate(self.library):
103            if name == sname:
104                self.library[row] = (name, query)
105                ci.setToolTip(query)
106                break
107        else:
108            self.library.append((name, query))
109            li = QListWidgetItem(name)
110            li.setToolTip(query)
111            self.libraryList.addItem(li)
112   
113    def loadFromLibrary(self):
114        cr = self.libraryList.currentRow()
115        if cr > -1:
116            self.queryEdit.setText(self.library[cr][1])
117   
118    def addFromLibrary(self):
119        cr = self.libraryList.currentRow()
120        if cr > -1:
121            self.queryEdit.setText(self.queryEdit.toPlainText() + "\n\n" + self.library[cr][1])
122   
123    def removeFromLibrary(self):
124        cr = self.libraryList.currentRow()
125        if cr > -1:
126            del self.library[cr]
127            self.libraryList.takeItem(cr)
128   
129    def saveToFile(self):
130        fname = unicode(QFileDialog.getSaveFileName(self, "File name", self.lastDir, "SQL File (*.sql)\nAll files (*.*)"))
131        if not fname:
132            return
133        self.lastDir = os.path.split(fname)[0]
134        file(fname, "wt").write("\n\n".join("-- %s\n%s" % l for l in self.library))
Note: See TracBrowser for help on using the repository browser.