]> git.phdru.name Git - sqlconvert.git/commitdiff
Use SQLObject for string quoting
authorOleg Broytman <phd@phdru.name>
Sun, 25 Sep 2016 15:14:47 +0000 (18:14 +0300)
committerOleg Broytman <phd@phdru.name>
Sun, 25 Sep 2016 15:16:15 +0000 (18:16 +0300)
ChangeLog
requirements.txt
requirements_dev.txt
setup.py
sqlconvert/process_tokens.py
tests/test_mysql2postgres.py
tests/test_tokens.py

index a15fe3699b373df4af470258439aac018a0a015d..cd3988832ded3b5886894147e9d1cd58e4c44ab7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,7 +6,9 @@ Version 0.0.6 (2016-09-??)
 
    Unescape strings. Add a test for Postgres.
 
-   Use pytest, coverage, tox and SQLObject for testing.
+   Use SQLObject for string quoting and connection handling for tests.
+
+   Use pytest, coverage and tox for testing.
 
 Version 0.0.5 (2016-09-07)
 
index f1bf8b4457acfd2f1c4fe5d4b347718fa9623ec8..930537a678318ed3b84517a6d36baf0dd1e60673 100644 (file)
@@ -4,5 +4,7 @@
 
 argparse; python_version == '2.6'
 sqlparse
+SQLObject>=2.2.1; python_version >= '2.6' and python_version < '3.0'
+SQLObject>=3.0.0; python_version >= '3.4'
 m_lib>=2.0; python_version >= '2.6' and python_version < '3.0'
 m_lib>=3.0; python_version >= '3.4'
index 18f30f86432ac4d5f45f3dd24ff504890170b931..ca2ff5d62c0481b2a56e73b65df745bfdd065c5b 100644 (file)
@@ -3,5 +3,3 @@
 pytest
 pytest-cov
 tox >= 1.8
-SQLObject>=2.2.1; python_version >= '2.6' and python_version < '3.0'
-SQLObject>=3.0.0; python_version >= '3.4'
index aeb04b0f476d882bb4d021c74f9ddc31e5ffa34e..d25281f63b4ade024d448895a1c9a699146824c3 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -45,5 +45,5 @@ setup(name='sqlconvert',
       packages=['sqlconvert'],
       package_data={},
       scripts=['scripts/mysql2sql'],
-      requires=['sqlparse', 'm_lib'],
+      requires=['sqlparse', 'SQLObject', 'm_lib'],
       )
index b1c26022f7ad2adbecaf943fee47cd74c7794a7d..6bd618b6af1ce33f14588d0d6c4f11323bfe37af 100644 (file)
@@ -1,4 +1,5 @@
 
+from sqlobject.converters import sqlrepr
 from sqlparse import parse
 from sqlparse.compat import PY3
 from sqlparse import tokens as T
@@ -19,6 +20,15 @@ def is_newline_statement(statement):
     return True
 
 
+def escape_strings(token_list, dbname):
+    """Escape strings"""
+    for token in token_list.flatten():
+        if token.ttype is T.String.Single:
+            value = token.value[1:-1]  # unquote by removing apostrophes
+            value = sqlrepr(value, dbname)
+            token.normalized = token.value = value
+
+
 if PY3:
     xrange = range
 
index 971970cdd612306d76f90468fc367e4a8d6f3cb5..6782c5408eeef1b33335339da8e32a7ac9126ed8 100644 (file)
@@ -4,6 +4,7 @@ import pytest
 
 from sqlconvert.print_tokens import tlist2str
 from sqlconvert.process_mysql import unescape_strings
+from sqlconvert.process_tokens import escape_strings
 
 connection = getConnection()
 pytestmark = pytest.mark.skipif(connection.dbName != "postgres",
@@ -22,9 +23,10 @@ def test_mysql2postgres_string():
     parsed = parse("insert into test (id, test_str) values "
                    "(1, '\"te\\'st\\\"\\n')")[0]
     unescape_strings(parsed)
+    escape_strings(parsed, 'postgres')
     query = tlist2str(parsed)
     assert query == u"INSERT INTO test (id, test_str) VALUES " \
-                    u"(1, '\"te''st\"\n')"
+                    u"(1, E'\"te''st\"\\n')"
     connection.query(query)
     test_str = connection.queryOne("SELECT test_str FROM test WHERE id=1")[0]
     assert test_str == u"\"te'st\"\n"
index d537d73f068291c2eb3d9a13773ba31c9cccf5ef..4e48ab040e00c4212225f4415c467a776c8ac00a 100644 (file)
@@ -6,6 +6,7 @@ from sqlconvert.print_tokens import tlist2str
 from sqlconvert.process_mysql import remove_directive_tokens, \
         is_directive_statement, requote_names, unescape_strings, \
         process_statement
+from sqlconvert.process_tokens import escape_strings
 
 
 def test_encoding():
@@ -42,10 +43,26 @@ def test_requote():
     assert query == u'SELECT * FROM "T"'
 
 
-def test_string():
+def test_unescape_string():
     parsed = parse("insert into test values ('\"te\\'st\\\"\\n')")[0]
     unescape_strings(parsed)
     query = tlist2str(parsed)
+    assert query == u"INSERT INTO test VALUES ('\"te'st\"\n')"
+
+
+def test_escape_string_postgres():
+    parsed = parse("insert into test values ('\"te\\'st\\\"\\n')")[0]
+    unescape_strings(parsed)
+    escape_strings(parsed, 'postgres')
+    query = tlist2str(parsed)
+    assert query == u"INSERT INTO test VALUES (E'\"te''st\"\\n')"
+
+
+def test_escape_string_sqlite():
+    parsed = parse("insert into test values ('\"te\\'st\\\"\\n')")[0]
+    unescape_strings(parsed)
+    escape_strings(parsed, 'sqlite')
+    query = tlist2str(parsed)
     assert query == u"INSERT INTO test VALUES ('\"te''st\"\n')"