richardphibel / rpms / libdnf

Forked from rpms/libdnf 2 years ago
Clone
2c1f71
From c5919efe898294420ec8e91e4eed5b9081e681c5 Mon Sep 17 00:00:00 2001
2c1f71
From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
2c1f71
Date: Thu, 17 Feb 2022 18:18:16 +0100
2c1f71
Subject: [PATCH 33/34] libdnf/transaction/RPMItem: Fix handling transaction id
2c1f71
 in resolveTransactionItemReason
2c1f71
2c1f71
The maxTransactionId argument was ignored, the method was always returning the
2c1f71
reason from the last transaction. This is the correct result for
2c1f71
maxTransactionId = -1. In a couple of places the method is called with
2c1f71
maxTransactionId = -2. Fixing this would mean nontrivial changes to the
2c1f71
logic which could potentially break something else, so I'm leaving this
2c1f71
behavior unchanged.
2c1f71
2c1f71
For non-negative values of maxTransactionId (with which it's not being called
2c1f71
anywhere in dnf codebase), the commit adds a condition to SELECT only
2c1f71
transaction ids less than or equal to maxTransactionId.
2c1f71
2c1f71
= changelog =
2c1f71
msg: Fix handling transaction id in resolveTransactionItemReason
2c1f71
type: bugfix
2c1f71
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2053014
2c1f71
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2010259
2c1f71
---
2c1f71
 libdnf/transaction/RPMItem.cpp | 21 ++++++++++++++++++---
2c1f71
 1 file changed, 18 insertions(+), 3 deletions(-)
2c1f71
2c1f71
diff --git a/libdnf/transaction/RPMItem.cpp b/libdnf/transaction/RPMItem.cpp
2c1f71
index 5f667ab9..ecce789d 100644
2c1f71
--- a/libdnf/transaction/RPMItem.cpp
2c1f71
+++ b/libdnf/transaction/RPMItem.cpp
2c1f71
@@ -255,7 +255,11 @@ RPMItem::resolveTransactionItemReason(SQLite3Ptr conn,
2c1f71
                                       const std::string &arch,
2c1f71
                                       int64_t maxTransactionId)
2c1f71
 {
2c1f71
-    const char *sql = R"**(
2c1f71
+    // NOTE: All negative maxTransactionId values are treated the same. The
2c1f71
+    // method is called with maxTransactionId = -2 in a couple of places, the
2c1f71
+    // semantics here have been the same as with -1 for a long time. If it
2c1f71
+    // ain't broke...
2c1f71
+    std::string sql = R"**(
2c1f71
         SELECT
2c1f71
             ti.action as action,
2c1f71
             ti.reason as reason
2c1f71
@@ -271,14 +275,25 @@ RPMItem::resolveTransactionItemReason(SQLite3Ptr conn,
2c1f71
             AND ti.action not in (3, 5, 7, 10)
2c1f71
             AND i.name = ?
2c1f71
             AND i.arch = ?
2c1f71
+    )**";
2c1f71
+
2c1f71
+    if (maxTransactionId >= 0) {
2c1f71
+        sql.append(" AND ti.trans_id <= ?");
2c1f71
+    }
2c1f71
+
2c1f71
+    sql.append(R"**(
2c1f71
         ORDER BY
2c1f71
             ti.trans_id DESC
2c1f71
         LIMIT 1
2c1f71
-    )**";
2c1f71
+    )**");
2c1f71
 
2c1f71
     if (arch != "") {
2c1f71
         SQLite3::Query query(*conn, sql);
2c1f71
-        query.bindv(name, arch);
2c1f71
+        if (maxTransactionId >= 0) {
2c1f71
+            query.bindv(name, arch, maxTransactionId);
2c1f71
+        } else {
2c1f71
+            query.bindv(name, arch);
2c1f71
+        }
2c1f71
 
2c1f71
         if (query.step() == SQLite3::Statement::StepResult::ROW) {
2c1f71
             auto action = static_cast< TransactionItemAction >(query.get< int64_t >("action"));
2c1f71
-- 
2c1f71
2.31.1
2c1f71