523 lines
11 KiB
C++
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
|