Ejemplo n.º 1
0
NEOERR* lutil_fetch_count(HDF *hdf, mdb_conn *conn, char *table, char *cond)
{
    if (!table || !cond) return nerr_raise(NERR_ASSERT, "paramter null");

    char *buf;
    size_t datalen;
    int count = 0;
    NEOERR *err;
    
    buf = mmc_getf(&datalen, 0, PRE_MMC_COUNT".%s.%s", table, cond);
    if (buf == NULL) {
        err = mdb_exec(conn, NULL, "SELECT count(*) FROM %s WHERE %s;",
                       NULL, table, cond);
        if (err != STATUS_OK) return nerr_pass(err);

        err = mdb_get(conn, "s", &buf);
        if (err != STATUS_OK) return nerr_pass(err);

        count = atoi(buf);
        mmc_storef(MMC_OP_SET, (void*)buf, 0, ONE_HOUR, 0,
                   PRE_MMC_COUNT".%s.%s", table, cond);
    } else {
        count = atoi(buf);
    }

    hdf_set_int_value(hdf, PRE_OUTPUT".ttnum", count);

    return STATUS_OK;
}
Ejemplo n.º 2
0
int64 LMDBFileIndex::get(const LMDBFileIndex::SIndexKey& key)
{
	begin_txn(MDB_RDONLY);

	MDB_val mdb_tkey;
	mdb_tkey.mv_data=const_cast<void*>(static_cast<const void*>(&key));
	mdb_tkey.mv_size=sizeof(SIndexKey);

	MDB_val mdb_tvalue;

	int rc=mdb_get(txn, dbi, &mdb_tkey, &mdb_tvalue);

	int64 ret = 0;
	if(rc==MDB_NOTFOUND)
	{
		
	}
	else if(rc)
	{
		Server->Log("LMDB: Failed to read ("+(std::string)mdb_strerror(rc)+")", LL_ERROR);
		_has_error=true;
	}
	else
	{
		CRData data((const char*)mdb_tvalue.mv_data, mdb_tvalue.mv_size);
		
		data.getVarInt(&ret);
	}

	abort_transaction();

	return ret;
}
Ejemplo n.º 3
0
long gcache_get(struct gcache *gc, char *k, char *buf, long buflen)
{
	MDB_val key, data;
	MDB_txn *txn;
	int rc;
	long len = -1;

	if (gc == NULL)
		return (-1);

	rc = mdb_txn_begin(gc->env, NULL, MDB_RDONLY, &txn);
	if (rc) {
		olog(LOG_ERR, "gcache_get: mdb_txn_begin: (%d) %s", rc, mdb_strerror(rc));
		return (-1);
	}

	key.mv_data = k;
	key.mv_size = strlen(k);

	rc = mdb_get(txn, gc->dbi, &key, &data);
	if (rc != 0) {
		if (rc != MDB_NOTFOUND) {
			printf("get: %s\n", mdb_strerror(rc));
		} else {
			// printf(" [%s] not found\n", k);
		}
	} else {
		len =  (data.mv_size < buflen) ? data.mv_size : buflen;
		memcpy(buf, data.mv_data, len);
		// printf("%s\n", (char *)data.mv_data);
	}
	mdb_txn_commit(txn);
	return (len);
}
Ejemplo n.º 4
0
char* user_login_auth(mdb_conn *conn, char *uid, char *pass)
{
	if (!conn || !uid || !pass) return NULL;

	char *p, *r;
	int ret, x;
	
	mdb_exec(conn, NULL, "SELECT password from account WHERE userid=$1;", "s", uid);
	if (mdb_get(conn, "s", &p) == MDB_ERR_NONE) {
		if (!strcmp(p, pass)) {
			
			r = calloc(1, LEN_SKEY+1);
			for (x = 0; x < LEN_SKEY; x++) {
				r[x] = (char)(65 + neo_rand(90-65));
			}
			r[x] = '\0';

			ret = mdb_exec(conn, NULL, "UPDATE account SET skey='$1' WHERE "
						   " userid=$2;", "ss", r, uid);
			if (ret != MDB_ERR_NONE) {
				mtc_err("exec failure %s", mdb_get_errmsg(conn));
				free(r);
				return NULL;
			}
			return r;
		}
	}

	return NULL;
}
Ejemplo n.º 5
0
 int LMDBEngine::Get(const Slice& key, std::string* value, bool fill_cache)
 {
     MDB_val k, v;
     k.mv_data = const_cast<char*>(key.data());
     k.mv_size = key.size();
     int rc;
     LMDBContext& holder = m_ctx_local.GetValue();
     MDB_txn *txn = holder.readonly_txn;
     if (NULL == holder.readonly_txn)
     {
         rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn);
         if (rc != 0)
         {
             ERROR_LOG("Failed to create txn for get for reason:%s", mdb_strerror(rc));
             return -1;
         }
     }
     rc = mdb_get(txn, m_dbi, &k, &v);
     if (NULL == holder.readonly_txn)
     {
         mdb_txn_commit(txn);
     }
     if (0 == rc && NULL != value && NULL != v.mv_data)
     {
         value->assign((const char*) v.mv_data, v.mv_size);
     }
     return rc;
 }
Ejemplo n.º 6
0
/*
 * input : pname(STR) aname(STR)
 * return: NORMAL
 * reply : NULL
 */
static NEOERR* aic_cmd_app_setsecy(struct queue_entry *q, struct cache *cd, mdb_conn *db)
{
    char *pname, *aname;
    int pid, aid, upid;
    NEOERR *err;

    REQ_GET_PARAM_STR(q->hdfrcv, "pname", pname);
    REQ_GET_PARAM_STR(q->hdfrcv, "aname", aname);

    pid = hash_string(pname);
    aid = hash_string(aname);

    MDB_EXEC(db, NULL, "UPDATE appinfo SET tune=tune & %d WHERE aid=%d OR pid=%d "
             " RETURNING aid", NULL, ~LCS_TUNE_SECY, pid, pid);

    upid = aid;
    err = mdb_get(db, "i", &upid);
    if (err != STATUS_OK) return nerr_pass(err);
    
    MDB_EXEC(db, NULL, "UPDATE appinfo SET tune=tune | %d WHERE aid=%d",
             NULL, LCS_TUNE_SECY, aid);

    cache_delf(cd, PREFIX_APPINFO"%d", upid);
    cache_delf(cd, PREFIX_APPINFO"%d", aid);
    cache_delf(cd, PREFIX_APPOUSER"%d_0", pid);
    cache_delf(cd, PREFIX_SECY"%d", pid);

    return STATUS_OK;
}
Ejemplo n.º 7
0
int     slmdb_get(SLMDB *slmdb, MDB_val *mdb_key, MDB_val *mdb_value)
{
    MDB_txn *txn;
    int     status;

    /*
     * Start a read transaction if there's no bulk-mode txn.
     */
    if (slmdb->txn)
	txn = slmdb->txn;
    else if ((status = slmdb_txn_begin(slmdb, MDB_RDONLY, &txn)) != 0)
	SLMDB_API_RETURN(slmdb, status);

    /*
     * Do the lookup.
     */
    if ((status = mdb_get(txn, slmdb->dbi, mdb_key, mdb_value)) != 0
	&& status != MDB_NOTFOUND) {
	mdb_txn_abort(txn);
	if ((status = slmdb_recover(slmdb, status)) == 0)
	    status = slmdb_get(slmdb, mdb_key, mdb_value);
	SLMDB_API_RETURN(slmdb, status);
    }

    /*
     * Close the read txn if it's not the bulk-mode txn.
     */
    if (slmdb->txn == 0)
	mdb_txn_abort(txn);

    SLMDB_API_RETURN(slmdb, status);
}
Ejemplo n.º 8
0
int mail_cache_db_get_size(struct mail_cache_db * cache_db,
    const void * key, size_t key_len, size_t * pvalue_len)
{
  int r;
  MDB_env *env;
  MDB_txn *txn;
  MDB_dbi dbi;
  MDB_val mdb_key;
  MDB_val mdb_val;

  env = cache_db->internal_database;

  mdb_key.mv_size = key_len;
  mdb_key.mv_data = (void *) key;

  r = mdb_txn_begin(env, NULL, 0, &txn);
  if (r != 0)
    return -1;
  r = mdb_dbi_open(txn, NULL, 0, &dbi);
  if (r != 0)
    goto error;

  r = mdb_get(txn, dbi, &mdb_key, &mdb_val);
  if (r != 0)
    goto error;

  * pvalue_len = mdb_val.mv_size;
  mdb_txn_commit(txn);
  return 0;

  error:
    mdb_txn_abort(txn);
    return -1;
}
Ejemplo n.º 9
0
/*
 * Initialize ENTRYID and USN sequence.
 */
static
DWORD
MDBInitSequence(
    PVDIR_MDB_DB pDB,
    VDIR_DB      mdbDbi
    )
{
    DWORD           dwError = 0;
    PVDIR_DB_TXN    pTxn = NULL;
    VDIR_DB_DBT     key = {0};
    VDIR_DB_DBT     value = {0};
    unsigned char   EidBytes[sizeof( ENTRYID )] = {0};
    ENTRYID         initEIDValue = ENTRY_ID_SEQ_INITIAL_VALUE;
    ENTRYID         initUNSValue = USN_SEQ_INITIAL_VALUE;

    assert(pDB);

    dwError = mdb_txn_begin( pDB->mdbEnv, NULL, BE_DB_FLAGS_ZERO, &pTxn );
    BAIL_ON_VMDIR_ERROR(dwError);

    key.mv_data = &EidBytes[0];
    MDBEntryIdToDBT(BE_MDB_ENTRYID_SEQ_KEY, &key);

    dwError =  mdb_get(pTxn, mdbDbi, &key, &value);
    if (dwError == MDB_NOTFOUND)
    {
        // first time, initialize two sequence records
        value.mv_data = &initEIDValue;
        value.mv_size = sizeof(initEIDValue);

        // set entryid sequence record
        dwError = mdb_put(pTxn, mdbDbi, &key, &value,  MDB_NOOVERWRITE);
        BAIL_ON_VMDIR_ERROR(dwError);

        MDBEntryIdToDBT(BE_MDB_USN_SEQ_KEY, &key);
        value.mv_data = &initUNSValue;
        value.mv_size = sizeof(initUNSValue);

        // set usn sequence record
        dwError = mdb_put(pTxn, mdbDbi, &key, &value, MDB_NOOVERWRITE);
        BAIL_ON_VMDIR_ERROR(dwError);
    }

    dwError = mdb_txn_commit(pTxn);
    pTxn = NULL;
    BAIL_ON_VMDIR_ERROR(dwError);

cleanup:

    return dwError;

error:

    if (pTxn)
    {
        mdb_txn_abort(pTxn);
    }

    goto cleanup;
}
Ejemplo n.º 10
0
bool DBPrivRead(DBPriv *db, const void *key, int key_size, void *dest, int dest_size)
{
    MDB_val mkey, data;
    DBTxn *txn;
    int rc;
    bool ret = false;

    rc = GetReadTransaction(db, &txn);
    if (rc == MDB_SUCCESS)
    {
        assert(!txn->cursor_open);
        mkey.mv_data = (void *)key;
        mkey.mv_size = key_size;
        rc = mdb_get(txn->txn, db->dbi, &mkey, &data);
        if (rc == MDB_SUCCESS)
        {
            if (dest_size > data.mv_size)
            {
                dest_size = data.mv_size;
            }
            memcpy(dest, data.mv_data, dest_size);
            ret = true;
        }
        else if (rc != MDB_NOTFOUND)
        {
            Log(LOG_LEVEL_ERR, "Could not read database entry: %s", mdb_strerror(rc));
            AbortTransaction(db);
        }
    }
    return ret;
}
Ejemplo n.º 11
0
NEOERR* blog_data_add(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    mdb_conn *conn = (mdb_conn*)hash_lookup(dbh, "aux");
    mevent_t *evt = (mevent_t*)hash_lookup(evth, "aic");
    char *aname, command[1024];
    char *title, *content;
    int id = 0;
    NEOERR *err;

    LPRE_DBOP(cgi->hdf, conn);
    
    APP_CHECK_LOGIN();
    
    if (hdf_get_int_value(evt->hdfrcv, "state", 0) < LCS_ST_ADMIN)
        return nerr_raise(LERR_LIMIT, "%s wan't be admin", aname);

    HDF_GET_STR(cgi->hdf, PRE_QUERY".title", title);
    HDF_GET_STR(cgi->hdf, PRE_QUERY".content", content);

    MDB_EXEC(conn, NULL, "INSERT INTO blog (title, content, author) "
             " VALUES ($1::varchar(256), $2, "
             " $3::varchar(256)) RETURNING id",
             "sss", title, content, aname);
    err = mdb_get(conn, "i", &id);
    if (err != STATUS_OK) return nerr_pass(err);

    snprintf(command, sizeof(command), PATH_PAGER"blg -i 0 -b %d", id);
    mtc_dbg("%s", command);
    system(command);

    return STATUS_OK;
}
Ejemplo n.º 12
0
bool LmdbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) {
  DLOG(INFO) << "LMDB: Get";

  vector<char> serialized_key;
  if (!KCoder::serialize(key, &serialized_key)) {
    LOG(ERROR) << "failed to serialized key";
    return false;
  }

  MDB_val mdbkey, mdbdata;
  mdbkey.mv_data = serialized_key.data();
  mdbkey.mv_size = serialized_key.size();

  int retval;
  retval = mdb_get(read_txn_, dbi_, &mdbkey, &mdbdata);
  if (MDB_SUCCESS != retval) {
    LOG(ERROR) << "mdb_get failed " << mdb_strerror(retval);
    return false;
  }

  if (!VCoder::deserialize(reinterpret_cast<char*>(mdbdata.mv_data),
      mdbdata.mv_size, value)) {
    LOG(ERROR) << "failed to deserialize value";
    return false;
  }

  return true;
}
Ejemplo n.º 13
0
int kvdb_lmdb_get(kvdb_t *kvdb, const char *key, uint32_t klen, void **ppVal, uint32_t *pnVal)
{
    kvdb_lmdb_t *lmdb = (kvdb_lmdb_t*)kvdb;
    kvenv_lmdb_t *kvenv_lmdb = (kvenv_lmdb_t*)kvdb->kvenv;

    MDB_val m_key;
    MDB_txn *txn;

    m_key.mv_size = klen;
    m_key.mv_data = (void*)key;

    int rc = mdb_txn_begin(kvenv_lmdb->env, NULL, MDB_RDONLY, &txn);
    if( rc==0 ){
        MDB_val m_val = {0, 0};
        rc = mdb_get(txn, lmdb->dbi, &m_key, &m_val);
        if ( rc == 0 ) {
            uint32_t nVal = m_val.mv_size;
            char *pVal = m_val.mv_data;
            char *result = (char*)zmalloc(nVal);
            memcpy(result, pVal, nVal);
            *ppVal = result;
            *pnVal = nVal;
        } else if( rc==MDB_NOTFOUND ){
            rc = 0;
            *ppVal = 0;
            *pnVal = -1;
        }else{
            error_log("kvdb_lmdb_get() failure. error: %s", mdb_strerror(rc));
        }
        mdb_txn_commit(txn);
    }

    return rc;
}
Ejemplo n.º 14
0
static int
lmdb_storage_get(void* handle, iid_t iid, paxos_accepted* out)
{
	struct lmdb_storage* s = handle;
	int result;
	MDB_val key, data;

	memset(&data, 0, sizeof(data));

	key.mv_data = &iid;
	key.mv_size = sizeof(iid_t);

	if ((result = mdb_get(s->txn, s->dbi, &key, &data)) != 0) {
		if (result == MDB_NOTFOUND) {
			paxos_log_debug("There is no record for iid: %d", iid);
		} else {
			paxos_log_error("Could not find record for iid: %d : %s",
			iid, mdb_strerror(result));
		}
		return 0;
	}

	paxos_accepted_from_buffer(data.mv_data, out);
	assert(iid == out->iid);

	return 1;
}
Ejemplo n.º 15
0
/**
 * This function works in stages. First we clean up the given key to prevent
 * any trickery by users. Then we retrieve the existing value, increment it,
 * and store it back in the db.
 */
uint64_t counter_inc(counter_t *lc, const char *key) {
    char clean_key[KEYSZ] = { 0 };
    key_clean(clean_key, key);
    clean_key[15] = '\0';

    MDB_val mkey, data, update;
    MDB_txn *txn = NULL;

    mkey.mv_size = (KEYSZ) * sizeof(char);
    mkey.mv_data = (void *)clean_key;

    mdb_txn_begin(lc->env, NULL, 0, &txn);
    uint64_t stored_counter = 0;
    // We only care about success here, since if mdb_get fails it is because
    // the key doesn't exist and we need to make it.
    if(mdb_get(txn, *lc->dbi, &mkey, &data) == MDB_SUCCESS) {
        stored_counter = *(uint64_t *)data.mv_data;
    }
    stored_counter++;
    update.mv_size = sizeof(uint64_t);
    update.mv_data = (void *)&stored_counter;
    if(mdb_put(txn, *lc->dbi, &mkey, &update, 0) != MDB_SUCCESS) {
        perror("mdb_put");
        mdb_txn_abort(txn);
        return 0;
    }

    MDB_CHECK(mdb_txn_commit(txn), MDB_SUCCESS, 0);
    return stored_counter;
}
Ejemplo n.º 16
0
void counter_dump(counter_t *lc, buffer_t *output) {
    MDB_val key, data, rps_key, rps_data;
    MDB_txn *txn = NULL;
    MDB_cursor *cursor = NULL;
    mdb_txn_begin(lc->env, NULL, MDB_RDONLY, &txn);
    mdb_cursor_open(txn, *lc->dbi, &cursor);
    int rc = 0;
    char *tmp_str = NULL;
    int size = 0;
    uint64_t rps = 0;
    while((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
        if((*(char *)key.mv_data) == '_') {
            continue;
        }
        size = asprintf(&tmp_str, "_%s_rps", (char *)key.mv_data);
        rps_key.mv_size = size;
        rps_key.mv_data = tmp_str;
        if(mdb_get(txn, *lc->dbi, &rps_key, &rps_data) == MDB_SUCCESS) {
            rps = *(uint64_t *)rps_data.mv_data;
        }
        free(tmp_str);
        size = asprintf(&tmp_str, "%s: %lu - %lurps\n", (char *)key.mv_data, *(uint64_t *)data.mv_data, rps);
        buffer_append(output, tmp_str, size);
        free(tmp_str);
    }
    mdb_cursor_close(cursor);
    mdb_txn_abort(txn);
}
Ejemplo n.º 17
0
int CDbxMdb::Load(bool bSkipInit)
{
	if (!Remap())
		return EGROKPRF_CANTREAD;

	if (!bSkipInit) {
		txn_ptr trnlck(m_pMdbEnv);
		mdb_open(trnlck, "global", MDB_CREATE | MDB_INTEGERKEY, &m_dbGlobal);
		mdb_open(trnlck, "contacts", MDB_CREATE | MDB_INTEGERKEY, &m_dbContacts);
		mdb_open(trnlck, "modules", MDB_CREATE | MDB_INTEGERKEY, &m_dbModules);
		mdb_open(trnlck, "events", MDB_CREATE | MDB_INTEGERKEY, &m_dbEvents);
		mdb_open(trnlck, "eventsrt", MDB_CREATE | MDB_INTEGERKEY, &m_dbEventsSort);
		mdb_open(trnlck, "settings", MDB_CREATE, &m_dbSettings);

		DWORD keyVal = 1;
		MDB_val key = { sizeof(DWORD), &keyVal }, data;
		if (mdb_get(trnlck, m_dbGlobal, &key, &data) == MDB_SUCCESS) {
			DBHeader *hdr = (DBHeader*)data.mv_data;
			if (hdr->dwSignature != DBHEADER_SIGNATURE)
				DatabaseCorruption(NULL);

			memcpy(&m_header, data.mv_data, sizeof(m_header));
		}
		else {
			m_header.dwSignature = DBHEADER_SIGNATURE;
			m_header.dwVersion = 1;
			data.mv_data = &m_header; data.mv_size = sizeof(m_header);
			mdb_put(trnlck, m_dbGlobal, &key, &data, 0);

			keyVal = 0;
			DBContact dbc = { DBCONTACT_SIGNATURE, 0, 0, 0 };
			data.mv_data = &dbc; data.mv_size = sizeof(dbc);
			mdb_put(trnlck, m_dbContacts, &key, &data, 0);
		}
		trnlck.commit();

		if (InitModuleNames()) return EGROKPRF_CANTREAD;
		if (InitCrypt())       return EGROKPRF_CANTREAD;

		// everything is ok, go on
		if (!m_bReadOnly) {
			// we don't need events in the service mode
			if (ServiceExists(MS_DB_SETSAFETYMODE)) {
				hContactDeletedEvent = CreateHookableEvent(ME_DB_CONTACT_DELETED);
				hContactAddedEvent = CreateHookableEvent(ME_DB_CONTACT_ADDED);
				hSettingChangeEvent = CreateHookableEvent(ME_DB_CONTACT_SETTINGCHANGED);
				hEventMarkedRead = CreateHookableEvent(ME_DB_EVENT_MARKED_READ);

				hEventAddedEvent = CreateHookableEvent(ME_DB_EVENT_ADDED);
				hEventDeletedEvent = CreateHookableEvent(ME_DB_EVENT_DELETED);
				hEventFilterAddedEvent = CreateHookableEvent(ME_DB_EVENT_FILTER_ADD);
			}
		}

		FillContacts();
	}

	return ERROR_SUCCESS;
}
Ejemplo n.º 18
0
    Status fetch (void const* key, NodeObject::Ptr* pObject)
    {
        pObject->reset ();

        Status status (ok);

        MDB_txn* txn = nullptr;

        int error = 0;

        error = mdb_txn_begin (m_env, NULL, MDB_RDONLY, &txn);

        if (error == 0)
        {
            MDB_val dbkey;
            MDB_val data;

            dbkey.mv_size = m_keyBytes;
            dbkey.mv_data = mdb_cast (key);

            error = mdb_get (txn, m_dbi, &dbkey, &data);

            if (error == 0)
            {
                DecodedBlob decoded (key, data.mv_data, data.mv_size);

                if (decoded.wasOk ())
                {
                    *pObject = decoded.createObject ();
                }
                else
                {
                    status = dataCorrupt;
                }
            }
            else if (error == MDB_NOTFOUND)
            {
                status = notFound;
            }
            else
            {
                status = unknown;

                WriteLog (lsWARNING, NodeObject) << "MDB txn failed, code=" << error;
            }

            mdb_txn_abort (txn);
        }
        else
        {
            status = unknown;

            WriteLog (lsWARNING, NodeObject) << "MDB txn failed, code=" << error;
        }

        return status;
    }
Ejemplo n.º 19
0
/*
 * Class:     jmdb_DatabaseWrapper
 * Method:    get
 * Signature: (JI[BII[BII)I
 */
JNIEXPORT jint JNICALL Java_jmdb_DatabaseWrapper_get(JNIEnv *vm, jclass clazz,
		jlong txnL, jint dbi, jbyteArray keyA, jint kofs, jint klen,
		jbyteArray valueA, jint vofs, jint vlen) {
	MDB_txn *txnC = (MDB_txn*) txnL;
	enum {
		NONE, OOM, MDB, IOOB
	} result = NONE;
	jint ret;
	char lenHolder[64];
	MDB_val key, value;

	jbyte *keyC = (*vm)->GetPrimitiveArrayCritical(vm, keyA, NULL);
	jbyte *valueC = (*vm)->GetPrimitiveArrayCritical(vm, valueA, NULL);
	if (keyC == NULL || valueC == NULL) {
		result = OOM;
		ret = -1;
	} else {
		key.mv_size = klen;
		key.mv_data = keyC + kofs;
		ret = mdb_get(txnC, (MDB_dbi) dbi, &key, &value);
		if (ret == MDB_NOTFOUND) {
			ret = -1;
		} else if (ret) {
			result = MDB;
		} else if ((jlong) value.mv_size > vlen) {
			sprintf(lenHolder, "V%d/%d", (int ) value.mv_size, vlen);
			result = IOOB;
		} else if ((jlong) key.mv_size > klen) {
			sprintf(lenHolder, "K%d/%d", (int ) key.mv_size, klen);
			result = IOOB;
		} else {
			memcpy(valueC + vofs, value.mv_data, value.mv_size);
			ret = value.mv_size;
		}
	}
	(*vm)->ReleasePrimitiveArrayCritical(vm, valueA, valueC, 0);
	(*vm)->ReleasePrimitiveArrayCritical(vm, keyA, keyC, JNI_ABORT);

	switch (result) {
	case NONE:
		return ret;
	case OOM:
		throwNew(vm, "java/lang/OutOfMemoryError", "");
		return -1;
	case MDB:
		throwDatabaseException(vm, ret);
		return -1;
	case IOOB:
		throwNew(vm, "java/lang/IndexOutOfBoundsException", lenHolder);
		return -1;
	default:
		throwNew(vm, "java/lang/RuntimeException", "Flow control error in jni");
		return -1;
	}
}
Ejemplo n.º 20
0
static ngx_int_t
ngx_http_tcache_mdb_get(ngx_http_tcache_t *cache, ngx_http_tcache_ctx_t *ctx,
    ngx_flag_t lookup)
{
    int                     expire;
    ngx_buf_t              *buf;
    ngx_int_t               rc;
    ngx_mdb_t              *mdb;
    data_entry_t            key, value;

    key.data = (char *) ctx->key;
    key.size = NGX_HTTP_CACHE_KEY_LEN;

    mdb = cache->mdb;

    if (lookup) {
        rc = mdb_lookup(mdb->db, mdb->area, &key);
        if (rc == true) {
            return NGX_OK;
        } else {
            return NGX_DECLINED;
        }
    }

    rc = mdb_get(mdb->db, mdb->area, &key, &value, NULL, &expire);
    if (rc != 0) {
        return NGX_DECLINED;
    }

    rc = NGX_OK;

    if (value.size == 0) {
        return rc;
    }

    ctx->cache_length = value.size;

    buf = ngx_create_temp_buf(ctx->pool, value.size);
    if (buf == NULL) {
        rc = NGX_ERROR;
        goto end;
    }

    buf->last = buf->end = ngx_copy(buf->pos, value.data, value.size);

    ctx->cache_content = buf;
    ctx->payload = buf->pos;

end:

    free(value.data);

    return rc;
}
Ejemplo n.º 21
0
accurate_payload *B_ACCURATE_LMDB::lookup_payload(JCR *jcr, char *fname)
{
   int result;
   int lstat_length;
   MDB_val key, data;
   accurate_payload *payload = NULL;

   key.mv_data = fname;
   key.mv_size = strlen(fname) + 1;

   result = mdb_get(m_db_ro_txn, m_db_dbi, &key, &data);
   switch (result) {
   case 0:
      /*
       * Success.
       *
       * We need to make a private copy of the LDMB data as we are not
       * allowed to change its content and we need to update the lstat
       * and chksum pointer to point to the actual lstat and chksum that
       * is stored behind the accurate_payload structure in the LMDB.
       */
      m_pay_load = check_pool_memory_size(m_pay_load, data.mv_size);

      payload = (accurate_payload *)m_pay_load;
      memcpy(payload, data.mv_data, data.mv_size);
      payload->lstat = (char *)payload + sizeof(accurate_payload);
      lstat_length = strlen(payload->lstat);
      payload->chksum = (char *)payload->lstat + lstat_length + 1;

      /*
       * We keep the transaction as short a possible so after a lookup
       * and copying the actual data out we reset the read transaction
       * and do a renew of the read transaction for a new run.
       */
      mdb_txn_reset(m_db_ro_txn);
      result = mdb_txn_renew(m_db_ro_txn);
      if (result != 0) {
         Jmsg1(jcr, M_FATAL, 0, _("Unable to renew read transaction: %s\n"), mdb_strerror(result));
         return NULL;
      }
      break;
   case MDB_NOTFOUND:
      /*
       * Failed to find the given key.
       */
      break;
   default:
      break;
   }

   return payload;
}
Ejemplo n.º 22
0
static int fetch(struct dbengine *db, const char *key, size_t keylen,
                 const char **data, size_t *datalen, struct txn **tidptr)
{
    MDB_val mkey, mval;
    struct txn *tid;
    int r, r2 = 0, mr;

    PDEBUG("cyrusdb_lmdb(%s)[fetch] tidptr=%p *tidptr=%p key='%.*s'",
            db->fname, tidptr, tidptr ? *tidptr : NULL, (int) keylen, key);
    assert(db && key);

    mkey.mv_data = (void*) key;
    mkey.mv_size = keylen;

    /* Open or reuse transaction */
    r = getorset_txn(db, tidptr, &tid, !tidptr /*readonly*/);
    if (r) goto fail;

    mr = mdb_get(tid->mtxn, tid->dbi, &mkey, &mval);
    if (mr == MDB_NOTFOUND) {
        /* That's not an error */
        r = CYRUSDB_NOTFOUND;
        if (datalen) *datalen = 0;
        if (data) *data = NULL;
    } else if (mr) {
        /* That's an error */
        syslog(LOG_ERR, "cryusdb_lmdb(%s): %s", db->fname, mdb_strerror(mr));
        r = CYRUSDB_INTERNAL;
        goto fail;
    } else if (data && datalen) {
        /* Cache the fetched data from LMDB memory in own buffer */
        r = bufferval(db, mval, data, datalen);
        if (r) goto fail;
    }

    /* Commit or export the transaction */
    if (!tidptr) {
        r2 = commit_txn(db, tid);
        if (r2) goto fail;
    } else {
        *tidptr = tid;
        r2 = CYRUSDB_OK;
    }

    return r ? r : r2;

fail:
    if (tid && (!tidptr || !*tidptr)) abort_txn(db, tid);
    return r ? r : r2;
}
Ejemplo n.º 23
0
	int LMDBEngine::Get(const Slice& key, std::string* value, bool fill_cache)
	{
		MDB_val k, v;
		k.mv_data = const_cast<char*>(key.data());
		k.mv_size = key.size();
		int rc;
		BatchHolder& holder = m_batch_local.GetValue();
		if (!holder.EmptyRef())
		{
			rc = mdb_get(holder.txn, m_dbi, &k, &v);
		}
		else
		{
			MDB_txn *txn = NULL;
			mdb_txn_begin(m_env, NULL, 0, &txn);
			rc = mdb_get(txn, m_dbi, &k, &v);
			mdb_txn_commit(txn);
		}
		if (0 == rc && NULL != value && NULL != v.mv_data)
		{
			value->assign((const char*) v.mv_data, v.mv_size);
		}
		return rc;
	}
Ejemplo n.º 24
0
bool user_has_login(mdb_conn *conn, char *uid, char *skey)
{
	if (!conn || !uid || !skey) return false;

	char *s;
	
	mdb_exec(conn, NULL, "SELECT skey from account WHERE userid=$1;", "s", uid);

	if (mdb_get(conn, "s", &s) == MDB_ERR_NONE) {
		if (!strcmp(s, skey))
			return true;
	}
	
	return false;
}
Ejemplo n.º 25
0
// To get the current max ENTRYID
DWORD
VmDirMDBMaxEntryId(
    PVDIR_BACKEND_CTX   pBECtx,
    ENTRYID*            pEId)
{
    DWORD           dwError = 0;
    PVDIR_DB_TXN    pTxn = NULL;
    MDB_val         key = {0};
    MDB_val         value  = {0};
    unsigned char   EIDBytes[sizeof( ENTRYID )] = {0};

    assert(pBECtx && pEId);

    dwError = mdb_txn_begin( gVdirMdbGlobals.mdbEnv, NULL, MDB_RDONLY, &pTxn );
    BAIL_ON_VMDIR_ERROR(dwError);

    key.mv_data = &EIDBytes[0];
    MDBEntryIdToDBT(BE_MDB_ENTRYID_SEQ_KEY, &key);

    dwError =  mdb_get(pTxn, gVdirMdbGlobals.mdbSeqDBi, &key, &value);
    BAIL_ON_VMDIR_ERROR(dwError);

    dwError = mdb_txn_commit(pTxn);
    pTxn = NULL;
    BAIL_ON_VMDIR_ERROR(dwError);

    assert(value.mv_size == sizeof(ENTRYID));
    *pEId = *((ENTRYID*)value.mv_data);

cleanup:

    return dwError;

error:

    if (pTxn)
    {
        mdb_txn_abort(pTxn);
    }

    VMDIR_LOG_ERROR( VMDIR_LOG_MASK_ALL,
            "VmDirMDBMaxEntryId: failed with error (%d),(%s)",
             dwError, mdb_strerror(dwError) );

    dwError = MDBToBackendError(dwError, 0, ERROR_BACKEND_ERROR, pBECtx, "MaxEntryId");

    goto cleanup;
}
Ejemplo n.º 26
0
// Return a value from database.
void database_get(MDB_env *db, MDB_val *key, MDB_val *value) {
	MDB_dbi dbi;
	MDB_txn *txn;

	// transaction init
	mdb_txn_begin(db, NULL, MDB_RDONLY, &txn);
	// open database in read-write mode
	mdb_dbi_open(txn, NULL, 0, &dbi);
	// get data
	if (mdb_get(txn, dbi, key, value))
		bzero(value, sizeof(*value));
	// end of transaction
	mdb_txn_abort(txn);
	// close database
	mdb_dbi_close(db, dbi);
}
Ejemplo n.º 27
0
/*
bool Context::Write(size_t ksz, void* key,
		    size_t dsz, void* data){
  Error(0);
  if (envHandle==nullptr){
    return false;
  }
  else{
    MDB_txn *txn;
    int txnret = mdb_txn_begin(envHandle,nullptr,0,&txn);
    if (txnret != 0) {
      Error(txnret);
      return false;
    }
    else{
      MDB_dbi dbi;
      int dbiret = mdb_dbi_open(txn,"Entity",MDB_CREATE,&dbi);
      if (dbiret != 0){
        Error(dbiret);
        mdb_txn_abort(txn);
        return false;
      }
      else{
        MDB_val kkey { ksz, key };
        MDB_val ddata { dsz, data};
        putReturn = mdb_put(txn,dbi,&kkey,&ddata,0);
        if (putReturn !=0){
          Error(putReturn);
          mdb_txn_abort(txn);
          return false;
        }
        else{
          int commit = mdb_txn_commit(txn);
          if (commit!=0){
            Error(commit);
            return false;
          }
          else return true;
        }
      }
    }
  }
}
*/
bool Context::GetCopy(size_t ksz, void* key,
		   void** data){
  Error(0);
  if (envHandle==nullptr){
    return false;
  }
  else{
    MDB_txn *txn;
    int txnret = mdb_txn_begin(envHandle,nullptr,0,&txn);
    if (txnret != 0){
      Error(txnret);
      return false;
    }
    else{
      MDB_dbi dbi;
      int dbiret = mdb_dbi_open(txn,"Entity",0,&dbi);
      if (dbiret !=0){
        Error(dbiret);
        mdb_txn_abort(txn);
        return false;
      }
      else{
        MDB_val kkey { ksz, key };
        MDB_val ddata;
        int get = mdb_get(txn,dbi,&kkey,&ddata);
        if (get!=0){
          Error(get);
          mdb_txn_abort(txn);
          return false;
        }
        else {
          *data = new char[ddata.mv_size];
          memcpy(*data, (void*)ddata.mv_data, (ddata.mv_size)*sizeof(char));
          int commit = mdb_txn_commit(txn);
          if (commit!=0){
            Error(commit);
            delete (char*)(*data);
            return false;
          }
          else return true;
        }
      }
    }
  }
}
Ejemplo n.º 28
0
uint64_t counter_get(counter_t *lc, const char *key) {
    MDB_dbi dbi;
    MDB_val mkey, data;
    MDB_txn *txn;
    mdb_txn_begin(lc->env, NULL, 0, &txn);
    mdb_dbi_open(txn, NULL, 0, &dbi);

    mkey.mv_size = strlen(key) * sizeof(char);
    mkey.mv_data = (void *)key;

    // First we get our data from the db
    uint64_t stored_counter = 0;
    if(mdb_get(txn, dbi, &mkey, &data) == MDB_SUCCESS) {
        stored_counter = *(uint64_t *)data.mv_data;
    }
    mdb_dbi_close(lc->env, dbi);
    return stored_counter;
}
Ejemplo n.º 29
0
Archivo: main.c Proyecto: ifzz/ticketd
/** Check if the ticket has already been issued
 * @return 0 if not unique; otherwise 1 */
static int __check_if_ticket_exists(const unsigned int ticket)
{
    MDB_txn *txn;

    int e = mdb_txn_begin(sv->db_env, NULL, MDB_RDONLY, &txn);
    if (0 != e)
        mdb_fatal(e);

    MDB_val k = { .mv_size = sizeof(ticket), .mv_data = (void*)&ticket };
    MDB_val v;

    e = mdb_get(txn, sv->tickets, &k, &v);
    switch (e)
    {
    case 0:
        break;
    case MDB_NOTFOUND:
        e = mdb_txn_commit(txn);
        if (0 != e)
            mdb_fatal(e);
        return 0;
    default:
        mdb_fatal(e);
    }

    e = mdb_txn_commit(txn);
    if (0 != e)
        mdb_fatal(e);

    return 1;
}

static unsigned int __generate_ticket()
{
    unsigned int ticket;

    do
    {
        // TODO need better random number generator
        ticket = rand();
    }
    while (__check_if_ticket_exists(ticket));
    return ticket;
}
Ejemplo n.º 30
0
CAMLprim value caml_mdb_get(value txn,value dbi,value key){
  CAMLparam3(txn,dbi,key);
  CAMLlocal1(mldata);
  MDB_val key_,data_;
  key_.mv_data=String_val(key);
  key_.mv_size=caml_string_length(key);
  int ret;
  if((ret=mdb_get(  (MDB_txn*)txn,  (MDB_dbi) Int_val(dbi),  &key_,  &data_  ))){
    if(ret==MDB_NOTFOUND) {
      static value *exn=NULL;
      if(exn==NULL) exn=caml_named_value("lmdb_not_found");
      caml_raise_constant(*exn);
    } else
      caml_failwith("error in mdb_get");
  }
  mldata=caml_alloc_string(data_.mv_size);
  memcpy(String_val(mldata),data_.mv_data,data_.mv_size);
  CAMLreturn(mldata);
}