Do not cache results, fixes: 3122
[yaz4j-moved-to-github.git] / src / main / java / org / yaz4j / Connection.java
1 package org.yaz4j;
2
3 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_connection_p;
4 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_query_p;
5 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_resultset_p;
6 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_scanset_p;
7 import org.yaz4j.jni.SWIGTYPE_p_p_char;
8 import org.yaz4j.jni.yaz4jlib;
9 import org.yaz4j.jni.yaz4jlibConstants;
10
11 public class Connection {
12
13     private String host;
14     private int port;
15     private ConnectionOptionsCollection options = null;
16     protected SWIGTYPE_p_ZOOM_connection_p zoomConnection = null;
17     private boolean connected = false;
18     private boolean disposed = false;
19
20     static {
21         // on Linux   'yaz4j' maps to 'libyaz4j.so' (i.e. 'lib' prefix & '.so'  extension)
22         // on Windows 'yaz4j' maps to 'yaz4j.dll'   (i.e.                '.dll' extension)
23         String libName = "yaz4j";
24         try {
25             // System.err.println( "Loading library '"+ System.mapLibraryName( libName ) + "'" );
26             System.loadLibrary(libName);
27         } catch (Throwable e) {
28             System.err.println("Fatal Error: Failed to load library '" + System.mapLibraryName(libName) + "'");
29             e.printStackTrace();
30         }
31     }
32
33     public Connection(String host, int port) {
34         this.host = host;
35         this.port = port;
36
37         options = new ConnectionOptionsCollection();
38         zoomConnection = yaz4jlib.ZOOM_connection_create(options.zoomOptions);
39
40         //remove
41         SWIGTYPE_p_p_char cp = null;
42         SWIGTYPE_p_p_char addinfo = null;
43         int errorCode = yaz4jlib.ZOOM_connection_error(zoomConnection, cp, addinfo);
44         checkErrorCodeAndThrow(errorCode);
45     }
46
47     public void finalize() {
48         dispose();
49     }
50
51     private void checkErrorCodeAndThrow(int errorCode) {
52         String message;
53
54         if (errorCode == yaz4jlibConstants.ZOOM_ERROR_NONE) {
55             return;
56         } else if (errorCode == yaz4jlib.ZOOM_ERROR_CONNECT) {
57             message = String.format("Connection could not be made to %s:%d", host, port);
58             throw new ConnectionUnavailableException(message);
59         } else if (errorCode == yaz4jlib.ZOOM_ERROR_INVALID_QUERY) {
60             message = String.format("The query requested is not valid or not supported");
61             throw new InvalidQueryException(message);
62         } else if (errorCode == yaz4jlib.ZOOM_ERROR_INIT) {
63             message = String.format("Server %s:%d rejected our init request", host, port);
64             throw new InitRejectedException(message);
65         } else if (errorCode == yaz4jlib.ZOOM_ERROR_TIMEOUT) {
66             message = String.format("Server %s:%d timed out handling our request", host, port);
67             throw new ConnectionTimeoutException(message);
68         } else if ((errorCode == yaz4jlib.ZOOM_ERROR_MEMORY) || (errorCode == yaz4jlib.ZOOM_ERROR_ENCODE) || (errorCode == yaz4jlib.ZOOM_ERROR_DECODE) || (errorCode == yaz4jlib.ZOOM_ERROR_CONNECTION_LOST) || (errorCode == yaz4jlib.ZOOM_ERROR_INTERNAL) || (errorCode == yaz4jlib.ZOOM_ERROR_UNSUPPORTED_PROTOCOL) || (errorCode == yaz4jlib.ZOOM_ERROR_UNSUPPORTED_QUERY)) {
69             message = yaz4jlib.ZOOM_connection_errmsg(zoomConnection);
70             throw new ZoomImplementationException("A fatal error occurred in Yaz: " + errorCode + " - " + message);
71         } else {
72             String errMsgBib1 = "Bib1Exception: Error Code = " + errorCode + " (" + Bib1Diagnostic.getError(errorCode) + ")";
73             throw new Bib1Exception(errMsgBib1);
74         }
75     }
76
77     private enum QueryType {
78
79         CQLQuery, PrefixQuery
80     };
81
82     public ResultSet search(PrefixQuery query) {
83         return search(query.getQueryString(), QueryType.PrefixQuery);
84     }
85
86     public ResultSet search(CQLQuery query) {
87         return search(query.getQueryString(), QueryType.CQLQuery);
88     }
89
90     private ResultSet search(String query, QueryType queryType) {
91         ensureConnected();
92
93         SWIGTYPE_p_ZOOM_query_p yazQuery = yaz4jlib.ZOOM_query_create();
94         ResultSet resultSet = null;
95
96         try {
97             if (queryType == QueryType.CQLQuery) {
98                 yaz4jlib.ZOOM_query_cql(yazQuery, query);
99             } else if (queryType == QueryType.PrefixQuery) {
100                 yaz4jlib.ZOOM_query_prefix(yazQuery, query);
101             } else {
102                 throw new InvalidQueryException("queryType");
103             }
104
105             SWIGTYPE_p_ZOOM_resultset_p yazResultSet = yaz4jlib.ZOOM_connection_search(zoomConnection, yazQuery);
106
107             int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
108             if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
109                 yaz4jlib.ZOOM_resultset_destroy(yazResultSet);
110             }
111             checkErrorCodeAndThrow(errorCode);
112
113             resultSet = new ResultSet(yazResultSet, zoomConnection);
114         } finally {
115             yaz4jlib.ZOOM_query_destroy(yazQuery); // deallocate yazQuery also when exceptions
116             yazQuery = null;
117         }
118         return resultSet;
119     }
120
121     public ScanSet scan(String query) {
122         ensureConnected();
123         SWIGTYPE_p_ZOOM_scanset_p yazScanSet = yaz4jlib.ZOOM_connection_scan(zoomConnection, query);
124
125         int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
126         if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
127             yaz4jlib.ZOOM_scanset_destroy(yazScanSet);
128         }
129         checkErrorCodeAndThrow(errorCode);
130
131         ScanSet scanSet = new ScanSet(yazScanSet, this);
132         return scanSet;
133     }
134
135     public ConnectionOptionsCollection getOptions() {
136         return options;
137     }
138
139     protected void ensureConnected() {
140         if (!connected) {
141             connect();
142         }
143     }
144
145     public void connect() {
146         yaz4jlib.ZOOM_connection_connect(zoomConnection, host, port);
147         int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
148         checkErrorCodeAndThrow(errorCode);
149         connected = true;
150     }
151
152     public void dispose() {
153         if (!disposed) {
154             yaz4jlib.ZOOM_connection_destroy(zoomConnection);
155             zoomConnection = null;
156             disposed = true;
157         }
158     }
159
160     public String getSyntax() {
161         return options.get("preferredRecordSyntax");
162     }
163
164     public void setSyntax(String value) {
165         options.set("preferredRecordSyntax", value);
166     }
167
168     public String getDatabaseName() {
169         return options.get("databaseName");
170     }
171
172     public void setDatabaseName(String value) {
173         options.set("databaseName", value);
174     }
175
176     public String getUsername() {
177         return options.get("user");
178     }
179
180     public void setUsername(String value) {
181         options.set("user", value);
182     }
183
184     public String getPassword() {
185         return options.get("password");
186     }
187
188     public void setPassword(String value) {
189         options.set("password", value);
190     }
191 }