We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Fix bytes/unicode issue to fix test on Python 3


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `master/buildbot/db/schedulers.py`
Content:
```
1 # This file is part of Buildbot.  Buildbot is free software: you can
2 # redistribute it and/or modify it under the terms of the GNU General Public
3 # License as published by the Free Software Foundation, version 2.
4 #
5 # This program is distributed in the hope that it will be useful, but WITHOUT
6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7 # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
8 # details.
9 #
10 # You should have received a copy of the GNU General Public License along with
11 # this program; if not, write to the Free Software Foundation, Inc., 51
12 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
13 #
14 # Copyright Buildbot Team Members
15 
16 import sqlalchemy as sa
17 import sqlalchemy.exc
18 
19 from buildbot.db import base
20 
21 
22 class SchedulersConnectorComponent(base.DBConnectorComponent):
23     # Documentation is in developer/database.rst
24 
25     def classifyChanges(self, objectid, classifications):
26         def thd(conn):
27             transaction = conn.begin()
28             tbl = self.db.model.scheduler_changes
29             ins_q = tbl.insert()
30             upd_q = tbl.update(
31                 ((tbl.c.objectid == objectid)
32                  & (tbl.c.changeid == sa.bindparam('wc_changeid'))))
33             for changeid, important in classifications.items():
34                 # convert the 'important' value into an integer, since that
35                 # is the column type
36                 imp_int = important and 1 or 0
37                 try:
38                     conn.execute(ins_q,
39                                  objectid=objectid,
40                                  changeid=changeid,
41                                  important=imp_int)
42                 except (sqlalchemy.exc.ProgrammingError,
43                         sqlalchemy.exc.IntegrityError):
44                     transaction.rollback()
45                     transaction = conn.begin()
46                     # insert failed, so try an update
47                     conn.execute(upd_q,
48                                  wc_changeid=changeid,
49                                  important=imp_int)
50 
51             transaction.commit()
52         return self.db.pool.do(thd)
53 
54     def flushChangeClassifications(self, objectid, less_than=None):
55         def thd(conn):
56             sch_ch_tbl = self.db.model.scheduler_changes
57             wc = (sch_ch_tbl.c.objectid == objectid)
58             if less_than is not None:
59                 wc = wc & (sch_ch_tbl.c.changeid < less_than)
60             q = sch_ch_tbl.delete(whereclause=wc)
61             conn.execute(q)
62         return self.db.pool.do(thd)
63 
64     class Thunk:
65         pass
66 
67     def getChangeClassifications(self, objectid, branch=Thunk,
68                                  repository=Thunk, project=Thunk,
69                                  codebase=Thunk):
70         def thd(conn):
71             sch_ch_tbl = self.db.model.scheduler_changes
72             ch_tbl = self.db.model.changes
73 
74             wc = (sch_ch_tbl.c.objectid == objectid)
75 
76             # may need to filter further based on branch, etc
77             extra_wheres = []
78             if branch is not self.Thunk:
79                 extra_wheres.append(ch_tbl.c.branch == branch)
80             if repository is not self.Thunk:
81                 extra_wheres.append(ch_tbl.c.repository == repository)
82             if project is not self.Thunk:
83                 extra_wheres.append(ch_tbl.c.project == project)
84             if codebase is not self.Thunk:
85                 extra_wheres.append(ch_tbl.c.codebase == codebase)
86 
87             # if we need to filter further append those, as well as a join
88             # on changeid (but just once for that one)
89             if extra_wheres:
90                 wc &= (sch_ch_tbl.c.changeid == ch_tbl.c.changeid)
91                 for w in extra_wheres:
92                     wc &= w
93 
94             q = sa.select(
95                 [sch_ch_tbl.c.changeid, sch_ch_tbl.c.important],
96                 whereclause=wc)
97             return dict([(r.changeid, [False, True][r.important])
98                          for r in conn.execute(q)])
99         return self.db.pool.do(thd)
100
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/master/buildbot/db/schedulers.py b/master/buildbot/db/schedulers.py
--- a/master/buildbot/db/schedulers.py
+++ b/master/buildbot/db/schedulers.py
@@ -24,13 +24,13 @@
 
     def classifyChanges(self, objectid, classifications):
         def thd(conn):
-            transaction = conn.begin()
             tbl = self.db.model.scheduler_changes
             ins_q = tbl.insert()
             upd_q = tbl.update(
                 ((tbl.c.objectid == objectid)
                  & (tbl.c.changeid == sa.bindparam('wc_changeid'))))
             for changeid, important in classifications.items():
+                transaction = conn.begin()
                 # convert the 'important' value into an integer, since that
                 # is the column type
                 imp_int = important and 1 or 0
@@ -48,7 +48,7 @@
                                  wc_changeid=changeid,
                                  important=imp_int)
 
-            transaction.commit()
+                transaction.commit()
         return self.db.pool.do(thd)
 
     def flushChangeClassifications(self, objectid, less_than=None):

{"golden_diff": "diff --git a/master/buildbot/db/schedulers.py b/master/buildbot/db/schedulers.py\n--- a/master/buildbot/db/schedulers.py\n+++ b/master/buildbot/db/schedulers.py\n@@ -24,13 +24,13 @@\n \n     def classifyChanges(self, objectid, classifications):\n         def thd(conn):\n-            transaction = conn.begin()\n             tbl = self.db.model.scheduler_changes\n             ins_q = tbl.insert()\n             upd_q = tbl.update(\n                 ((tbl.c.objectid == objectid)\n                  & (tbl.c.changeid == sa.bindparam('wc_changeid'))))\n             for changeid, important in classifications.items():\n+                transaction = conn.begin()\n                 # convert the 'important' value into an integer, since that\n                 # is the column type\n                 imp_int = important and 1 or 0\n@@ -48,7 +48,7 @@\n                                  wc_changeid=changeid,\n                                  important=imp_int)\n \n-            transaction.commit()\n+                transaction.commit()\n         return self.db.pool.do(thd)\n \n     def flushChangeClassifications(self, objectid, less_than=None):\n", "issue": "Fix bytes/unicode issue to fix test on Python 3\n\n", "before_files": [{"content": "# This file is part of Buildbot.  Buildbot is free software: you can\n# redistribute it and/or modify it under the terms of the GNU General Public\n# License as published by the Free Software Foundation, version 2.\n#\n# This program is distributed in the hope that it will be useful, but WITHOUT\n# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n# details.\n#\n# You should have received a copy of the GNU General Public License along with\n# this program; if not, write to the Free Software Foundation, Inc., 51\n# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n#\n# Copyright Buildbot Team Members\n\nimport sqlalchemy as sa\nimport sqlalchemy.exc\n\nfrom buildbot.db import base\n\n\nclass SchedulersConnectorComponent(base.DBConnectorComponent):\n    # Documentation is in developer/database.rst\n\n    def classifyChanges(self, objectid, classifications):\n        def thd(conn):\n            transaction = conn.begin()\n            tbl = self.db.model.scheduler_changes\n            ins_q = tbl.insert()\n            upd_q = tbl.update(\n                ((tbl.c.objectid == objectid)\n                 & (tbl.c.changeid == sa.bindparam('wc_changeid'))))\n            for changeid, important in classifications.items():\n                # convert the 'important' value into an integer, since that\n                # is the column type\n                imp_int = important and 1 or 0\n                try:\n                    conn.execute(ins_q,\n                                 objectid=objectid,\n                                 changeid=changeid,\n                                 important=imp_int)\n                except (sqlalchemy.exc.ProgrammingError,\n                        sqlalchemy.exc.IntegrityError):\n                    transaction.rollback()\n                    transaction = conn.begin()\n                    # insert failed, so try an update\n                    conn.execute(upd_q,\n                                 wc_changeid=changeid,\n                                 important=imp_int)\n\n            transaction.commit()\n        return self.db.pool.do(thd)\n\n    def flushChangeClassifications(self, objectid, less_than=None):\n        def thd(conn):\n            sch_ch_tbl = self.db.model.scheduler_changes\n            wc = (sch_ch_tbl.c.objectid == objectid)\n            if less_than is not None:\n                wc = wc & (sch_ch_tbl.c.changeid < less_than)\n            q = sch_ch_tbl.delete(whereclause=wc)\n            conn.execute(q)\n        return self.db.pool.do(thd)\n\n    class Thunk:\n        pass\n\n    def getChangeClassifications(self, objectid, branch=Thunk,\n                                 repository=Thunk, project=Thunk,\n                                 codebase=Thunk):\n        def thd(conn):\n            sch_ch_tbl = self.db.model.scheduler_changes\n            ch_tbl = self.db.model.changes\n\n            wc = (sch_ch_tbl.c.objectid == objectid)\n\n            # may need to filter further based on branch, etc\n            extra_wheres = []\n            if branch is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.branch == branch)\n            if repository is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.repository == repository)\n            if project is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.project == project)\n            if codebase is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.codebase == codebase)\n\n            # if we need to filter further append those, as well as a join\n            # on changeid (but just once for that one)\n            if extra_wheres:\n                wc &= (sch_ch_tbl.c.changeid == ch_tbl.c.changeid)\n                for w in extra_wheres:\n                    wc &= w\n\n            q = sa.select(\n                [sch_ch_tbl.c.changeid, sch_ch_tbl.c.important],\n                whereclause=wc)\n            return dict([(r.changeid, [False, True][r.important])\n                         for r in conn.execute(q)])\n        return self.db.pool.do(thd)\n", "path": "master/buildbot/db/schedulers.py"}], "after_files": [{"content": "# This file is part of Buildbot.  Buildbot is free software: you can\n# redistribute it and/or modify it under the terms of the GNU General Public\n# License as published by the Free Software Foundation, version 2.\n#\n# This program is distributed in the hope that it will be useful, but WITHOUT\n# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n# details.\n#\n# You should have received a copy of the GNU General Public License along with\n# this program; if not, write to the Free Software Foundation, Inc., 51\n# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n#\n# Copyright Buildbot Team Members\n\nimport sqlalchemy as sa\nimport sqlalchemy.exc\n\nfrom buildbot.db import base\n\n\nclass SchedulersConnectorComponent(base.DBConnectorComponent):\n    # Documentation is in developer/database.rst\n\n    def classifyChanges(self, objectid, classifications):\n        def thd(conn):\n            tbl = self.db.model.scheduler_changes\n            ins_q = tbl.insert()\n            upd_q = tbl.update(\n                ((tbl.c.objectid == objectid)\n                 & (tbl.c.changeid == sa.bindparam('wc_changeid'))))\n            for changeid, important in classifications.items():\n                transaction = conn.begin()\n                # convert the 'important' value into an integer, since that\n                # is the column type\n                imp_int = important and 1 or 0\n                try:\n                    conn.execute(ins_q,\n                                 objectid=objectid,\n                                 changeid=changeid,\n                                 important=imp_int)\n                except (sqlalchemy.exc.ProgrammingError,\n                        sqlalchemy.exc.IntegrityError):\n                    transaction.rollback()\n                    transaction = conn.begin()\n                    # insert failed, so try an update\n                    conn.execute(upd_q,\n                                 wc_changeid=changeid,\n                                 important=imp_int)\n\n                transaction.commit()\n        return self.db.pool.do(thd)\n\n    def flushChangeClassifications(self, objectid, less_than=None):\n        def thd(conn):\n            sch_ch_tbl = self.db.model.scheduler_changes\n            wc = (sch_ch_tbl.c.objectid == objectid)\n            if less_than is not None:\n                wc = wc & (sch_ch_tbl.c.changeid < less_than)\n            q = sch_ch_tbl.delete(whereclause=wc)\n            conn.execute(q)\n        return self.db.pool.do(thd)\n\n    class Thunk:\n        pass\n\n    def getChangeClassifications(self, objectid, branch=Thunk,\n                                 repository=Thunk, project=Thunk,\n                                 codebase=Thunk):\n        def thd(conn):\n            sch_ch_tbl = self.db.model.scheduler_changes\n            ch_tbl = self.db.model.changes\n\n            wc = (sch_ch_tbl.c.objectid == objectid)\n\n            # may need to filter further based on branch, etc\n            extra_wheres = []\n            if branch is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.branch == branch)\n            if repository is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.repository == repository)\n            if project is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.project == project)\n            if codebase is not self.Thunk:\n                extra_wheres.append(ch_tbl.c.codebase == codebase)\n\n            # if we need to filter further append those, as well as a join\n            # on changeid (but just once for that one)\n            if extra_wheres:\n                wc &= (sch_ch_tbl.c.changeid == ch_tbl.c.changeid)\n                for w in extra_wheres:\n                    wc &= w\n\n            q = sa.select(\n                [sch_ch_tbl.c.changeid, sch_ch_tbl.c.important],\n                whereclause=wc)\n            return dict([(r.changeid, [False, True][r.important])\n                         for r in conn.execute(q)])\n        return self.db.pool.do(thd)\n", "path": "master/buildbot/db/schedulers.py"}]}