]> xenbits.xensource.com Git - libvirt.git/commitdiff
* python/generator.py: Python bindings now throw exceptions
authorRichard W.M. Jones <rjones@redhat.com>
Wed, 28 Mar 2007 11:24:14 +0000 (11:24 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 28 Mar 2007 11:24:14 +0000 (11:24 +0000)
  in almost all cases where an error is encountered in the
  underlying libvirt code.

ChangeLog
python/generator.py

index 986b6f601d96a48a00d46fc419b3cda09b14a087..5d3a6278e3f542cdbf3161238cbe635496cc4ac4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index e058b1c90e2f7565e2a106b208398d08213dbd43..567cc529a37c53f88cb978449a86cefa2c8c33c7 100755 (executable)
@@ -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");
 
     #