matlab MEX C++ API FOR SQLITE3

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ls1300005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值