backend/server/importlib/backend.py | 43 +++---------------------------------
1 file changed, 4 insertions(+), 39 deletions(-)
New commits:
commit b61d9c9137668adf767229dd14ec01b46acea496
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Tue Sep 24 15:33:24 2013 +0200
923338 - replace application code with database lookup to prevent conflicting inserts
addressing
Traceback (most recent call last):
...
File "/usr/share/rhn/upload_server/handlers/package_push/package_push.py", line 125, in handler
relative_path=self.rel_package_path, org_id=self.org_id)
File "/usr/lib/python2.6/site-packages/spacewalk/server/rhnPackageUpload.py", line 144, in push_package
importer.run()
File "/usr/lib/python2.6/site-packages/spacewalk/server/importlib/importLib.py", line 646, in run
self.fix()
File "/usr/lib/python2.6/site-packages/spacewalk/server/importlib/packageImport.py", line 289, in fix
self.backend.processCapabilities(self.capabilities)
File "/usr/lib/python2.6/site-packages/spacewalk/server/importlib/backend.py", line 128, in processCapabilities
h.executemany(id=toinsert[0], name=toinsert[1], version=toinsert[2])
File "/usr/lib/python2.6/site-packages/spacewalk/server/rhnSQL/sql_base.py", line 172, in executemany
return apply(self._execute_wrapper, (self._executemany, ) + p, kw)
File "/usr/lib/python2.6/site-packages/spacewalk/server/rhnSQL/driver_cx_Oracle.py", line 108, in _execute_wrapper
retval = apply(function, p, kw)
File "/usr/lib/python2.6/site-packages/spacewalk/server/rhnSQL/driver_cx_Oracle.py", line 208, in _executemany
self._real_cursor.executemany(None, arr)
SQLError: (1, 'ORA-00001: unique constraint (SAT56STAGE.RHN_PKG_CAP_NAME_VERSION_UQ) violated\\n', 'insert into rhnPackageCapability (id, name, version) values (:id, :name, :version)')
diff --git a/backend/server/importlib/backend.py b/backend/server/importlib/backend.py
index 2ade497..f907794 100644
--- a/backend/server/importlib/backend.py
+++ b/backend/server/importlib/backend.py
@@ -83,49 +83,14 @@ class Backend:
sth.execute()
def processCapabilities(self, capabilityHash):
- # First figure out which capabilities are already inserted
- templ = """
- select /*+index(rhnPackageCapability rhn_pkg_cap_name_version_uq)*/ id
- from rhnPackageCapability
- where name = :name
- and version %s"""
- sqlNonNull = templ % "= :version"
- sqlNull = templ % "is null"
- nullStatement = None
- nonnullStatement = None
- toinsert = [[], [], []]
+ h = self.dbmodule.prepare("select lookup_package_capability(:name, :version) as id from dual")
for name, version in capabilityHash.keys():
ver = version
if version is None or version == '':
ver = None
- if not nullStatement:
- nullStatement = self.dbmodule.prepare(sqlNull)
- nullStatement.execute(name=name)
- row = nullStatement.fetchone_dict()
- else:
- if not nonnullStatement:
- nonnullStatement = self.dbmodule.prepare(sqlNonNull)
- nonnullStatement.execute(name=name, version=version)
- row = nonnullStatement.fetchone_dict()
- if row:
- capabilityHash[(name, version)] = row['id']
- continue
- # Generate an id
- id = self.sequences['rhnPackageCapability'].next()
- capabilityHash[(name, version)] = id
- toinsert[0].append(id)
- toinsert[1].append(name)
- toinsert[2].append(ver)
- if not toinsert[0]:
- # Nothing to do
- return
- sql = """
- insert into rhnPackageCapability
- (id, name, version) values
- (:id, :name, :version)
- """
- h = self.dbmodule.prepare(sql)
- h.executemany(id=toinsert[0], name=toinsert[1], version=toinsert[2])
+ h.execute(name = name, version = ver)
+ row = h.fetchone_dict()
+ capabilityHash[(name, version)] = row['id']
def processChangeLog(self, changelogHash):
sql = "select id from rhnPackageChangeLogData where name = :name and time = :time and text = :text"