#!/usr/bin/python
# pdb -- tool to update and query local and remote portage package databases
# Copyright (C) Sept 2001, Chris Houser <chouser@bluweb.com>
# Distributed under the GNU General Public License
# $Header: /home/cvsroot/gentoo-src/portage/bin/pdb,v 1.5 2003/10/13 07:43:38 carpaski Exp $

# config -- begin
dbfile = '/home/c/proj/pkgdb/gentoo'
contpattern = '/var/db/pkg/%s/CONTENTS'
cgiserver = 'localhost:80'
cgipath = '/proj/pkgdb/pdb.cgi'
# config -- end

import sys
from getopt import *

def usage():
	print "Usage: pdb [ --local ] [ --store <pkglist> | --query <file> ]\n"

def localstore(pdb, pkglist):
	for pkgname in pkglist:
		# read each line of the CONTENTS file
		try:
			cont = open(contpattern % pkgname)
			pdb.storestream(cont, pkgname)
		except:
			print "Skipping %s" % pkgname

def remotequery(querylist):
	import urllib
	params = urllib.urlencode({'query': querylist[0]})
	return urllib.urlopen("http://" + cgiserver + cgipath, params)

def remotestore(pkglist):
	from httplib import *
	import os
	bdr='------------------------------9013135344064135372664135304680'
	# calculate content length
	size = len(bdr)*2 + 12 + 65 + 28
	pkglist = []
	for pkgname in args:
		try:
			size+=os.stat(contpattern % pkgname)[6]
			size+=len(pkgname) + 9  # "pkgname \n"
			pkglist.append(pkgname)
		except:
			print "Skipping %s" % pkgname
	
	# begin web request
	http = HTTP(cgiserver)
	http.putrequest('POST', cgipath)
	http.putheader('User-Agent', 'gentoo/0.0')
	http.send('Content-type: multipart/form-data; boundary=%s\r\n' % bdr)
	http.send('Content-length: %d\r\n' % size)
	http.endheaders()
	# set up file upload
	http.send('--%s\r\n' % bdr)
	http.send('Content-Disposition: form-data; name="contfile"; filename="foo"\r\n')
	http.send('Content-Type: text/plain\r\n\r\n')
	# post CONTENTS files
	for pkgname in pkglist:
		try:
			cont = open(contpattern % pkgname)
			http.send('pkgname %s\n' % pkgname)
			while 1:
				line = cont.readline()
				if line == '': break
				http.send(line)
		except:
			print "Aborted %s" % pkgname
	# close down POST and collect results
	http.send('\r\n--%s--\r\n' % bdr)
	errcode, errmsg, headers = http.getreply()
	#print errcode, errmsg, headers
	return http.getfile()

#### main program ####
# do command-line import or query
if len(sys.argv) < 2:
	usage()
	sys.exit(2)

# parse command-line args
try:
	opts, args = getopt(sys.argv[1:], 'sql', ['store', 'query', 'local'])
except GetoptError:
	usage()
	sys.exit(2)
storeflag = 0
localflag = 0
for (a, o) in opts:
	if a in ('-s', '--store'):
		storeflag = 1
	elif a in ('-l', '--local'):
		localflag = 1

# execute request
if localflag:
	import portagedb
	pdb = portagedb.DB(dbfile)
	if storeflag:
		localstore(pdb, args)
	else:
		pdb.doquery(args)
else:
	if storeflag:
		rtn = remotestore(args)
	else:
		rtn = remotequery(args)
	# dump output
	while 1:
		line = rtn.readline()
		if line == '': break
		sys.stdout.write(line)
	rtn.close()
