new database schema, containing package info

This commit is contained in:
lilydjwg 2013-02-11 21:22:54 +08:00
parent 467605b292
commit 9ac3ed8f3b
4 changed files with 77 additions and 5 deletions

View file

@ -13,6 +13,5 @@ DEPENDENCIES
TODO TODO
==== ====
* [mediate] read package info
* [low] support symlinking packages here * [low] support symlinking packages here
* [low] verify packages * [low] verify packages

View file

@ -12,6 +12,7 @@ import sqlite3
import socket import socket
import time import time
import hashlib import hashlib
import pickle
import pyinotify import pyinotify
Event = pyinotify.Event Event = pyinotify.Event
@ -19,6 +20,7 @@ from tornado.ioloop import IOLoop
import tornado.process import tornado.process
import archpkg import archpkg
import pkgreader
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -197,7 +199,8 @@ class EventHandler(pyinotify.ProcessEvent):
forarch text, forarch text,
owner text, owner text,
mtime int, mtime int,
state int)''') state int,
info text)''')
dirs = [os.path.join(base, x) for x in ('any', 'i686', 'x86_64')] dirs = [os.path.join(base, x) for x in ('any', 'i686', 'x86_64')]
self.files = files = set() self.files = files = set()
@ -305,11 +308,18 @@ class EventHandler(pyinotify.ProcessEvent):
except KeyError: except KeyError:
owner = 'uid_%d' % stat.st_uid owner = 'uid_%d' % stat.st_uid
try:
info = pkgreader.readpkg(act.path)
except:
logger.error('failed to read info for package %s', act.path)
info = None
info = pickle.dumps(info)
self._db.execute( self._db.execute(
'''insert or replace into pkginfo '''insert or replace into pkginfo
(filename, pkgname, pkgarch, pkgver, forarch, state, owner, mtime) values (filename, pkgname, pkgarch, pkgver, forarch, state, owner, mtime, info) values
(?, ?, ?, ?, ?, ?, ?, ?)''', (?, ?, ?, ?, ?, ?, ?, ?, ?)''',
(act.path, act.name, act.arch, act.fullversion, arch, 1, owner, mtime)) (act.path, act.name, act.arch, act.fullversion, arch, 1, owner, mtime, info))
else: else:
res = self._db.execute('select state from pkginfo where filename = ? and state = 1 limit 1', (act.path,)) res = self._db.execute('select state from pkginfo where filename = ? and state = 1 limit 1', (act.path,))

18
scripts/common.py Normal file
View file

@ -0,0 +1,18 @@
import sqlite3
def getver(db):
try:
ver = tuple(db.execute('select ver from version_info limit 1'))[0][0]
except sqlite3.OperationalError:
ver = '0.1' # This version has no version info
return ver
def setver(db, ver):
db.execute('''create table if not exists version_info
(ver text)''')
c = tuple(db.execute('select count(*) from version_info'))[0][0]
if c == 1:
db.execute('update version_info set ver=?', (ver,))
else:
db.execute('insert into version_info (ver) values (?)', (ver,))
db.commit()

45
scripts/upgrade_from_0.1.py Executable file
View file

@ -0,0 +1,45 @@
#!/usr/bin/env python3
# vim:fileencoding=utf-8
import os, sys
import sqlite3
import configparser
import pickle
top_dir = os.path.normpath(os.path.join(__file__, '../..'))
sys.path.append(top_dir)
import pkgreader
from common import *
def main(conffile):
config = configparser.ConfigParser()
config.read(conffile)
config = config['repository']
base = config.get('path')
dbname = config.get('info-db', os.path.join(base, 'pkginfo.db'))
db = sqlite3.connect(dbname, isolation_level=None)
assert getver(db) == '0.1', 'wrong database version'
input('Please stop the service and then press Enter.')
try:
db.execute('alter table pkginfo add info text')
except sqlite3.OperationalError:
# the column is already there
pass
pkgs = [x[0] for x in db.execute('select filename from pkginfo')]
for p in pkgs:
try:
info = pkgreader.readpkg(p)
except:
logger.error('failed to read info for package %s', act.path)
info = None
info = pickle.dumps(info)
db.execute('update pkginfo set info=?', (info,))
setver(db, '0.2')
db.close()
input('Please re-start the service with new code and then press Enter.')
if __name__ == '__main__':
main(sys.argv[1])