/* Initialize the database. */ void BulkExample::initDb(int dups, int sflag, int pagesize) { DbTxn *txnp; int ret; txnp = NULL; ret = 0; dbp = new Db(dbenv, 0); dbp->set_error_stream(&cerr); dbp->set_errpfx(progname); try{ if ((ret = dbp->set_bt_compare(compare_int)) != 0) throwException(dbenv, NULL, ret, "DB->set_bt_compare"); if ((ret = dbp->set_pagesize(pagesize)) != 0) throwException(dbenv, NULL, ret, "DB->set_pagesize"); if (dups && (ret = dbp->set_flags(DB_DUP)) != 0) throwException(dbenv, NULL, ret, "DB->set_flags"); if ((ret = dbenv->txn_begin(NULL, &txnp, 0)) != 0) throwException(dbenv, NULL, ret, "DB_ENV->txn_begin"); if ((ret = dbp->open(txnp, DATABASE, "primary", DB_BTREE, DB_CREATE, 0664)) != 0) throwException(dbenv, txnp, ret, "DB->open"); if (sflag) { sdbp = new Db(dbenv, 0); if ((ret = sdbp->set_flags(DB_DUPSORT)) != 0) throwException(dbenv, txnp, ret, "DB->set_flags"); if ((ret = sdbp->open(txnp, DATABASE, "secondary", DB_BTREE, DB_CREATE, 0664)) != 0) throwException(dbenv, txnp, ret, "DB->open"); if ((ret = dbp->associate( txnp, sdbp, get_first_str, 0)) != 0) throwException(dbenv, txnp, ret, "DB->associate"); } ret = txnp->commit(0); txnp = NULL; if (ret != 0) throwException(dbenv, NULL, ret, "DB_TXN->commit"); } catch(DbException &dbe) { cerr << "initDb " << dbe.what() << endl; if (txnp != NULL) (void)txnp->abort(); throw dbe; } }
// Open a Berkeley DB database int openDb(Db **dbpp, const char *progname, const char *fileName, DbEnv *envp, u_int32_t extraFlags) { int ret; u_int32_t openFlags; try { Db *dbp = new Db(envp, 0); // Point to the new'd Db *dbpp = dbp; if (extraFlags != 0) ret = dbp->set_flags(extraFlags); // Now open the database */ openFlags = DB_CREATE | // Allow database creation DB_THREAD | DB_AUTO_COMMIT; // Allow autocommit dbp->open(NULL, // Txn pointer fileName, // File name NULL, // Logical db name DB_BTREE, // Database type (using btree) openFlags, // Open flags 0); // File mode. Using defaults } catch (DbException &e) { std::cerr << progname << ": openDb: db open failed:" << std::endl; std::cerr << e.what() << std::endl; return (EXIT_FAILURE); } return (EXIT_SUCCESS); }
int main(int argc, const char* argv[]) { if (argc !=3) { cout << "usage: "<< argv[0] << " <filename> <db filename>" << endl; return 1; } const char* kDatabaseName = argv[2]; const char* filename = argv[1]; DbEnv env(0); Db* pdb; try { env.set_error_stream(&cerr); env.open("./", DB_CREATE | DB_INIT_MPOOL, 0); pdb = new Db(&env, 0); pdb->set_flags(DB_DUP); // Create (or clear its content if it exists) the database pdb->open(NULL, kDatabaseName, NULL, DB_BTREE, DB_CREATE | DB_TRUNCATE, 0); readfile(pdb, filename); readfile(pdb, "tables/jp.txt"); // Clean up if (pdb != NULL) { pdb->close(0); delete pdb; } env.close(0); } catch (DbException& e) { cerr << "DbException: " << e.what() << endl; return -1; } catch (std::exception& e) { cerr << e.what() << endl; return -1; } return 0; }
int main(int argc, const char* argv[]) { if (argc !=3) { cout << "usage: "<< argv[0] << " <filename> <db filename>" << endl; return 1; } const char* kDatabaseName = argv[2]; const char* filename = argv[1]; DbEnv env(0); Db* pdb; string line; bool datamode = false; try { env.set_error_stream(&cerr); env.open("./", DB_CREATE | DB_INIT_MPOOL, 0); pdb = new Db(&env, 0); // If you want to support duplicated records and make duplicated // records sorted by data, you need to call: // pdb->set_flags(DB_DUPSORT); // Note that only Btree-typed database supports sorted duplicated // records // If the database does not exist, create it. If it exists, clear // its content after openning. pdb->set_flags( DB_DUP );// | DB_DUPSORT); pdb->open(NULL, kDatabaseName, NULL, DB_BTREE, DB_CREATE | DB_TRUNCATE, 0); ifstream myfile (filename); if (myfile.is_open()) { int count = 0; while ( myfile.good() ) { //if (count++ > 10) { // break; //} getline (myfile,line); if (!datamode) { if ("[DATA]" == line ) { datamode = true; } continue; } //cout << (int)line[8] << endl; int index = 0; while (32 != (char)line[index]) { index++; } string cjkey = line.substr(0, index); while (32 == line[index]) { index++; } string cjdata = line.substr(index, (line.size()-index)); cout << cjkey << "---" << cjdata << endl; Dbt key(const_cast<char*>(cjkey.data()), cjkey.size()); Dbt value(const_cast<char*>(cjdata.data()), cjdata.size()); pdb->put(NULL, &key, &value, 0); } myfile.close(); } else { cout << "Unable to open file"; } // You need to set ulen and flags=DB_DBT_USERMEM to prevent Dbt // from allocate its own memory but use the memory provided by you. string search("aa"); Dbt key(const_cast<char*>(search.c_str()), search.size()); char buffer[1024]; Dbt data; data.set_data(buffer); data.set_ulen(1024); data.set_flags(DB_DBT_USERMEM); if (pdb->get(NULL, &key, &data, 0) == DB_NOTFOUND) { cerr << "Not found" << endl; } else { cout << "Found: " << "PPPPPP" <<buffer << "PPPPPP" << endl; } if (pdb != NULL) { pdb->close(0); delete pdb; // You have to close and delete an exisiting handle, then create // a new one before you can use it to remove a database (file). pdb = new Db(NULL, 0); //pdb->remove("access.db", NULL, 0); delete pdb; } env.close(0); } catch (DbException& e) { cerr << "DbException: " << e.what() << endl; return -1; } catch (std::exception& e) { cerr << e.what() << endl; return -1; } return 0; }