void MobileRecordStore::_initDataSizeIfNeeded_inlock(OperationContext* opCtx) const { if (_isDataSizeInitialized) { return; } MobileSession* session = MobileRecoveryUnit::get(opCtx)->getSession(opCtx); SqliteStatement dataSizeStmt( *session, "SELECT IFNULL(SUM(LENGTH(data)), 0) FROM \"", _ident, "\";"); dataSizeStmt.step(SQLITE_ROW); int64_t dataSize = dataSizeStmt.getColInt(0); _dataSize = dataSize; _isDataSizeInitialized = true; }
void MobileRecordStore::deleteRecord(OperationContext* opCtx, const RecordId& recId) { MobileSession* session = MobileRecoveryUnit::get(opCtx)->getSession(opCtx, false); SqliteStatement dataSizeStmt( *session, "SELECT IFNULL(LENGTH(data), 0) FROM \"", _ident, "\" WHERE rec_id = ?;"); dataSizeStmt.bindInt(0, recId.repr()); dataSizeStmt.step(SQLITE_ROW); int64_t dataSizeBefore = dataSizeStmt.getColInt(0); _changeNumRecs(opCtx, -1); _changeDataSize(opCtx, -dataSizeBefore); SqliteStatement deleteStmt(*session, "DELETE FROM \"", _ident, "\" WHERE rec_id = ?;"); deleteStmt.bindInt(0, recId.repr()); deleteStmt.step(SQLITE_DONE); }
/** * Note: this counts the total number of bytes in the key and value columns, not the actual number * of bytes on disk used by this ident. */ int64_t MobileKVEngine::getIdentSize(OperationContext* opCtx, StringData ident) { MobileSession* session = MobileRecoveryUnit::get(opCtx)->getSession(opCtx); // Get key-value column names. std::string colNameQuery = "PRAGMA table_info(\"" + ident + "\")"; SqliteStatement colNameStmt(*session, colNameQuery); colNameStmt.step(SQLITE_ROW); std::string keyColName(static_cast<const char*>(colNameStmt.getColText(1))); colNameStmt.step(SQLITE_ROW); std::string valueColName(static_cast<const char*>(colNameStmt.getColText(1))); colNameStmt.step(SQLITE_DONE); // Get total data size of key-value columns. str::stream dataSizeQuery; dataSizeQuery << "SELECT IFNULL(SUM(LENGTH(" << keyColName << ")), 0) + " << "IFNULL(SUM(LENGTH(" << valueColName << ")), 0) FROM \"" << ident + "\";"; SqliteStatement dataSizeStmt(*session, dataSizeQuery); dataSizeStmt.step(SQLITE_ROW); return dataSizeStmt.getColInt(0); }
Status MobileRecordStore::updateRecord(OperationContext* opCtx, const RecordId& recId, const char* data, int len) { MobileSession* session = MobileRecoveryUnit::get(opCtx)->getSession(opCtx, false); SqliteStatement dataSizeStmt( *session, "SELECT IFNULL(LENGTH(data), 0) FROM \"", _ident, "\" WHERE rec_id = ?;"); dataSizeStmt.bindInt(0, recId.repr()); dataSizeStmt.step(SQLITE_ROW); int64_t dataSizeBefore = dataSizeStmt.getColInt(0); _changeDataSize(opCtx, -dataSizeBefore + len); SqliteStatement updateStmt( *session, "UPDATE \"", _ident, "\" SET data = ? ", "WHERE rec_id = ?;"); updateStmt.bindBlob(0, data, len); updateStmt.bindInt(1, recId.repr()); updateStmt.step(SQLITE_DONE); return Status::OK(); }