)]}'
{"oslo/db/exception.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended for determination and display of specific database"},{"line_number":20,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":21,"context_line":"original exception as positional argument and display it at rising."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_cedbbceb","line":19,"updated":"2014-06-02 13:31:34.000000000","message":"I\u0027m a little bit worried this goes into a wrong direction. Exceptions aren\u0027t about displaying errors to users. The main purpose of using exception in Python (or any other language) is to make it possible to pass enough information about the error up through the call stack to the point where you can actually decide what to do with the error.\n\nSo the problem we\u0027re solving here is that Python DB API drivers (e.g. psycopg2 and MySQL-Python) don\u0027t report errors in easy to use form: e.g. when an unique constraint is violated, they won\u0027t tell you which column contains a duplicate value, but rather return RDBMS error message as a string. SQLAlchemy tells us this is not its business either. oslo.db is trying (to some extent) to ease handling of such errors for developers and parses DB API specific error messages and expose parsed data as exception attributes.","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended for determination and display of specific database"},{"line_number":20,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":21,"context_line":"original exception as positional argument and display it at rising."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_e77ab7b8","line":19,"in_reply_to":"1ae5cdf2_cedbbceb","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":35,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"},{"line_number":36,"context_line":"or does not significant."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Please use only database related custom exceptions with database manipulations."},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_910ab51f","line":38,"updated":"2014-06-02 13:31:34.000000000","message":"Perhaps, we should clarify that by \u0027use\u0027 we mean \u0027except\u0027, but not raise (as this seems to be a purely oslo.db task).","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":35,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"},{"line_number":36,"context_line":"or does not significant."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Please use only database related custom exceptions with database manipulations."},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_c77f7ba9","line":38,"in_reply_to":"1ae5cdf2_910ab51f","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    \"\"\"Base exception for all custom database exceptions."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    Wraps an implementation specific exception."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_8e361451","line":50,"updated":"2014-06-02 13:31:34.000000000","message":"This is not entirely correct: most exception we wrap in oslo.db code are already sqlalchemy wrappers for DB API drivers exceptions.\n\nPerhaps, it\u0027s just worth mentioning that inner_exception attribute will store the original exception.","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    \"\"\"Base exception for all custom database exceptions."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    Wraps an implementation specific exception."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_a7742fcf","line":50,"in_reply_to":"1ae5cdf2_8e361451","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    \"\"\"Duplicate entry at unique column error."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    Raises when made an attempt to write to a unique column the same entry as"},{"line_number":63,"context_line":"    existing one. :attr: `columns` available on an instance of the exception"},{"line_number":64,"context_line":"    and could be used at error handling::"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_b15b312d","line":62,"updated":"2014-06-02 13:31:34.000000000","message":"Here and below, use passive voice (is raised, raised).\n\nNote that unique constraints can also be compound (contain more than one column)","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    \"\"\"Duplicate entry at unique column error."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    Raises when made an attempt to write to a unique column the same entry as"},{"line_number":63,"context_line":"    existing one. :attr: `columns` available on an instance of the exception"},{"line_number":64,"context_line":"    and could be used at error handling::"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_476c4b08","line":62,"in_reply_to":"1ae5cdf2_b15b312d","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":66,"context_line":"       try:"},{"line_number":67,"context_line":"           instance_type_ref.save()"},{"line_number":68,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":69,"context_line":"           if \u0027colnme\u0027 in e.columns:"},{"line_number":70,"context_line":"               # Proceed error."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_d196fd93","line":69,"updated":"2014-06-02 13:31:34.000000000","message":"colme -\u003e something reasonable here :)","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":66,"context_line":"       try:"},{"line_number":67,"context_line":"           instance_type_ref.save()"},{"line_number":68,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":69,"context_line":"           if \u0027colnme\u0027 in e.columns:"},{"line_number":70,"context_line":"               # Proceed error."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_a40d033a","line":69,"in_reply_to":"1ae5cdf2_d196fd93","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":67,"context_line":"           instance_type_ref.save()"},{"line_number":68,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":69,"context_line":"           if \u0027colnme\u0027 in e.columns:"},{"line_number":70,"context_line":"               # Proceed error."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __init__(self, columns\u003d[], inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_917d5571","line":70,"updated":"2014-06-02 13:31:34.000000000","message":"proceed -\u003e handle/process","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":67,"context_line":"           instance_type_ref.save()"},{"line_number":68,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":69,"context_line":"           if \u0027colnme\u0027 in e.columns:"},{"line_number":70,"context_line":"               # Proceed error."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __init__(self, columns\u003d[], inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_a7ad0f33","line":70,"in_reply_to":"1ae5cdf2_917d5571","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1dc71d6e539886f070edfa7dee3ea2a1adf55420","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    \"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    message \u003d _(\"Invalid Parameter: \""},{"line_number":99,"context_line":"                \"Unicode is not supported by the current database.\")"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class DbMigrationError(DBError):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_31680187","line":99,"updated":"2014-06-02 13:31:34.000000000","message":"Something tells me this is a lie :) I bet, sqlite/mysql/postgresql work with unicode just fine. Just looking  at how this particular exception is used https://github.com/openstack/oslo.db/blob/master/oslo/db/sqlalchemy/session.py#L440, I think we mislead the users/developers: this error is probably just caused by the fact we are passing a unicode string and don\u0027t tell the DB API driver what encoding to use when connection to a DB.","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"592b79dba4811f6795a43325957b138242f86e15","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    \"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    message \u003d _(\"Invalid Parameter: \""},{"line_number":99,"context_line":"                \"Unicode is not supported by the current database.\")"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class DbMigrationError(DBError):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_47b52b7c","line":99,"in_reply_to":"1ae5cdf2_31680187","updated":"2014-06-10 08:06:02.000000000","message":"Done","commit_id":"d538f41b5b480eae5d7ba6d6c480db01d7584472"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e96d57cc","line":19,"updated":"2014-06-27 21:27:35.000000000","message":"I think you want to say \"determine the causes of\" here.","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_6a331514","line":19,"in_reply_to":"1ae5cdf2_e96d57cc","updated":"2014-07-04 15:28:35.000000000","message":"Done","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"},{"line_number":23,"context_line":"debug."}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e9a47708","line":20,"updated":"2014-06-27 21:27:35.000000000","message":"I\u0027m not quite sure what \"when significant to except\" means here. I think you mean that this module provides more generic exceptions than the database-specific driver library, and so users of oslo.db can catch these no matter which database the application is using. Is that right?","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\"DB related custom exceptions."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"},{"line_number":23,"context_line":"debug."}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_8a3869f0","line":20,"in_reply_to":"1ae5cdf2_e9a47708","updated":"2014-07-04 15:28:35.000000000","message":"Hm, I have read my message and I didn\u0027t understood what did I meant too : )","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"},{"line_number":23,"context_line":"debug."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_29aadfd1","line":21,"updated":"2014-06-27 21:27:35.000000000","message":"\"Most of the exceptions are wrappers.\"","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Custom exceptions intended to determine of specific database"},{"line_number":20,"context_line":"errors. It can be useful when significant to except concrete type of database"},{"line_number":21,"context_line":"errors. Most of the exceptions is wrappers. Wrapper exceptions take an"},{"line_number":22,"context_line":"original exception as positional argument and keep it for purposes of deeper"},{"line_number":23,"context_line":"debug."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_25b78e3b","line":21,"in_reply_to":"1ae5cdf2_29aadfd1","updated":"2014-07-04 15:28:35.000000000","message":"Done","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"This is useful to determine more specific error cases further at execution,"},{"line_number":34,"context_line":"when you know the cause of a potential error raising for sure, but an original"},{"line_number":35,"context_line":"exception is too common. Wrapper exceptions takes care about original error"},{"line_number":36,"context_line":"message displaying to not to loose low level cause of an error."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e97b9777","line":35,"updated":"2014-06-27 21:27:35.000000000","message":"By \"too common\" do you mean that the exception is too \"generic\" so we can\u0027t tell what the actual exception is without looking at the message?","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"This is useful to determine more specific error cases further at execution,"},{"line_number":34,"context_line":"when you know the cause of a potential error raising for sure, but an original"},{"line_number":35,"context_line":"exception is too common. Wrapper exceptions takes care about original error"},{"line_number":36,"context_line":"message displaying to not to loose low level cause of an error."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_45d642f2","line":35,"in_reply_to":"1ae5cdf2_e97b9777","updated":"2014-07-04 15:28:35.000000000","message":"Done","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":36,"context_line":"message displaying to not to loose low level cause of an error."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"},{"line_number":39,"context_line":"or does not significant."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Please use only database related custom exceptions with database manipulations"},{"line_number":42,"context_line":"with `try/except` statement. This is required for consistent handling of"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_a9d34f5d","line":39,"updated":"2014-06-27 21:27:35.000000000","message":"I think you want to say this like:\n\n  Wrapper exceptions are not used in cases where an\n  original exception is obvious or can be ignored.\n\nI\u0027m not sure about the \"not significant\" part, so if I\u0027ve misunderstood let me know.","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":36,"context_line":"message displaying to not to loose low level cause of an error."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Not wrapper exceptions uses in cases where an original exception is too obvious"},{"line_number":39,"context_line":"or does not significant."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Please use only database related custom exceptions with database manipulations"},{"line_number":42,"context_line":"with `try/except` statement. This is required for consistent handling of"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_e5275610","line":39,"in_reply_to":"1ae5cdf2_a9d34f5d","updated":"2014-07-04 15:28:35.000000000","message":"Done","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"f046e92181a0d67f34564e958f98f5e1492a2379","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    \"\"\""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    message \u003d _(\"Invalid Parameter: \""},{"line_number":104,"context_line":"                \"Encoding directive doesn\u0027t provided.\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class DbMigrationError(DBError):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_296d7f99","line":104,"updated":"2014-06-27 21:27:35.000000000","message":"\"Encoding directive wasn\u0027t provided.\"","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e350dade4a38b42e58947d4926cc1af884682a48","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    \"\"\""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    message \u003d _(\"Invalid Parameter: \""},{"line_number":104,"context_line":"                \"Encoding directive doesn\u0027t provided.\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class DbMigrationError(DBError):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_a50abe76","line":104,"in_reply_to":"1ae5cdf2_296d7f99","updated":"2014-07-04 15:28:35.000000000","message":"Done","commit_id":"5cc52415b5b9b9349fc60837bee78c76003c3343"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"b23b4412b12876d75fbaad6d31201e9e8b765796","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class DBError(Exception):"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    \"\"\"Base exception for all custom database exceptions."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    An `inner_exception` attribute will store the original exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c8ed9b90","line":53,"updated":"2014-07-09 07:27:26.000000000","message":"a blank line before docstring seems unusual.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"f29f4217a26b44e587c2ca145313c2013222145d","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class DBError(Exception):"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    \"\"\"Base exception for all custom database exceptions."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    An `inner_exception` attribute will store the original exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a9c4e95f","line":53,"in_reply_to":"baada198_ae7dcfb3","updated":"2014-07-09 08:49:21.000000000","message":"ok, i don\u0027t insist.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e8748db583e6052d50e0d467381dd812f846a6c1","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class DBError(Exception):"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    \"\"\"Base exception for all custom database exceptions."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    An `inner_exception` attribute will store the original exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_ae7dcfb3","line":53,"in_reply_to":"baada198_c8ed9b90","updated":"2014-07-09 08:40:28.000000000","message":"But it is correct pep8 style. It comes from pylint recommendations. Actually if you insist I\u0027ll remove it, anyway it is not voted by pep8 gate.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"b23b4412b12876d75fbaad6d31201e9e8b765796","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a8022709","line":89,"updated":"2014-07-09 07:27:26.000000000","message":"... when two transactions attempt to update or lock ...","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"38dd586c5f02d599fceed9a9663f27adcd5b63bb","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_bb8c2c37","line":89,"in_reply_to":"baada198_49afcd2b","updated":"2014-07-09 09:18:15.000000000","message":"I\u0027ve got your arguments and made clearer formulation.\n\nThanks for discussion.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e8748db583e6052d50e0d467381dd812f846a6c1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a95149da","line":89,"in_reply_to":"baada198_a8022709","updated":"2014-07-09 08:40:28.000000000","message":"Please see http://en.wikipedia.org/wiki/Deadlock . I think your variant is  simplifies the description of the real process.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"f29f4217a26b44e587c2ca145313c2013222145d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_69c6514b","line":89,"in_reply_to":"baada198_a95149da","updated":"2014-07-09 08:49:21.000000000","message":"\"processes\" made me think unix processes.\ni\u0027m not sure what you mean by the link.\n\nwe are talking about deadlocks in the sense of sql.\nmy point was\n- no need to talk about unix processes\n- it doesn\u0027t necessarily involve row updates","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"83aa11a19f9ce33e6de24ae4ec774f70a52bb9e1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_49afcd2b","line":89,"in_reply_to":"baada198_a95149da","updated":"2014-07-09 09:03:50.000000000","message":"When two transactions attempt to update or lock the same db entry it is just lock, not dead lock. If we plan to raise this exception on lock, we should rename it. And yes, this is about unix processes, or at least threads.\n\nI admit, that I can misunderstand something about locks. Lets discuss it in IRC, it will be much more faster, my nick is I159.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ed8c9362bbf37d9acb06942f8422cd3ca6d0a655","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    \"\"\"Database dead lock error."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    Raised when two processes each within its own transaction updates two rows"},{"line_number":89,"context_line":"    of information but in the opposite order."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_d547e049","line":89,"in_reply_to":"baada198_bb8c2c37","updated":"2014-07-09 15:30:01.000000000","message":"sorry i missed your suggestion of irc discussion.\nthe new wording seems clearer.  thanks.","commit_id":"bf8aa107d505eef289c6e0d7ef8c5d979d947f15"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"f0267d4fc96e24a358859e83d76a5f366fb8b50a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"exceptions takes care about original error message displaying to not to loose"},{"line_number":37,"context_line":"low level cause of an error."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Wrapper exceptions are not used in cases where an original exception is obvious"},{"line_number":40,"context_line":"or can be ignored."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Please use only database related custom exceptions with database manipulations"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_cb47ae4a","line":39,"updated":"2014-07-27 09:24:34.000000000","message":"We now wrap *all* DB API exceptions.","commit_id":"de62d110d0357998f08d153aaaa3e12df5aa5efc"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3e4900175172db2f9404ada98b27c38fc5c42b63","unresolved":false,"context_lines":[{"line_number":36,"context_line":"exceptions takes care about original error message displaying to not to loose"},{"line_number":37,"context_line":"low level cause of an error."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Wrapper exceptions are not used in cases where an original exception is obvious"},{"line_number":40,"context_line":"or can be ignored."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Please use only database related custom exceptions with database manipulations"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_5fbfcafb","line":39,"in_reply_to":"baada198_cb47ae4a","updated":"2014-07-28 08:40:23.000000000","message":"Done","commit_id":"de62d110d0357998f08d153aaaa3e12df5aa5efc"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"26dec5a270a3c66f2c778e09437b43e4b16964c6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        statement(arg)"},{"line_number":30,"context_line":"    except sqlalchemy.exc.OperationalError as e:"},{"line_number":31,"context_line":"        raise DBDuplicatrEntry(e)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"This is useful to determine more specific error cases further at execution,"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_22d48fe8","line":31,"updated":"2014-07-29 08:34:23.000000000","message":"nit typo: DBDuplicateEntry","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"819c539e28eafef746cc84c6dd2b390f3ed667c6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        statement(arg)"},{"line_number":30,"context_line":"    except sqlalchemy.exc.OperationalError as e:"},{"line_number":31,"context_line":"        raise DBDuplicatrEntry(e)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"This is useful to determine more specific error cases further at execution,"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_31d4cdba","line":31,"in_reply_to":"baada198_22d48fe8","updated":"2014-07-29 15:32:08.000000000","message":"Done","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"26dec5a270a3c66f2c778e09437b43e4b16964c6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"This is useful to determine more specific error cases further at execution,"},{"line_number":35,"context_line":"when you need to add some extra information to an error message. Wrapper"},{"line_number":36,"context_line":"exceptions takes care about original error message displaying to not to loose"},{"line_number":37,"context_line":"low level cause of an error."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Please use only database related custom exceptions with database manipulations"},{"line_number":40,"context_line":"with `try/except` statement. This is required for consistent handling of"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_2219efd1","line":37,"updated":"2014-07-29 08:34:23.000000000","message":"it\u0027s also worth mentioning that now we wrap *all* DB API exceptions.","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"819c539e28eafef746cc84c6dd2b390f3ed667c6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"This is useful to determine more specific error cases further at execution,"},{"line_number":35,"context_line":"when you need to add some extra information to an error message. Wrapper"},{"line_number":36,"context_line":"exceptions takes care about original error message displaying to not to loose"},{"line_number":37,"context_line":"low level cause of an error."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Please use only database related custom exceptions with database manipulations"},{"line_number":40,"context_line":"with `try/except` statement. This is required for consistent handling of"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_51e1419a","line":37,"in_reply_to":"baada198_2219efd1","updated":"2014-07-29 15:32:08.000000000","message":"Done","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"26dec5a270a3c66f2c778e09437b43e4b16964c6","unresolved":false,"context_lines":[{"line_number":69,"context_line":"           instance_type_ref.save()"},{"line_number":70,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":71,"context_line":"           if \u0027colname\u0027 in e.columns:"},{"line_number":72,"context_line":"               # Handle error."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    def __init__(self, columns\u003dNone, inner_exception\u003dNone, value\u003dNone):"},{"line_number":75,"context_line":"        self.columns \u003d columns or []"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_c23af334","line":72,"updated":"2014-07-29 08:34:23.000000000","message":"Could you please document the recently merged value attribute?","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"819c539e28eafef746cc84c6dd2b390f3ed667c6","unresolved":false,"context_lines":[{"line_number":69,"context_line":"           instance_type_ref.save()"},{"line_number":70,"context_line":"       except DBDuplicateEntry as e:"},{"line_number":71,"context_line":"           if \u0027colname\u0027 in e.columns:"},{"line_number":72,"context_line":"               # Handle error."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    def __init__(self, columns\u003dNone, inner_exception\u003dNone, value\u003dNone):"},{"line_number":75,"context_line":"        self.columns \u003d columns or []"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_919119fa","line":72,"in_reply_to":"baada198_c23af334","updated":"2014-07-29 15:32:08.000000000","message":"And a bit of others undocumented arguments.","commit_id":"64fd0484b91ef1012413c2fe065afc578b09dcd4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ca76bb3ac18112f668f01d88b59627db23244cdb","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    :kwarg inner_exception: an original exception which was wrapped with"},{"line_number":56,"context_line":"        DBError or its subclasses."},{"line_number":57,"context_line":"    :type inner_exception: Exception"},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_a68c0182","line":57,"updated":"2014-07-30 09:15:03.000000000","message":"nit: not sure this is useful, as Exception is the base class of *all* exception, i.e. every single exception *is an* instance of Exception.","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"33d2293e080e8fe80c999be7f69e83617e2f30e1","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    :kwarg inner_exception: an original exception which was wrapped with"},{"line_number":56,"context_line":"        DBError or its subclasses."},{"line_number":57,"context_line":"    :type inner_exception: Exception"},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, inner_exception\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_8f18e984","line":57,"in_reply_to":"baada198_a68c0182","updated":"2014-07-30 14:52:36.000000000","message":"Done","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ca76bb3ac18112f668f01d88b59627db23244cdb","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :kwarg columns: list of unique columns have been attempted to write a"},{"line_number":79,"context_line":"        duplicate entry."},{"line_number":80,"context_line":"    :type columns: List"},{"line_number":81,"context_line":"    :kwarg value: value which has been attempted to write."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    def __init__(self, columns\u003dNone, inner_exception\u003dNone, value\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_e6cc39c1","line":80,"updated":"2014-07-30 09:15:03.000000000","message":"nit: built-in type names are in lower case","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ca76bb3ac18112f668f01d88b59627db23244cdb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    :kwarg columns: list of unique columns have been attempted to write a"},{"line_number":79,"context_line":"        duplicate entry."},{"line_number":80,"context_line":"    :type columns: List"},{"line_number":81,"context_line":"    :kwarg value: value which has been attempted to write."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    def __init__(self, columns\u003dNone, inner_exception\u003dNone, value\u003dNone):"},{"line_number":84,"context_line":"        self.columns \u003d columns or []"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_c64e5538","line":81,"updated":"2014-07-30 09:15:03.000000000","message":"Please mention here, that the value will be None, if we can\u0027t extract it for a particular database backend. Only MySQL and PostgreSQL 9.x are supported right now.","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"33d2293e080e8fe80c999be7f69e83617e2f30e1","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    :kwarg columns: list of unique columns have been attempted to write a"},{"line_number":79,"context_line":"        duplicate entry."},{"line_number":80,"context_line":"    :type columns: List"},{"line_number":81,"context_line":"    :kwarg value: value which has been attempted to write."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    def __init__(self, columns\u003dNone, inner_exception\u003dNone, value\u003dNone):"},{"line_number":84,"context_line":"        self.columns \u003d columns or []"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_7afc310d","line":81,"in_reply_to":"baada198_c64e5538","updated":"2014-07-30 14:52:36.000000000","message":"Done","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ca76bb3ac18112f668f01d88b59627db23244cdb","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class DBReferenceError(DBError):"},{"line_number":90,"context_line":"    \"\"\"Database implementation specific exception."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Raised when a database implementation causes an errors. For example,"},{"line_number":93,"context_line":"    foreign key references to an absent table field."}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_66abc9d7","line":90,"updated":"2014-07-30 09:15:03.000000000","message":"The docstring is somewhat confusing. This exception is purely a FK violation error, nothing more.","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"33d2293e080e8fe80c999be7f69e83617e2f30e1","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class DBReferenceError(DBError):"},{"line_number":90,"context_line":"    \"\"\"Database implementation specific exception."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Raised when a database implementation causes an errors. For example,"},{"line_number":93,"context_line":"    foreign key references to an absent table field."}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_3ac5595c","line":90,"in_reply_to":"baada198_66abc9d7","updated":"2014-07-30 14:52:36.000000000","message":"Done","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ca76bb3ac18112f668f01d88b59627db23244cdb","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    Raised when a database implementation causes an errors. For example,"},{"line_number":93,"context_line":"    foreign key references to an absent table field."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param table: a table in which the reference is directed."},{"line_number":96,"context_line":"    :type table: sqlalchemy.Table"},{"line_number":97,"context_line":"    :param constraint: a problematic constraint description."},{"line_number":98,"context_line":"    :type constraint: sqlalchemy.schema.Constraint."}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_261d5163","line":95,"updated":"2014-07-30 09:15:03.000000000","message":"According to https://github.com/openstack/oslo.db/blob/master/oslo/db/sqlalchemy/exc_filters.py#L187-L204 these won\u0027t be SQLAlchemy objects, but rather a table name, a constraint name and a key table name as strings.","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"33d2293e080e8fe80c999be7f69e83617e2f30e1","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    Raised when a database implementation causes an errors. For example,"},{"line_number":93,"context_line":"    foreign key references to an absent table field."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param table: a table in which the reference is directed."},{"line_number":96,"context_line":"    :type table: sqlalchemy.Table"},{"line_number":97,"context_line":"    :param constraint: a problematic constraint description."},{"line_number":98,"context_line":"    :type constraint: sqlalchemy.schema.Constraint."}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_dae7fde1","line":95,"in_reply_to":"baada198_261d5163","updated":"2014-07-30 14:52:36.000000000","message":"Done","commit_id":"cf682ecca1c40777081e3fd814dad56f6fa46b5d"}]}
