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

猜你喜欢

转载自blog.csdn.net/ls1300005/article/details/131653977
今日推荐