diff --git a/COPYING.txt b/COPYING similarity index 100% rename from COPYING.txt rename to COPYING diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index c8a5f6c..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include COPYING.txt diff --git a/README.md b/README.md deleted file mode 100644 index c64eef9..0000000 --- a/README.md +++ /dev/null @@ -1,43 +0,0 @@ - -# 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 75395a7..1ead048 100644 --- a/setup.py +++ b/setup.py @@ -1,86 +1,54 @@ -#!/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', - ) +#!/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__, + description = 'SQLAlchemy driver/dialect for Centura SQLBase v7', + author = 'Lance Edgar', + author_email = 'lance@edbob.org', + + packages = find_packages(), + + install_requires = [ + 'SQLAlchemy>=0.5,<=0.6.99', + ], + + # This is only used by SQLAlchemy 0.6. + entry_points = { + 'sqlalchemy.dialects' : [ + 'sqlbase7 = sqlbase7_sa:base.dialect', + ], + }, + + test_suite = 'sqlbase7_sa.tests', + ) diff --git a/sqlbase7_sa/__init__.py b/sqlbase7_sa/__init__.py index a7c7be0..1c23c57 100644 --- a/sqlbase7_sa/__init__.py +++ b/sqlbase7_sa/__init__.py @@ -24,3 +24,25 @@ from sqlbase7_sa._version import __version__ + +import sqlalchemy +from pkg_resources import parse_version + + +if parse_version(sqlalchemy.__version__) <= parse_version('0.5.99'): + + # SQLAlchemy 0.5 doesn't support user-contributed dialects "directly" + # by way of setuptools entry points, so we must monkey-patch it in + # order to add ours. + import sqlalchemy.databases, sqlbase7_sa, sys + sqlalchemy.databases.sqlbase7 = sqlbase7_sa + sys.modules['sqlalchemy.databases.sqlbase7'] = sqlbase7_sa + + # SQLAlchemy will be expecting us to have a 'dialect' attribute. + import sqlbase7_sa.sqlbase7_sa05 + dialect = sqlbase7_sa.sqlbase7_sa05.SQLBase7Dialect_SA05 + +else: + # SQLAlchemy 0.6 is much nicer to play with. + import sqlbase7_sa.sqlbase7_sa06 + base = sqlbase7_sa.sqlbase7_sa06 diff --git a/sqlbase7_sa/_version.py b/sqlbase7_sa/_version.py index 5bb4149..181bbdb 100644 --- a/sqlbase7_sa/_version.py +++ b/sqlbase7_sa/_version.py @@ -23,4 +23,4 @@ ################################################################################ -__version__ = '0.1b5' +__version__ = '0.1a4' diff --git a/sqlbase7_sa/sqlbase7.py b/sqlbase7_sa/sqlbase7.py index 690395c..93c8ef3 100644 --- a/sqlbase7_sa/sqlbase7.py +++ b/sqlbase7_sa/sqlbase7.py @@ -26,7 +26,6 @@ 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 @@ -57,12 +56,7 @@ class SQLBase7Compiler(CompilerBase): return self.process(join.left, **kwargs) + ", " + self.process(join.right, **kwargs) def visit_select(self, select, **kwargs): - if self.stack and 'from' in self.stack[-1]: - existingfroms = self.stack[-1]['from'] - else: - existingfroms = None - - froms = select._get_display_froms(existingfroms) + froms = select._get_display_froms() whereclause = self._get_join_whereclause(froms) if whereclause is not None: select = select.where(whereclause) @@ -77,16 +71,7 @@ class SQLBase7Compiler(CompilerBase): clauses = [] def visit_join(join): - 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) + clauses.append(join.onclause) for j in join.left, join.right: if isinstance(j, Join): visit_join(j) @@ -99,16 +84,6 @@ 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): diff --git a/sqlbase7_sa/sqlbase7_sa05.py b/sqlbase7_sa/sqlbase7_sa05.py index 83a5b79..2b98c83 100644 --- a/sqlbase7_sa/sqlbase7_sa05.py +++ b/sqlbase7_sa/sqlbase7_sa05.py @@ -25,23 +25,16 @@ from sqlalchemy import types, Column, PrimaryKeyConstraint from sqlalchemy.sql.compiler import OPERATORS -from sqlalchemy.sql import operators as sql_operators +from sqlalchemy.sql import operators -from sqlbase7_sa.sqlbase7 import SQLBase7Compiler, SQLBase7Dialect +from sqlbase7_sa.sqlbase7 import SQLBase7Dialect -class SQLBase7Compiler_SA05(SQLBase7Compiler): - - operators = SQLBase7Compiler.operators.copy() - operators.update({ - sql_operators.ilike_op: lambda x, y, escape=None: "@lower(%s) LIKE @lower(%s)" % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''), - }) +OPERATORS[operators.ilike_op] = lambda x, y, escape=None: "@lower(%s) LIKE @lower(%s)" % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or '') class SQLBase7Dialect_SA05(SQLBase7Dialect): - statement_compiler = SQLBase7Compiler_SA05 - @classmethod def dbapi(cls): import pyodbc