protected virtual IQueryResponse[] ExecuteQuery(IQueryContext context, string text, IEnumerable<QueryParameter> parameters) { // TODO: Log a debug message.. IQueryResponse[] response = null; try { try { // For simplicity - all database locking is now exclusive inside // a transaction. This means it is not possible to execute // queries concurrently inside a transaction. However, we are // still able to execute queries concurrently from different // connections. // // It's debatable whether we even need to perform this Lock anymore // because we could change the contract of this method so that // it is not thread safe. This would require that the callee ensures // more than one thread can not execute queries on the connection. context.Session.ExclusiveLock(); // Execute the Query (behaviour for this comes from super). response = CoreExecuteQuery(context, text, parameters); // Return the result. return response; } finally { try { // This is executed no matter what happens. Very important we // unlock the tables. context.Session.ReleaseLocks(); } catch (Exception e) { // TODO: Log errors ... } } } finally { // This always happens after tables are unlocked. // Also guarenteed to happen even if something fails. // If we are in auto-commit mode then commit the Query here. // Do we auto-commit? if (context.AutoCommit()) { // Yes, so grab an exclusive Lock and auto-commit. try { // Lock into exclusive mode. context.Session.ExclusiveLock(); // If an error occured then roll-back if (response == null) { // Rollback. context.Session.Rollback(); } else { try { // Otherwise commit. QueryContext.Session.Commit(); } catch (Exception e) { foreach (IQueryResponse queryResponse in response) { // Dispose this response if the commit failed. DisposeResult(queryResponse.ResultId); } // And throw the SQL Exception throw; } } } finally { context.Session.ReleaseLocks(); } } } }
protected virtual bool Authenticate(string defaultSchema, string username, string password) { if (CurrentState == ConnectorState.Authenticated && QueryContext != null) throw new InvalidOperationException("Already authenticated."); // TODO: Log a debug information // TODO: Log an information about the logging user... try { QueryContext = OnAuthenticate(defaultSchema, username, password); if (QueryContext == null) return false; QueryContext.AutoCommit(autoCommit); QueryContext.IgnoreIdentifiersCase(ignoreIdentifiersCase); QueryContext.ParameterStyle(parameterStyle); ChangeState(ConnectorState.Authenticated); return true; } catch (Exception e) { // TODO: throw server error throw; } }