Skip to content

File method_struct_oid_info.cpp

File List > cubrid > src > method > method_struct_oid_info.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 "method_struct_oid_info.hpp"

#include "oid.h"
#include "dbtype.h"
#include "method_struct_value.hpp"
// XXX: SHOULD BE THE LAST INCLUDE HEADER
#include "memory_wrapper.hpp"

namespace cubmethod
{

// OID GET

  oid_get_request::oid_get_request ()
  {
    oid = OID_INITIALIZER;
  }

  void
  oid_get_request::pack (cubpacking::packer &serializator) const
  {
    serializator.pack_oid (oid);
    serializator.pack_int (attr_names.size());

    for (int i = 0; i < (int) attr_names.size(); i++)
      {
    serializator.pack_string (attr_names[i]);
      }
  }

  void
  oid_get_request::unpack (cubpacking::unpacker &deserializator)
  {
    deserializator.unpack_oid (oid);

    int num_attr_name;
    deserializator.unpack_int (num_attr_name);
    if (num_attr_name > 0)
      {
    attr_names.resize (num_attr_name);
    for (int i = 0; i < (int) num_attr_name; i++)
      {
        deserializator.unpack_string (attr_names[i]);
      }
      }
  }

  size_t
  oid_get_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
  {
    size_t size = serializator.get_packed_oid_size (start_offset);
    size += serializator.get_packed_int_size (size); // attr_names.size()
    if (attr_names.size() > 0)
      {
    for (int i = 0; i < (int) attr_names.size(); i++)
      {
        size += serializator.get_packed_string_size (attr_names[i], size);
      }
      }

    return size;
  }

  oid_get_info::~oid_get_info ()
  {
    for (int i = 0; i < (int) db_values.size(); i++)
      {
    db_value_clear (&db_values[i]);
      }
  }

  void
  oid_get_info::pack (cubpacking::packer &serializator) const
  {
    serializator.pack_string (class_name);
    serializator.pack_int (attr_names.size());
    for (int i = 0; i < (int) attr_names.size(); i++)
      {
    serializator.pack_string (attr_names[i]);
      }

    serializator.pack_int (db_values.size());
    dbvalue_java sp_val;
    for (int i = 0; i < (int) db_values.size(); i++)
      {
    sp_val.value = (DB_VALUE *) &db_values[i];
    sp_val.pack (serializator);
      }

    serializator.pack_int (column_infos.size());
    for (int i = 0; i < (int) column_infos.size(); i++)
      {
    column_infos[i].pack (serializator);
      }
  }

  void
  oid_get_info::unpack (cubpacking::unpacker &deserializator)
  {
    deserializator.unpack_string (class_name);

    int num_attr_name;
    deserializator.unpack_int (num_attr_name);
    if (num_attr_name > 0)
      {
    attr_names.resize (num_attr_name);
    for (int i = 0; i < (int) num_attr_name; i++)
      {
        deserializator.unpack_string (attr_names[i]);
      }
      }

    int num_db_values;
    deserializator.unpack_int (num_db_values);
    if (num_db_values > 0)
      {
    db_values.resize (num_db_values);
    dbvalue_java sp_val;
    for (int i = 0; i < (int) num_db_values; i++)
      {
        sp_val.value = &db_values[i];
        sp_val.unpack (deserializator);
      }
      }

    int num_column_info;
    deserializator.unpack_int (num_column_info);
    if (num_column_info > 0)
      {
    column_infos.resize (num_column_info);
    for (int i = 0; i < (int) num_column_info; i++)
      {
        column_infos[i].unpack (deserializator);
      }
      }
  }

  size_t
  oid_get_info::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
  {
    size_t size = serializator.get_packed_string_size (class_name, start_offset); // class_name

    size += serializator.get_packed_int_size (size); // attr_names.size()
    if (attr_names.size() > 0)
      {
    for (int i = 0; i < (int) attr_names.size(); i++)
      {
        size += serializator.get_packed_string_size (attr_names[i], size);
      }
      }

    size += serializator.get_packed_int_size (size); // db_values.size()
    if (db_values.size() > 0)
      {
    dbvalue_java sp_val;
    for (int i = 0; i < (int) db_values.size(); i++)
      {
        sp_val.value = (DB_VALUE *) &db_values[i];
        size += sp_val.get_packed_size (serializator, size);
      }
      }

    size += serializator.get_packed_int_size (size); // column_infos.size();
    if (column_infos.size() > 0)
      {
    for (int i = 0; i < (int) column_infos.size(); i++)
      {
        size += column_infos[i].get_packed_size (serializator, size);
      }
      }

    return size;
  }

// OID PUT

  oid_put_request::oid_put_request ()
  {
    oid = OID_INITIALIZER;
    is_compatible_java = false;
  }

  oid_put_request::~oid_put_request()
  {
    for (int i = 0; i < (int) db_values.size(); i++)
      {
    db_value_clear (&db_values[i]);
      }
  }

  void
  oid_put_request::pack (cubpacking::packer &serializator) const
  {
    serializator.pack_oid (oid);
    serializator.pack_int (attr_names.size());

    if (is_compatible_java)
      {
    dbvalue_java sp_val;
    for (int i = 0; i < (int) attr_names.size(); i++)
      {
        serializator.pack_string (attr_names[i]);
        sp_val.value = (DB_VALUE *) &db_values[i];
        sp_val.pack (serializator);
      }
      }
    else
      {
    for (int i = 0; i < (int) attr_names.size(); i++)
      {
        serializator.pack_string (attr_names[i]);
        serializator.pack_db_value (db_values[i]);
      }
      }
  }

  void
  oid_put_request::unpack (cubpacking::unpacker &deserializator)
  {
    deserializator.unpack_oid (oid);

    int num_attr_name;
    deserializator.unpack_int (num_attr_name);
    if (num_attr_name > 0)
      {
    attr_names.resize (num_attr_name);
    db_values.resize (num_attr_name);
    if (is_compatible_java)
      {
        dbvalue_java sp_val;
        for (int i = 0; i < (int) num_attr_name; i++)
          {
        deserializator.unpack_string (attr_names[i]);
        sp_val.value = &db_values[i];
        sp_val.unpack (deserializator);
          }
      }
    else
      {
        for (int i = 0; i < (int) num_attr_name; i++)
          {
        deserializator.unpack_string (attr_names[i]);
        deserializator.unpack_db_value (db_values[i]);
          }
      }
      }
  }

  size_t
  oid_put_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
  {

    size_t size = serializator.get_packed_oid_size (start_offset);
    size += serializator.get_packed_int_size (size); // attr_names.size()
    if (attr_names.size() > 0)
      {
    if (is_compatible_java)
      {
        dbvalue_java sp_val;
        for (int i = 0; i < (int) attr_names.size(); i++)
          {
        size += serializator.get_packed_string_size (attr_names[i], size);
        sp_val.value = (DB_VALUE *) &db_values[i];
        size += sp_val.get_packed_size (serializator, size);
          }
      }
    else
      {
        for (int i = 0; i < (int) attr_names.size(); i++)
          {
        size += serializator.get_packed_string_size (attr_names[i], size);
        size += serializator.get_packed_db_value_size (db_values[i], size);
          }
      }
      }
    return size;
  }

// COLLECTION COMMAND

  collection_cmd_request::collection_cmd_request ()
  {
    oid = OID_INITIALIZER;
    index = -1;
  }

  collection_cmd_request::~collection_cmd_request()
  {
    db_value_clear (&value);
  }

  void
  collection_cmd_request::pack (cubpacking::packer &serializator) const
  {
    serializator.pack_int (command);
    serializator.pack_oid (oid);
    serializator.pack_int (index);
    serializator.pack_string (attr_name);

    if (is_compatible_java)
      {
    dbvalue_java sp_val;
    sp_val.value = (DB_VALUE *) &value;
    sp_val.pack (serializator);
      }
    else
      {
    serializator.pack_db_value (value);
      }
  }

  void
  collection_cmd_request::unpack (cubpacking::unpacker &deserializator)
  {
    deserializator.unpack_int (command);
    deserializator.unpack_oid (oid);
    deserializator.unpack_int (index);
    deserializator.unpack_string (attr_name);

    if (is_compatible_java)
      {
    dbvalue_java sp_val;
    sp_val.value = (DB_VALUE *) &value;
    sp_val.unpack (deserializator);
      }
    else
      {
    deserializator.unpack_db_value (value);
      }
  }

  size_t
  collection_cmd_request::get_packed_size (cubpacking::packer &serializator, std::size_t start_offset) const
  {
    size_t size = serializator.get_packed_int_size (start_offset); // command
    size += serializator.get_packed_oid_size (size); // oid
    size += serializator.get_packed_int_size (size); // index
    size += serializator.get_packed_string_size (attr_name, size);

    if (is_compatible_java)
      {
    dbvalue_java sp_val;
    sp_val.value = (DB_VALUE *) &value;
    size += sp_val.get_packed_size (serializator, size);
      }
    else
      {
    size += serializator.get_packed_db_value_size (value, size);
      }

    return size;
  }
}