Beispiel #1
0
void DatabaseList::slotContextMenu(const QPoint& pos)
{
    m_cell = indexAt(pos);
    // Make sure the right click occured on a cell!
    if (m_cell.isValid())
    {
        QMenu menu(this);
        bool bIsFavorite = m_filterModel->data(m_filterModel->index(m_cell.row(),DBLV_FAVORITE), Qt::ToolTipRole).toString() == tr("Favorite");
        bool bIsNotFavorite = m_filterModel->data(m_filterModel->index(m_cell.row(),DBLV_FAVORITE), Qt::ToolTipRole).toString().isEmpty();
        bool bHasPath = !m_filterModel->data(m_filterModel->index(m_cell.row(),DBLV_PATH), Qt::ToolTipRole).toString().isEmpty();
        bool bIsOpen = m_filterModel->data(m_filterModel->index(m_cell.row(),DBLV_OPEN), Qt::ToolTipRole).toString() == tr("Open");
        menu.addAction(bIsOpen ? tr("Activate") : tr("Open"), this, SLOT(dbOpen()));

        QAction* action = menu.addAction(tr("UTF8"), this, SLOT(dbToggleUTF8()));
        action->setCheckable(true);
        QString utf8 = m_filterModel->data(m_filterModel->index(m_cell.row(),DBLV_UTF8)).toString();
        bool bUtf8 = (utf8.compare("UTF8")==0);
        action->setChecked(bUtf8);

        menu.addAction(tr("Close"), this, SLOT(dbClose()))->setEnabled(bIsOpen && bHasPath);
        menu.addSeparator();
        menu.addAction(tr("Add to favorites"), this, SLOT(dbAddToFavorites()))->setEnabled(bIsNotFavorite);
        menu.addAction(tr("Remove from Favorites"), this, SLOT(dbRemoveFromFavorites()))->setEnabled(bIsFavorite);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
        menu.addSeparator();
        menu.addAction(tr("Show in Finder"), this, SLOT(slotShowInFinder()))->setEnabled(bHasPath);
#endif
        menu.exec(mapToGlobal(pos));
    }
}
Beispiel #2
0
bool LS3DatastoreXML::dbNew(const QString &fileName) {
    LS3ElapsedAutoTimer timer("LS3DatastoreXML::dbNew");
    dbClose();
    data->newFile();
    dbSave(fileName);
    emit filenameChanged(fileName);
    return m_databaseLoaded=true;
}
Beispiel #3
0
/*单条记录操作*/
LT_DBROW ltDbOneRow(ltDbConn *pConn,int *fieldnum,char *pSmt,...)
{
    LT_DBROW tempRow;
    DB_CURSOR *dbcursor;
    int iReturn;
    va_list ap;
    char caSmt[4096];
    int i;

    va_start(ap,pSmt);
    vsprintf(caSmt,pSmt,ap);
    va_end(ap);
    tempRow=NULL;

    dbcursor=ltDbOpenCursorB(pConn,caSmt,0);
    if(dbcursor==NULL){
	return NULL;
    }
    iReturn = dbFetch(dbcursor);
    if(iReturn == 0) {
        dbClose(dbcursor);
        return NULL;
    }
    
    *fieldnum=dbcursor->nDef;
    tempRow=(LT_DBROW)malloc((*fieldnum)*sizeof(char *));
    if(tempRow==NULL){
	 dbClose(dbcursor);
         return NULL;	
    }
    for(iReturn=0;iReturn<(*fieldnum);iReturn++){
    	tempRow[iReturn] =(char *)malloc(dbcursor->pDef[iReturn].bufl+1);
	if(tempRow[iReturn]==NULL){
		dbClose(dbcursor);
		return NULL;
	}
	memcpy(tempRow[iReturn],dbcursor->pDef[iReturn].buf,dbcursor->pDef[iReturn].bufl);
        tempRow[dbcursor->pDef[iReturn].bufl]=0;
   }
   dbClose(dbcursor);
   return tempRow;
}
Beispiel #4
0
DB_CURSOR *ltDbOpenSql0(ltDbConn *pConn,char *pSmt,int iSumBind,va_list ap)
{
    DB_CURSOR *lCursor;
    int iReturn,iStatus,status;
    if(pSmt == NULL) {
        return NULL;
    }
    lCursor=NULL;
    lCursor = dbOpen(pConn);
    if(lCursor == NULL) {
        return NULL;
    }
    iReturn = dbParse(lCursor, pSmt);
    if(iReturn == 0) {
	 if(lCursor){
         	dbClose(lCursor);
	 }
         return NULL;
    }else {
        if(iSumBind > 0) {
            status = _ltDbSetBindValue_o(pConn,lCursor,iSumBind,&ap);
            if(status != OCI_SUCCESS) {
               status = ltDbErrorCode(pConn);
               if(lCursor){
         		dbClose(lCursor);
	       }
               return NULL;
            }
        }
        iReturn = dbExec(lCursor);
        if(iReturn == 0) {
            if(lCursor){
         		dbClose(lCursor);
	     }
            return NULL;
        }
        else {
            return lCursor;
        }
    }
}
Beispiel #5
0
void DbService::shutdown()
{
    BfDebug(__FUNCTION__);
    g_sm->checkCurrentOn(ServiceMgr::DB);

    // dbClose
    dbClose();

    // free env
    delete leveldb::BytewiseComparator();
    delete leveldb::Env::Default();
}
Beispiel #6
0
/* 执行 SQL语句  */
int ltDbExecSql0(ltDbConn *pConn,char *pSmt,int iSumBind,...)
{
    DB_CURSOR *psCur;
    int status;
    va_list ap;
    psCur = dbOpen(pConn);
    if(psCur == NULL) {
        return -1;
    }
    status = OCIStmtPrepare(psCur->pStmt, psCur->pConn->pErr, pSmt,
        (ub4)strlen(pSmt),
        (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
    if(status != OCI_SUCCESS) {
        status = ltDbErrorCode(pConn);
        dbClose(psCur);
        return status;
    }
    va_start(ap,iSumBind);
    status = _ltDbSetBindValue_o(pConn,psCur,iSumBind,&ap);
    va_end(ap);
    if(status != 0) {
        status = ltDbErrorCode(pConn);
        dbClose(psCur);
        return status;
    }
    
    status = OCIStmtExecute(psCur->pConn->pSvc, psCur->pStmt, psCur->pConn->pErr,
        1, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);
    if(status == OCI_SUCCESS) {
    /* 网文件中写日志  */
       
        dbClose(psCur);
        return 0;
    }
    else {
        status = ltDbErrorCode(pConn);
        dbClose(psCur);
        return status;
    }
}
Beispiel #7
0
void umClose()
{
	if (--umOpenCount > 0) {
		return;
	}
/*
 *	Do not close if intialization has not taken place
 */
	if (didUM != -1) {
		dbClose(didUM);
		didUM = -1;
	}

	if (saveFilename != NULL) {
		bfree(B_L, saveFilename);
		saveFilename = NULL;
	}
}
Beispiel #8
0
void DbService::shutdown()
{
    BfLog(__FUNCTION__);
    g_sm->checkCurrentOn(ServiceMgr::DB);

    // close timer
    this->pingTimer_->stop();
    delete this->pingTimer_;
    this->pingTimer_ = nullptr;

    // free client
    if (client_) {
        delete client_;
        client_ = nullptr;
    }

    // dbClose
    dbClose();

    // free env
    delete leveldb::BytewiseComparator();
    delete leveldb::Env::Default();
}
Beispiel #9
0
void ltDbCloseCursor(ltDbCursor *ltCursor)
{
    int iTemp;
    if(ltCursor) {
	/*释放字段名*/
	if(ltCursor->db_field){
		if(ltCursor->num_field>0){
			for(iTemp=0;iTemp<ltCursor->num_field;iTemp++){
				if(ltCursor->db_field[iTemp]){
					free(ltCursor->db_field[iTemp]);
				}
			}
		}
		free(ltCursor->db_field);
		ltCursor->db_field=NULL;
	}
	/*释放字段值*/
	if(ltCursor->db_row){
		if(ltCursor->num_field>0){
			for(iTemp=0;iTemp<ltCursor->num_field;iTemp++){
				if(ltCursor->db_row[iTemp]){
					free(ltCursor->db_row[iTemp]);
				}
			}
		}
		free(ltCursor->db_row);
		ltCursor->db_row=NULL;
	}
	/*释放数据库光标*/
	if(ltCursor->db_cursor){
           	dbClose(ltCursor->db_cursor);
	}
	/*释放指针*/
	free(ltCursor);
    }
}
Beispiel #10
0
bool LS3DatastoreXML::dbLoad(const QString &fileName, QProgressBar* progress) {
    LS3ElapsedAutoTimer timer("LS3DatastoreXML::dbLoad");
    // if a database is opened: close it!
    dbClose();

    QDomDocument doc("mydocument");
    QFile file(fileName);
    QString errorMessage;
    int errorLine;
    int errorColumn;

    if (!file.open(QIODevice::ReadOnly)) {
        emit dbError(tr("Error opening databse '%1': File could not be opened.").arg(fileName));
        return m_databaseLoaded=false;
    }
    if (!doc.setContent(&file, &errorMessage, &errorLine, &errorColumn)) {
        file.close();
        //file.close();
        emit dbError(tr("Error parsing databse '%1': %2 (line %3, column %4).").arg(fileName).arg(errorMessage).arg(errorLine).arg(errorColumn));
        return m_databaseLoaded=false;
    }
    file.close();

    QDomElement docElem = doc.documentElement();
    if (docElem.tagName()!="litsoz3database") {
        emit dbError(tr("Error in databse '%1': This is not a LitSoz 3 databse file (root element is <%2>, but should be <litsoz3database>.").arg(fileName).arg(docElem.tagName()));
        return m_databaseLoaded=false;
    }

    QDomElement n = docElem.firstChildElement("records");
    data->loadFromXML(n, progress);

    timer.showMessage("XML loaded");

    //if (keywordsdata) delete keywordsdata
    //keywordsdata = new QStringListModel(this);


    // create a stringlist model for the keywords and read its contents from the keywords field in the metadata table
    // the (possibly changed) model will be written back in the closeDB() method
    QDomElement metadata = docElem.firstChildElement("metadata");
    if (!metadata.isNull()) {
        n = metadata.firstChildElement("item");
        while(!n.isNull()) {
            QString type=n.attribute("type").toLower();
            if (type=="keywords") {
                QString sdata=n.text().replace("\r\n", "\n");
                sdata=sdata.replace("\n\r", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\r\r", "");
                QStringList sl=sdata.split("\n", QString::SkipEmptyParts);
                sl.removeDuplicates();
                sl.sort();
                keywordsdata->setStringList(sl);
            }
            if (type=="topics") {
                QString sdata=n.text().replace("\r\n", "\n");
                sdata=sdata.replace("\n\r", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\r\r", "");
                QStringList sl=sdata.split("\n", QString::SkipEmptyParts);
                sl.removeDuplicates();
                sl.sort();
                topicsdata->setStringList(sl);
            }
            n=n.nextSiblingElement("item");
        }
    }

    timer.showMessage("METADATA read");


    // read the list of selected records
    QDomElement selectedNode = docElem.firstChildElement("selection_list");
    clearSelection();
    if (!selectedNode.isNull()) {
        n = selectedNode.firstChildElement("item");
        while(!n.isNull()) {
            QString uuid=n.attribute("uuid");
            select(uuid);
            n=n.nextSiblingElement("item");
        }
    }
    timer.showMessage("SELECTION read");


    // read the reference tree

    QDomElement reftreeNode = docElem.firstChildElement("litsoz3_reference_tree");
    getReferencTreeModel()->readFromXML(reftreeNode);
    timer.showMessage("REFTREE read");

    // read the authorsdata completer list from a file in config dir
    //if (authorsdata) delete authorsdata;
    //authorsdata = new QStringListModel(this);
    QFile f(settings->GetConfigDirectory()+"/completers/authors.lst");
    if (f.open(QIODevice::ReadOnly|QIODevice::Text)) {
        //std::cout<<"OK\n";
        QString s=QString::fromUtf8(f.readAll());
        authorsdata->setStringList(s.split('\n', QString::SkipEmptyParts));
    }

    updateCompleters(0, recordCount()-1, false);
    timer.showMessage("AUTHORS_COMPLETER read");

    m_currentFile=fileName;
    emit filenameChanged(m_currentFile);
    emit connectWidgets();
    timer.showMessage("CONNECTED_WIDGETS");
    dbFirst();
    timer.showMessage("MOVED FIRST");

    emit databaseLoaded(true);
    emit databaseClosed(false);
    emit massiveSelectionChange();
    timer.showMessage("EMITED SIGNALS");
    return m_databaseLoaded=true;
}
DMM::~DMM()
{
	if(db!= NULL)
		dbClose();
}
Beispiel #12
0
int IndexDbLevelDb::initialize(const string& out_dir, const string& src_file_name, const string& excludeList, bool isRebuild, const char* curDir, int argc, const char** argv)
{
    leveldb::DB* dbCommon = NULL;
    m_defaultOptions.create_if_missing = true;
    //m_defaultOptions.compression = leveldb::kNoCompression;
    m_defaultOptions.compression = leveldb::kSnappyCompression;
    m_defaultOptions.block_cache = leveldb::NewLRUCache(128 * 1024 * 1024); 
    m_defaultOptions.filter_policy = leveldb::NewBloomFilterPolicy(10);

    const char* cwd = getcwd(m_CharBuff0, sizeof(m_CharBuff0));
    assert(cwd != 0);
    m_currentDirectory = m_CharBuff0;

    // build options
    snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%d", isRebuild);
    m_buildOpt = string(curDir) + "|" + excludeList + "|" + m_CharBuff0 + "|";
    for(int i = 0; i < argc; i++) {
        m_buildOpt += " " + string(argv[i]);
    }

    m_dbDir = out_dir;
    m_compileUnit = src_file_name;

#ifdef TIMER
    m_timers = new boost::timer::cpu_timer[k_timerNum];
    for(int i = 0; i < k_timerNum; i++) {
        m_timers[i].stop();
    }
#endif

    if(makeDirectory(m_dbDir.c_str())) {
        return -1; 
    }

    //
    // update file list
    //
    leveldb::Status status;
    m_commonDbDir = out_dir + "/common";
    if (dbTryOpen(dbCommon, m_commonDbDir) < 0) {
        fprintf(stderr, "Open fail.: %s\n", m_commonDbDir.c_str());
        return -1;
    }
    assert(dbCommon != NULL);
    string value;
    string keyFile = m_compileUnit;
    int rv = 0;
    // check if already registered
    rv = dbRead(value, dbCommon, TABLE_NAME_CU_NAME_TO_ID "|" + m_compileUnit);
    if(rv < 0) {
        // not found
        // add file
        string keyFileCount = "compile_unit_count";
        rv = dbRead(value, dbCommon, keyFileCount);
        if(rv < 0) {
            // key not found 
            dbWrite(dbCommon, keyFileCount, "1");
            m_compileUnitId = "0";
        }
        else if(rv == 0) {
            char buf[1024];
            m_compileUnitId = value;
            char* errp = NULL;
            int id = strtol(m_compileUnitId.c_str(), &errp, 16);
            assert(*errp == '\0');
            snprintf(buf, sizeof(buf), "%x", id+1);
            dbWrite(dbCommon, keyFileCount, buf);
        }
        else {
            printf("ERROR: db info\n");
        }
        dbWrite(dbCommon, TABLE_NAME_CU_NAME_TO_ID "|" + m_compileUnit, m_compileUnitId);
    }
    else if(rv == 0) {
        // alread exists
        m_compileUnitId = value;
    }
    dbClose(dbCommon);

    // open database for this compile unit
    assert(!m_compileUnitId.empty());

    // list of files already processed
    if(!isRebuild) {
        leveldb::WriteBatch wb_common;
        leveldb::DB* db_common;
        int rv = dbTryOpen(db_common, m_commonDbDir);
        if(rv < 0) {
            printf("ERROR: common db open: %s\n", m_commonDbDir.c_str());
            return -1;
        }
        leveldb::Iterator* it = db_common->NewIterator(leveldb::ReadOptions());
        for (it->SeekToFirst(); it->Valid(); it->Next()) {
            //cout << it->key().ToString() << ": "  << it->value().ToString() << endl;
            const string& key = it->key().ToString();
            if(key.find(TABLE_NAME_FILE_LIST "|") == 0) {
                m_finishedFiles[key.substr(2)] = it->value().ToString();
                //cout << key.substr(2) << endl;
            }
        }
        dbClose(db_common);
    }
    else {
        m_isRebuild = true;
    }
    return 0;
}
Beispiel #13
0
int IndexDbLevelDb::finalize(void)
{
    {
        leveldb::WriteBatch wb_common;
        leveldb::DB* db_common;
        int rv = dbTryOpen(db_common, m_commonDbDir);
        if(rv < 0) {
            printf("ERROR: finalize: common db open: %s\n", m_commonDbDir.c_str());
            return -1;
        }
        addFilesToFileList(db_common);
        dbFlush(db_common, &wb_common);
        dbClose(db_common);
    }

    // update UsrDb
    {
        leveldb::DB* dbUsrDb = NULL;
        leveldb::WriteBatch wb_usrdb;
        string curDir = m_dbDir + "/usr_db";
        if(makeDirectory(curDir.c_str())) {
            return -1; 
        }

        map<string, SiMap> refUsrFidMap; // store the file IDs a USR found
        for(const auto& itr : m_usr2referenceFileMap) {
            const string& usr = itr.first;
            SiMap& fidMap = refUsrFidMap[usr];
            for(const auto& itr_file_list : itr.second) {
                fidMap[m_fileContextMap[itr_file_list].m_dbId] = 0;
            }
        }

        map<string, SiMap> defUsrFidMap;
        for(const auto& itr : m_usr2defineFileMap) {
            const string& usr = itr.first;
            SiMap& fidMap = defUsrFidMap[usr];
            for(const auto& itr_file_list : itr.second) {
                fidMap[m_fileContextMap[itr_file_list].m_dbId] = 0;
            }
        }

        map<string, SiMap> overriderUsrFidMap;
        for(const auto& itr : m_usr2overriderFileMap) {
            const string& usr = itr.first;
            SiMap& fidMap = overriderUsrFidMap[usr];
            for(const auto& itr_file_list : itr.second) {
                fidMap[m_fileContextMap[itr_file_list].m_dbId] = 0;
            }
        }

        char* errp = NULL;
        int cuId = strtol(m_compileUnitId.c_str(), &errp, 16);
        assert(*errp == '\0');
        snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", (cuId % USR_DB_NUM)); 
        curDir.append(string("/") + string(m_CharBuff0));

        timerStart(TIMER_USR_DB0);
        //////
        // open db
        int rv = dbTryOpen(dbUsrDb, curDir);
        if(rv < 0) {
            printf("ERROR: finalize: common db open: %s\n", curDir.c_str());
            return -1;
        }

#ifdef USE_USR2FILE_TABLE2
        writeUsrDb(refUsrFidMap,             dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_REF);
        writeUsrDb(defUsrFidMap,             dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_DEF2);
        writeUsrDb(overriderUsrFidMap,       dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_OVERRIDER);
#else
        writeUsrDb(refUsrFidMap,             dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_REF);
        writeUsrDb(defUsrFidMap,             dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_DEF);
        writeUsrDb(overriderUsrFidMap,       dbUsrDb, wb_usrdb, TABLE_NAME_USR_TO_GLOBAL_FILE_ID_OVERRIDER);
#endif

        dbFlush(dbUsrDb, &wb_usrdb);
        dbClose(dbUsrDb);
        timerStop(TIMER_USR_DB0);
        // close db
        //////
#ifdef TIMER
        printf("---- Statistics ----\n");
        timerShow("time: TIMER_USR_DB0: ", TIMER_USR_DB0);
        timerShow("time: TIMER_USR_DB3: ", TIMER_USR_DB3);
        timerShow("time: TIMER_INS_REF: ", TIMER_INS_REF);
        timerShow("time: TIMER_INS_REF_1: ", TIMER_INS_REF_1);
        timerShow("time: TIMER_INS_REF_2: ", TIMER_INS_REF_2);
        timerShow("time: TIMER_INS_DECL: ", TIMER_INS_DECL);
        timerShow("time: TIMER_DB_SLEEP: ", TIMER_DB_SLEEP);
#endif
    }

#ifdef TIMER
    timerStart(TIMER_DB_WRITE);
#endif
    {
        string valFiles;
        leveldb::WriteBatch wb;

        for(const auto &itr : m_fileContextMap) {
            //const string& filename = itr->first;
            const string& dbId = itr.second.m_dbId;
            valFiles += "," + dbId;
        }
        for(const auto &fctxItr : m_fileContextMap) {
            const string& filename = fctxItr.first;
            const FileContext& fctx = fctxItr.second;
            const string& dbId = fctx.m_dbId;

            // check if already exists
            if(m_finishedFiles.find(filename) != m_finishedFiles.end()) {
                continue;
            }

            // position to usr
            for(const auto& itr : fctx.m_positition2usrList) {
                setKeyValuePos2Usr(m_CharBuff0, m_CharBuff1, sizeof(m_CharBuff0), itr.first, itr.second);
                wb.Put(dbId + m_CharBuff0, m_CharBuff1);
            }
            // decl
            for(const auto& itr : fctx.m_declList) {
                wb.Put(dbId + itr.first, itr.second);
            }
            // override
            for(const auto& itr : fctx.m_usrId2overrideeMap) {
#if (USE_BASE64 != 0)
                char* p = m_CharBuff0;
                p = encodeVal(p, itr.first);
                *p = '\0';
#else
                snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", itr.first);
#endif
                // overridee -> overrider
                wb.Put(dbId + TABLE_NAME_LOCAL_USR_ID_TO_OVERRIDER "|" + m_CharBuff0, itr.second);
            }
            for(const auto& itr : fctx.m_usrId2overriderMap) {
                const IiMap& usrMap = itr.second;
#if (USE_BASE64 != 0)
                char* p = m_CharBuff0;
                p = encodeVal(p, itr.first);
                *p = '\0';
#else
                snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", itr.first);
#endif
                string val = "";
                for(const auto& itr_usr : usrMap) {
#if (USE_BASE64 != 0)
                    char* p = m_CharBuff1;
                    p = encodeVal(p, itr_usr.first);
                    *p = '\0';
#else
                    snprintf(m_CharBuff1, sizeof(m_CharBuff1), "%x", itr_usr.first);
#endif
                    if(val.empty()) {
                        val = m_CharBuff1;
                    }
                    else {
                        val.append(string(",") + m_CharBuff1);
                    }
                }
                // overrider -> overridee
                wb.Put(dbId + TABLE_NAME_LOCAL_USR_ID_TO_OVERRIDEE "|" + m_CharBuff0, val);
            }

            // usr
            const SiMap& mapRef = fctx.m_usrIdTbl.GetTbl();
            addIdList(&wb, mapRef, dbId + TABLE_NAME_LOCAL_USR_ID_TO_USR);
            for(const auto& itr : mapRef) {
                string key(dbId + TABLE_NAME_USR_TO_LOCAL_ID "|");
                key.append(itr.first);
#if (USE_BASE64 != 0)
                char* p = m_CharBuff1;
                p = encodeVal(p, itr.second);
                *p = '\0';
#else
                snprintf(m_CharBuff1, sizeof(m_CharBuff1), "%x", itr.second);
#endif
                wb.Put(key, m_CharBuff1);
            }

            for(auto& itr : fctx.m_usrId2refMap) {
                int usrId = itr.first;
#if (USE_BASE64 != 0)
                string key(dbId + TABLE_NAME_LOCAL_USR_ID_TO_REF "|");
                char* p = m_CharBuff0;
                p = encodeVal(p, usrId);
                *p = '\0';
                key.append(m_CharBuff0);
#else
                snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", usrId);
                string key(dbId + TABLE_NAME_LOCAL_USR_ID_TO_REF "|" + m_CharBuff0);
#endif
                wb.Put(key, itr.second);
            }

            // inclusion
            for(auto& itr : fctx.m_line2inclusionfMap) {
#if (USE_BASE64 != 0)
                string key(dbId + TABLE_NAME_LINE_TO_INCLUSION "|");
                char* p = m_CharBuff0;
                p = encodeVal(p, itr.first);
                *p = '\0';
                key.append(m_CharBuff0);
#else
                // TODO: implement hex version
                //snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", usrId);
                //string key(dbId + TABLE_NAME_LOCAL_USR_ID_TO_REF "|" + m_CharBuff0);
#endif
                wb.Put(key, itr.second);
            }
            const SiMap& nameMap = fctx.m_nameIdTbl.GetTbl();
            addIdList(&wb, nameMap, dbId + TABLE_NAME_TOKEN_ID_TO_NAME);

            wb.Put(dbId + TABLE_NAME_CUFILES, valFiles);
            wb.Put(dbId + TABLE_NAME_BUILD_INFO, m_compileUnit + "|" + filename + "|" + m_buildOpt);
        }

        // decide db directory
        char* errp = NULL;
        //int id = strtol(dbId.c_str(), &errp, 16);
        int id = strtol(m_compileUnitId.c_str(), &errp, 16);
        int idRem = id % DB_NUM;

        leveldb::DB* db;
        snprintf(m_CharBuff0, sizeof(m_CharBuff0), "%x", idRem);
        string dbDir = string(m_CharBuff0);
        int rv = dbTryOpen(db, m_dbDir + "/" + dbDir);
        if(rv < 0) {
            printf("ERROR: finalize: open: %s\n", m_commonDbDir.c_str());
            return -1;
        }
        dbFlush(db, &wb);
        dbClose(db);
    }
#ifdef TIMER
    timerStop(TIMER_DB_WRITE);
    timerShow("time: TIMER_DB_WRITE: ", TIMER_DB_WRITE);
#endif

    delete m_defaultOptions.block_cache;
    return 0;
}