DB_ENV *db_setup(char *home) { DB_ENV *dbenv; int ret; /* * Create an environment and initialize it for additional error * reporting. */ if ((ret = db_env_create(&dbenv, 0)) != 0) { return (NULL); } ci_debug_printf(5,"Environment created OK.\n"); // dbenv->set_data_dir(dbenv, ""); dbenv->set_data_dir(dbenv, home); ci_debug_printf(5,"Data dir set to %s.\n", home); /* dbenv->set_shm_key(dbenv, 888888L); ci_debug_printf(5,"Shared memory set.\n"); */ /* * Specify the shared memory buffer pool cachesize: 5MB. * Databases are in a subdirectory of the environment home. */ // if ((ret = dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0)) != 0) { // dbenv->err(dbenv, ret, "set_cachesize"); // goto err; // } /* Open the environment */ if ((ret = dbenv->open(dbenv, home, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL|DB_THREAD /*| DB_SYSTEM_MEM*/, 0)) != 0){ ci_debug_printf(1, "Environment open failed: %s\n", db_strerror(ret)); dbenv->close(dbenv, 0); return NULL; } ci_debug_printf(5,"DB setup OK.\n"); return (dbenv); }
/* * This should be done before the program is open for business. * As such, it does not need to be reentrant. */ int open_db_env(char *topdir) { DB_ENV *tmpenv = NULL; int st; struct stat64 sbuf; char logdir[MAXPATHLEN+1]; char tmpdir[MAXPATHLEN+1]; char *dirarr[3]; int i; if (topdir == NULL) { return (-1); } snprintf(logdir, sizeof (tmpdir), "%s/.logs", topdir); snprintf(tmpdir, sizeof (tmpdir), "%s/.tmp", topdir); dirarr[0] = topdir; dirarr[1] = logdir; dirarr[2] = tmpdir; /* first, set up the environment */ st = db_env_create(&tmpenv, 0); if (st != 0) { return (st); } /* make sure the directories exist */ for (i = 0; i < 3; i++) { st = stat64(dirarr[i], &sbuf); if ((st != 0) && (errno == ENOENT)) { st = mkdirp(dirarr[i], 0744); if (st == 0) { st = stat64(dirarr[i], &sbuf); } } if ((st == 0) && (!S_ISDIR(sbuf.st_mode))) { st = -1; break; } } if (st != 0) { return (st); } st = tmpenv->set_data_dir(tmpenv, topdir); if (st != 0) { return (st); } st = tmpenv->set_lg_dir(tmpenv, logdir); if (st != 0) { return (st); } st = tmpenv->set_tmp_dir(tmpenv, tmpdir); if (st != 0) { return (st); } st = tmpenv->set_flags(tmpenv, env_fl, 1); if (st != 0) { return (st); } /* overall database cache size */ st = tmpenv->set_cachesize(tmpenv, 0, (60 * MEGA), 1); st = tmpenv->set_shm_key(tmpenv, FSM_SHM_MASTER_KEY); if (st != 0) { return (st); } /* log buffer in memory */ st = tmpenv->set_lg_bsize(tmpenv, (30 * MEGA)); if (st != 0) { return (st); } /* set up additional error logging */ tmpenv->set_errcall(tmpenv, fsmdb_log_err); /* Increase the number of locks available */ tmpenv->set_lk_max_locks(tmpenv, 10000); tmpenv->set_lk_max_lockers(tmpenv, 10000); tmpenv->set_lk_max_objects(tmpenv, 10000); /* Increase the number of concurrent transactions available */ /* Note: Default in 4.4-20 is '20'. In later versions it's 100 */ tmpenv->set_tx_max(tmpenv, 100); st = tmpenv->open(tmpenv, topdir, env_ofl, 0644); if (st != 0) { /* check for a major failure */ if (st == DB_RUNRECOVERY) { st = tmpenv->open(tmpenv, topdir, env_ffl, 0644); } /* log catastrophic failure and remove all db files. */ if (st == DB_RUNRECOVERY) { fsmdb_log_err(dbEnv, NULL, "Database files corrupt, cannot recover. " "Files will be removed. Please re-index any " "recovery points to regenerate the database."); fsmdb_remove_all(topdir); } } if (st != 0) { return (st); } /* clear out unneeded log files */ tmpenv->log_archive(tmpenv, NULL, DB_ARCH_REMOVE); /* all set, ready to use */ dbEnv = tmpenv; return (st); }
/////////////////// // // // Main Function // // // /////////////////// int main(int argc, char *argv[]) { /* Declare local vars */ /***********************************/ DB_ENV *dbenv; /* pointer to database environment */ DB *dbp1; /* pointer to 1st database */ DB *dbp2; /* pointer to 2nd database */ DBT key1, data1; /* Database key and data variables */ DBT key2, data2; /* Database key and data variables */ int ret; /* return code/message */ /* Creates the DB environment */ if ((ret = db_env_create(&dbenv, 0)) != 0) { fprintf(stderr, "%s: %s\n", argv[0], db_strerror(ret)); return(1); }; dbenv->set_errfile(dbenv, stderr); dbenv->set_errpfx(dbenv, argv[0]); /* Set shared memory buffer pool cachesize: 5MB. */ /* Databases are in a subdirectory of the environment home. */ if ((ret = dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0)) != 0) { dbenv->err(dbenv, ret, "set_cachesize"); dbenv->close(dbenv, 0); return(1); }; if ((ret = dbenv->set_data_dir(dbenv, MY_DBENV_DIR_DATA)) != 0) { dbenv->err(dbenv, ret, "set_data_dir: %s", MY_DBENV_DIR_DATA); dbenv->close(dbenv, 0); return(1); }; /* Open the environment with full transactional support. */ dbenv->open( dbenv, MY_DBENV_DIR_HOME, DB_CREATE | DB_INIT_LOG | DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN, 0 ); if (ret != 0) { dbenv->err(dbenv, ret, "environment open: %s", MY_DBENV_DIR_HOME); dbenv->close(dbenv, 0); return(1); }; /* Create first Database handle */ if ((ret = db_create(&dbp1, dbenv, 0)) != 0) { dbenv->err(dbenv, ret, "database create"); dbenv->close(dbenv, 0); return(1); }; /* Opens first database */ if ((ret = dbp1->open(dbp1, NULL, MY_DB1_FILE, NULL, DB_BTREE, DB_CREATE, 0640)) != 0) { dbenv->err(dbenv, ret, "DB->open: %s", MY_DB1_FILE); dbp1->close(dbp1, 0); dbenv->close(dbenv, 0); return (ret); }; /* Create second Database handle */ if ((ret = db_create(&dbp2, dbenv, 0)) != 0) { dbenv->err(dbenv, ret, "database create"); dbp1->close(dbp1, 0); dbenv->close(dbenv, 0); return(1); }; /* Opens second database */ if ((ret = dbp2->open(dbp2, NULL, MY_DB2_FILE, NULL, DB_BTREE, DB_CREATE, 0640)) != 0) { dbenv->err(dbenv, ret, "DB->open: %s", MY_DB2_FILE); dbp1->close(dbp1, 0); dbp2->close(dbp1, 0); dbenv->close(dbenv, 0); return (ret); }; /* Clears variables to avoid garbage */ memset(&key1, 0, sizeof(key1)); memset(&data1, 0, sizeof(data1)); memset(&key2, 0, sizeof(key2)); memset(&data2, 0, sizeof(data2)); /* Preps data to be added to first database */ key1.data = "fruit"; key1.size = sizeof("fruit"); data1.data = "apple"; data1.size = sizeof("apple"); /* pushes data into first database */ if ((ret = dbp1->put(dbp1, NULL, &key1, &data1, 0)) == 0) { printf("db: %s: key stored.\n", (char *)key1.data); } else { dbp1->err(dbp1, ret, "DB->put"); dbp1->close(dbp1, 0); dbp2->close(dbp2, 0); dbenv->close(dbenv, 0); return(1); }; /* Preps data for second database */ key2 = data1; data2.data = "red"; data2.size = sizeof("red"); /* pushes data into second database */ if ((ret = dbp2->put(dbp2, NULL, &key2, &data2, 0)) == 0) { printf("db: %s: key stored.\n", (char *)key2.data); } else { dbp1->err(dbp2, ret, "DB->put"); dbp1->close(dbp1, 0); dbp2->close(dbp2, 0); dbenv->close(dbenv, 0); return(1); }; /* Pulls data from database */ if ((ret = dbp1->get(dbp1, NULL, &key1, &data1, 0)) == 0) { printf("db: %s: key retrieved: data was %s.\n", (char *)key1.data, (char *)data1.data); if ((ret = dbp1->get(dbp2, NULL, &data1, &data2, 0)) == 0) { printf("db: %s: key retrieved: data was %s.\n", (char *)data1.data, (char *)data2.data); } else { dbp1->err(dbp2, ret, "DB->get"); dbp1->close(dbp1, 0); dbp2->close(dbp2, 0); dbenv->close(dbenv, 0); return(1); }; } else { dbp1->err(dbp2, ret, "DB->get"); dbp1->close(dbp1, 0); dbp2->close(dbp2, 0); dbenv->close(dbenv, 0); return(1); }; /* Exit function */ dbp1->close(dbp1, 0); dbp2->close(dbp2, 0); dbenv->close(dbenv, 0); return(0); };