#include "mex.hpp"
#include "mexAdapter.hpp"
#include "sqlite3.h"
using namespace matlab::mex;
using namespace matlab::data;
class MexFunction : public Function {
private:
ArrayFactory factory;
const std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
public:
void operator()(ArgumentList outputs, ArgumentList inputs) {
matlabPtr->feval(u"fprintf", 0, std::vector<Array>
({ factory.createScalar("hello, world\n")}));
std::string dbPath = matlab::engine::convertUTF16StringToUTF8String(inputs[0][0]);
std::string query = matlab::engine::convertUTF16StringToUTF8String(inputs[1][0]);
sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
}
outputs[0] = queryDatabase(db, query);
sqlite3_close(db);
};
Array queryDatabase(sqlite3 *db, const std::string &query) {
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, nullptr) != SQLITE_OK) {
}
int numColumns = sqlite3_column_count(stmt);
int numRows = 0;
while (sqlite3_step(stmt) == SQLITE_ROW) {
numRows++;
}
sqlite3_reset(stmt);
CellArray result = factory.createCellArray({(size_t)numRows, (size_t)numColumns});
int rowIndex = 0;
while (sqlite3_step(stmt) == SQLITE_ROW) {
for (int colIndex = 0; colIndex < numColumns; ++colIndex) {
switch (sqlite3_column_type(stmt, colIndex)) {
case SQLITE_INTEGER:
result[rowIndex][colIndex] = factory.createScalar(sqlite3_column_int64(stmt, colIndex));
break;
case SQLITE_FLOAT:
result[rowIndex][colIndex] = factory.createScalar(sqlite3_column_double(stmt, colIndex));
break;
case SQLITE_TEXT:
{
std::u16string matlabStatement = matlab::engine::convertUTF8StringToUTF16String(std::string((char *)sqlite3_column_text(stmt, colIndex)));
result[rowIndex][colIndex] = factory.createCharArray(matlabStatement);
}
break;
case SQLITE_BLOB:
{
uint8_t *blobData = (uint8_t *)sqlite3_column_blob(stmt, colIndex);
int blobSize = sqlite3_column_bytes(stmt, colIndex);
Array blobArray = factory.createArray<uint8_t>({ (size_t)blobSize,1},blobData,&blobData[blobSize-1]);
result[rowIndex][colIndex] = blobArray;
break;
}
case SQLITE_NULL:
default:
result[rowIndex][colIndex] = factory.createEmptyArray();
break;
}
}
rowIndex++;
}
sqlite3_finalize(stmt);
return result;
};
};
mex -output sqlite sqlite_read.cpp sqlite3.c