コード例 #1
0
ファイル: ht.c プロジェクト: mnunberg/php-ext-couchbase
PHP_COUCHBASE_LOCAL
void pcbc_ht_storeb(zval *assoc, const char *key, int nkey, zend_bool value)
{
	pcbc_ht_key hk;
	pcbc_ht_key_create(key, nkey, &hk);
	pcbc_ht_hkstoreb(assoc, &hk, value);
	pcbc_ht_key_cleanup(&hk);
}
コード例 #2
0
ファイル: observe.c プロジェクト: gigablah/php-ext-couchbase
/**
 * Populate the snapshot results from the observe operations
 * @param res the couchbase object
 * @param ocoll the observe collection
 * @param abools an array (or single) boolean
 * @param adetails an array of details to be indexed by key
 * @param multi boolean param - this determines whether abools is a scalar or
 *  an array
 */
static void oks_populate_results(php_couchbase_res *res,
								 struct observe_collection *ocoll,
								 zval *abools,
								 zval *adetails,
								 int multi)
{
	int ii;

	if (multi && IS_ARRAY != Z_TYPE_P(abools)) {
		array_init(abools);
	}

	for (ii = 0; ii < ocoll->nks; ii++) {
		/* get the key */
		pcbc_ht_key reski;
		zval *tmpary;

		struct observe_keystate *oks = ocoll->ks + ii;

		pcbc_ht_key_create(
			oks->ocmd.v.v0.key,
			oks->ocmd.v.v0.nkey,
			&reski);

		if (multi) {
			pcbc_ht_hkstoreb(abools,
							 &reski, oks_get_boolval(oks));

		} else {

			if (oks_get_boolval(oks)) {
				ZVAL_TRUE(abools);

			} else {
				ZVAL_FALSE(abools);
			}
		}

		if (adetails != NULL) {
			ALLOC_INIT_ZVAL(tmpary);
			array_init(tmpary);
			oks_to_zvarray(oks, tmpary);
			pcbc_ht_hkstorez(adetails, &reski, tmpary);
		}

		pcbc_ht_key_cleanup(&reski);
	}
}
コード例 #3
0
ファイル: observe.c プロジェクト: gigablah/php-ext-couchbase
PHP_COUCHBASE_LOCAL
void php_couchbase_observe_impl(INTERNAL_FUNCTION_PARAMETERS,
								int multi, int oo, int poll)
{

	zval *adurability = NULL,
		  *adetails = NULL; /* zval passed by ref, will be stuffed with details if given */

	php_couchbase_res *couchbase_res;
	struct observe_collection ocoll = { 0 };
	struct observe_expectation expect = { 0 };
	struct observe_pollprefs pollprefs;
	int argflags = oo ? PHP_COUCHBASE_ARG_F_OO : PHP_COUCHBASE_ARG_F_FUNCTIONAL;

	/* param handling, return value setup */
	if (multi) {
		zval *akey_to_cas;
		if (poll) {
			PHP_COUCHBASE_GET_PARAMS(couchbase_res, argflags, "aa",
									 &akey_to_cas, &adurability);
		} else {
			PHP_COUCHBASE_GET_PARAMS(couchbase_res, argflags,
									 "a|z", &akey_to_cas, &adetails);
		}

		array_init(return_value);

		if (poll) {
			if (-1 == oks_extract_durability(couchbase_res,
											 &expect, &pollprefs, adurability)) {
				RETURN_FALSE;
			}
		}

		if (-1 == oks_build_context(couchbase_res,
									&ocoll, &expect, akey_to_cas, 1)) {
			RETURN_FALSE;
		}

	} else { /* single */

		char *key = NULL;
		long nkey = 0;
		zval *cas;
		zval *akc_dummy = NULL;

		pcbc_ht_key dummy_hk;
		lcb_cas_t tmpcas = 0;
		ZVAL_FALSE(return_value);

		if (poll) {
			PHP_COUCHBASE_GET_PARAMS(couchbase_res, argflags,
									 "sza", &key, &nkey, &cas, &adurability);
		} else {
			PHP_COUCHBASE_GET_PARAMS(couchbase_res, argflags,
									 "sz|z", &key, &nkey, &cas, &adetails);
		}

		if (adetails && IS_ARRAY != Z_TYPE_P(adetails)) {
			array_init(adetails);
		}

		if (key == NULL || nkey == 0) {
			/* empty key */
			RETURN_FALSE;
		}

		make_prefixed_hk(couchbase_res, key, nkey, &dummy_hk);
		tmpcas = cas_from_zval(cas);

		if (tmpcas == -1) {
			pcbc_ht_key_cleanup(&dummy_hk);
			RETURN_FALSE;
		}

		ALLOC_INIT_ZVAL(akc_dummy);
		array_init(akc_dummy);

		if (tmpcas) {
			pcbc_ht_hkstores(akc_dummy, &dummy_hk,
							 Z_STRVAL_P(cas), Z_STRLEN_P(cas));
		} else {
			pcbc_ht_hkstoreb(akc_dummy, &dummy_hk, 0);
		}

		/* Weird block right here to sanely free the structures allocated */
		{
			int have_failure = 0;
			do {

				if (poll) {
					if (-1 == oks_extract_durability(couchbase_res,
													 &expect,
													 &pollprefs,
													 adurability)) {
						have_failure = 1;
						break;
					}
				}

				if (-1 == oks_build_context(
							couchbase_res, &ocoll, &expect, akc_dummy, 0)) {

					have_failure = 1;
					break;
				}
			} while (0);

			/** >> CLEANUP HERE */
			zval_ptr_dtor(&akc_dummy);
			pcbc_ht_key_cleanup(&dummy_hk);

			if (have_failure) {
				RETURN_FALSE;
			}
		}
	}

	if (adetails && Z_TYPE_P(adetails) != IS_ARRAY) {
		array_init(adetails);
	}

	if (poll) {
		observe_poll(couchbase_res, &ocoll, &pollprefs);

	} else {
		observe_iterate(couchbase_res, &ocoll);
	}

	oks_populate_results(couchbase_res,
						 &ocoll, return_value, adetails, multi);

	oks_cleanup_context(&ocoll);
}