Skip to content

Commit

Permalink
implementando parser de package, package body e anonymous block
Browse files Browse the repository at this point in the history
  • Loading branch information
Wandenberg authored and Wandenberg Peixoto committed Jan 25, 2011
1 parent 345968d commit 5b02b3c
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 13 deletions.
12 changes: 2 additions & 10 deletions src/oracle.py
Expand Up @@ -18,11 +18,8 @@ def __init__(self, config=None, driver=None, get_pass=getpass, std_in=sys.stdin)
self.__db = config.get("db_name")
self.__version_table = config.get("db_version_table")

self.__re_objects = re.compile("(?ims)(?P<pre>.*?)(?P<principal>create[ ]*(or[ ]+replace[ ]*)?(trigger|function|procedure).*?)\n[ ]*/([ \n]+(?P<pos>.*)|$)")

self.__re_package = re.compile("(?ims)(?P<pre>.*?)(?P<principal>create[ ]*(or[ ]+replace[ ]*)?trigger.*?\n[ ]*)/[ \n]+(?P<pos>.*)")
self.__re_package_body = re.compile("(?ims)(?P<pre>.*?)(?P<principal>create[ ]*(or[ ]+replace[ ]*)?trigger.*?\n[ ]*)/[ \n]+(?P<pos>.*)")
self.__re_anonymous = re.compile("(?ims)(?P<pre>.*?)(?P<principal>create[ ]*(or[ ]+replace[ ]*)?trigger.*?\n[ ]*)/[ \n]+(?P<pos>.*)")
self.__re_objects = re.compile("(?ims)(?P<pre>.*?)(?P<principal>create[ \n\t\r]*(or[ \n\t\r]+replace[ \n\t\r]*)?(trigger|function|procedure|package|package body).*?)\n[ \n\t\r]*/([ \n\t\r]+(?P<pos>.*)|$)")
self.__re_anonymous = re.compile("(?ims)(?P<pre>.*?)(?P<principal>(declare[ \n\t\r]+.*?)?begin.*?\n[ \n\t\r]*)/([ \n\t\r]+(?P<pos>.*)|$)")

self.__driver = driver
if not driver:
Expand Down Expand Up @@ -80,12 +77,7 @@ def _parse_sql_statements(self, migration_sql):
all_statements = []
last_statement = ''

#import pdb; pdb.set_trace()
match_stmt = self.__re_objects.match(migration_sql)
if not match_stmt:
match_stmt = self.__re_package.match(migration_sql)
if not match_stmt:
match_stmt = self.__re_package_body.match(migration_sql)
if not match_stmt:
match_stmt = self.__re_anonymous.match(migration_sql)

Expand Down
84 changes: 81 additions & 3 deletions tests/oracle_test.py
Expand Up @@ -673,7 +673,7 @@ def test_it_should_parse_sql_statements(self):
FROM DUAL; \n\
dias_fim_mes := v; \n\
end; \n\
/ \n\
\t/ \n\
create OR RePLaCe TRIGGER \"FOLDER_TR\" \n\
BEFORE INSERT ON \"FOLDER\" \n\
FOR EACH ROW WHEN \n\
Expand All @@ -685,11 +685,52 @@ def test_it_should_parse_sql_statements(self):
INTO :new.\"FOLDER_ID\"\n\
FROM dual;\n\
EnD;\n\
/"
/\n\
CREATE OR REPLACE\t PACKAGE pkg_dbm \n\
AS \n\
FUNCTION getArea (i_rad NUMBER) \n\
RETURN NUMBER;\n\
PROCEDURE p_print (i_str1 VARCHAR2 := 'hello',\n\
i_str2 VARCHAR2 := 'world', \n\
i_end VARCHAR2 := '!');\n\
END;\n\
/ \n\
CREATE OR REPLACE\n PACKAGE BODY pkg_dbm \n\
AS \n\
FUNCTION getArea (i_rad NUMBER) \n\
RETURN NUMBER \n\
IS \n\
v_pi NUMBER := 3.14; \n\
BEGIN \n\
RETURN v_pi * (i_rad ** 2); \n\
END; \n\
PROCEDURE p_print (i_str1 VARCHAR2 := 'hello', i_str2 VARCHAR2 := 'world', i_end VARCHAR2 := '!') \n\
IS \n\
BEGIN \n\
DBMS_OUTPUT.put_line (i_str1 || ',' || i_str2 || i_end); \n\
END; \n\
END; \n\
/ \n\
DECLARE\n\
counter NUMBER(10,8) := 2; \r\n\
pi NUMBER(8,7) := 3.1415926; \n\
test NUMBER(10,8) NOT NULL := 10;\n\
BEGIN \n\
counter := pi/counter; \n\
pi := pi/3; \n\
dbms_output.put_line(counter); \n\
dbms_output.put_line(pi); \n\
END; \n\
/ \n\
BEGIN \n\
dbms_output.put_line('teste de bloco anonimo'); \n\
dbms_output.put_line(select 1 from dual); \n\
END; \n\
/ "

statements = oracle._parse_sql_statements(sql)

assert len(statements) == 6
assert len(statements) == 10
assert statements[0] == 'create table eggs'
assert statements[1] == 'drop table spam'
assert statements[2] == "CREATE OR REPLACE FUNCTION simple \n\
Expand Down Expand Up @@ -717,6 +758,43 @@ def test_it_should_parse_sql_statements(self):
INTO :new.\"FOLDER_ID\"\n\
FROM dual;\n\
EnD;'
assert statements[6] == "CREATE OR REPLACE\t PACKAGE pkg_dbm \n\
AS \n\
FUNCTION getArea (i_rad NUMBER) \n\
RETURN NUMBER;\n\
PROCEDURE p_print (i_str1 VARCHAR2 := 'hello',\n\
i_str2 VARCHAR2 := 'world', \n\
i_end VARCHAR2 := '!');\n\
END;"
assert statements[7] == "CREATE OR REPLACE\n PACKAGE BODY pkg_dbm \n\
AS \n\
FUNCTION getArea (i_rad NUMBER) \n\
RETURN NUMBER \n\
IS \n\
v_pi NUMBER := 3.14; \n\
BEGIN \n\
RETURN v_pi * (i_rad ** 2); \n\
END; \n\
PROCEDURE p_print (i_str1 VARCHAR2 := 'hello', i_str2 VARCHAR2 := 'world', i_end VARCHAR2 := '!') \n\
IS \n\
BEGIN \n\
DBMS_OUTPUT.put_line (i_str1 || ',' || i_str2 || i_end); \n\
END; \n\
END;"
assert statements[8] == "DECLARE\n\
counter NUMBER(10,8) := 2; \r\n\
pi NUMBER(8,7) := 3.1415926; \n\
test NUMBER(10,8) NOT NULL := 10;\n\
BEGIN \n\
counter := pi/counter; \n\
pi := pi/3; \n\
dbms_output.put_line(counter); \n\
dbms_output.put_line(pi); \n\
END;"
assert statements[9] == "BEGIN \n\
dbms_output.put_line('teste de bloco anonimo'); \n\
dbms_output.put_line(select 1 from dual); \n\
END;"

mox.VerifyAll()

Expand Down

0 comments on commit 5b02b3c

Please sign in to comment.