use of org.eclipse.hono.service.base.jdbc.store.SQL in project hono by eclipse.
the class ClasspathSchemaCreator method runScript.
private Future<Void> runScript(final JdbcProperties jdbcProperties, final String script, final SpanContext ctx) {
final JDBCClient jdbcClient = JdbcProperties.dataSource(vertx, jdbcProperties);
final Promise<Void> clientCloseTracker = Promise.promise();
SQL.runTransactionally(jdbcClient, tracer, ctx, (connection, context) -> {
final var expanded = Statement.statement(script).expand();
log.debug("Creating database schema in [{}] with script: {}", jdbcProperties.getUrl(), expanded);
return expanded.query(jdbcClient).recover(SQL::translateException);
}).onComplete(ar -> jdbcClient.close(clientCloseTracker));
return clientCloseTracker.future();
}
use of org.eclipse.hono.service.base.jdbc.store.SQL in project hono by eclipse.
the class TableManagementStore method deleteDevice.
/**
* Delete a single device.
* <p>
* This will execute the {@code delete} or {@code deleteVersioned} SQL statement and provide
* the named parameters {@code tenant_id}, {@code device_id}, and {@code expected_version} (if set).
* It will return the plain update result of the operation.
*
* @param key The key of the device to delete.
* @param resourceVersion An optional resource version.
* @param spanContext The span to contribute to.
* @return A future, tracking the outcome of the operation.
*/
public Future<UpdateResult> deleteDevice(final DeviceKey key, final Optional<String> resourceVersion, final SpanContext spanContext) {
final Span span = TracingHelper.buildChildSpan(this.tracer, spanContext, "delete device", getClass().getSimpleName()).withTag(TracingHelper.TAG_TENANT_ID, key.getTenantId()).withTag(TracingHelper.TAG_DEVICE_ID, key.getDeviceId()).start();
resourceVersion.ifPresent(version -> span.setTag("version", version));
final Statement statement;
if (resourceVersion.isPresent()) {
statement = this.deleteVersionedStatement;
} else {
statement = this.deleteStatement;
}
final var expanded = statement.expand(map -> {
map.put("tenant_id", key.getTenantId());
map.put("device_id", key.getDeviceId());
resourceVersion.ifPresent(version -> map.put("expected_version", version));
});
log.debug("delete - statement: {}", expanded);
final var result = expanded.trace(this.tracer, span.context()).update(this.client);
return checkOptimisticLock(result, span, resourceVersion, checkSpan -> readDevice(this.client, key, checkSpan)).onComplete(x -> span.finish());
}
use of org.eclipse.hono.service.base.jdbc.store.SQL in project hono by eclipse.
the class TableManagementStore method createDevice.
/**
* Creates a new device.
* <p>
* This method executes the {@code create} statement, providing the named parameters
* {@code tenant_id}, {@code device_id}, {@code version}, and {@code data}.
* <p>
* It returns the plain update result. In case a device with the same ID already
* exists, the underlying database must throw an {@link java.sql.SQLException}, indicating
* a duplicate entity or constraint violation. This will be translated into a
* failed future with an {@link org.eclipse.hono.service.base.jdbc.store.DuplicateKeyException}.
*
* @param key The key of the device to create.
* @param device The device data.
* @param tenant The configuration of the tenant that the device belongs to.
* @param globalDevicesPerTenantLimit The globally defined maximum number of devices per tenant. A value
* <= 0 will be interpreted as no limit being defined.
* @param spanContext The span to contribute to.
* @return A future, tracking the outcome of the operation.
*/
public Future<Versioned<Void>> createDevice(final DeviceKey key, final Device device, final Tenant tenant, final int globalDevicesPerTenantLimit, final SpanContext spanContext) {
final Span span = TracingHelper.buildChildSpan(this.tracer, spanContext, "create device", getClass().getSimpleName()).withTag(TracingHelper.TAG_TENANT_ID, key.getTenantId()).withTag(TracingHelper.TAG_DEVICE_ID, key.getDeviceId()).start();
final JdbcBasedDeviceDto deviceDto = JdbcBasedDeviceDto.forCreation(key, device, DeviceRegistryUtils.getUniqueIdentifier());
return SQL.runTransactionally(this.client, this.tracer, span.context(), (connection, context) -> {
final var expanded = this.createStatement.expand(params -> {
params.put("tenant_id", deviceDto.getTenantId());
params.put("device_id", deviceDto.getDeviceId());
params.put("version", deviceDto.getVersion());
params.put("data", deviceDto.getDeviceJson());
params.put("created", Timestamp.from(deviceDto.getCreationTime()));
params.put("auto_provisioned", deviceDto.isAutoProvisioned());
});
log.debug("createDevice - statement: {}", expanded);
return getDeviceCount(key.getTenantId(), span.context()).compose(currentDeviceCount -> tenant.checkDeviceLimitReached(key.getTenantId(), currentDeviceCount, globalDevicesPerTenantLimit)).compose(ok -> expanded.trace(this.tracer, context).update(this.client).recover(SQL::translateException)).compose(x -> createGroups(connection, key, new HashSet<>(device.getMemberOf()), context));
}).map(new Versioned<Void>(deviceDto.getVersion(), null)).onComplete(x -> span.finish());
}
Aggregations