example_metadata_key.cc
This example demonstrates how to use MetadataKey. It displays all the metadata keys for a particular PackageID and all repositories.
#include <paludis/paludis.hh>
#include "example_command_line.hh"
#include <iostream>
#include <iomanip>
#include <set>
#include <time.h>
using namespace paludis;
using namespace examples;
using std::cout;
using std::endl;
using std::left;
using std::setw;
namespace
{
void show_key(const MetadataKey & key, const std::string & indent = "");
class MetadataKeyInformationVisitor :
public ConstVisitor<MetadataKeyVisitorTypes>
{
private:
StringifyFormatter formatter;
std::string indent;
public:
MetadataKeyInformationVisitor(const std::string & i = "") :
indent(i)
{
}
void visit(const MetadataValueKey<std::string> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataValueKey<std::string>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.value() << endl;
}
void visit(const MetadataValueKey<long> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataValueKey<long>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.value() << endl;
}
void visit(const MetadataValueKey<bool> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataValueKey<bool>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.value() << endl;
}
void visit(const MetadataValueKey<FSEntry> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataValueKey<FSEntry>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.value() << endl;
}
void visit(const MetadataValueKey<std::tr1::shared_ptr<const PackageID> > & key)
{
cout << indent << left << setw(30) << " Class:" << " " <<
"MetadataValueKey<std::tr1::shared_ptr<const PackageID> >" << endl;
cout << indent << left << setw(30) << " Value:" << " " << *key.value() << endl;
}
void visit(const MetadataTimeKey & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataTimeKey" << endl;
time_t t(key.value());
char buf[255];
if (! strftime(buf, 254, "%c", gmtime(&t)))
buf[0] = '\0';
cout << indent << left << setw(30) << " Value:" << " " << buf << endl;
}
void visit(const MetadataValueKey<std::tr1::shared_ptr<const Contents> > &)
{
cout << indent << left << setw(30) << " Class:" << " " <<
"MetadataValueKey<std::tr1::shared_ptr<const Contents> > " << endl;
}
void visit(const MetadataValueKey<std::tr1::shared_ptr<const Choices> > &)
{
cout << indent << left << setw(30) << " Class:" << " " <<
"MetadataValueKey<std::tr1::shared_ptr<const Choices> > " << endl;
}
void visit(const MetadataValueKey<std::tr1::shared_ptr<const RepositoryMaskInfo> > & key)
{
cout << indent << left << setw(30) << " Class:" << " " <<
"MetadataValueKey<std::tr1::shared_ptr<const RepositoryMaskInfo> >" << endl;
if (key.value())
{
cout << indent << left << setw(30) << " Mask file:" << " " << key.value()->mask_file() << endl;
cout << indent << left << setw(30) << " Comment:" << " ";
bool first(true);
for (Sequence<std::string>::ConstIterator i(key.value()->comment()->begin()),
i_end(key.value()->comment()->end()) ;
i != i_end ; ++i)
{
if (! first)
cout << indent << left << setw(30) << " ..." << " ";
cout << *i << endl;
first = false;
}
}
}
void visit(const MetadataSpecTreeKey<PlainTextSpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<PlainTextSpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataSpecTreeKey<ProvideSpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<ProvideSpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataSpecTreeKey<LicenseSpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<LicenseSpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataSpecTreeKey<SimpleURISpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<SimpleURISpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataSpecTreeKey<DependencySpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<DependencySpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataSpecTreeKey<FetchableURISpecTree> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSpecTreeKey<FetchableURISpecTree>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
cout << indent << left << setw(30) << " Initial label:" << " " << key.initial_label()->text() << endl;
}
void visit(const MetadataCollectionKey<KeywordNameSet> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataCollectionKey<KeywordNameSet>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << key.pretty_print_flat(formatter) << endl;
}
void visit(const MetadataCollectionKey<Set<std::string> > & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataCollectionKey<Set<std::string> >" << endl;
cout << indent << left << setw(30) << " Value:" << " " << join(key.value()->begin(), key.value()->end(), " ") << endl;
}
void visit(const MetadataCollectionKey<Sequence<std::string> > & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataCollectionKey<Sequence<std::string> >" << endl;
cout << indent << left << setw(30) << " Value:" << " " << join(key.value()->begin(), key.value()->end(), " ") << endl;
}
void visit(const MetadataCollectionKey<FSEntrySequence> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataCollectionKey<FSEntrySequence>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << join(key.value()->begin(), key.value()->end(), " ") << endl;
}
void visit(const MetadataCollectionKey<PackageIDSequence> & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataCollectionKey<PackageIDSequence>" << endl;
cout << indent << left << setw(30) << " Value:" << " " << join(indirect_iterator(key.value()->begin()),
indirect_iterator(key.value()->end()), " ") << endl;
}
void visit(const MetadataSectionKey & key)
{
cout << indent << left << setw(30) << " Class:" << " " << "MetadataSectionKey" << endl;
cout << indent << left << setw(30) << " Keys:" << endl;
for (MetadataSectionKey::MetadataConstIterator k(key.begin_metadata()), k_end(key.end_metadata()) ;
k != k_end ; ++k)
{
show_key(**k, indent + " ");
cout << endl;
}
}
};
void show_key(const MetadataKey & key, const std::string & indent)
{
cout << indent << left << setw(30) << " Raw name:" << " " << key.raw_name() << endl;
cout << indent << left << setw(30) << " Human name:" << " " << key.human_name() << endl;
cout << indent << left << setw(30) << " Type:" << " " << key.type() << endl;
MetadataKeyInformationVisitor v(indent);
key.accept(v);
}
}
int main(int argc, char * argv[])
{
int exit_status(0);
try
{
CommandLine::get_instance()->run(argc, argv,
"example_metadata_key", "EXAMPLE_METADATA_KEY_OPTIONS", "EXAMPLE_METADATA_KEY_CMDLINE");
std::tr1::shared_ptr<Environment> env(EnvironmentFactory::get_instance()->create(
CommandLine::get_instance()->a_environment.argument()));
std::tr1::shared_ptr<const PackageIDSequence> ids((*env)[selection::AllVersionsSorted(
generator::Matches(make_package_dep_spec().package(QualifiedPackageName("sys-apps/paludis")), MatchPackageOptions()))]);
for (PackageIDSet::ConstIterator i(ids->begin()), i_end(ids->end()) ;
i != i_end ; ++i)
{
cout << **i << ":" << endl;
for (PackageID::MetadataConstIterator k((*i)->begin_metadata()), k_end((*i)->end_metadata()) ;
k != k_end ; ++k)
{
show_key(**k);
cout << endl;
}
cout << endl;
}
for (PackageDatabase::RepositoryConstIterator r(env->package_database()->begin_repositories()),
r_end(env->package_database()->end_repositories()) ;
r != r_end ; ++r)
{
cout << (*r)->name() << ":" << endl;
for (Repository::MetadataConstIterator k((*r)->begin_metadata()), k_end((*r)->end_metadata()) ;
k != k_end ; ++k)
{
show_key(**k);
cout << endl;
}
cout << endl;
}
}
catch (const Exception & e)
{
cout << endl;
cout << "Unhandled exception:" << endl
<< " * " << e.backtrace("\n * ")
<< e.message() << " (" << e.what() << ")" << endl;
return EXIT_FAILURE;
}
catch (const std::exception & e)
{
cout << endl;
cout << "Unhandled exception:" << endl
<< " * " << e.what() << endl;
return EXIT_FAILURE;
}
catch (...)
{
cout << endl;
cout << "Unhandled exception:" << endl
<< " * Unknown exception type. Ouch..." << endl;
return EXIT_FAILURE;
}
return exit_status;
}