なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

wxSQLite3を使う

SQLiteAndroidの標準DB(?)にも採用されている優れたリレーショナルデータベースです。
wxWidgetsで使おうと思っていたので、wxSQLite3をビルドして組み込んでみた。

まずぶち当たるのはバージョンの問題。SQLite自体が結構な速さで更新されているのでちゃんとwxSQLite3とのバージョンを合わせないとビルドできない。
今回はwxsqlite3-2.1.3とsqlite-autoconf-3070900を使ってビルドした。

ビルドの注意点としてはwxSQLite3はwxのライブラリを必要とするということ。makeの途中で止まったら「make LDFLAGS='-lhogehogelibrary'」みたいな感じでガガっと読み込ませてください。
mingwの場合「/c/mingw/lib」以下に「libwxcode_mswu_wxsqlite3-2.9.a」とか「libsqlite3.a」があれば成功じゃないかなと。

そしてお手本アプリの劣化版を作ってビルドしてみる。

Main.cpp

/*
 * Main.cpp
 *
 *  Created on: 2012/01/17
 *      Author: learning
 */

#include <wx/wxprec.h>

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include "WxSQLiteMinimal.h"


class wxMain: public wxApp {

public:
    bool OnInit();
};

IMPLEMENT_APP(wxMain)

bool wxMain::OnInit()
{
    WxSQLiteMinimal* wxSQLiteMinimal = new WxSQLiteMinimal();

    return true;
}

WxSQLiteMinimal.cpp

/*
 * WxSQLiteMinimal.cpp
 *
 *  Created on: 2012/01/17
 *      Author: learning
 */

#include "WxSQLiteMinimal.h"

bool WxSQLiteMinimal::OnInit() {
	return true;
}

int WxSQLiteMinimal::OnExit() {
	return 0;
}

int WxSQLiteMinimal::OnRun() {

	const wxString dbFile = wxGetCwd() + wxT("/test.db");

	try {
	    // データベースの初期化
	    wxSQLite3Database::InitializeSQLite();

	    wxSQLite3Database db;

	    cout << "SQLite3 Version:      " << (const char*) db.GetVersion().mb_str(wxConvUTF8) << endl;
	    cout << "SQLite3 Source Id:    " << (const char*) db.GetSourceId().mb_str(wxConvUTF8) << endl;

	    // DBを開く
	    db.Open(dbFile);

	} catch (wxSQLite3Exception& e) {
		cerr << e.GetErrorCode() << ":" << (const char*) (e.GetMessage().mb_str()) << endl;
	}
	return 0;
}

WxSQLiteMinimal.h

/*
 * WxSQLiteMinimal.h
 *
 *  Created on: 2012/01/17
 *      Author: learning
 */

#ifndef WXSQLITEMINIMAL_H_
#define WXSQLITEMINIMAL_H_

#include <wx/wxprec.h>

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include "wx/wxsqlite3.h"
#include <ctime>
#include <iostream>

using namespace std;

class WxSQLiteMinimal: public wxAppConsole {
public:
	bool OnInit();
	int OnRun();
	int OnExit();
private:
};

#endif /* WXSQLITEMINIMAL_H_ */

Makefile

# Makefile
TARGET 	= WxSQLiteMinimal.exe
OBJECTS = WxSQLiteMinimal.o Main.o

# 基本コマンド
RM 	:= rm
CXX 	:= g++
CC 	:= g++
WINDRES := windres

# デバッグ時とリリース時の微調整
CXX_DEBUG_FLAGS		=	-g -O0
CXX_RELEASE_FLAGS	=	-s -O0

# 基本オプション
CPPFLAGS = -Wall -I/c/MinGW/include -I/mingw/include/wx -I include `wx-config --cxxflags`
LDFLAGS  = -L/c/MinGW/lib -static -lwxcode_mswu_wxsqlite3-2.9 -lsqlite3 `wx-config --libs`
VPATH	 = include src

# make
# debug
.PHONY	: Debug
Debug 	: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
Debug 	: all
# release
.PHONY	: Release
Release	: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
Release	: all

all : $(TARGET)
$(TARGET) : $(OBJECTS)
		$(CXX) $^ -o $@ $(LDFLAGS)
WxSQLiteMinimal.o : WxSQLiteMinimal.cpp WxSQLiteMinimal.h
		$(CXX) -c $< $(CPPFLAGS)
Main.o : Main.cpp WxSQLiteMinimal.h
		$(CXX) -c $< $(CPPFLAGS)


# make clean
.PHONY: clean
clean:
	rm -f *.o $(TARGET)

ライブラリの読み込み順は今回ちょっと重要で、「-L/c/MinGW/lib -static -lwxcode_mswu_wxsqlite3-2.9 -lsqlite3 `wx-config --libs`」
wx-config --libsを後に読み込ませないとundefined referenceが出た。多分wxsqliteの内部でwxregexを呼んでるからじゃないかなあと推測。