Commit cb0dc7ec by Grégory Wisniewski

Reorganize database management

* Move them into a database module
* Add a buildDatabaseManager() helper function
* Add the '--adapter' parameter to select the database backend
* Move specific database string parsing to MySQL manager.

git-svn-id: 71dcc9de-d417-0410-9af5-da40c76e7ee4
1 parent 382f1134
......@@ -65,16 +65,10 @@ class ConfigurationManager(object):
return (ip, int(port))
def getDatabase(self):
""" Get the database credentials (username, password, database) """
# expected pattern : [user[:password]@]database
username = None
password = None
database = self.__get('database')
if '@' in database:
(username, database) = database.split('@')
if ':' in username:
(username, password) = username.split(':')
return (username, password, database)
return self.__get('database')
def getAdapter(self):
return self.__get('adapter')
def getCluster(self):
cluster = self.__get('cluster')
......@@ -22,12 +22,12 @@ from collections import deque
from neo.protocol import NodeTypes, CellStates, Packets
from neo.node import NodeManager
from neo.event import EventManager
from import MySQLDatabaseManager
from neo.connection import ListeningConnection
from neo.exception import OperationFailure, PrimaryFailure
from import identification, verification, initialization
from import master, hidden
from import Replicator
from import buildDatabaseManager
from neo.connector import getConnectorHandler
from import PartitionTable
from neo.util import dump, parseMasterList
......@@ -50,15 +50,11 @@ class Application(object):
# load master node list
self.master_node_list = config.getMasters()
logging.debug('master nodes are %s', self.master_node_list)
# load database connection credentials, from user:password@database
(username, password, database) = config.getDatabase()
# Internal attributes.
self.em = EventManager()
self.nm = NodeManager() = MySQLDatabaseManager(database=database, user=username,
password=password) = buildDatabaseManager(config.getAdapter(), config.getDatabase())
# The partition table is initialized after getting the number of
# partitions.
# Copyright (C) 2006-2009 Nexedi SA
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from neo.exception import DatabaseFailure
from import DatabaseManager
from import MySQLDatabaseManager
from import SQLiteManager
'MySQL': mysqldb.MySQLDatabaseManager,
'SQLite': sqlite.SQLiteManager,
def buildDatabaseManager(name, config):
adapter_klass = DATABASE_MANAGER_DICT.get(name, None)
if adapter_klass is None:
raise DatabaseFailure('Cannot find a database adapter <%s>' % name)
return adapter_klass(config)
......@@ -21,7 +21,7 @@ from neo.exception import DatabaseFailure
class DatabaseManager(object):
"""This class only describes an interface for database managers."""
def __init__(self, **kwargs):
def __init__(self):
Initialize the object.
......@@ -39,13 +39,22 @@ def u64(s):
class MySQLDatabaseManager(DatabaseManager):
"""This class manages a database on MySQL."""
def __init__(self, **kwargs):
self.db = kwargs['database']
self.user = kwargs['user']
self.passwd = kwargs.get('password')
def __init__(self, database):
super(MySQLDatabaseManager, self).__init__()
self.user, self.passwd, self.db = self._parse(database)
self.conn = None
super(MySQLDatabaseManager, self).__init__(**kwargs)
def _parse(self, database):
""" Get the database credentials (username, password, database) """
# expected pattern : [user[:password]@]database
username = None
password = None
if '@' in database:
(username, database) = database.split('@')
if ':' in username:
(username, password) = username.split(':')
return (username, password, database)
# XXX: unused ?
def close(self):
......@@ -38,6 +38,7 @@ parser.add_option('-n', '--name', help = 'the node name (impove logging)')
parser.add_option('-b', '--bind', help = 'the local address to bind to')
parser.add_option('-c', '--cluster', help = 'the cluster name')
parser.add_option('-m', '--masters', help = 'master node list')
parser.add_option('-a', '--adapter', help = 'database adapter to use')
parser.add_option('-d', '--database', help = 'database connections string')
(options, args) = parser.parse_args()
......@@ -48,11 +49,13 @@ arguments = dict(
masters = options.masters,
database = options.database,
reset = options.reset,
adapter = options.adapter,
defaults = dict(
name = 'storage',
bind = '',
masters = '',
adapter = 'MySQL',
config = ConfigurationManager(
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!