File pl_struct_compile.cpp¶
File List > cubrid > src > sp > pl_struct_compile.cpp
Go to the documentation of this file
/*
*
* Copyright 2016 CUBRID Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include "pl_struct_compile.hpp"
#include "byte_order.h"
#include "connection_support.hpp"
#include "dbtype.h" /* db_value_* */
#include "method_struct_value.hpp"
#include "sp_constants.hpp"
// XXX: SHOULD BE THE LAST INCLUDE HEADER
#include "memory_wrapper.hpp"
namespace cubpl
{
// compile info
#define COMPILE_REQUEST_PACKER_ARGS() \
code, owner, mode
compile_request::compile_request ()
: code {}
, owner {}
, mode {}
{
//
}
void
compile_request::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (COMPILE_REQUEST_PACKER_ARGS ());
}
size_t
compile_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset,
COMPILE_REQUEST_PACKER_ARGS ());
}
void
compile_request::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (COMPILE_REQUEST_PACKER_ARGS ());
}
//
compile_response::compile_response ()
: err_code (-1)
, err_line (0)
, err_column (0)
{
//
}
void
compile_response::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (err_code);
if (err_code < 0)
{
serializator.pack_int (err_line);
serializator.pack_int (err_column);
serializator.pack_string (err_msg);
}
else
{
serializator.pack_string (translated_code);
serializator.pack_string (register_stmt);
serializator.pack_string (class_name);
serializator.pack_string (java_signature);
serializator.pack_int (compiled_type);
if (compiled_type >= 0)
{
serializator.pack_string (compiled_code);
}
int dependencies_size = (int) dependencies.size();
serializator.pack_int (dependencies_size);
for (int i = 0; i < dependencies_size; i++)
{
dependencies[i].pack (serializator);
}
}
}
size_t
compile_response::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // err_code
if (err_code < 0)
{
size += serializator.get_packed_int_size (size); // err_line
size += serializator.get_packed_int_size (size); // err_column
size += serializator.get_packed_string_size (err_msg, size); // err_msg
}
else
{
size += serializator.get_packed_string_size (translated_code, size); // translated_code
size += serializator.get_packed_string_size (register_stmt, size); // register_stmt
size += serializator.get_packed_string_size (class_name, size); // class_name
size += serializator.get_packed_string_size (java_signature, size); // java_signature
size += serializator.get_packed_int_size (size); // compiled_type
if (compiled_type >= 0)
{
size += serializator.get_packed_string_size (compiled_code, size); // compiled_code
}
size += serializator.get_packed_int_size (size); // size of dependencies
for (int i = 0; i < (int) dependencies.size(); i++)
{
dependencies[i].get_packed_size (serializator, size);
}
}
return size;
}
void
compile_response::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_int (err_code);
if (err_code < 0)
{
deserializator.unpack_int (err_line);
deserializator.unpack_int (err_column);
deserializator.unpack_string (err_msg);
}
else
{
deserializator.unpack_string (translated_code);
deserializator.unpack_string (register_stmt);
deserializator.unpack_string (class_name);
deserializator.unpack_string (java_signature);
deserializator.unpack_int (compiled_type);
if (compiled_type >= 0)
{
deserializator.unpack_string (compiled_code);
}
int dependencies_size = 0;
deserializator.unpack_int (dependencies_size);
if (dependencies_size > 0)
{
dependencies.resize (dependencies_size);
for (int i = 0; i < dependencies_size; i++)
{
dependencies[i].unpack (deserializator);
}
}
}
}
// plcsql_dependency
plcsql_dependency::plcsql_dependency () { }
void
plcsql_dependency::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (obj_type);
serializator.pack_string (obj_uniq_name);
}
size_t
plcsql_dependency::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // obj_type
size += serializator.get_packed_string_size (obj_uniq_name, size); // obj_uniq_name
return size;
}
void
plcsql_dependency::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_int (obj_type);
deserializator.unpack_string (obj_uniq_name);
}
// sql semantics
sql_semantics::sql_semantics ()
{
//
}
void
sql_semantics::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (idx);
serializator.pack_int (sql_type);
serializator.pack_string (rewritten_query);
if (sql_type >= 0)
{
serializator.pack_int (columns.size());
for (int i = 0; i < (int) columns.size(); i++)
{
columns[i].pack (serializator);
}
serializator.pack_int (hvs.size ());
for (int i = 0; i < (int) hvs.size(); i++)
{
hvs[i].pack (serializator);
}
serializator.pack_int (into_vars.size ());
for (int i = 0; i < (int) into_vars.size (); i++)
{
serializator.pack_string (into_vars[i]);
}
serializator.pack_int (dependencies.size ());
for (int i = 0; i < (int) dependencies.size(); i++)
{
dependencies[i].pack (serializator);
}
}
}
size_t
sql_semantics::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // idx
size += serializator.get_packed_int_size (size); // sql_type
size += serializator.get_packed_string_size (rewritten_query, size); // rewritten_query
if (sql_type >= 0)
{
size += serializator.get_packed_int_size (size); // num_columns
if (columns.size() > 0)
{
for (int i = 0; i < (int) columns.size(); i++)
{
size += columns[i].get_packed_size (serializator, size);
}
}
size += serializator.get_packed_int_size (size); // hvs size
if (hvs.size() > 0) // host variables
{
for (int i = 0; i < (int) hvs.size(); i++)
{
size += hvs[i].get_packed_size (serializator, size);
}
}
size += serializator.get_packed_int_size (size); // into_vars size
if (into_vars.size() > 0) // into variables
{
for (int i = 0; i < (int) into_vars.size (); i++)
{
size += serializator.get_packed_string_size (into_vars[i], size);
}
}
size += serializator.get_packed_int_size (size); // dependencies size
if (dependencies.size() > 0) // dependencies
{
for (int i = 0; i < (int) dependencies.size(); i++)
{
size += dependencies[i].get_packed_size (serializator, size);
}
}
}
return size;
}
void
sql_semantics::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_int (idx);
deserializator.unpack_int (sql_type);
if (sql_type >= 0)
{
int column_size = 0;
deserializator.unpack_int (column_size);
if (column_size > 0)
{
columns.resize (column_size);
for (int i = 0; i < (int) column_size; i++)
{
columns[i].unpack (deserializator);
}
}
int hv_size = 0;
deserializator.unpack_int (hv_size);
if (hv_size > 0)
{
hvs.resize (hv_size);
for (int i = 0; i < (int) hv_size; i++)
{
hvs[i].unpack (deserializator);
}
}
std::string s;
int into_vars_size = 0;
deserializator.unpack_int (into_vars_size);
for (int i = 0; i < into_vars_size; i++)
{
deserializator.unpack_string (s);
into_vars.push_back (s);
}
int dependencies_size = 0;
deserializator.unpack_int (dependencies_size);
if (dependencies_size > 0)
{
dependencies.resize (dependencies_size);
for (int i = 0; i < (int) dependencies_size; i++)
{
dependencies[i].unpack (deserializator);
}
}
}
}
sql_semantics_request::sql_semantics_request ()
{
code = METHOD_CALLBACK_GET_SQL_SEMANTICS;
}
void
sql_semantics_request::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (code);
serializator.pack_int (sqls.size ());
for (int i = 0; i < (int) sqls.size (); i++)
{
serializator.pack_string (sqls[i]);
}
}
size_t
sql_semantics_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // code
size += serializator.get_packed_int_size (size); // size
for (int i = 0; i < (int) sqls.size (); i++)
{
size += serializator.get_packed_string_size (sqls[i], size);
}
return size;
}
void
sql_semantics_request::unpack (cubpacking::unpacker &deserializator)
{
code = METHOD_CALLBACK_GET_SQL_SEMANTICS;
int size;
deserializator.unpack_int (size);
if (size != 1)
{
// current implementation only asks one by one.
er_log_debug (ARG_FILE_LINE, "note: size of SQL semantics request %d\n", size);
}
std::string s;
for (int i = 0; i < size; i++)
{
deserializator.unpack_string (s);
sqls.push_back (s);
}
}
void
sql_semantics_response::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (semantics.size ());
for (int i = 0; i < (int) semantics.size (); i++)
{
semantics[i].pack (serializator);
}
}
size_t
sql_semantics_response::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // sizes
for (int i = 0; i < (int) semantics.size (); i++)
{
size += semantics[i].get_packed_size (serializator, size);
}
return size;
}
void
sql_semantics_response::unpack (cubpacking::unpacker &deserializator)
{
//
}
pl_parameter_info::pl_parameter_info ()
: mode (0)
, name ("?")
, type (DB_TYPE_NULL)
, precision (0)
, scale (0)
, charset (0)
, has_default (0)
{
db_make_null (&value);
}
pl_parameter_info::~pl_parameter_info ()
{
// value is create by pt_value_to_db ()
// it doesn't have to call db_value_clear ()
}
void
pl_parameter_info::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (mode);
serializator.pack_string (name);
serializator.pack_int (type);
serializator.pack_int (precision);
serializator.pack_int (scale);
serializator.pack_int (charset);
serializator.pack_int (has_default);
if (!DB_IS_NULL (&value))
{
cubmethod::dbvalue_java sp_val;
serializator.pack_int (1);
sp_val.value = (DB_VALUE *) &value;
sp_val.pack (serializator);
}
else
{
serializator.pack_int (0);
}
}
size_t
pl_parameter_info::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // mode
size += serializator.get_packed_string_size (name, size);
size += serializator.get_packed_int_size (size); // type
size += serializator.get_packed_int_size (size); // precision
size += serializator.get_packed_int_size (size); // scale
size += serializator.get_packed_int_size (size); // charset
size += serializator.get_packed_int_size (size); // has_default
size += serializator.get_packed_int_size (size); // value is null
if (!DB_IS_NULL (&value))
{
cubmethod::dbvalue_java sp_val;
sp_val.value = (DB_VALUE *) &value;
size += sp_val.get_packed_size (serializator, size);
}
return size;
}
void
pl_parameter_info::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_int (mode);
deserializator.unpack_string (name);
deserializator.unpack_int (type);
deserializator.unpack_int (precision);
deserializator.unpack_int (scale);
deserializator.unpack_int (charset);
deserializator.unpack_int (has_default);
int value_is_null;
deserializator.unpack_int (value_is_null);
if (value_is_null == 1)
{
cubmethod::dbvalue_java value_unpacker;
value_unpacker.value = &value;
value_unpacker.unpack (deserializator);
}
else
{
db_make_null (&value);
}
}
// global semantics
#define GLOBAL_SEMANTICS_QUESTION_PACKER_ARGS() \
type, name
#define GLOBAL_SEMANTICS_REQUEST_PACKER_ARGS() \
qsqs
void
global_semantics_question::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (GLOBAL_SEMANTICS_QUESTION_PACKER_ARGS());
}
size_t
global_semantics_question::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset, GLOBAL_SEMANTICS_QUESTION_PACKER_ARGS ());
}
void
global_semantics_question::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_QUESTION_PACKER_ARGS ());
}
void
global_semantics_request::pack (cubpacking::packer &serializator) const
{
serializator.pack_int (code);
serializator.pack_all (GLOBAL_SEMANTICS_REQUEST_PACKER_ARGS());
}
global_semantics_request::global_semantics_request ()
: code (METHOD_CALLBACK_GET_GLOBAL_SEMANTICS)
{
//
}
size_t
global_semantics_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_int_size (start_offset); // code
size += serializator.get_all_packed_size_starting_offset (size, GLOBAL_SEMANTICS_REQUEST_PACKER_ARGS ());
return size;
}
void
global_semantics_request::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_REQUEST_PACKER_ARGS ());
}
#define GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS() \
idx, err_id, err_msg
#define GLOBAL_SEMANTICS_RESPONSE_UDPF_PACKER_ARGS() \
GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS(), ret, args
#define GLOBAL_SEMANTICS_RESPONSE_SERIAL_PACKER_ARGS() \
GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS()
#define GLOBAL_SEMANTICS_RESPONSE_COLUMN_PACKER_ARGS() \
GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS(), c_info
global_semantics_response_common::global_semantics_response_common ()
: idx (-1)
, err_id (0)
, err_msg {}
{
//
}
void
global_semantics_response_common::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS());
}
size_t
global_semantics_response_common::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset, GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS ());
}
void
global_semantics_response_common::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_RESPONSE_COMMON_PACKER_ARGS ());
}
global_semantics_response_udpf::global_semantics_response_udpf ()
: ret ()
, args {}
{
//
}
void
global_semantics_response_udpf::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (GLOBAL_SEMANTICS_RESPONSE_UDPF_PACKER_ARGS());
}
size_t
global_semantics_response_udpf::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset,
GLOBAL_SEMANTICS_RESPONSE_UDPF_PACKER_ARGS ());
}
void
global_semantics_response_udpf::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_RESPONSE_UDPF_PACKER_ARGS ());
}
void
global_semantics_response_serial::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (GLOBAL_SEMANTICS_RESPONSE_SERIAL_PACKER_ARGS());
}
size_t
global_semantics_response_serial::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset, GLOBAL_SEMANTICS_RESPONSE_SERIAL_PACKER_ARGS ());
}
void
global_semantics_response_serial::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_RESPONSE_SERIAL_PACKER_ARGS ());
}
global_semantics_response_column::global_semantics_response_column ()
: c_info ()
{
//
}
void
global_semantics_response_column::pack (cubpacking::packer &serializator) const
{
serializator.pack_all (GLOBAL_SEMANTICS_RESPONSE_COLUMN_PACKER_ARGS());
}
size_t
global_semantics_response_column::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
return serializator.get_all_packed_size_starting_offset (start_offset, GLOBAL_SEMANTICS_RESPONSE_COLUMN_PACKER_ARGS ());
}
void
global_semantics_response_column::unpack (cubpacking::unpacker &deserializator)
{
deserializator.unpack_all (GLOBAL_SEMANTICS_RESPONSE_COLUMN_PACKER_ARGS ());
}
void
global_semantics_response::pack (cubpacking::packer &serializator) const
{
serializator.pack_bigint (qs.size ());
for (const auto &res : qs)
{
res->pack (serializator);
}
}
size_t
global_semantics_response::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
{
size_t size = serializator.get_packed_bigint_size (start_offset); // size
for (const auto &res : qs)
{
size += res->get_packed_size (serializator, size);
}
return size;
}
void
global_semantics_response::unpack (cubpacking::unpacker &deserializator)
{
//
assert (false);
}
}