Initial commit
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
*.o.*
|
||||
*.d.*
|
||||
*.a.*
|
||||
.*.swp
|
||||
.AppleDouble
|
||||
lib
|
||||
Libraries
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "Makefiles"]
|
||||
path = Makefiles
|
||||
url = https://gogs.dierkse.nl/JDierkse/Makefiles
|
||||
@@ -0,0 +1,6 @@
|
||||
#
|
||||
# Makefile.conf
|
||||
#
|
||||
|
||||
CFLAGS += -I$(ROOTPATH) -I$(ROOTPATH)/include
|
||||
DEBUGDIR := .debug
|
||||
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Makefile.target
|
||||
#
|
||||
|
||||
SQLite.a.$(ARCH) : $(OBJECTS)
|
||||
$(call build_target_library_arch,$@,$^)
|
||||
|
||||
SQLite.a:
|
||||
$(call build_target,$@)
|
||||
|
||||
.DEFAULT_GOAL := SQLite.a
|
||||
|
||||
TARGETS += SQLite.a
|
||||
Submodule
+1
Submodule Makefiles added at 61894c4588
Symlink
+1
@@ -0,0 +1 @@
|
||||
../Makefile
|
||||
@@ -0,0 +1,56 @@
|
||||
#include "SQLiteClient.h"
|
||||
#include <sqlite3.h>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
SQLiteClient::SQLiteClient(const std::string& filename)
|
||||
{
|
||||
sqlite3_open(filename.c_str(), &m_pSQLite3);
|
||||
}
|
||||
|
||||
SQLiteClient::~SQLiteClient()
|
||||
{
|
||||
sqlite3_close(m_pSQLite3);
|
||||
}
|
||||
|
||||
SQLiteClient::operator sqlite3*()
|
||||
{
|
||||
return m_pSQLite3;
|
||||
}
|
||||
|
||||
SQLiteResultSet SQLiteClient::ExecuteQuery(const std::string& query)
|
||||
{
|
||||
SQLiteStatement statement(*this, query);
|
||||
return RetrieveResultSet(statement);
|
||||
}
|
||||
|
||||
void SQLiteClient::BeginTransaction()
|
||||
{
|
||||
ExecuteQuery("BEGIN TRANSACTION;");
|
||||
}
|
||||
|
||||
void SQLiteClient::EndTransaction()
|
||||
{
|
||||
ExecuteQuery("END TRANSACTION;");
|
||||
}
|
||||
|
||||
|
||||
SQLiteResultSet SQLiteClient::RetrieveResultSet(SQLiteStatement& statement)
|
||||
{
|
||||
try
|
||||
{
|
||||
SQLiteResultSet resultSet(statement);
|
||||
return resultSet;
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::stringstream err;
|
||||
err << "SQL error: " << sqlite3_errmsg(*this);
|
||||
throw std::runtime_error(err.str());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace SQLite
|
||||
@@ -0,0 +1,202 @@
|
||||
#include "SQLiteResultSet.h"
|
||||
#include <sqlite3.h>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
SQLiteResultSet::SQLiteResultSet(SQLiteStatement& statement) :
|
||||
m_currentRow(-1)
|
||||
{
|
||||
int columnCount = sqlite3_column_count(statement);
|
||||
for (int i = 0; i < columnCount; ++i)
|
||||
m_columns.push_back(std::string(reinterpret_cast<const char*>(sqlite3_column_name(statement, i))));
|
||||
|
||||
int returnCode = 0;
|
||||
while ((returnCode = sqlite3_step(statement)) == SQLITE_ROW)
|
||||
{
|
||||
std::vector<std::string> row;
|
||||
for (int i = 0; i < columnCount; ++i)
|
||||
row.push_back(std::string(reinterpret_cast<const char*>(sqlite3_column_text(statement, i))));
|
||||
|
||||
m_values.push_back(row);
|
||||
}
|
||||
|
||||
if(returnCode != SQLITE_DONE)
|
||||
{
|
||||
throw std::runtime_error("Error Creating SQLiteResultSet.");
|
||||
}
|
||||
}
|
||||
|
||||
void SQLiteResultSet::AfterLast()
|
||||
{
|
||||
m_currentRow >= Size();
|
||||
}
|
||||
|
||||
void SQLiteResultSet::BeforeFirst()
|
||||
{
|
||||
m_currentRow = -1;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::First()
|
||||
{
|
||||
if (m_values.empty())
|
||||
return false;
|
||||
|
||||
m_currentRow = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::IsAfterLast() const
|
||||
{
|
||||
return m_currentRow >= Size();
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::IsBeforeFirst() const
|
||||
{
|
||||
return m_currentRow < 0;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::IsFirst() const
|
||||
{
|
||||
return m_currentRow == 0;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::IsLast() const
|
||||
{
|
||||
return m_currentRow == LastIndex();
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::Last()
|
||||
{
|
||||
if (m_values.empty())
|
||||
return false;
|
||||
|
||||
m_currentRow = LastIndex();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::Next()
|
||||
{
|
||||
if (m_values.empty())
|
||||
return false;
|
||||
|
||||
if (m_currentRow >= LastIndex())
|
||||
return false;
|
||||
|
||||
++m_currentRow;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::Previous()
|
||||
{
|
||||
if (m_values.empty())
|
||||
return false;
|
||||
|
||||
if (m_currentRow <= 0)
|
||||
return false;
|
||||
|
||||
--m_currentRow;
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t SQLiteResultSet::Row() const
|
||||
{
|
||||
return m_currentRow;
|
||||
}
|
||||
|
||||
size_t SQLiteResultSet::RowsCount() const
|
||||
{
|
||||
return m_values.size();
|
||||
}
|
||||
|
||||
bool SQLiteResultSet::Empty() const
|
||||
{
|
||||
return m_values.size() == 0;
|
||||
}
|
||||
|
||||
uint32_t SQLiteResultSet::FindColumn(const std::string& columnName) const
|
||||
{
|
||||
if (std::find(m_columns.begin(), m_columns.end(), columnName) != m_columns.end())
|
||||
return std::find(m_columns.begin(), m_columns.end(), columnName) - m_columns.begin();
|
||||
return -1;
|
||||
}
|
||||
|
||||
long double SQLiteResultSet::Double(uint32_t columnIndex) const
|
||||
{
|
||||
if (m_currentRow < 0 || m_currentRow > LastIndex())
|
||||
throw std::runtime_error("Invalid Row Selected.");
|
||||
|
||||
return std::stod(m_values[m_currentRow][columnIndex]);
|
||||
}
|
||||
|
||||
long double SQLiteResultSet::Double(const std::string& columnName) const
|
||||
{
|
||||
int index = FindColumn(columnName);
|
||||
|
||||
if (index < 0)
|
||||
throw std::runtime_error("Invalid Column Name.");
|
||||
|
||||
return Double(index);
|
||||
}
|
||||
|
||||
int32_t SQLiteResultSet::Int(uint32_t columnIndex) const
|
||||
{
|
||||
if (m_currentRow < 0 || m_currentRow > LastIndex())
|
||||
throw std::runtime_error("Invalid Row Selected.");
|
||||
|
||||
return std::stoi(m_values[m_currentRow][columnIndex]);
|
||||
}
|
||||
|
||||
int32_t SQLiteResultSet::Int(const std::string& columnName) const
|
||||
{
|
||||
int index = FindColumn(columnName);
|
||||
|
||||
if (index < 0)
|
||||
throw std::runtime_error("Invalid Column Name.");
|
||||
|
||||
return Int(index);
|
||||
}
|
||||
|
||||
std::string SQLiteResultSet::String(uint32_t columnIndex) const
|
||||
{
|
||||
if (m_currentRow < 0 || m_currentRow > LastIndex())
|
||||
throw std::runtime_error("Invalid Row Selected.");
|
||||
|
||||
return m_values[m_currentRow][columnIndex];
|
||||
}
|
||||
|
||||
std::string SQLiteResultSet::String(const std::string& columnName) const
|
||||
{
|
||||
int index = FindColumn(columnName);
|
||||
|
||||
if (index < 0)
|
||||
throw std::runtime_error("Invalid Column Name.");
|
||||
|
||||
return String(index);
|
||||
}
|
||||
|
||||
void SQLiteResultSet::Print() const
|
||||
{
|
||||
for (auto rowIterator = m_values.begin(); rowIterator != m_values.end(); ++rowIterator)
|
||||
{
|
||||
auto columnNameIterator = m_columns.begin();
|
||||
for (auto columnIterator = rowIterator->begin(); columnIterator != rowIterator->end(); ++columnIterator, ++columnNameIterator)
|
||||
std::cout << *columnNameIterator << " = " << *columnIterator << std::endl;
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
int SQLiteResultSet::Size() const
|
||||
{
|
||||
return m_values.size();
|
||||
}
|
||||
|
||||
int SQLiteResultSet::LastIndex() const
|
||||
{
|
||||
return m_values.size() - 1;
|
||||
}
|
||||
|
||||
} // namespace SQLite
|
||||
@@ -0,0 +1,32 @@
|
||||
#include "SQLiteClient.h"
|
||||
#include "SQLiteStatement.h"
|
||||
#include <sqlite3.h>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
SQLiteStatement::SQLiteStatement(SQLiteClient& client, const std::string& query)
|
||||
{
|
||||
int returnCode = sqlite3_prepare_v2(client, query.c_str(), -1, &m_pStatement, nullptr);
|
||||
|
||||
if (returnCode != SQLITE_OK)
|
||||
{
|
||||
std::stringstream err;
|
||||
err << "SQL error: " << sqlite3_errmsg(client);
|
||||
throw std::runtime_error(err.str());
|
||||
}
|
||||
}
|
||||
|
||||
SQLiteStatement::~SQLiteStatement()
|
||||
{
|
||||
sqlite3_finalize(m_pStatement);
|
||||
}
|
||||
|
||||
SQLiteStatement::operator sqlite3_stmt*()
|
||||
{
|
||||
return m_pStatement;
|
||||
}
|
||||
|
||||
} // namespace SQLite
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef SQLITECLIENT_H
|
||||
#define SQLITECLIENT_H
|
||||
|
||||
#include "SQLiteResultSet.h"
|
||||
#include "SQLiteStatement.h"
|
||||
#include <string>
|
||||
|
||||
|
||||
class sqlite3;
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
class SQLiteClient
|
||||
{
|
||||
public:
|
||||
SQLiteClient(const std::string& filename);
|
||||
~SQLiteClient();
|
||||
|
||||
operator sqlite3*();
|
||||
|
||||
public:
|
||||
SQLiteResultSet ExecuteQuery(const std::string& query);
|
||||
void BeginTransaction();
|
||||
void EndTransaction();
|
||||
|
||||
private:
|
||||
SQLiteResultSet RetrieveResultSet(SQLiteStatement& statement);
|
||||
|
||||
private:
|
||||
sqlite3* m_pSQLite3;
|
||||
};
|
||||
|
||||
} // namespace SQLite
|
||||
|
||||
#endif // SQLITECLIENT_H
|
||||
@@ -0,0 +1,56 @@
|
||||
#ifndef SQLITERESULTSET_H
|
||||
#define SQLITERESULTSET_H
|
||||
|
||||
#include "SQLiteStatement.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
class SQLiteResultSet
|
||||
{
|
||||
public:
|
||||
SQLiteResultSet(SQLiteStatement& statement);
|
||||
|
||||
public:
|
||||
void AfterLast();
|
||||
void BeforeFirst();
|
||||
bool First();
|
||||
bool IsAfterLast() const;
|
||||
bool IsBeforeFirst() const;
|
||||
bool IsFirst() const;
|
||||
bool IsLast() const;
|
||||
bool Last();
|
||||
bool Next();
|
||||
bool Previous();
|
||||
|
||||
size_t Row() const;
|
||||
size_t RowsCount() const;
|
||||
bool Empty() const;
|
||||
|
||||
uint32_t FindColumn(const std::string& columnName) const;
|
||||
|
||||
long double Double(uint32_t columnIndex) const;
|
||||
long double Double(const std::string& columnLabel) const;
|
||||
int32_t Int(uint32_t columnIndex) const;
|
||||
int32_t Int(const std::string& columnLabel) const;
|
||||
std::string String(uint32_t columnIndex) const;
|
||||
std::string String(const std::string& columnName) const;
|
||||
|
||||
void Print() const;
|
||||
|
||||
private:
|
||||
int Size() const;
|
||||
int LastIndex() const;
|
||||
|
||||
private:
|
||||
std::vector<std::string> m_columns;
|
||||
std::vector<std::vector<std::string>> m_values;
|
||||
int m_currentRow;
|
||||
};
|
||||
|
||||
} // namespace SQLite
|
||||
|
||||
#endif // SQLITERESULTSET_H
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef SQLITESTATEMENT_H
|
||||
#define SQLITESTATEMENT_H
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
class sqlite3_stmt;
|
||||
|
||||
namespace SQLite {
|
||||
|
||||
class SQLiteClient;
|
||||
|
||||
class SQLiteStatement
|
||||
{
|
||||
public:
|
||||
SQLiteStatement(SQLiteClient& client, const std::string& query);
|
||||
~SQLiteStatement();
|
||||
|
||||
operator sqlite3_stmt*();
|
||||
|
||||
private:
|
||||
sqlite3_stmt* m_pStatement;
|
||||
};
|
||||
|
||||
} // namespace SQLite
|
||||
|
||||
#endif // SQLITESTATEMENT_H
|
||||
Reference in New Issue
Block a user