示例#1
0
void cdb_begin_transaction(void)
{

	bailIfCursor(TSD->cursors, "can't begin transaction during r/o cursor");

	if (TSD->tid != NULL) {
		syslog(LOG_EMERG, "cdb_begin_transaction: ERROR: nested transaction\n");
		cdb_abort();
	}

	txbegin(&TSD->tid);
}
unsigned short int SHT15::txreset (unsigned short int mode) {
	unsigned short int i;
	
	digitalWrite (SHT15_CLK, LOW);
	pinMode (SHT15_DAT, OUTPUT);
	digitalWrite (SHT15_DAT, HIGH);
	
	for (i = 0; i < 9; i++) {
		digitalWrite (SHT15_CLK, HIGH);
		delayMicroseconds (3);
		digitalWrite (SHT15_CLK, LOW);
		delayMicroseconds (3);
		}
		
	txbegin ();
	if (mode) return txdata (0x1e);
	return 0;
	}
示例#3
0
/*
 * Delete a piece of data.  Returns 0 if the operation was successful.
 */
int cdb_delete(int cdb, void *key, int keylen)
{

	DBT dkey;
	DB_TXN *tid;
	int ret;

	memset(&dkey, 0, sizeof dkey);
	dkey.size = keylen;
	dkey.data = key;

	if (TSD->tid != NULL) {
		ret = dbp[cdb]->del(dbp[cdb], TSD->tid, &dkey, 0);
		if (ret) {
			syslog(LOG_EMERG, "cdb_delete(%d): %s\n", cdb, db_strerror(ret));
			if (ret != DB_NOTFOUND) {
				cdb_abort();
			}
		}
	} else {
		bailIfCursor(TSD->cursors, "attempt to delete during r/o cursor");

	      retry:
		txbegin(&tid);

		if ((ret = dbp[cdb]->del(dbp[cdb], tid, &dkey, 0))
		    && ret != DB_NOTFOUND) {
			if (ret == DB_LOCK_DEADLOCK) {
				txabort(tid);
				goto retry;
			} else {
				syslog(LOG_EMERG, "cdb_delete(%d): %s\n",
					cdb, db_strerror(ret));
				cdb_abort();
			}
		} else {
			txcommit(tid);
		}
	}
	return ret;
}
// mode: 0 = temperature; 1 = humidity
unsigned short int SHT15::getraw (unsigned short int * p, unsigned short int mode) {
		unsigned short int i = 0;
		txbegin ();
		* p = 0;
		mode = mode ? 0x05 : 0x03;
		if (txdata(mode)) return 1;	// write error
		
		while (i < 240) {
			delay (3);
			if (digitalRead (SHT15_DAT) == 0) {
				i = 0;
				break;
				}
			}
			i++;
			
		if (i) return 3; // timeout
		i = rxdata (1);
		*p = (i << 8) | rxdata (0);
		return 0;
		}
示例#5
0
/*
 * Store a piece of data.  Returns 0 if the operation was successful.  If a
 * key already exists it should be overwritten.
 */
int cdb_store(int cdb, const void *ckey, int ckeylen, void *cdata, int cdatalen)
{

	DBT dkey, ddata;
	DB_TXN *tid;
	int ret = 0;

	struct CtdlCompressHeader zheader;
	char *compressed_data = NULL;
	int compressing = 0;
	size_t buffer_len = 0;
	uLongf destLen = 0;

	memset(&dkey, 0, sizeof(DBT));
	memset(&ddata, 0, sizeof(DBT));
	dkey.size = ckeylen;
	/* no, we don't care for this error. */
	dkey.data = ckey;

	ddata.size = cdatalen;
	ddata.data = cdata;

	/* Only compress Visit records.  Everything else is uncompressed. */
	if (cdb == CDB_VISIT) {
		compressing = 1;
		zheader.magic = COMPRESS_MAGIC;
		zheader.uncompressed_len = cdatalen;
		buffer_len = ((cdatalen * 101) / 100) + 100
		    + sizeof(struct CtdlCompressHeader);
		destLen = (uLongf) buffer_len;
		compressed_data = malloc(buffer_len);
		if (compress2((Bytef *) (compressed_data + sizeof(struct CtdlCompressHeader)),
			&destLen, (Bytef *) cdata, (uLongf) cdatalen, 1) != Z_OK)
		{
			syslog(LOG_EMERG, "compress2() error\n");
			cdb_abort();
		}
		zheader.compressed_len = (size_t) destLen;
		memcpy(compressed_data, &zheader, sizeof(struct CtdlCompressHeader));
		ddata.size = (size_t) (sizeof(struct CtdlCompressHeader) + zheader.compressed_len);
		ddata.data = compressed_data;
	}

	if (TSD->tid != NULL) {
		ret = dbp[cdb]->put(dbp[cdb],	/* db */
				    TSD->tid,	/* transaction ID */
				    &dkey,	/* key */
				    &ddata,	/* data */
				    0);	/* flags */
		if (ret) {
			syslog(LOG_EMERG, "cdb_store(%d): %s", cdb, db_strerror(ret));
			cdb_abort();
		}
		if (compressing)
			free(compressed_data);
		return ret;

	} else {
		bailIfCursor(TSD->cursors, "attempt to write during r/o cursor");

	      retry:
		txbegin(&tid);

		if ((ret = dbp[cdb]->put(dbp[cdb],	/* db */
					 tid,	/* transaction ID */
					 &dkey,	/* key */
					 &ddata,	/* data */
					 0))) {	/* flags */
			if (ret == DB_LOCK_DEADLOCK) {
				txabort(tid);
				goto retry;
			} else {
				syslog(LOG_EMERG, "cdb_store(%d): %s", cdb, db_strerror(ret));
				cdb_abort();
			}
		} else {
			txcommit(tid);
			if (compressing) {
				free(compressed_data);
			}
			return ret;
		}
	}
	return ret;
}