コード例 #1
0
ファイル: ResourceFinder.cpp プロジェクト: kartben/iotivity
SSMRESULT CResourceFinder::startResourceFinder()
{
    SSMRESULT res = SSM_E_FAIL;
    OCStackResult ret = OC_STACK_ERROR;

    std::ostringstream requestURI;
    requestURI << OC_MULTICAST_DISCOVERY_URI << "?rt=SSManager.Sensor";

    std::ostringstream multicastPresenceURI;
    multicastPresenceURI << "coap://" << OC_MULTICAST_PREFIX;

    ret = OC::OCPlatform::findResource("", requestURI.str(), OC_ALL,
                                       std::bind(&CResourceFinder::onResourceFound, this, std::placeholders::_1));

    if (ret != OC_STACK_OK)
        SSM_CLEANUP_ASSERT(SSM_E_FAIL);

    ret = OC::OCPlatform::subscribePresence(m_multicastPresenceHandle, multicastPresenceURI.str(),
                                            "SSManager.Sensor", OC_ALL, std::bind(&CResourceFinder::presenceHandler, this,
                                                    std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

    if (ret != OC_STACK_OK)
        SSM_CLEANUP_ASSERT(SSM_E_FAIL);

    res = SSM_S_OK;

CLEANUP:
    return res;
}
コード例 #2
0
ファイル: SensingEngine.cpp プロジェクト: EmuxEvans/iotivity
SSMRESULT CSensingEngine::finalConstruct()
{
    SSMRESULT res = SSM_S_OK;

    SSM_CLEANUP_ASSERT(CreateGlobalInstance(OID_IContextRepository, (IBase **)&m_pContextRepository));

    SSM_CLEANUP_ASSERT(CreateInstance(OID_IContextExecutor, (IBase **)&m_pContextExecutor)); //TEMP

CLEANUP:
    return res;
}
コード例 #3
0
SSMRESULT CEvaluationEngine::finalConstruct()
{
    SSMRESULT res = SSM_E_FAIL;

    m_pSQLite3 = NULL;

    m_mtxTriggerId.lock();
    m_iTriggerId = 0;
    m_mtxTriggerId.unlock();

    SSM_CLEANUP_ASSERT(CreateInstance(OID_ITasker, (IBase **)&m_pTasker));
    SSM_CLEANUP_ASSERT(initializeEngine());

CLEANUP:
    return res;
}
コード例 #4
0
/*
SSMRESULT CEvaluationEngine::DeleteModel(IN int modelId)
{
    SSMRESULT       res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string     strSQL;
    sqlite3_stmt    *stmt = NULL;
    int             lPos = 0;
    int             rPos = 0;
    int             width = 0;
    IntVec          dataIds;

    sstream << "select lPos, rPos from [ModelRelation] where modelId = " << modelId << ";" << std::ends;

    strSQL = sstream.str();
    sstream.str("");
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);
    CHK_SQLITE(sqlite3_step(stmt), SQLITE_ROW);
    lPos = sqlite3_column_int(stmt, 0);
    rPos = sqlite3_column_int(stmt, 1);
    width = rPos - lPos + 1;
    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    sstream << "delete from [ModelRelation] where lPos between " << lPos << " and " << rPos <<
        ";update [ModelRelation] set rPos = rPos - " << width << " where rPos > " << rPos <<
        ";update [ModelRelation] set lPos = lPos - " << width << " where lPos > " << lPos << std::ends;
    CHK_SSMRESULT(ExecuteSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "select dataId from [DataRelation] where modelId = " << modelId << ";" << std::ends;
    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);
    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        dataIds.push_back(sqlite3_column_int(stmt, 0));
    }
    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    for(std::vector<int>::iterator itor = dataIds.begin();
        itor != dataIds.end(); ++itor)
    {
        CHK_SSMRESULT(DeleteModelData(modelId, *itor));
    }

CLEANUP:
    return res;
}
*/
SSMRESULT CEvaluationEngine::deleteModelData(IN int modelId, IN int dataId)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string strSQL;
    sqlite3_stmt *stmt = NULL;
    int             lPos = 0;
    int             rPos = 0;
    int             width = 0;

    m_mtxDataRelation.lock();

    sstream << "select lPos, rPos from [DataRelation] where modelId = " << modelId << " and dataId = "
            << dataId << ";" << std::ends;

    strSQL = sstream.str();
    sstream.str("");
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);
    CHK_SQLITE(sqlite3_step(stmt), SQLITE_ROW);
    lPos = sqlite3_column_int(stmt, 0);
    rPos = sqlite3_column_int(stmt, 1);
    width = rPos - lPos + 1;
    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    sstream << "delete from [DataRelation] where lPos between " << lPos << " and " << rPos << ";" <<
            std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "update [DataRelation] set rPos = rPos - " << width << " where rPos > " << rPos << ";" <<
            std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "update [DataRelation] set lPos = lPos - " << width << " where lPos > " << lPos << ";" <<
            std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "delete from [ModelData" << modelId << "] where dataId = " << dataId << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));

CLEANUP:
    m_mtxDataRelation.unlock();
    return res;
}
コード例 #5
0
SSMRESULT CSoftSensorManager::stopCore()
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_ASSERT(m_pContextRepository->stopResourceFinder());

CLEANUP:
    return res;
}
コード例 #6
0
SSMRESULT CConditionedModel::getBaseContextModel(IContextModel **ppBaseContextModel)
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_ASSERT(m_pBaseModel->queryInterface(OID_IContextModel, (IBase **)ppBaseContextModel));

CLEANUP:
    return res;
}
コード例 #7
0
ファイル: SSMCore.cpp プロジェクト: EmuxEvans/iotivity
SSMRESULT StopSSMCore()
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_NULL_ASSERT(g_pSoftSensorManager);
    SSM_CLEANUP_ASSERT(g_pSoftSensorManager->stopCore());

CLEANUP:
    return res;
}
コード例 #8
0
SSMRESULT CSoftSensorManager::createQueryEngine(OUT IQueryEngine **ppQueryEngine)
{
    SSMRESULT res = SSM_E_FAIL;
    IQueryEngineInternal    *pQueryEngineInternal = NULL;
    SSM_CLEANUP_ASSERT(CreateInstance(OID_IQueryEngineInternal, (IBase **)&pQueryEngineInternal));
    *ppQueryEngine = (IQueryEngine *)pQueryEngineInternal;

CLEANUP:
    return res;
}
コード例 #9
0
ファイル: SSMCore.cpp プロジェクト: EmuxEvans/iotivity
SSMRESULT CreateQueryEngine(IQueryEngine **ppQueryEngine)
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_NULL_ASSERT(g_pSoftSensorManager);
    SSM_CLEANUP_ASSERT(g_pSoftSensorManager->createQueryEngine(ppQueryEngine));

CLEANUP:
    return res;
}
コード例 #10
0
SSMRESULT CreateGlobalInstanceRepo()
{
    SSMRESULT res = SSM_E_FAIL;

    if (g_mtxGlobalInstance != NULL)
        SSM_CLEANUP_ASSERT(SSM_E_OUTOFMEMORY);

    if (g_globalInstance != NULL)
        SSM_CLEANUP_ASSERT(SSM_E_OUTOFMEMORY);

    g_mtxGlobalInstance = new CSimpleMutex();
    SSM_CLEANUP_NULL_ASSERT(g_mtxGlobalInstance);
    g_globalInstance = new std::map<OID, IBase *>();
    SSM_CLEANUP_NULL_ASSERT(g_globalInstance);

    SSM_CLEANUP_ASSERT(CreateGlobalInstance(OID_IThreadPool, (IBase **)&g_pThreadPool));

CLEANUP:
    return res;
}
コード例 #11
0
void CEvaluationEngine::terminateEngine()
{
    SSMRESULT           res = SSM_E_FAIL;
    sqlite3             *pBackupFile = NULL;
    sqlite3_backup      *pBackup = NULL;
    std::stringstream   sstream;

    //Remove all triggers on db side
    m_mtxTriggerId.lock();
    for (std::map<int, IEvaluationEngineEvent *>::iterator itor = m_mapTriggers.begin();
         itor != m_mapTriggers.end(); ++itor)
    {
        sstream << "drop trigger WatchInsertModel" << itor->first << ";" << std::ends;
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
        sstream.str("");

        sstream << "drop trigger WatchUpdateModel" << itor->first << ";" << std::ends;
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
        sstream.str("");
    }
    m_mtxTriggerId.unlock();

    if (strlen(LOCATION_SSM_DB_DUMP) > 0)
    {
        CHK_SQLITE(sqlite3_open(LOCATION_SSM_DB_DUMP, &pBackupFile), SQLITE_OK);
        pBackup = sqlite3_backup_init(pBackupFile, "main", m_pSQLite3, "main");
        CHK_SQLITE(sqlite3_errcode(pBackupFile), SQLITE_OK);
        SSM_CLEANUP_NULL_ASSERT(pBackup);
        CHK_SQLITE(sqlite3_backup_step(pBackup, -1), SQLITE_DONE);
        CHK_SQLITE(sqlite3_backup_finish(pBackup), SQLITE_OK);
        CHK_SQLITE(sqlite3_close(pBackupFile), SQLITE_OK);
    }

    CHK_SQLITE(sqlite3_close(m_pSQLite3), SQLITE_OK);

    m_pSQLite3 = NULL;

    res = SSM_S_OK;
CLEANUP:
    return;
}
コード例 #12
0
ファイル: SSMCore.cpp プロジェクト: EmuxEvans/iotivity
SSMRESULT InitializeSSMCore(std::string xmlDescription)
{
    SSMRESULT res = SSM_E_FAIL;

    if (g_pSoftSensorManager != NULL)
        SSM_CLEANUP_ASSERT(SSM_E_INITIALIZED);

    SSM_CLEANUP_ASSERT(CreateGlobalInstanceRepo());
    SSM_CLEANUP_ASSERT(CreateInstance(OID_ISoftSensorManager, (IBase **)&g_pSoftSensorManager));
    SSM_CLEANUP_ASSERT(g_pSoftSensorManager->initializeCore(xmlDescription));

CLEANUP:
    if (res != SSM_S_OK &&
        res != SSM_E_INITIALIZED)
    {
        SAFE_RELEASE(g_pSoftSensorManager);
        DestroyGlobalInstanceRepo();
    }

    return res;
}
コード例 #13
0
ファイル: SSMCore.cpp プロジェクト: EmuxEvans/iotivity
SSMRESULT TerminateSSMCore(bool factoryResetFlag)
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_NULL_ASSERT(g_pSoftSensorManager);
    SSM_CLEANUP_ASSERT(g_pSoftSensorManager->terminateCore(factoryResetFlag));

CLEANUP:
    SAFE_RELEASE(g_pSoftSensorManager);
    DestroyGlobalInstanceRepo();
    return res;
}
コード例 #14
0
SSMRESULT CConditionedModel::activateTrigger(int *pTriggerId)
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_ASSERT(m_pEvaluationEngine->watchModelData(m_pBaseModel->getModelId(),
                       &m_watchCondition, this, &m_triggerId));

    *pTriggerId = m_triggerId;

CLEANUP:
    return res;
}
コード例 #15
0
SSMRESULT CConditionedModel::finalConstruct()
{
    SSMRESULT res = SSM_E_FAIL;

    m_triggerId = -1;

    m_pConditionedModelEvent = NULL;

    SSM_CLEANUP_ASSERT(CreateGlobalInstance(OID_IEvaluationEngine, (IBase **)&m_pEvaluationEngine));

CLEANUP:
    return res;
}
コード例 #16
0
SSMRESULT DestroyGlobalInstanceRepo()
{
    SSMRESULT res = SSM_E_FAIL;

    SSM_CLEANUP_ASSERT(g_pThreadPool->destroyThreadPool());

    SAFE_RELEASE(g_pThreadPool);
    SAFE_DELETE(g_mtxGlobalInstance);
    SAFE_DELETE(g_globalInstance);

CLEANUP:
    return res;
}
コード例 #17
0
ファイル: ResourceFinder.cpp プロジェクト: kartben/iotivity
void CResourceFinder::presenceHandler(OCStackResult result, const unsigned int nonce,
                                      const std::string &hostAddress)
{
    SSMRESULT res = SSM_E_FAIL;
    OCStackResult ret = OC_STACK_ERROR;
    intptr_t *pMessage = NULL;
    std::ostringstream requestURI;

    switch (result)
    {
        case OC_STACK_OK:
            requestURI << "coap://" << hostAddress << "/oc/core?rt=SSManager.Sensor";

            ret = OC::OCPlatform::findResource("", requestURI.str(), OC_ALL,
                                               std::bind(&CResourceFinder::onResourceFound, this, std::placeholders::_1));

            if (ret != OC_STACK_OK)
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);

            break;

        case OC_STACK_PRESENCE_STOPPED:
            if (m_mapResources.find(hostAddress) != m_mapResources.end())
            {
                while (!m_mapResources[hostAddress].empty())
                {
                    pMessage = new intptr_t[2];
                    pMessage[0] = RESOURCE_DISCOVER_UNINSTALL_RESOURCE;
                    pMessage[1] = reinterpret_cast<intptr_t> (m_mapResourceHandler[m_mapResources[hostAddress].back()]);
                    m_mapResources[hostAddress].pop_back();
                    m_pTasker->addTask(this, pMessage);
                }

                m_mapResources.erase(hostAddress);
            }
            break;

        case OC_STACK_PRESENCE_TIMEOUT:
            break;

        case OC_STACK_VIRTUAL_DO_NOT_HANDLE:
            break;

        default:
            break;
    }

CLEANUP:
    ;
}
コード例 #18
0
SSMRESULT CEvaluationEngine::dropWatchModelData(IN int triggerId)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;

    m_mtxDataRelation.lock();

    sstream << "drop trigger WatchInsertModel" << triggerId << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "drop trigger WatchUpdateModel" << triggerId << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));

    m_mtxTriggerId.lock();
    m_mapTriggers[triggerId]->release();
    m_mapTriggers.erase(triggerId);

CLEANUP:
    m_mtxTriggerId.unlock();
    m_mtxDataRelation.unlock();
    return res;
}
コード例 #19
0
SSMRESULT CConditionedModel::deactivateTrigger()
{
    SSMRESULT res = SSM_S_OK;

    if (m_triggerId > -1)
    {
        SSM_CLEANUP_ASSERT(m_pEvaluationEngine->dropWatchModelData(m_triggerId));
    }

    m_triggerId = -1;

CLEANUP:
    return res;
}
コード例 #20
0
SSMRESULT CConditionedModel::getAffectedData(IntVec *pDataIds)
{
    SSMRESULT res = SSM_E_FAIL;

    m_mtxConditionedData.lock();

    if (m_triggeredDataIds.size() > 0)
    {
        pDataIds->push_back(m_triggeredDataIds.front());
        m_triggeredDataIds.pop_front();
        SSM_CLEANUP_ASSERT(SSM_S_OK);
    }
    else
    {
        m_affectedDataIds.clear();
        SSM_CLEANUP_ASSERT(m_pEvaluationEngine->getConditionedModelData(m_pBaseModel->getModelId(),
                           &m_watchCondition, &m_affectedDataIds));
        *pDataIds = m_affectedDataIds;
    }

CLEANUP:
    m_mtxConditionedData.unlock();
    return res;
}
コード例 #21
0
ファイル: ResourceFinder.cpp プロジェクト: kartben/iotivity
SSMRESULT CResourceFinder::stopResourceFinder()
{
    SSMRESULT res = SSM_E_FAIL;
    OCStackResult ret = OC_STACK_ERROR;

    ret = OC::OCPlatform::unsubscribePresence(m_multicastPresenceHandle);

    if (ret != OC_STACK_OK)
        SSM_CLEANUP_ASSERT(SSM_E_FAIL);

    m_multicastPresenceHandle = nullptr;

    res = SSM_S_OK;

CLEANUP:
    return res;
}
コード例 #22
0
ファイル: ResourceFinder.cpp プロジェクト: kartben/iotivity
SSMRESULT CResourceFinder::finalConstruct()
{
    SSMRESULT res = SSM_E_FAIL;

    OC::PlatformConfig cfg(OC::ServiceType::InProc, OC::ModeType::Both, "0.0.0.0", 0,
                           OC::QualityOfService::LowQos);

    SSM_CLEANUP_ASSERT(CreateGlobalInstance(OID_ITasker, (IBase **)&m_pTasker));

    OC::OCPlatform::Configure(cfg);

    m_pResourceFinderEvent = NULL;

    m_multicastPresenceHandle = nullptr;

CLEANUP:
    return res;
}
コード例 #23
0
SSMRESULT CEvaluationEngine::getParentDataId(IN int modelId, IN int dataId, IN int parentModelId,
        OUT int *pParentDataId)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;

    sstream <<
            "select parent.dataId from [DataRelation] as node, [DataRelation] as parent where parent.modelId="
            <<
            parentModelId << " and node.modelId=" << modelId << " and node.dataId=" <<
            dataId << " and node.lPos between parent.lPos and parent.rPos;" << std::ends;

    m_mtxDataRelation.lock();
    SSM_CLEANUP_ASSERT(executeSQL_IntReturn(sstream.str(), pParentDataId));

CLEANUP:
    m_mtxDataRelation.unlock();
    return res;
}
コード例 #24
0
ファイル: ResourceFinder.cpp プロジェクト: kartben/iotivity
void CResourceFinder::onExecute(void *pArg)
{
    SSMRESULT res = SSM_E_FAIL;
    OCStackResult ret = OC_STACK_ERROR;
    OC::QueryParamsMap queryParams;
    OICResourceHandler *pResourceHandler = NULL;
    intptr_t                 *pMessage = reinterpret_cast<intptr_t *>(pArg);
    std::shared_ptr< OC::OCResource > *pResource = NULL;
    OC::OCPlatform::OCPresenceHandle presenceHandle = NULL;

    std::string resourceHostAddress = "";
    std::string resourceFullPath = "";

    switch (pMessage[0])
    {
        case RESOURCE_DISCOVER_REQUESTPROFILE:
            pResource = (std::shared_ptr< OC::OCResource > *) pMessage[1];
            pResourceHandler = new OICResourceHandler();
            SSM_CLEANUP_ASSERT(pResourceHandler->initHandler(*pResource, this));

            resourceFullPath = pResource->get()->host() + pResource->get()->uri();

            resourceHostAddress = pResource->get()->host();
            resourceHostAddress.erase(0, 7);        // erase 'coap://'

            m_mapResourceHandler[resourceFullPath] = pResourceHandler;

            m_mapResources[resourceHostAddress].push_back(resourceFullPath);

            ret = pResource->get()->get(queryParams, std::bind(&OICResourceHandler::onGetResourceProfile,
                                        pResourceHandler, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

            if (ret != OC_STACK_OK)
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);

            break;

        case RESOURCE_DISCOVER_INSTALL_RESOURCE:
            if (m_mapResourcePresenceHandles.find(((ISSMResource *)pMessage[1])->ip) ==
                m_mapResourcePresenceHandles.end())
            {
                ret = OC::OCPlatform::subscribePresence(presenceHandle, ((ISSMResource *)pMessage[1])->ip,
                                                        "SSManager.Sensor", OC_ALL, std::bind(&CResourceFinder::presenceHandler, this,
                                                                std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

                if (ret != OC_STACK_OK)
                    SSM_CLEANUP_ASSERT(SSM_E_FAIL);

                m_mapResourcePresenceHandles[((ISSMResource *)pMessage[1])->ip] = presenceHandle;
            }

            m_pResourceFinderEvent->onResourceFound((ISSMResource *)pMessage[1]);

            if (ret != OC_STACK_OK)
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);

            break;

        case RESOURCE_DISCOVER_UNINSTALL_RESOURCE:
            m_pResourceFinderEvent->onResourceLost(&((OICResourceHandler *) pMessage[1])->m_SSMResource);

            if (m_mapResourcePresenceHandles.find(((OICResourceHandler *)pMessage[1])->m_SSMResource.ip) !=
                m_mapResourcePresenceHandles.end())
            {
                ret = OC::OCPlatform::unsubscribePresence(m_mapResourcePresenceHandles[((
                            OICResourceHandler *)pMessage[1])->m_SSMResource.ip]);

                if (ret != OC_STACK_OK)
                    SSM_CLEANUP_ASSERT(SSM_E_FAIL);

                m_mapResourcePresenceHandles.erase(((OICResourceHandler *)pMessage[1])->m_SSMResource.ip);
            }

            delete m_mapResourceHandler[((OICResourceHandler *)pMessage[1])->m_SSMResource.name];
            m_mapResourceHandler.erase(((OICResourceHandler *) pMessage[1])->m_SSMResource.name);
            break;
    }

CLEANUP:
    ;
}
コード例 #25
0
SSMRESULT CEvaluationEngine::initializeEngine()
{
    SSMRESULT           res = SSM_E_FAIL;
    sqlite3             *pBackupFile = NULL;
    sqlite3_backup      *pBackup = NULL;

    const char *strCreate_ModelRelationTable =
        "create table [ModelRelation]\
		(\
		modelId integer primary key autoincrement,\
		modelName text NOT NULL,\
		lPos int NOT NULL,\
		rPos int NOT NULL\
		);";

    const char *strCreate_DataRelationTable =
        "create table [DataRelation]\
		(\
		id integer primary key autoincrement,\
		modelId int NOT NULL,\
		lPos int NOT NULL,\
		rPos int NOT NULL,\
		dataId int NOT NULL\
		);";

    //Create rootModel
    const char *strRootModel = "insert into [ModelRelation] values (null, 'root', 1, 2);";

    const char *tblRoot =
        "create table [ModelData1](dataId integer primary key autoincrement, name text);";

    const char *rootData = "insert into [ModelData1] values (null, 'root');";

    const char *rootRelation = "insert into [DataRelation] values (null, 1, 1, 2, 1);";

    CHK_SQLITE(sqlite3_open_v2(LOCATION_SSM_DB, &m_pSQLite3,
                               SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL), SQLITE_OK);

    CHK_SQLITE(sqlite3_create_function_v2(m_pSQLite3, "OnSQLTrigger", 3, SQLITE_UTF8, NULL,
                                          onSQLTrigger, NULL, NULL, NULL),
               SQLITE_OK);

    if (strlen(LOCATION_SSM_DB_DUMP) > 0 &&
        sqlite3_open_v2(LOCATION_SSM_DB_DUMP, &pBackupFile, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
    {
        pBackup = sqlite3_backup_init(m_pSQLite3, "main", pBackupFile, "main");
        CHK_SQLITE(sqlite3_errcode(pBackupFile), SQLITE_OK);
        SSM_CLEANUP_NULL_ASSERT(pBackup);
        CHK_SQLITE(sqlite3_backup_step(pBackup, -1), SQLITE_DONE);
        CHK_SQLITE(sqlite3_backup_finish(pBackup), SQLITE_OK);
        CHK_SQLITE(sqlite3_close(pBackupFile), SQLITE_OK);
        res = SSM_S_OK;
    }
    else
    {
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(strCreate_ModelRelationTable));
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(strCreate_DataRelationTable));

        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(strRootModel));
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(tblRoot));
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(rootData));
        SSM_CLEANUP_ASSERT(executeSQL_NoReturn(rootRelation));
    }

CLEANUP:
    return res;
}
コード例 #26
0
SSMRESULT CEvaluationEngine::watchModelData(IN int modelId, IN ModelConditionVec *pModelConditions,
        IN IEvaluationEngineEvent *pEvaluationEngineEvent, OUT int *pTriggerId)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;
    std::stringstream sstreamCondition;

    for (ModelConditionVec::iterator itor = pModelConditions->begin();
         itor != pModelConditions->end(); ++itor)
    {
        sstreamCondition << "NEW." << itor->modelProperty.propertyName;
        switch (itor->predicate)
        {
            case ModelCondition::PREDICATE_EQ:
                sstreamCondition << "=";
                break;

            case ModelCondition::PREDICATE_NEQ:
                sstreamCondition << "!=";
                break;

            case ModelCondition::PREDICATE_GT:
                sstreamCondition << ">";
                break;

            case ModelCondition::PREDICATE_LT:
                sstreamCondition << "<";
                break;

            case ModelCondition::PREDICATE_GTE:
                sstreamCondition << ">=";
                break;

            case ModelCondition::PREDICATE_LTE:
                sstreamCondition << "<=";
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        switch (itor->modelProperty.propertyType)
        {
            case ModelProperty::TYPE_NUMERIC:
            case ModelProperty::TYPE_INTEGER:
            case ModelProperty::TYPE_REAL:
                sstreamCondition << itor->modelProperty.propertyValue;
                break;

            case ModelProperty::TYPE_TEXT:
                sstreamCondition << "'" << itor->modelProperty.propertyValue << "'";
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        if (itor < pModelConditions->end() - 1)
        {
            sstreamCondition << " and ";
        }
    }

    sstreamCondition << std::ends;

    m_mtxDataRelation.lock();

    sstream << "CREATE TRIGGER WatchInsertModel" << m_iTriggerId << " AFTER INSERT ON [ModelData" <<
            modelId << "] WHEN ";
    sstream << sstreamCondition.str().c_str() << " BEGIN SELECT OnSQLTrigger(" <<
            reinterpret_cast<intptr_t>(this) << ", " << m_iTriggerId << ", NEW.dataId); END;" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "CREATE TRIGGER WatchUpdateModel" << m_iTriggerId << " AFTER UPDATE ON [ModelData" <<
            modelId << "] WHEN ";
    sstream << sstreamCondition.str().c_str() << " BEGIN SELECT OnSQLTrigger(" <<
            reinterpret_cast<intptr_t>(this) << ", " << m_iTriggerId << ", NEW.dataId); END;" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));

    m_mtxTriggerId.lock();
    pEvaluationEngineEvent->addRef();
    m_mapTriggers[m_iTriggerId] = pEvaluationEngineEvent;
    *pTriggerId = m_iTriggerId++;

CLEANUP:
    m_mtxTriggerId.unlock();
    m_mtxDataRelation.unlock();
    return res;
}
コード例 #27
0
/*
SSMRESULT CEvaluationEngine::GetModelSchema(IN int modelId, OUT ModelPropertyVec *pModelProperties)
{
    SSMRESULT       res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string     strSQL;
    sqlite3_stmt    *stmt = NULL;
    std::string     propertyType;

    sstream << "pragma table_info('ModelData" << modelId << "');" << std::ends;

    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);

    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        ModelProperty modelData;
        modelData.propertyName = (const char*)sqlite3_column_text(stmt, 1);
        propertyType = (const char*)sqlite3_column_text(stmt, 2);

        if(propertyType == "integer")
        {
            modelData.propertyType = ModelProperty::Type_INTEGER;
        }
        else if(propertyType == "int")
        {
            modelData.propertyType = ModelProperty::Type_INTEGER;
        }
        else if(propertyType == "real")
        {
            modelData.propertyType = ModelProperty::Type_REAL;
        }
        else if(propertyType == "text")
        {
            modelData.propertyType = ModelProperty::Type_TEXT;
        }
        else
        {
            modelData.propertyType = ModelProperty::Type_TEXT;
        }
        pModelProperties->push_back(modelData);
    }

    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    res = SSM_S_OK;
CLEANUP:
    return res;
}
*/
SSMRESULT CEvaluationEngine::getConditionedModelData(IN int modelId,
        IN ModelConditionVec *pModelConditions, OUT IntVec *pDataIds)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string strSQL;
    sqlite3_stmt *stmt = NULL;

    sstream << "select dataId from [ModelData" << modelId <<
            "] where CURRENT_TIMESTAMP < datetime( strftime('%s', lastTime) + lifetime, 'unixepoch') and ";

    for (ModelConditionVec::iterator itor = pModelConditions->begin();
         itor != pModelConditions->end(); ++itor)
    {
        sstream << itor->modelProperty.propertyName;
        switch (itor->predicate)
        {
            case ModelCondition::PREDICATE_EQ:
                sstream << "=";
                break;

            case ModelCondition::PREDICATE_NEQ:
                sstream << "!=";
                break;

            case ModelCondition::PREDICATE_GT:
                sstream << ">";
                break;

            case ModelCondition::PREDICATE_LT:
                sstream << "<";
                break;

            case ModelCondition::PREDICATE_GTE:
                sstream << ">=";
                break;

            case ModelCondition::PREDICATE_LTE:
                sstream << "<=";
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        switch (itor->modelProperty.propertyType)
        {
            case ModelProperty::TYPE_NUMERIC:
            case ModelProperty::TYPE_INTEGER:
            case ModelProperty::TYPE_REAL:
                sstream << itor->modelProperty.propertyValue;
                break;

            case ModelProperty::TYPE_TEXT:
                sstream << "'" << itor->modelProperty.propertyValue << "'";
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        if (itor < pModelConditions->end() - 1)
        {
            sstream << " and ";
        }
    }

    sstream << ";" << std::ends;

    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);

    while (sqlite3_step(stmt) == SQLITE_ROW)
    {
        pDataIds->push_back(sqlite3_column_int(stmt, 0));
    }

    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    res = SSM_S_OK;

CLEANUP:
    return res;
}
コード例 #28
0
SSMRESULT CEvaluationEngine::createModel(IN int parentModelId, IN const char *newModelName,
        IN ModelPropertyVec *pModelDescs, OUT int *pModelId)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string         strSQL;
    sqlite3_stmt        *stmt = NULL;
    int         lPos = 0;

    //Check if same name exists
    sstream << "select modelId from [ModelRelation] where modelName='" << newModelName << "';" <<
            std::ends;
    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);
    if (sqlite3_step(stmt) == SQLITE_ROW)
    {
        *pModelId = sqlite3_column_int(stmt, 0);
        CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);
        res = SSM_S_OK;
        goto CLEANUP;
    }
    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);
    sstream.str("");

    sstream << "select lPos from [ModelRelation] where modelId = '" << parentModelId << "';" <<
            std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_IntReturn(sstream.str(), &lPos));
    sstream.str("");

    sstream << "update [ModelRelation] set rPos = rPos + 2 where rPos > " << lPos << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "update [ModelRelation] set lPos = lPos + 2 where lPos > " << lPos << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "insert into [ModelRelation] values (null, '" << newModelName << "', " << lPos + 1 <<
            ", " << lPos + 2 <<
            ");" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    SSM_CLEANUP_ASSERT(executeSQL_IntReturn("select last_insert_rowid();", pModelId));

    sstream << "create table [ModelData" << *pModelId <<
            "](dataId integer primary key autoincrement, lastTime NOT NULL DEFAULT CURRENT_TIMESTAMP, lifetime integer NOT NULL DEFAULT 2147483647, available text DEFAULT 'true'";

    for (ModelPropertyVec::iterator itor =
             pModelDescs->begin(); itor != pModelDescs->end(); ++itor)
    {
        sstream << "," << itor->propertyName;
        switch (itor->propertyType)
        {
            case ModelProperty::TYPE_NUMERIC:
                sstream << " numeric";
                break;

            case ModelProperty::TYPE_INTEGER:
                sstream << " integer";
                break;

            case ModelProperty::TYPE_REAL:
                sstream << " real";
                break;

            case ModelProperty::TYPE_TEXT:
                sstream << " text";
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }
    }

    sstream << ");" << std::ends;

    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));

CLEANUP:
    return res;
}
コード例 #29
0
SSMRESULT CEvaluationEngine::updateModelData(IN int modelId, IN int dataId,
        IN ModelPropertyVec *pModelValues)
{
    SSMRESULT res = SSM_E_FAIL;
    std::stringstream sstream;
    std::string         strSQL;
    sqlite3_stmt        *stmt = NULL;
    unsigned int        i = 1;

    sstream << "update [ModelData" << modelId << "] set lastTime=CURRENT_TIMESTAMP, ";

    for (ModelPropertyVec::iterator itor = pModelValues->begin();
         itor != pModelValues->end(); ++itor)
    {
        sstream << itor->propertyName << "=?";

        if (itor < pModelValues->end() - 1)
        {
            sstream << ",";
        }
    }

    sstream << " where dataId = " << dataId << ";" << std::ends;

    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);

    for (ModelPropertyVec::iterator itor = pModelValues->begin();
         itor != pModelValues->end(); ++itor)
    {
        switch (itor->propertyType)
        {
            case ModelProperty::TYPE_NUMERIC:
            case ModelProperty::TYPE_INTEGER:
                CHK_SQLITE(sqlite3_bind_int(stmt, i, atoi(itor->propertyValue.c_str())), SQLITE_OK);
                break;

            case ModelProperty::TYPE_REAL:
                CHK_SQLITE(sqlite3_bind_double(stmt, i, atof(itor->propertyValue.c_str())), SQLITE_OK);
                break;

            case ModelProperty::TYPE_TEXT:
                CHK_SQLITE(sqlite3_bind_text(stmt, i, itor->propertyValue.c_str(), itor->propertyValue.size(),
                                             SQLITE_STATIC), SQLITE_OK);
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        i++;
    }

    CHK_SQLITE(sqlite3_step(stmt), SQLITE_DONE);

    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    res = SSM_S_OK;

CLEANUP:
    return res;
}
コード例 #30
0
SSMRESULT CEvaluationEngine::addModelData(IN int modelId, IN int parentModelId, IN int parentDataId,
        IN ModelPropertyVec *pModelValues, OUT int *pDataId)
{
    SSMRESULT           res = SSM_E_FAIL;
    std::stringstream   sstream;
    std::string         strSQL;
    sqlite3_stmt        *stmt = NULL;
    int                 lPos = 0;
    unsigned int        i;

    sstream << "insert into [ModelData" << modelId << "] (";

    for (ModelPropertyVec::iterator itor = pModelValues->begin();
         itor != pModelValues->end(); ++itor)
    {
        sstream << itor->propertyName;

        if (itor < pModelValues->end() - 1)
        {
            sstream << ",";
        }
    }

    sstream << ") values (";

    for (i = 0; i < pModelValues->size(); i++)
    {
        sstream << "?";

        if (i < pModelValues->size() - 1)
        {
            sstream << ",";
        }
    }

    sstream << ");" << std::ends;

    strSQL = sstream.str();
    CHK_SQLITE(sqlite3_prepare_v2(m_pSQLite3, strSQL.c_str(), strSQL.length(), &stmt, NULL), SQLITE_OK);
    sstream.str("");

    i = 1;
    for (ModelPropertyVec::iterator itor = pModelValues->begin();
         itor != pModelValues->end(); ++itor)
    {
        switch (itor->propertyType)
        {
            case ModelProperty::TYPE_NUMERIC:
            case ModelProperty::TYPE_INTEGER:
                CHK_SQLITE(sqlite3_bind_int(stmt, i, atoi(itor->propertyValue.c_str())), SQLITE_OK);
                break;

            case ModelProperty::TYPE_REAL:
                CHK_SQLITE(sqlite3_bind_double(stmt, i, atof(itor->propertyValue.c_str())), SQLITE_OK);
                break;

            case ModelProperty::TYPE_TEXT:
                CHK_SQLITE(sqlite3_bind_text(stmt, i, itor->propertyValue.c_str(), itor->propertyValue.size(),
                                             SQLITE_STATIC), SQLITE_OK);
                break;

            default:
                SSM_CLEANUP_ASSERT(SSM_E_FAIL);
        }

        i++;
    }

    m_mtxDataRelation.lock();

    CHK_SQLITE(sqlite3_step(stmt), SQLITE_DONE);

    CHK_SQLITE(sqlite3_finalize(stmt), SQLITE_OK);

    SSM_CLEANUP_ASSERT(executeSQL_IntReturn("select last_insert_rowid();", pDataId));

    sstream << "select lPos from [DataRelation] where modelId = " << parentModelId << " and dataId = "
            << parentDataId << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_IntReturn(sstream.str(), &lPos));
    sstream.str("");

    sstream << "update [DataRelation] set rPos = rPos + 2 where rPos > " << lPos << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "update [DataRelation] set lPos = lPos + 2 where lPos > " << lPos << ";" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));
    sstream.str("");

    sstream << "insert into [DataRelation] values (null, " << modelId << ", " << lPos + 1 << ", " <<
            lPos + 2 <<
            ", " << *pDataId << ");" << std::ends;
    SSM_CLEANUP_ASSERT(executeSQL_NoReturn(sstream.str()));

CLEANUP:
    m_mtxDataRelation.unlock();
    return res;
}