Changeset: 1573dbfa164f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1573dbfa164f
Modified Files:
clients/python2/monetdb/control.py
clients/python2/test/test_control.py
clients/python3/monetdb/control.py
clients/python3/test/test_control.py
Branch: default
Log Message:
add support for sabdb v2, open/close connection for every command
diffs (truncated from 457 to 300 lines):
diff --git a/clients/python2/monetdb/control.py
b/clients/python2/monetdb/control.py
--- a/clients/python2/monetdb/control.py
+++ b/clients/python2/monetdb/control.py
@@ -1,39 +1,82 @@
from monetdb import mapi
+from monetdb.exceptions import OperationalError, InterfaceError
+
def parse_statusline(line):
- split = line.split(',')
+ """
+ parses a sabdb format status line. Support v1 and v2.
+
+ """
+ if not line.startswith('=sabdb:'):
+ raise OperationalError('wrong result recieved')
+
+ prot_version, rest = line.split(":", 2)[1:]
+
+ if prot_version not in ["1", "2"]:
+ raise InterfaceError("unsupported sabdb protocol")
+ else:
+ prot_version = int(prot_version)
+
+ subparts = rest.split(',')
+ sub_iter = iter(subparts)
info = {}
- info['path'] = split[0]
- info['name'] = info['path'].split("/")[-1]
- info['locked'] = split[1] == ("1")
- info['state'] = int(split[2])
- info['scenarios'] = split[3].split("'")
- info['connections'] = split[4].split("'")
- info['start_counter'] = int(split[5])
- info['stop_counter'] = int(split[6])
- info['crash_counter'] = int(split[7])
- info['avg_uptime'] = int(split[8])
- info['max_uptime'] = int(split[9])
- info['min_uptime'] = int(split[10])
- info['last_crash'] = int(split[11])
- info['lastStart'] = int(split[12])
- info['crash_avg1'] = split[13] == ("1")
- info['crash_avg10'] = float(split[14])
- info['crash_avg30'] = float(split[15])
+
+ info['name'] = sub_iter.next()
+ info['path'] = sub_iter.next()
+ info['locked'] = sub_iter.next() == "1"
+ info['state'] = int(sub_iter.next())
+ info['scenarios'] = sub_iter.next().split("'")
+ if prot_version == 1:
+ sub_iter.next()
+ info['start_counter'] = int(sub_iter.next())
+ info['stop_counter'] = int(sub_iter.next())
+ info['crash_counter'] = int(sub_iter.next())
+ info['avg_uptime'] = int(sub_iter.next())
+ info['max_uptime'] = int(sub_iter.next())
+ info['min_uptime'] = int(sub_iter.next())
+ info['last_crash'] = int(sub_iter.next())
+ info['last_start'] = int(sub_iter.next())
+ if prot_version > 1:
+ info['last_stop'] = int(sub_iter.next())
+ info['crash_avg1'] = sub_iter.next() == "1"
+ info['crash_avg10'] = float(sub_iter.next())
+ info['crash_avg30'] = float(sub_iter.next())
+
return info
+def isempty(result):
+ """ raises an exception if the result is not empty"""
+ if result != "":
+ raise OperationalError(result)
+ else:
+ return True
+
+
class Control:
"""
- Use this module to manage your MonetDB databases. You can create, start,
stop,
- lock, unlock, destroy your databases and request status information.
+ Use this module to manage your MonetDB databases. You can create, start,
+ stop, lock, unlock, destroy your databases and request status information.
"""
def __init__(self, hostname, port, passphrase):
self.server = mapi.Connection()
- self.server.connect(hostname, port, 'monetdb', passphrase,
'merovingian', 'control')
+ self.hostname = hostname
+ self.port = port
+ self.passphrase = passphrase
+
+ # check connection
+ self.server.connect(hostname, port, 'monetdb', passphrase,
+ 'merovingian', 'control')
+ self.server.disconnect()
def _send_command(self, database_name, command):
- return self.server.cmd("%s %s\n" % (database_name, command))
+ self.server.connect(self.hostname, self.port, 'monetdb',
+ self.passphrase, 'merovingian', 'control')
+ try:
+ return self.server.cmd("%s %s\n" % (database_name, command))
+ finally:
+ # always close connection
+ self.server.disconnect()
def create(self, database_name):
"""
@@ -41,7 +84,7 @@ class Control:
A database created with this command makes it available for use,
however in maintenance mode (see monetdb lock).
"""
- return self._send_command(database_name, "create")
+ return isempty(self._send_command(database_name, "create"))
def destroy(self, database_name):
"""
@@ -49,7 +92,7 @@ class Control:
logfiles. Once destroy has completed, all data is lost.
Be careful when using this command.
"""
- return self._send_command(database_name, "destroy")
+ return isempty(self._send_command(database_name, "destroy"))
def lock(self, database_name):
"""
@@ -59,7 +102,7 @@ class Control:
automatically. Use the "release" command to bring
the database back for normal usage.
"""
- return self._send_command(database_name, "lock")
+ return isempty(self._send_command(database_name, "lock"))
def release(self, database_name):
"""
@@ -67,7 +110,7 @@ class Control:
database is available again for normal use. Use the
"lock" command to take a database under maintenance.
"""
- return self._send_command(database_name, "release")
+ return isempty(self._send_command(database_name, "release"))
def status(self, database_name=False):
"""
@@ -87,14 +130,14 @@ class Control:
Starts the given database, if the MonetDB Database Server
is running.
"""
- return self._send_command(database_name, "start")
+ return isempty(self._send_command(database_name, "start"))
def stop(self, database_name):
"""
Stops the given database, if the MonetDB Database Server
is running.
"""
- return self._send_command(database_name, "stop")
+ return isempty(self._send_command(database_name, "stop"))
def kill(self, database_name):
"""
@@ -103,14 +146,15 @@ class Control:
as last resort to stop a database. A database being
killed may end up with data loss.
"""
- return self._send_command(database_name, "kill")
+ return isempty(self._send_command(database_name, "kill"))
def set(self, database_name, property_, value):
"""
sets property to value for the given database
for a list of properties, use `monetdb get all`
"""
- return self._send_command(database_name, "%s=%s" % (property_, value))
+ return isempty(self._send_command(database_name, "%s=%s" % (property_,
+ value)))
def get(self, database_name):
"""
@@ -132,7 +176,7 @@ class Control:
unsets property, reverting to its inherited value from
the default configuration for the given database
"""
- return self._send_command(database_name, property_ + "=")
+ return isempty(self._send_command(database_name, property_ + "="))
def rename(self, old, new):
return self.set(old, "name", new)
diff --git a/clients/python2/test/test_control.py
b/clients/python2/test/test_control.py
--- a/clients/python2/test/test_control.py
+++ b/clients/python2/test/test_control.py
@@ -79,11 +79,8 @@ class TestManage(unittest.TestCase):
self.assertRaises(OperationalError, self.control.release,
database_name)
def testStatus(self):
- status1 = database_prefix + "status1"
- do_without_fail(lambda: self.control.destroy(status1))
- self.control.create(status1)
- status = self.control.status(status1)
- self.assertEqual(status["name"], status1)
+ status = self.control.status(database_name)
+ self.assertEqual(status["name"], database_name)
def testStatuses(self):
status1 = database_prefix + "status1"
@@ -142,7 +139,6 @@ class TestManage(unittest.TestCase):
def testNeighbours(self):
neighbours = self.control.neighbours()
- neighbours
if __name__ == '__main__':
unittest.main()
diff --git a/clients/python3/monetdb/control.py
b/clients/python3/monetdb/control.py
--- a/clients/python3/monetdb/control.py
+++ b/clients/python3/monetdb/control.py
@@ -1,39 +1,83 @@
from monetdb import mapi
+from monetdb.exceptions import OperationalError, InterfaceError
+
def parse_statusline(line):
- split = line.split(',')
+ """
+ parses a sabdb format status line. Support v1 and v2.
+
+ """
+ if not line.startswith('=sabdb:'):
+ raise OperationalError('wrong result recieved')
+
+ prot_version, rest = line.split(":", 2)[1:]
+
+ if prot_version not in ["1", "2"]:
+ raise InterfaceError("unsupported sabdb protocol")
+ else:
+ prot_version = int(prot_version)
+
+ subparts = rest.split(',')
+ sub_iter = iter(subparts)
info = {}
- info['path'] = split[0]
- info['name'] = info['path'].split("/")[-1]
- info['locked'] = split[1] == ("1")
- info['state'] = int(split[2])
- info['scenarios'] = split[3].split("'")
- info['connections'] = split[4].split("'")
- info['start_counter'] = int(split[5])
- info['stop_counter'] = int(split[6])
- info['crash_counter'] = int(split[7])
- info['avg_uptime'] = int(split[8])
- info['max_uptime'] = int(split[9])
- info['min_uptime'] = int(split[10])
- info['last_crash'] = int(split[11])
- info['lastStart'] = int(split[12])
- info['crash_avg1'] = split[13] == ("1")
- info['crash_avg10'] = float(split[14])
- info['crash_avg30'] = float(split[15])
+
+ info['name'] = sub_iter.__next__()
+ info['path'] = sub_iter.__next__()
+ info['locked'] = sub_iter.__next__() == "1"
+ info['state'] = int(sub_iter.__next__())
+ info['scenarios'] = sub_iter.__next__().split("'")
+ if prot_version == 1:
+ sub_iter.__next__()
+ info['start_counter'] = int(sub_iter.__next__())
+ info['stop_counter'] = int(sub_iter.__next__())
+ info['crash_counter'] = int(sub_iter.__next__())
+ info['avg_uptime'] = int(sub_iter.__next__())
+ info['max_uptime'] = int(sub_iter.__next__())
+ info['min_uptime'] = int(sub_iter.__next__())
+ info['last_crash'] = int(sub_iter.__next__())
+ info['last_start'] = int(sub_iter.__next__())
+ if prot_version > 1:
+ info['last_stop'] = int(sub_iter.__next__())
+ info['crash_avg1'] = sub_iter.__next__() == "1"
+ info['crash_avg10'] = float(sub_iter.__next__())
+ info['crash_avg30'] = float(sub_iter.__next__())
+
return info
+
+def isempty(result):
+ """ raises an exception if the result is not empty"""
+ if result != "":
+ raise OperationalError(result)
+ else:
+ return True
+
+
class Control:
"""
- Use this module to manage your MonetDB databases. You can create, start,
stop,
- lock, unlock, destroy your databases and request status information.
+ Use this module to manage your MonetDB databases. You can create, start,
+ stop, lock, unlock, destroy your databases and request status information.
"""
def __init__(self, hostname, port, passphrase):
self.server = mapi.Connection()
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list