* python/generator.py: Python bindings now throw exceptions

in almost all cases where an error is encountered in the
	  underlying libvirt code.
This commit is contained in:
Richard W.M. Jones 2007-03-28 11:24:14 +00:00
parent 6ec6b79669
commit 0ab7cda38c
2 changed files with 128 additions and 9 deletions

View File

@ -1,3 +1,9 @@
Wed Mar 28 12:23:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* python/generator.py: Python bindings now throw exceptions
in almost all cases where an error is encountered in the
underlying libvirt code.
Wed Mar 28 10:47:16 CEST 2007 Daniel Veillard <veillard@redhat.com>
* src/xen_internal.c: applied patch from Masayuki Sunou fixing the
@ -20,6 +26,7 @@ Tue Mar 27 10:39:00 EDT 2007 Daniel P. Berrange <berrange@redhat.com>
* tests/xencapsdata/*: Added data files for Xen capabilities tests
* configure.ac, tests/Makefile.am: Added tests/xencapsdata/ directory
>>>>>>> 1.489
Tue Mar 27 11:26:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* qemud/qemud.c: If using FORTIFY_SOURCE, remove warning

View File

@ -9,6 +9,7 @@ enums = {} # { enumType: { enumConstant: enumValue } }
import os
import sys
import string
import re
if __name__ == "__main__":
# launched as a script
@ -561,6 +562,8 @@ classes_references = {
}
functions_noexcept = {
'virDomainGetID': True,
'virDomainGetName': True,
}
reference_keepers = {
@ -575,6 +578,25 @@ function_post = {
'virNetworkDestroy': "self._o = None",
}
# Functions returning an integral type which need special rules to
# check for errors and raise exceptions.
functions_int_exception_test = {
'virDomainGetMaxMemory': "%s == 0",
}
functions_int_default_test = "%s == -1"
def is_integral_type (name):
return not re.search ("^(unsigned)? ?(int|long)$", name) is None
# Functions returning lists which need special rules to check for errors
# and raise exceptions.
functions_list_exception_test = {
}
functions_list_default_test = "%s is None"
def is_list_type (name):
return name[-1:] == "*"
def nameFixup(name, classe, type, file):
# avoid a desastrous clash
listname = classe + "List"
@ -782,7 +804,8 @@ def buildWrappers():
classes.write("__o");
n = n + 1
classes.write(")\n");
if ret[0] != "void":
if ret[0] != "void":
if classes_type.has_key(ret[0]):
#
# Raise an exception
@ -797,8 +820,35 @@ def buildWrappers():
classes.write(" return ");
classes.write(classes_type[ret[0]][1] % ("ret"));
classes.write("\n");
# For functions returning an integral type there are
# several things that we can do, depending on the
# contents of functions_int_*:
elif is_integral_type (ret[0]):
if not functions_noexcept.has_key (name):
if functions_int_exception_test.has_key (name):
test = functions_int_exception_test[name]
else:
test = functions_int_default_test
classes.write ((" if " + test +
": raise libvirtError ('%s() failed')\n") %
("ret", name))
classes.write(" return ret\n")
elif is_list_type (ret[0]):
if not functions_noexcept.has_key (name):
if functions_list_exception_test.has_key (name):
test = functions_list_exception_test[name]
else:
test = functions_list_default_test
classes.write ((" if " + test +
": raise libvirtError ('%s() failed')\n") %
("ret", name))
classes.write(" return ret\n")
else:
classes.write(" return ret\n");
classes.write(" return ret\n")
classes.write("\n");
txt.write("\n\n#\n# Set of classes of the module\n#\n\n")
@ -896,9 +946,9 @@ def buildWrappers():
classes.write(classes_type[arg[1]][0])
n = n + 1
classes.write(")\n");
if function_post.has_key(name):
classes.write(" %s\n" % (function_post[name]));
if ret[0] != "void":
# For functions returning object types:
if ret[0] != "void":
if classes_type.has_key(ret[0]):
#
# Raise an exception
@ -911,10 +961,6 @@ def buildWrappers():
classes.write(
" if ret is None:raise libvirtError('%s() failed', conn=self)\n" %
(name))
elif classname == "virDomain":
classes.write(
" if ret is None:raise libvirtError('%s() failed')\n" %
(name))
else:
classes.write(
" if ret is None:raise libvirtError('%s() failed')\n" %
@ -945,6 +991,12 @@ def buildWrappers():
if pref[0] == classname:
classes.write(" __tmp.%s = self\n" %
pref[1])
# Post-processing - just before we return.
if function_post.has_key(name):
classes.write(" %s\n" %
(function_post[name]));
#
# return the class
#
@ -956,11 +1008,71 @@ def buildWrappers():
if functions_noexcept.has_key(name):
classes.write(
" if ret is None:return None");
# Post-processing - just before we return.
if function_post.has_key(name):
classes.write(" %s\n" %
(function_post[name]));
classes.write(" return ");
classes.write(converter_type[ret[0]] % ("ret"));
classes.write("\n");
# For functions returning an integral type there
# are several things that we can do, depending on
# the contents of functions_int_*:
elif is_integral_type (ret[0]):
if not functions_noexcept.has_key (name):
if functions_int_exception_test.has_key (name):
test = functions_int_exception_test[name]
else:
test = functions_int_default_test
if classname == "virConnect":
classes.write ((" if " + test +
": raise libvirtError ('%s() failed', conn=self)\n") %
("ret", name))
else:
classes.write ((" if " + test +
": raise libvirtError ('%s() failed')\n") %
("ret", name))
# Post-processing - just before we return.
if function_post.has_key(name):
classes.write(" %s\n" %
(function_post[name]));
classes.write (" return ret\n")
elif is_list_type (ret[0]):
if not functions_noexcept.has_key (name):
if functions_list_exception_test.has_key (name):
test = functions_list_exception_test[name]
else:
test = functions_list_default_test
if classname == "virConnect":
classes.write ((" if " + test +
": raise libvirtError ('%s() failed', conn=self)\n") %
("ret", name))
else:
classes.write ((" if " + test +
": raise libvirtError ('%s() failed')\n") %
("ret", name))
# Post-processing - just before we return.
if function_post.has_key(name):
classes.write(" %s\n" %
(function_post[name]));
classes.write (" return ret\n")
else:
# Post-processing - just before we return.
if function_post.has_key(name):
classes.write(" %s\n" %
(function_post[name]));
classes.write(" return ret\n");
classes.write("\n");
#