public IResultSet Search(IQuery query) { EnsureConnected(); IntPtr yazQuery = Yaz.ZOOM_query_create(); ResultSet resultSet = null; try { // branching out to right YAZ-C call if (query is ICQLQuery) { Yaz.ZOOM_query_cql(yazQuery, query.QueryString); } else if (query is IPrefixQuery) { Yaz.ZOOM_query_prefix(yazQuery, query.QueryString); } else { throw new NotImplementedException(); } IntPtr yazResultSet = Yaz.ZOOM_connection_search(_zoomConnection, yazQuery); // error checking C-style int errorCode = Yaz.ZOOM_connection_errcode(_zoomConnection); if (errorCode != Yaz.ZOOM_ERROR_NONE) { Yaz.ZOOM_resultset_destroy(yazResultSet); } CheckErrorCodeAndThrow(errorCode); // everything ok, create result set resultSet = new ResultSet(yazResultSet, this); } finally { // deallocate yazQuery also when exceptions Yaz.ZOOM_query_destroy(yazQuery); yazQuery = IntPtr.Zero; } return(resultSet); }