public synchronized BookPrx[] findByAuthors(String authors, Ice.Current current) throws DatabaseException { try { // // Lookup all books that match the given authors, and // return them to the caller. // String[] isbnSeq = _authors.get(authors); int length = (isbnSeq == null) ? 0 : isbnSeq.length; BookPrx[] books = new BookPrx[length]; if (isbnSeq != null) { for (int i = 0; i < length; ++i) { books[i] = isbnToBook(isbnSeq[i], current.adapter); } } return books; } catch (Freeze.DatabaseException ex) { DatabaseException e = new DatabaseException(); e.message = ex.message; throw e; } }
public synchronized BookPrx createBook(BookDescription description, Ice.Current current) throws DatabaseException, BookExistsException { BookPrx book = isbnToBook(description.isbn, current.adapter); try { book.ice_ping(); // // The book already exists. // throw new BookExistsException(); } catch (Ice.ObjectNotExistException e) { // // Book doesn't exist, ignore the exception. // } // // Create a new book Servant. // BookI bookI = new BookI(this); bookI.description = description; Ice.Identity ident = createBookIdentity(description.isbn); // // Create a new Ice Object in the evictor, using the new // identity and the new Servant. // // This can throw EvictorDeactivatedException (which indicates // an internal error). The exception is currently ignored. // _evictor.add(bookI, ident); try { // // Add the isbn number to the authors map. // String[] isbnSeq = _authors.get(description.authors); int length = (isbnSeq == null) ? 0 : isbnSeq.length; String[] newIsbnSeq = new String[length + 1]; if (isbnSeq != null) { System.arraycopy(isbnSeq, 0, newIsbnSeq, 0, length); } newIsbnSeq[length] = description.isbn; _authors.fastPut(description.authors, newIsbnSeq); return book; } catch (Freeze.DatabaseException ex) { DatabaseException e = new DatabaseException(); e.message = ex.message; throw e; } }
protected synchronized void remove(BookDescription description) throws DatabaseException { try { String[] isbnSeq = _authors.get(description.authors); assert isbnSeq != null; int i; for (i = 0; i < isbnSeq.length; ++i) { if (isbnSeq[i].equals(description.isbn)) { break; } } assert i < isbnSeq.length; if (isbnSeq.length == 1) { // // If there are no further associated isbn numbers then remove // the record. // _authors.fastRemove(description.authors); } else { // // Remove the isbn number from the sequence and write // back the new record. // String[] newIsbnSeq = new String[isbnSeq.length - 1]; System.arraycopy(isbnSeq, 0, newIsbnSeq, 0, i); if (i < isbnSeq.length - 1) { System.arraycopy(isbnSeq, i + 1, newIsbnSeq, i, isbnSeq.length - i - 1); } _authors.fastPut(description.authors, newIsbnSeq); } // // This can throw EvictorDeactivatedException (which // indicates an internal error). The exception is // currently ignored. // _evictor.remove(createBookIdentity(description.isbn)); } catch (Freeze.DatabaseException ex) { DatabaseException e = new DatabaseException(); e.message = ex.message; throw e; } }
ObjectStore( String facet, String facetType, boolean createDb, EvictorI evictor, java.util.List<Index> indices, boolean populateEmptyIndices) { _cache = new Cache(this); _facet = facet; _evictor = evictor; _indices = indices; _communicator = evictor.communicator(); _encoding = evictor.encoding(); _keepStats = false; if (facet.equals("")) { _dbName = EvictorI.defaultDb; } else { _dbName = facet; } if (facetType != null) { // // Create a sample servant with this type // Ice.ValueFactory factory = _communicator.getValueFactoryManager().find(facetType); if (factory == null) { throw new DatabaseException( _evictor.errorPrefix() + "No value factory registered for type-id '" + facetType + "'"); } _sampleServant = factory.create(facetType); } Connection connection = Util.createConnection(_communicator, evictor.dbEnv().getEnvName()); try { Catalog catalog = new Catalog(connection, Util.catalogName(), true); CatalogData catalogData = catalog.get(evictor.filename()); if (catalogData != null) { if (catalogData.evictor) { _keepStats = catalogData.value.isEmpty(); } else { DatabaseException ex = new DatabaseException(); ex.message = _evictor.errorPrefix() + evictor.filename() + " is not an evictor database"; throw ex; } } com.sleepycat.db.Environment dbEnv = evictor.dbEnv().getEnv(); // // TODO: FREEZE_DB_MODE // com.sleepycat.db.DatabaseConfig config = new com.sleepycat.db.DatabaseConfig(); config.setType(com.sleepycat.db.DatabaseType.BTREE); config.setAllowCreate(createDb); Ice.Properties properties = _evictor.communicator().getProperties(); String propPrefix = "Freeze.Evictor." + _evictor.filename() + "."; int btreeMinKey = properties.getPropertyAsInt(propPrefix + _dbName + ".BtreeMinKey"); if (btreeMinKey > 2) { if (_evictor.trace() >= 1) { _evictor .communicator() .getLogger() .trace( "Freeze.Evictor", "Setting \"" + _evictor.filename() + "." + _dbName + "\"'s btree minkey to " + btreeMinKey); } config.setBtreeMinKey(btreeMinKey); } boolean checksum = properties.getPropertyAsInt(propPrefix + "Checksum") > 0; if (checksum) { if (_evictor.trace() >= 1) { _evictor .communicator() .getLogger() .trace("Freeze.Evictor", "Turning checksum on for \"" + _evictor.filename() + "\""); } config.setChecksum(true); } int pageSize = properties.getPropertyAsInt(propPrefix + "PageSize"); if (pageSize > 0) { if (_evictor.trace() >= 1) { _evictor .communicator() .getLogger() .trace( "Freeze.Evictor", "Setting \"" + _evictor.filename() + "\"'s pagesize to " + pageSize); } config.setPageSize(pageSize); } try { Transaction tx = connection.beginTransaction(); com.sleepycat.db.Transaction txn = Util.getTxn(tx); _db = dbEnv.openDatabase(txn, evictor.filename(), _dbName, config); for (Index index : _indices) { index.associate(this, txn, createDb, populateEmptyIndices); } if (catalogData == null) { catalogData = new CatalogData(true, "::Ice::Identity", "Object"); catalog.put(evictor.filename(), catalogData); } tx.commit(); } catch (java.io.FileNotFoundException dx) { throw new NotFoundException(_evictor.errorPrefix() + "Db.open: " + dx.getMessage(), dx); } catch (com.sleepycat.db.DatabaseException dx) { throw new DatabaseException(_evictor.errorPrefix() + "Db.open: " + dx.getMessage(), dx); } finally { Transaction tx = connection.currentTransaction(); if (tx != null) { try { tx.rollback(); } catch (DatabaseException de) { } } } } finally { connection.close(); } }