Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion builds/win32/msvc15/engine_static.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@
<ClInclude Include="..\..\..\src\jrd\ibsetjmp.h" />
<ClInclude Include="..\..\..\src\jrd\idx.h" />
<ClInclude Include="..\..\..\src\jrd\idx_proto.h" />
<ClInclude Include="..\..\..\src\jrd\IndexSegment.h" />
<ClInclude Include="..\..\..\src\jrd\inf_proto.h" />
<ClInclude Include="..\..\..\src\include\firebird\impl\inf_pub.h" />
<ClInclude Include="..\..\..\src\jrd\ini.h" />
Expand Down Expand Up @@ -605,4 +606,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
6 changes: 5 additions & 1 deletion builds/win32/msvc15/engine_static.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,7 @@
<ClCompile Include="..\..\..\src\jrd\Resources.cpp">
<Filter>JRD files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\gen\jrd\Package.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h">
Expand Down Expand Up @@ -1164,6 +1165,9 @@
<ClInclude Include="..\..\..\src\jrd\os\pio_proto.h">
<Filter>Header files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\jrd\IndexSegment.h">
<Filter>Header files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\..\src\dsql\DdlNodes.epp">
Expand Down Expand Up @@ -1215,4 +1219,4 @@
<Filter>DSQL</Filter>
</None>
</ItemGroup>
</Project>
</Project>
3 changes: 3 additions & 0 deletions src/burp/backup.epp
Original file line number Diff line number Diff line change
Expand Up @@ -1726,6 +1726,9 @@ void put_index( burp_rel* relation)
SORTED BY Y.RDB$FIELD_POSITION
{
PUT_TEXT (att_index_field_name, Y.RDB$FIELD_NAME);

if (!Y.RDB$CHARACTER_LENGTH.NULL && Y.RDB$CHARACTER_LENGTH)
put_int32 (att_index_field_char_length, Y.RDB$CHARACTER_LENGTH);
}
END_FOR
ON_ERROR
Expand Down
4 changes: 4 additions & 0 deletions src/burp/burp.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ Version 12: FB6.0.
RDB$INDICES.RDB$PACKAGE_NAME and
RDB$INDEX_SEGMENTS.RDB$PACKAGE_NAME.

Optional length for index segments:
RDB$INDEX_SEGMENTS.RDB$CHARACTER_LENGTH

Custom aggregate function.
*/

Expand Down Expand Up @@ -382,6 +385,7 @@ enum att_type {
att_index_condition_source,
att_index_condition_blr,
att_index_foreign_key_schema_name,
att_index_field_char_length, // length of segment in characters, optional

// Data record

Expand Down
115 changes: 70 additions & 45 deletions src/burp/restore.epp
Original file line number Diff line number Diff line change
Expand Up @@ -6777,6 +6777,19 @@ bool get_index(BurpGlobals* tdgbl, const burp_rel* relation)

SSHORT count = 0, segments = 0;

struct IndexSegment
{
IndexSegment(MemoryPool& pool) :
name(pool)
{
}

string name;
int length = 0;
};

ObjectsArray<IndexSegment> arrSegments(*getDefaultMemoryPool());

STORE (REQUEST_HANDLE tdgbl->handles_get_index_req_handle1)
X IN RDB$INDICES
{
Expand Down Expand Up @@ -6857,26 +6870,22 @@ bool get_index(BurpGlobals* tdgbl, const burp_rel* relation)
break;

case att_index_field_name:
STORE (REQUEST_HANDLE tdgbl->handles_get_index_req_handle2)
Y IN RDB$INDEX_SEGMENTS
{
GET_TEXT(Y.RDB$FIELD_NAME);
strcpy(Y.RDB$INDEX_NAME, X.RDB$INDEX_NAME);
Y.RDB$FIELD_POSITION = count++;
{
BASED ON RDB$INDEX_SEGMENTS.RDB$FIELD_NAME segName;
GET_TEXT(segName);
auto& seg = arrSegments.add();
seg.name = segName;
break;
}

Y.RDB$SCHEMA_NAME.NULL = X.RDB$SCHEMA_NAME.NULL;
if (!X.RDB$SCHEMA_NAME.NULL)
strcpy(Y.RDB$SCHEMA_NAME, X.RDB$SCHEMA_NAME);
case att_index_field_char_length:
{
fb_assert(arrSegments.hasData());

Y.RDB$PACKAGE_NAME.NULL = X.RDB$PACKAGE_NAME.NULL;
if (!X.RDB$PACKAGE_NAME.NULL)
strcpy(Y.RDB$PACKAGE_NAME, X.RDB$PACKAGE_NAME);
}
END_STORE
ON_ERROR
general_on_error ();
END_ERROR
auto& seg = arrSegments.back();
seg.length = get_int32(tdgbl);
break;
}

case att_index_description:
X.RDB$DESCRIPTION.NULL = FALSE;
Expand Down Expand Up @@ -6948,43 +6957,59 @@ bool get_index(BurpGlobals* tdgbl, const burp_rel* relation)
}

count = 0;
FOR (REQUEST_HANDLE tdgbl->handles_get_index_req_handle3)
RFR IN RDB$RELATION_FIELDS
CROSS IDS IN RDB$INDEX_SEGMENTS
WITH RFR.RDB$SCHEMA_NAME EQUIV NULLIF(relation->rel_name.schema.c_str(), '') AND
RFR.RDB$PACKAGE_NAME EQUIV NULLIF(relation->rel_name.package.c_str(), '') AND
RFR.RDB$RELATION_NAME = relation->rel_name.object.c_str() AND
IDS.RDB$SCHEMA_NAME EQUIV RFR.RDB$SCHEMA_NAME AND
IDS.RDB$PACKAGE_NAME EQUIV RFR.RDB$PACKAGE_NAME AND
IDS.RDB$FIELD_NAME = RFR.RDB$FIELD_NAME AND
IDS.RDB$INDEX_NAME = index_name
for (const auto& seg : arrSegments)
{
count++;
}
END_FOR
ON_ERROR
general_on_error ();
END_ERROR
FOR (REQUEST_HANDLE tdgbl->handles_get_index_req_handle3)
RFR IN RDB$RELATION_FIELDS
WITH RFR.RDB$SCHEMA_NAME EQUIV NULLIF(relation->rel_name.schema.c_str(), '') AND
RFR.RDB$PACKAGE_NAME EQUIV NULLIF(relation->rel_name.package.c_str(), '') AND
RFR.RDB$RELATION_NAME = relation->rel_name.object.c_str() AND
RFR.RDB$FIELD_NAME = seg.name.c_str()
{
count++;
}
END_FOR
ON_ERROR
general_on_error ();
END_ERROR
};

if (count != segments)
return false;

count = 0;
for (const auto& seg : arrSegments)
{
FOR (REQUEST_HANDLE tdgbl->handles_get_index_req_handle4)
IDS IN RDB$INDEX_SEGMENTS
WITH IDS.RDB$SCHEMA_NAME EQUIV NULLIF(relation->rel_name.schema.c_str(), '') AND
IDS.RDB$PACKAGE_NAME EQUIV NULLIF(relation->rel_name.package.c_str(), '') AND
IDS.RDB$INDEX_NAME = index_name
STORE (REQUEST_HANDLE tdgbl->handles_get_index_req_handle2)
Y IN RDB$INDEX_SEGMENTS
{
ERASE IDS;
ON_ERROR
general_on_error ();
END_ERROR
strcpy(Y.RDB$FIELD_NAME, seg.name.c_str());

strcpy(Y.RDB$INDEX_NAME, X.RDB$INDEX_NAME);
Y.RDB$FIELD_POSITION = count++;

Y.RDB$SCHEMA_NAME.NULL = X.RDB$SCHEMA_NAME.NULL;
if (!X.RDB$SCHEMA_NAME.NULL)
strcpy(Y.RDB$SCHEMA_NAME, X.RDB$SCHEMA_NAME);

Y.RDB$PACKAGE_NAME.NULL = X.RDB$PACKAGE_NAME.NULL;
if (!X.RDB$PACKAGE_NAME.NULL)
strcpy(Y.RDB$PACKAGE_NAME, X.RDB$PACKAGE_NAME);

if (seg.length == 0)
{
Y.RDB$CHARACTER_LENGTH.NULL = TRUE;
}
else
{
Y.RDB$CHARACTER_LENGTH.NULL = FALSE;
Y.RDB$CHARACTER_LENGTH = seg.length;
}
}
END_FOR
END_STORE
ON_ERROR
general_on_error ();

END_ERROR
return false;
}
}
END_STORE
Expand Down
Loading
Loading