mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-04-18 21:44:02 +03:00
This patch improves/fixes the existing handling of CHARSET and COLLATION symbols in the ColumnStore DDL parser. Also, add fCollate and fCharsetNum member variables to the ddlpackage::ColumnType class.
1770 lines
38 KiB
C++
1770 lines
38 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;
|
|
messageqcpp::ByteStream::quadbyte charsetNum;
|
|
|
|
// read column types
|
|
bytestream >> ftype;
|
|
bytestream >> length;
|
|
bytestream >> precision;
|
|
bytestream >> scale;
|
|
bytestream >> withtimezone;
|
|
bytestream >> compressiontype;
|
|
bytestream >> autoincrement;
|
|
bytestream >> nextVal;
|
|
bytestream >> charsetNum;
|
|
|
|
fType = ftype;
|
|
fLength = length;
|
|
fPrecision = precision;
|
|
fScale = scale;
|
|
fWithTimezone = (withtimezone != 0);
|
|
fCompressiontype = compressiontype;
|
|
fAutoincrement = autoincrement;
|
|
fNextvalue = nextVal;
|
|
fCharsetNum = charsetNum;
|
|
|
|
// 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;
|
|
messageqcpp::ByteStream::quadbyte charsetNum = fCharsetNum;
|
|
|
|
// write column types
|
|
bytestream << ftype;
|
|
bytestream << length;
|
|
bytestream << precision;
|
|
bytestream << scale;
|
|
bytestream << withtimezone;
|
|
bytestream << compressiontype;
|
|
bytestream << autoincrement;
|
|
bytestream << nextVal;
|
|
bytestream << charsetNum;
|
|
|
|
// 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;
|
|
}
|