Browse Source

add the db module

olivier.massot 8 years ago
parent
commit
e59c12739d
3 changed files with 88 additions and 41 deletions
  1. 1 0
      .settings/.gitignore
  2. 87 0
      core/db.py
  3. 0 41
      core/wsparser.py

+ 1 - 0
.settings/.gitignore

@@ -0,0 +1 @@
+/org.eclipse.core.resources.prefs

+ 87 - 0
core/db.py

@@ -0,0 +1,87 @@
+'''
+    Convenient access to various databases
+'''
+from pypyodbc import Connection
+
+class CustomDb(Connection):
+    """ Connexion to a database """
+    _cache = {}
+    default_name = ""
+    drivername = ""
+    dsn = ""
+    default_user = ""
+    default_pwd = ""
+
+    def __init__(self, **kwargs):
+        cls = self.__class__
+        if not "uid" in kwargs and cls.default_user:
+            kwargs["uid"] = cls.default_user
+        if not "pwd" in kwargs and cls.default_pwd:
+            kwargs["pwd"] = cls.default_pwd
+        super(CustomDb, self).__init__(cls.dsn, **kwargs)
+
+    def connect(self, *args, **kwargs):
+        """ Establish the connexion to the database"""
+        super(CustomDb, self).connect(*args, **kwargs)
+
+    def read(self, sql, *args):
+        """ yield rows as NamedTupleRow """
+        cursor = self.execute(sql)
+        row = cursor.fetchone()
+        while row:
+            yield row
+            row = cursor.fetchone()
+        cursor.close()
+
+    def read_all(self, sql, *args):
+        """ return the selection as a list of dictionnaries """
+        cursor = self.execute(sql)
+        data = [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()]
+        cursor.close()
+        return data
+
+    def execute(self, sql, *args):
+        cursor = self.cursor()
+        args = [sql, tuple(args)] if args else [sql]
+        cursor.execute(*args)
+        return cursor
+
+class AccessDb(CustomDb):
+    dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};"
+    default_user = "admin"
+    default_pwd = ""
+    def __init__(self, dbpath, **kwargs):
+        super(AccessDb, self).__init__(dbq=dbpath, **kwargs)
+
+class AccessSDb(AccessDb):
+    dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};"
+    default_user = ""
+    default_pwd = ""
+    def __init__(self, dbpath, mdwpath, uid, pwd, **kwargs):
+        super(AccessSDb, self).__init__(dbpath, uid=uid, pwd=pwd, systemdb=mdwpath, **kwargs)
+
+class OracleDb(CustomDb):
+    dsn = "DRIVER={Oracle dans ORA102};"
+    def __init__(self, dbname, user, pwd, **kwargs):
+        super(OracleDb, self).__init__(dbq=dbname, uid=user, pwd=pwd, **kwargs)
+
+class SqlServerDb(CustomDb):
+    dsn = "DRIVER={SQL Server};"
+    def __init__(self, server, dbname, user, pwd, **kwargs):
+        super(SqlServerDb, self).__init__(server=server, database=dbname, uid=user, pwd=pwd, **kwargs)
+
+# class SqliteDb(CustomDb):
+#     drivername = "QODBC"
+#     dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
+#     default_user = "admin"
+#     pwd = ""
+#     def __init__(self, dbpath, **kwargs):
+#         CustomDb.__init__(self, dbq=dbpath, **kwargs)
+#
+# class PostgresDb(CustomDb):
+#     drivername = "QODBC"
+#     dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
+#     default_user = "admin"
+#     pwd = ""
+#     def __init__(self, dbpath, **kwargs):
+#         CustomDb.__init__(self, dbq=dbpath, **kwargs)

+ 0 - 41
core/wsparser.py

@@ -1,41 +0,0 @@
-
-import urllib.request
-
-from lxml import etree  # @UnresolvedImport
-
-
-class WSParser():
-    """ Parser for a web service """
-    def __init__(self, url):
-        self._url = url
-        self._data = None
-
-    @property
-    def url(self):
-        return self._url
-
-    def parse(self):
-        strxml = urllib.request.urlopen(self._url).read()
-        self._data = etree.fromstring(strxml)
-
-    def __iter__(self):
-        if self._data is None:
-            self.parse()
-        return (node.attrib for node in self._data)
-
-# OU
-#
-# from _io import BytesIO
-# URL = 'http://localhost:2890/public/WsPDE.asmx/GetPDETitres'
-#
-# data = urllib.request.urlopen(URL).read()
-#
-# for _, element in etree.iterparse(BytesIO(data)):
-#     print(element.attrib)
-
-if __name__ == "__main__":
-
-    ws_url = 'http://localhost:2890/public/WsPDE.asmx/GetPDETitres'
-    for elt in WSParser(ws_url):
-        print(elt)
-