[csw-devel] SF.net SVN: gar:[7821] csw/mgar/gar/v2-checkpkg/bin/checkpkg.d/checkpkg.py
wahwah at users.sourceforge.net
wahwah at users.sourceforge.net
Sat Jan 2 10:49:53 CET 2010
Revision: 7821
http://gar.svn.sourceforge.net/gar/?rev=7821&view=rev
Author: wahwah
Date: 2010-01-02 09:49:52 +0000 (Sat, 02 Jan 2010)
Log Message:
-----------
mGAR v2-checkpkg: Implemented cache age checking, this was the last missing major feature.
Modified Paths:
--------------
csw/mgar/gar/v2-checkpkg/bin/checkpkg.d/checkpkg.py
Modified: csw/mgar/gar/v2-checkpkg/bin/checkpkg.d/checkpkg.py
===================================================================
--- csw/mgar/gar/v2-checkpkg/bin/checkpkg.d/checkpkg.py 2010-01-02 08:46:38 UTC (rev 7820)
+++ csw/mgar/gar/v2-checkpkg/bin/checkpkg.d/checkpkg.py 2010-01-02 09:49:52 UTC (rev 7821)
@@ -3,20 +3,22 @@
# This is the checkpkg library, common for all checkpkg tests written in
# Python.
+import itertools
+import logging
import optparse
import os
import os.path
-import logging
-import subprocess
import re
+import socket
import sqlite3
-import socket
+import subprocess
SYSTEM_PKGMAP = "/var/sadm/install/contents"
WS_RE = re.compile(r"\s+")
NEEDED_SONAMES = "needed sonames"
RUNPATH = "runpath"
SONAME = "soname"
+CONFIG_MTIME = "mtime"
DO_NOT_REPORT_SURPLUS = set([u"CSWcommon", u"CSWcswclassutils", u"CSWisaexec"])
DO_NOT_REPORT_MISSING = set([u"SUNWlibC", u"SUNWcsl", u"SUNWlibms",
u"*SUNWcslr", u"*SUNWlibC", u"*SUNWlibms"])
@@ -25,7 +27,6 @@
# Solaris 8 on i386. It's okay if it's missing.
ALLOWED_ORPHAN_SONAMES = set([u"libm.so.2"])
-
class Error(Exception):
pass
@@ -131,9 +132,14 @@
self.fqdn = socket.getfqdn()
self.db_path = os.path.join(self.checkpkg_dir,
self.SQLITE3_DBNAME_TMPL % self.fqdn)
+ self.file_mtime = None
+ self.cache_mtime = None
if os.path.exists(self.db_path):
logging.debug("Connecting to the %s database.", self.db_path)
self.conn = sqlite3.connect(self.db_path)
+ if not self.IsDatabaseUpToDate():
+ self.PurgeDatabase()
+ self.PopulateDatabase()
else:
print "Building a cache of /var/sadm/install/contents."
print "The cache will be kept in %s." % self.db_path
@@ -150,31 +156,62 @@
line TEXT
);
""")
+ self.debug("Creating the config table.")
+ c.execute("""
+ CREATE TABLE config (
+ key VARCHAR(255) PRIMARY KEY,
+ float_value FLOAT,
+ str_value VARCHAR(255)
+ );
+ """)
+ self.PopulateDatabase()
- # Original bit of code from checkpkg:
- #
- # egrep -v 'SUNWbcp|SUNWowbcp|SUNWucb' /var/sadm/install/contents |
- # fgrep -f $EXTRACTDIR/liblist >$EXTRACTDIR/shortcatalog
+ def PopulateDatabase(self):
+ """Imports data into the database.
- system_pkgmap_fd = open(SYSTEM_PKGMAP, "r")
+ Original bit of code from checkpkg:
+
+ egrep -v 'SUNWbcp|SUNWowbcp|SUNWucb' /var/sadm/install/contents |
+ fgrep -f $EXTRACTDIR/liblist >$EXTRACTDIR/shortcatalog
+ """
- stop_re = re.compile("(%s)" % "|".join(self.STOP_PKGS))
+ system_pkgmap_fd = open(SYSTEM_PKGMAP, "r")
+ stop_re = re.compile("(%s)" % "|".join(self.STOP_PKGS))
+ # Creating a data structure:
+ # soname - {<path1>: <line1>, <path2>: <line2>, ...}
+ logging.debug("Building sqlite3 cache db of the %s file",
+ SYSTEM_PKGMAP)
+ c = self.conn.cursor()
+ count = itertools.count()
+ for line in system_pkgmap_fd:
+ i = count.next()
+ if not i % 1000:
+ print "\r%s" % i,
+ if stop_re.search(line):
+ continue
+ fields = re.split(WS_RE, line)
+ pkgmap_entry_path = fields[0].split("=")[0]
+ pkgmap_entry_dir, pkgmap_entry_base_name = os.path.split(pkgmap_entry_path)
+ sql = "INSERT INTO systempkgmap (basename, path, line) VALUES (?, ?, ?);"
+ c.execute(sql, (pkgmap_entry_base_name, pkgmap_entry_dir, line.strip()))
+ print
+ print "Creating the main database index."
+ sql = "CREATE INDEX basename_idx ON systempkgmap(basename);"
+ c.execute(sql)
+ self.SetDatabaseMtime()
+ self.conn.commit()
- # Creating a data structure:
- # soname - {<path1>: <line1>, <path2>: <line2>, ...}
- logging.debug("Building sqlite3 cache db of the %s file",
- SYSTEM_PKGMAP)
- for line in system_pkgmap_fd:
- if stop_re.search(line):
- continue
- fields = re.split(WS_RE, line)
- pkgmap_entry_path = fields[0].split("=")[0]
- pkgmap_entry_dir, pkgmap_entry_base_name = os.path.split(pkgmap_entry_path)
- sql = "INSERT INTO systempkgmap (basename, path, line) VALUES (?, ?, ?);"
- c.execute(sql, (pkgmap_entry_base_name, pkgmap_entry_dir, line.strip()))
- print "Creating a database index."
- sql = "CREATE INDEX basename_idx ON systempkgmap(basename);"
- self.conn.execute(sql)
+ def SetDatabaseMtime(self):
+ c = self.conn.cursor()
+ sql = "DELETE FROM config WHERE key = ?;"
+ c.execute(sql, [CONFIG_MTIME])
+ mtime = self.GetFileMtime()
+ logging.debug("Inserting the mtime (%s) into the database.", mtime)
+ sql = """
+ INSERT INTO config (key, float_value)
+ VALUES (?, ?);
+ """
+ c.execute(sql, [CONFIG_MTIME, mtime])
def GetPkgmapLineByBasename(self, filename):
if filename in self.cache:
@@ -190,6 +227,46 @@
self.cache[filename] = lines
return lines
+ def GetDatabaseMtime(self):
+ if not self.cache_mtime:
+ sql = """
+ SELECT float_value FROM config
+ WHERE key = ?;
+ """
+ c = self.conn.cursor()
+ c.execute(sql, [CONFIG_MTIME])
+ row = c.fetchone()
+ if not row:
+ # raise ConfigurationError("Could not find the mtime setting")
+ self.cache_mtime = 1
+ else:
+ self.cache_mtime = row[0]
+ return self.cache_mtime
+
+ def GetFileMtime(self):
+ if not self.file_mtime:
+ stat_data = os.stat(SYSTEM_PKGMAP)
+ self.file_mtime = stat_data.st_mtime
+ return self.file_mtime
+
+ def IsDatabaseUpToDate(self):
+ f_mtime = self.GetFileMtime()
+ d_mtime = self.GetDatabaseMtime()
+ logging.debug("f_mtime", f_mtime, "d_time", d_mtime)
+ return self.GetFileMtime() <= self.GetDatabaseMtime()
+
+ def PurgeDatabase(self):
+ c = self.conn.cursor()
+ sql = "DELETE FROM config;"
+ c.execute(sql)
+ sql = "DELETE FROM systempkgmap;"
+ c.execute(sql)
+ sql = "DROP INDEX basename_idx;"
+ try:
+ c.execute(sql)
+ except sqlite3.OperationalError, e:
+ logging.warn(e)
+
def SharedObjectDependencies(pkgname,
binaries_by_pkgname,
needed_sonames_by_binary,
@@ -334,7 +411,7 @@
symlinked_list.append(runpath.replace("/64", "/amd64"))
symlinked_list.append(runpath.replace("/64", "/sparcv9"))
else:
- symlinked_list.append(runpath)
+ symlinked_list.append(runpath)
return symlinked_list
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the devel
mailing list