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; }
/* * 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; }
/* * 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; }