From bfa48acca3caa7e91b5bb0683be15f9f9b1d1e22 Mon Sep 17 00:00:00 2001 From: Nick Berardi Date: Wed, 2 Jan 2013 20:10:57 -0500 Subject: [PATCH] finished changes to work with new CQL in Cassandra 1.2 --- src/CassandraContext.cs | 16 ++++----- src/Connections/Connection.cs | 1 + src/Connections/ConnectionBuilder.cs | 4 +-- src/Connections/CqlVersion.cs | 8 +++-- src/Connections/IConnection.cs | 2 ++ src/Operations/ExecuteCqlNonQuery.cs | 32 +++++++++++++----- src/Operations/ExecuteCqlQuery.cs | 33 +++++++++++++++---- .../Bugs/Issue36KeyAliasSupport.cs | 4 +-- 8 files changed, 71 insertions(+), 29 deletions(-) diff --git a/src/CassandraContext.cs b/src/CassandraContext.cs index dfe70fb..90b80ef 100644 --- a/src/CassandraContext.cs +++ b/src/CassandraContext.cs @@ -318,9 +318,9 @@ public void SaveChanges(IFluentRecord record) /// /// /// - public IEnumerable ExecuteQuery(UTF8Type cqlQuery) + public IEnumerable ExecuteQuery(UTF8Type cqlQuery, string cqlVersion = CqlVersion.ConnectionDefault) { - var op = new ExecuteCqlQuery(cqlQuery); + var op = new ExecuteCqlQuery(cqlQuery, cqlVersion); return ExecuteOperation(op); } @@ -328,10 +328,10 @@ public IEnumerable ExecuteQuery(UTF8Type cqlQuery) /// /// /// - public void TryExecuteNonQuery(UTF8Type cqlQuery) + public void TryExecuteNonQuery(UTF8Type cqlQuery, string cqlVersion = CqlVersion.ConnectionDefault) { try { - ExecuteNonQuery(cqlQuery); + ExecuteNonQuery(cqlQuery, cqlVersion); } catch (Exception exc) { Debug.WriteLine(exc); } @@ -341,19 +341,19 @@ public void TryExecuteNonQuery(UTF8Type cqlQuery) /// /// /// - public void ExecuteNonQuery(UTF8Type cqlQuery) + public void ExecuteNonQuery(UTF8Type cqlQuery, string cqlVersion = CqlVersion.ConnectionDefault) { - var op = new ExecuteCqlNonQuery(cqlQuery); + var op = new ExecuteCqlNonQuery(cqlQuery, cqlVersion); ExecuteOperation(op); } /// - /// The last error that occured during the execution of an operation. + /// The last error that occurred during the execution of an operation. /// public CassandraException LastError { get; private set; } /// - /// Indicates if errors should be thrown when occuring on operation. + /// Indicates if errors should be thrown when occurring on operation. /// public bool ThrowErrors { get; set; } diff --git a/src/Connections/Connection.cs b/src/Connections/Connection.cs index d592004..10cfdb4 100644 --- a/src/Connections/Connection.cs +++ b/src/Connections/Connection.cs @@ -178,6 +178,7 @@ public void SetKeyspace(string keyspace) /// /// /// + [Obsolete("This will be retired soon, please pass the CQL version through the Execute method.", error: false)] public void SetCqlVersion(string cqlVersion) { CheckWasDisposed(); diff --git a/src/Connections/ConnectionBuilder.cs b/src/Connections/ConnectionBuilder.cs index 8b37d28..95b0f06 100644 --- a/src/Connections/ConnectionBuilder.cs +++ b/src/Connections/ConnectionBuilder.cs @@ -37,7 +37,7 @@ public ConnectionBuilder(string keyspace, string host, int port = Server.Default ConnectionString = GetConnectionString(); } - public ConnectionBuilder(string keyspace, Server server, bool pooling = false, int minPoolSize = 0, int maxPoolSize = 100, int maxRetries = 0, int serverPollingInterval = 30, int connectionLifetime = 0, ConnectionType connectionType = ConnectionType.Framed, int bufferSize = 1024, ConsistencyLevel read = ConsistencyLevel.QUORUM, ConsistencyLevel write = ConsistencyLevel.QUORUM, string cqlVersion = FluentCassandra.Connections.CqlVersion.ServerDefault, bool compressCqlQueries = true, string username = null, string password = null) + public ConnectionBuilder(string keyspace, Server server, bool pooling = false, int minPoolSize = 0, int maxPoolSize = 100, int maxRetries = 0, int serverPollingInterval = 30, int connectionLifetime = 0, ConnectionType connectionType = ConnectionType.Framed, int bufferSize = 1024, ConsistencyLevel read = ConsistencyLevel.QUORUM, ConsistencyLevel write = ConsistencyLevel.QUORUM, string cqlVersion = FluentCassandra.Connections.CqlVersion.Edge, bool compressCqlQueries = true, string username = null, string password = null) { Keyspace = keyspace; Servers = new List() { server }; @@ -311,7 +311,7 @@ private void InitializeConnectionString(string connectionString) if (!pairs.ContainsKey("CQL Version")) { - CqlVersion = FluentCassandra.Connections.CqlVersion.ServerDefault; + CqlVersion = FluentCassandra.Connections.CqlVersion.Edge; } else { diff --git a/src/Connections/CqlVersion.cs b/src/Connections/CqlVersion.cs index 2f212bd..6d3d941 100644 --- a/src/Connections/CqlVersion.cs +++ b/src/Connections/CqlVersion.cs @@ -3,12 +3,14 @@ namespace FluentCassandra.Connections { - public sealed class CqlVersion + public static class CqlVersion { - public const string Cql2 = "2.0.0"; + public const string Cql = "0.8.0"; public const string Cql3 = "3.0.0"; + public const string Edge = Cql3; + public const string ConnectionDefault = null; + [Obsolete("This is no longer supported, please use ConnectionDefault", error: true)] public const string ServerDefault = null; - public const string Edge = Cql3; } } diff --git a/src/Connections/IConnection.cs b/src/Connections/IConnection.cs index fed5604..0c7b612 100644 --- a/src/Connections/IConnection.cs +++ b/src/Connections/IConnection.cs @@ -12,6 +12,8 @@ public interface IConnection : IDisposable Cassandra.Client Client { get; } void SetKeyspace(string keyspace); + + [Obsolete("This will be retired soon, please pass the CQL version through the Execute method.", error: false)] void SetCqlVersion(string cqlVersion); void Open(); diff --git a/src/Operations/ExecuteCqlNonQuery.cs b/src/Operations/ExecuteCqlNonQuery.cs index 665f299..2258402 100644 --- a/src/Operations/ExecuteCqlNonQuery.cs +++ b/src/Operations/ExecuteCqlNonQuery.cs @@ -8,8 +8,7 @@ namespace FluentCassandra.Operations public class ExecuteCqlNonQuery : Operation { public UTF8Type CqlQuery { get; private set; } - - public bool CompressCqlQuery { get; private set; } + public string CqlVersion { get; private set; } public override Void Execute() { @@ -17,21 +16,38 @@ public override Void Execute() byte[] query = CqlQuery; bool isCqlQueryCompressed = query.Length > 200 && Session.ConnectionBuilder.CompressCqlQueries; - // it doesn't make sense to compress queryies that are really small + // it doesn't make sense to compress queries that are really small if (isCqlQueryCompressed) query = Helper.ZlibCompress(query); - var result = Session.GetClient().execute_cql_query( - query, - isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE - ); + if (CqlVersion == FluentCassandra.Connections.CqlVersion.ConnectionDefault) + CqlVersion = Session.ConnectionBuilder.CqlVersion; + + switch(CqlVersion) { + case FluentCassandra.Connections.CqlVersion.Cql: + Session.GetClient().execute_cql_query( + query, + isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE); + break; + + case FluentCassandra.Connections.CqlVersion.Cql3: + Session.GetClient().execute_cql3_query( + query, + isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE, + Session.WriteConsistency); + break; + + default: + throw new FluentCassandraException(CqlVersion + " is not a valid CQL version."); + } return new Void(); } - public ExecuteCqlNonQuery(UTF8Type cqlQuery) + public ExecuteCqlNonQuery(UTF8Type cqlQuery, string cqlVersion) { CqlQuery = cqlQuery; + CqlVersion = cqlVersion; } } } diff --git a/src/Operations/ExecuteCqlQuery.cs b/src/Operations/ExecuteCqlQuery.cs index 573df41..487bc9b 100644 --- a/src/Operations/ExecuteCqlQuery.cs +++ b/src/Operations/ExecuteCqlQuery.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; +using FluentCassandra.Apache.Cassandra; using FluentCassandra.Linq; using FluentCassandra.Types; @@ -13,6 +14,7 @@ public class ExecuteCqlQuery : ColumnFamilyOperation> private static readonly Regex ColumnFamilyNameExpression = new Regex(@"FROM\s+(?\w+)"); public UTF8Type CqlQuery { get; private set; } + public string CqlVersion { get; private set; } private string TryGetFamilyName() { @@ -34,14 +36,32 @@ public override IEnumerable Execute() byte[] query = CqlQuery; bool isCqlQueryCompressed = query.Length > 200 && Session.ConnectionBuilder.CompressCqlQueries; - // it doesn't make sense to compress queryies that are really small + // it doesn't make sense to compress queries that are really small if (isCqlQueryCompressed) query = Helper.ZlibCompress(query); - var result = Session.GetClient().execute_cql_query( - query, - isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE - ); + if (CqlVersion == FluentCassandra.Connections.CqlVersion.ConnectionDefault) + CqlVersion = Session.ConnectionBuilder.CqlVersion; + + var result = (CqlResult)null; + + switch (CqlVersion) { + case FluentCassandra.Connections.CqlVersion.Cql: + result = Session.GetClient().execute_cql_query( + query, + isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE); + break; + + case FluentCassandra.Connections.CqlVersion.Cql3: + result = Session.GetClient().execute_cql3_query( + query, + isCqlQueryCompressed ? Apache.Cassandra.Compression.GZIP : Apache.Cassandra.Compression.NONE, + Session.ReadConsistency); + break; + + default: + throw new FluentCassandraException(CqlVersion + " is not a valid CQL version."); + } return GetRows(result); } @@ -78,9 +98,10 @@ private IEnumerable GetColumns(Apache.Cassandra.CqlRow row, Cassan return list; } - public ExecuteCqlQuery(UTF8Type cqlQuery) + public ExecuteCqlQuery(UTF8Type cqlQuery, string cqlVersion) { CqlQuery = cqlQuery; + CqlVersion = cqlVersion; } } } diff --git a/test/FluentCassandra.Tests/Bugs/Issue36KeyAliasSupport.cs b/test/FluentCassandra.Tests/Bugs/Issue36KeyAliasSupport.cs index 2d609f8..408ec79 100644 --- a/test/FluentCassandra.Tests/Bugs/Issue36KeyAliasSupport.cs +++ b/test/FluentCassandra.Tests/Bugs/Issue36KeyAliasSupport.cs @@ -21,10 +21,10 @@ public void Dispose() } [Fact] - public void Test_Cql2() + public void Test_Cql() { var connBuilder = _db.ConnectionBuilder; - connBuilder = new ConnectionBuilder(connBuilder.Keyspace, connBuilder.Servers[0], cqlVersion: CqlVersion.Cql2); + connBuilder = new ConnectionBuilder(connBuilder.Keyspace, connBuilder.Servers[0], cqlVersion: CqlVersion.Cql); var db = new CassandraContext(connBuilder); // arrange