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
示例#2
0
    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
示例#4
0
    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
示例#5
0
 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
示例#6
0
 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
示例#7
0
 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()
示例#11
0
 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()
示例#12
0
 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
示例#15
0
 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
示例#16
0
    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()
示例#17
0
 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
示例#20
0
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()
示例#23
0
 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
示例#25
0
 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
示例#27
0
    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
示例#31
0
 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
示例#33
0
    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
示例#35
0
 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 _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
示例#37
0
 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
示例#38
0
    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
示例#40
0
    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
示例#42
0
    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
示例#43
0
    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()
示例#44
0
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)
示例#45
0
 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
示例#46
0
    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 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
示例#48
0
    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
示例#49
0
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)