8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:40:38 +01:00

Create system constraints for better error reporting. Change to GBAK must be backported to avoid future problems.

This commit is contained in:
asfernandes 2010-07-26 02:14:48 +00:00
parent 2c6529c303
commit be078848df
2 changed files with 32 additions and 13 deletions

View File

@ -3739,7 +3739,10 @@ void write_rel_constraints()
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
FOR (REQUEST_HANDLE req_handle1)
X IN RDB$RELATION_CONSTRAINTS
X IN RDB$RELATION_CONSTRAINTS CROSS
REL IN RDB$RELATIONS
WITH REL.RDB$RELATION_NAME EQ X.RDB$RELATION_NAME AND
(REL.RDB$SYSTEM_FLAG MISSING OR REL.RDB$SYSTEM_FLAG NE 1)
put(tdgbl, rec_rel_constraint);
const SSHORT l = PUT_TEXT (att_rel_constraint_name, X.RDB$CONSTRAINT_NAME);
MISC_terminate (X.RDB$CONSTRAINT_NAME, temp, l, sizeof(temp));

View File

@ -800,30 +800,32 @@ static void add_index_set(thread_db* tdbb)
SET_TDBB(tdbb);
Jrd::Attachment* attachment = tdbb->getAttachment();
Firebird::MetaName string;
index_desc idx;
AutoRequest handle1, handle2;
AutoRequest handle1, handle2, handle3;
for (int n = 0; n < SYSTEM_INDEX_COUNT; n++)
{
const ini_idx_t* index = &indices[n];
jrd_rel* relation = MET_relation(tdbb, index->ini_idx_relid);
Firebird::MetaName indexName;
indexName.printf("RDB$INDEX_%d", index->ini_idx_index_id);
STORE(REQUEST_HANDLE handle1) X IN RDB$INDICES
jrd_rel* relation = MET_relation(tdbb, index->ini_idx_relid);
PAD(relation->rel_name.c_str(), X.RDB$RELATION_NAME);
string.printf("RDB$INDEX_%d", index->ini_idx_index_id);
PAD(string.c_str(), X.RDB$INDEX_NAME);
PAD(indexName.c_str(), X.RDB$INDEX_NAME);
X.RDB$UNIQUE_FLAG = index->ini_idx_flags & idx_unique;
X.RDB$SEGMENT_COUNT = index->ini_idx_segment_count;
if (index->ini_idx_flags & idx_descending)
{
X.RDB$INDEX_TYPE.NULL = FALSE;
X.RDB$INDEX_TYPE = 1;
}
else {
else
X.RDB$INDEX_TYPE.NULL = TRUE;
}
X.RDB$SYSTEM_FLAG = RDB_system;
X.RDB$SYSTEM_FLAG.NULL = FALSE;
X.RDB$INDEX_INACTIVE = 0;
@ -842,16 +844,30 @@ static void add_index_set(thread_db* tdbb)
tail->idx_field = segment->ini_idx_rfld_id;
tail->idx_itype = segment->ini_idx_type;
tail->idx_selectivity = 0;
END_STORE;
END_STORE
}
idx.idx_count = index->ini_idx_segment_count;
idx.idx_flags = index->ini_idx_flags;
SelectivityList selectivity(*tdbb->getDefaultPool());
IDX_create_index(tdbb, relation, &idx, string.c_str(), NULL,
attachment->getSysTransaction(), selectivity);
X.RDB$INDEX_ID = idx.idx_id + 1;
END_STORE;
IDX_create_index(tdbb, relation, &idx, indexName.c_str(), NULL,
attachment->getSysTransaction(), selectivity);
X.RDB$INDEX_ID = idx.idx_id + 1;
END_STORE
if (index->ini_idx_flags & idx_unique)
{
STORE(REQUEST_HANDLE handle3) RC IN RDB$RELATION_CONSTRAINTS
PAD(indexName.c_str(), RC.RDB$CONSTRAINT_NAME);
PAD(indexName.c_str(), RC.RDB$INDEX_NAME);
PAD(relation->rel_name.c_str(), RC.RDB$RELATION_NAME);
strcpy(RC.RDB$CONSTRAINT_TYPE, UNIQUE_CNSTRT);
strcpy(RC.RDB$DEFERRABLE, "NO");
strcpy(RC.RDB$INITIALLY_DEFERRED, "NO");
END_STORE
}
}
}