Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Commit 0b83937

Browse files
committed
Fix bugs when using MySQL as index database
1. MySQLdb will raise ProgrammingError when table doesn't exists. Use engine.has_table to check whether table exists for compatible 2. VARCHAR requires a length on dialect mysql. String length limit is according to [Docker Hub's limit](https://registry.hub.docker.com/account/repositories/add/) and [docker's valid namespace and repo regex](https://github.com/docker/docker/blob/master/registry/registry.go#L214)
1 parent 97234d7 commit 0b83937

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

docker_registry/lib/index/db.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ class Repository (Base):
3232

3333
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
3434
name = sqlalchemy.Column(
35-
sqlalchemy.String, nullable=False, unique=True)
36-
description = sqlalchemy.Column(sqlalchemy.String)
35+
sqlalchemy.String(length=30 + 1 + 64), # namespace / respository
36+
nullable=False, unique=True)
37+
description = sqlalchemy.Column(
38+
sqlalchemy.String(length=100))
3739

3840
def __repr__(self):
3941
return "<{0}(name='{1}', description='{2}')>".format(
@@ -61,10 +63,10 @@ def __init__(self, database=None):
6163

6264
def _setup_database(self):
6365
session = self._session()
64-
try:
66+
if self._engine.has_table(table_name=Version.__tablename__):
6567
version = session.query(
6668
sqlalchemy.sql.functions.max(Version.id)).first()[0]
67-
except sqlalchemy.exc.OperationalError:
69+
else:
6870
version = None
6971
if version:
7072
if version != self.version:

tests/lib/index/test_db.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ class TestSQLAlchemyIndex(unittest.TestCase):
2828
def setUp(self):
2929
self.index = db.SQLAlchemyIndex(database="sqlite://")
3030

31+
@mock.patch('sqlalchemy.engine.Engine.has_table', return_value=True)
3132
@mock.patch('sqlalchemy.orm.query.Query.first')
32-
def test_setup_database(self, first):
33+
def test_setup_database(self, first, has_table):
3334
first = mock.Mock( # noqa
3435
side_effect=db.sqlalchemy.exc.OperationalError)
3536
self.assertRaises(

0 commit comments

Comments
 (0)