SQLite3 다운로드 : http://sqlite.org/download.html

SQLite3 라이센스Public Domain

기본적으로 다운로드 받은 소스에서 sqlite3.c / sqlite3.h / sqlite3ext.h 만 프로젝트에 포함시키면 SQLite3 를 사용할 수 있다.

SQLite3 의 장점. 작고, 설정 필요 없이 사용가능하고, 단일 파일에 모든 내용이 저장되며, 여러 플랫폼에서 하나의 db 파일을 사용할 수 있다.

SQLite3 를 통해 작업중인 맵에디터에 리소스 관리 부분을 붙여보기 위해서 사용법을 익히는중..(@_@b) <>


#include <stdio.h>
#include <stdlib.h>

#include "sqlite3/sqlite3.h"

static int callback(void* notUse, int argc, char** argv, char** colName)
{
	// sql 구문에 의해서 명령어 처리시 사용되는 콜백함수.
	// argc : 데이터 갯수.
	// argv : 데이터 항목.
	// colName : 데이터 항목의 분류명.

	/*
	 * 예제 db 테이블...
	 * /'''''''' argc '''''''''\
	 * +--------------+---------+
	 * | char name(80)| int agc | <-- colName
	 * +--------------+---------+
	 * | 이름1        | 10      | <-- argv
	 * | 이름11       | 20      |
	 * +--------------+---------+
	 */
	for (int i = 0; i < argc; ++i)
	{
		printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "(null)");
	}

	printf("\n");
	return 0;
}

#define CHECK_QUIT(INFO, RET) \
	if (ret != SQLITE_OK) { fprintf(stderr, "'%s' error\n", INFO); return RET; }
#define CHECK(INFO) \
	if (ret != SQLITE_OK) { fprintf(stderr, "'%s' error\n", INFO); }
#define ERROR(INFO) \
	fprintf(stderr, "%s : '%s'\n", INFO, sqlite3_errmsg(db));

int main(int argc, char** argv)
{
	sqlite3* db;
	char* errMsg = NULL;
	char* filename = "test.db"; /// 해당 파일이 없는 경우 sqlite3_open 함수 호출시 빈 db 파일 생성.
	char* createTableQuery = "create table test_table(name text(20), age int);";
	char* insertDataQuery = "insert into test_table(name, age) values('이름', 10);";
	char* requestTableQuery = "select * from test_table;";

	int ret = sqlite3_open(argv[1], &db);

	if (ret == SQLITE_OK)
	{
		/// 1. 테스트 테이블 생성
		ret = sqlite3_exec(db, createTableQuery, callback, 0, &errMsg);
		CHECK("createTableQuery");

		/// 2. 테스트 테이블에 데이터 삽입
		ret = sqlite3_exec(db, insertDataQuery, callback, 0, &errMsg);
		CHECK("insertDataQuery");

		/// 3. 테스트 테이블 요청
		ret = sqlite3_exec(db, requestTableQuery, callback, 0, &errMsg);
		CHECK("requestTableQuery");

		/// 4. sqlite3_exe 함수와 callback 함수를 사용하지 않고 데이터 읽기. (3단계와 같은 동작)
		{
			sqlite3_stmt* stmt;

			ret = sqlite3_exec(db, "BEGIN", 0, 0, 0);
			CHECK("트랜잭션 걸기");

			if (sqlite3_prepare(db, requestTableQuery, -1, &stmt, NULL) == SQLITE_OK)
			{
				while (sqlite3_step(stmt) == SQLITE_ROW)
				{
					/// windows 콘솔창에서 한글이 출력되지 않으면.. setlocale(LC_ALL, "") 함수를
					/// 통해서 출력되도록 할 수 있다.
					wprintf(L"name:%s, age:%s\n",
							(char*)sqlite3_column_text(stmt, 0),
							(char*)sqlite3_column_text(stmt, 1));
				}
			}
			else
			{
				ERROR("에러");
			}

			ret = sqlite3_exec(db, "END", 0, 0, 0);
			CHECK("트랜잭션 해제");

			sqlite3_finalize(stmt);
		}

		sqlite3_close(db);
	}
	else
	{
		ERROR("데이터베이스 열기 실패");
		sqlite3_close(db);
		return -1;
	}

	return 0;
}


Posted by ngcbbs
,