]> git.basschouten.com Git - openhab-addons.git/blob
a0385b3336dc8c6e0069bad73946cc352172e757
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.dbquery.internal.domain;
14
15 import java.time.Duration;
16 import java.util.Map;
17 import java.util.concurrent.CompletableFuture;
18 import java.util.concurrent.ExecutionException;
19 import java.util.concurrent.TimeUnit;
20 import java.util.concurrent.TimeoutException;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.openhab.binding.dbquery.internal.config.QueryConfiguration;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 /**
29  * Executes a non defined query in given database
30  *
31  * @author Joan Pujol - Initial contribution
32  */
33 @NonNullByDefault
34 public class ExecuteNonConfiguredQuery {
35     private final Logger logger = LoggerFactory.getLogger(ExecuteNonConfiguredQuery.class);
36     private final Database database;
37
38     public ExecuteNonConfiguredQuery(Database database) {
39         this.database = database;
40     }
41
42     public CompletableFuture<QueryResult> execute(String queryString, Map<String, @Nullable Object> parameters,
43             Duration timeout) {
44         if (!database.isConnected()) {
45             return CompletableFuture.completedFuture(QueryResult.ofIncorrectResult("Database not connected"));
46         }
47
48         Query query = database.queryFactory().createQuery(queryString, new QueryParameters(parameters),
49                 createConfiguration(queryString, timeout));
50         return database.executeQuery(query);
51     }
52
53     public QueryResult executeSynchronously(String queryString, Map<String, @Nullable Object> parameters,
54             Duration timeout) {
55         var completableFuture = execute(queryString, parameters, timeout);
56         try {
57             if (timeout.isZero()) {
58                 return completableFuture.get();
59             } else {
60                 return completableFuture.get(timeout.getSeconds(), TimeUnit.SECONDS);
61             }
62         } catch (InterruptedException e) {
63             logger.debug("Query was interrupted", e);
64             Thread.currentThread().interrupt();
65             return QueryResult.ofIncorrectResult("Query execution was interrupted");
66         } catch (ExecutionException e) {
67             logger.warn("Error executing query", e);
68             return QueryResult.ofIncorrectResult("Error executing query " + e.getMessage());
69         } catch (TimeoutException e) {
70             logger.debug("Timeout executing query", e);
71             return QueryResult.ofIncorrectResult("Timeout");
72         }
73     }
74
75     private QueryConfiguration createConfiguration(String query, Duration timeout) {
76         return new QueryConfiguration(query, QueryConfiguration.NO_INTERVAL, (int) timeout.getSeconds(), false, null,
77                 true);
78     }
79 }