]>
git.ipfire.org Git - pakfire.git/blob - pakfire/database.py
10 from constants
import *
12 class Database(object):
13 def __init__(self
, pakfire
, filename
):
14 self
.pakfire
= pakfire
15 self
.filename
= filename
30 logging
.debug("Open database %s" % self
.filename
)
32 dirname
= os
.path
.dirname(self
.filename
)
33 if not os
.path
.exists(dirname
):
36 database_exists
= os
.path
.exists(self
.filename
)
38 # Make a connection to the database.
39 self
._db
= sqlite3
.connect(self
.filename
)
40 self
._db
.row_factory
= sqlite3
.Row
42 # Create the database if it was not there, yet.
43 if not database_exists
:
53 return self
._db
.cursor()
56 class PackageDatabase(Database
):
69 CREATE TABLE packages(
70 id INTEGER PRIMARY KEY,
89 # XXX add some indexes here
94 def list_packages(self
):
96 c
.execute("SELECT DISTINCT name FROM packages ORDER BY name")
103 def package_exists(self
, pkg
):
104 return not self
.get_id_by_pkg(pkg
) is None
106 def get_id_by_pkg(self
, pkg
):
109 c
.execute("SELECT id FROM packages WHERE name = ? AND version = ? AND \
110 release = ? AND epoch = ? LIMIT 1", (pkg
.name
, pkg
.version
, pkg
.release
, pkg
.epoch
))
121 def add_package(self
, pkg
):
122 raise NotImplementedError
125 class RemotePackageDatabase(PackageDatabase
):
126 def add_package(self
, pkg
, reason
=None):
127 if self
.package_exists(pkg
):
128 logging
.debug("Skipping package which already exists in database: %s" % pkg
.friendly_name
)
131 logging
.debug("Adding package to database: %s" % pkg
.friendly_name
)
135 filename
= pkg
.filename
[len(pkg
.repo
.path
) + 1:]
139 INSERT INTO packages(
156 ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
164 " ".join(pkg
.provides
),
165 " ".join(pkg
.requires
),
166 " ".join(pkg
.conflicts
),
167 " ".join(pkg
.obsoletes
),
179 pkg_id
= self
.get_id_by_pkg(pkg
)
182 for file in pkg
.filelist
:
183 c
.execute("INSERT INTO files(name, pkg) VALUES(?, ?)", (file, pkg_id
))
191 class LocalPackageDatabase(RemotePackageDatabase
):
192 def __init__(self
, pakfire
):
193 # Generate filename for package database
194 filename
= os
.path
.join(pakfire
.path
, PACKAGES_DB
)
196 RemotePackageDatabase
.__init
__(self
, pakfire
, filename
)
199 RemotePackageDatabase
.create(self
)
201 # Alter the database layout to store additional local information.
202 logging
.debug("Altering database table for local information.")
205 ALTER TABLE packages ADD COLUMN installed INT;
206 ALTER TABLE packages ADD COLUMN reason TEXT;
207 ALTER TABLE packages ADD COLUMN repository TEXT;
212 def add_package(self
, pkg
, reason
=None):
213 # Insert all the information to the database we have in the remote database
214 pkg_id
= RemotePackageDatabase
.add_package(self
, pkg
)
216 # then: add some more information
219 # Save timestamp when the package was installed.
220 c
.execute("UPDATE packages SET installed = ? WHERE id = ?", (time
.time(), pkg_id
))
222 # Add repository information.
223 c
.execute("UPDATE packages SET repository = ? WHERE id = ?", (pkg
.repo
.name
, pkg_id
))
225 # Save reason of installation (if any).
227 c
.execute("UPDATE packages SET reason = ? WHERE id = ?", (reason
, pkg_id
))
229 # Update the filename information.
230 c
.execute("UPDATE packages SET filename = ? WHERE id = ?", (pkg
.filename
, pkg_id
))