diff --git a/README.md b/README.md new file mode 100644 index 0000000..c64eef9 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ + +# SQLBase7-SA + +SQLBase7-SA is a SQLAlchemy driver/dialect for the Centura SQLBase +database, specifically version 7.5.1. + +## About the Project + +From what I can tell, SQLBase is still an actively-developed database, +but it is no longer owned by Centura (see +[here](http://en.wikipedia.org/wiki/Gupta_Technologies)). Also, the +current version (according to [this +page](http://www.unify.com/Products/Data_Management/SQLBase/), as of +25 Apr 2010) is 11.5, so I have no idea how useful this project will +be for versions of SQLBase more recent than 7.5.1. + +This project exists only for the sake of providing read-only access to +legacy data, specifically that used by the +[CAM32](http://www.camcommerce.com/products/CAM32.aspx) Point of Sale +software. It's possible that it could allow writing data, etc., but I +personally won't be adding any such features unless/until the need +arises. + +I don't expect there to be much of anyone using SQLBase 7.5.1 at this +point (besides perhaps other CAM32 users), but if you do happen to +need additional functionality from this project or just have questions +or comments, feel free to drop me a line at lance@edbob.org. + +## Downloads + +The code is released under the [GNU General Public +License](http://www.gnu.org/licenses/gpl.html), version 3. + +It is available at [PyPI](http://pypi.python.org/pypi/SQLBase7-SA), so +the easiest way to get the package is with the command: + + # pip install SQLBase7-SA + +Again, this project is extremely specific to my needs, so I'm only +building eggs for Python 2.5 and 2.6 at this point. If you happen to +need something else then please contact me. + +Copyright © 2010 Lance Edgar diff --git a/setup.py b/setup.py index eb6ec34..75395a7 100644 --- a/setup.py +++ b/setup.py @@ -1,86 +1,86 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -################################################################################ -# -# SQLBase7-SA -- SQLAlchemy driver/dialect for Centura SQLBase v7 -# Copyright © 2010 Lance Edgar -# -# This file is part of SQLBase7-SA. -# -# SQLBase7-SA is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# SQLBase7-SA is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with SQLBase7-SA. If not, see . -# -################################################################################ - - -from setuptools import setup, find_packages - - -import os -execfile(os.path.join(os.path.dirname(__file__), 'sqlbase7_sa', '_version.py')) - - -setup( - name = 'SQLBase7-SA', - version = __version__, - author = 'Lance Edgar', - author_email = 'lance@edbob.org', - url = "http://sqlbase7-sa.edbob.org/", - license = "GNU GPL v3", - description = 'SQLAlchemy dialect for Centura SQLBase v7', - long_description = """ -SQLBase7-SA - SQLAlchemy dialect for Centura SQLBase v7 -------------------------------------------------------- - -This package provides a (possibly rudimentary) implementation -of a SQLAlchemy dialect for the Centura SQLBase database -engine. It is only intended (and known) to work with a very -specific version of this database, that version being 7.5.1. -""", - - classifiers = [ - 'Development Status :: 4 - Beta', - 'Environment :: Plugins', - 'Environment :: Win32 (MS Windows)', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: GNU General Public License (GPL)', - 'Natural Language :: English', - 'Operating System :: Microsoft :: Windows', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.5', - 'Programming Language :: Python :: 2.6', - 'Topic :: Database', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - - packages = find_packages(), - - install_requires = [ - 'SQLAlchemy', - ], - - entry_points = { - - # SQLAlchemy 0.5 - 'sqlalchemy.databases' : [ - 'sqlbase7 = sqlbase7_sa.sqlbase7_sa05:SQLBase7Dialect_SA05', - ], - - # SQLAlchemy 0.6 - 'sqlalchemy.dialects' : [ - 'sqlbase7 = sqlbase7_sa.sqlbase7_sa06:SQLBase7Dialect_SA06_pyodbc', - ], - }, - - test_suite = 'sqlbase7_sa.tests', - ) +#!/usr/bin/env python +# -*- coding: utf-8 -*- +################################################################################ +# +# SQLBase7-SA -- SQLAlchemy driver/dialect for Centura SQLBase v7 +# Copyright © 2010 Lance Edgar +# +# This file is part of SQLBase7-SA. +# +# SQLBase7-SA is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SQLBase7-SA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SQLBase7-SA. If not, see . +# +################################################################################ + + +from setuptools import setup, find_packages + + +import os +execfile(os.path.join(os.path.dirname(__file__), 'sqlbase7_sa', '_version.py')) + + +setup( + name = 'SQLBase7-SA', + version = __version__, + author = 'Lance Edgar', + author_email = 'lance@edbob.org', + url = "https://forgejo.wuttaproject.org/rattail/sqlbase7-sa", + license = "GNU GPL v3", + description = 'SQLAlchemy dialect for Centura SQLBase v7', + long_description = """ +SQLBase7-SA - SQLAlchemy dialect for Centura SQLBase v7 +------------------------------------------------------- + +This package provides a (possibly rudimentary) implementation +of a SQLAlchemy dialect for the Centura SQLBase database +engine. It is only intended (and known) to work with a very +specific version of this database, that version being 7.5.1. +""", + + classifiers = [ + 'Development Status :: 4 - Beta', + 'Environment :: Plugins', + 'Environment :: Win32 (MS Windows)', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: GNU General Public License (GPL)', + 'Natural Language :: English', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Topic :: Database', + 'Topic :: Software Development :: Libraries :: Python Modules', + ], + + packages = find_packages(), + + install_requires = [ + 'SQLAlchemy>0.5.2', + ], + + entry_points = { + + # SQLAlchemy 0.5 + 'sqlalchemy.databases' : [ + 'sqlbase7 = sqlbase7_sa.sqlbase7_sa05:SQLBase7Dialect_SA05', + ], + + # SQLAlchemy 0.6 + 'sqlalchemy.dialects' : [ + 'sqlbase7 = sqlbase7_sa.sqlbase7_sa06:SQLBase7Dialect_SA06_pyodbc', + ], + }, + + test_suite = 'sqlbase7_sa.tests', + ) diff --git a/sqlbase7_sa/_version.py b/sqlbase7_sa/_version.py index 729541a..5bb4149 100644 --- a/sqlbase7_sa/_version.py +++ b/sqlbase7_sa/_version.py @@ -23,4 +23,4 @@ ################################################################################ -__version__ = '0.1b1' +__version__ = '0.1b5' diff --git a/sqlbase7_sa/sqlbase7.py b/sqlbase7_sa/sqlbase7.py index 93c8ef3..690395c 100644 --- a/sqlbase7_sa/sqlbase7.py +++ b/sqlbase7_sa/sqlbase7.py @@ -26,6 +26,7 @@ from sqlalchemy.engine.default import DefaultDialect from sqlalchemy import types, and_ from sqlalchemy.sql.expression import Join +from sqlalchemy.sql import visitors, operators, ClauseElement import sqlalchemy @@ -56,7 +57,12 @@ class SQLBase7Compiler(CompilerBase): return self.process(join.left, **kwargs) + ", " + self.process(join.right, **kwargs) def visit_select(self, select, **kwargs): - froms = select._get_display_froms() + if self.stack and 'from' in self.stack[-1]: + existingfroms = self.stack[-1]['from'] + else: + existingfroms = None + + froms = select._get_display_froms(existingfroms) whereclause = self._get_join_whereclause(froms) if whereclause is not None: select = select.where(whereclause) @@ -71,7 +77,16 @@ class SQLBase7Compiler(CompilerBase): clauses = [] def visit_join(join): - clauses.append(join.onclause) + if join.isouter: + def visit_binary(binary): + if binary.operator == operators.eq: + if binary.left.table is join.right: + binary.left = _OuterJoinColumn(binary.left) + elif binary.right.table is join.right: + binary.right = _OuterJoinColumn(binary.right) + clauses.append(visitors.cloned_traverse(join.onclause, {}, {'binary':visit_binary})) + else: + clauses.append(join.onclause) for j in join.left, join.right: if isinstance(j, Join): visit_join(j) @@ -84,6 +99,16 @@ class SQLBase7Compiler(CompilerBase): return and_(*clauses) return None + def visit_outer_join_column(self, vc): + return self.process(vc.column) + "(+)" + + +class _OuterJoinColumn(ClauseElement): + __visit_name__ = 'outer_join_column' + + def __init__(self, column): + self.column = column + class SQLBase7Dialect(DefaultDialect):