mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-04-18 21:44:02 +03:00
Part 1: As part of MCOL-3776 to address synchronization issue while accessing the fTimeZone member of the Func class, mutex locks were added to the accessor and mutator methods. However, this slows down processing of TIMESTAMP columns in PrimProc significantly as all threads across all concurrently running queries would serialize on the mutex. This is because PrimProc only has a single global object for the functor class (class derived from Func in utils/funcexp/functor.h) for a given function name. To fix this problem: (1) We remove the fTimeZone as a member of the Func derived classes (hence removing the mutexes) and instead use the fOperationType member of the FunctionColumn class to propagate the timezone values down to the individual functor processing functions such as FunctionColumn::getStrVal(), FunctionColumn::getIntVal(), etc. (2) To achieve (1), a timezone member is added to the execplan::CalpontSystemCatalog::ColType class. Part 2: Several functors in the Funcexp code call dataconvert::gmtSecToMySQLTime() and dataconvert::mySQLTimeToGmtSec() functions for conversion between seconds since unix epoch and broken-down representation. These functions in turn call the C library function localtime_r() which currently has a known bug of holding a global lock via a call to __tz_convert. This significantly reduces performance in multi-threaded applications where multiple threads concurrently call localtime_r(). More details on the bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16145 This bug in localtime_r() caused processing of the Functors in PrimProc to slowdown significantly since a query execution causes Functors code to be processed in a multi-threaded manner. As a fix, we remove the calls to localtime_r() from gmtSecToMySQLTime() and mySQLTimeToGmtSec() by performing the timezone-to-offset conversion (done in dataconvert::timeZoneToOffset()) during the execution plan creation in the plugin. Note that localtime_r() is only called when the time_zone system variable is set to "SYSTEM". This fix also required changing the timezone type from a std::string to a long across the system.
1765 lines
37 KiB
C++
1765 lines
37 KiB
C++
/* Copyright (C) 2014 InfiniDB, Inc.
|
|
|
|
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 Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
/***********************************************************************
|
|
* $Id: serialize.cpp 9210 2013-01-21 14:10:42Z rdempsey $
|
|
*
|
|
*
|
|
***********************************************************************/
|
|
|
|
#include <stdexcept>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
#include "brmtypes.h"
|
|
|
|
#define DDLPKG_DLLEXPORT
|
|
#include "ddlpkg.h"
|
|
#undef DDLPKG_DLLEXPORT
|
|
|
|
using namespace messageqcpp;
|
|
using namespace std;
|
|
using namespace ddlpackage;
|
|
|
|
template <class T>
|
|
void write_vec(vector<T*>& v, ByteStream& bs)
|
|
{
|
|
bs << (quadbyte)v.size();
|
|
typename vector<T*>::const_iterator itr;
|
|
|
|
for (itr = v.begin(); itr != v.end(); ++itr)
|
|
(*itr)->serialize(bs);
|
|
}
|
|
|
|
template <class T>
|
|
void read_vec(vector<T*>& v, ByteStream& bs)
|
|
{
|
|
T* x;
|
|
quadbyte count;
|
|
bs >> count;
|
|
|
|
while (count--)
|
|
{
|
|
x = new T;
|
|
x->unserialize(bs);
|
|
v.push_back(x);
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// CreateTableStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int CreateTableStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fTableDef = new TableDef();
|
|
fTableDef->unserialize(bytestream);
|
|
bytestream >> fSessionID;
|
|
bytestream >> fSql;
|
|
bytestream >> fOwner;
|
|
bytestream >> fTableWithAutoi;
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int CreateTableStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_CREATE_TABLE_STATEMENT;
|
|
|
|
// write table def
|
|
fTableDef->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write the original ddl statement.
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema).
|
|
bytestream << fOwner;
|
|
|
|
bytestream << fTableWithAutoi;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AlterTableStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AlterTableStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
AlterTableAction* ata;
|
|
messageqcpp::ByteStream::quadbyte type;
|
|
|
|
fTableName = new QualifiedName();
|
|
|
|
// read table name
|
|
fTableName->unserialize(bytestream);
|
|
|
|
messageqcpp::ByteStream::octbyte timeZone;
|
|
bytestream >> timeZone;
|
|
fTimeZone = timeZone;
|
|
|
|
// read alter action list
|
|
quadbyte action_count;
|
|
bytestream >> action_count;
|
|
|
|
for (unsigned int i = 0; i < action_count; i++)
|
|
{
|
|
// read action type
|
|
bytestream >> type;
|
|
|
|
switch (type)
|
|
{
|
|
case DDL_ATA_ADD_COLUMN:
|
|
ata = new AtaAddColumn();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_ADD_COLUMNS:
|
|
ata = new AtaAddColumns();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_DROP_COLUMN:
|
|
ata = new AtaDropColumn();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_DROP_COLUMNS:
|
|
ata = new AtaDropColumns();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_ADD_TABLE_CONSTRAINT:
|
|
ata = new AtaAddTableConstraint();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_SET_COLUMN_DEFAULT:
|
|
ata = new AtaSetColumnDefault();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_DROP_COLUMN_DEFAULT:
|
|
ata = new AtaDropColumnDefault();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_DROP_TABLE_CONSTRAINT:
|
|
ata = new AtaDropTableConstraint();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_RENAME_TABLE:
|
|
ata = new AtaRenameTable();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_RENAME_COLUMN:
|
|
ata = new AtaRenameColumn();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_MODIFY_COLUMN_TYPE:
|
|
ata = new AtaModifyColumnType();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
case DDL_ATA_TABLE_COMMENT:
|
|
ata = new AtaTableComment();
|
|
ata->unserialize(bytestream);
|
|
fActions.push_back(ata);
|
|
break;
|
|
|
|
default: throw("Bad typecode for AlterTableAction"); break;
|
|
}
|
|
|
|
bytestream >> fSessionID;
|
|
bytestream >> fSql;
|
|
bytestream >> fOwner;
|
|
bytestream >> fTableWithAutoi;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AlterTableStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ALTER_TABLE_STATEMENT;
|
|
|
|
// write table name
|
|
fTableName->serialize(bytestream);
|
|
|
|
messageqcpp::ByteStream::octbyte timeZone = fTimeZone;
|
|
bytestream << timeZone;
|
|
|
|
write_vec<AlterTableAction>(fActions, bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl statement.
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema).
|
|
bytestream << fOwner;
|
|
|
|
bytestream << fTableWithAutoi;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// CreateIndexStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int CreateIndexStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read the index and schema name
|
|
fIndexName = new QualifiedName();
|
|
fIndexName->unserialize(bytestream);
|
|
|
|
// read the table and schema name
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
quadbyte column_count;
|
|
bytestream >> column_count;
|
|
|
|
std::string columnname;
|
|
|
|
for (unsigned int i = 0; i < column_count; i++)
|
|
{
|
|
bytestream >> columnname;
|
|
fColumnNames.push_back(columnname);
|
|
}
|
|
|
|
// read unique flag
|
|
quadbyte unique;
|
|
bytestream >> unique;
|
|
fUnique = (unique != 0);
|
|
bytestream >> fSessionID;
|
|
bytestream >> fSql;
|
|
bytestream >> fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int CreateIndexStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_CREATE_INDEX;
|
|
|
|
// write the index and schema name
|
|
fIndexName->serialize(bytestream);
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// write column name list
|
|
bytestream << (quadbyte)fColumnNames.size();
|
|
ColumnNameList::const_iterator itr;
|
|
|
|
for (itr = fColumnNames.begin(); itr != fColumnNames.end(); ++itr)
|
|
{
|
|
bytestream << *itr;
|
|
}
|
|
|
|
// write Unique flag
|
|
bytestream << (quadbyte)fUnique;
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema).
|
|
bytestream << fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// DropIndexStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int DropIndexStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fIndexName = new QualifiedName();
|
|
|
|
// read the table and schema name
|
|
fIndexName->unserialize(bytestream);
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddlACK
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int DropIndexStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_DROP_INDEX_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fIndexName->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write ddl statement
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// DropTableStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int DropTableStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// cout << endl << "DropTableStatement unserialize testing started" << endl;
|
|
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
messageqcpp::ByteStream::quadbyte cascade;
|
|
|
|
// read cascade flag
|
|
bytestream >> cascade;
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddl
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
|
|
fCascade = (cascade != 0);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int DropTableStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// cout << "DropTableStatement serialize testing started" << endl;
|
|
|
|
bytestream << (quadbyte)DDL_DROP_TABLE_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// read cascade flag
|
|
bytestream << (quadbyte)fCascade;
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TruncTableStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TruncTableStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// cout << endl << "TruncTableStatement unserialize testing started" << endl;
|
|
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddl
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TruncTableStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// cout << "TruncTableStatement serialize testing started" << endl;
|
|
|
|
bytestream << (quadbyte)DDL_TRUNC_TABLE_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// MarkPartitionStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int MarkPartitionStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddl
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
|
|
fPartitions.clear();
|
|
uint32_t size = 0;
|
|
bytestream >> size;
|
|
BRM::LogicalPartition part;
|
|
|
|
for (uint32_t i = 0; i < size; i++)
|
|
{
|
|
part.unserialize(bytestream);
|
|
fPartitions.insert(part);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int MarkPartitionStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_MARK_PARTITION_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
|
|
bytestream << (uint32_t)fPartitions.size();
|
|
set<BRM::LogicalPartition>::iterator it;
|
|
|
|
for (it = fPartitions.begin(); it != fPartitions.end(); ++it)
|
|
(*it).serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// DropPartitionStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int DropPartitionStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddl
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
|
|
uint32_t size = 0;
|
|
bytestream >> size;
|
|
BRM::LogicalPartition part;
|
|
|
|
for (uint32_t i = 0; i < size; i++)
|
|
{
|
|
part.unserialize(bytestream);
|
|
fPartitions.insert(part);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int DropPartitionStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_DROP_PARTITION_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
bytestream << (uint32_t)fPartitions.size();
|
|
set<BRM::LogicalPartition>::iterator it;
|
|
|
|
for (it = fPartitions.begin(); it != fPartitions.end(); ++it)
|
|
(*it).serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// RestorePartitionStatement Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int RestorePartitionStatement::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fTableName = new QualifiedName();
|
|
fTableName->unserialize(bytestream);
|
|
|
|
// read the sessionID
|
|
bytestream >> fSessionID;
|
|
|
|
// read the original ddl
|
|
bytestream >> fSql;
|
|
|
|
// read the owner (default schema)
|
|
bytestream >> fOwner;
|
|
|
|
uint32_t size = 0;
|
|
bytestream >> size;
|
|
BRM::LogicalPartition part;
|
|
|
|
for (uint32_t i = 0; i < size; i++)
|
|
{
|
|
part.unserialize(bytestream);
|
|
fPartitions.insert(part);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int RestorePartitionStatement::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_RESTORE_PARTITION_STATEMENT;
|
|
|
|
// write the table and schema name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// write sessionid
|
|
bytestream << fSessionID;
|
|
|
|
// write original ddl
|
|
bytestream << fSql;
|
|
|
|
// write the owner (default schema)
|
|
bytestream << fOwner;
|
|
|
|
bytestream << (uint32_t)fPartitions.size();
|
|
set<BRM::LogicalPartition>::iterator it;
|
|
|
|
for (it = fPartitions.begin(); it != fPartitions.end(); ++it)
|
|
(*it).serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaAddColumn Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaAddColumn::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fColumnDef = new ColumnDef();
|
|
|
|
// read column
|
|
fColumnDef->unserialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaAddColumn::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_ADD_COLUMN;
|
|
|
|
// write column
|
|
fColumnDef->serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaAddColumns Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaAddColumns::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
read_vec<ColumnDef>(fColumns, bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaAddColumns::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_ADD_COLUMNS;
|
|
|
|
write_vec<ColumnDef>(fColumns, bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaDropColumns Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaDropColumns::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
quadbyte count;
|
|
bytestream >> count;
|
|
string colName;
|
|
|
|
while (count--)
|
|
{
|
|
bytestream >> colName;
|
|
fColumns.push_back(colName);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaDropColumns::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_DROP_COLUMNS;
|
|
|
|
bytestream << (quadbyte)fColumns.size();
|
|
|
|
ColumnNameList::const_iterator itr;
|
|
|
|
for (itr = fColumns.begin(); itr != fColumns.end(); itr++)
|
|
{
|
|
bytestream << *itr;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaAddTableConstraint Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaAddTableConstraint::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
quadbyte ctype;
|
|
|
|
bytestream >> ctype;
|
|
|
|
switch (ctype)
|
|
{
|
|
case DDL_TABLE_UNIQUE_CONSTRAINT_DEF:
|
|
fTableConstraint = new TableUniqueConstraintDef;
|
|
fTableConstraint->unserialize(bytestream);
|
|
break;
|
|
|
|
case DDL_TABLE_PRIMARY_CONSTRAINT_DEF:
|
|
fTableConstraint = new TablePrimaryKeyConstraintDef;
|
|
fTableConstraint->unserialize(bytestream);
|
|
break;
|
|
|
|
case DDL_TABLE_CHECK_CONSTRAINT_DEF:
|
|
fTableConstraint = new TableCheckConstraintDef;
|
|
fTableConstraint->unserialize(bytestream);
|
|
break;
|
|
|
|
case DDL_TABLE_REFERENCES_CONSTRAINT_DEF:
|
|
fTableConstraint = new TableReferencesConstraintDef;
|
|
fTableConstraint->unserialize(bytestream);
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaAddTableConstraint::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_ADD_TABLE_CONSTRAINT;
|
|
bytestream << (quadbyte)fTableConstraint->getSerialType();
|
|
fTableConstraint->serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaDropColumn Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaDropColumn::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream >> fColumnName;
|
|
quadbyte action;
|
|
bytestream >> action;
|
|
fDropBehavior = (DDL_REFERENTIAL_ACTION)action;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaDropColumn::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_DROP_COLUMN;
|
|
bytestream << fColumnName;
|
|
bytestream << (quadbyte)fDropBehavior;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaSetColumnDefault Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaSetColumnDefault::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream >> fColumnName;
|
|
fDefaultValue = new ColumnDefaultValue();
|
|
fDefaultValue->unserialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaSetColumnDefault::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_SET_COLUMN_DEFAULT;
|
|
bytestream << fColumnName;
|
|
fDefaultValue->serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaDropColumnDefault Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaDropColumnDefault::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read column name
|
|
bytestream >> fColumnName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaDropColumnDefault::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_DROP_COLUMN_DEFAULT;
|
|
bytestream << fColumnName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaDropTableConstraint Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaDropTableConstraint::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read table constraint
|
|
bytestream >> fConstraintName;
|
|
quadbyte action;
|
|
bytestream >> action;
|
|
|
|
fDropBehavior = (DDL_REFERENTIAL_ACTION)action;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaDropTableConstraint::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_DROP_TABLE_CONSTRAINT;
|
|
bytestream << fConstraintName;
|
|
bytestream << (quadbyte)fDropBehavior;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaTableComment Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaTableComment::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read table constraint
|
|
bytestream >> fTableComment;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaTableComment::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_TABLE_COMMENT;
|
|
bytestream << fTableComment;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaRenameTable Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaRenameTable::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fQualifiedName = new QualifiedName();
|
|
|
|
// read the table and schema name
|
|
fQualifiedName->unserialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaRenameTable::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_RENAME_TABLE;
|
|
|
|
// write the table and schema name
|
|
fQualifiedName->serialize(bytestream);
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaModifyColumnType Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaModifyColumnType::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
fColumnType = new ColumnType();
|
|
|
|
// read column type and name
|
|
fColumnType->unserialize(bytestream);
|
|
|
|
bytestream >> fName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaModifyColumnType::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write type code
|
|
bytestream << (quadbyte)DDL_ATA_MODIFY_COLUMN_TYPE;
|
|
|
|
// write column type and name
|
|
fColumnType->serialize(bytestream);
|
|
|
|
bytestream << fName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// AtaRenameColumn Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int AtaRenameColumn::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read column names
|
|
bytestream >> fName;
|
|
bytestream >> fNewName;
|
|
|
|
if (!fNewType)
|
|
fNewType = new ColumnType(DDL_INT);
|
|
|
|
fNewType->unserialize(bytestream);
|
|
|
|
read_vec<ColumnConstraintDef>(fConstraints, bytestream);
|
|
|
|
// read default value. It might not be there since the parser does
|
|
// not make one unless specified.
|
|
|
|
quadbyte type;
|
|
bytestream >> type;
|
|
|
|
if (type == DDL_NULL)
|
|
{
|
|
fDefaultValue = 0;
|
|
}
|
|
else
|
|
{
|
|
fDefaultValue = new ColumnDefaultValue();
|
|
fDefaultValue->unserialize(bytestream);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int AtaRenameColumn::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << (quadbyte)DDL_ATA_RENAME_COLUMN;
|
|
bytestream << fName;
|
|
bytestream << fNewName;
|
|
|
|
if (!fNewType)
|
|
fNewType = new ColumnType(DDL_INT);
|
|
|
|
fNewType->serialize(bytestream);
|
|
|
|
// serialize column constraints.
|
|
write_vec<ColumnConstraintDef>(fConstraints, bytestream);
|
|
|
|
if (0 == fDefaultValue)
|
|
{
|
|
bytestream << (quadbyte)DDL_NULL;
|
|
}
|
|
else
|
|
{
|
|
bytestream << (quadbyte)DDL_COLUMN_DEFAULT_VALUE;
|
|
fDefaultValue->serialize(bytestream);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ColumnType Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ColumnType::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte ftype;
|
|
messageqcpp::ByteStream::quadbyte length;
|
|
messageqcpp::ByteStream::quadbyte precision;
|
|
messageqcpp::ByteStream::quadbyte scale;
|
|
messageqcpp::ByteStream::quadbyte withtimezone;
|
|
messageqcpp::ByteStream::quadbyte compressiontype;
|
|
std::string autoincrement;
|
|
messageqcpp::ByteStream::octbyte nextVal;
|
|
|
|
// read column types
|
|
bytestream >> ftype;
|
|
bytestream >> length;
|
|
bytestream >> precision;
|
|
bytestream >> scale;
|
|
bytestream >> withtimezone;
|
|
bytestream >> compressiontype;
|
|
bytestream >> autoincrement;
|
|
bytestream >> nextVal;
|
|
|
|
fType = ftype;
|
|
fLength = length;
|
|
fPrecision = precision;
|
|
fScale = scale;
|
|
fWithTimezone = (withtimezone != 0);
|
|
fCompressiontype = compressiontype;
|
|
fAutoincrement = autoincrement;
|
|
fNextvalue = nextVal;
|
|
|
|
// cout << "BS length = " << bytestream.length() << endl;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ColumnType::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte ftype = fType;
|
|
messageqcpp::ByteStream::quadbyte length = fLength;
|
|
messageqcpp::ByteStream::quadbyte precision = fPrecision;
|
|
messageqcpp::ByteStream::quadbyte scale = fScale;
|
|
messageqcpp::ByteStream::quadbyte withtimezone = fWithTimezone;
|
|
messageqcpp::ByteStream::quadbyte compressiontype = fCompressiontype;
|
|
std::string autoincrement = fAutoincrement;
|
|
messageqcpp::ByteStream::octbyte nextVal = fNextvalue;
|
|
|
|
// write column types
|
|
bytestream << ftype;
|
|
bytestream << length;
|
|
bytestream << precision;
|
|
bytestream << scale;
|
|
bytestream << withtimezone;
|
|
bytestream << compressiontype;
|
|
bytestream << autoincrement;
|
|
bytestream << nextVal;
|
|
|
|
// cout << "BS length = " << bytestream.length() << endl;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ColumnConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ColumnConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte deferrable;
|
|
messageqcpp::ByteStream::quadbyte checktime;
|
|
messageqcpp::ByteStream::quadbyte constrainttype;
|
|
|
|
// read constaint defs
|
|
bytestream >> fName;
|
|
bytestream >> deferrable;
|
|
bytestream >> checktime;
|
|
bytestream >> constrainttype;
|
|
bytestream >> fCheck;
|
|
|
|
fDeferrable = (deferrable != 0);
|
|
fCheckTime = (DDL_CONSTRAINT_ATTRIBUTES)checktime;
|
|
fConstraintType = (DDL_CONSTRAINTS)constrainttype;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ColumnConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte deferrable = fDeferrable;
|
|
messageqcpp::ByteStream::quadbyte checktime = fCheckTime;
|
|
messageqcpp::ByteStream::quadbyte constrainttype = fConstraintType;
|
|
|
|
// write constaint defs
|
|
bytestream << fName;
|
|
bytestream << deferrable;
|
|
bytestream << checktime;
|
|
bytestream << constrainttype;
|
|
bytestream << fCheck;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ColumnDefaultValue Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ColumnDefaultValue::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// read update and delete actions
|
|
quadbyte qb;
|
|
|
|
bytestream >> qb;
|
|
fNull = (qb != 0);
|
|
|
|
bytestream >> fValue;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ColumnDefaultValue::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
// write update and delete actions
|
|
bytestream << (quadbyte)fNull;
|
|
bytestream << fValue;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ColumnDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ColumnDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream >> fName;
|
|
|
|
// read column type
|
|
fType = new ColumnType();
|
|
fType->unserialize(bytestream);
|
|
|
|
read_vec<ColumnConstraintDef>(fConstraints, bytestream);
|
|
|
|
// read default value. It might not be there since the parser does
|
|
// not make one unless specified.
|
|
|
|
quadbyte type;
|
|
bytestream >> type;
|
|
|
|
if (type == DDL_NULL)
|
|
{
|
|
fDefaultValue = 0;
|
|
}
|
|
else
|
|
{
|
|
fDefaultValue = new ColumnDefaultValue();
|
|
fDefaultValue->unserialize(bytestream);
|
|
}
|
|
|
|
// cout << "BS length = " << bytestream.length() << endl;
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ColumnDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << fName;
|
|
|
|
// write column type
|
|
fType->serialize(bytestream);
|
|
|
|
// serialize column constraints.
|
|
write_vec<ColumnConstraintDef>(fConstraints, bytestream);
|
|
|
|
if (0 == fDefaultValue)
|
|
{
|
|
bytestream << (quadbyte)DDL_NULL;
|
|
}
|
|
else
|
|
{
|
|
bytestream << (quadbyte)DDL_COLUMN_DEFAULT_VALUE;
|
|
fDefaultValue->serialize(bytestream);
|
|
}
|
|
|
|
// cout << "BS length = " << bytestream.length() << endl;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TableConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TableConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte constrainttype;
|
|
|
|
// read constraint def
|
|
bytestream >> constrainttype;
|
|
|
|
fConstraintType = (DDL_CONSTRAINTS)constrainttype;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TableConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte constrainttype = fConstraintType;
|
|
|
|
// write constraint def
|
|
bytestream << constrainttype;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TableUniqueConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TableUniqueConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
quadbyte count;
|
|
|
|
bytestream >> fName;
|
|
bytestream >> count;
|
|
|
|
string str;
|
|
|
|
while (count-- > 0)
|
|
{
|
|
bytestream >> str;
|
|
fColumnNameList.push_back(str);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TableUniqueConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << fName;
|
|
|
|
bytestream << (quadbyte)fColumnNameList.size();
|
|
|
|
ColumnNameList::const_iterator itr;
|
|
|
|
for (itr = fColumnNameList.begin(); itr != fColumnNameList.end(); ++itr)
|
|
{
|
|
bytestream << *itr;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TablePrimaryKeyConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TablePrimaryKeyConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
quadbyte count;
|
|
|
|
bytestream >> fName;
|
|
bytestream >> count;
|
|
|
|
string str;
|
|
|
|
while (count-- > 0)
|
|
{
|
|
bytestream >> str;
|
|
fColumnNameList.push_back(str);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TablePrimaryKeyConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << fName;
|
|
|
|
bytestream << (quadbyte)fColumnNameList.size();
|
|
|
|
ColumnNameList::const_iterator itr;
|
|
|
|
for (itr = fColumnNameList.begin(); itr != fColumnNameList.end(); ++itr)
|
|
{
|
|
bytestream << *itr;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ReferentialAction Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ReferentialAction::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte onupdate;
|
|
messageqcpp::ByteStream::quadbyte ondelete;
|
|
|
|
// read check
|
|
bytestream >> onupdate;
|
|
bytestream >> ondelete;
|
|
|
|
fOnUpdate = (DDL_REFERENTIAL_ACTION)onupdate;
|
|
fOnDelete = (DDL_REFERENTIAL_ACTION)ondelete;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ReferentialAction::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte onupdate = fOnUpdate;
|
|
messageqcpp::ByteStream::quadbyte ondelete = fOnDelete;
|
|
|
|
// write update and delete actions
|
|
bytestream << onupdate;
|
|
bytestream << ondelete;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TableReferencesConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TableReferencesConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
string str;
|
|
int ret = 1;
|
|
quadbyte count;
|
|
|
|
// Name
|
|
bytestream >> fName;
|
|
|
|
// Local columns
|
|
bytestream >> count;
|
|
|
|
while (count-- > 0)
|
|
{
|
|
bytestream >> str;
|
|
fColumns.push_back(str);
|
|
}
|
|
|
|
// Table name
|
|
fTableName = new QualifiedName;
|
|
fTableName->unserialize(bytestream);
|
|
|
|
// Foreign columns
|
|
bytestream >> count;
|
|
|
|
while (count-- > 0)
|
|
{
|
|
bytestream >> str;
|
|
fForeignColumns.push_back(str);
|
|
}
|
|
|
|
// Match type
|
|
quadbyte matchType;
|
|
bytestream >> matchType;
|
|
fMatchType = (DDL_MATCH_TYPE)matchType;
|
|
|
|
// Ref Action
|
|
quadbyte sertype;
|
|
bytestream >> sertype;
|
|
|
|
if (sertype == DDL_NULL)
|
|
{
|
|
fRefAction = 0;
|
|
}
|
|
else
|
|
{
|
|
fRefAction = new ReferentialAction();
|
|
fRefAction->unserialize(bytestream);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TableReferencesConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
messageqcpp::ByteStream::quadbyte size;
|
|
bytestream << fName;
|
|
|
|
// local columns
|
|
size = fColumns.size();
|
|
bytestream << size;
|
|
ColumnNameList::const_iterator itr;
|
|
|
|
for (itr = fColumns.begin(); itr != fColumns.end(); ++itr)
|
|
bytestream << *itr;
|
|
|
|
// Table name
|
|
fTableName->serialize(bytestream);
|
|
|
|
// Foreign columns
|
|
size = fForeignColumns.size();
|
|
bytestream << size;
|
|
|
|
for (itr = fForeignColumns.begin(); itr != fForeignColumns.end(); ++itr)
|
|
bytestream << *itr;
|
|
|
|
// Match type
|
|
bytestream << (quadbyte)fMatchType;
|
|
|
|
// Ref action
|
|
if (0 == fRefAction)
|
|
{
|
|
bytestream << (quadbyte)DDL_NULL;
|
|
}
|
|
else
|
|
{
|
|
bytestream << (quadbyte)DDL_REF_ACTION;
|
|
fRefAction->serialize(bytestream);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TableCheckConstraintDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TableCheckConstraintDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream >> fName;
|
|
bytestream >> fCheck;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TableCheckConstraintDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << fName;
|
|
bytestream << fCheck;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// TableDef Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int TableDef::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
messageqcpp::ByteStream::quadbyte type;
|
|
|
|
// table name
|
|
fQualifiedName = new QualifiedName();
|
|
fQualifiedName->unserialize(bytestream);
|
|
|
|
// ColumnDefs
|
|
read_vec<ColumnDef>(fColumns, bytestream);
|
|
|
|
// read column constraint list
|
|
quadbyte count;
|
|
bytestream >> count;
|
|
TableConstraintDef* constraint;
|
|
|
|
while (count-- > 0)
|
|
{
|
|
bytestream >> type;
|
|
|
|
switch (type)
|
|
{
|
|
case DDL_TABLE_UNIQUE_CONSTRAINT_DEF:
|
|
constraint = new TableUniqueConstraintDef();
|
|
constraint->unserialize(bytestream);
|
|
fConstraints.push_back(constraint);
|
|
break;
|
|
|
|
case DDL_TABLE_PRIMARY_CONSTRAINT_DEF:
|
|
constraint = new TablePrimaryKeyConstraintDef();
|
|
constraint->unserialize(bytestream);
|
|
fConstraints.push_back(constraint);
|
|
break;
|
|
|
|
case DDL_TABLE_REFERENCES_CONSTRAINT_DEF:
|
|
constraint = new TableReferencesConstraintDef();
|
|
constraint->unserialize(bytestream);
|
|
fConstraints.push_back(constraint);
|
|
break;
|
|
|
|
case DDL_TABLE_CHECK_CONSTRAINT_DEF:
|
|
constraint = new TableCheckConstraintDef();
|
|
constraint->unserialize(bytestream);
|
|
fConstraints.push_back(constraint);
|
|
break;
|
|
|
|
default: throw("Bad typecode for TableConstraintDef"); break;
|
|
}
|
|
}
|
|
|
|
// read option maps list
|
|
bytestream >> count;
|
|
|
|
for (unsigned int i = 0; i < count; i++)
|
|
{
|
|
// read option map
|
|
string map, map1;
|
|
bytestream >> map;
|
|
bytestream >> map1;
|
|
fOptions.insert(pair<string, string>(map, map1));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int TableDef::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
messageqcpp::ByteStream::quadbyte size;
|
|
// table name
|
|
fQualifiedName->serialize(bytestream);
|
|
|
|
// ColumnDef's
|
|
write_vec<ColumnDef>(fColumns, bytestream);
|
|
|
|
// write table constraint list
|
|
size = fConstraints.size();
|
|
bytestream << size;
|
|
|
|
TableConstraintDefList::const_iterator itr;
|
|
|
|
for (itr = fConstraints.begin(); itr != fConstraints.end(); ++itr)
|
|
{
|
|
bytestream << (quadbyte)(*itr)->getSerialType();
|
|
(*itr)->serialize(bytestream);
|
|
}
|
|
|
|
// serialize TableOptions
|
|
size = fOptions.size();
|
|
bytestream << size;
|
|
|
|
pair<string, string> oval;
|
|
TableOptionMap::const_iterator itr2;
|
|
|
|
for (itr2 = fOptions.begin(); itr2 != fOptions.end(); ++itr2)
|
|
{
|
|
oval = *itr2;
|
|
bytestream << oval.first;
|
|
bytestream << oval.second;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// QualifiedName Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int QualifiedName::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream >> fCatalog;
|
|
bytestream >> fSchema;
|
|
bytestream >> fName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int QualifiedName::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
bytestream << fCatalog;
|
|
bytestream << fSchema;
|
|
bytestream << fName;
|
|
|
|
return ret;
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
/// ConstraintAttributes Serialization
|
|
///////////////////////////////////////
|
|
|
|
/** @brief Construct from Bytestream */
|
|
int ConstraintAttributes::unserialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte checktime;
|
|
messageqcpp::ByteStream::quadbyte deferrable;
|
|
|
|
// read the checktime and deferrable flag
|
|
bytestream >> checktime;
|
|
bytestream >> deferrable;
|
|
|
|
fCheckTime = (DDL_CONSTRAINT_ATTRIBUTES)checktime;
|
|
fDeferrable = (deferrable != 0);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** @brief Serialize to ByteStream */
|
|
int ConstraintAttributes::serialize(ByteStream& bytestream)
|
|
{
|
|
int ret = 1;
|
|
|
|
messageqcpp::ByteStream::quadbyte checktime = fCheckTime;
|
|
messageqcpp::ByteStream::quadbyte deferrable = fDeferrable;
|
|
|
|
// write the checktime and deferrable flag
|
|
bytestream << checktime;
|
|
bytestream << deferrable;
|
|
|
|
return ret;
|
|
}
|