)]}'
{"oslo/db/sqlalchemy/test_base.py":[{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00fa2420c63141ed40406ca2ba72722070d66125","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        if self.FIXTURE.DRIVER and not utils.is_backend_avail(**credentials):"},{"line_number":147,"context_line":"            msg \u003d \u0027%s backend is not available.\u0027 % self.FIXTURE.DRIVER"},{"line_number":148,"context_line":"            return self.skip(msg)"},{"line_number":149,"context_line":"        engine \u003d sqlalchemy.create_engine("},{"line_number":150,"context_line":"            utils.get_connect_string(**credentials))"},{"line_number":151,"context_line":"        if not utils.create_database_permission_exist(engine):"},{"line_number":152,"context_line":"            self.fail(\"The user doesn\u0027t have permission to create a database\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_21786d8e","line":149,"updated":"2014-07-25 13:25:32.000000000","message":"An engine created in line 53, there is no need to create another engine.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"82f9fbef3fea4081d600fcca4a9ba643b713eaeb","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        if self.FIXTURE.DRIVER and not utils.is_backend_avail(**credentials):"},{"line_number":147,"context_line":"            msg \u003d \u0027%s backend is not available.\u0027 % self.FIXTURE.DRIVER"},{"line_number":148,"context_line":"            return self.skip(msg)"},{"line_number":149,"context_line":"        engine \u003d sqlalchemy.create_engine("},{"line_number":150,"context_line":"            utils.get_connect_string(**credentials))"},{"line_number":151,"context_line":"        if not utils.create_database_permission_exist(engine):"},{"line_number":152,"context_line":"            self.fail(\"The user doesn\u0027t have permission to create a database\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_fafa9ab8","line":149,"in_reply_to":"baada198_21786d8e","updated":"2014-07-25 14:27:27.000000000","message":"First of all we have to check engine on possibility to create databases.\nOtherwise we get strange error message.\nSo i haven\u0027t any idea how to proceed.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"d01334a8e908522f42e7ae92c39ac5e2788dd2a2","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        if self.FIXTURE.DRIVER and not utils.is_backend_avail(**credentials):"},{"line_number":147,"context_line":"            msg \u003d \u0027%s backend is not available.\u0027 % self.FIXTURE.DRIVER"},{"line_number":148,"context_line":"            return self.skip(msg)"},{"line_number":149,"context_line":"        engine \u003d sqlalchemy.create_engine("},{"line_number":150,"context_line":"            utils.get_connect_string(**credentials))"},{"line_number":151,"context_line":"        if not utils.create_database_permission_exist(engine):"},{"line_number":152,"context_line":"            self.fail(\"The user doesn\u0027t have permission to create a database\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_5877e03a","line":149,"in_reply_to":"baada198_fafa9ab8","updated":"2014-07-28 10:07:03.000000000","message":"Totally agree with you about necessity to check engine. But, at the moment of setUp execution we have an available engine instance among instance attributes.\n\nofftop:\nWe are both in Kharkov Mirantis office, you can walk to me to discuss the approach.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"}],"oslo/db/sqlalchemy/utils.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"a17d6c43bd24e8560a68e8d3f3de6e829c4824aa","unresolved":false,"context_lines":[{"line_number":708,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":709,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\" % user).first()[0]"},{"line_number":710,"context_line":"    elif backend \u003d\u003d \u0027mysql\u0027:"},{"line_number":711,"context_line":"        grantee \u003d \"\\\"\u0027\" + user + \"\u0027@\u0027localhost\u0027\\\"\""},{"line_number":712,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":713,"context_line":"                              \"information_schema.USER_PRIVILEGES \""},{"line_number":714,"context_line":"                              \"where GRANTEE \u003d %s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ba83f053","line":711,"updated":"2014-07-24 13:42:52.000000000","message":"what is the reason - to have this variable?","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"d85f160ce198918bf2aa3e1c1a234a7b17853a2c","unresolved":false,"context_lines":[{"line_number":708,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":709,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\" % user).first()[0]"},{"line_number":710,"context_line":"    elif backend \u003d\u003d \u0027mysql\u0027:"},{"line_number":711,"context_line":"        grantee \u003d \"\\\"\u0027\" + user + \"\u0027@\u0027localhost\u0027\\\"\""},{"line_number":712,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":713,"context_line":"                              \"information_schema.USER_PRIVILEGES \""},{"line_number":714,"context_line":"                              \"where GRANTEE \u003d %s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_8e87cf11","line":711,"in_reply_to":"baada198_ba83f053","updated":"2014-07-24 15:02:00.000000000","message":"Done","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"a17d6c43bd24e8560a68e8d3f3de6e829c4824aa","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                              \"where GRANTEE \u003d %s \""},{"line_number":715,"context_line":"                              \"and privilege_type \u003d \u0027create\u0027\""},{"line_number":716,"context_line":"                              % grantee).rowcount \u003e 0"},{"line_number":717,"context_line":"    else:"},{"line_number":718,"context_line":"        return True"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_5a8e547a","line":717,"updated":"2014-07-24 13:42:52.000000000","message":"this seems to be untested","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"d85f160ce198918bf2aa3e1c1a234a7b17853a2c","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                              \"where GRANTEE \u003d %s \""},{"line_number":715,"context_line":"                              \"and privilege_type \u003d \u0027create\u0027\""},{"line_number":716,"context_line":"                              % grantee).rowcount \u003e 0"},{"line_number":717,"context_line":"    else:"},{"line_number":718,"context_line":"        return True"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ae8c9336","line":717,"in_reply_to":"baada198_5a8e547a","updated":"2014-07-24 15:02:00.000000000","message":"Done","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"a17d6c43bd24e8560a68e8d3f3de6e829c4824aa","unresolved":false,"context_lines":[{"line_number":715,"context_line":"                              \"and privilege_type \u003d \u0027create\u0027\""},{"line_number":716,"context_line":"                              % grantee).rowcount \u003e 0"},{"line_number":717,"context_line":"    else:"},{"line_number":718,"context_line":"        return True"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"def get_db_connection_info(conn_pieces):"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_baea100c","line":718,"updated":"2014-07-24 13:42:52.000000000","message":"should we raise an ValueError here?","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"d85f160ce198918bf2aa3e1c1a234a7b17853a2c","unresolved":false,"context_lines":[{"line_number":715,"context_line":"                              \"and privilege_type \u003d \u0027create\u0027\""},{"line_number":716,"context_line":"                              % grantee).rowcount \u003e 0"},{"line_number":717,"context_line":"    else:"},{"line_number":718,"context_line":"        return True"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"def get_db_connection_info(conn_pieces):"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_0e7bbf29","line":718,"in_reply_to":"baada198_baea100c","updated":"2014-07-24 15:02:00.000000000","message":"Done","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"c221effcad3b5f3e7d1f1ed709b57c7194d8f7ca","unresolved":false,"context_lines":[{"line_number":707,"context_line":"    if backend not in [\u0027postgresql\u0027, \u0027mysql\u0027]:"},{"line_number":708,"context_line":"        raise ValueError(\"The %s backend is not supported\" % backend)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"    engine \u003d sqlalchemy.create_engine(connect_uri)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"    if backend \u003d\u003d \u0027postgresql\u0027:"},{"line_number":713,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_7e8e9ed2","line":710,"updated":"2014-07-24 19:10:02.000000000","message":"why are we reconnecting?  this should accept an existing engine.  we should always use oslo.db.session.create_engine() and we should encourage a Python process to only call it exactly once.","commit_id":"37d992405ba42ab3c646cf0e05a56b86f5043c81"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"be3366decdd6215fd0943a4f8d1a4088a7e3b6b9","unresolved":false,"context_lines":[{"line_number":707,"context_line":"    if backend not in [\u0027postgresql\u0027, \u0027mysql\u0027]:"},{"line_number":708,"context_line":"        raise ValueError(\"The %s backend is not supported\" % backend)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"    engine \u003d sqlalchemy.create_engine(connect_uri)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"    if backend \u003d\u003d \u0027postgresql\u0027:"},{"line_number":713,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_a912bbfa","line":710,"in_reply_to":"baada198_7e8e9ed2","updated":"2014-07-24 22:52:05.000000000","message":"Thanks for your review.\nDo you mean that i should call create_database_permission_exist with existing engine? And, if so, where i should create engines for testing purposes -- in the setUp() function of testclass or elswhere?","commit_id":"37d992405ba42ab3c646cf0e05a56b86f5043c81"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"65ab2af3d6a8110f92e54529ffb4c38b3531cb4a","unresolved":false,"context_lines":[{"line_number":707,"context_line":"    if backend not in [\u0027postgresql\u0027, \u0027mysql\u0027]:"},{"line_number":708,"context_line":"        raise ValueError(\"The %s backend is not supported\" % backend)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"    engine \u003d sqlalchemy.create_engine(connect_uri)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"    if backend \u003d\u003d \u0027postgresql\u0027:"},{"line_number":713,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_cf360fb4","line":710,"in_reply_to":"baada198_a912bbfa","updated":"2014-07-25 00:16:06.000000000","message":"if you\u0027re in an oslo.db test case, it has an engine, self.engine.   I think the base class is DbTest or something similar, take a look at the other tests to see.","commit_id":"37d992405ba42ab3c646cf0e05a56b86f5043c81"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00fa2420c63141ed40406ca2ba72722070d66125","unresolved":false,"context_lines":[{"line_number":696,"context_line":""},{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name not in [\u0027postgresql\u0027, \u0027mysql\u0027]:"},{"line_number":699,"context_line":"        raise ValueError(\"The %s backend is not supported\" % engine.name)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_4177218e","line":699,"updated":"2014-07-25 13:25:32.000000000","message":"Number of other backends will be supported pretty soon, furthermore sqlite is supported. And if this feature is really needed, it shouldn\u0027t be contained by this function.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00fa2420c63141ed40406ca2ba72722070d66125","unresolved":false,"context_lines":[{"line_number":698,"context_line":"    if engine.name not in [\u0027postgresql\u0027, \u0027mysql\u0027]:"},{"line_number":699,"context_line":"        raise ValueError(\"The %s backend is not supported\" % engine.name)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":703,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\""},{"line_number":704,"context_line":"                              % engine.url.username).first()[0]"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_4153a1dd","line":701,"updated":"2014-07-25 13:25:32.000000000","message":"nit: better you create an sql row and execute it in a single place. Just more comfortable to read.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00fa2420c63141ed40406ca2ba72722070d66125","unresolved":false,"context_lines":[{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":703,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\""},{"line_number":704,"context_line":"                              % engine.url.username).first()[0]"},{"line_number":705,"context_line":"    else:"},{"line_number":706,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":707,"context_line":"                              \"information_schema.USER_PRIVILEGES \""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_01a0c9a3","line":704,"updated":"2014-07-25 13:25:32.000000000","message":"I believe it is not needed to use different functions on a query result object. Anyway you should check the result for True/False and return Boolean value. Boolean is expected from check functions.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"08a05c95ac882d7fec04b7d452f0776b73fa1a05","unresolved":false,"context_lines":[{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":703,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\""},{"line_number":704,"context_line":"                              % engine.url.username).first()[0]"},{"line_number":705,"context_line":"    else:"},{"line_number":706,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":707,"context_line":"                              \"information_schema.USER_PRIVILEGES \""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_f5de2b69","line":704,"in_reply_to":"baada198_01a0c9a3","updated":"2014-07-25 14:50:08.000000000","message":"These queries return different result, so i can\u0027t use the same function on it.\nFirst can return row with true or false, second -- row with \u0027create_db\u0027 or empty.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"c408948b3defbc9d8fa4bb9ee20933e86474aad5","unresolved":false,"context_lines":[{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":703,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\""},{"line_number":704,"context_line":"                              % engine.url.username).first()[0]"},{"line_number":705,"context_line":"    else:"},{"line_number":706,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":707,"context_line":"                              \"information_schema.USER_PRIVILEGES \""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_ac3d1f90","line":704,"in_reply_to":"baada198_38ca2c4f","updated":"2014-07-28 11:39:48.000000000","message":"Here are you go with pretty similar to psql query:\n\nSELECT create_priv FROM mysql.db where user \u003d \u0027openstack_citest\u0027 and host \u003d \u0027localhost\u0027;","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"d01334a8e908522f42e7ae92c39ac5e2788dd2a2","unresolved":false,"context_lines":[{"line_number":701,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":702,"context_line":"        return engine.execute(\"SELECT rolcreatedb from pg_roles \""},{"line_number":703,"context_line":"                              \"where rolname \u003d \u0027%s\u0027\""},{"line_number":704,"context_line":"                              % engine.url.username).first()[0]"},{"line_number":705,"context_line":"    else:"},{"line_number":706,"context_line":"        return engine.execute(\"SELECT * FROM  \""},{"line_number":707,"context_line":"                              \"information_schema.USER_PRIVILEGES \""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_38ca2c4f","line":704,"in_reply_to":"baada198_f5de2b69","updated":"2014-07-28 10:07:03.000000000","message":"Let me try it, I believe we can avoid this behavior.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2dab28a589796c302815b10337cba06555271955","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_a245ff70","line":700,"updated":"2014-07-29 08:42:01.000000000","message":"it\u0027s a bad idea - to use string formatting to build SQL query","commit_id":"81ff09641ffb08adfcd746425a7f4e948b7c4284"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"70223647971b272aa9e37d4b303a229a3cb18d24","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_b807ee1d","line":700,"in_reply_to":"baada198_a245ff70","updated":"2014-07-29 09:25:32.000000000","message":"why?","commit_id":"81ff09641ffb08adfcd746425a7f4e948b7c4284"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2dab28a589796c302815b10337cba06555271955","unresolved":false,"context_lines":[{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"},{"line_number":704,"context_line":"                % engine.url.username"},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    result \u003d engine.execute(query)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0254eb20","line":703,"updated":"2014-07-29 08:42:01.000000000","message":"ditto","commit_id":"81ff09641ffb08adfcd746425a7f4e948b7c4284"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2dab28a589796c302815b10337cba06555271955","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    result \u003d engine.execute(query)"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    return result.first()[0] in [True, \u0027Y\u0027]"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"def get_db_connection_info(conn_pieces):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_751c7f67","line":708,"updated":"2014-07-29 08:42:01.000000000","message":"nit: result.first()[0] can be replaced with result.scalar()\n\nAlso, is there a better idea - to make this comparison?","commit_id":"81ff09641ffb08adfcd746425a7f4e948b7c4284"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"70223647971b272aa9e37d4b303a229a3cb18d24","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    result \u003d engine.execute(query)"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    return result.first()[0] in [True, \u0027Y\u0027]"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"def get_db_connection_info(conn_pieces):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_3814be4f","line":708,"in_reply_to":"baada198_751c7f67","updated":"2014-07-29 09:25:32.000000000","message":"no, i haven\u0027t the one.","commit_id":"81ff09641ffb08adfcd746425a7f4e948b7c4284"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"7948398a845d655660b81230db5fb4411f0e8582","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_bcd410ea","line":700,"updated":"2014-07-30 10:20:28.000000000","message":"See http://en.wikipedia.org/wiki/SQL_injection","commit_id":"49f16ae89c56ee7bee620767f576d05a4a31c326"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"dd067c10edba98c7d85068097933b335dd4113eb","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_d7cc3dc1","line":700,"in_reply_to":"baada198_978c8582","updated":"2014-07-30 10:36:55.000000000","message":"I agree, that it\u0027s not a big deal in this case, but anyway, can you please fix it?","commit_id":"49f16ae89c56ee7bee620767f576d05a4a31c326"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"0a648cdde9f028ac30ba4fb0d9a11293f3d5b4a2","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_978c8582","line":700,"in_reply_to":"baada198_bcd410ea","updated":"2014-07-30 10:35:25.000000000","message":"Is it really possible to get injection in this case?\nWe have working engine thus we have correct username. Am i right?","commit_id":"49f16ae89c56ee7bee620767f576d05a4a31c326"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"55041bcef74e0c43aa83aef3d7d1df762acc5b84","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_dd9ff400","line":700,"in_reply_to":"baada198_cfdd8143","updated":"2014-07-30 16:15:26.000000000","message":"Though I was wrong and we can get incorrect behavior if username will contain single quotes.","commit_id":"49f16ae89c56ee7bee620767f576d05a4a31c326"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"2976c756711306ed487014058144d7cdf7b7c184","unresolved":false,"context_lines":[{"line_number":697,"context_line":"def create_database_permission_exist(engine):"},{"line_number":698,"context_line":"    if engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d \u0027%s\u0027\" % engine.url.username"},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d \u0027%s\u0027 and host \u003d \u0027localhost\u0027\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_cfdd8143","line":700,"in_reply_to":"baada198_d7cc3dc1","updated":"2014-07-30 14:07:24.000000000","message":"I\u0027m not sure about necessity to fix it.\nsee http://legacy.python.org/dev/peps/pep-0249/#paramstyle","commit_id":"49f16ae89c56ee7bee620767f576d05a4a31c326"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"a669aa51281d9e155867813d069244ec3084ea51","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d %s\""},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d %s and host \u003d \u0027localhost\u0027\""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"    result \u003d engine.execute(query, engine.url.username)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_aea1e13b","line":702,"updated":"2014-08-01 09:28:38.000000000","message":"not sure why we use mysql-specific queries for all other backends except postgresql","commit_id":"59e27d773d1810fb911a0703901ca7d691c15454"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"0f2775a901b2b8c422d312bd378317e543197d00","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        query \u003d \"select rolcreatedb from pg_roles \" \\"},{"line_number":700,"context_line":"                \"where rolname \u003d %s\""},{"line_number":701,"context_line":"    else:"},{"line_number":702,"context_line":"        query \u003d \"select create_priv from mysql.user \" \\"},{"line_number":703,"context_line":"                \"where user \u003d %s and host \u003d \u0027localhost\u0027\""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"    result \u003d engine.execute(query, engine.url.username)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_34419e0a","line":702,"in_reply_to":"baada198_aea1e13b","updated":"2014-08-01 10:14:01.000000000","message":"seems that i use raw sql for all backends. \ncan you elaborate your question?","commit_id":"59e27d773d1810fb911a0703901ca7d691c15454"}],"tests/sqlalchemy/test_utils.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"a17d6c43bd24e8560a68e8d3f3de6e829c4824aa","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        res \u003d utils.create_database_permission_exist("},{"line_number":701,"context_line":"            \u0027mysql\u0027,"},{"line_number":702,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":703,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":704,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":705,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_9a72acae","line":702,"updated":"2014-07-24 13:42:52.000000000","message":"can we use different names for these arguments?","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":12363,"name":"Oleksii Chuprykov","email":"a.chuprikoff@gmail.com","username":"ochuprykov"},"change_message_id":"d85f160ce198918bf2aa3e1c1a234a7b17853a2c","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        res \u003d utils.create_database_permission_exist("},{"line_number":701,"context_line":"            \u0027mysql\u0027,"},{"line_number":702,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":703,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":704,"context_line":"            \u0027openstack_citest\u0027,"},{"line_number":705,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ae3573f8","line":702,"in_reply_to":"baada198_9a72acae","updated":"2014-07-24 15:02:00.000000000","message":"user(3rd parameter) must be \u0027openstack_citest\u0027 as we have assert on it","commit_id":"0a4e88cc248820ded32fdb259391bcace2f5e1a8"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00fa2420c63141ed40406ca2ba72722070d66125","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        res \u003d utils.create_database_permission_exist(engine)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        self.assertTrue(res)"},{"line_number":701,"context_line":"        engine.execute.assert_called_with("},{"line_number":702,"context_line":"            \u0027SELECT * FROM  information_schema.USER_PRIVILEGES where \u0027"},{"line_number":703,"context_line":"            \u0027GRANTEE \u003d \"\\\u0027openstack_citest\\\u0027@\\\u0027localhost\\\u0027\" and \u0027"},{"line_number":704,"context_line":"            \u0027privilege_type \u003d \\\u0027create\\\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_84114755","line":701,"updated":"2014-07-25 13:25:32.000000000","message":"I think you should mock query result or even test it with DbTestCase and real backend. Because of you use raw sql and we must be sure that it is correct.","commit_id":"ef7dbf223d77ae7290e4770d427b27faa313cbd8"}]}
