8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-31 12:43:02 +01:00
firebird-mirror/src/dsql/DdlNodes.h

1720 lines
43 KiB
C
Raw Normal View History

/*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.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.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
*
* Software distributed under the License is distributed AS IS,
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
* See the License for the specific language governing rights
* and limitations under the License.
*
* The Original Code was created by Adriano dos Santos Fernandes
* for the Firebird Open Source RDBMS project.
*
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
* and all contributors signed below.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef DSQL_DDL_NODES_H
#define DSQL_DDL_NODES_H
#include "../common/common.h"
#include "../jrd/blr.h"
2010-06-26 03:52:06 +02:00
#include "../jrd/dyn.h"
#include "../jrd/msg_encode.h"
#include "../dsql/node.h"
#include "../dsql/make_proto.h"
#include "../dsql/BlrWriter.h"
#include "../dsql/Nodes.h"
#include "../common/classes/array.h"
#include "../common/classes/ByteChunk.h"
#include "../common/classes/Nullable.h"
2010-08-02 17:47:36 +02:00
#include "../jrd/vio_proto.h"
2010-06-26 03:52:06 +02:00
#include "../dsql/errd_proto.h"
namespace Jrd {
class CompoundStmtNode;
class DbFileClause
{
public:
DbFileClause(MemoryPool& p, const DbFileClause& o)
: name(p, o.name),
start(o.start),
length(o.length)
{
}
explicit DbFileClause(MemoryPool& p, const Firebird::PathName& aName)
: name(p, aName),
start(0),
length(0)
{
}
public:
Firebird::PathName name; // File name
SLONG start; // Starting page
SLONG length; // File length in pages
};
class ExternalClause
{
public:
ExternalClause(MemoryPool& p, const ExternalClause& o)
: name(p, o.name),
engine(p, o.engine),
udfModule(p, o.udfModule)
{
}
explicit ExternalClause(MemoryPool& p)
: name(p),
engine(p),
udfModule(p)
{
}
public:
Firebird::string name;
Firebird::MetaName engine;
Firebird::string udfModule;
};
class TypeClause
{
public:
2010-10-30 20:57:53 +02:00
TypeClause(MemoryPool& pool, dsql_fld* aField, const Firebird::MetaName& aCollate);
virtual ~TypeClause() {}
public:
void resolve(DsqlCompilerScratch* dsqlScratch, bool modifying = false);
void setup(DsqlCompilerScratch* dsqlScratch);
public:
virtual void print(Firebird::string& text) const;
public:
USHORT type;
FLD_LENGTH length;
SSHORT scale;
SSHORT subType;
USHORT segLength;
USHORT precision;
USHORT charLength;
SSHORT charSetId;
SSHORT collationId;
SSHORT textType;
bool collateSpecified;
bool fullDomain;
bool notNull;
Firebird::MetaName fieldSource;
Firebird::MetaName typeOfTable;
Firebird::MetaName typeOfName;
public:
dsql_fld* legacyField;
Firebird::MetaName collate;
};
class ParameterClause : public TypeClause
{
public:
2010-10-30 20:57:53 +02:00
ParameterClause(MemoryPool& pool, dsql_fld* field, const Firebird::MetaName& aCollate,
dsql_nod* dflt, dsql_nod* aLegacyParameter);
public:
void print(Firebird::string& text) const;
public:
Firebird::MetaName name;
dsql_nod* legacyDefault;
dsql_nod* legacyParameter;
Nullable<int> udfMechanism;
};
2010-08-02 17:47:36 +02:00
template <typename CreateNode, typename DropNode, ISC_STATUS ERROR_CODE>
class RecreateNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
RecreateNode(MemoryPool& p, CreateNode* aCreateNode)
: DdlNode(p),
2010-08-02 17:47:36 +02:00
createNode(aCreateNode),
2010-08-05 02:47:06 +02:00
dropNode(p, createNode->name)
2010-08-02 17:47:36 +02:00
{
dropNode.silent = true;
}
public:
2010-08-09 13:50:12 +02:00
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& /*nodes*/) const
2010-08-02 17:47:36 +02:00
{
text.printf("RecreateNode\n");
}
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction)
2010-08-02 17:47:36 +02:00
{
// run all statements under savepoint control
AutoSavePoint savePoint(tdbb, transaction);
dropNode.execute(tdbb, dsqlScratch, transaction);
createNode->execute(tdbb, dsqlScratch, transaction);
2010-08-02 17:47:36 +02:00
savePoint.release(); // everything is ok
}
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch)
2010-08-02 17:47:36 +02:00
{
createNode->dsqlPass(dsqlScratch);
dropNode.dsqlPass(dsqlScratch);
return DdlNode::dsqlPass(dsqlScratch);
2010-08-02 17:47:36 +02:00
}
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
2010-08-02 17:47:36 +02:00
{
statusVector << Firebird::Arg::Gds(ERROR_CODE) << createNode->name;
2010-08-02 17:47:36 +02:00
}
protected:
CreateNode* createNode;
DropNode dropNode;
};
class AlterCharSetNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
AlterCharSetNode(MemoryPool& pool, const Firebird::MetaName& aCharSet,
const Firebird::MetaName& aDefaultCollation)
: DdlNode(pool),
charSet(pool, aCharSet),
defaultCollation(pool, aDefaultCollation)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_charset_failed) << charSet;
}
private:
Firebird::MetaName charSet;
Firebird::MetaName defaultCollation;
};
class CommentOnNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CommentOnNode(MemoryPool& pool, int aObjType,
const Firebird::MetaName& aObjName, const Firebird::MetaName& aSubName,
const Firebird::string& aText, const char* aTextCharSet)
2010-08-05 02:47:06 +02:00
: DdlNode(pool),
objType(aObjType),
objName(pool, aObjName),
subName(pool, aSubName),
text(pool, aText),
textCharSet(aTextCharSet)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
/*** ASF: FIXME: When returning, str is destroyed but its pointer is recorded.
Firebird::string str(objName.c_str());
if (subName.hasData())
str.append(".").append(subName.c_str());
statusVector << Firebird::Arg::Gds(isc_dsql_comment_on_failed) << str;
***/
statusVector << Firebird::Arg::Gds(isc_dsql_comment_on_failed) << objName;
}
private:
int objType;
Firebird::MetaName objName;
Firebird::MetaName subName;
Firebird::string text;
const char* textCharSet;
};
class CreateAlterFunctionNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateAlterFunctionNode(MemoryPool& pool, const Firebird::MetaName& aName)
: DdlNode(pool),
name(pool, aName),
create(true),
alter(false),
external(NULL),
deterministic(false),
parameters(pool),
returnType(pool, NULL, NULL, NULL, NULL),
localDeclList(NULL),
source(pool),
body(NULL),
compiled(false),
invalid(false),
package(pool),
packageOwner(pool),
privateScope(false),
udfReturnPos(0)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector <<
Firebird::Arg::Gds(createAlterCode(create, alter,
isc_dsql_create_func_failed, isc_dsql_alter_func_failed,
isc_dsql_create_alter_func_failed)) <<
name;
}
private:
bool isUdf()
{
return external && external->udfModule.hasData();
}
void executeCreate(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
bool executeAlter(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
bool secondPass, bool runTriggers);
void storeArgument(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
unsigned pos, const ParameterClause& parameter, const bid* comment);
void compile(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch);
void collectParamComments(thread_db* tdbb, jrd_tra* transaction, MetaNameBidMap& items);
public:
Firebird::MetaName name;
bool create;
bool alter;
ExternalClause* external;
bool deterministic;
Firebird::Array<ParameterClause> parameters;
ParameterClause returnType;
NestConst<CompoundStmtNode> localDeclList;
Firebird::string source;
NestConst<StmtNode> body;
bool compiled;
bool invalid;
Firebird::MetaName package;
Firebird::string packageOwner;
bool privateScope;
SLONG udfReturnPos;
};
class AlterExternalFunctionNode : public DdlNode
{
public:
AlterExternalFunctionNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName),
clauses(p)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_func_failed) << name;
}
public:
Firebird::MetaName name;
ExternalClause clauses;
};
class DropFunctionNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropFunctionNode(MemoryPool& pool, const Firebird::MetaName& aName)
: DdlNode(pool),
name(pool, aName),
silent(false),
package(pool)
{
}
public:
static void dropArguments(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& functionName, const Firebird::MetaName& packageName);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_func_failed) << name;
}
public:
Firebird::MetaName name;
bool silent;
Firebird::MetaName package;
};
2010-08-02 17:47:36 +02:00
typedef RecreateNode<CreateAlterFunctionNode, DropFunctionNode, isc_dsql_recreate_func_failed>
RecreateFunctionNode;
class CreateAlterProcedureNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateAlterProcedureNode(MemoryPool& pool, const Firebird::MetaName& aName)
: DdlNode(pool),
name(pool, aName),
create(true),
alter(false),
external(NULL),
parameters(pool),
returns(pool),
source(pool),
localDeclList(NULL),
body(NULL),
compiled(false),
invalid(false),
package(pool),
packageOwner(pool),
privateScope(false)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector <<
Firebird::Arg::Gds(createAlterCode(create, alter,
isc_dsql_create_proc_failed, isc_dsql_alter_proc_failed,
isc_dsql_create_alter_proc_failed)) <<
name;
}
private:
void executeCreate(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
bool executeAlter(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
bool secondPass, bool runTriggers);
void storeParameter(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
2010-10-29 02:28:35 +02:00
USHORT type, unsigned pos, const ParameterClause& parameter, const bid* comment);
void compile(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch);
2010-10-29 02:28:35 +02:00
void collectParamComments(thread_db* tdbb, jrd_tra* transaction, MetaNameBidMap& items);
public:
Firebird::MetaName name;
bool create;
bool alter;
ExternalClause* external;
Firebird::Array<ParameterClause> parameters;
Firebird::Array<ParameterClause> returns;
Firebird::string source;
NestConst<CompoundStmtNode> localDeclList;
NestConst<StmtNode> body;
bool compiled;
bool invalid;
Firebird::MetaName package;
Firebird::string packageOwner;
bool privateScope;
};
class DropProcedureNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropProcedureNode(MemoryPool& pool, const Firebird::MetaName& aName)
: DdlNode(pool),
name(pool, aName),
silent(false),
package(pool)
{
}
public:
static void dropParameters(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& procedureName, const Firebird::MetaName& packageName);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_proc_failed) << name;
}
public:
Firebird::MetaName name;
bool silent;
Firebird::MetaName package;
};
2010-08-02 17:47:36 +02:00
typedef RecreateNode<CreateAlterProcedureNode, DropProcedureNode, isc_dsql_recreate_proc_failed>
RecreateProcedureNode;
class TriggerDefinition
{
public:
2010-08-09 13:50:12 +02:00
explicit TriggerDefinition(MemoryPool& p)
: name(p),
relationName(p),
external(NULL),
source(p),
systemFlag(fb_sysflag_user),
fkTrigger(false)
{
}
void store(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
bool modify(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void preModify(thread_db* /*tdbb*/, DsqlCompilerScratch* /*dsqlScratch*/,
jrd_tra* /*transaction*/)
{
}
virtual void postModify(thread_db* /*tdbb*/, DsqlCompilerScratch* /*dsqlScratch*/,
jrd_tra* /*transaction*/)
{
}
public:
Firebird::MetaName name;
Firebird::MetaName relationName;
Nullable<FB_UINT64> type;
Nullable<bool> active;
Nullable<int> position;
ExternalClause* external;
Firebird::string source;
Firebird::ByteChunk blrData;
Firebird::ByteChunk debugData;
USHORT systemFlag;
bool fkTrigger;
};
class CreateAlterTriggerNode : public DdlNode, public TriggerDefinition
{
public:
2010-08-05 02:47:06 +02:00
CreateAlterTriggerNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
TriggerDefinition(p),
create(true),
alter(false),
localDeclList(NULL),
body(NULL),
compiled(false),
invalid(false)
{
name = aName;
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector <<
Firebird::Arg::Gds(createAlterCode(create, alter,
isc_dsql_create_trigger_failed, isc_dsql_alter_trigger_failed,
isc_dsql_create_alter_trigger_failed)) <<
name;
}
virtual void preModify(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction)
{
if (alter)
{
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE,
DDL_TRIGGER_ALTER_TRIGGER, name);
}
}
virtual void postModify(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction)
{
if (alter)
{
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_AFTER,
DDL_TRIGGER_ALTER_TRIGGER, name);
}
}
private:
void executeCreate(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
void compile(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch);
static inline bool hasOldContext(const unsigned value)
{
const unsigned val1 = ((value + 1) >> 1) & 3;
const unsigned val2 = ((value + 1) >> 3) & 3;
const unsigned val3 = ((value + 1) >> 5) & 3;
return (val1 && val1 != 1) || (val2 && val2 != 1) || (val3 && val3 != 1);
}
static inline bool hasNewContext(const unsigned value)
{
const unsigned val1 = ((value + 1) >> 1) & 3;
const unsigned val2 = ((value + 1) >> 3) & 3;
const unsigned val3 = ((value + 1) >> 5) & 3;
return (val1 && val1 != 3) || (val2 && val2 != 3) || (val3 && val3 != 3);
}
public:
bool create;
bool alter;
NestConst<CompoundStmtNode> localDeclList;
NestConst<StmtNode> body;
bool compiled;
bool invalid;
};
class DropTriggerNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropTriggerNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName),
silent(false)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_trigger_failed) << name;
}
public:
Firebird::MetaName name;
bool silent;
};
2010-08-02 17:47:36 +02:00
typedef RecreateNode<CreateAlterTriggerNode, DropTriggerNode, isc_dsql_recreate_trigger_failed>
RecreateTriggerNode;
2010-06-26 03:52:06 +02:00
class CreateCollationNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateCollationNode(MemoryPool& p, const Firebird::MetaName& aName,
const Firebird::MetaName& aForCharSet)
: DdlNode(p),
2010-06-26 03:52:06 +02:00
name(p, aName),
forCharSet(p, aForCharSet),
fromName(p),
fromExternal(p),
specificAttributes(p),
attributesOn(0),
attributesOff(0),
forCharSetId(0),
fromCollationId(0)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-06-26 03:52:06 +02:00
void setAttribute(USHORT attribute)
{
if ((attributesOn | attributesOff) & attribute)
{
// msg: 222: "Invalid collation attributes"
using namespace Firebird;
ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC)));
}
attributesOn |= attribute;
}
void unsetAttribute(USHORT attribute)
{
if ((attributesOn | attributesOff) & attribute)
{
// msg: 222: "Invalid collation attributes"
using namespace Firebird;
ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC)));
}
attributesOff |= attribute;
}
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_collation_failed) << name;
}
2010-06-26 03:52:06 +02:00
public:
Firebird::MetaName name;
Firebird::MetaName forCharSet;
Firebird::MetaName fromName;
Firebird::string fromExternal;
Firebird::UCharBuffer specificAttributes;
private:
USHORT attributesOn;
USHORT attributesOff;
USHORT forCharSetId;
USHORT fromCollationId;
};
class DropCollationNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropCollationNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
2010-06-26 03:52:06 +02:00
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-06-26 03:52:06 +02:00
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_collation_failed) << name;
}
2010-06-26 03:52:06 +02:00
public:
Firebird::MetaName name;
};
2010-07-06 02:49:33 +02:00
class CreateDomainNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateDomainNode(MemoryPool& p, const ParameterClause& aNameType)
: DdlNode(p),
2010-07-06 02:49:33 +02:00
nameType(aNameType),
notNull(false),
check(NULL)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-07-06 02:49:33 +02:00
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_domain_failed) << nameType.name;
}
2010-07-06 02:49:33 +02:00
public:
ParameterClause nameType;
bool notNull;
dsql_nod* check;
};
class AlterDomainNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
AlterDomainNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
2010-07-06 02:49:33 +02:00
name(p, aName),
dropConstraint(false),
dropDefault(false),
setConstraint(NULL),
setDefault(NULL),
renameTo(p)
{
}
public:
static void checkUpdate(const dyn_fld& origFld, const dyn_fld& newFld);
static ULONG checkUpdateNumericType(const dyn_fld& origFld, const dyn_fld& newFld);
static void getDomainType(thread_db* tdbb, jrd_tra* transaction, dyn_fld& dynFld);
2010-07-06 02:49:33 +02:00
static void modifyLocalFieldIndex(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& relationName, const Firebird::MetaName& fieldName,
const Firebird::MetaName& newFieldName);
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-07-06 02:49:33 +02:00
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_domain_failed) << name;
}
2010-07-06 02:49:33 +02:00
private:
void rename(thread_db* tdbb, jrd_tra* transaction, SSHORT dimensions);
public:
Firebird::MetaName name;
bool dropConstraint;
bool dropDefault;
dsql_nod* setConstraint;
dsql_nod* setDefault;
Firebird::MetaName renameTo;
Firebird::AutoPtr<TypeClause> type;
2010-08-10 17:20:20 +02:00
Nullable<bool> notNullFlag; // true = NOT NULL / false = NULL
2010-07-06 02:49:33 +02:00
};
class DropDomainNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropDomainNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
2010-07-06 02:49:33 +02:00
name(p, aName)
{
}
static bool deleteDimensionRecords(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& name);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-07-06 02:49:33 +02:00
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_domain_failed) << name;
}
2010-07-06 02:49:33 +02:00
private:
void check(thread_db* tdbb, jrd_tra* transaction);
public:
Firebird::MetaName name;
};
class CreateAlterExceptionNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateAlterExceptionNode(MemoryPool& p, const Firebird::MetaName& aName,
const Firebird::string& aMessage)
: DdlNode(p),
name(p, aName),
message(p, aMessage),
create(true),
alter(false)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector <<
Firebird::Arg::Gds(createAlterCode(create, alter,
isc_dsql_create_except_failed, isc_dsql_alter_except_failed,
isc_dsql_create_alter_except_failed)) <<
name;
}
private:
void executeCreate(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
bool executeAlter(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
public:
Firebird::MetaName name;
Firebird::string message;
bool create;
bool alter;
};
class DropExceptionNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropExceptionNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName),
silent(false)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_except_failed) << name;
}
public:
Firebird::MetaName name;
bool silent;
};
2010-08-02 17:47:36 +02:00
typedef RecreateNode<CreateAlterExceptionNode, DropExceptionNode, isc_dsql_recreate_except_failed>
RecreateExceptionNode;
2010-01-10 18:32:40 +01:00
class CreateSequenceNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
CreateSequenceNode(MemoryPool& pool, const Firebird::MetaName& aName)
: DdlNode(pool),
2010-01-10 18:32:40 +01:00
name(pool, aName)
{
}
static void store(thread_db* tdbb, jrd_tra* transaction, const Firebird::MetaName& name,
fb_sysflag sysFlag);
2010-01-10 18:32:40 +01:00
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
2010-01-10 18:32:40 +01:00
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_sequence_failed) << name;
}
public:
Firebird::MetaName name;
};
class DropSequenceNode : public DdlNode
{
public:
DropSequenceNode(MemoryPool& pool, const Firebird::MetaName&aName)
: DdlNode(pool),
name(pool, aName),
silent(false)
{
}
static void deleteIdentity(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& name);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_sequence_failed) << name;
}
public:
Firebird::MetaName name;
bool silent;
};
typedef RecreateNode<CreateSequenceNode, DropSequenceNode, isc_dsql_recreate_sequence_failed>
RecreateSequenceNode;
class RelationNode : public DdlNode
{
public:
class FieldDefinition
{
public:
2010-08-09 13:50:12 +02:00
explicit FieldDefinition(MemoryPool& p)
: name(p),
relationName(p),
fieldSource(p),
identitySequence(p),
defaultSource(p),
baseField(p)
{
}
void modify(thread_db* tdbb, jrd_tra* transaction);
void store(thread_db* tdbb, jrd_tra* transaction);
public:
Firebird::MetaName name;
Firebird::MetaName relationName;
Firebird::MetaName fieldSource;
Firebird::MetaName identitySequence;
Nullable<USHORT> collationId;
2010-08-10 17:20:20 +02:00
Nullable<bool> notNullFlag; // true = NOT NULL / false = NULL
Nullable<USHORT> position;
Firebird::string defaultSource;
Firebird::ByteChunk defaultValue;
Nullable<USHORT> viewContext;
Firebird::MetaName baseField;
};
struct Constraint : public PermanentStorage
{
enum Type { TYPE_CHECK, TYPE_NOT_NULL, TYPE_PK, TYPE_UNIQUE, TYPE_FK };
// Specialized BlrWriter for constraints.
class BlrWriter : public Jrd::BlrWriter
{
public:
2010-08-09 13:50:12 +02:00
explicit BlrWriter(MemoryPool& p)
: Jrd::BlrWriter(p),
dsqlScratch(NULL)
{
}
void init(DsqlCompilerScratch* aDsqlScratch)
{
dsqlScratch = aDsqlScratch;
dsqlScratch->getBlrData().clear();
dsqlScratch->getDebugData().clear();
appendUChar(isVersion4() ? blr_version4 : blr_version5);
}
virtual bool isVersion4()
{
return dsqlScratch->isVersion4();
}
protected:
virtual bool isDdlDyn()
{
return false;
}
private:
DsqlCompilerScratch* dsqlScratch;
};
2010-08-09 13:50:12 +02:00
explicit Constraint(MemoryPool& p)
: PermanentStorage(p),
type(TYPE_CHECK), // Just something to initialize. Do not assume it.
name(p),
columns(p),
indexName(p),
descending(false),
refRelation(p),
refColumns(p),
2010-08-03 03:09:39 +02:00
refUpdateAction(RI_RESTRICT),
refDeleteAction(RI_RESTRICT),
triggers(p),
blrWritersHolder(p)
{
}
Constraint::Type type;
Firebird::MetaName name;
Firebird::ObjectsArray<Firebird::MetaName> columns;
Firebird::MetaName indexName;
bool descending;
Firebird::MetaName refRelation;
Firebird::ObjectsArray<Firebird::MetaName> refColumns;
const char* refUpdateAction;
const char* refDeleteAction;
Firebird::ObjectsArray<TriggerDefinition> triggers;
Firebird::ObjectsArray<BlrWriter> blrWritersHolder;
};
RelationNode(MemoryPool& p, dsql_nod* aDsqlNode);
static void deleteLocalField(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& relationName, const Firebird::MetaName& fieldName);
protected:
void defineField(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
const dsql_nod* element, SSHORT position, const dsql_nod* pkcols);
bool defineDefault(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, dsql_fld* field,
dsql_nod* node, Firebird::string& source, BlrWriter::BlrData& value);
void makeConstraint(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
const dsql_nod* node, Firebird::ObjectsArray<Constraint>& constraints, bool* notNull = NULL);
void defineConstraint(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
Constraint& constraint);
void defineCheckConstraint(DsqlCompilerScratch* dsqlScratch, Constraint& constraint,
dsql_nod* node);
void defineCheckConstraintTrigger(DsqlCompilerScratch* dsqlScratch, Constraint& constraint,
dsql_nod* node, FB_UINT64 triggerType);
void defineSetDefaultTrigger(DsqlCompilerScratch* dsqlScratch, Constraint& constraint,
bool onUpdate);
void defineSetNullTrigger(DsqlCompilerScratch* dsqlScratch, Constraint& constraint,
bool onUpdate);
void defineDeleteCascadeTrigger(DsqlCompilerScratch* dsqlScratch, Constraint& constraint);
void defineUpdateCascadeTrigger(DsqlCompilerScratch* dsqlScratch, Constraint& constraint);
void generateUnnamedTriggerBeginning(Constraint& constraint, bool onUpdate,
BlrWriter& blrWriter);
void stuffDefaultBlr(const Firebird::ByteChunk& defaultBlr, BlrWriter& blrWriter);
void stuffMatchingBlr(Constraint& constraint, BlrWriter& blrWriter);
2010-08-09 13:50:12 +02:00
void stuffTriggerFiringCondition(const Constraint& constraint, BlrWriter& blrWriter);
public:
dsql_nod* dsqlNode;
Firebird::MetaName name;
Firebird::Array<dsql_nod*> elements;
};
class CreateRelationNode : public RelationNode
{
public:
2010-08-05 02:47:06 +02:00
CreateRelationNode(MemoryPool& p, dsql_nod* aDsqlNode,
const Firebird::PathName* aExternalFile = NULL)
: RelationNode(p, aDsqlNode),
externalFile(aExternalFile),
relationType(rel_persistent)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_table_failed) << name;
}
private:
const dsql_nod* findPkColumns();
public:
const Firebird::PathName* externalFile;
rel_t relationType;
};
class AlterRelationNode : public RelationNode
{
public:
2010-08-05 02:47:06 +02:00
AlterRelationNode(MemoryPool& p, dsql_nod* aDsqlNode)
: RelationNode(p, aDsqlNode)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_table_failed) << name;
}
2010-01-10 18:32:40 +01:00
private:
void modifyField(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction,
const dsql_nod* element);
};
class DropRelationNode : public DdlNode
{
public:
2010-08-05 02:47:06 +02:00
DropRelationNode(MemoryPool& p, const Firebird::MetaName& aName, bool aView = false)
: DdlNode(p),
name(p, aName),
view(aView),
silent(false)
{
}
static void deleteGlobalField(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& globalName);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_table_failed) << name;
}
public:
2010-01-10 18:32:40 +01:00
Firebird::MetaName name;
bool view;
bool silent;
};
2010-08-02 17:47:36 +02:00
typedef RecreateNode<CreateRelationNode, DropRelationNode, isc_dsql_recreate_table_failed>
RecreateTableNode;
class CreateAlterViewNode : public RelationNode
{
public:
2010-08-05 02:47:06 +02:00
CreateAlterViewNode(MemoryPool& p, dsql_nod* aDsqlNode, dsql_nod* aViewFields,
dsql_nod* aSelectExpr)
: RelationNode(p, aDsqlNode),
create(true),
alter(false),
viewFields(aViewFields),
selectExpr(aSelectExpr),
source(p),
withCheckOption(false)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector <<
Firebird::Arg::Gds(createAlterCode(create, alter,
isc_dsql_create_view_failed, isc_dsql_alter_view_failed,
isc_dsql_create_alter_view_failed)) <<
name;
}
private:
void createCheckTriggers(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, dsql_nod* items);
void createCheckTrigger(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch,
dsql_nod* rse, dsql_nod* items, CompoundStmtNode* actions, TriggerType triggerType);
void defineUpdateAction(DsqlCompilerScratch* dsqlScratch, dsql_nod** baseAndNode,
dsql_nod** baseRelation, dsql_nod* items);
static dsql_nod* replaceFieldNames(dsql_nod* input, dsql_nod* searchFields,
dsql_nod* replaceFields, bool nullThem, const char* contextName);
public:
bool create;
bool alter;
dsql_nod* viewFields;
dsql_nod* selectExpr;
Firebird::string source;
bool withCheckOption;
};
2010-08-02 17:47:36 +02:00
class RecreateViewNode :
public RecreateNode<CreateAlterViewNode, DropRelationNode, isc_dsql_recreate_view_failed>
{
public:
2010-08-05 02:47:06 +02:00
RecreateViewNode(MemoryPool& p, CreateAlterViewNode* aCreateNode)
2010-08-03 01:13:06 +02:00
: RecreateNode<CreateAlterViewNode, DropRelationNode, isc_dsql_recreate_view_failed>(
2010-08-05 02:47:06 +02:00
p, aCreateNode)
2010-08-02 17:47:36 +02:00
{
dropNode.view = true;
}
};
class CreateIndexNode : public DdlNode
{
public:
struct Definition
{
Definition()
: type(0)
{
expressionBlr.clear();
expressionSource.clear();
}
Firebird::MetaName relation;
Firebird::ObjectsArray<Firebird::MetaName> columns;
Nullable<bool> unique;
Nullable<bool> descending;
Nullable<bool> inactive;
SSHORT type;
bid expressionBlr;
bid expressionSource;
Firebird::MetaName refRelation;
Firebird::ObjectsArray<Firebird::MetaName> refColumns;
};
public:
CreateIndexNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName),
unique(false),
descending(false),
legacyRelation(NULL),
legacyDef(NULL)
{
}
public:
static void store(thread_db* tdbb, jrd_tra* transaction, Firebird::MetaName& name,
2010-08-09 13:50:12 +02:00
const Definition& definition, Firebird::MetaName* referredIndexName = NULL);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_index_failed) << name;
}
public:
Firebird::MetaName name;
bool unique;
bool descending;
dsql_nod* legacyRelation;
dsql_nod* legacyDef;
};
class AlterIndexNode : public DdlNode
{
public:
AlterIndexNode(MemoryPool& p, const Firebird::MetaName& aName, bool aActive)
: DdlNode(p),
name(p, aName),
active(aActive)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_index_failed) << name;
}
public:
Firebird::MetaName name;
bool active;
};
class SetStatisticsNode : public DdlNode
{
public:
SetStatisticsNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
// ASF: using ALTER INDEX's code.
statusVector << Firebird::Arg::Gds(isc_dsql_alter_index_failed) << name;
}
public:
Firebird::MetaName name;
};
class DropIndexNode : public DdlNode
{
public:
DropIndexNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
static bool deleteSegmentRecords(thread_db* tdbb, jrd_tra* transaction,
const Firebird::MetaName& name);
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_index_failed) << name;
}
public:
Firebird::MetaName name;
};
class CreateFilterNode : public DdlNode
{
public:
struct NameNumber
{
NameNumber(MemoryPool& p, const Firebird::MetaName& aName)
: name(p, aName),
number(0)
{
}
NameNumber(MemoryPool& p, SSHORT aNumber)
: name(p),
number(aNumber)
{
}
Firebird::MetaName name;
SSHORT number;
};
public:
CreateFilterNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName),
inputFilter(NULL),
outputFilter(NULL),
entryPoint(p),
moduleName(p)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_filter_failed) << name;
}
public:
Firebird::MetaName name;
NameNumber* inputFilter;
NameNumber* outputFilter;
Firebird::string entryPoint;
Firebird::string moduleName;
};
class DropFilterNode : public DdlNode
{
public:
DropFilterNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_filter_failed) << name;
}
public:
Firebird::MetaName name;
};
class CreateShadowNode : public DdlNode
{
public:
CreateShadowNode(MemoryPool& p, const SSHORT aNumber)
: DdlNode(p),
number(aNumber),
manual(false),
conditional(false),
files(p)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_shadow_failed) << Firebird::Arg::Num(number);
}
public:
SSHORT number;
bool manual;
bool conditional;
Nullable<SLONG> firstLength;
Firebird::Array<DbFileClause*> files;
};
class DropShadowNode : public DdlNode
{
public:
DropShadowNode(MemoryPool& p, const SSHORT aNumber)
: DdlNode(p),
number(aNumber)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_shadow_failed) << Firebird::Arg::Num(number);
}
public:
SSHORT number;
};
class CreateRoleNode : public DdlNode
{
public:
CreateRoleNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_create_role_failed) << name;
}
private:
bool isItUserName(thread_db* tdbb, jrd_tra* transaction);
public:
Firebird::MetaName name;
};
class AlterRoleNode : public DdlNode
{
public:
AlterRoleNode(MemoryPool& p, const Firebird::MetaName& aName, bool aMap)
: DdlNode(p),
name(p, aName),
map(aMap)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_role_failed) << name;
}
public:
Firebird::MetaName name;
bool map;
};
class DropRoleNode : public DdlNode
{
public:
DropRoleNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_role_failed) << name;
}
public:
Firebird::MetaName name;
};
class CreateAlterUserNode : public DdlNode
{
public:
CreateAlterUserNode(MemoryPool& p, bool creating, const Firebird::MetaName& aName)
: DdlNode(p),
isCreating(creating),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isCreating ?
isc_dsql_create_user_failed : isc_dsql_alter_user_failed) << name;
}
public:
const bool isCreating;
const Firebird::MetaName name;
const Firebird::string* password;
const Firebird::string* firstName;
const Firebird::string* middleName;
const Firebird::string* lastName;
Nullable<int> adminRole;
};
class DropUserNode : public DdlNode
{
public:
DropUserNode(MemoryPool& p, const Firebird::MetaName& aName)
: DdlNode(p),
name(p, aName)
{
}
public:
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_drop_user_failed) << name;
}
public:
Firebird::MetaName name;
2010-01-10 18:32:40 +01:00
};
class AlterDatabaseNode : public DdlNode
{
public:
static const unsigned CLAUSE_BEGIN_BACKUP = 0x01;
static const unsigned CLAUSE_END_BACKUP = 0x02;
static const unsigned CLAUSE_DROP_DIFFERENCE = 0x04;
public:
AlterDatabaseNode(MemoryPool& p)
: DdlNode(p),
create(false),
createLength(0),
clauses(0),
differenceFile(p),
setDefaultCharSet(p),
setDefaultCollation(p),
files(p)
{
}
public:
virtual DdlNode* dsqlPass(DsqlCompilerScratch* dsqlScratch)
{
dsqlScratch->getStatement()->setType(
create ? DsqlCompiledStatement::TYPE_CREATE_DB : DsqlCompiledStatement::TYPE_DDL);
return this;
}
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction);
protected:
virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector)
{
statusVector << Firebird::Arg::Gds(isc_dsql_alter_database_failed);
}
private:
static void changeBackupMode(thread_db* tdbb, jrd_tra* transaction, unsigned clause);
static void defineDifference(thread_db* tdbb, jrd_tra* transaction, const Firebird::PathName& file);
public:
bool create; // Is the node created with a CREATE DATABASE command?
SLONG createLength;
unsigned clauses;
Firebird::PathName differenceFile;
Firebird::MetaName setDefaultCharSet;
Firebird::MetaName setDefaultCollation;
Firebird::Array<DbFileClause*> files;
};
} // namespace
#endif // DSQL_DDL_NODES_H