/** * Utility function for working around "ODatabaseException: Database instance is not set in current thread" issues. * The current database ThreadLocal is preserved and restored after calling the lambda. */ public static <T> T withOtherDatabase(Callable<T> function) { final ODatabaseDocumentInternal db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); try { return function.call(); } catch (Exception e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); } finally { ODatabaseRecordThreadLocal.INSTANCE.set(db); } }
private LoadingCache<OClass, Collection<OProperty>> getCache() { @SuppressWarnings("deprecation") int version = ODatabaseRecordThreadLocal.INSTANCE.get().getMetadata().getSchema().getVersion(); if(version>currentSchemaVersion) { CACHE.invalidateAll(); currentSchemaVersion=version; } return CACHE; }
/** * @return result of execution */ public final V execute() { ODatabaseDocument db = null; ODatabaseDocument oldDb = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); if(oldDb!=null) ODatabaseRecordThreadLocal.INSTANCE.remove(); //Required to avoid stack of transactions try { db = getSettings().getDatabasePoolFactory().get(getDBUrl(), getUsername(), getPassword()).acquire(); db.activateOnCurrentThread(); return execute(db); } finally { if(db!=null) db.close(); if(oldDb!=null) ODatabaseRecordThreadLocal.INSTANCE.set((ODatabaseDocumentInternal)oldDb); else ODatabaseRecordThreadLocal.INSTANCE.remove(); } }
private OStorage getStorage() { return ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner().getStorage(); }
private OStorage getStorage() { return ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner().getStorage(); } }
/** * @return {@link ODatabaseDocument} for current request */ public ODatabaseDocumentInternal getDatabase() { return ODatabaseRecordThreadLocal.INSTANCE.get(); }
@Override public boolean isAllowed(ODocument iDocument, ORestrictedOperation iAllowOperation, boolean iReadOriginal) { database = ODatabaseRecordThreadLocal.INSTANCE.get(); return super.isAllowed(iDocument, iAllowOperation, iReadOriginal); }
@Override public IRequestHandler onException(RequestCycle cycle, Exception ex) { ODatabaseDocument db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); if(db!=null && !db.isClosed()) db.rollback(); return null; }
@Override public void end(RequestCycle cycle) { ODatabaseDocument db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); if(db!=null && db.getTransaction().isActive()) db.commit(); }
@Override public void signOut() { super.signOut(); this.username=null; this.password=null; this.userModel.setObject(null); ODatabaseRecordThreadLocal.INSTANCE.remove(); }
/** * Only allow detaching when we have no DB context or it is from a different DB. * If we have a valid context from the same DB then we don't need to detach yet. */ private boolean allowDetach() { ODatabase<?> db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); return db == null || !getDbName().equals(db.getName()); }
public AccessToIsAllowedInRestrictedAccessHook() { super(ODatabaseRecordThreadLocal.INSTANCE.get()); } @Override
@Override public void onDetach(RequestCycle cycle) { ODatabaseDocument db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); if(db!=null) { if(db.getTransaction().isActive()) db.commit(true); db.close(); ODatabaseRecordThreadLocal.INSTANCE.remove(); } }