Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 47 additions & 34 deletions include/cassandra.h
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ typedef enum CassConsistency_ {
CASS_CONSISTENCY_LOCAL_ONE = 0x000A
} CassConsistency;

#define CASS_CONSISTENCY_MAP(XX) \
#define CASS_CONSISTENCY_MAPPING(XX) \
XX(CASS_CONSISTENCY_UNKNOWN, "UNKNOWN") \
XX(CASS_CONSISTENCY_ANY, "ANY") \
XX(CASS_CONSISTENCY_ONE, "ONE") \
Expand All @@ -492,6 +492,8 @@ typedef enum CassConsistency_ {
XX(CASS_CONSISTENCY_LOCAL_SERIAL, "LOCAL_SERIAL") \
XX(CASS_CONSISTENCY_LOCAL_ONE, "LOCAL_ONE")

#define CASS_CONSISTENCY_MAP CASS_CONSISTENCY_MAPPING /* Deprecated */

typedef enum CassWriteType_ {
CASS_WRITE_TYPE_UKNOWN,
CASS_WRITE_TYPE_SIMPLE,
Expand All @@ -502,14 +504,16 @@ typedef enum CassWriteType_ {
CASS_WRITE_TYPE_CAS
} CassWriteType;

#define CASS_WRITE_TYPE_MAP(XX) \
#define CASS_WRITE_TYPE_MAPPING(XX) \
XX(CASS_WRITE_TYPE_SIMPLE, "SIMPLE") \
XX(CASS_WRITE_TYPE_BATCH, "BATCH") \
XX(CASS_WRITE_TYPE_UNLOGGED_BATCH, "UNLOGGED_BATCH") \
XX(CASS_WRITE_TYPE_COUNTER, "COUNTER") \
XX(CASS_WRITE_TYPE_BATCH_LOG, "BATCH_LOG") \
XX(CASS_WRITE_TYPE_CAS, "CAS")

#define CASS_WRITE_TYPE_MAP CASS_WRITE_TYPE_MAPPING /* Deprecated */

typedef enum CassColumnType_ {
CASS_COLUMN_TYPE_REGULAR,
CASS_COLUMN_TYPE_PARTITION_KEY,
Expand All @@ -525,35 +529,40 @@ typedef enum CassIndexType_ {
CASS_INDEX_TYPE_COMPOSITES
} CassIndexType;

#define CASS_VALUE_TYPE_MAPPING(XX) \
XX(CASS_VALUE_TYPE_CUSTOM, 0x0000, "", "") \
XX(CASS_VALUE_TYPE_ASCII, 0x0001, "ascii", "org.apache.cassandra.db.marshal.AsciiType") \
XX(CASS_VALUE_TYPE_BIGINT, 0x0002, "bigint", "org.apache.cassandra.db.marshal.LongType") \
XX(CASS_VALUE_TYPE_BLOB, 0x0003, "blob", "org.apache.cassandra.db.marshal.BytesType") \
XX(CASS_VALUE_TYPE_BOOLEAN, 0x0004, "boolean", "org.apache.cassandra.db.marshal.BooleanType") \
XX(CASS_VALUE_TYPE_COUNTER, 0x0005, "counter", "org.apache.cassandra.db.marshal.CounterColumnType") \
XX(CASS_VALUE_TYPE_DECIMAL, 0x0006, "decimal", "org.apache.cassandra.db.marshal.DecimalType") \
XX(CASS_VALUE_TYPE_DOUBLE, 0x0007, "double", "org.apache.cassandra.db.marshal.DoubleType") \
XX(CASS_VALUE_TYPE_FLOAT, 0x0008, "float", "org.apache.cassandra.db.marshal.FloatType") \
XX(CASS_VALUE_TYPE_INT, 0x0009, "int", "org.apache.cassandra.db.marshal.Int32Type") \
XX(CASS_VALUE_TYPE_TEXT, 0x000A, "text", "org.apache.cassandra.db.marshal.UTF8Type") \
XX(CASS_VALUE_TYPE_TIMESTAMP, 0x000B, "timestamp", "org.apache.cassandra.db.marshal.TimestampType") \
XX(CASS_VALUE_TYPE_UUID, 0x000C, "uuid", "org.apache.cassandra.db.marshal.UUIDType") \
XX(CASS_VALUE_TYPE_VARCHAR, 0x000D, "varchar", "") \
XX(CASS_VALUE_TYPE_VARINT, 0x000E, "varint", "org.apache.cassandra.db.marshal.IntegerType") \
XX(CASS_VALUE_TYPE_TIMEUUID, 0x000F, "timeuuid", "org.apache.cassandra.db.marshal.TimeUUIDType") \
XX(CASS_VALUE_TYPE_INET, 0x0010, "inet", "org.apache.cassandra.db.marshal.InetAddressType") \
XX(CASS_VALUE_TYPE_DATE, 0x0011, "date", "org.apache.cassandra.db.marshal.SimpleDateType") \
XX(CASS_VALUE_TYPE_TIME, 0x0012, "time", "org.apache.cassandra.db.marshal.TimeType") \
XX(CASS_VALUE_TYPE_SMALL_INT, 0x0013, "smallint", "org.apache.cassandra.db.marshal.ShortType") \
XX(CASS_VALUE_TYPE_TINY_INT, 0x0014, "tinyint", "org.apache.cassandra.db.marshal.ByteType") \
XX(CASS_VALUE_TYPE_DURATION, 0x0015, "duration", "org.apache.cassandra.db.marshal.DurationType") \
XX(CASS_VALUE_TYPE_LIST, 0x0020, "list", "org.apache.cassandra.db.marshal.ListType") \
XX(CASS_VALUE_TYPE_MAP, 0x0021, "map", "org.apache.cassandra.db.marshal.MapType") \
XX(CASS_VALUE_TYPE_SET, 0x0022, "set", "org.apache.cassandra.db.marshal.SetType") \
XX(CASS_VALUE_TYPE_UDT, 0x0030, "", "") \
XX(CASS_VALUE_TYPE_TUPLE, 0x0031, "tuple", "org.apache.cassandra.db.marshal.TupleType")

typedef enum CassValueType_ {
CASS_VALUE_TYPE_UNKNOWN = 0xFFFF,
CASS_VALUE_TYPE_CUSTOM = 0x0000,
CASS_VALUE_TYPE_ASCII = 0x0001,
CASS_VALUE_TYPE_BIGINT = 0x0002,
CASS_VALUE_TYPE_BLOB = 0x0003,
CASS_VALUE_TYPE_BOOLEAN = 0x0004,
CASS_VALUE_TYPE_COUNTER = 0x0005,
CASS_VALUE_TYPE_DECIMAL = 0x0006,
CASS_VALUE_TYPE_DOUBLE = 0x0007,
CASS_VALUE_TYPE_FLOAT = 0x0008,
CASS_VALUE_TYPE_INT = 0x0009,
CASS_VALUE_TYPE_TEXT = 0x000A,
CASS_VALUE_TYPE_TIMESTAMP = 0x000B,
CASS_VALUE_TYPE_UUID = 0x000C,
CASS_VALUE_TYPE_VARCHAR = 0x000D,
CASS_VALUE_TYPE_VARINT = 0x000E,
CASS_VALUE_TYPE_TIMEUUID = 0x000F,
CASS_VALUE_TYPE_INET = 0x0010,
CASS_VALUE_TYPE_DATE = 0x0011,
CASS_VALUE_TYPE_TIME = 0x0012,
CASS_VALUE_TYPE_SMALL_INT = 0x0013,
CASS_VALUE_TYPE_TINY_INT = 0x0014,
CASS_VALUE_TYPE_DURATION = 0x0015,
CASS_VALUE_TYPE_LIST = 0x0020,
CASS_VALUE_TYPE_MAP = 0x0021,
CASS_VALUE_TYPE_SET = 0x0022,
CASS_VALUE_TYPE_UDT = 0x0030,
CASS_VALUE_TYPE_TUPLE = 0x0031,
CASS_VALUE_TYPE_UNKNOWN = 0xFFFF,
#define XX_VALUE_TYPE(name, type, cql, klass) name = type,
CASS_VALUE_TYPE_MAPPING(XX_VALUE_TYPE)
#undef XX_VALUE_TYPE
/* @cond IGNORE */
CASS_VALUE_TYPE_LAST_ENTRY
/* @endcond */
Expand Down Expand Up @@ -595,7 +604,7 @@ typedef enum CassIteratorType_ {
CASS_ITERATOR_TYPE_MATERIALIZED_VIEW_META
} CassIteratorType;

#define CASS_LOG_LEVEL_MAP(XX) \
#define CASS_LOG_LEVEL_MAPPING(XX) \
XX(CASS_LOG_DISABLED, "") \
XX(CASS_LOG_CRITICAL, "CRITICAL") \
XX(CASS_LOG_ERROR, "ERROR") \
Expand All @@ -604,9 +613,11 @@ typedef enum CassIteratorType_ {
XX(CASS_LOG_DEBUG, "DEBUG") \
XX(CASS_LOG_TRACE, "TRACE")

#define CASS_LOG_LEVEL_MAP CASS_LOG_LEVEL_MAPPING /* Deprecated */

typedef enum CassLogLevel_ {
#define XX_LOG(log_level, _) log_level,
CASS_LOG_LEVEL_MAP(XX_LOG)
CASS_LOG_LEVEL_MAPPING(XX_LOG)
#undef XX_LOG
/* @cond IGNORE */
CASS_LOG_LAST_ENTRY
Expand All @@ -628,7 +639,7 @@ typedef enum CassErrorSource_ {
CASS_ERROR_SOURCE_COMPRESSION
} CassErrorSource;

#define CASS_ERROR_MAP(XX) \
#define CASS_ERROR_MAPPING(XX) \
XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_BAD_PARAMS, 1, "Bad parameters") \
XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_NO_STREAMS, 2, "No streams available") \
XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_UNABLE_TO_INIT, 3, "Unable to initialize") \
Expand Down Expand Up @@ -687,12 +698,14 @@ typedef enum CassErrorSource_ {
XX(CASS_ERROR_SOURCE_SSL, CASS_ERROR_SSL_IDENTITY_MISMATCH, 5, "Certificate does not match host or IP address") \
XX(CASS_ERROR_SOURCE_SSL, CASS_ERROR_SSL_PROTOCOL_ERROR, 6, "Protocol error")

#define CASS_ERROR_MAP CASS_ERROR_MAPPING /* Deprecated */

#define CASS_ERROR(source, code) ((source << 24) | code)

typedef enum CassError_ {
CASS_OK = 0,
#define XX_ERROR(source, name, code, _) name = CASS_ERROR(source, code),
CASS_ERROR_MAP(XX_ERROR)
CASS_ERROR_MAPPING(XX_ERROR)
#undef XX_ERROR
/* @cond IGNORE */
CASS_ERROR_LAST_ENTRY
Expand Down
2 changes: 1 addition & 1 deletion src/connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1132,7 +1132,7 @@ void Connection::PendingWriteSsl::flush() {

encrypt();

FixedVector<uv_buf_t, SSL_ENCRYPTED_BUFS_COUNT> bufs;
SmallVector<uv_buf_t, SSL_ENCRYPTED_BUFS_COUNT> bufs;
encrypted_size_ = ssl_session->outgoing().peek_multiple(prev_pos, &bufs);

LOG_TRACE("Sending %u encrypted bytes", static_cast<unsigned int>(encrypted_size_));
Expand Down
118 changes: 62 additions & 56 deletions src/data_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "external.hpp"
#include "tuple.hpp"
#include "types.hpp"
#include "utils.hpp"
#include "user_type_value.hpp"

#include <string.h>
Expand Down Expand Up @@ -383,68 +384,73 @@ namespace cass {

const DataType::ConstPtr DataType::NIL;

void NativeDataTypes::init_class_names() {
if (!by_class_names_.empty()) return;
by_class_names_["org.apache.cassandra.db.marshal.AsciiType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_ASCII));
by_class_names_["org.apache.cassandra.db.marshal.BooleanType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BOOLEAN));
by_class_names_["org.apache.cassandra.db.marshal.ByteType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TINY_INT));
by_class_names_["org.apache.cassandra.db.marshal.BytesType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BLOB));
by_class_names_["org.apache.cassandra.db.marshal.CounterColumnType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_COUNTER));
by_class_names_["org.apache.cassandra.db.marshal.DateType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIMESTAMP));
by_class_names_["org.apache.cassandra.db.marshal.DecimalType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DECIMAL));
by_class_names_["org.apache.cassandra.db.marshal.DoubleType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DOUBLE));
by_class_names_["org.apache.cassandra.db.marshal.DurationType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DURATION));
by_class_names_["org.apache.cassandra.db.marshal.FloatType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_FLOAT));
by_class_names_["org.apache.cassandra.db.marshal.InetAddressType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_INET));
by_class_names_["org.apache.cassandra.db.marshal.Int32Type"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_INT));
by_class_names_["org.apache.cassandra.db.marshal.IntegerType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_VARINT));
by_class_names_["org.apache.cassandra.db.marshal.LongType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BIGINT));
by_class_names_["org.apache.cassandra.db.marshal.ShortType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_SMALL_INT));
by_class_names_["org.apache.cassandra.db.marshal.SimpleDateType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DATE));
by_class_names_["org.apache.cassandra.db.marshal.TimeType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIME));
by_class_names_["org.apache.cassandra.db.marshal.TimestampType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIMESTAMP));
by_class_names_["org.apache.cassandra.db.marshal.TimeUUIDType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIMEUUID));
by_class_names_["org.apache.cassandra.db.marshal.UTF8Type"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TEXT));
by_class_names_["org.apache.cassandra.db.marshal.UUIDType"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_UUID));
}

const DataType::ConstPtr& NativeDataTypes::by_class_name(const std::string& name) const {
DataTypeMap::const_iterator i = by_class_names_.find(name);
if (i == by_class_names_.end()) return DataType::NIL;
DataType::ConstPtr DataType::create_by_class(StringRef name) {
CassValueType value_type = ValueTypes::by_class(name);
if (value_type == CASS_VALUE_TYPE_UNKNOWN) {
return DataType::NIL;
}
return ConstPtr(new DataType(value_type));
}

DataType::ConstPtr DataType::create_by_cql(StringRef name) {
CassValueType value_type = ValueTypes::by_cql(name);
if (value_type == CASS_VALUE_TYPE_UNKNOWN) {
return DataType::NIL;
}
return ConstPtr(new DataType(value_type));
}

ValueTypes::HashMap ValueTypes::value_types_by_class_;
ValueTypes::HashMap ValueTypes::value_types_by_cql_;

static ValueTypes __value_types__; // Initializer

ValueTypes::ValueTypes() {
value_types_by_class_.set_empty_key("");
value_types_by_cql_.set_empty_key("");

#define XX_VALUE_TYPE(name, type, cql, klass) \
if (strlen(klass) > 0) value_types_by_class_[klass] = name; \
if (strlen(cql) > 0) value_types_by_cql_[cql] = name;

CASS_VALUE_TYPE_MAPPING(XX_VALUE_TYPE)
#undef XX_VALUE_TYPE
}

CassValueType ValueTypes::by_class(StringRef name) {
HashMap::const_iterator i = value_types_by_class_.find(name);
if (i == value_types_by_class_.end()) {
return CASS_VALUE_TYPE_UNKNOWN;
}
return i->second;
}

void NativeDataTypes::init_cql_names() {
if (!by_cql_names_.empty()) return;
by_cql_names_["ascii"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_ASCII));
by_cql_names_["bigint"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BIGINT));
by_cql_names_["blob"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BLOB));
by_cql_names_["boolean"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_BOOLEAN));
by_cql_names_["counter"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_COUNTER));
by_cql_names_["date"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DATE));
by_cql_names_["decimal"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DECIMAL));
by_cql_names_["double"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DOUBLE));
by_cql_names_["duration"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_DURATION));
by_cql_names_["float"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_FLOAT));
by_cql_names_["inet"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_INET));
by_cql_names_["int"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_INT));
by_cql_names_["smallint"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_SMALL_INT));
by_cql_names_["time"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIME));
by_cql_names_["timestamp"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIMESTAMP));
by_cql_names_["timeuuid"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TIMEUUID));
by_cql_names_["tinyint"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TINY_INT));
by_cql_names_["text"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_TEXT));
by_cql_names_["uuid"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_UUID));
by_cql_names_["varchar"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_VARCHAR));
by_cql_names_["varint"] = DataType::ConstPtr(new DataType(CASS_VALUE_TYPE_VARINT));
}

const DataType::ConstPtr& NativeDataTypes::by_cql_name(const std::string& name) const {
DataTypeMap::const_iterator i = by_cql_names_.find(name);
if (i == by_cql_names_.end()) return DataType::NIL;
CassValueType ValueTypes::by_cql(StringRef name) {
HashMap::const_iterator i = value_types_by_cql_.find(name);
if (i == value_types_by_cql_.end()) {
return CASS_VALUE_TYPE_UNKNOWN;
}
return i->second;
}

const DataType::ConstPtr& SimpleDataTypeCache::by_value_type(uint16_t value_type) {
if (value_type == CASS_VALUE_TYPE_UNKNOWN ||
value_type == CASS_VALUE_TYPE_CUSTOM ||
value_type == CASS_VALUE_TYPE_LIST ||
value_type == CASS_VALUE_TYPE_MAP ||
value_type == CASS_VALUE_TYPE_SET ||
value_type == CASS_VALUE_TYPE_UDT ||
value_type == CASS_VALUE_TYPE_TUPLE ||
value_type >= CASS_VALUE_TYPE_LAST_ENTRY) {
return DataType::NIL;
}
DataType::ConstPtr& data_type = cache_[value_type];
if (!data_type) {
data_type = DataType::ConstPtr(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't cache_ be updated here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a reference.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, duh! Makes sense.

new DataType(static_cast<CassValueType>(value_type)));
}
return data_type;
}

bool cass::IsValidDataType<const Collection*>::operator()(const Collection* value,
const DataType::ConstPtr& data_type) const {
Expand Down
Loading