SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

メールでデータベースを更新するココロミ
~C++での即興実装

フリーなライブラリのコンビネーション

データベースに登録

 ここまでくればあとはどうにでもなりますな。','区切りで出力すればCSVだからexcelに食わせられるし。データベースに流し込みたいとの依頼ですから、テキトーなDBを見繕うことにします。軽量DBで定評のあるSQLiteを使いましょうか。SQLiteはサーバ不要、ライブラリ1つリンクするだけで動くのでお試しにはもってこいです。本番ではOracleなりSQL Serverなりに差し替えてもらえばいいし(なんならそのままSQLiteでも構わんし)。

insert_word.cpp
#include <iostream>
#include <sstream>
#include <locale>
#include <string>
#include <vector>
#include <tuple>
#include <iterator>
#include <algorithm>

// SQLite
#include <sqlite3.h>

using namespace std;
typedef tuple<wstring,wstring> word_type;

// DB上にテーブルを作る
void create_table(sqlite3* db) {
  sqlite3_stmt* statement;
  const wchar_t* command = L"CREATE TABLE IF NOT EXISTS word ( en TEXT, ja TEXT)";
  sqlite3_prepare16_v2(db, command, -1, &statement, 0);
  sqlite3_step(statement);
  sqlite3_finalize(statement);
}

// en,ja をテーブルに挿入
template<typename InputIterator>
void insert_word(InputIterator first, InputIterator last, sqlite3* db) {
  sqlite3_stmt* statement;
  const wchar_t* command = L"INSERT INTO word VALUES ( ?, ? )";
  sqlite3_prepare16_v2(db, command, -1, &statement, 0);
  for_each(first, last, 
           [=](const word_type& word) {
             sqlite3_reset(statement);
             sqlite3_bind_text16(statement, 1, get<0>(word).c_str() , -1, SQLITE_STATIC);
             sqlite3_bind_text16(statement, 2, get<1>(word).c_str() , -1, SQLITE_STATIC);
             sqlite3_step(statement);
           });
  sqlite3_finalize(statement);
}

// 登録されている全wordを取り出す
template<typename OutputIterator>
OutputIterator enumerate_word(sqlite3* db, OutputIterator out) {
  sqlite3_stmt* statement;
  const wchar_t* command = L"SELECT * FROM word";
  sqlite3_prepare16_v2(db, command, -1, &statement, 0);
  while ( sqlite3_step(statement) == SQLITE_ROW ) {
    *out++ = word_type(static_cast<const wchar_t*>(sqlite3_column_text16(statement,0)),
                       static_cast<const wchar_t*>(sqlite3_column_text16(statement,1)));
  }
  sqlite3_finalize(statement);
  return out;
}

const string db_path      = "wordbook.db";

int main() {
  locale ja("japanese");
  wcout.imbue(ja);

  vector<word_type> words;
  words.push_back(word_type(L"pencil",L"えんぴつ"));
  words.push_back(word_type(L"eraser",L"けしごむ"));

  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);
}

次のページ
おためしアプリのできあがり

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6726 2012/08/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー