def end(self, rpmdb_version, return_code, errors=None): assert return_code or not errors if not hasattr(self, '_tid'): return # Failed at beg() time cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """INSERT INTO trans_end (tid, timestamp, rpmdb_version, return_code) VALUES (?, ?, ?, ?)""", (self._tid,int(time.time()), str(rpmdb_version), return_code)) self._commit() if not return_code: # Simple hack, if the transaction finished. Note that this # catches the erase cases (as we still don't get pkgtups for them), # Eg. Updated elements. executeSQL(cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ?""", ('TRUE', self._tid,)) self._commit() if errors is not None: self._log_errors(errors) del self._tid
def search(self, patterns, ignore_case=True): """ Search for history transactions which contain specified packages al. la. "yum list". Returns transaction ids. """ # Search packages ... kind of sucks that it's search not list, pkglist? cur = self._get_cursor() if cur is None: return set() data = _setupHistorySearchSQL(patterns, ignore_case) (need_full, patterns, fields, names) = data ret = [] pkgtupids = set() for row in self._yieldSQLDataList(patterns, fields, ignore_case): pkgtupids.add(row[0]) sql = """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """ sql += "(%s)" % ",".join(['?'] * len(pkgtupids)) params = list(pkgtupids) tids = set() if len(params) > yum.constants.PATTERNS_INDEXED_MAX: executeSQL(cur, """SELECT tid FROM trans_data_pkgs""") for row in cur: if row[0] in params: tids.add(row[0]) return tids if not params: return tids executeSQL(cur, sql, params) for row in cur: tids.add(row[0]) return tids
def _pkgtup2pid(self, pkgtup, checksum=None): cur = self._get_cursor() executeSQL(cur, """SELECT pkgtupid, checksum FROM pkgtups WHERE name=? AND arch=? AND epoch=? AND version=? AND release=?""", pkgtup) for sql_pkgtupid, sql_checksum in cur: if checksum is None and sql_checksum is None: return sql_pkgtupid if checksum is None: continue if sql_checksum is None: continue if checksum == sql_checksum: return sql_pkgtupid (n,a,e,v,r) = pkgtup (n,a,e,v,r) = (to_unicode(n),to_unicode(a), to_unicode(e),to_unicode(v),to_unicode(r)) if checksum is not None: res = executeSQL(cur, """INSERT INTO pkgtups (name, arch, epoch, version, release, checksum) VALUES (?, ?, ?, ?, ?, ?)""", (n,a,e,v,r, checksum)) else: res = executeSQL(cur, """INSERT INTO pkgtups (name, arch, epoch, version, release) VALUES (?, ?, ?, ?, ?)""", (n,a,e,v,r)) return cur.lastrowid
def _pkgtup2pid(self, pkgtup, checksum=None): cur = self._get_cursor() executeSQL( cur, """SELECT pkgtupid, checksum FROM pkgtups WHERE name=? AND arch=? AND epoch=? AND version=? AND release=?""", pkgtup) for sql_pkgtupid, sql_checksum in cur: if checksum is None and sql_checksum is None: return sql_pkgtupid if checksum is None: continue if sql_checksum is None: continue if checksum == sql_checksum: return sql_pkgtupid (n, a, e, v, r) = pkgtup (n, a, e, v, r) = (to_unicode(n), to_unicode(a), to_unicode(e), to_unicode(v), to_unicode(r)) if checksum is not None: res = executeSQL( cur, """INSERT INTO pkgtups (name, arch, epoch, version, release, checksum) VALUES (?, ?, ?, ?, ?, ?)""", (n, a, e, v, r, checksum)) else: res = executeSQL( cur, """INSERT INTO pkgtups (name, arch, epoch, version, release) VALUES (?, ?, ?, ?, ?)""", (n, a, e, v, r)) return cur.lastrowid
def end(self, rpmdb_version, return_code, errors=None): assert return_code or not errors if not hasattr(self, '_tid'): return # Failed at beg() time cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL( cur, """INSERT INTO trans_end (tid, timestamp, rpmdb_version, return_code) VALUES (?, ?, ?, ?)""", (self._tid, int(time.time()), str(rpmdb_version), return_code)) self._commit() if not return_code: # Simple hack, if the transaction finished. Note that this # catches the erase cases (as we still don't get pkgtups for them), # Eg. Updated elements. executeSQL( cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ?""", ( 'TRUE', self._tid, )) self._commit() if errors is not None: self._log_errors(errors) del self._tid
def _load_errors(self, tid): cur = self._get_cursor() executeSQL( cur, """SELECT msg FROM trans_error WHERE tid = ? ORDER BY mid ASC""", (tid, )) ret = [] for row in cur: ret.append(row[0]) return ret
def _load_output(self, tid): cur = self._get_cursor() executeSQL( cur, """SELECT line FROM trans_script_stdout WHERE tid = ? ORDER BY lid ASC""", (tid, )) ret = [] for row in cur: ret.append(row[0]) return ret
def _load_errors(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT msg FROM trans_error WHERE tid = ? ORDER BY mid ASC""", (tid,)) ret = [] for row in cur: ret.append(row[0]) return ret
def _load_output(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT line FROM trans_script_stdout WHERE tid = ? ORDER BY lid ASC""", (tid,)) ret = [] for row in cur: ret.append(row[0]) return ret
def _log_errors(self, errors): cur = self._get_cursor() if cur is None: return for error in errors: error = to_unicode(error) executeSQL(cur, """INSERT INTO trans_error (tid, msg) VALUES (?, ?)""", (self._tid, error)) self._commit()
def _log_errors(self, errors): cur = self._get_cursor() if cur is None: return for error in errors: error = to_unicode(error) executeSQL( cur, """INSERT INTO trans_error (tid, msg) VALUES (?, ?)""", (self._tid, error)) self._commit()
def _old_cmdline(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None executeSQL( cur, """SELECT cmdline FROM trans_cmdline WHERE tid = ?""", (tid, )) ret = [] for row in cur: return row[0] return None
def _old_with_pkgs(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC""", (tid,)) ret = [] for row in cur: obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) ret.append(obj) return ret
def _old_cmdline(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None executeSQL(cur, """SELECT cmdline FROM trans_cmdline WHERE tid = ?""", (tid,)) ret = [] for row in cur: return row[0] return None
def _old_with_pkgs(self, tid): cur = self._get_cursor() executeSQL( cur, """SELECT name, arch, epoch, version, release, checksum FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC""", (tid, )) ret = [] for row in cur: obj = YumHistoryPackage(row[0], row[1], row[2], row[3], row[4], row[5]) ret.append(obj) return ret
def log_scriptlet_output(self, data, msg): """ Note that data can be either a real pkg. ... or not. """ if msg is None or not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above for error in msg.splitlines(): error = to_unicode(error) executeSQL( cur, """INSERT INTO trans_script_stdout (tid, line) VALUES (?, ?)""", (self._tid, error)) self._commit()
def _old_problems(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL( cur, """SELECT rpid, problem, msg FROM trans_rpmdb_problems WHERE tid = ? ORDER BY problem ASC, rpid ASC""", (tid, )) ret = [] for row in cur: obj = YumHistoryRpmdbProblem(self, row[0], row[1], row[2]) ret.append(obj) return ret
def log_scriptlet_output(self, data, msg): """ Note that data can be either a real pkg. ... or not. """ if msg is None or not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above for error in msg.splitlines(): error = to_unicode(error) executeSQL(cur, """INSERT INTO trans_script_stdout (tid, line) VALUES (?, ?)""", (self._tid, error)) self._commit()
def _old_problems(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL(cur, """SELECT rpid, problem, msg FROM trans_rpmdb_problems WHERE tid = ? ORDER BY problem ASC, rpid ASC""", (tid,)) ret = [] for row in cur: obj = YumHistoryRpmdbProblem(self, row[0], row[1], row[2]) ret.append(obj) return ret
def loadPackages(database): cur = database.cursor() sql = 'select * from packages' executeSQL(cur, sql) packages = [] for ob in cur: package = SqlitePackage() package.loadBasic(ob) loadRequires(database, package) loadProvides(database, package) loadConflicts(database, package) loadObsoletes(database, package) packages.append(package) return packages
def _old_prob_pkgs(self, rpid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum, main FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) WHERE rpid = ? ORDER BY name ASC, epoch ASC""", (rpid,)) ret = [] for row in cur: obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) obj.main = row[6] == 'TRUE' ret.append(obj) return ret
def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[], rpmdb_problems=[], cmdline=None): cur = self._get_cursor() if cur is None: return res = executeSQL(cur, """INSERT INTO trans_beg (timestamp, rpmdb_version, loginuid) VALUES (?, ?, ?)""", (int(time.time()), str(rpmdb_version), yum.misc.getloginuid())) self._tid = cur.lastrowid for pkg in using_pkgs: pid = self._ipkg2pid(pkg) self.trans_with_pid(pid) for txmbr in txmbrs: pid = self.pkg2pid(txmbr.po) state = self.txmbr2state(txmbr) self.trans_data_pid_beg(pid, state) for pkg in skip_packages: pid = self.pkg2pid(pkg) self.trans_skip_pid(pid) for problem in rpmdb_problems: self._trans_rpmdb_problem(problem) if cmdline: self._trans_cmdline(cmdline) self._commit()
def _old_prob_pkgs(self, rpid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL( cur, """SELECT name, arch, epoch, version, release, checksum, main FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) WHERE rpid = ? ORDER BY name ASC, epoch ASC""", (rpid, )) ret = [] for row in cur: obj = YumHistoryPackage(row[0], row[1], row[2], row[3], row[4], row[5]) obj.main = row[6] == 'TRUE' ret.append(obj) return ret
def search(self, patterns, ignore_case=True): """ Search for history transactions which contain specified packages al. la. "yum list". Returns transaction ids. """ # Search packages ... kind of sucks that it's search not list, pkglist? cur = self._get_cursor() if cur is None: return set() data = _setupHistorySearchSQL(patterns, ignore_case) (need_full, npatterns, fields, names) = data ret = [] pkgtupids = set() if npatterns: for row in self._yieldSQLDataList(npatterns, fields, ignore_case): pkgtupids.add(row[0]) else: # Too many patterns, *sigh* pat_max = PATTERNS_MAX if not need_full: pat_max = PATTERNS_INDEXED_MAX for npatterns in yum.misc.seq_max_split(patterns, pat_max): data = _setupHistorySearchSQL(npatterns, ignore_case) (need_full, nps, fields, names) = data assert nps for row in self._yieldSQLDataList(nps, fields, ignore_case): pkgtupids.add(row[0]) sql = """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """ sql += "(%s)" % ",".join(['?'] * len(pkgtupids)) params = list(pkgtupids) tids = set() if len(params) > yum.constants.PATTERNS_INDEXED_MAX: executeSQL(cur, """SELECT tid FROM trans_data_pkgs""") for row in cur: if row[0] in params: tids.add(row[0]) return tids if not params: return tids executeSQL(cur, sql, params) for row in cur: tids.add(row[0]) return tids
def trans_with_pid(self, pid): cur = self._get_cursor() if cur is None: return None res = executeSQL( cur, """INSERT INTO trans_with_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid
def trans_with_pid(self, pid): cur = self._get_cursor() if cur is None: return None res = executeSQL(cur, """INSERT INTO trans_with_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid
def trans_skip_pid(self, pid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL( cur, """INSERT INTO trans_skip_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid
def trans_skip_pid(self, pid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL(cur, """INSERT INTO trans_skip_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid
def _trans_cmdline(self, cmdline): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL(cur, """INSERT INTO trans_cmdline (tid, cmdline) VALUES (?, ?)""", (self._tid, to_unicode(cmdline))) return cur.lastrowid
def _old_data_pkgs(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum, done, state FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC, state DESC""", (tid,)) ret = [] for row in cur: obj = YumHistoryPackageState(row[0],row[1],row[2],row[3],row[4], row[7], row[5]) obj.done = row[6] == 'TRUE' obj.state_installed = None if _sttxt2stcode[obj.state] in TS_INSTALL_STATES: obj.state_installed = True if _sttxt2stcode[obj.state] in TS_REMOVE_STATES: obj.state_installed = False ret.append(obj) return ret
def _trans_cmdline(self, cmdline): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL( cur, """INSERT INTO trans_cmdline (tid, cmdline) VALUES (?, ?)""", (self._tid, cmdline)) return cur.lastrowid
def _trans_rpmdb_problem(self, problem): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None # str(problem) doesn't work if problem contains unicode(), # unicode(problem) doesn't work in python 2.4.x ... *sigh*. uproblem = to_unicode(problem.__str__()) res = executeSQL(cur, """INSERT INTO trans_rpmdb_problems (tid, problem, msg) VALUES (?, ?, ?)""", (self._tid, problem.problem, uproblem)) rpid = cur.lastrowid if not rpid: return rpid pkgs = {} pkg = problem.pkg pkgs[pkg.pkgtup] = pkg if problem.problem == 'conflicts': for pkg in problem.conflicts: pkgs[pkg.pkgtup] = pkg if problem.problem == 'duplicates': pkgs[problem.duplicate.pkgtup] = problem.duplicate for pkg in pkgs.values(): pid = self.pkg2pid(pkg) if pkg.pkgtup == problem.pkg.pkgtup: main = 'TRUE' else: main = 'FALSE' res = executeSQL(cur, """INSERT INTO trans_prob_pkgs (rpid, pkgtupid, main) VALUES (?, ?, ?)""", (rpid, pid, main)) return rpid
def _yieldSQLDataList(self, patterns, fields, ignore_case): """Yields all the package data for the given params. """ cur = self._get_cursor() qsql = _FULL_PARSE_QUERY_BEG pat_sqls = [] pat_data = [] for (pattern, rest) in patterns: for field in fields: if ignore_case: pat_sqls.append("%s LIKE ?%s" % (field, rest)) else: pat_sqls.append("%s %s ?" % (field, rest)) pat_data.append(pattern) assert pat_sqls qsql += " OR ".join(pat_sqls) executeSQL(cur, qsql, pat_data) for x in cur: yield x
def trans_data_pid_beg(self, pid, state): assert state is not None if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """INSERT INTO trans_data_pkgs (tid, pkgtupid, state) VALUES (?, ?, ?)""", (self._tid, pid, state)) return cur.lastrowid
def trans_data_pid_beg(self, pid, state): assert state is not None if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL( cur, """INSERT INTO trans_data_pkgs (tid, pkgtupid, state) VALUES (?, ?, ?)""", (self._tid, pid, state)) return cur.lastrowid
def _old_data_pkgs(self, tid): cur = self._get_cursor() executeSQL( cur, """SELECT name, arch, epoch, version, release, checksum, done, state FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC, state DESC""", (tid, )) ret = [] for row in cur: obj = YumHistoryPackage(row[0], row[1], row[2], row[3], row[4], row[5]) obj.done = row[6] == 'TRUE' obj.state = row[7] obj.state_installed = None if _sttxt2stcode[obj.state] in TS_INSTALL_STATES: obj.state_installed = True if _sttxt2stcode[obj.state] in TS_REMOVE_STATES: obj.state_installed = False ret.append(obj) return ret
def trans_data_pid_end(self, pid, state): # State can be none here, Eg. TS_FAILED from rpmtrans if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL( cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ? AND pkgtupid = ? AND state = ? """, ('TRUE', self._tid, pid, state)) self._commit() return cur.lastrowid
def _update_db_file_2(self): """ Update to version 2 of history, includes trans_skip_pkgs. """ if not self.conf.writable: return False if hasattr(self, '_cached_updated_2'): return self._cached_updated_2 cur = self._get_cursor() if cur is None: return False executeSQL(cur, "PRAGMA table_info(trans_skip_pkgs)") # If we get anything, we're fine. There might be a better way of # saying "anything" but this works. for ob in cur: break else: for op in self._update_ops_2: cur.execute(op) self._commit() self._cached_updated_2 = True return True
def trans_data_pid_end(self, pid, state): # State can be none here, Eg. TS_FAILED from rpmtrans if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ? AND pkgtupid = ? AND state = ? """, ('TRUE', self._tid, pid, state)) self._commit() return cur.lastrowid
def _trans_rpmdb_problem(self, problem): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL( cur, """INSERT INTO trans_rpmdb_problems (tid, problem, msg) VALUES (?, ?, ?)""", (self._tid, problem.problem, to_unicode(str(problem)))) rpid = cur.lastrowid if not rpid: return rpid pkgs = {} pkg = problem.pkg pkgs[pkg.pkgtup] = pkg if problem.problem == 'conflicts': for pkg in problem.conflicts: pkgs[pkg.pkgtup] = pkg if problem.problem == 'duplicates': pkgs[problem.duplicate.pkgtup] = problem.duplicate for pkg in pkgs.values(): pid = self.pkg2pid(pkg) if pkg.pkgtup == problem.pkg.pkgtup: main = 'TRUE' else: main = 'FALSE' res = executeSQL( cur, """INSERT INTO trans_prob_pkgs (rpid, pkgtupid, main) VALUES (?, ?, ?)""", (rpid, pid, main)) return rpid
def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[], rpmdb_problems=[], cmdline=None): cur = self._get_cursor() if cur is None: return res = executeSQL( cur, """INSERT INTO trans_beg (timestamp, rpmdb_version, loginuid) VALUES (?, ?, ?)""", (int(time.time()), str(rpmdb_version), yum.misc.getloginuid())) self._tid = cur.lastrowid for pkg in using_pkgs: pid = self._ipkg2pid(pkg) self.trans_with_pid(pid) for txmbr in txmbrs: pid = self.pkg2pid(txmbr.po) state = self.txmbr2state(txmbr) self.trans_data_pid_beg(pid, state) for pkg in skip_packages: pid = self.pkg2pid(pkg) self.trans_skip_pid(pid) for problem in rpmdb_problems: self._trans_rpmdb_problem(problem) if cmdline: self._trans_cmdline(cmdline) self._commit()
def loadConflicts(database, package): cur = database.cursor() sql = 'select * from conflicts where pkgKey = ?' executeSQL(cur, sql, (package.key,)) for ob in cur: package.addConflicts(ob)
def _sql_exec(self, sql, *args): """ Exec SQL against an MD of the repo, return a cursor. """ executeSQL(self.cur, sql, *args) return self.cur
def old(self, tids=[], limit=None, complete_transactions_only=False): """ Return a list of the last transactions, note that this includes partial transactions (ones without an end transaction). """ cur = self._get_cursor() if cur is None: return [] sql = """SELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, loginuid, return_code FROM trans_beg JOIN trans_end USING(tid)""" # NOTE: sqlite doesn't do OUTER JOINs ... *sigh*. So we have to do it # ourself. if not complete_transactions_only: sql = """SELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, NULL, NULL, loginuid, NULL FROM trans_beg""" params = None if tids and len(tids) <= yum.constants.PATTERNS_INDEXED_MAX: params = tids = list(set(tids)) sql += " WHERE tid IN (%s)" % ", ".join(['?'] * len(tids)) sql += " ORDER BY beg_ts DESC, tid ASC" if limit is not None: sql += " LIMIT " + str(limit) executeSQL(cur, sql, params) ret = [] tid2obj = {} for row in cur: if tids and len(tids) > yum.constants.PATTERNS_INDEXED_MAX: if row[0] not in tids: continue obj = YumHistoryTransaction(self, row) tid2obj[row[0]] = obj ret.append(obj) sql = """SELECT tid, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, return_code FROM trans_end""" params = tid2obj.keys() if len(params) > yum.constants.PATTERNS_INDEXED_MAX: executeSQL(cur, sql) else: sql += " WHERE tid IN (%s)" % ", ".join(['?'] * len(params)) executeSQL(cur, sql, params) for row in cur: if row[0] not in tid2obj: continue tid2obj[row[0]].end_timestamp = row[1] tid2obj[row[0]].end_rpmdbversion = row[2] tid2obj[row[0]].return_code = row[3] # Go through backwards, and see if the rpmdb versions match las = None for obj in reversed(ret): cur_rv = obj.beg_rpmdbversion las_rv = None if las is not None: las_rv = las.end_rpmdbversion if las_rv is None or cur_rv is None or (las.tid + 1) != obj.tid: pass elif las_rv != cur_rv: obj.altered_lt_rpmdb = True las.altered_gt_rpmdb = True else: obj.altered_lt_rpmdb = False las.altered_gt_rpmdb = False las = obj return ret
def loadObsoletes(database, package): cur = database.cursor() sql = 'select * from obsoletes where pkgKey = ?' executeSQL(cur, sql, (package.key,)) for ob in cur: package.addObsoletes(ob)