[Debtags-commits] [svn] r1919 - in daemon: . src

Enrico Zini enrico at costa.debian.org
Mon Sep 18 12:55:16 UTC 2006


Author: enrico
Date: Mon Sep 18 12:55:15 2006
New Revision: 1919

Modified:
   daemon/   (props changed)
   daemon/src/debtagsd.cpp
Log:
 r3353 at viaza:  enrico | 2006-09-18 14:23:50 +0200
 Output package data as well as package names


Modified: daemon/src/debtagsd.cpp
==============================================================================
--- daemon/src/debtagsd.cpp	(original)
+++ daemon/src/debtagsd.cpp	Mon Sep 18 12:55:15 2006
@@ -11,6 +11,7 @@
 
 #include <tagcoll/coll/fast.h>
 #include <tagcoll/input/stdio.h>
+#include <tagcoll/input/zlib.h>
 #include <tagcoll/TextFormat.h>
 
 #include <iostream>
@@ -21,6 +22,7 @@
 
 #include "lib/SignalCatcher.h"
 #include "lib/FullText.h"
+#include "lib/debdbparser.h"
 
 #if 0
 
@@ -231,6 +233,39 @@
 	return res;
 }
 
+class ShortDescs : public std::map<std::string, std::string>
+{
+public:
+	ShortDescs()
+	{
+		tagcoll::input::Zlib in("packages.gz");
+		DebDBParser parser(in);
+		DebDBParser::Record rec;
+		while (parser.nextRecord(rec))
+		{
+			size_t sd = rec["Description"].find("\n");
+			if (sd == string::npos)
+				insert(make_pair(rec["Package"], rec["Description"]));
+			else
+				insert(make_pair(rec["Package"], rec["Description"].substr(0, sd)));
+		}
+	}
+
+	std::string get(const std::string& pkg) const
+	{
+		const_iterator i = find(pkg);
+		if (i == end())
+			return std::string();
+		else
+			return i->second;
+	}
+
+	std::string operator()(const std::string& pkg) const
+	{
+		return get(pkg);
+	}
+};
+
 class Debtagsd : public wibble::sys::ChildProcess
 {
 protected:
@@ -245,8 +280,26 @@
 
 	tagcoll::coll::Fast<std::string, std::string> coll;
 	
+	ShortDescs desc;
 	FullTextSearch fts;
 
+	void outputPackage(const std::string& pkg, Connection& conn)
+	{
+		using namespace std;
+		conn.write(pkg);
+		conn.write(" ");
+		set<string> tags(coll.getTagsOfItem(pkg));
+		for (set<string>::const_iterator i = tags.begin(); i != tags.end(); ++i)
+		{
+			if (i != tags.begin())
+				conn.write(",");
+			conn.write(*i);
+		}
+		conn.write(" ");
+		conn.write(desc(pkg));
+		conn.write("\n");
+	}
+
 	void handleConnection(Connection& conn)
 	{
 		using namespace std;
@@ -269,17 +322,14 @@
 				set<string> pkgs = coll.getItemsHavingTags(tags);
 				for (set<string>::const_iterator i = pkgs.begin();
 						i != pkgs.end(); ++i)
-				{
-					//cerr << "Print " << *i << endl;
-					conn.write(*i + "\n");
-				}
+					outputPackage(*i, conn);
 			}
 			else if (cmd == "FTS")
 			{
 				vector<string> terms = parseKeys(line);
 				set<string> res = fts.search(terms);
 				for (set<string>::const_iterator i = res.begin(); i != res.end(); ++i)
-					conn.write(*i + "\n");
+					outputPackage(*i, conn);
 			}
 			else
 				conn.write("Lippocippo\n");



More information about the Debtags-commits mailing list