Esempio n. 1
0
    def rewrite(self, sql):
        try:
            # silently fail index creation; indexes are passe
            if sql.startswith("CREATE INDEX"):
                return None

            self.parser = SqlParser()
            analysis = self.parser.parse(sql)
            if isinstance(analysis, InsertRow):
                return self.rewrite_INSERT(analysis)
            if isinstance(analysis, UpdateAnalysis):
                return self.rewrite_UPDATE(analysis)
            if isinstance(analysis, DeleteAnalysis):
                return self.rewrite_DELETE(analysis)
            if isinstance(analysis, SelectAnalysis):
                return self.rewrite_SELECT(analysis)
            if isinstance(analysis, TableSchema):
                return self.rewrite_CREATE_TABLE(analysis)
        except ParseException, err:
            raise SqlSyntaxError(err.message, line=err.line)
Esempio n. 2
0
class rewriter:
    """Rewrites SQL queries as SPARQL queries, using the dbns base uri for anything not explicitly aliased

    >>> sql = rewriter("urn:ponga:example/")
    >>> print sql.pk_uri("Story", 1)
    urn:ponga:example/story/1/
    """

    def __init__(self, dbns_uri, schema={}):
        self.base_uri = dbns_uri
        self.schema = schema

    def table_uri(self, table_name):
        """
        Convert a table name to a URI that represents that table.
        Tables that are not otherwise aliased become:
            BASE_URI/table

        >>> sql = rewriter("urn:ponga:example/")
        >>> print sql.table_uri("Story")
        urn:ponga:example/story
        """

        return self.base_uri + table_name.lower()

    def column_uri(self, table_name, column_name):
        """
        Convert a table and column name to a URI that represents that column.
        Columns that are not otherwise aliased become:
            BASE_URI/table.column

        >>> sql = rewriter("urn:ponga:example/")
        >>> print sql.column_uri("Story", "title")
        urn:ponga:example/story.title
        """
        return self.table_uri(table_name) + "." + column_name.lower()

    def pk_uri(self, table_name, pk_id):
        """
        Given a table and simple PK, work out the URI
            BASE_URI/table/id/
        """
        return "%s/%s/" % (self.table_uri(table_name), pk_id)

    def rewrite(self, sql):
        try:
            # silently fail index creation; indexes are passe
            if sql.startswith("CREATE INDEX"):
                return None

            self.parser = SqlParser()
            analysis = self.parser.parse(sql)
            if isinstance(analysis, InsertRow):
                return self.rewrite_INSERT(analysis)
            if isinstance(analysis, UpdateAnalysis):
                return self.rewrite_UPDATE(analysis)
            if isinstance(analysis, DeleteAnalysis):
                return self.rewrite_DELETE(analysis)
            if isinstance(analysis, SelectAnalysis):
                return self.rewrite_SELECT(analysis)
            if isinstance(analysis, TableSchema):
                return self.rewrite_CREATE_TABLE(analysis)
        except ParseException, err:
            raise SqlSyntaxError(err.message, line=err.line)
        except Exception:
            print "-" * 20
            print sql
            print "-" * 20
            raise