おためしアプリのできあがり
ここまでに示したメール受信,XMLパース,DB登録の各コードをmainから順に呼び出せばできあがり。Windows-Schedulerに登録しておけば定期的に起動できます。
int main() {
locale ja("japanese");
wcerr.imbue(ja);
wcout.imbue(ja);
try {
XMLPlatformUtils::Initialize();
} catch ( const XMLException& ex ) {
wcerr << ex.getMessage();
return 1;
}
// POP3からXMLを読み取り、
vector<string> msgs;
get_xml_from_pop3(pop3_address, pop3_port, mail_user, mail_pass, back_inserter(msgs));
wcout << L"----------- I've got these XMLs ------------------" << endl;
for_each(begin(msgs), end(msgs), [](const string& body) { cout << body << endl; });
// XMLから<word>要素の"en","ja"属性値を抽出し、
vector<word_type> words;
extract_words(begin(msgs), end(msgs), back_inserter(words));
wcout << L"----------- I'found these words in the XMLs ------------------" << endl;
for_each(begin(words), end(words),
[](const word_type& word) { wcout << get<0>(word) << L',' << get<1>(word) << endl; });
// データベースに登録して、
sqlite3* db;
sqlite3_open(db_path.c_str(), &db);
create_table(db);
insert_word(begin(words), end(words), db);
// 登録された単語を出力する
words.clear();
enumerate_word(db, back_inserter(words));
wcout << L"----------- now I have these words ------------------" << endl;
for_each(begin(words), end(words),
[](const word_type& word) { wcout << get<0>(word) << L',' << get<1>(word) << endl; });
sqlite3_close(db);
XMLPlatformUtils::Terminate();
return 0;
}
僕が書いたのはそれぞれのライブラリ間を仲介する"糊"の部分だけで、それさえもC++標準ライブラリで楽させてもらいました。コードいじくりまわしていたのは正味3時間くらいだったでしょうか。コードの総行数は200行そこそこながら依頼主には満足してもらえたみたい。
僕のオシゴト、熟考を要する設計/実装もあれば今回のようにざっくりと手早い実現が求められることも少なくありません。こんなこともあろうかと(?)ライブラリの入手と調査、メンテナンスに時間を割いておりますですよ。
