456 lines
10 KiB
C++
456 lines
10 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 */
|
|
|
|
#ifndef _XPL_MYSQLX_PB_WRAPPER_H_
|
|
#define _XPL_MYSQLX_PB_WRAPPER_H_
|
|
|
|
#include "ngs_common/protocol_protobuf.h"
|
|
#include <string>
|
|
|
|
|
|
namespace xpl
|
|
{
|
|
|
|
namespace test
|
|
{
|
|
|
|
class Operator;
|
|
class FunctionCall;
|
|
class Object;
|
|
class Array;
|
|
|
|
|
|
class Identifier : public Mysqlx::Expr::Identifier
|
|
{
|
|
public:
|
|
Identifier(const std::string &name = "", const std::string &schema_name = "");
|
|
};
|
|
|
|
|
|
typedef ::Mysqlx::Expr::DocumentPathItem Document_path_item;
|
|
|
|
|
|
class Document_path
|
|
: public ::google::protobuf::RepeatedPtrField<Document_path_item>
|
|
{
|
|
public:
|
|
class Path
|
|
: private std::vector<std::pair<Document_path_item::Type, std::string> >
|
|
{
|
|
public:
|
|
Path() {}
|
|
explicit Path(const std::string &value);
|
|
Path &add_member(const std::string &value);
|
|
Path &add_index(int index);
|
|
Path &add_asterisk();
|
|
Path &add_double_asterisk();
|
|
friend class Document_path;
|
|
};
|
|
|
|
Document_path(const Path &path);
|
|
};
|
|
|
|
|
|
class ColumnIdentifier : public Mysqlx::Expr::ColumnIdentifier
|
|
{
|
|
public:
|
|
ColumnIdentifier(const std::string &name = "",
|
|
const std::string &table_name = "",
|
|
const std::string &schema_name = "",
|
|
const Document_path::Path *path = NULL);
|
|
ColumnIdentifier(const Document_path &path,
|
|
const std::string &name = "",
|
|
const std::string &table_name = "",
|
|
const std::string &schema_name = "");
|
|
};
|
|
|
|
|
|
class Scalar : public Mysqlx::Datatypes::Scalar
|
|
{
|
|
public:
|
|
struct Null { };
|
|
|
|
struct String : public Mysqlx::Datatypes::Scalar_String
|
|
{
|
|
String(const std::string &value);
|
|
};
|
|
|
|
struct Octets : public Mysqlx::Datatypes::Scalar_Octets
|
|
{
|
|
Octets(const std::string &value, unsigned type);
|
|
};
|
|
|
|
Scalar() {}
|
|
Scalar(int value);
|
|
Scalar(unsigned int value);
|
|
Scalar(bool value);
|
|
Scalar(float value);
|
|
Scalar(double value);
|
|
Scalar(const char *value, unsigned type = 0);
|
|
Scalar(Scalar::Octets *value);
|
|
Scalar(const Scalar::Octets &value);
|
|
Scalar(Scalar::String *value);
|
|
Scalar(const Scalar::String &value);
|
|
Scalar(Null value);
|
|
};
|
|
|
|
|
|
class Any : public Mysqlx::Datatypes::Any
|
|
{
|
|
public:
|
|
class Object;
|
|
class Array : public Mysqlx::Datatypes::Array
|
|
{
|
|
public:
|
|
class Scalar_values : private std::vector<Scalar>
|
|
{
|
|
public:
|
|
Scalar_values() {}
|
|
Scalar_values &operator () (const Scalar &value);
|
|
friend class Array;
|
|
};
|
|
|
|
Array(const Scalar_values &values);
|
|
Array(const Scalar &value);
|
|
Array(const Object &value);
|
|
Array &operator () (const Scalar &value);
|
|
Array &operator () (const Object &value);
|
|
Array() {}
|
|
};
|
|
|
|
|
|
class Object : public Mysqlx::Datatypes::Object
|
|
{
|
|
public:
|
|
class Scalar_fields : private std::map<std::string, Scalar>
|
|
{
|
|
public:
|
|
Scalar_fields() {}
|
|
Scalar_fields(const std::string &key, const Scalar &value);
|
|
Scalar_fields &operator () (const std::string &key, const Scalar &value);
|
|
friend class Object;
|
|
};
|
|
|
|
class Fields : private std::map<std::string, Any>
|
|
{
|
|
public:
|
|
Fields() {}
|
|
Fields(const std::string &key, const Any &value);
|
|
Fields &operator () (const std::string &key, const Any &value);
|
|
friend class Object;
|
|
};
|
|
|
|
Object(const Scalar_fields &values);
|
|
Object(const Fields &values);
|
|
Object() {}
|
|
};
|
|
|
|
Any() {}
|
|
Any(Scalar *scalar);
|
|
Any(const Scalar &scalar);
|
|
Any(const Object &obj);
|
|
Any(const Array &array);
|
|
};
|
|
|
|
|
|
class Placeholder
|
|
{
|
|
public:
|
|
explicit Placeholder(const ::google::protobuf::uint32 v) : value(v) {}
|
|
const ::google::protobuf::uint32 value;
|
|
};
|
|
|
|
|
|
class Variable
|
|
{
|
|
public:
|
|
Variable(const std::string &name) : value(name) {}
|
|
const std::string value;
|
|
};
|
|
|
|
|
|
class Expr : public Mysqlx::Expr::Expr
|
|
{
|
|
public:
|
|
Expr() {}
|
|
|
|
template<typename T>
|
|
Expr(T value)
|
|
{
|
|
Expr::initialize(*this, value);
|
|
}
|
|
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Scalar &value);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, Operator *oper);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Operator &oper);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Identifier &ident);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, FunctionCall *func);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const FunctionCall &func);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, ColumnIdentifier *id);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const ColumnIdentifier &id);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, Object *obj);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Object &obj);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, Array *arr);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Array &arr);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Placeholder &ph);
|
|
static void initialize(Mysqlx::Expr::Expr &expr, const Variable &var);
|
|
};
|
|
|
|
|
|
class Operator : public Mysqlx::Expr::Operator
|
|
{
|
|
public:
|
|
Operator(const std::string &name)
|
|
{
|
|
set_name(name);
|
|
}
|
|
|
|
template<typename T1>
|
|
Operator(const std::string &name, T1 param1)
|
|
{
|
|
set_name(name);
|
|
add_param(param1);
|
|
}
|
|
|
|
template<typename T1, typename T2>
|
|
Operator(const std::string &name, T1 param1, T2 param2)
|
|
{
|
|
set_name(name);
|
|
add_param(param1);
|
|
add_param(param2);
|
|
}
|
|
|
|
template<typename T1, typename T2, typename T3>
|
|
Operator(const std::string &name, T1 param1, T2 param2, T3 param3)
|
|
{
|
|
set_name(name);
|
|
add_param(param1);
|
|
add_param(param2);
|
|
add_param(param3);
|
|
}
|
|
|
|
template<typename T1, typename T2, typename T3, typename T4>
|
|
Operator(const std::string &name, T1 param1, T2 param2, T3 param3, T4 param4)
|
|
{
|
|
set_name(name);
|
|
add_param(param1);
|
|
add_param(param2);
|
|
add_param(param3);
|
|
add_param(param4);
|
|
}
|
|
|
|
void add_param(Expr *value)
|
|
{
|
|
mutable_param()->AddAllocated(value);
|
|
}
|
|
|
|
void add_param(const Expr &value)
|
|
{
|
|
mutable_param()->Add()->CopyFrom(value);
|
|
}
|
|
};
|
|
|
|
|
|
class FunctionCall : public Mysqlx::Expr::FunctionCall
|
|
{
|
|
public:
|
|
FunctionCall(Identifier *name)
|
|
{
|
|
set_allocated_name(name);
|
|
}
|
|
|
|
FunctionCall(const Identifier &name)
|
|
{
|
|
mutable_name()->CopyFrom(name);
|
|
}
|
|
|
|
template<typename T1>
|
|
FunctionCall(Identifier *name, T1 param1)
|
|
{
|
|
initialize(name, param1);
|
|
}
|
|
|
|
template<typename T1, typename T2>
|
|
FunctionCall(Identifier *name, T1 param1, T2 param2)
|
|
{
|
|
initialize(name, param1);
|
|
add_param(param2);
|
|
}
|
|
|
|
FunctionCall(const std::string &name)
|
|
{
|
|
set_allocated_name(new Identifier(name));
|
|
}
|
|
|
|
template<typename T1>
|
|
FunctionCall(const Identifier &name, T1 param1)
|
|
{
|
|
mutable_name()->CopyFrom(name);
|
|
add_param(param1);
|
|
}
|
|
|
|
template<typename T1, typename T2>
|
|
FunctionCall(const Identifier &name, T1 param1, T2 param2)
|
|
{
|
|
mutable_name()->CopyFrom(name);
|
|
add_param(param1);
|
|
add_param(param2);
|
|
}
|
|
|
|
template<typename T1, typename T2, typename T3>
|
|
FunctionCall(const Identifier &name, T1 param1, T2 param2, T3 param3)
|
|
{
|
|
mutable_name()->CopyFrom(name);
|
|
add_param(param1);
|
|
add_param(param2);
|
|
add_param(param3);
|
|
}
|
|
|
|
template<typename T1>
|
|
FunctionCall(const std::string &name, T1 param1)
|
|
{
|
|
initialize(new Identifier(name), param1);
|
|
}
|
|
|
|
template<typename T1, typename T2>
|
|
FunctionCall(const std::string &name, T1 param1, T2 param2)
|
|
{
|
|
initialize(new Identifier(name), param1);
|
|
add_param(param2);
|
|
}
|
|
|
|
template<typename T1, typename T2, typename T3>
|
|
FunctionCall(const std::string &name, T1 param1, T2 param2, T3 param3)
|
|
{
|
|
initialize(new Identifier(name), param1);
|
|
add_param(param2);
|
|
add_param(param3);
|
|
}
|
|
|
|
private:
|
|
template<typename T1>
|
|
void initialize(Identifier *name, T1 param1)
|
|
{
|
|
set_allocated_name(name);
|
|
add_param(param1);
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
void add_param(T value)
|
|
{
|
|
Expr::initialize(*Mysqlx::Expr::FunctionCall::add_param(), value);
|
|
}
|
|
|
|
void add_param(Expr *value)
|
|
{
|
|
mutable_param()->AddAllocated(value);
|
|
}
|
|
};
|
|
|
|
|
|
class Object : public Mysqlx::Expr::Object
|
|
{
|
|
public:
|
|
class Values : private std::map<std::string, Expr>
|
|
{
|
|
public:
|
|
Values() {}
|
|
Values(const std::string &key, const Expr &value);
|
|
Values &operator() (const std::string &key, const Expr &value);
|
|
friend class Object;
|
|
};
|
|
|
|
Object(const Values &values);
|
|
Object() {}
|
|
Object(const std::string &key, Expr *value);
|
|
Object(const std::string &key, const Expr &value);
|
|
};
|
|
|
|
|
|
class Array : public Mysqlx::Expr::Array
|
|
{
|
|
public:
|
|
Array() {}
|
|
|
|
template<int size>
|
|
Array(Expr (&values)[size])
|
|
{
|
|
for (Expr *i = values; i != values+size; ++i)
|
|
mutable_value()->Add()->CopyFrom(*i);
|
|
}
|
|
};
|
|
|
|
|
|
class Column: public ::Mysqlx::Crud::Column
|
|
{
|
|
public:
|
|
Column(const std::string &name, const std::string &alias = "");
|
|
Column(const Document_path &path,
|
|
const std::string &name = "", const std::string &alias = "");
|
|
};
|
|
|
|
|
|
class Collection : public ::Mysqlx::Crud::Collection
|
|
{
|
|
public:
|
|
Collection(const std::string &name, const std::string &schema = "");
|
|
};
|
|
|
|
|
|
typedef ::Mysqlx::Crud::DataModel Data_model;
|
|
|
|
|
|
class Projection : public ::Mysqlx::Crud::Projection
|
|
{
|
|
public:
|
|
Projection(const Expr &source, const std::string &alias = "");
|
|
};
|
|
|
|
|
|
class Order : public ::Mysqlx::Crud::Order
|
|
{
|
|
public:
|
|
Order(const Expr &expr, const ::Mysqlx::Crud::Order_Direction dir = ::Mysqlx::Crud::Order_Direction_ASC);
|
|
};
|
|
|
|
|
|
class Limit : public ::Mysqlx::Crud::Limit
|
|
{
|
|
public:
|
|
Limit(const uint64_t row_count = 0, const uint64_t offset = 0);
|
|
};
|
|
|
|
|
|
template<typename B, typename T>
|
|
class RepeatedPtrField : public ::google::protobuf::RepeatedPtrField<B>
|
|
{
|
|
public:
|
|
RepeatedPtrField() {}
|
|
RepeatedPtrField(const T &arg) { add(arg); }
|
|
RepeatedPtrField &operator()(const T &arg) { return add(arg); }
|
|
RepeatedPtrField &add(const T &arg) { *this->Add() = arg; return *this; }
|
|
};
|
|
|
|
typedef RepeatedPtrField<Mysqlx::Datatypes::Scalar, Scalar> Expression_args;
|
|
typedef RepeatedPtrField<Mysqlx::Crud::Order, Order> Order_list;
|
|
typedef Expr Filter;
|
|
|
|
} // namespace test
|
|
} // namespace xpl
|
|
|
|
|
|
#endif // _XPL_MYSQLX_PB_WRAPPER_H_
|