Просмотр исходного кода

Do not read the available file unnecessarily

For commands that only make use of information from the status file,
there's no need to make them read and parse the available file. This
change does not alter the current behaviour, and commands that were
previously updating the available file will continue doing so.

Removing further access to it is pending a decision on how to treat
globally the available file, which needs interaction with the package
manager frontend developers.

Closes: #397121

Based-on-patch-by: Michel Lespinasse <walken@zoy.org>
Guillem Jover лет назад: 15
Родитель
Сommit
fb49e131ef
7 измененных файлов с 23 добавлено и 14 удалено
  1. 2 0
      debian/changelog
  2. 2 1
      lib/dpkg/dbmodify.c
  3. 2 2
      src/archives.c
  4. 1 1
      src/enquiry.c
  5. 3 3
      src/packages.c
  6. 11 5
      src/querycmd.c
  7. 2 2
      src/select.c

+ 2 - 0
debian/changelog

@@ -41,6 +41,8 @@ dpkg (1.16.0) UNRELEASED; urgency=low
     instead of the last file acted on that directory.
   * Document in dpkg-query --help output and man page that --list and --show
     arguments are optionsl.
+  * Do not read the available file unnecessarily.
+    Thanks to Michel Lespinasse <walken@zoy.org>. Closes: #397121
 
   [ Raphaël Hertzog ]
   * Fail properly when debian/source/format is empty. Closes: #600854

+ 2 - 1
lib/dpkg/dbmodify.c

@@ -285,7 +285,8 @@ void modstatdb_shutdown(void) {
   switch (cstatus) {
   case msdbrw_write:
     modstatdb_checkpoint();
-    writedb(availablefile,1,0);
+    if (cflags & msdbrw_available)
+      writedb(availablefile, 1, 0);
     /* Tidy up a bit, but don't worry too much about failure. */
     fclose(importanttmp);
     unlink(importanttmpfile);

+ 2 - 2
src/archives.c

@@ -1182,8 +1182,8 @@ void archivefiles(const char *const *argv) {
   trigproc_install_hooks();
 
   modstatdb_init(admindir,
-                 (f_noact ?                         msdbrw_readonly :
-                  cipaction->arg_int == act_avail ? msdbrw_write :
+                 f_noact ?                          msdbrw_readonly :
+                 (cipaction->arg_int == act_avail ? msdbrw_write :
                   fc_nonroot ?                      msdbrw_write :
                                                     msdbrw_needsuperuser) |
                  msdbrw_available);

+ 1 - 1
src/enquiry.c

@@ -134,7 +134,7 @@ void audit(const char *const *argv) {
   if (*argv)
     badusage(_("--%s takes no arguments"), cipaction->olong);
 
-  modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
+  modstatdb_init(admindir, msdbrw_readonly);
 
   for (bsi= badstatinfos; bsi->yesno; bsi++) {
     struct pkgiterator *it;

+ 3 - 3
src/packages.c

@@ -123,9 +123,9 @@ packages(const char *const *argv)
   trigproc_install_hooks();
 
   modstatdb_init(admindir,
-                 (f_noact ?    msdbrw_readonly :
-                  fc_nonroot ? msdbrw_write :
-                               msdbrw_needsuperuser) | msdbrw_available);
+                 f_noact ?    msdbrw_readonly :
+                 fc_nonroot ? msdbrw_write :
+                              msdbrw_needsuperuser);
   checkpath();
   log_message("startup packages %s", cipaction->olong);
 

+ 11 - 5
src/querycmd.c

@@ -201,7 +201,10 @@ listpackages(const char *const *argv)
   int failures = 0;
   struct list_format fmt;
 
-  modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
+  if (!*argv)
+    modstatdb_init(admindir, msdbrw_readonly);
+  else
+    modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
 
   pkg_array_init_from_db(&array);
   pkg_array_sort(&array, pkg_sorter_by_name);
@@ -368,10 +371,10 @@ enqperpackage(const char *const *argv)
   if (!*argv)
     badusage(_("--%s needs at least one package name argument"), cipaction->olong);
 
-  if (cipaction->arg_int == act_listfiles)
-    modstatdb_init(admindir, msdbrw_readonly);
-  else
+  if (cipaction->arg_int == act_printavail)
     modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
+  else
+    modstatdb_init(admindir, msdbrw_readonly);
 
   while ((thisarg = *argv++) != NULL) {
     pkg = pkg_db_find(thisarg);
@@ -466,7 +469,10 @@ showpackages(const char *const *argv)
     return failures;
   }
 
-  modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
+  if (!*argv)
+    modstatdb_init(admindir, msdbrw_readonly);
+  else
+    modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
 
   pkg_array_init_from_db(&array);
   pkg_array_sort(&array, pkg_sorter_by_name);

+ 2 - 2
src/select.c

@@ -50,7 +50,7 @@ void getselections(const char *const *argv) {
   const char *thisarg;
   int i, found;
 
-  modstatdb_init(admindir, msdbrw_readonly | msdbrw_available);
+  modstatdb_init(admindir, msdbrw_readonly);
 
   pkg_array_init_from_db(&array);
   pkg_array_sort(&array, pkg_sorter_by_name);
@@ -154,7 +154,7 @@ void clearselections(const char *const *argv)
   if (*argv)
     badusage(_("--%s takes no arguments"), cipaction->olong);
 
-  modstatdb_init(admindir, msdbrw_write | msdbrw_available);
+  modstatdb_init(admindir, msdbrw_write);
 
   it = pkg_db_iter_new();
   while ((pkg = pkg_db_iter_next(it))) {