523 lines
11 KiB
C++

/* Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#include "mysqlx_pb_wrapper.h"
#include "ngs_common/to_string.h"
namespace xpl
{
namespace test
{
Identifier::Identifier(const std::string &name, const std::string &schema_name)
{
if (name.empty() == false)
set_name(name);
if (schema_name.empty() == false)
set_schema_name(schema_name);
}
Document_path::Document_path(const Path &path)
{
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
{
Mysqlx::Expr::DocumentPathItem *item = Add();
item->set_type(i->first);
if (i->first == Mysqlx::Expr::DocumentPathItem::ARRAY_INDEX)
item->set_index(ngs::stoi(i->second));
else
item->set_value(i->second);
}
}
Document_path::Path::Path(const std::string &value)
{
add_member(value);
}
Document_path::Path &Document_path::Path::add_member(const std::string &value)
{
push_back(std::make_pair(Mysqlx::Expr::DocumentPathItem::MEMBER, value));
return *this;
}
Document_path::Path &Document_path::Path::add_index(int index)
{
push_back(std::make_pair(Mysqlx::Expr::DocumentPathItem::ARRAY_INDEX,
ngs::to_string(index)));
return *this;
}
Document_path::Path &Document_path::Path::add_asterisk()
{
push_back(std::make_pair(Mysqlx::Expr::DocumentPathItem::MEMBER_ASTERISK, ""));
return *this;
}
Document_path::Path &Document_path::Path::add_double_asterisk()
{
push_back(std::make_pair(Mysqlx::Expr::DocumentPathItem::DOUBLE_ASTERISK, ""));
return *this;
}
ColumnIdentifier::ColumnIdentifier(const std::string &name,
const std::string &table_name,
const std::string &schema_name,
const Document_path::Path *path)
{
if (name.empty() == false)
set_name(name);
if (table_name.empty() == false)
set_table_name(table_name);
if (schema_name.empty() == false)
set_schema_name(schema_name);
if (path)
*mutable_document_path() = Document_path(*path);
}
ColumnIdentifier::ColumnIdentifier(const Document_path &path,
const std::string &name,
const std::string &table_name,
const std::string &schema_name)
{
if (!name.empty())
set_name(name);
if (!table_name.empty())
set_table_name(table_name);
if (!schema_name.empty())
set_schema_name(schema_name);
mutable_document_path()->CopyFrom(path);
}
Scalar::Scalar(int value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_SINT);
set_v_signed_int(value);
}
Scalar::Scalar(unsigned int value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_UINT);
set_v_unsigned_int(value);
}
Scalar::Scalar(bool value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_BOOL);
set_v_bool(value);
}
Scalar::Scalar(float value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_FLOAT);
set_v_float(value);
}
Scalar::Scalar(double value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_DOUBLE);
set_v_double(value);
}
Scalar::Scalar(const char *value, unsigned type)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_OCTETS);
set_allocated_v_octets(new Scalar::Octets(value, type));
}
Scalar::Scalar(Scalar::Octets *value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_OCTETS);
set_allocated_v_octets(value);
}
Scalar::Scalar(const Scalar::Octets &value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_OCTETS);
mutable_v_octets()->CopyFrom(value);
}
Scalar::Scalar(Scalar::String *value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_STRING);
set_allocated_v_string(value);
}
Scalar::Scalar(const Scalar::String &value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_STRING);
mutable_v_string()->CopyFrom(value);
}
Scalar::Scalar(Scalar::Null value)
{
set_type(Mysqlx::Datatypes::Scalar_Type_V_NULL);
}
Scalar::String::String(const std::string &value)
{
set_value(value);
}
Scalar::Octets::Octets(const std::string &value, unsigned type)
{
set_value(value);
set_content_type(type);
}
Any::Any(Scalar *scalar)
{
set_type(Mysqlx::Datatypes::Any_Type_SCALAR);
set_allocated_scalar(scalar);
}
Any::Any(const Scalar &scalar)
{
set_type(Mysqlx::Datatypes::Any_Type_SCALAR);
mutable_scalar()->CopyFrom(scalar);
}
Any::Any(const Object &obj)
{
set_type(Mysqlx::Datatypes::Any_Type_OBJECT);
mutable_obj()->CopyFrom(obj);
}
Any::Any(const Array &array)
{
set_type(Mysqlx::Datatypes::Any_Type_ARRAY);
mutable_array()->CopyFrom(array);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Scalar &value)
{
expr.set_type(Mysqlx::Expr::Expr_Type_LITERAL);
expr.mutable_literal()->CopyFrom(value);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, Operator *oper)
{
expr.set_type(Mysqlx::Expr::Expr_Type_OPERATOR);
expr.set_allocated_operator_(oper);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Operator &oper)
{
expr.set_type(Mysqlx::Expr::Expr_Type_OPERATOR);
expr.mutable_operator_()->CopyFrom(oper);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Identifier &ident)
{
expr.set_type(Mysqlx::Expr::Expr_Type_IDENT);
expr.mutable_operator_()->CopyFrom(ident);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, FunctionCall *func)
{
expr.set_type(Mysqlx::Expr::Expr_Type_FUNC_CALL);
expr.set_allocated_function_call(func);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const FunctionCall &func)
{
expr.set_type(Mysqlx::Expr::Expr_Type_FUNC_CALL);
expr.mutable_function_call()->CopyFrom(func);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, ColumnIdentifier *id)
{
expr.set_type(Mysqlx::Expr::Expr_Type_IDENT);
expr.set_allocated_identifier(id);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const ColumnIdentifier &id)
{
expr.set_type(Mysqlx::Expr::Expr_Type_IDENT);
expr.mutable_identifier()->CopyFrom(id);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, Object *obj)
{
expr.set_type(Mysqlx::Expr::Expr_Type_OBJECT);
expr.set_allocated_object(obj);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Object &obj)
{
expr.set_type(Mysqlx::Expr::Expr_Type_OBJECT);
expr.mutable_object()->CopyFrom(obj);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, Array *arr)
{
expr.set_type(Mysqlx::Expr::Expr_Type_ARRAY);
expr.set_allocated_array(arr);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Array &arr)
{
expr.set_type(Mysqlx::Expr::Expr_Type_ARRAY);
expr.mutable_array()->CopyFrom(arr);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Placeholder &ph)
{
expr.set_type(Mysqlx::Expr::Expr_Type_PLACEHOLDER);
expr.set_position(ph.value);
}
void Expr::initialize(Mysqlx::Expr::Expr &expr, const Variable &var)
{
expr.set_type(Mysqlx::Expr::Expr_Type_VARIABLE);
expr.set_variable(var.value);
}
Object::Object(const Values &values)
{
for (Values::const_iterator i = values.begin(); i != values.end(); ++i)
{
::Mysqlx::Expr::Object_ObjectField *item = add_fld();
item->set_key(i->first);
item->mutable_value()->CopyFrom(i->second);
}
}
Any::Array::Scalar_values &Any::Array::Scalar_values::operator () (const Scalar &value)
{
push_back(value);
return *this;
}
Any::Array::Array(const Scalar &value)
{
this->operator()(value);
}
Any::Array::Array(const Object &value)
{
this->operator()(value);
}
Any::Array::Array(const Scalar_values &values)
{
for (Scalar_values::const_iterator i = values.begin(); i != values.end(); ++i)
this->operator()(*i);
}
Any::Array &Any::Array::operator () (const Scalar &value)
{
::Mysqlx::Datatypes::Any *any = add_value();
any->set_type(::Mysqlx::Datatypes::Any_Type_SCALAR);
any->mutable_scalar()->CopyFrom(value);
return *this;
}
Any::Array &Any::Array::operator () (const Object &value)
{
::Mysqlx::Datatypes::Any *any = add_value();
any->set_type(::Mysqlx::Datatypes::Any_Type_OBJECT);
any->mutable_obj()->CopyFrom(value);
return *this;
}
Any::Object::Scalar_fields::Scalar_fields(const std::string &key, const Scalar &value)
{
(*this)[key] = value;
}
Any::Object::Scalar_fields &Any::Object::Scalar_fields::operator () (const std::string &key, const Scalar &value)
{
(*this)[key] = value;
return *this;
}
Any::Object::Fields::Fields(const std::string &key, const Any &value)
{
(*this)[key] = value;
}
Any::Object::Fields &Any::Object::Fields::operator () (const std::string &key, const Any &value)
{
(*this)[key] = value;
return *this;
}
Any::Object::Object(const Scalar_fields &values)
{
for (Scalar_fields::const_iterator i = values.begin(); i != values.end(); ++i)
{
Mysqlx::Datatypes::Object_ObjectField *item = add_fld();
item->set_key(i->first);
item->set_allocated_value(new Any(i->second));
}
}
Object::Values::Values(const std::string &key, const Expr &value)
{
(*this)[key] = value;
}
Object::Values &Object::Values::operator() (const std::string &key, const Expr &value)
{
(*this)[key] = value;
return *this;
}
Any::Object::Object(const Fields &values)
{
for (Fields::const_iterator i = values.begin(); i != values.end(); ++i)
{
Mysqlx::Datatypes::Object_ObjectField *item = add_fld();
item->set_key(i->first);
item->mutable_value()->CopyFrom(i->second);
}
}
Object::Object(const std::string &key, Expr *value)
{
Mysqlx::Expr::Object_ObjectField *item = add_fld();
item->set_key(key);
item->set_allocated_value(value);
}
Object::Object(const std::string &key, const Expr &value)
{
Mysqlx::Expr::Object_ObjectField *item = add_fld();
item->set_key(key);
item->mutable_value()->CopyFrom(value);
}
Column::Column(const std::string &name, const std::string &alias)
{
if (!name.empty())
set_name(name);
if (!alias.empty())
set_alias(alias);
}
Column::Column(const Document_path &path,
const std::string &name, const std::string &alias)
{
mutable_document_path()->CopyFrom(path);
if (!name.empty())
set_name(name);
if (!alias.empty())
set_alias(alias);
}
Collection::Collection(const std::string &name, const std::string &schema)
{
if (!name.empty())
set_name(name);
if (!schema.empty())
set_schema(schema);
}
Projection::Projection(const Expr &source, const std::string &alias)
{
mutable_source()->CopyFrom(source);
if (!alias.empty())
set_alias(alias);
}
Order::Order(const Expr &expr, const ::Mysqlx::Crud::Order_Direction dir)
{
mutable_expr()->CopyFrom(expr);
set_direction(dir);
}
Limit::Limit(const uint64_t row_count, const uint64_t offset)
{
if (row_count > 0)
set_row_count(row_count);
if (offset > 0)
set_offset(offset);
}
} // namespace test
} // namespace xpl