Release Notes
3.1.1 — July 2023
Version 3.1.1 for Java delivers the following features and enhancements:
For an overview of the latest features offered in Couchbase Lite 3.1, see New in 3.1 |
3.1.0 — March 2023
Version 3.1.0 for Java delivers the following features and enhancements:
Scopes and Collections
Couchbase Mobile’s cloud-to-edge support for scopes and collections allows application developers to organize and logically isolate data.
Independent lifecycle management and fine-grained security control simplifies the deployment of multi-tenant and high-application density cloud-to-edge applications at scale.
Scopes and Collections are a first class concept, synced between Couchbase Lite and Sync Gateway, between Sync Gateways (Inter Sync Gateway Replication), between Couchbase Lite peers, as well as available offline-first on Couchbase Lite devices.
Enhancements
-
CBL-4131 - SQL : Enhance COLLATE syntax to support locales for UNICODE Collator++
-
CBL-4098 - Provide option to Save Cookie with Domain being a parent domain of the request
-
CBL-3916 - Report invalid / unknown network interface using kC4NetErrUnknownInterface
-
CBL-3651 - Only send port in HTTP Host header if non-standard
-
CBL-3135 - Correct/document DB operations allowed in a batch transaction
-
CBL-3093 - Add DB closed recommendation to docs for Database.close
-
CBL-3085 - Make SSLException a recoverable error in AbstractCBLWebSocket: 3.1
-
CBL-2974 - Implement enhanced pinned server certificate feature
-
CBL-2623 - Make debug and verbose logs conditional on debugging flag
Issues and Resolutions
-
CBL-3807 — Server Certificate can disappear during authentication
-
CBL-4293 - ReplicatorConfiguration.setAuthenticator should allow a null argument
-
CBL-4219 - URLEndpointListener.getURLs returns an empty list on Android v>=11
-
CBL-3952 - MessageEndpointListener's C4Socket is getting GC'd prematurely
-
CBL-3921 - Error when sending _bulk_docs request with large number of docs
-
CBL-3872 - MaxAttempt when set NSUIntegerMax, converts to Zero
-
CBL-3866 - Fix WebSocket error 1006, "connection closed abnormally" crash
-
CBL-3824 - Re-opening a database with an Index causes failure
-
CBL-3808 - Server Certificate can disappear during authentication
-
CBL-3682 - LiteCore fails, apparently attempting to destruct a db while in a transaction
-
CBL-3626 - setDocumentExpiration hangs inside a batch transaction
-
CBL-3574 - Set expiration on deleted doc doesn't throw exception
-
CBL-3526 - Continuous Pull Replicator went to stopped instead of idle
-
CBL-3384 - Worker::childChangedStatus may lose child after enqueued
-
CBL-3257 - c4db_scopeNames doesn't return the name of the default scope if it is empty.
-
CBL-3193 - Native crash freeing a C4DocumentObserver (c4docobs_free)
-
CBL-3075 - Database could be corrupted after being copied in linux platform
-
CBL-3046 - Connection Timeout is set to 15000000 Milliseconds on Non Windows Platforms
-
CBL-3013 - Continuous replicator does not push docs which are being observed
-
CBL-3010 - LiteCore delivers unrecoverable error in BUSY state
-
CBL-2994 - c4DbChanges in AbstractDatabase.postDatabaseChanged may contain nulls
-
CBL-2948 - revpos is missing in the changed attachment body when using delta sync (Port)
-
CBL-2922 - Message Socket does not correctly handle recoverable errors
-
CBL-2867 - Cannot update the same field again after reopening the database (Port Fix)
-
CBL-2779 - N1QL : Meta().<property> column name returned as $<num>
-
CBL-2736 - Incorrect key for SQL Query: "SELECT * FROM _default"++
-
CBL-2734 - Database GetDocumentExpiration returns null instead of expected date
-
CBL-2721 - Database is closed while replicator change listener is still executing
-
CBL-2694 - CBL sending rev list with gaps, when sync'ing more than 20 revs
-
CBL-2693 - LiveQuerier could be leaked as liveQuerierStopped() delegate might not be called
-
CBL-2676 - 409 retry can result in invalid remote ancestor ID
-
CBL-2637 - Replication unable to continue after termination between rev and ack
-
CBL-2614 - Fix Memory leak when rapidly restarting replicator
-
CBL-2610 - Cleanup bundle folder when creating a database fails
-
CBL-2586 - LiveQuerier is running after having been stopped, causing a crash
-
CBL-2532 - Assertion failure when stopping replicator while replicator is connecting
-
CBL-2477 - Tear down DBAccess on stopped instead of on release
-
CBL-2460 - Different C4QueryObservers share the same C4QueryEnumerator
-
CBL-2459 - A second, new Query observer should be notified immediately.
-
CBL-2458 - Changing a Query's parameters should re-notify observers
-
CBL-2450 - Intermittent: `_keyStore` not true when calling litecore::KeyStore
-
CBL-2374 - Slowness from reindexing the database when opening database
Deprecations
-
CBL-4316 - Replicator's getPendingDocumentIds() and isDocumentPending(String id) are deprecated
-
CBL-4315 - ReplicatorConfiguration's filters and conflict resolver properties are deprecated
-
CBL-4314 - ReplicatorConfiguration APIs with Database object are deprecated
-
CBL-4313 - MessageEndpointListenerConfiguration APIs using Database object are deprecated
-
CBL-4312 - URLEndpointListenerConfiguration APIs using Database object are deprecated
-
CBL-4311 - QueryBuilder : isNullOrMissing() and notNullOrMissing() are deprecated
-
CBL-4309 - QueryBuilder : DataSource's database() is deprecated
-
CBL-4306 - DatabaseChange and DatabaseChangeListener are deprecated
-
CBL-4264 - Increased security: store BasicAuthenticator password as a char[] and zero before release
-
CBL-4262 - ReplicatorConfiguration.setPinnedServerCertificate should take a Certificate
-
CBL-1727 - Improved naming for AbstractReplicatorConfiguration.ReplicatorType
3.0.2 — August 2022
Version 3.0.2 of Couchbase Lite for Java delivers a number of fixes and enhancements.
Issues and Resolutions
Fixed Issues
-
CBL-3301 — FullTextIndex.setLanguage() should accept null parameter
-
CBL-3074 — Database could be corrupted after being copied in linux platform
-
CBL-3000 — c4DbChanges in AbstractDatabase.postDatabaseChanged may contain nulls
-
CBL-2998 — Replicator stopped with WebSocket 1008 / SocketTimeoutException when disable Wi-Fi
-
CBL-2996 — Several bad tests in ReplicatorLocal2LocalTest suite
-
CBL-2995 — Cookies set in Headers are replaced with Session Authenticator’s cookies
-
CBL-2884 — evpos is missing in the changed attachment body when using delta sync
3.0.0 — February 2022
- Quick Links
-
New Features | Enhancements | API Changes | Known Issues | Fixed Issues | Deprecated in this Release | Removed in this Release | Support Notices |
On upgrading from a 2.x release, all Couchbase Lite databases will be automatically re-indexed on initial database open. |
New Features
SQL++/N1QL Query Strings
Couchbase Lite’s SQL++ for Mobile query API vastly simplifies the integration of Couchbase Lite within hybrid/cross platform apps.
N1QL for Mobile is an implementation of the emerging SQL-for-JSON query language specification (SQL++). It provides native, hybrid and cross-platform mobile app developers with a consistent, convenient and flexible interface to query JSON documents within the embedded database using a SQL-based syntax. This means developers can reuse queries across platforms, reducing development, testing and maintenance costs.
Read More . . . SQL++ for Mobile
Enhancements
Auto-purge on Channel Access Revocation
An auto-purge feature is introduced for loss of access to channels and the documents in them. This is important for enforcement of data governance and data retention policies.
Channels are the fundamental mechanism for enforcement of access control using Sync Gateway. They guarantee that only users with access to a specific channel can access documents in that channel.
When a user loses access to a channel (and so to its documents) Couchbase Lite clients will auto purge all local documents on devices that belong to the revoked channel (during Pull or PushAndPull replication), unless the user has access to the document via some other channel.
Read More . . . Auto-purge on Channel Access Revocation
Document API Support for JSON Data
The Couchbase Lite API now offers out-of-the box support for document data in JSON format. This will make it easier for developers' applications to store, transform and manipulate JSON data in the database.
The API offers JSON support for Documents, MutableDocuments, Arrays, MutableArrays, Dictionaries, MutableDictionaries and Query Results.
Other Enhancements
-
CBL-2634 — Update support level and message note of Database’saveBlob() and getBlob() API
-
CBL-2481 — Change database.createQuery(String query) signature to throw CouchbaseLiteException
-
CBL-2383 — Increase kOtherDBCloseTimeoutSecs to allow enough time for all db open connections to be closed
-
CBL-2379 — Improve logging message when copying database using a wrong encryption key
-
CBL-2358 — Add function for creating FLMutableDict/Array from JSON
-
CBL-1941 — maxRetries should now count attempts instead of retries
-
CBL-1714 — Refactor POSIX error domain codes to be platform independent
-
CBL-1666 — Allow apps to trigger SQLite index optimization directly
-
CBL-1650 — CBL doesn’t purge channel removals when removal revision already exists in CBL
-
CBL-1232 — Support function to change the kC4ReplicatorOptionProgressLevel
-
CBL-911 — Couchbase Lite Java replication hangs when using DEBUG console + file logging on Windows
API Changes
This content introduces the changes made to the Couchbase Lite for Java API for release 3.1.1.
Removed
ResetCheckpoint
The method Replicator.resetCheckpoint() method has been removed.
Instead, use Replicator.resetCheckpoint(boolean reset).
replicator.resetCheckpoint()
replicator.start()
replicator.start(true)
Database.setLogLevel
The method Database.setLogLevel()
has been removed.
Instead:
-
Set the logging levels for loggers, individually
-
Set the domains to be logged by the console logger, explicitly.
Database.setLogLevel(LogDomain.ALL, LogLevel.VERBOSE)
Database.log.getConsole().setDomains(LogDomain.ALL_DOMAINS)
Database.log.getConsole().setLevel(LogLevel.VERBOSE)
Database.log.getFile().setDomains(LogLevel.DEBUG)
Database.compact
The Database.compact() method has been removed.
It is replaced by the new Database.performMaintenance(MaintenanceType) method, and the maintenance operations represented in the enum MaintenanceType
try testdb.compact()
testdb.performMaintenance(MaintenanceType.COMPACT)
Deprecated in the API
MATCH
The class, FullTextExpression
has been deprecated.
Use FullTextFunction instead.
FullTextExpression index = FullTextExpression.index("indexName")
Query q = QueryBuilder.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(index.match(queryString))
Query q = QueryBuilder.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(FullTextFunction.match("indexName", queryString))
isNullOrMissing/notNullOrMissing
The functions Expression.isNullOrMissing and Expression.notNullOrMissing have been deprecated.
Use isNotValued()
and-or isValued()
instead.
Query q =
QueryBuilder
.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(
Expression.property("missingProp").isNullOrMissing())
Query q =
QueryBuilder
.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(Expression.property("notMissingProp").notNullOrMissing())
Query q = QueryBuilder.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(Expression.property("missingProp").isNotValued())
Query q = QueryBuilder.select([SelectResult.expression(Meta.id)])
.from(DataSource.database(testdb))
.where(Expression.property("notMissingProp").isValued())
AbstractReplicatorConfiguration
The enum AbstractReplicatorConfiguration.ReplicatorType
and the methods
ReplicatorConfiguration.setReplicatorType
and
ReplicatorConfiguration.getReplicatorType
have all been deprecated.
Instead, use the methods ReplicatorConfiguration.setType
and ReplicatorConfiguration.getType
, and the top level enum ReplicatorType
.
ReplicatorConfiguration config =
new ReplicatorConfiguration().setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL);
ReplicatorConfiguration config =
new ReplicatorConfiguration().setType(ReplicatorType.PUSH_AND_PULL);
Moved in the API
The enum AbstractReplicator.ActivityLevel and the classes AbstractReplicator.Progress and AbstractReplicator.Status have all been moved to be top level definitions.
They are replaced by these definitions:
ListenerToken token =
replicator.addChangeListener(
testSerialExecutor,
change -> {
final AbstractReplicator.Status status = change.getStatus()
if (status.getActivityLevel() == AbstractReplicator.ActivityLevel.BUSY)
{ AbstractReplicator.Progress progress =
status.getProgress(); Logger.log("Progress: " + progress.completed + "/" progress.total);
}
});
ListenerToken token =
replicator.addChangeListener(
testSerialExecutor,
change -> {
final ReplicatorStatus status = change.getStatus()
if (status.getActivityLevel() == ReplicatorActivityLevel.BUSY)
{ ReplicatorProgress progress =
status.getProgress(); Logger.log("Progress: " + progress.completed + "/" progress.total);
}
});
Fixed Issues
-
CBL-2583 — Replication unable to continue after termination between rev and ack
-
CBL-2579 — 409 retry can result in invalid remote ancestor ID
-
CBL-2478 — Tear down DBAccess on stopped instead of on release
-
CBL-2436 — Lithium beta 2: Confirm LiteCore request for close, before connection is opened.
-
CBL-2304 — CBL core fleece exception: incompatible duplicate scope
-
CBL-1748 — X509TrustManager.checkServerTrusted with X509TrustManagerExtensions.checkServerTrusted
-
CBL-1722 — POSIX 32 (Broken Pipe) appears to crash application
-
CBL-1660 — Not all debug logging is compiled out of release builds
-
CBL-1438 — WSA codes not properly handled by bio_return_value
-
CBL-1225 — Testfest : unshare the docs does not replicate to CBL
-
CBL-862 — CBL 2.7 and later doesn’t catch Illegal top-level key like "_id"
-
CBL-708 — Conflicting revision bodies are not removed after resolution
-
CBL-462 — Continuous push attempts to replicate purged documents
-
CBL-220 — Windows cannot handle dates before 1970 with C API
Deprecated in this Release
Items (features and-or functionality) are marked as deprecated when a more current, and usually enhanced, alternative is available.
Whilst the deprecated item will remain usable, it is no longer supported, and will be removed in a future release — see also: Removed in this Release You should plan to move to an alternative, supported, solution as soon as practical.
-
CBL-1727 — Improved naming for AbstractReplicatorConfiguration.ReplicatorType
-
The [Database.compact()] method is deprecated (as of 2.8), instead use Database.performMaintenance().