kcc_utils.py: avoid inefficient string concatenations
authorBjörn Jacke <bj@sernet.de>
Sun, 25 Aug 2019 21:05:10 +0000 (23:05 +0200)
committerBjoern Jacke <bjacke@samba.org>
Tue, 24 Sep 2019 12:22:44 +0000 (12:22 +0000)
Signed-off-by: Bjoern Jacke <bjacke@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/kcc/kcc_utils.py

index 3e9a988b77864aca924e5d65d6df606ffb8aed18..e0712e49c822c07ca0be557cfdaa4ac347cba62e 100644 (file)
@@ -66,9 +66,9 @@ class NamingContext(object):
 
     def __str__(self):
         '''Debug dump string output of class'''
-        text = "%s:" % (self.__class__.__name__,)
-        text = text + "\n\tnc_dnstr=%s" % self.nc_dnstr
-        text = text + "\n\tnc_guid=%s" % str(self.nc_guid)
+        text = "%s:" % (self.__class__.__name__,) +\
+               "\n\tnc_dnstr=%s" % self.nc_dnstr +\
+               "\n\tnc_guid=%s" % str(self.nc_guid)
 
         if self.nc_sid is None:
             text = text + "\n\tnc_sid=<absent>"
@@ -200,20 +200,16 @@ class NCReplica(NamingContext):
 
     def __str__(self):
         '''Debug dump string output of class'''
-        text = "%s:" % self.__class__.__name__
-        text = text + "\n\tdsa_dnstr=%s" % self.rep_dsa_dnstr
-        text = text + "\n\tdsa_guid=%s" % self.rep_dsa_guid
-        text = text + "\n\tdefault=%s" % self.rep_default
-        text = text + "\n\tro=%s" % self.rep_ro
-        text = text + "\n\tpartial=%s" % self.rep_partial
-        text = text + "\n\tpresent=%s" % self.is_present()
-        text = text + "\n\tfsmo_role_owner=%s" % self.rep_fsmo_role_owner
-
-        for rep in self.rep_repsFrom:
-            text = text + "\n%s" % rep
-
-        for rep in self.rep_repsTo:
-            text = text + "\n%s" % rep
+        text = "%s:" % self.__class__.__name__ +\
+               "\n\tdsa_dnstr=%s" % self.rep_dsa_dnstr +\
+               "\n\tdsa_guid=%s" % self.rep_dsa_guid +\
+               "\n\tdefault=%s" % self.rep_default +\
+               "\n\tro=%s" % self.rep_ro +\
+               "\n\tpartial=%s" % self.rep_partial +\
+               "\n\tpresent=%s" % self.is_present() +\
+               "\n\tfsmo_role_owner=%s" % self.rep_fsmo_role_owner +\
+               "".join("\n%s" % rep for rep in self.rep_repsFrom) +\
+               "".join("\n%s" % rep for rep in self.rep_repsTo)
 
         return "%s\n%s" % (NamingContext.__str__(self), text)
 
@@ -589,16 +585,15 @@ class DirectoryServiceAgent(object):
         if self.dsa_ivid is not None:
             text = text + "\n\tdsa_ivid=%s" % str(self.dsa_ivid)
 
-        text = text + "\n\tro=%s" % self.is_ro()
-        text = text + "\n\tgc=%s" % self.is_gc()
-        text = text + "\n\tistg=%s" % self.is_istg()
-
-        text = text + "\ncurrent_replica_table:"
-        text = text + "\n%s" % self.dumpstr_current_replica_table()
-        text = text + "\nneeded_replica_table:"
-        text = text + "\n%s" % self.dumpstr_needed_replica_table()
-        text = text + "\nconnect_table:"
-        text = text + "\n%s" % self.dumpstr_connect_table()
+        text += "\n\tro=%s" % self.is_ro() +\
+                "\n\tgc=%s" % self.is_gc() +\
+                "\n\tistg=%s" % self.is_istg() +\
+                "\ncurrent_replica_table:" +\
+                "\n%s" % self.dumpstr_current_replica_table() +\
+                "\nneeded_replica_table:" +\
+                "\n%s" % self.dumpstr_needed_replica_table() +\
+                "\nconnect_table:" +\
+                "\n%s" % self.dumpstr_connect_table()
 
         return text
 
@@ -919,39 +914,38 @@ class NTDSConnection(object):
     def __str__(self):
         '''Debug dump string output of NTDSConnection object'''
 
-        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr)
-        text = text + "\n\tenabled=%s" % self.enabled
-        text = text + "\n\tto_be_added=%s" % self.to_be_added
-        text = text + "\n\tto_be_deleted=%s" % self.to_be_deleted
-        text = text + "\n\tto_be_modified=%s" % self.to_be_modified
-        text = text + "\n\toptions=0x%08X" % self.options
-        text = text + "\n\tsystem_flags=0x%08X" % self.system_flags
-        text = text + "\n\twhenCreated=%d" % self.whenCreated
-        text = text + "\n\ttransport_dn=%s" % self.transport_dnstr
+        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\
+               "\n\tenabled=%s" % self.enabled +\
+               "\n\tto_be_added=%s" % self.to_be_added +\
+               "\n\tto_be_deleted=%s" % self.to_be_deleted +\
+               "\n\tto_be_modified=%s" % self.to_be_modified +\
+               "\n\toptions=0x%08X" % self.options +\
+               "\n\tsystem_flags=0x%08X" % self.system_flags +\
+               "\n\twhenCreated=%d" % self.whenCreated +\
+               "\n\ttransport_dn=%s" % self.transport_dnstr
 
         if self.guid is not None:
-            text = text + "\n\tguid=%s" % str(self.guid)
+            text += "\n\tguid=%s" % str(self.guid)
 
         if self.transport_guid is not None:
-            text = text + "\n\ttransport_guid=%s" % str(self.transport_guid)
+            text += "\n\ttransport_guid=%s" % str(self.transport_guid)
 
         text = text + "\n\tfrom_dn=%s" % self.from_dnstr
 
         if self.schedule is not None:
-            text += "\n\tschedule.size=%s" % self.schedule.size
-            text += "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth
-            text += ("\n\tschedule.numberOfSchedules=%s" %
+            text += "\n\tschedule.size=%s" % self.schedule.size +\
+                    "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth +\
+                    ("\n\tschedule.numberOfSchedules=%s" %
                      self.schedule.numberOfSchedules)
 
             for i, header in enumerate(self.schedule.headerArray):
                 text += ("\n\tschedule.headerArray[%d].type=%d" %
-                         (i, header.type))
-                text += ("\n\tschedule.headerArray[%d].offset=%d" %
-                         (i, header.offset))
-                text += "\n\tschedule.dataArray[%d].slots[ " % i
-                for slot in self.schedule.dataArray[i].slots:
-                    text = text + "0x%X " % slot
-                text = text + "]"
+                        (i, header.type)) +\
+                        ("\n\tschedule.headerArray[%d].offset=%d" %
+                         (i, header.offset)) +\
+                        "\n\tschedule.dataArray[%d].slots[ " % i +\
+                        "".join("0x%X " % slot for slot in self.schedule.dataArray[i].slots) +\
+                        "]"
 
         return text
 
@@ -1458,12 +1452,10 @@ class Partition(NamingContext):
 
     def __str__(self):
         '''Debug dump string output of class'''
-        text = "%s" % NamingContext.__str__(self)
-        text = text + "\n\tpartdn=%s" % self.partstr
-        for k in self.rw_location_list:
-            text = text + "\n\tmsDS-NC-Replica-Locations=%s" % k
-        for k in self.ro_location_list:
-            text = text + "\n\tmsDS-NC-RO-Replica-Locations=%s" % k
+        text = "%s" % NamingContext.__str__(self) +\
+               "\n\tpartdn=%s" % self.partstr +\
+               "".join("\n\tmsDS-NC-Replica-Locations=%s" % k for k in self.rw_location_list) +\
+               "".join("\n\tmsDS-NC-RO-Replica-Locations=%s" % k for k in self.ro_location_list)
         return text
 
 
@@ -1764,11 +1756,11 @@ class Site(object):
 
     def __str__(self):
         '''Debug dump string output of class'''
-        text = "%s:" % self.__class__.__name__
-        text = text + "\n\tdn=%s" % self.site_dnstr
-        text = text + "\n\toptions=0x%X" % self.site_options
-        text = text + "\n\ttopo_generator=%s" % self.site_topo_generator
-        text = text + "\n\ttopo_failover=%d" % self.site_topo_failover
+        text = "%s:" % self.__class__.__name__ +\
+               "\n\tdn=%s" % self.site_dnstr +\
+               "\n\toptions=0x%X" % self.site_options +\
+               "\n\ttopo_generator=%s" % self.site_topo_generator +\
+               "\n\ttopo_failover=%d" % self.site_topo_failover
         for key, dsa in self.dsa_table.items():
             text = text + "\n%s" % dsa
         return text
@@ -1792,9 +1784,9 @@ class GraphNode(object):
         self.edge_from = []
 
     def __str__(self):
-        text = "%s:" % self.__class__.__name__
-        text = text + "\n\tdsa_dnstr=%s" % self.dsa_dnstr
-        text = text + "\n\tmax_edges=%d" % self.max_edges
+        text = "%s:" % self.__class__.__name__ +\
+               "\n\tdsa_dnstr=%s" % self.dsa_dnstr +\
+               "\n\tmax_edges=%d" % self.max_edges
 
         for i, edge in enumerate(self.edge_from):
             if isinstance(edge, str):
@@ -1894,13 +1886,12 @@ class Transport(object):
     def __str__(self):
         '''Debug dump string output of Transport object'''
 
-        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr)
-        text = text + "\n\tguid=%s" % str(self.guid)
-        text = text + "\n\toptions=%d" % self.options
-        text = text + "\n\taddress_attr=%s" % self.address_attr
-        text = text + "\n\tname=%s" % self.name
-        for dnstr in self.bridgehead_list:
-            text = text + "\n\tbridgehead_list=%s" % dnstr
+        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\
+               "\n\tguid=%s" % str(self.guid) +\
+               "\n\toptions=%d" % self.options +\
+               "\n\taddress_attr=%s" % self.address_attr +\
+               "\n\tname=%s" % self.name +\
+               "".join("\n\tbridgehead_list=%s" % dnstr for dnstr in self.bridgehead_list)
 
         return text
 
@@ -2006,25 +1997,24 @@ class RepsFromTo(object):
     def __str__(self):
         '''Debug dump string output of class'''
 
-        text = "%s:" % self.__class__.__name__
-        text += "\n\tdnstr=%s" % self.nc_dnstr
-        text += "\n\tupdate_flags=0x%X" % self.update_flags
-        text += "\n\tversion=%d" % self.version
-        text += "\n\tsource_dsa_obj_guid=%s" % self.source_dsa_obj_guid
-        text += ("\n\tsource_dsa_invocation_id=%s" %
-                 self.source_dsa_invocation_id)
-        text += "\n\ttransport_guid=%s" % self.transport_guid
-        text += "\n\treplica_flags=0x%X" % self.replica_flags
-        text += ("\n\tconsecutive_sync_failures=%d" %
-                 self.consecutive_sync_failures)
-        text += "\n\tlast_success=%s" % self.last_success
-        text += "\n\tlast_attempt=%s" % self.last_attempt
-        text += "\n\tdns_name1=%s" % self.dns_name1
-        text += "\n\tdns_name2=%s" % self.dns_name2
-        text += "\n\tschedule[ "
-        for slot in self.schedule:
-            text += "0x%X " % slot
-        text += "]"
+        text = "%s:" % self.__class__.__name__ +\
+               "\n\tdnstr=%s" % self.nc_dnstr +\
+               "\n\tupdate_flags=0x%X" % self.update_flags +\
+               "\n\tversion=%d" % self.version +\
+               "\n\tsource_dsa_obj_guid=%s" % self.source_dsa_obj_guid +\
+               ("\n\tsource_dsa_invocation_id=%s" %
+                 self.source_dsa_invocation_id) +\
+               "\n\ttransport_guid=%s" % self.transport_guid +\
+               "\n\treplica_flags=0x%X" % self.replica_flags +\
+               ("\n\tconsecutive_sync_failures=%d" %
+                 self.consecutive_sync_failures) +\
+               "\n\tlast_success=%s" % self.last_success +\
+               "\n\tlast_attempt=%s" % self.last_attempt +\
+               "\n\tdns_name1=%s" % self.dns_name1 +\
+               "\n\tdns_name2=%s" % self.dns_name2 +\
+               "\n\tschedule[ " +\
+               "".join("0x%X " % slot for slot in self.schedule) +\
+               "]"
 
         return text
 
@@ -2138,27 +2128,26 @@ class SiteLink(object):
     def __str__(self):
         '''Debug dump string output of Transport object'''
 
-        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr)
-        text = text + "\n\toptions=%d" % self.options
-        text = text + "\n\tsystem_flags=%d" % self.system_flags
-        text = text + "\n\tcost=%d" % self.cost
-        text = text + "\n\tinterval=%s" % self.interval
+        text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\
+               "\n\toptions=%d" % self.options +\
+               "\n\tsystem_flags=%d" % self.system_flags +\
+               "\n\tcost=%d" % self.cost +\
+               "\n\tinterval=%s" % self.interval
 
         if self.schedule is not None:
-            text += "\n\tschedule.size=%s" % self.schedule.size
-            text += "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth
-            text += ("\n\tschedule.numberOfSchedules=%s" %
+            text += "\n\tschedule.size=%s" % self.schedule.size +\
+                    "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth +\
+                    ("\n\tschedule.numberOfSchedules=%s" %
                      self.schedule.numberOfSchedules)
 
             for i, header in enumerate(self.schedule.headerArray):
                 text += ("\n\tschedule.headerArray[%d].type=%d" %
-                         (i, header.type))
-                text += ("\n\tschedule.headerArray[%d].offset=%d" %
-                         (i, header.offset))
-                text = text + "\n\tschedule.dataArray[%d].slots[ " % i
-                for slot in self.schedule.dataArray[i].slots:
-                    text = text + "0x%X " % slot
-                text = text + "]"
+                         (i, header.type)) +\
+                        ("\n\tschedule.headerArray[%d].offset=%d" %
+                         (i, header.offset)) +\
+                        "\n\tschedule.dataArray[%d].slots[ " % i +\
+                        "".join("0x%X " % slot for slot in self.schedule.dataArray[i].slots) +\
+                        "]"
 
         for guid, dn in self.site_list:
             text = text + "\n\tsite_list=%s (%s)" % (guid, dn)