Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

소개

callback 함수를 호출하지 않고, 낮은 수준의 API를 이용해서 직접 질의 결과를 처리한다.
#include <sqlite3.h>
#include <string.h>
#include <stdio.h>

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Sqlite
{
private:
	sqlite3 *mdb;
	string mdbname;
	sqlite3_stmt *stmt;
	vector<string> mRow;
	bool classCheckFlag;

public:
	Sqlite(string adbname)
	{
		int rc;
		classCheckFlag = false;
		mdbname = adbname;
		// DB 열기
		rc = sqlite3_open(mdbname.c_str(), &mdb);
		if(rc == SQLITE_OK)
		{
			classCheckFlag = true;
		}
	}

	~Sqlite()
	{
		sqlite3_close(mdb); 
	}

	bool ClassCheck()
	{
		return classCheckFlag;
	}
	
	
	int Exec(string sql)
	{
		int rc;

		// sql을 실행한다.
		rc = sqlite3_prepare(mdb, sql.c_str(), sql.length(), &stmt, NULL);
		if(rc != SQLITE_OK)
		{
			return 1;
		}
		return 0;
	}
	
	vector<string> GetRows()
	{
		int rc;
		int n;
		int i;
		char buf[80];
		mRow.clear();

		// sqlite3_step로 row 데이터를 하나씩 가져온다.
		rc = sqlite3_step(stmt);
		if(rc != SQLITE_DONE)
		{
			switch(rc)
			{
				case SQLITE_BUSY:
					break;
				case SQLITE_ERROR:
					break;
				// row 데이터를 가져왔다면
				// 컬럼 데이터를 읽어온다. 
				case SQLITE_ROW:
					n = sqlite3_column_count(stmt);
					for(i = 0; i < n ; i++)
					{
						switch(sqlite3_column_type(stmt, i))
						{
							case SQLITE_TEXT:
								mRow.push_back((const char *)sqlite3_column_text(stmt, i));
								break;
							case SQLITE_INTEGER:
								sprintf(buf, "%d", sqlite3_column_int(stmt, i));
								mRow.push_back(buf);
								break;
							case SQLITE_FLOAT:
								sprintf(buf, "%f", sqlite3_column_double(stmt, i));
								mRow.push_back(buf);
								break;
							case SQLITE_NULL:
								mRow.push_back("");
								break;
							default:
								cout << "Unknown Field" << endl;
							break;
						}
					}
					break;
				case SQLITE_MISUSE:
					break;
				default:
					break;
			}
		}
		else
		{
			cout << "SQL Exec Complete" << endl;
		}
		return mRow;
	}
	
	void ExecFree()
	{
		sqlite3_finalize(stmt);
	}
 
	int Exec(string sql, int (*callback)(void*,int,char**,char**))
	{
		int rc;
		rc = sqlite3_exec(mdb, sql.c_str(), callback, 0, NULL);
		if(rc != SQLITE_OK)
		{
			return 1; 
		}
		return 0; 
	}
};

int main()
{
	vector<string> Row;
	Sqlite mySql("test.db");
	if(!mySql.ClassCheck())
	{
		return 1;
	}

	mySql.Exec("select * from session");
	int i;
	for(;;)
	{
		Row = mySql.GetRows();
		if(Row.size() > 0)
		{
			for(i = 0; i < Row.size(); i++)
			{
				cout << Row[i] << "  ";
			}
			cout << endl;
		}
		else
		{
			break;
		}
	}
	mySql.ExecFree();
}