8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-24 04:43:03 +01:00

const correctness, bool, etc.

locksmith is harmless => root/administrator/sysdba, nothing mysterious.
This commit is contained in:
robocop 2003-09-09 11:07:19 +00:00
parent 50451feed9
commit 79e4522ffe
11 changed files with 489 additions and 627 deletions

View File

@ -42,7 +42,7 @@ extern "C" {
/* When converting non-text values to text, how many bytes to allocate /* When converting non-text values to text, how many bytes to allocate
for holding the text image of the value. */ for holding the text image of the value. */
static USHORT const _DSC_convert_to_text_length[DTYPE_TYPE_MAX] = static const USHORT _DSC_convert_to_text_length[DTYPE_TYPE_MAX] =
{ {
0, /* dtype_null */ 0, /* dtype_null */
0, /* dtype_text */ 0, /* dtype_text */
@ -764,7 +764,7 @@ void DLL_EXPORT DSC_make_descriptor(
USHORT blr_type, USHORT blr_type,
SSHORT scale, SSHORT scale,
USHORT length, USHORT length,
SSHORT sub_type, SSHORT charset, SSHORT collation) SSHORT sub_type, SSHORT charset, SSHORT collation)
{ {
/************************************** /**************************************
* *
@ -883,23 +883,23 @@ SSHORT sub_type, SSHORT charset, SSHORT collation)
} }
int DLL_EXPORT DSC_string_length(DSC* desc) int DLL_EXPORT DSC_string_length(const dsc* desc)
{ {
/************************************** /**************************************
* *
* D S C _ s t r i n g _ l e n g t h * D S C _ s t r i n g _ l e n g t h
* *
************************************** **************************************
* *
* Functional description * Functional description
* Estimate length of string (in bytes) based on descriptor. * Estimate length of string (in bytes) based on descriptor.
* Estimated length assumes representing string in * Estimated length assumes representing string in
* narrow-char ASCII format. * narrow-char ASCII format.
* *
* Note that this strips off the short at the * Note that this strips off the short at the
* start of dtype_varying, and the NULL for dtype_cstring. * start of dtype_varying, and the NULL for dtype_cstring.
* *
**************************************/ **************************************/
switch (desc->dsc_dtype) { switch (desc->dsc_dtype) {
case dtype_text: case dtype_text:
@ -925,16 +925,16 @@ int DLL_EXPORT DSC_string_length(DSC* desc)
const TEXT *DSC_dtype_tostring(UCHAR dtype) const TEXT *DSC_dtype_tostring(UCHAR dtype)
{ {
/************************************** /**************************************
* *
* D S C _ d t y p e _ t o s t r i n g * D S C _ d t y p e _ t o s t r i n g
* *
************************************** **************************************
* *
* Functional description * Functional description
* Convert a datatype to its textual representation * Convert a datatype to its textual representation
* *
**************************************/ **************************************/
if (dtype < FB_NELEM(DSC_dtype_names)) if (dtype < FB_NELEM(DSC_dtype_names))
return DSC_dtype_names[dtype]; return DSC_dtype_names[dtype];
else else
@ -942,19 +942,22 @@ const TEXT *DSC_dtype_tostring(UCHAR dtype)
} }
void DLL_EXPORT DSC_get_dtype_name(DSC * desc, TEXT * buffer, USHORT len) void DLL_EXPORT DSC_get_dtype_name(const dsc* desc, TEXT * buffer, USHORT len)
{ {
/************************************** /**************************************
* *
* D S C _ g e t _ d t y p e _ n a m e * D S C _ g e t _ d t y p e _ n a m e
* *
************************************** **************************************
* *
* Functional description * Functional description
* Convert a datatype to its textual representation * Convert a datatype to its textual representation
* *
**************************************/ **************************************/
// This function didn't put a string terminator even though
// it's calling strncpy that doesn't put it if source > target.
strncpy(buffer, DSC_dtype_tostring(desc->dsc_dtype), len); strncpy(buffer, DSC_dtype_tostring(desc->dsc_dtype), len);
buffer[len - 1] = 0;
} }

View File

@ -21,8 +21,8 @@
* Contributor(s): ______________________________________. * Contributor(s): ______________________________________.
*/ */
#ifndef _JRD_DSC_PROTO_H_ #ifndef JRD_DSC_PROTO_H
#define _JRD_DSC_PROTO_H_ #define JRD_DSC_PROTO_H
#include "../jrd/dsc.h" #include "../jrd/dsc.h"
@ -30,9 +30,9 @@
extern "C" { extern "C" {
#endif #endif
extern int DLL_EXPORT DSC_string_length(struct dsc *); extern int DLL_EXPORT DSC_string_length(const struct dsc*);
extern const TEXT *DSC_dtype_tostring(UCHAR); extern const TEXT *DSC_dtype_tostring(UCHAR);
extern void DLL_EXPORT DSC_get_dtype_name(struct dsc *, TEXT *, USHORT); extern void DLL_EXPORT DSC_get_dtype_name(const struct dsc*, TEXT *, USHORT);
extern void DLL_EXPORT DSC_make_descriptor(struct dsc *, USHORT, SSHORT, extern void DLL_EXPORT DSC_make_descriptor(struct dsc *, USHORT, SSHORT,
USHORT, SSHORT, SSHORT, SSHORT); USHORT, SSHORT, SSHORT, SSHORT);
extern USHORT DLL_EXPORT DSC_convert_to_text_length(USHORT dsc_type); extern USHORT DLL_EXPORT DSC_convert_to_text_length(USHORT dsc_type);
@ -46,4 +46,5 @@ extern const BYTE DSC_multiply_blr4_result[DTYPE_TYPE_MAX][DTYPE_TYPE_MAX];
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif /* _JRD_DSC_PROTO_H_ */ #endif /* JRD_DSC_PROTO_H */

View File

@ -82,12 +82,13 @@ DATABASE DB = STATIC "ODS.RDB";
static void grant(GBL, UCHAR **); static void grant(GBL, UCHAR **);
static bool grantor_can_grant_role(TDBB, GBL, TEXT *, TEXT *); static bool grantor_can_grant_role(TDBB, GBL, const TEXT*, const TEXT*);
static bool grantor_can_grant(GBL, TEXT *, TEXT *, TEXT *, TEXT *, bool); static bool grantor_can_grant(GBL, const TEXT*, const TEXT*, const TEXT*,
const TEXT*, bool);
static void revoke_permission(GBL, UCHAR **); static void revoke_permission(GBL, UCHAR **);
static void store_privilege(GBL, TEXT *, TEXT *, TEXT *, TEXT *, SSHORT, static void store_privilege(GBL, const TEXT*, const TEXT*, const TEXT*,
SSHORT, int); const TEXT*, SSHORT, SSHORT, int);
static void set_field_class_name(GBL, TEXT *, TEXT *); static void set_field_class_name(GBL, const TEXT*, const TEXT*);
void DYN_ddl(ATT attachment, JRD_TRA transaction, USHORT length, UCHAR * ddl) void DYN_ddl(ATT attachment, JRD_TRA transaction, USHORT length, UCHAR * ddl)
@ -193,11 +194,11 @@ void DYN_ddl(ATT attachment, JRD_TRA transaction, USHORT length, UCHAR * ddl)
void DYN_error(USHORT status_flag, void DYN_error(USHORT status_flag,
USHORT number, USHORT number,
TEXT* arg1, const TEXT* arg1,
TEXT* arg2, const TEXT* arg2,
TEXT* arg3, const TEXT* arg3,
TEXT* arg4, const TEXT* arg4,
TEXT* arg5) const TEXT* arg5)
{ {
/************************************** /**************************************
* *
@ -209,12 +210,7 @@ void DYN_error(USHORT status_flag,
* DDL failed. * DDL failed.
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
ISC_STATUS_ARRAY local_status;
ISC_STATUS *v1, *v2, *end, arg;
tdbb = GET_THREAD_DATA;
if (tdbb->tdbb_status_vector[1] == gds_no_meta_update) if (tdbb->tdbb_status_vector[1] == gds_no_meta_update)
return; return;
@ -226,7 +222,8 @@ void DYN_error(USHORT status_flag,
sizeof(TEXT) * BUFFER_MEDIUM, error_buffer, arg1, sizeof(TEXT) * BUFFER_MEDIUM, error_buffer, arg1,
arg2, arg3, arg4, arg5); arg2, arg3, arg4, arg5);
v1 = local_status; ISC_STATUS_ARRAY local_status;
ISC_STATUS* v1 = local_status;
*v1++ = gds_arg_gds; *v1++ = gds_arg_gds;
*v1++ = gds_no_meta_update; *v1++ = gds_no_meta_update;
@ -237,11 +234,12 @@ void DYN_error(USHORT status_flag,
*v1++ = (ISC_STATUS) ERR_cstring(error_buffer); *v1++ = (ISC_STATUS) ERR_cstring(error_buffer);
} }
if (status_flag) { if (status_flag) {
v2 = tdbb->tdbb_status_vector; ISC_STATUS* v2 = tdbb->tdbb_status_vector;
/* check every other argument for end of vector */ /* check every other argument for end of vector */
end = local_status + sizeof(local_status) - 1; ISC_STATUS arg;
ISC_STATUS* const end = local_status + sizeof(local_status) - 1;
while (v1 < end && while (v1 < end &&
((arg = *v2++) != gds_arg_cstring || v1 + 1 < end) && ((arg = *v2++) != gds_arg_cstring || v1 + 1 < end) &&
(*v1++ = arg)) { (*v1++ = arg)) {
@ -251,20 +249,21 @@ void DYN_error(USHORT status_flag,
} }
} }
*v1 = gds_arg_end; *v1 = gds_arg_end;
end = v1 + 1; ISC_STATUS* const end = v1 + 1;
for (v1 = local_status, v2 = tdbb->tdbb_status_vector; v1 < end;) ISC_STATUS* dest;
*v2++ = *v1++; for (v1 = local_status, dest = tdbb->tdbb_status_vector; v1 < end;)
*dest++ = *v1++;
} }
void DYN_error_punt(USHORT status_flag, void DYN_error_punt(USHORT status_flag,
USHORT number, USHORT number,
TEXT* arg1, const TEXT* arg1,
TEXT* arg2, const TEXT* arg2,
TEXT* arg3, const TEXT* arg3,
TEXT* arg4, const TEXT* arg4,
TEXT* arg5) const TEXT* arg5)
{ {
/************************************** /**************************************
* *
@ -282,8 +281,8 @@ void DYN_error_punt(USHORT status_flag,
} }
BOOLEAN DYN_is_it_sql_role(GBL gbl, bool DYN_is_it_sql_role(GBL gbl,
TEXT* input_name, const TEXT* input_name,
TEXT* output_name, TEXT* output_name,
TDBB tdbb) TDBB tdbb)
{ {
@ -295,26 +294,21 @@ BOOLEAN DYN_is_it_sql_role(GBL gbl,
* *
* Functional description * Functional description
* *
* If input_name is found in RDB$ROLES, then returns TRUE. Otherwise * If input_name is found in RDB$ROLES, then returns true. Otherwise
* returns FALSE. * returns false.
* *
**************************************/ **************************************/
DBB dbb;
BLK request;
BOOLEAN found;
USHORT major_version, minor_original;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
major_version = (SSHORT) dbb->dbb_ods_version; USHORT major_version = dbb->dbb_ods_version;
minor_original = (SSHORT) dbb->dbb_minor_original; USHORT minor_original = dbb->dbb_minor_original;
found = FALSE; bool found = false;
if (ENCODE_ODS(major_version, minor_original) < ODS_9_0) if (ENCODE_ODS(major_version, minor_original) < ODS_9_0)
return found; return found;
request = (BLK) CMP_find_request(tdbb, drq_get_role_nm, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_get_role_nm, DYN_REQUESTS);
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
X IN RDB$ROLES WITH X IN RDB$ROLES WITH
@ -322,7 +316,7 @@ BOOLEAN DYN_is_it_sql_role(GBL gbl,
if (!DYN_REQUEST(drq_get_role_nm)) if (!DYN_REQUEST(drq_get_role_nm))
DYN_REQUEST(drq_get_role_nm) = request; DYN_REQUEST(drq_get_role_nm) = request;
found = TRUE; found = true;
DYN_terminate(X.RDB$OWNER_NAME, sizeof(X.RDB$OWNER_NAME)); DYN_terminate(X.RDB$OWNER_NAME, sizeof(X.RDB$OWNER_NAME));
strcpy(output_name, X.RDB$OWNER_NAME); strcpy(output_name, X.RDB$OWNER_NAME);
@ -641,14 +635,13 @@ USHORT DYN_get_string(TEXT ** ptr, TEXT * field, USHORT size, USHORT err_flag)
* Strings need enough space for null pad. * Strings need enough space for null pad.
* *
**************************************/ **************************************/
TEXT *p; USHORT e = 0;
USHORT l, e, length; TEXT* p = *ptr;
USHORT length = (UCHAR) *p++;
e = 0;
p = *ptr;
length = (UCHAR) * p++;
length |= ((USHORT) ((UCHAR) (*p++))) << 8; length |= ((USHORT) ((UCHAR) (*p++))) << 8;
if ( (l = length) ) {
USHORT l = length;
if (l) {
if (length >= size) { if (length >= size) {
if (err_flag) if (err_flag)
DYN_error_punt(FALSE, 159, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(FALSE, 159, NULL, NULL, NULL, NULL, NULL);
@ -683,15 +676,10 @@ USHORT DYN_put_blr_blob(GBL gbl, UCHAR** ptr, GDS__QUAD* blob_id)
* Write out a blr blob. * Write out a blr blob.
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
BLB blob;
USHORT length;
UCHAR* p;
tdbb = GET_THREAD_DATA; UCHAR *p = *ptr;
USHORT length = *p++;
p = *ptr;
length = *p++;
length |= (*p++) << 8; length |= (*p++) << 8;
if (!length) { if (!length) {
@ -700,7 +688,7 @@ USHORT DYN_put_blr_blob(GBL gbl, UCHAR** ptr, GDS__QUAD* blob_id)
} }
try { try {
blob = BLB_create(tdbb, gbl->gbl_transaction, (BID)blob_id); BLB blob = BLB_create(tdbb, gbl->gbl_transaction, (BID)blob_id);
BLB_put_segment(tdbb, blob, p, length); BLB_put_segment(tdbb, blob, p, length);
BLB_close(tdbb, blob); BLB_close(tdbb, blob);
} }
@ -726,15 +714,10 @@ USHORT DYN_put_text_blob(GBL gbl, UCHAR ** ptr, GDS__QUAD * blob_id)
* Write out a text blob. * Write out a text blob.
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
USHORT length;
UCHAR *p, *end;
BLB blob;
tdbb = GET_THREAD_DATA; UCHAR* p = *ptr;
USHORT length = *p++;
p = *ptr;
length = *p++;
length |= (*p++) << 8; length |= (*p++) << 8;
if (!length) { if (!length) {
@ -742,8 +725,11 @@ USHORT DYN_put_text_blob(GBL gbl, UCHAR ** ptr, GDS__QUAD * blob_id)
return length; return length;
} }
// make the code die at some place if DYN_error_punt doesn't jump far away.
UCHAR *end = NULL;
try { try {
blob = BLB_create(tdbb, gbl->gbl_transaction, (BID)blob_id); BLB blob = BLB_create(tdbb, gbl->gbl_transaction, (BID)blob_id);
for (end = p + length; p < end; p += TEXT_BLOB_LENGTH) for (end = p + length; p < end; p += TEXT_BLOB_LENGTH)
{ {
@ -805,11 +791,8 @@ USHORT DYN_skip_attribute(UCHAR ** ptr)
* size of count bytes). * size of count bytes).
* *
**************************************/ **************************************/
UCHAR *p; UCHAR* p = *ptr;
USHORT length; USHORT length = *p++;
p = *ptr;
length = *p++;
length |= (*p++) << 8; length |= (*p++) << 8;
*ptr = p + length; *ptr = p + length;
@ -830,10 +813,8 @@ void DYN_terminate( TEXT * string, int length)
* terminated with a NULL. * terminated with a NULL.
* *
**************************************/ **************************************/
TEXT *p, *q; TEXT* q = string - 1;
for (TEXT* p = string; *p && --length; p++) {
q = string - 1;
for (p = string; *p && --length; p++) {
if (*p != BLANK) if (*p != BLANK)
q = p; q = p;
} }
@ -855,8 +836,6 @@ static void grant( GBL gbl, UCHAR ** ptr)
* *
**************************************/ **************************************/
BLK request;
//volatile SSHORT err_num;
volatile SSHORT id; volatile SSHORT id;
TEXT privileges[16]; TEXT privileges[16];
TEXT object[32]; TEXT object[32];
@ -872,8 +851,8 @@ static void grant( GBL gbl, UCHAR ** ptr)
TDBB tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
DBB dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
USHORT major_version = (SSHORT) dbb->dbb_ods_version; USHORT major_version = dbb->dbb_ods_version;
USHORT minor_original = (SSHORT) dbb->dbb_minor_original; USHORT minor_original = dbb->dbb_minor_original;
GET_STRING(ptr, privileges); GET_STRING(ptr, privileges);
if (!strcmp(privileges, "A")) { if (!strcmp(privileges, "A")) {
@ -994,6 +973,7 @@ static void grant( GBL gbl, UCHAR ** ptr)
} }
} }
BLK request = NULL;
try { try {
@ -1177,10 +1157,10 @@ do_punt: // ugly, rethink logic of this function
static bool grantor_can_grant( GBL gbl, static bool grantor_can_grant( GBL gbl,
TEXT* grantor, const TEXT* grantor,
TEXT* privilege, const TEXT* privilege,
TEXT* relation_name, const TEXT* relation_name,
TEXT* field_name, const TEXT* field_name,
bool top_level) bool top_level)
{ {
/************************************** /**************************************
@ -1194,40 +1174,28 @@ static bool grantor_can_grant( GBL gbl,
* FALSE otherwise. * FALSE otherwise.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
/* Remember the grant option for non field-specific user-privileges, and the
grant option for the user-privileges for the input field.
-1 = no privilege found (yet)
0 = privilege without grant option found
1 = privilege with grant option found */
SSHORT go_rel = -1;
SSHORT go_fld = -1;
BLK request;
BOOLEAN sql_relation = FALSE;
BOOLEAN relation_exists = FALSE;
BOOLEAN field_exists = FALSE;
BOOLEAN grantor_is_owner = FALSE;
volatile USHORT err_num; volatile USHORT err_num;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
/* Verify that the input relation exists. */ /* Verify that the input relation exists. */
request = (BLK) CMP_find_request(tdbb, drq_gcg4, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_gcg4, DYN_REQUESTS);
try { try {
err_num = 182; /* for the longjump */ err_num = 182; /* for the longjump */
bool sql_relation = false;
bool relation_exists = false;
/* SELECT RDB$RELATIONS failed in grant */ /* SELECT RDB$RELATIONS failed in grant */
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
REL IN RDB$RELATIONS WITH REL IN RDB$RELATIONS WITH
REL.RDB$RELATION_NAME = relation_name relation_exists = TRUE; REL.RDB$RELATION_NAME = relation_name
relation_exists = true;
if ((!REL.RDB$FLAGS.NULL) && (REL.RDB$FLAGS & REL_sql)) if ((!REL.RDB$FLAGS.NULL) && (REL.RDB$FLAGS & REL_sql))
sql_relation = TRUE; sql_relation = true;
if (!DYN_REQUEST(drq_gcg4)) if (!DYN_REQUEST(drq_gcg4))
DYN_REQUEST(drq_gcg4) = request; DYN_REQUEST(drq_gcg4) = request;
END_FOR; END_FOR;
@ -1244,6 +1212,8 @@ static bool grantor_can_grant( GBL gbl,
if (field_name[0]) if (field_name[0])
{ {
err_num = 183; err_num = 183;
bool field_exists = false;
/* SELECT RDB$RELATION_FIELDS failed in grant */ /* SELECT RDB$RELATION_FIELDS failed in grant */
request = (BLK) CMP_find_request(tdbb, drq_gcg5, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_gcg5, DYN_REQUESTS);
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
@ -1251,7 +1221,7 @@ static bool grantor_can_grant( GBL gbl,
G_FLD.RDB$RELATION_NAME = relation_name AND G_FLD.RDB$RELATION_NAME = relation_name AND
G_FLD.RDB$FIELD_NAME = field_name if (!DYN_REQUEST(drq_gcg5)) G_FLD.RDB$FIELD_NAME = field_name if (!DYN_REQUEST(drq_gcg5))
DYN_REQUEST(drq_gcg5) = request; DYN_REQUEST(drq_gcg5) = request;
field_exists = TRUE; field_exists = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_gcg5)) if (!DYN_REQUEST(drq_gcg5))
DYN_REQUEST(drq_gcg5) = request; DYN_REQUEST(drq_gcg5) = request;
@ -1273,6 +1243,7 @@ static bool grantor_can_grant( GBL gbl,
entries in the rdb$user_privileges table. Give the owner of a GDML entries in the rdb$user_privileges table. Give the owner of a GDML
table all privileges. */ table all privileges. */
err_num = 184; err_num = 184;
bool grantor_is_owner = false;
/* SELECT RDB$RELATIONS/RDB$OWNER_NAME failed in grant */ /* SELECT RDB$RELATIONS/RDB$OWNER_NAME failed in grant */
request = (BLK) CMP_find_request(tdbb, drq_gcg2, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_gcg2, DYN_REQUESTS);
@ -1282,7 +1253,7 @@ static bool grantor_can_grant( GBL gbl,
REL.RDB$OWNER_NAME = UPPERCASE(grantor) REL.RDB$OWNER_NAME = UPPERCASE(grantor)
if (!DYN_REQUEST(drq_gcg2)) if (!DYN_REQUEST(drq_gcg2))
DYN_REQUEST(drq_gcg2) = request; DYN_REQUEST(drq_gcg2) = request;
grantor_is_owner = TRUE; grantor_is_owner = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_gcg2)) if (!DYN_REQUEST(drq_gcg2))
DYN_REQUEST(drq_gcg2) = request; DYN_REQUEST(drq_gcg2) = request;
@ -1290,6 +1261,15 @@ static bool grantor_can_grant( GBL gbl,
return true; return true;
} }
// Remember the grant option for non field-specific user-privileges, and
// the grant option for the user-privileges for the input field.
// -1 = no privilege found (yet)
// 0 = privilege without grant option found
// 1 = privilege with grant option found
SSHORT go_rel = -1;
SSHORT go_fld = -1;
/* Verify that the grantor has the grant option for this relation/field /* Verify that the grantor has the grant option for this relation/field
in the rdb$user_privileges. If not, then we don't need to look further. */ in the rdb$user_privileges. If not, then we don't need to look further. */
@ -1460,8 +1440,8 @@ static bool grantor_can_grant( GBL gbl,
static bool grantor_can_grant_role( TDBB tdbb, static bool grantor_can_grant_role( TDBB tdbb,
GBL gbl, GBL gbl,
TEXT* grantor, const TEXT* grantor,
TEXT* role_name) const TEXT* role_name)
{ {
/************************************** /**************************************
* *
@ -1574,47 +1554,38 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
* 1994-August-2 Rich Damon & David Schnepper * 1994-August-2 Rich Damon & David Schnepper
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
//BLK old_request;
volatile USHORT old_id, id; volatile USHORT old_id, id;
UCHAR verb; UCHAR verb;
SSHORT user_type, obj_type; TEXT privileges[16], object[32], field[32], user[32], temp[2];
TEXT privileges[16], object[32], field[32], user[32], *p, *q, temp[2];
USHORT all_privs = FALSE;
int options;
USHORT grant_erased;
USR revoking_user;
TEXT revoking_user_name[32], dummy_name[32]; TEXT revoking_user_name[32], dummy_name[32];
//TEXT grantor[32], *ptr2; //TEXT grantor[32], *ptr2;
TEXT *ptr1; TEXT *ptr1;
USHORT major_version, minor_original;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
major_version = (SSHORT) dbb->dbb_ods_version; USHORT major_version = dbb->dbb_ods_version;
minor_original = (SSHORT) dbb->dbb_minor_original; USHORT minor_original = dbb->dbb_minor_original;
/* Stash away a copy of the revoker's name, in uppercase form */ /* Stash away a copy of the revoker's name, in uppercase form */
revoking_user = tdbb->tdbb_attachment->att_user; const usr* revoking_user = tdbb->tdbb_attachment->att_user;
for (p = revoking_user->usr_user_name, q = revoking_user_name; *p; TEXT* q = revoking_user_name;
p++, q++) for (const TEXT* p = revoking_user->usr_user_name; *p; p++, q++)
*q = UPPER7(*p); *q = UPPER7(*p);
*q = 0; *q = 0;
GET_STRING(ptr, privileges); GET_STRING(ptr, privileges);
if (!strcmp(privileges, "A")) { if (!strcmp(privileges, "A")) {
strcpy(privileges, ALL_PRIVILEGES); strcpy(privileges, ALL_PRIVILEGES);
all_privs = TRUE;
} }
object[0] = field[0] = user[0] = 0; object[0] = field[0] = user[0] = 0;
obj_type = user_type = -1;
options = 0; int options = 0;
SSHORT user_type = -1;
SSHORT obj_type = -1;
while ((verb = *(*ptr)++) != gds_dyn_end) while ((verb = *(*ptr)++) != gds_dyn_end)
switch (verb) { switch (verb) {
@ -1718,7 +1689,7 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
DYN_unsupported_verb(); DYN_unsupported_verb();
} }
request = (BLK)CMP_find_request(tdbb, BLK request = (BLK)CMP_find_request(tdbb,
(USHORT)(field[0] ? drq_e_grant1 : drq_e_grant2), (USHORT)(field[0] ? drq_e_grant1 : drq_e_grant2),
DYN_REQUESTS); DYN_REQUESTS);
id = field[0] ? drq_e_grant1 : drq_e_grant2; id = field[0] ? drq_e_grant1 : drq_e_grant2;
@ -1726,9 +1697,9 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
try { try {
temp[1] = 0; temp[1] = 0;
for (p = privileges; (temp[0] = *p); p++) for (const TEXT* pr = privileges; (temp[0] = *pr); pr++)
{ {
grant_erased = FALSE; bool grant_erased = false;
if (field[0]) if (field[0])
{ {
@ -1748,7 +1719,7 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
(!strcmp(PRIV.RDB$GRANTOR, revoking_user_name))) (!strcmp(PRIV.RDB$GRANTOR, revoking_user_name)))
{ {
ERASE PRIV; ERASE PRIV;
grant_erased = TRUE; grant_erased = true;
}; };
END_FOR; END_FOR;
@ -1778,7 +1749,7 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
if ((revoking_user->usr_flags & USR_locksmith) || if ((revoking_user->usr_flags & USR_locksmith) ||
(!strcmp(PRIV.RDB$GRANTOR, revoking_user_name))) { (!strcmp(PRIV.RDB$GRANTOR, revoking_user_name))) {
ERASE PRIV; ERASE PRIV;
grant_erased = TRUE; grant_erased = true;
} }
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_e_grant2)) if (!DYN_REQUEST(drq_e_grant2))
@ -1829,7 +1800,7 @@ static void revoke_permission(GBL gbl, UCHAR ** ptr)
} }
static void set_field_class_name(GBL gbl, TEXT * relation, TEXT * field) static void set_field_class_name(GBL gbl, const TEXT* relation, const TEXT* field)
{ {
/************************************** /**************************************
* *
@ -1842,17 +1813,13 @@ static void set_field_class_name(GBL gbl, TEXT * relation, TEXT * field)
* field has a unique class name. * field has a unique class name.
* *
**************************************/ **************************************/
BLK request, request2 = NULL; TDBB tdbb = GET_THREAD_DATA;
BOOLEAN unique = FALSE; DBB dbb = tdbb->tdbb_database;
TDBB tdbb;
DBB dbb;
BLK request = (BLK) CMP_find_request(tdbb, drq_s_f_class, DYN_REQUESTS);
BLK request2 = NULL;
tdbb = GET_THREAD_DATA; bool unique = false;
dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_s_f_class, DYN_REQUESTS);
FOR (REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR (REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
RFR IN RDB$RELATION_FIELDS RFR IN RDB$RELATION_FIELDS
@ -1867,12 +1834,12 @@ static void set_field_class_name(GBL gbl, TEXT * relation, TEXT * field)
DPM_gen_id(tdbb, DPM_gen_id(tdbb,
MET_lookup_generator(tdbb, "RDB$SECURITY_CLASS"), 0, (SINT64) 1)); MET_lookup_generator(tdbb, "RDB$SECURITY_CLASS"), 0, (SINT64) 1));
unique = TRUE; unique = true;
request2 = (BLK) CMP_find_request(tdbb, drq_s_u_class, DYN_REQUESTS); request2 = (BLK) CMP_find_request(tdbb, drq_s_u_class, DYN_REQUESTS);
FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE gbl->gbl_transaction) FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE gbl->gbl_transaction)
RFR1 IN RDB$RELATION_FIELDS RFR1 IN RDB$RELATION_FIELDS
WITH RFR1.RDB$SECURITY_CLASS = RFR.RDB$SECURITY_CLASS WITH RFR1.RDB$SECURITY_CLASS = RFR.RDB$SECURITY_CLASS
unique = FALSE; unique = false;
END_FOR; END_FOR;
} }
@ -1891,10 +1858,10 @@ static void set_field_class_name(GBL gbl, TEXT * relation, TEXT * field)
static void store_privilege(GBL gbl, static void store_privilege(GBL gbl,
TEXT* object, const TEXT* object,
TEXT* user, const TEXT* user,
TEXT* field, const TEXT* field,
TEXT* privilege, const TEXT* privilege,
SSHORT user_type, SSHORT user_type,
SSHORT obj_type, SSHORT obj_type,
int option) int option)
@ -1910,14 +1877,10 @@ static void store_privilege(GBL gbl,
* routine should not. * routine should not.
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
DBB dbb; DBB dbb = tdbb->tdbb_database;
BLK request;
tdbb = GET_THREAD_DATA; BLK request = (BLK) CMP_find_request(tdbb, drq_s_grant, DYN_REQUESTS);
dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_s_grant, DYN_REQUESTS);
/* need to unwind our own request here!! SM 27-Sep-96 */ /* need to unwind our own request here!! SM 27-Sep-96 */
@ -1949,3 +1912,4 @@ static void store_privilege(GBL gbl,
/* msg 79: "STORE RDB$USER_PRIVILEGES failed in grant" */ /* msg 79: "STORE RDB$USER_PRIVILEGES failed in grant" */
} }
} }

View File

@ -21,8 +21,8 @@
* Contributor(s): ______________________________________. * Contributor(s): ______________________________________.
*/ */
#ifndef _JRD_DYN_H_ #ifndef JRD_DYN_H
#define _JRD_DYN_H_ #define JRD_DYN_H
#define ALL_PRIVILEGES "SIUDR" #define ALL_PRIVILEGES "SIUDR"
/* all applicable grant/revoke privileges */ /* all applicable grant/revoke privileges */
@ -69,15 +69,17 @@ typedef struct dyn_fld {
} *DYN_FLD; } *DYN_FLD;
extern void DYN_error(USHORT, USHORT, TEXT *, TEXT *, TEXT *, TEXT *, TEXT *); extern void DYN_error(USHORT, USHORT, const TEXT*, const TEXT*, const TEXT*,
extern void DYN_error_punt(USHORT, USHORT, TEXT *, TEXT *, TEXT *, TEXT *, const TEXT*, const TEXT*);
TEXT *); extern void DYN_error_punt(USHORT, USHORT, const TEXT*, const TEXT*,
const TEXT*, const TEXT*, const TEXT*);
extern void DYN_execute(GBL, UCHAR **, TEXT *, TEXT *, TEXT *, TEXT *, extern void DYN_execute(GBL, UCHAR **, TEXT *, TEXT *, TEXT *, TEXT *,
TEXT *); TEXT *);
extern SLONG DYN_get_number(UCHAR **); extern SLONG DYN_get_number(UCHAR **);
extern USHORT DYN_get_string(TEXT **, TEXT *, USHORT, USHORT); extern USHORT DYN_get_string(TEXT **, TEXT *, USHORT, USHORT);
extern void DYN_get_string2(TEXT **, TEXT *, USHORT); extern void DYN_get_string2(TEXT **, TEXT *, USHORT);
extern BOOLEAN DYN_is_it_sql_role(GBL, TEXT *, TEXT *, TDBB); // This function doesn't need to be exported currently.
extern bool DYN_is_it_sql_role(GBL, const TEXT*, TEXT*, TDBB);
extern USHORT DYN_put_blr_blob(GBL, UCHAR **, GDS__QUAD *); extern USHORT DYN_put_blr_blob(GBL, UCHAR **, GDS__QUAD *);
extern USHORT DYN_put_blr_blob2(GBL, UCHAR **, GDS__QUAD *); extern USHORT DYN_put_blr_blob2(GBL, UCHAR **, GDS__QUAD *);
extern USHORT DYN_put_text_blob(GBL, UCHAR **, GDS__QUAD *); extern USHORT DYN_put_text_blob(GBL, UCHAR **, GDS__QUAD *);
@ -87,4 +89,5 @@ extern USHORT DYN_skip_attribute(UCHAR **);
extern USHORT DYN_skip_attribute2(UCHAR **); extern USHORT DYN_skip_attribute2(UCHAR **);
extern void DYN_unsupported_verb(void); extern void DYN_unsupported_verb(void);
#endif /* _JRD_DYN_H_ */ #endif /* JRD_DYN_H */

View File

@ -115,10 +115,10 @@ static const UCHAR who_blr[] =
}; };
static void check_unique_name(TDBB, GBL, TEXT *, BOOLEAN); static void check_unique_name(TDBB, GBL, const TEXT*, bool);
static BOOLEAN find_field_source(TDBB, GBL, TEXT *, USHORT, TEXT *, TEXT *); static bool find_field_source(TDBB, GBL, const TEXT*, USHORT, const TEXT*, TEXT*);
static BOOLEAN get_who(TDBB, GBL, SCHAR *); static bool get_who(TDBB, GBL, SCHAR *);
static BOOLEAN is_it_user_name(GBL, TEXT *, TDBB); static bool is_it_user_name(GBL, const TEXT*, TDBB);
@ -146,15 +146,13 @@ void DYN_define_cache( GBL gbl, UCHAR ** ptr)
* Define a database cache file. * Define a database cache file.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
UCHAR verb; UCHAR verb;
volatile BLK request; volatile BLK request;
USHORT found = FALSE; USHORT found = FALSE;
volatile SSHORT id; volatile SSHORT id;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
try { try {
@ -249,10 +247,7 @@ void DYN_define_constraint(GBL gbl,
* constraint, also an index for the constraint. * constraint, also an index for the constraint.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
BLK old_request;
volatile SSHORT id, old_id; volatile SSHORT id, old_id;
UCHAR verb; UCHAR verb;
TEXT constraint_name[32], index_name[32], referred_index_name[32]; TEXT constraint_name[32], index_name[32], referred_index_name[32];
@ -263,8 +258,8 @@ void DYN_define_constraint(GBL gbl,
USHORT found, primary_flag = FALSE, foreign_flag = FALSE, not_null; USHORT found, primary_flag = FALSE, foreign_flag = FALSE, not_null;
UCHAR ri_action = 0; UCHAR ri_action = 0;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
constraint_name[0] = 0; constraint_name[0] = 0;
GET_STRING(ptr, constraint_name); GET_STRING(ptr, constraint_name);
@ -531,6 +526,8 @@ void DYN_define_constraint(GBL gbl,
request = (BLK) CMP_find_request(tdbb, drq_s_ref_con, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_s_ref_con, DYN_REQUESTS);
id = drq_s_ref_con; id = drq_s_ref_con;
BLK old_request = NULL;
STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
REF IN RDB$REF_CONSTRAINTS REF IN RDB$REF_CONSTRAINTS
old_request = request; old_request = request;
@ -803,8 +800,6 @@ void DYN_define_file(GBL gbl,
* Define a database or shadow file. * Define a database or shadow file.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
UCHAR verb; UCHAR verb;
volatile BLK request; volatile BLK request;
SLONG temp; SLONG temp;
@ -812,8 +807,8 @@ void DYN_define_file(GBL gbl,
TEXT temp_f1[MAXPATHLEN], temp_f[MAXPATHLEN]; TEXT temp_f1[MAXPATHLEN], temp_f[MAXPATHLEN];
volatile SSHORT id; volatile SSHORT id;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
@ -913,14 +908,12 @@ void DYN_define_difference(GBL gbl,
* Define backup difference file. * Define backup difference file.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
USHORT found = FALSE; USHORT found = FALSE;
volatile SSHORT id; volatile SSHORT id;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
try { try {
@ -1191,13 +1184,11 @@ void DYN_define_function_arg(GBL gbl, UCHAR** ptr, TEXT* function_name)
* Define a user defined function argument. * Define a user defined function argument.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
UCHAR verb; UCHAR verb;
volatile BLK request = NULL; volatile BLK request = NULL;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
try { try {
@ -1637,7 +1628,6 @@ void DYN_define_index(GBL gbl,
**************************************/ **************************************/
volatile BLK request; volatile BLK request;
BLK old_request;
volatile SSHORT id, old_id; volatile SSHORT id, old_id;
const size_t field_name_size = 32; const size_t field_name_size = 32;
TEXT index_name[32]; TEXT index_name[32];
@ -1682,6 +1672,8 @@ void DYN_define_index(GBL gbl,
referenced_relation[0] = 0; referenced_relation[0] = 0;
key_length = 0; key_length = 0;
BLK old_request = NULL;
STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
IDX IN RDB$INDICES IDX IN RDB$INDICES
IDX.RDB$UNIQUE_FLAG.NULL = TRUE; IDX.RDB$UNIQUE_FLAG.NULL = TRUE;
@ -2196,10 +2188,7 @@ void DYN_define_local_field(GBL gbl,
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
BLK old_request;
volatile SSHORT id, old_id; volatile SSHORT id, old_id;
UCHAR verb, *blr; UCHAR verb, *blr;
TEXT local_field_name[32]; TEXT local_field_name[32];
@ -2211,8 +2200,8 @@ void DYN_define_local_field(GBL gbl,
TEXT *source; TEXT *source;
SLONG fld_pos; SLONG fld_pos;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
local_field_name[0] = 0; local_field_name[0] = 0;
GET_STRING(ptr, local_field_name); GET_STRING(ptr, local_field_name);
@ -2414,7 +2403,7 @@ void DYN_define_local_field(GBL gbl,
} }
if (blr) { if (blr) {
old_request = request; BLK old_request = request;
old_id = id; old_id = id;
request = request =
(BLK) CMP_find_request(tdbb, drq_s_gfields2, DYN_REQUESTS); (BLK) CMP_find_request(tdbb, drq_s_gfields2, DYN_REQUESTS);
@ -2519,16 +2508,14 @@ void DYN_define_log_file(
* Define a database or shadow file. * Define a database or shadow file.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
UCHAR verb; UCHAR verb;
volatile BLK request; volatile BLK request;
USHORT found = FALSE; USHORT found = FALSE;
volatile SSHORT id; volatile SSHORT id;
STR db_filename; STR db_filename;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
id = -1; id = -1;
@ -2649,8 +2636,6 @@ void DYN_define_parameter( GBL gbl, UCHAR ** ptr, TEXT * procedure_name)
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
UCHAR verb; UCHAR verb;
TEXT parameter_name[32]; TEXT parameter_name[32];
volatile BLK request; volatile BLK request;
@ -2662,8 +2647,8 @@ void DYN_define_parameter( GBL gbl, UCHAR ** ptr, TEXT * procedure_name)
SSHORT f_subtype, f_scale, f_precision; SSHORT f_subtype, f_scale, f_precision;
SSHORT f_charset, f_collation; SSHORT f_charset, f_collation;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
parameter_name[0] = 0; parameter_name[0] = 0;
GET_STRING(ptr, parameter_name); GET_STRING(ptr, parameter_name);
@ -2879,16 +2864,14 @@ void DYN_define_procedure( GBL gbl, UCHAR ** ptr)
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
UCHAR verb; UCHAR verb;
USHORT sql_prot; USHORT sql_prot;
volatile SSHORT id; volatile SSHORT id;
TEXT procedure_name[PROC_NAME_SIZE], owner_name[32], *p; TEXT procedure_name[PROC_NAME_SIZE], owner_name[32], *p;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
procedure_name[0] = 0; procedure_name[0] = 0;
GET_STRING(ptr, procedure_name); GET_STRING(ptr, procedure_name);
@ -2905,7 +2888,7 @@ void DYN_define_procedure( GBL gbl, UCHAR ** ptr)
try { try {
id = drq_l_prc_name; id = drq_l_prc_name;
check_unique_name(tdbb, gbl, procedure_name, TRUE); check_unique_name(tdbb, gbl, procedure_name, true);
request = (BLK) CMP_find_request(tdbb, drq_s_prcs, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_s_prcs, DYN_REQUESTS);
id = drq_s_prcs; id = drq_s_prcs;
@ -2975,7 +2958,7 @@ void DYN_define_procedure( GBL gbl, UCHAR ** ptr)
DYN_REQUEST(drq_s_prcs) = request; DYN_REQUEST(drq_s_prcs) = request;
if (sql_prot) { if (sql_prot) {
if (get_who(tdbb, gbl, owner_name)) if (!get_who(tdbb, gbl, owner_name))
DYN_error_punt(TRUE, 134, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(TRUE, 134, NULL, NULL, NULL, NULL, NULL);
/* msg 134: "STORE RDB$PROCEDURES failed" */ /* msg 134: "STORE RDB$PROCEDURES failed" */
@ -3039,18 +3022,15 @@ void DYN_define_relation( GBL gbl, UCHAR ** ptr)
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
BLK old_request;
UCHAR verb; UCHAR verb;
USHORT sql_prot, is_a_view, priv; USHORT sql_prot, is_a_view, priv;
volatile SSHORT id, old_id; volatile SSHORT id, old_id;
ISC_STATUS *s; ISC_STATUS *s;
TEXT relation_name[32], owner_name[32], field_name[32], *p; TEXT relation_name[32], owner_name[32], field_name[32], *p;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
sql_prot = is_a_view = FALSE; sql_prot = is_a_view = FALSE;
@ -3070,7 +3050,7 @@ void DYN_define_relation( GBL gbl, UCHAR ** ptr)
try { try {
id = drq_l_rel_name; id = drq_l_rel_name;
check_unique_name(tdbb, gbl, relation_name, FALSE); check_unique_name(tdbb, gbl, relation_name, false);
request = (BLK) CMP_find_request(tdbb, drq_s_rels, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_s_rels, DYN_REQUESTS);
id = drq_s_rels; id = drq_s_rels;
@ -3148,12 +3128,12 @@ void DYN_define_relation( GBL gbl, UCHAR ** ptr)
} }
if (sql_prot) { if (sql_prot) {
if (get_who(tdbb, gbl, owner_name)) if (!get_who(tdbb, gbl, owner_name))
DYN_error_punt(TRUE, 115, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(TRUE, 115, NULL, NULL, NULL, NULL, NULL);
/* msg 115: "CREATE VIEW failed" */ /* msg 115: "CREATE VIEW failed" */
if (is_a_view) { if (is_a_view) {
old_request = request; BLK old_request = request;
old_id = id; old_id = id;
request = request =
(BLK) CMP_find_request(tdbb, drq_l_view_rels, (BLK) CMP_find_request(tdbb, drq_l_view_rels,
@ -3271,13 +3251,11 @@ void DYN_define_role( GBL gbl, UCHAR ** ptr)
* ROLES cannot be named the same as any existing user name * ROLES cannot be named the same as any existing user name
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request = NULL; volatile BLK request = NULL;
TEXT dummy_name[32], owner_name[32], role_name[32], *p; TEXT dummy_name[32], owner_name[32], role_name[32], *p;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
if (private_getODS() < ODS_9_0) if (private_getODS() < ODS_9_0)
{ {
@ -3456,18 +3434,15 @@ void DYN_define_sql_field(GBL gbl,
* an global field name. * an global field name.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
volatile BLK request; volatile BLK request;
BLK old_request;
volatile SSHORT id, old_id; volatile SSHORT id, old_id;
UCHAR verb; UCHAR verb;
TEXT sql_field_name[32]; TEXT sql_field_name[32];
USHORT dtype; USHORT dtype;
SLONG fld_pos; SLONG fld_pos;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
sql_field_name[0] = 0; sql_field_name[0] = 0;
GET_STRING(ptr, sql_field_name); GET_STRING(ptr, sql_field_name);
@ -3484,6 +3459,7 @@ void DYN_define_sql_field(GBL gbl,
request = (BLK) CMP_find_request(tdbb, drq_s_sql_lfld, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_s_sql_lfld, DYN_REQUESTS);
id = drq_s_sql_lfld; id = drq_s_sql_lfld;
BLK old_request = NULL;
STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) STORE(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
RFR IN RDB$RELATION_FIELDS RFR IN RDB$RELATION_FIELDS
@ -4158,8 +4134,8 @@ void DYN_define_view_relation( GBL gbl, UCHAR ** ptr, TEXT * view)
static void check_unique_name( TDBB tdbb, static void check_unique_name( TDBB tdbb,
GBL gbl, GBL gbl,
TEXT* object_name, const TEXT* object_name,
BOOLEAN proc_flag) bool proc_flag)
{ {
/************************************** /**************************************
* *
@ -4234,12 +4210,12 @@ local_punt_false_132:
} }
static BOOLEAN find_field_source(TDBB tdbb, static bool find_field_source(TDBB tdbb,
GBL gbl, GBL gbl,
TEXT* view_name, const TEXT* view_name,
USHORT context, USHORT context,
TEXT* local_name, const TEXT* local_name,
TEXT* field_name) TEXT* output_field_name)
{ {
/************************************** /**************************************
* *
@ -4253,7 +4229,6 @@ static BOOLEAN find_field_source(TDBB tdbb,
**************************************/ **************************************/
volatile BLK request; volatile BLK request;
BOOLEAN found;
SET_TDBB(tdbb); SET_TDBB(tdbb);
DBB dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
@ -4267,8 +4242,9 @@ circumstances, it will return either TRUE or FALSE. When TRUE, we found a field
for the view's name/context/field and are loading this value in the last parameter, for the view's name/context/field and are loading this value in the last parameter,
that can be used against rdb$fields' rdb$field_name. */ that can be used against rdb$fields' rdb$field_name. */
bool found = false;
try { try {
found = FALSE;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
VRL IN RDB$VIEW_RELATIONS CROSS VRL IN RDB$VIEW_RELATIONS CROSS
RFR IN RDB$RELATION_FIELDS OVER RDB$RELATION_NAME RFR IN RDB$RELATION_FIELDS OVER RDB$RELATION_NAME
@ -4280,9 +4256,9 @@ that can be used against rdb$fields' rdb$field_name. */
DYN_REQUEST(drq_l_fld_src2) = request; DYN_REQUEST(drq_l_fld_src2) = request;
} }
found = TRUE; found = true;
DYN_terminate(RFR.RDB$FIELD_SOURCE, sizeof(RFR.RDB$FIELD_SOURCE)); DYN_terminate(RFR.RDB$FIELD_SOURCE, sizeof(RFR.RDB$FIELD_SOURCE));
strcpy(field_name, RFR.RDB$FIELD_SOURCE); strcpy(output_field_name, RFR.RDB$FIELD_SOURCE);
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_l_fld_src2)) { if (!DYN_REQUEST(drq_l_fld_src2)) {
DYN_REQUEST(drq_l_fld_src2) = request; DYN_REQUEST(drq_l_fld_src2) = request;
@ -4298,7 +4274,7 @@ that can be used against rdb$fields' rdb$field_name. */
} }
static BOOLEAN get_who( TDBB tdbb, GBL gbl, SCHAR * name) static bool get_who( TDBB tdbb, GBL gbl, SCHAR* output_name)
{ {
/************************************** /**************************************
* *
@ -4322,20 +4298,20 @@ static BOOLEAN get_who( TDBB tdbb, GBL gbl, SCHAR * name)
request = (BLK) CMP_compile2(tdbb, const_cast<UCHAR*>(who_blr), TRUE); request = (BLK) CMP_compile2(tdbb, const_cast<UCHAR*>(who_blr), TRUE);
} }
EXE_start(tdbb, (JRD_REQ) request, gbl->gbl_transaction); EXE_start(tdbb, (JRD_REQ) request, gbl->gbl_transaction);
EXE_receive(tdbb, (JRD_REQ) request, 0, 32, (UCHAR*)name); EXE_receive(tdbb, (JRD_REQ) request, 0, 32, (UCHAR*) output_name);
DYN_rundown_request(request, drq_l_user_name); DYN_rundown_request(request, drq_l_user_name);
} }
catch (const std::exception&) { catch (const std::exception&) {
DYN_rundown_request(request, drq_l_user_name); DYN_rundown_request(request, drq_l_user_name);
return FB_FAILURE; return false;
} }
return FB_SUCCESS; return true;
} }
BOOLEAN is_it_user_name(GBL gbl, TEXT* role_name, TDBB tdbb) bool is_it_user_name(GBL gbl, const TEXT* role_name, TDBB tdbb)
{ {
/************************************** /**************************************
* *
@ -4350,11 +4326,11 @@ BOOLEAN is_it_user_name(GBL gbl, TEXT* role_name, TDBB tdbb)
**************************************/ **************************************/
volatile BLK request; volatile BLK request;
BOOLEAN found = FALSE;
volatile USHORT request_id; volatile USHORT request_id;
SET_TDBB(tdbb); SET_TDBB(tdbb);
DBB dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
bool found = false;
try { try {
@ -4370,7 +4346,7 @@ BOOLEAN is_it_user_name(GBL gbl, TEXT* role_name, TDBB tdbb)
(PRIV.RDB$GRANTOR EQ role_name AND (PRIV.RDB$GRANTOR EQ role_name AND
PRIV.RDB$OBJECT_TYPE = obj_relation) PRIV.RDB$OBJECT_TYPE = obj_relation)
found = TRUE; found = true;
END_FOR; END_FOR;
@ -4391,7 +4367,7 @@ BOOLEAN is_it_user_name(GBL gbl, TEXT* role_name, TDBB tdbb)
REL IN RDB$RELATIONS WITH REL IN RDB$RELATIONS WITH
REL.RDB$OWNER_NAME EQ role_name REL.RDB$OWNER_NAME EQ role_name
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_get_rel_owner)) { if (!DYN_REQUEST(drq_get_rel_owner)) {
@ -4407,3 +4383,4 @@ BOOLEAN is_it_user_name(GBL gbl, TEXT* role_name, TDBB tdbb)
return found; return found;
} }

View File

@ -156,18 +156,15 @@ void DYN_delete_exception( GBL gbl, UCHAR ** ptr)
* deletes an exception. * deletes an exception.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found; USHORT found;
TEXT t[32]; TEXT t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
GET_STRING(ptr, t); GET_STRING(ptr, t);
request = (BLK) CMP_find_request(tdbb, drq_e_xcp, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_xcp, DYN_REQUESTS);
try { try {
@ -211,16 +208,13 @@ void DYN_delete_filter( GBL gbl, UCHAR ** ptr)
* deletes a blob filter. * deletes a blob filter.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found; USHORT found;
TEXT f[32]; TEXT f[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_filters, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_filters, DYN_REQUESTS);
try { try {
@ -268,16 +262,13 @@ void DYN_delete_function( GBL gbl, UCHAR ** ptr)
* deletes a user defined function. * deletes a user defined function.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
volatile USHORT id, found; volatile USHORT id, found;
TEXT f[32]; TEXT f[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_func_args, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_func_args, DYN_REQUESTS);
id = drq_e_func_args; id = drq_e_func_args;
try { try {
@ -348,14 +339,13 @@ void DYN_delete_generator(GBL gbl, UCHAR **ptr)
* space allocated in the page won't be released. * space allocated in the page won't be released.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found; USHORT found;
TEXT t[32]; TEXT t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
BLK request = NULL;
try { try {
GET_STRING(ptr, t); GET_STRING(ptr, t);
@ -405,16 +395,13 @@ void DYN_delete_global_field( GBL gbl, UCHAR ** ptr)
* deletes a global field. * deletes a global field.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
volatile USHORT id, found; volatile USHORT id, found;
TEXT f[32]; TEXT f[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_l_fld_src, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_l_fld_src, DYN_REQUESTS);
id = drq_l_fld_src; id = drq_l_fld_src;
try { try {
@ -491,16 +478,13 @@ void DYN_delete_index( GBL gbl, UCHAR ** ptr)
* deletes an index. * deletes an index.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found; USHORT found;
TEXT i[32], r[32]; TEXT i[32], r[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_indices, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_indices, DYN_REQUESTS);
try { try {
GET_STRING(ptr, i); GET_STRING(ptr, i);
@ -583,14 +567,11 @@ void DYN_delete_local_field(
* delete_f_key_constraint function for detail. * delete_f_key_constraint function for detail.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request, old_request;
volatile USHORT id, found; volatile USHORT id, found;
TEXT tbl_nm[32], col_nm[32], constraint[32], index_name[32]; TEXT tbl_nm[32], col_nm[32], constraint[32], index_name[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
GET_STRING(ptr, col_nm); GET_STRING(ptr, col_nm);
@ -603,7 +584,7 @@ void DYN_delete_local_field(
else else
GET_STRING(ptr, tbl_nm); GET_STRING(ptr, tbl_nm);
request = (BLK) CMP_find_request(tdbb, drq_l_dep_flds, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_l_dep_flds, DYN_REQUESTS);
id = drq_l_dep_flds; id = drq_l_dep_flds;
try { try {
@ -701,6 +682,8 @@ void DYN_delete_local_field(
request = (BLK) CMP_find_request(tdbb, drq_e_l_idx, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_e_l_idx, DYN_REQUESTS);
id = drq_e_l_idx; id = drq_e_l_idx;
BLK old_request = NULL;
found = FALSE; found = FALSE;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
IDX IN RDB$INDICES IDX IN RDB$INDICES
@ -796,8 +779,6 @@ void DYN_delete_parameter( GBL gbl, UCHAR ** ptr, TEXT * proc_name)
* deletes a stored procedure parameter. * deletes a stored procedure parameter.
* *
**************************************/ **************************************/
BLK old_request, request;
volatile USHORT old_id, id, found; volatile USHORT old_id, id, found;
TEXT name[32]; TEXT name[32];
@ -809,11 +790,12 @@ void DYN_delete_parameter( GBL gbl, UCHAR ** ptr, TEXT * proc_name)
TDBB tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
DBB dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_prm, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_prm, DYN_REQUESTS);
id = drq_e_prms; id = drq_e_prms;
try { try {
BLK old_request = NULL;
found = FALSE; found = FALSE;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
PP IN RDB$PROCEDURE_PARAMETERS WITH PP.RDB$PROCEDURE_NAME EQ proc_name PP IN RDB$PROCEDURE_PARAMETERS WITH PP.RDB$PROCEDURE_NAME EQ proc_name
@ -889,15 +871,12 @@ void DYN_delete_procedure( GBL gbl, UCHAR ** ptr)
* deletes a stored procedure. * deletes a stored procedure.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK old_request, request;
volatile USHORT old_id, id, found; volatile USHORT old_id, id, found;
TEXT name[32]; TEXT name[32];
GET_STRING(ptr, name); GET_STRING(ptr, name);
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
tdbb->tdbb_flags |= TDBB_prc_being_dropped; tdbb->tdbb_flags |= TDBB_prc_being_dropped;
if (MET_lookup_procedure(tdbb, name, TRUE) == 0) if (MET_lookup_procedure(tdbb, name, TRUE) == 0)
@ -909,11 +888,14 @@ void DYN_delete_procedure( GBL gbl, UCHAR ** ptr)
tdbb->tdbb_flags &= ~TDBB_prc_being_dropped; tdbb->tdbb_flags &= ~TDBB_prc_being_dropped;
request = (BLK) CMP_find_request(tdbb, drq_e_prms, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_prms, DYN_REQUESTS);
id = drq_e_prms; id = drq_e_prms;
try { try {
BLK old_request = NULL;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
PP IN RDB$PROCEDURE_PARAMETERS WITH PP.RDB$PROCEDURE_NAME EQ name PP IN RDB$PROCEDURE_PARAMETERS WITH PP.RDB$PROCEDURE_NAME EQ name
@ -1047,21 +1029,18 @@ void DYN_delete_relation( GBL gbl, UCHAR ** ptr, TEXT * relation)
* and fields. * and fields.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
volatile USHORT id, found; volatile USHORT id, found;
TEXT relation_name[32]; TEXT relation_name[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
if (relation) if (relation)
strcpy(relation_name, relation); strcpy(relation_name, relation);
else else
GET_STRING(ptr, relation_name); GET_STRING(ptr, relation_name);
request = (BLK) CMP_find_request(tdbb, drq_e_rel_con2, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_rel_con2, DYN_REQUESTS);
id = drq_e_rel_con2; id = drq_e_rel_con2;
try { try {
@ -1288,22 +1267,17 @@ void DYN_delete_role( GBL gbl, UCHAR ** ptr)
* members of the role. * members of the role.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
volatile USHORT id; volatile USHORT id;
//volatile USHORT err_num; //volatile USHORT err_num;
TEXT role_name[32], role_owner[32], user[32]; TEXT role_name[32], role_owner[32], user[32];
//TEXT security_class[32]; //TEXT security_class[32];
TEXT *ptr1, *ptr2; TEXT *ptr1, *ptr2;
BOOLEAN del_role_ok = TRUE;
USHORT major_version, minor_original;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
major_version = (SSHORT) dbb->dbb_ods_version; const USHORT major_version = dbb->dbb_ods_version;
minor_original = (SSHORT) dbb->dbb_minor_original; const USHORT minor_original = dbb->dbb_minor_original;
if (ENCODE_ODS(major_version, minor_original) < ODS_9_0) { if (ENCODE_ODS(major_version, minor_original) < ODS_9_0) {
DYN_error(FALSE, 196, NULL, NULL, NULL, NULL, NULL); DYN_error(FALSE, 196, NULL, NULL, NULL, NULL, NULL);
@ -1311,6 +1285,7 @@ void DYN_delete_role( GBL gbl, UCHAR ** ptr)
return; // never reached return; // never reached
} }
BLK request = NULL;
try { try {
@ -1327,6 +1302,8 @@ void DYN_delete_role( GBL gbl, UCHAR ** ptr)
request = (BLK) CMP_find_request(tdbb, drq_drop_role, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_drop_role, DYN_REQUESTS);
id = drq_drop_role; id = drq_drop_role;
bool del_role_ok = true;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
XX IN RDB$ROLES WITH XX IN RDB$ROLES WITH
XX.RDB$ROLE_NAME EQ role_name if (!DYN_REQUEST(drq_drop_role)) XX.RDB$ROLE_NAME EQ role_name if (!DYN_REQUEST(drq_drop_role))
@ -1335,8 +1312,6 @@ void DYN_delete_role( GBL gbl, UCHAR ** ptr)
DYN_terminate(XX.RDB$OWNER_NAME, sizeof(XX.RDB$OWNER_NAME)); DYN_terminate(XX.RDB$OWNER_NAME, sizeof(XX.RDB$OWNER_NAME));
strcpy(role_owner, XX.RDB$OWNER_NAME); strcpy(role_owner, XX.RDB$OWNER_NAME);
#pragma FB_COMPILER_MESSAGE("TMN: LOCKSMITH!")
if ((tdbb->tdbb_attachment->att_user->usr_flags & USR_locksmith) || if ((tdbb->tdbb_attachment->att_user->usr_flags & USR_locksmith) ||
(strcmp(role_owner, user) == 0)) (strcmp(role_owner, user) == 0))
{ {
@ -1344,7 +1319,7 @@ void DYN_delete_role( GBL gbl, UCHAR ** ptr)
} }
else else
{ {
del_role_ok = FALSE; del_role_ok = false;
} }
END_FOR; END_FOR;
@ -1449,13 +1424,10 @@ void DYN_delete_shadow( GBL gbl, UCHAR ** ptr)
* Delete a shadow. * Delete a shadow.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
int shadow_number; int shadow_number;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
/***** /*****
the code commented out in this routine was meant to delete the the code commented out in this routine was meant to delete the
@ -1468,7 +1440,7 @@ STR file;
files = NULL; files = NULL;
*****/ *****/
request = (BLK) CMP_find_request(tdbb, drq_e_shadow, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_shadow, DYN_REQUESTS);
try { try {
@ -1525,16 +1497,13 @@ void DYN_delete_trigger( GBL gbl, UCHAR ** ptr)
* deletes an trigger. * deletes an trigger.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT id, found; USHORT id, found;
TEXT r[32], t[32]; TEXT r[32], t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_trg_msgs, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_trg_msgs, DYN_REQUESTS);
id = drq_e_trg_msgs; id = drq_e_trg_msgs;
try { try {
@ -1662,15 +1631,12 @@ void DYN_delete_trigger_msg( GBL gbl, UCHAR ** ptr, TEXT * trigger_name)
* deletes an trigger message. * deletes an trigger message.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found; USHORT found;
int number; int number;
TEXT t[32]; TEXT t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
number = DYN_get_number(ptr); number = DYN_get_number(ptr);
if (trigger_name) if (trigger_name)
@ -1681,7 +1647,7 @@ void DYN_delete_trigger_msg( GBL gbl, UCHAR ** ptr, TEXT * trigger_name)
DYN_error_punt(FALSE, 70, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(FALSE, 70, NULL, NULL, NULL, NULL, NULL);
/* msg 70: "TRIGGER NAME expected" */ /* msg 70: "TRIGGER NAME expected" */
request = (BLK) CMP_find_request(tdbb, drq_e_trg_msg, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_trg_msg, DYN_REQUESTS);
try { try {
@ -1734,15 +1700,12 @@ static BOOLEAN delete_constraint_records(GBL gbl,
* based on a constraint name. * based on a constraint name.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
BOOLEAN found; BOOLEAN found;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_rel_con, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_rel_con, DYN_REQUESTS);
try { try {
@ -1786,15 +1749,12 @@ static BOOLEAN delete_dimension_records(GBL gbl, TEXT* field_name)
* pertaining to a field. * pertaining to a field.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
BOOLEAN found; BOOLEAN found;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_dims, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_dims, DYN_REQUESTS);
try { try {
@ -1859,14 +1819,12 @@ static void delete_f_key_constraint(TDBB tdbb,
* RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME * RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME
* *
**************************************/ **************************************/
DBB dbb;
BLK request;
BOOLEAN found; BOOLEAN found;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_rel_const, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_rel_const, DYN_REQUESTS);
try { try {
@ -1915,13 +1873,9 @@ static void delete_gfield_for_lfield( GBL gbl, TEXT * lfield_name)
* deletes a global field for a given local field. * deletes a global field for a given local field.
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
DBB dbb; DBB dbb = tdbb->tdbb_database;
BLK request; BLK request = (BLK) CMP_find_request(tdbb, drq_e_l_gfld, DYN_REQUESTS);
tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_l_gfld, DYN_REQUESTS);
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$FIELDS FLD IN RDB$FIELDS
@ -1960,15 +1914,12 @@ static BOOLEAN delete_index_segment_records( GBL gbl, TEXT * index_name)
* pertaining to an index. * pertaining to an index.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
BOOLEAN found; BOOLEAN found;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_e_idx_segs, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_e_idx_segs, DYN_REQUESTS);
try { try {
@ -2044,3 +1995,4 @@ static BOOLEAN delete_security_class2( GBL gbl, TEXT * security_class)
return found; return found;
} }

View File

@ -85,7 +85,7 @@ DATABASE DB = STATIC "ODS.RDB";
#define MAX_CHARS_DOUBLE 22 /* 15 digits + 2 signs + E + decimal + 3 digit exp */ #define MAX_CHARS_DOUBLE 22 /* 15 digits + 2 signs + E + decimal + 3 digit exp */
#define MAX_CHARS_FLOAT 13 /* 7 digits + 2 signs + E + decimal + 2 digit exp */ #define MAX_CHARS_FLOAT 13 /* 7 digits + 2 signs + E + decimal + 2 digit exp */
static UCHAR alloc_info[] = { gds_info_allocation, gds_info_end }; static const UCHAR alloc_info[] = { gds_info_allocation, gds_info_end };
static void drop_cache(GBL); static void drop_cache(GBL);
static void change_backup_mode(GBL, UCHAR verb); static void change_backup_mode(GBL, UCHAR verb);
static void drop_log(GBL); static void drop_log(GBL);
@ -93,16 +93,17 @@ static void drop_log(GBL);
// Function not defined in this file MOD 04-July-2002 // Function not defined in this file MOD 04-July-2002
// static void modify_lfield_type(GBL, UCHAR **, TEXT *, TEXT *); // static void modify_lfield_type(GBL, UCHAR **, TEXT *, TEXT *);
static void modify_lfield_position(TDBB, DBB, GBL, TEXT *, TEXT *, USHORT, static void modify_lfield_position(TDBB, DBB, GBL, const TEXT*, const TEXT*,
USHORT); USHORT, USHORT);
static BOOLEAN check_view_dependency(TDBB, DBB, GBL, TEXT *, TEXT *); static bool check_view_dependency(TDBB, DBB, GBL, const TEXT*, const TEXT*);
static BOOLEAN check_sptrig_dependency(TDBB, DBB, GBL, TEXT *, TEXT *); static bool check_sptrig_dependency(TDBB, DBB, GBL, const TEXT*, const TEXT*);
static void modify_lfield_index(TDBB, DBB, GBL, TEXT *, TEXT *, TEXT *); static void modify_lfield_index(TDBB, DBB, GBL, const TEXT*, const TEXT*,
static BOOLEAN field_exists(TDBB, DBB, GBL, TEXT *, TEXT *); const TEXT*);
static BOOLEAN domain_exists(TDBB, DBB, GBL, TEXT *); static bool field_exists(TDBB, DBB, GBL, const TEXT*, const TEXT*);
static bool domain_exists(TDBB, DBB, GBL, const TEXT*);
static void get_domain_type(TDBB, DBB, GBL, DYN_FLD); static void get_domain_type(TDBB, DBB, GBL, DYN_FLD);
static ULONG check_update_fld_type(DYN_FLD, DYN_FLD); static ULONG check_update_fld_type(const dyn_fld*, const dyn_fld*);
static void modify_err_punt(TDBB, ULONG, DYN_FLD, DYN_FLD); static void modify_err_punt(TDBB, ULONG, const dyn_fld*, const dyn_fld*);
void DYN_modify_database( GBL gbl, UCHAR ** ptr) void DYN_modify_database( GBL gbl, UCHAR ** ptr)
@ -117,9 +118,6 @@ void DYN_modify_database( GBL gbl, UCHAR ** ptr)
* Modify a database. * Modify a database.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
SSHORT length; SSHORT length;
SLONG start; SLONG start;
UCHAR verb, s[128]; UCHAR verb, s[128];
@ -131,10 +129,10 @@ void DYN_modify_database( GBL gbl, UCHAR ** ptr)
USHORT first_log_file = TRUE; USHORT first_log_file = TRUE;
#endif #endif
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; BLK request = NULL;
try { try {
@ -278,30 +276,27 @@ void DYN_modify_exception( GBL gbl, UCHAR ** ptr)
* Modify an exception. * Modify an exception.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found;
UCHAR verb; UCHAR verb;
TEXT t[32]; TEXT t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_m_xcp, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_xcp, DYN_REQUESTS);
bool found = false;
try { try {
GET_STRING(ptr, t); GET_STRING(ptr, t);
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
X IN RDB$EXCEPTIONS X IN RDB$EXCEPTIONS
WITH X.RDB$EXCEPTION_NAME EQ t WITH X.RDB$EXCEPTION_NAME EQ t
if (!DYN_REQUEST(drq_m_xcp)) DYN_REQUEST(drq_m_xcp) = request; if (!DYN_REQUEST(drq_m_xcp)) DYN_REQUEST(drq_m_xcp) = request;
found = TRUE; found = true;
MODIFY X MODIFY X
while ((verb = *(*ptr)++) != gds_dyn_end) while ((verb = *(*ptr)++) != gds_dyn_end)
switch (verb) { switch (verb) {
@ -350,10 +345,8 @@ void DYN_modify_global_field(
* Note: a global field here is a SQL domain. * Note: a global field here is a SQL domain.
* *
**************************************/ **************************************/
TDBB tdbb; BLK old_request;
DBB dbb; USHORT single_validate = FALSE;
BLK request, old_request;
USHORT found, single_validate = FALSE;
UCHAR verb; UCHAR verb;
DYN_FLD orig_dom, new_dom; DYN_FLD orig_dom, new_dom;
BOOLEAN dtype, scale, prec, subtype, charlen, collation, fldlen, nullflg, BOOLEAN dtype, scale, prec, subtype, charlen, collation, fldlen, nullflg,
@ -369,8 +362,8 @@ void DYN_modify_global_field(
SSHORT field_adjusted_count = 0; SSHORT field_adjusted_count = 0;
TEXT *err_one_type_change_only = "Only one data type change to the domain allowed at a time"; TEXT *err_one_type_change_only = "Only one data type change to the domain allowed at a time";
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
dtype = scale = prec = subtype = charlen = collation = fldlen = nullflg = dtype = scale = prec = subtype = charlen = collation = fldlen = nullflg =
charset = FALSE; charset = FALSE;
@ -380,7 +373,8 @@ void DYN_modify_global_field(
bdeldflt = bflddftval = bflddfltsrc = FALSE; bdeldflt = bflddftval = bflddfltsrc = FALSE;
request = (BLK) CMP_find_request(tdbb, drq_m_gfield, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_gfield, DYN_REQUESTS);
bool found = false;
try { try {
@ -401,14 +395,14 @@ void DYN_modify_global_field(
GET_STRING(ptr, orig_dom->dyn_fld_name); GET_STRING(ptr, orig_dom->dyn_fld_name);
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME EQ orig_dom->dyn_fld_name FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME EQ orig_dom->dyn_fld_name
if (!DYN_REQUEST(drq_m_gfield)) if (!DYN_REQUEST(drq_m_gfield))
DYN_REQUEST(drq_m_gfield) = request; DYN_REQUEST(drq_m_gfield) = request;
found = TRUE; found = true;
DSC_make_descriptor(&orig_dom->dyn_dsc, DSC_make_descriptor(&orig_dom->dyn_dsc,
FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_TYPE,
@ -713,16 +707,15 @@ void DYN_modify_global_field(
*/ */
if (dtype) { if (dtype) {
ULONG retval;
DSC_make_descriptor(&new_dom->dyn_dsc, DSC_make_descriptor(&new_dom->dyn_dsc,
new_dom->dyn_dtype, new_dom->dyn_dtype,
new_dom->dyn_dsc.dsc_scale, new_dom->dyn_dsc.dsc_scale,
new_dom->dyn_dsc.dsc_length, new_dom->dyn_dsc.dsc_length,
new_dom->dyn_dsc.dsc_sub_type, new_dom->dyn_dsc.dsc_sub_type,
new_dom->dyn_charset, new_dom->dyn_collation); new_dom->dyn_charset, new_dom->dyn_collation);
if ((retval = check_update_fld_type(orig_dom, new_dom)) != ULONG retval = check_update_fld_type(orig_dom, new_dom);
FB_SUCCESS) modify_err_punt(tdbb, retval, orig_dom, new_dom); if (retval != FB_SUCCESS)
modify_err_punt(tdbb, retval, orig_dom, new_dom);
} }
MODIFY FLD USING MODIFY FLD USING
@ -897,29 +890,26 @@ void DYN_modify_index( GBL gbl, UCHAR ** ptr)
* Modify an existing index * Modify an existing index
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found;
UCHAR verb; UCHAR verb;
TEXT name[32]; TEXT name[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_m_index, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_index, DYN_REQUESTS);
bool found = false;
try { try {
GET_STRING(ptr, name); GET_STRING(ptr, name);
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
IDX IN RDB$INDICES WITH IDX.RDB$INDEX_NAME EQ name IDX IN RDB$INDICES WITH IDX.RDB$INDEX_NAME EQ name
if (!DYN_REQUEST(drq_m_index)) DYN_REQUEST(drq_m_index) = request; if (!DYN_REQUEST(drq_m_index)) DYN_REQUEST(drq_m_index) = request;
found = TRUE; found = true;
MODIFY IDX USING MODIFY IDX USING
while ((verb = *(*ptr)++) != gds_dyn_end) while ((verb = *(*ptr)++) != gds_dyn_end)
switch (verb) { switch (verb) {
@ -986,18 +976,15 @@ void DYN_modify_local_field(
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb; USHORT position, existing_position;
DBB dbb;
BLK request;
USHORT found, position, existing_position;
USHORT sfflag, qnflag, qhflag, esflag, dflag, system_flag, scflag, nnflag, USHORT sfflag, qnflag, qhflag, esflag, dflag, system_flag, scflag, nnflag,
ntflag, npflag; ntflag, npflag;
UCHAR verb; UCHAR verb;
TEXT f[32], r[32], *query_name, *query_header, *edit_string, *description, TEXT f[32], r[32], *query_name, *query_header, *edit_string, *description,
*security_class, *new_name; *security_class, *new_name;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
GET_STRING(ptr, f); GET_STRING(ptr, f);
r[0] = 0; r[0] = 0;
@ -1060,11 +1047,12 @@ void DYN_modify_local_field(
DYN_execute(gbl, ptr, relation_name, field_name, NULL, NULL, NULL); DYN_execute(gbl, ptr, relation_name, field_name, NULL, NULL, NULL);
} }
request = (BLK) CMP_find_request(tdbb, drq_m_lfield, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_lfield, DYN_REQUESTS);
bool found = false;
try { try {
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$RELATION_FIELDS FLD IN RDB$RELATION_FIELDS
WITH FLD.RDB$FIELD_NAME EQ f AND FLD.RDB$RELATION_NAME EQ r WITH FLD.RDB$FIELD_NAME EQ f AND FLD.RDB$RELATION_NAME EQ r
@ -1072,7 +1060,7 @@ void DYN_modify_local_field(
if (!DYN_REQUEST(drq_m_lfield)) if (!DYN_REQUEST(drq_m_lfield))
DYN_REQUEST(drq_m_lfield) = request; DYN_REQUEST(drq_m_lfield) = request;
found = TRUE; found = true;
MODIFY FLD USING MODIFY FLD USING
if (npflag) if (npflag)
@ -1175,31 +1163,28 @@ void DYN_modify_procedure( GBL gbl, UCHAR ** ptr)
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
UCHAR verb; UCHAR verb;
USHORT found;
TEXT procedure_name[PROC_NAME_SIZE]; TEXT procedure_name[PROC_NAME_SIZE];
GET_STRING(ptr, procedure_name); GET_STRING(ptr, procedure_name);
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; BLK request = NULL;
bool found = false;
try { try {
request = (BLK) CMP_find_request(tdbb, drq_m_prcs, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_m_prcs, DYN_REQUESTS);
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
P IN RDB$PROCEDURES WITH P.RDB$PROCEDURE_NAME = procedure_name P IN RDB$PROCEDURES WITH P.RDB$PROCEDURE_NAME = procedure_name
if (!DYN_REQUEST(drq_m_prcs)) if (!DYN_REQUEST(drq_m_prcs))
DYN_REQUEST(drq_m_prcs) = request; DYN_REQUEST(drq_m_prcs) = request;
found = TRUE; found = true;
/* Set NULL flags to TRUE only for fields which must be specified in the DYN string. /* Set NULL flags to TRUE only for fields which must be specified in the DYN string.
Retain existing values on other fields (RDB$DESCRIPTION, RDB$SECURITY_CLASS), Retain existing values on other fields (RDB$DESCRIPTION, RDB$SECURITY_CLASS),
@ -1285,24 +1270,21 @@ void DYN_modify_relation( GBL gbl, UCHAR ** ptr)
* Modify an existing relation * Modify an existing relation
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found;
UCHAR verb; UCHAR verb;
TEXT name[32], field_name[32]; TEXT name[32], field_name[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
field_name[0] = 0; field_name[0] = 0;
GET_STRING(ptr, name); GET_STRING(ptr, name);
request = (BLK) CMP_find_request(tdbb, drq_m_relation, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_relation, DYN_REQUESTS);
bool found = false;
try { try {
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
REL IN RDB$RELATIONS WITH REL.RDB$RELATION_NAME EQ name REL IN RDB$RELATIONS WITH REL.RDB$RELATION_NAME EQ name
@ -1311,7 +1293,7 @@ void DYN_modify_relation( GBL gbl, UCHAR ** ptr)
if (!REL.RDB$VIEW_BLR.NULL) if (!REL.RDB$VIEW_BLR.NULL)
DYN_error_punt(FALSE, 177, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(FALSE, 177, NULL, NULL, NULL, NULL, NULL);
found = TRUE; found = true;
MODIFY REL USING MODIFY REL USING
while ((verb = *(*ptr)++) != gds_dyn_end) while ((verb = *(*ptr)++) != gds_dyn_end)
switch (verb) { switch (verb) {
@ -1386,17 +1368,14 @@ void DYN_modify_trigger( GBL gbl, UCHAR ** ptr)
* Modify a trigger for a relation. * Modify a trigger for a relation.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found;
UCHAR verb, *blr; UCHAR verb, *blr;
TEXT trigger_name[32], *source; TEXT trigger_name[32], *source;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_m_trigger, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_trigger, DYN_REQUESTS);
bool found = false;
try { try {
@ -1404,7 +1383,7 @@ void DYN_modify_trigger( GBL gbl, UCHAR ** ptr)
source = NULL; source = NULL;
blr = NULL; blr = NULL;
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
X IN RDB$TRIGGERS WITH X.RDB$TRIGGER_NAME EQ trigger_name X IN RDB$TRIGGERS WITH X.RDB$TRIGGER_NAME EQ trigger_name
@ -1428,7 +1407,7 @@ void DYN_modify_trigger( GBL gbl, UCHAR ** ptr)
} }
} }
*/ */
found = TRUE; found = true;
MODIFY X MODIFY X
while ((verb = *(*ptr)++) != gds_dyn_end) while ((verb = *(*ptr)++) != gds_dyn_end)
switch (verb) { switch (verb) {
@ -1521,17 +1500,14 @@ void DYN_modify_trigger_msg( GBL gbl, UCHAR ** ptr, TEXT * trigger_name)
* Modify a trigger message. * Modify a trigger message.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
int number; int number;
UCHAR verb; UCHAR verb;
TEXT t[32]; TEXT t[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_m_trg_msg, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_m_trg_msg, DYN_REQUESTS);
try { try {
@ -1594,15 +1570,11 @@ void DYN_modify_view( GBL gbl, UCHAR ** ptr)
* Execute a dynamic ddl statement. * Execute a dynamic ddl statement.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
UCHAR verb; UCHAR verb;
USHORT found;
TEXT view_name[32]; TEXT view_name[32];
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
view_name[0] = 0; view_name[0] = 0;
GET_STRING(ptr, view_name); GET_STRING(ptr, view_name);
@ -1612,11 +1584,14 @@ void DYN_modify_view( GBL gbl, UCHAR ** ptr)
DYN_error_punt(FALSE, 212, NULL, NULL, NULL, NULL, NULL); DYN_error_punt(FALSE, 212, NULL, NULL, NULL, NULL, NULL);
/* msg 212: "Zero length identifiers not allowed" */ /* msg 212: "Zero length identifiers not allowed" */
BLK request = NULL;
bool found = false;
try { try {
request = (BLK) CMP_find_request(tdbb, drq_m_relation, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_m_relation, DYN_REQUESTS);
found = FALSE; found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
VRL IN RDB$VIEW_RELATIONS CROSS REL IN RDB$RELATIONS VRL IN RDB$VIEW_RELATIONS CROSS REL IN RDB$RELATIONS
WITH VRL.RDB$VIEW_NAME EQ REL.RDB$RELATION_NAME AND WITH VRL.RDB$VIEW_NAME EQ REL.RDB$RELATION_NAME AND
@ -1625,7 +1600,7 @@ void DYN_modify_view( GBL gbl, UCHAR ** ptr)
if (!DYN_REQUEST(drq_m_relation)) if (!DYN_REQUEST(drq_m_relation))
DYN_REQUEST(drq_m_relation) = request; DYN_REQUEST(drq_m_relation) = request;
found = TRUE; found = true;
MODIFY REL MODIFY REL
REL.RDB$SYSTEM_FLAG.NULL = TRUE; REL.RDB$SYSTEM_FLAG.NULL = TRUE;
REL.RDB$VIEW_BLR.NULL = TRUE; REL.RDB$VIEW_BLR.NULL = TRUE;
@ -1692,15 +1667,11 @@ static void drop_cache( GBL gbl)
* Drop the database cache * Drop the database cache
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
DBB dbb; DBB dbb = tdbb->tdbb_database;
BLK request;
USHORT found = FALSE;
tdbb = GET_THREAD_DATA; BLK request = (BLK) CMP_find_request(tdbb, drq_d_cache, DYN_REQUESTS);
dbb = tdbb->tdbb_database; bool found = false;
request = (BLK) CMP_find_request(tdbb, drq_d_cache, DYN_REQUESTS);
try { try {
@ -1708,7 +1679,7 @@ static void drop_cache( GBL gbl)
X IN RDB$FILES WITH X.RDB$FILE_FLAGS EQ FILE_cache X IN RDB$FILES WITH X.RDB$FILE_FLAGS EQ FILE_cache
ERASE X; ERASE X;
found = TRUE; found = true;
END_FOR; END_FOR;
@ -1744,16 +1715,13 @@ static void change_backup_mode( GBL gbl, UCHAR verb)
* begin or end backup * begin or end backup
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request;
USHORT found = FALSE;
bool invalid_state = false; bool invalid_state = false;
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_d_difference, DYN_REQUESTS); BLK request = (BLK) CMP_find_request(tdbb, drq_d_difference, DYN_REQUESTS);
bool found = false;
try { try {
@ -1761,7 +1729,7 @@ static void change_backup_mode( GBL gbl, UCHAR verb)
X IN RDB$FILES X IN RDB$FILES
if (X.RDB$FILE_FLAGS & FILE_difference) { if (X.RDB$FILE_FLAGS & FILE_difference) {
found = TRUE; found = true;
switch (verb) { switch (verb) {
case gds_dyn_drop_difference: case gds_dyn_drop_difference:
ERASE X; ERASE X;
@ -1860,15 +1828,11 @@ static void drop_log( GBL gbl)
* Delete all log files * Delete all log files
* *
**************************************/ **************************************/
TDBB tdbb; TDBB tdbb = GET_THREAD_DATA;
DBB dbb; DBB dbb = tdbb->tdbb_database;
BLK request;
USHORT found = FALSE;
tdbb = GET_THREAD_DATA; BLK request = (BLK) CMP_find_request(tdbb, drq_d_log, DYN_REQUESTS);
dbb = tdbb->tdbb_database; bool found = false;
request = (BLK) CMP_find_request(tdbb, drq_d_log, DYN_REQUESTS);
try { try {
@ -1876,7 +1840,7 @@ static void drop_log( GBL gbl)
X IN RDB$LOG_FILES X IN RDB$LOG_FILES
ERASE X; ERASE X;
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_d_log)) if (!DYN_REQUEST(drq_d_log))
@ -1899,8 +1863,8 @@ static void drop_log( GBL gbl)
static void modify_lfield_position(TDBB tdbb, static void modify_lfield_position(TDBB tdbb,
DBB dbb, DBB dbb,
GBL gbl, GBL gbl,
TEXT * relation_name, const TEXT* relation_name,
TEXT * field_name, const TEXT* field_name,
USHORT new_position, USHORT new_position,
USHORT existing_position) USHORT existing_position)
{ {
@ -1931,13 +1895,11 @@ static void modify_lfield_position(TDBB tdbb,
* *
***********************************************************/ ***********************************************************/
volatile BLK request = NULL; volatile BLK request = NULL;
USHORT new_pos = 0;
SLONG max_position = -1;
BOOLEAN move_down = FALSE;
try { try {
/* Find the position of the last field in the relation */ /* Find the position of the last field in the relation */
SLONG max_position = -1;
DYN_UTIL_generate_field_position(tdbb, gbl, relation_name, &max_position); DYN_UTIL_generate_field_position(tdbb, gbl, relation_name, &max_position);
/* if the existing position of the field is less than the new position of /* if the existing position of the field is less than the new position of
@ -1945,8 +1907,9 @@ static void modify_lfield_position(TDBB tdbb,
* increase the value in RDB$FIELD_POSITION by one * increase the value in RDB$FIELD_POSITION by one
*/ */
bool move_down = false;
if (existing_position < new_position) if (existing_position < new_position)
move_down = TRUE; move_down = true;
/* Retrieve the records for the fields which have a position between the /* Retrieve the records for the fields which have a position between the
* existing field position and the new field position * existing field position and the new field position
@ -1988,7 +1951,7 @@ static void modify_lfield_position(TDBB tdbb,
* duplicate field positions and no gaps in the position sequence (this can * duplicate field positions and no gaps in the position sequence (this can
* not be guaranteed by the query above */ * not be guaranteed by the query above */
new_pos = 0; USHORT new_pos = 0;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$RELATION_FIELDS WITH FLD.RDB$RELATION_NAME EQ relation_name FLD IN RDB$RELATION_FIELDS WITH FLD.RDB$RELATION_NAME EQ relation_name
SORTED BY ASCENDING FLD.RDB$FIELD_POSITION SORTED BY ASCENDING FLD.RDB$FIELD_POSITION
@ -2009,10 +1972,11 @@ static void modify_lfield_position(TDBB tdbb,
} }
} }
static BOOLEAN check_view_dependency(TDBB tdbb, static bool check_view_dependency(TDBB tdbb,
DBB dbb, DBB dbb,
GBL gbl, GBL gbl,
TEXT * relation_name, TEXT * field_name) const TEXT* relation_name,
const TEXT* field_name)
{ {
/*********************************************************** /***********************************************************
* *
@ -2021,12 +1985,13 @@ static BOOLEAN check_view_dependency(TDBB tdbb,
* *
* Functional Description: * Functional Description:
* Checks to see if the given field is referenced in a view. If the field * Checks to see if the given field is referenced in a view. If the field
* is referenced in a view, return TRUE, else return FALSE * is referenced in a view, return true, else return false
* CVC: The function never has a chance to return true because it punts.
* *
***********************************************************/ ***********************************************************/
BLK request = NULL; BLK request = NULL;
BOOLEAN retval = FALSE; bool retval = false;
TEXT *view_name; TEXT *view_name = NULL;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FIRST 1 FIRST 1
@ -2039,7 +2004,7 @@ static BOOLEAN check_view_dependency(TDBB tdbb,
Y.RDB$RELATION_NAME EQ Z.RDB$VIEW_NAME AND Y.RDB$RELATION_NAME EQ Z.RDB$VIEW_NAME AND
X.RDB$RELATION_NAME EQ Z.RDB$RELATION_NAME AND X.RDB$RELATION_NAME EQ Z.RDB$RELATION_NAME AND
Y.RDB$VIEW_CONTEXT EQ Z.RDB$VIEW_CONTEXT Y.RDB$VIEW_CONTEXT EQ Z.RDB$VIEW_CONTEXT
retval = TRUE; retval = true;
view_name = Z.RDB$VIEW_NAME; view_name = Z.RDB$VIEW_NAME;
END_FOR; END_FOR;
@ -2054,11 +2019,11 @@ static BOOLEAN check_view_dependency(TDBB tdbb,
} }
static BOOLEAN check_sptrig_dependency(TDBB tdbb, static bool check_sptrig_dependency(TDBB tdbb,
DBB dbb, DBB dbb,
GBL gbl, GBL gbl,
TEXT * relation_name, const TEXT* relation_name,
TEXT * field_name) const TEXT* field_name)
{ {
/*********************************************************** /***********************************************************
* *
@ -2067,19 +2032,19 @@ static BOOLEAN check_sptrig_dependency(TDBB tdbb,
* *
* Functional Description: * Functional Description:
* Checks to see if the given field is referenced in a stored procedure * Checks to see if the given field is referenced in a stored procedure
* or trigger. If the field is refereneced, return TRUE, else return * or trigger. If the field is refereneced, return true, else return
* FALSE * false, but true causes the function to punt instead.
***********************************************************/ ***********************************************************/
BLK request = NULL; BLK request = NULL;
BOOLEAN retval = FALSE; bool retval = false;
TEXT *dep_name; TEXT *dep_name = NULL;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FIRST 1 FIRST 1
DEP IN RDB$DEPENDENCIES WITH DEP IN RDB$DEPENDENCIES WITH
DEP.RDB$DEPENDED_ON_NAME EQ relation_name AND DEP.RDB$DEPENDED_ON_NAME EQ relation_name AND
DEP.RDB$FIELD_NAME EQ field_name DEP.RDB$FIELD_NAME EQ field_name
retval = TRUE; retval = true;
dep_name = DEP.RDB$DEPENDENT_NAME; dep_name = DEP.RDB$DEPENDENT_NAME;
END_FOR; END_FOR;
@ -2096,9 +2061,9 @@ static BOOLEAN check_sptrig_dependency(TDBB tdbb,
static void modify_lfield_index(TDBB tdbb, static void modify_lfield_index(TDBB tdbb,
DBB dbb, DBB dbb,
GBL gbl, GBL gbl,
TEXT* relation_name, const TEXT* relation_name,
TEXT* field_name, const TEXT* field_name,
TEXT* new_fld_name) const TEXT* new_fld_name)
{ {
/*********************************************************** /***********************************************************
* *
@ -2133,9 +2098,11 @@ static void modify_lfield_index(TDBB tdbb,
CMP_release(tdbb, (JRD_REQ)request); CMP_release(tdbb, (JRD_REQ)request);
} }
static BOOLEAN field_exists(TDBB tdbb, static bool field_exists(TDBB tdbb,
DBB dbb, DBB dbb,
GBL gbl, TEXT * relation_name, TEXT * field_name) GBL gbl,
const TEXT* relation_name,
const TEXT* field_name)
{ {
/*********************************************************** /***********************************************************
* *
@ -2146,20 +2113,20 @@ static BOOLEAN field_exists(TDBB tdbb,
* Checks to see if the given field already exists in a relation * Checks to see if the given field already exists in a relation
***********************************************************/ ***********************************************************/
BLK request = NULL; BLK request = NULL;
BOOLEAN retval = FALSE; bool retval = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$RELATION_FIELDS WITH FLD IN RDB$RELATION_FIELDS WITH
FLD.RDB$RELATION_NAME EQ relation_name AND FLD.RDB$RELATION_NAME EQ relation_name AND
FLD.RDB$FIELD_NAME EQ field_name FLD.RDB$FIELD_NAME EQ field_name
retval = TRUE; retval = true;
END_FOR; END_FOR;
CMP_release(tdbb, (JRD_REQ)request); CMP_release(tdbb, (JRD_REQ)request);
return retval; return retval;
} }
static BOOLEAN domain_exists(TDBB tdbb, DBB dbb, GBL gbl, TEXT * field_name) static bool domain_exists(TDBB tdbb, DBB dbb, GBL gbl, const TEXT* field_name)
{ {
/*********************************************************** /***********************************************************
* *
@ -2170,11 +2137,11 @@ static BOOLEAN domain_exists(TDBB tdbb, DBB dbb, GBL gbl, TEXT * field_name)
* Checks to see if the given field already exists in a relation * Checks to see if the given field already exists in a relation
***********************************************************/ ***********************************************************/
BLK request = NULL; BLK request = NULL;
BOOLEAN retval = FALSE; bool retval = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME EQ field_name FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME EQ field_name
retval = TRUE; retval = true;
END_FOR; END_FOR;
CMP_release(tdbb, (JRD_REQ)request); CMP_release(tdbb, (JRD_REQ)request);
@ -2229,11 +2196,8 @@ void DYN_modify_sql_field(GBL gbl,
* produces a warning. This condition raises an error, too. * produces a warning. This condition raises an error, too.
* *
**************************************/ **************************************/
TDBB tdbb;
DBB dbb;
BLK request = NULL, first_request;
UCHAR verb; UCHAR verb;
BOOLEAN found = FALSE, update_domain = FALSE; BOOLEAN update_domain = FALSE;
BOOLEAN dtype, scale, prec, subtype, charlen, collation, fldlen, nullflg, BOOLEAN dtype, scale, prec, subtype, charlen, collation, fldlen, nullflg,
charset; charset;
DYN_FLD orig_fld, new_fld, dom_fld; DYN_FLD orig_fld, new_fld, dom_fld;
@ -2241,8 +2205,8 @@ void DYN_modify_sql_field(GBL gbl,
SSHORT field_adjusted_count = 0; SSHORT field_adjusted_count = 0;
TEXT *err_one_type_change_only = "Only one data type change to the field allowed at a time"; TEXT *err_one_type_change_only = "Only one data type change to the field allowed at a time";
tdbb = GET_THREAD_DATA; TDBB tdbb = GET_THREAD_DATA;
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
try { try {
@ -2274,13 +2238,17 @@ void DYN_modify_sql_field(GBL gbl,
check_sptrig_dependency(tdbb, dbb, gbl, relation_name, check_sptrig_dependency(tdbb, dbb, gbl, relation_name,
orig_fld->dyn_fld_name); orig_fld->dyn_fld_name);
BLK request = NULL;
BLK first_request = NULL;
bool found = false;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
RFR IN RDB$RELATION_FIELDS WITH RFR.RDB$RELATION_NAME = relation_name RFR IN RDB$RELATION_FIELDS WITH RFR.RDB$RELATION_NAME = relation_name
AND RFR.RDB$FIELD_NAME = orig_fld->dyn_fld_name AND RFR.RDB$FIELD_NAME = orig_fld->dyn_fld_name
first_request = request; first_request = request;
request = NULL; request = NULL;
found = TRUE; found = true;
FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) FOR(REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction)
FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME = RFR.RDB$FIELD_SOURCE FLD IN RDB$FIELDS WITH FLD.RDB$FIELD_NAME = RFR.RDB$FIELD_SOURCE
@ -2447,8 +2415,6 @@ void DYN_modify_sql_field(GBL gbl,
if (update_domain) { if (update_domain) {
ULONG retval;
/* CVC: Since get_domain_type() called above already called DSC_make_descriptor, /* CVC: Since get_domain_type() called above already called DSC_make_descriptor,
there's no point in calling it again, since it will increment AGAIN the length there's no point in calling it again, since it will increment AGAIN the length
of varchar fields! This bug detected thanks to new check field dyn_charbytelen. of varchar fields! This bug detected thanks to new check field dyn_charbytelen.
@ -2460,8 +2426,9 @@ void DYN_modify_sql_field(GBL gbl,
dom_fld->dyn_charset, dom_fld->dyn_collation); dom_fld->dyn_charset, dom_fld->dyn_collation);
*/ */
if ((retval = check_update_fld_type(orig_fld, dom_fld)) != ULONG retval = check_update_fld_type(orig_fld, dom_fld);
FB_SUCCESS) modify_err_punt(tdbb, retval, orig_fld, dom_fld); if (retval != FB_SUCCESS)
modify_err_punt(tdbb, retval, orig_fld, dom_fld);
/* if the original definition was a base field type, remove the entries from RDB$FIELDS */ /* if the original definition was a base field type, remove the entries from RDB$FIELDS */
if (!strncmp(orig_fld->dyn_fld_source, "RDB$", 4)) { if (!strncmp(orig_fld->dyn_fld_source, "RDB$", 4)) {
@ -2482,17 +2449,15 @@ void DYN_modify_sql_field(GBL gbl,
first_request = request; first_request = request;
} }
else { else {
ULONG retval;
DSC_make_descriptor(&new_fld->dyn_dsc, DSC_make_descriptor(&new_fld->dyn_dsc,
new_fld->dyn_dtype, new_fld->dyn_dtype,
new_fld->dyn_dsc.dsc_scale, new_fld->dyn_dsc.dsc_scale,
new_fld->dyn_dsc.dsc_length, new_fld->dyn_dsc.dsc_length,
new_fld->dyn_dsc.dsc_sub_type, new_fld->dyn_dsc.dsc_sub_type,
new_fld->dyn_charset, new_fld->dyn_collation); new_fld->dyn_charset, new_fld->dyn_collation);
ULONG retval = check_update_fld_type(orig_fld, new_fld);
if ((retval = check_update_fld_type(orig_fld, new_fld)) != if (retval != FB_SUCCESS)
FB_SUCCESS) modify_err_punt(tdbb, retval, orig_fld, new_fld); modify_err_punt(tdbb, retval, orig_fld, new_fld);
/* check to see if the original data type for the field was based on a domain. If it /* check to see if the original data type for the field was based on a domain. If it
* was (and now it isn't), remove the domain information and replace it with a generated * was (and now it isn't), remove the domain information and replace it with a generated
@ -2668,7 +2633,7 @@ void get_domain_type(TDBB tdbb, DBB dbb, GBL gbl, DYN_FLD dom_fld)
************************************** **************************************
* *
* Functional description * Functional description
* Retrives the type information for a domain so * Retrieves the type information for a domain so
* that it can be compared to a local field before * that it can be compared to a local field before
* modifying the datatype of a field. * modifying the datatype of a field.
* *
@ -2683,7 +2648,8 @@ void get_domain_type(TDBB tdbb, DBB dbb, GBL gbl, DYN_FLD dom_fld)
FLD.RDB$FIELD_SCALE, FLD.RDB$FIELD_SCALE,
FLD.RDB$FIELD_LENGTH, FLD.RDB$FIELD_LENGTH,
FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_SUB_TYPE,
FLD.RDB$CHARACTER_SET_ID, FLD.RDB$COLLATION_ID); FLD.RDB$CHARACTER_SET_ID,
FLD.RDB$COLLATION_ID);
dom_fld->dyn_charbytelen = FLD.RDB$FIELD_LENGTH; dom_fld->dyn_charbytelen = FLD.RDB$FIELD_LENGTH;
dom_fld->dyn_dtype = FLD.RDB$FIELD_TYPE; dom_fld->dyn_dtype = FLD.RDB$FIELD_TYPE;
@ -2696,7 +2662,8 @@ void get_domain_type(TDBB tdbb, DBB dbb, GBL gbl, DYN_FLD dom_fld)
CMP_release(tdbb, (JRD_REQ)request); CMP_release(tdbb, (JRD_REQ)request);
} }
static ULONG check_update_fld_type(DYN_FLD orig_fld, DYN_FLD new_fld) static ULONG check_update_fld_type(const dyn_fld* orig_fld,
const dyn_fld* new_fld)
{ {
/************************************** /**************************************
* *
@ -2755,12 +2722,11 @@ static ULONG check_update_fld_type(DYN_FLD orig_fld, DYN_FLD new_fld)
case blr_varying: case blr_varying:
case blr_cstring: case blr_cstring:
{ {
USHORT maxflen = 0;
/* CVC: Because our caller invoked DSC_make_descriptor() on new_fld previously, /* CVC: Because our caller invoked DSC_make_descriptor() on new_fld previously,
we should have the added bytes for varchar. For cstring, we are used, since we should have the added bytes for varchar. For cstring, we are used, since
DSC_make_descriptor(DSC_string_length) != DSC_string_length(DSC_make_descriptor). */ DSC_make_descriptor(DSC_string_length) != DSC_string_length(DSC_make_descriptor). */
maxflen = DSC_string_length(&orig_fld->dyn_dsc); USHORT maxflen = DSC_string_length(&orig_fld->dyn_dsc);
/* We can have this assertion since this case is for both string fields. */ /* We can have this assertion since this case is for both string fields. */
assert(DSC_string_length(&new_fld->dyn_dsc) - maxflen assert(DSC_string_length(&new_fld->dyn_dsc) - maxflen
@ -2818,9 +2784,7 @@ static ULONG check_update_fld_type(DYN_FLD orig_fld, DYN_FLD new_fld)
case blr_cstring: case blr_cstring:
case blr_cstring2: case blr_cstring2:
{ {
USHORT maxflen = 0; USHORT maxflen = DSC_string_length(&orig_fld->dyn_dsc);
maxflen = DSC_string_length(&orig_fld->dyn_dsc);
if (new_fld->dyn_dsc.dsc_length < maxflen) if (new_fld->dyn_dsc.dsc_length < maxflen)
return isc_dyn_char_fld_too_small; return isc_dyn_char_fld_too_small;
@ -2927,9 +2891,7 @@ static ULONG check_update_fld_type(DYN_FLD orig_fld, DYN_FLD new_fld)
case blr_varying: case blr_varying:
case blr_cstring: case blr_cstring:
{ {
USHORT maxflen = 0; USHORT maxflen = DSC_string_length(&orig_fld->dyn_dsc);
maxflen = DSC_string_length(&orig_fld->dyn_dsc);
if (new_fld->dyn_dsc.dsc_length < maxflen) if (new_fld->dyn_dsc.dsc_length < maxflen)
return isc_dyn_char_fld_too_small; return isc_dyn_char_fld_too_small;
@ -2952,7 +2914,8 @@ static ULONG check_update_fld_type(DYN_FLD orig_fld, DYN_FLD new_fld)
static void modify_err_punt(TDBB tdbb, static void modify_err_punt(TDBB tdbb,
ULONG errorcode, ULONG errorcode,
DYN_FLD orig_fld_def, DYN_FLD new_fld_def) const dyn_fld* orig_fld_def,
const dyn_fld* new_fld_def)
{ {
/************************************** /**************************************
* *
@ -3014,3 +2977,4 @@ static void modify_err_punt(TDBB tdbb,
/* msg 95: "MODIFY RDB$RELATION_FIELDS failed" */ /* msg 95: "MODIFY RDB$RELATION_FIELDS failed" */
} }
} }

View File

@ -22,16 +22,17 @@
*/ */
#ifndef _JRD_DYN_UT_PROTO_H_ #ifndef JRD_DYN_UT_PROTO_H
#define _JRD_DYN_UT_PROTO_H_ #define JRD_DYN_UT_PROTO_H
extern void DYN_UTIL_store_check_constraints(TDBB, GBL, TEXT *, TEXT *); extern void DYN_UTIL_store_check_constraints(TDBB, GBL, TEXT *, TEXT *);
extern BOOLEAN DYN_UTIL_get_prot(TDBB, GBL, SCHAR *, SCHAR *, USHORT *); extern BOOLEAN DYN_UTIL_get_prot(TDBB, GBL, SCHAR *, SCHAR *, USHORT *);
extern void DYN_UTIL_generate_trigger_name(TDBB, GBL, TEXT *); extern void DYN_UTIL_generate_trigger_name(TDBB, GBL, TEXT *);
extern void DYN_UTIL_generate_index_name(TDBB, GBL, TEXT *, UCHAR); extern void DYN_UTIL_generate_index_name(TDBB, GBL, TEXT *, UCHAR);
extern void DYN_UTIL_generate_field_position(TDBB, GBL, TEXT *, SLONG *); extern void DYN_UTIL_generate_field_position(TDBB, GBL, const TEXT*, SLONG *);
extern void DYN_UTIL_generate_field_name(TDBB, GBL, TEXT *); extern void DYN_UTIL_generate_field_name(TDBB, GBL, TEXT *);
extern void DYN_UTIL_generate_constraint_name(TDBB, GBL, TEXT *); extern void DYN_UTIL_generate_constraint_name(TDBB, GBL, TEXT *);
extern SINT64 DYN_UTIL_gen_unique_id(TDBB, GBL, SSHORT, SCHAR *, BLK *); extern SINT64 DYN_UTIL_gen_unique_id(TDBB, GBL, SSHORT, SCHAR *, BLK *);
#endif /* _JRD_DYN_UT_PROTO_H_ */ #endif /* JRD_DYN_UT_PROTO_H */

View File

@ -119,14 +119,12 @@ SINT64 DYN_UTIL_gen_unique_id(TDBB tdbb,
* Generate a unique id using a generator. * Generate a unique id using a generator.
* *
**************************************/ **************************************/
DBB dbb;
JRD_REQ req_handle;
SINT64 value; SINT64 value;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
req_handle = CMP_find_request(tdbb, id, DYN_REQUESTS); JRD_REQ req_handle = CMP_find_request(tdbb, id, DYN_REQUESTS);
if (!req_handle) if (!req_handle)
{ {
@ -170,19 +168,19 @@ void DYN_UTIL_generate_constraint_name( TDBB tdbb, GBL gbl, TEXT * buffer)
* Generate a name unique to RDB$RELATION_CONSTRAINTS. * Generate a name unique to RDB$RELATION_CONSTRAINTS.
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
USHORT found;
volatile SSHORT id; volatile SSHORT id;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
id = -1; id = -1;
try { try {
bool found = false;
do { do {
id = drq_g_nxt_con; id = drq_g_nxt_con;
sprintf(buffer, "INTEG_%" QUADFORMAT "d", sprintf(buffer, "INTEG_%" QUADFORMAT "d",
@ -195,14 +193,14 @@ void DYN_UTIL_generate_constraint_name( TDBB tdbb, GBL gbl, TEXT * buffer)
request = (BLK) CMP_find_request(tdbb, drq_f_nxt_con, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_f_nxt_con, DYN_REQUESTS);
id = drq_f_nxt_con; id = drq_f_nxt_con;
found = FALSE; found = false;
FOR(REQUEST_HANDLE request) FOR(REQUEST_HANDLE request)
FIRST 1 X IN RDB$RELATION_CONSTRAINTS FIRST 1 X IN RDB$RELATION_CONSTRAINTS
WITH X.RDB$CONSTRAINT_NAME EQ buffer WITH X.RDB$CONSTRAINT_NAME EQ buffer
if (!DYN_REQUEST(drq_f_nxt_con)) if (!DYN_REQUEST(drq_f_nxt_con))
DYN_REQUEST(drq_f_nxt_con) = request; DYN_REQUEST(drq_f_nxt_con) = request;
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_f_nxt_con)) if (!DYN_REQUEST(drq_f_nxt_con))
@ -231,19 +229,19 @@ void DYN_UTIL_generate_field_name( TDBB tdbb, GBL gbl, TEXT * buffer)
* Generate a name unique to RDB$FIELDS. * Generate a name unique to RDB$FIELDS.
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
USHORT found;
volatile SSHORT id; volatile SSHORT id;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
id = -1; id = -1;
try { try {
bool found = false;
do { do {
id = drq_g_nxt_fld; id = drq_g_nxt_fld;
sprintf(buffer, "RDB$%" QUADFORMAT "d", sprintf(buffer, "RDB$%" QUADFORMAT "d",
@ -256,13 +254,13 @@ void DYN_UTIL_generate_field_name( TDBB tdbb, GBL gbl, TEXT * buffer)
request = (BLK) CMP_find_request(tdbb, drq_f_nxt_fld, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_f_nxt_fld, DYN_REQUESTS);
id = drq_f_nxt_fld; id = drq_f_nxt_fld;
found = FALSE; found = false;
FOR(REQUEST_HANDLE request) FOR(REQUEST_HANDLE request)
FIRST 1 X IN RDB$FIELDS WITH X.RDB$FIELD_NAME EQ buffer FIRST 1 X IN RDB$FIELDS WITH X.RDB$FIELD_NAME EQ buffer
if (!DYN_REQUEST(drq_f_nxt_fld)) if (!DYN_REQUEST(drq_f_nxt_fld))
DYN_REQUEST(drq_f_nxt_fld) = request; DYN_REQUEST(drq_f_nxt_fld) = request;
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_f_nxt_fld)) if (!DYN_REQUEST(drq_f_nxt_fld))
@ -282,7 +280,8 @@ void DYN_UTIL_generate_field_name( TDBB tdbb, GBL gbl, TEXT * buffer)
void DYN_UTIL_generate_field_position( void DYN_UTIL_generate_field_position(
TDBB tdbb, TDBB tdbb,
GBL gbl, GBL gbl,
TEXT * relation_name, SLONG * field_pos) const TEXT* relation_name,
SLONG * field_pos)
{ {
/************************************** /**************************************
* *
@ -294,7 +293,6 @@ void DYN_UTIL_generate_field_position(
* Generate a field position if not specified * Generate a field position if not specified
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
SLONG field_position = -1; SLONG field_position = -1;
@ -302,7 +300,7 @@ void DYN_UTIL_generate_field_position(
return; return;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
@ -347,20 +345,20 @@ void DYN_UTIL_generate_index_name(TDBB tdbb,
* Generate a name unique to RDB$INDICES. * Generate a name unique to RDB$INDICES.
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
USHORT found;
volatile SSHORT id; volatile SSHORT id;
SCHAR *format; SCHAR *format;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
id = -1; id = -1;
try { try {
bool found = false;
do { do {
if (verb == gds_dyn_def_primary_key) if (verb == gds_dyn_def_primary_key)
format = "RDB$PRIMARY%" QUADFORMAT "d"; format = "RDB$PRIMARY%" QUADFORMAT "d";
@ -379,13 +377,13 @@ void DYN_UTIL_generate_index_name(TDBB tdbb,
request = (BLK) CMP_find_request(tdbb, drq_f_nxt_idx, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_f_nxt_idx, DYN_REQUESTS);
id = drq_f_nxt_idx; id = drq_f_nxt_idx;
found = FALSE; found = false;
FOR(REQUEST_HANDLE request) FOR(REQUEST_HANDLE request)
FIRST 1 X IN RDB$INDICES WITH X.RDB$INDEX_NAME EQ buffer FIRST 1 X IN RDB$INDICES WITH X.RDB$INDEX_NAME EQ buffer
if (!DYN_REQUEST(drq_f_nxt_idx)) if (!DYN_REQUEST(drq_f_nxt_idx))
DYN_REQUEST(drq_f_nxt_idx) = request; DYN_REQUEST(drq_f_nxt_idx) = request;
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_f_nxt_idx)) if (!DYN_REQUEST(drq_f_nxt_idx))
@ -413,19 +411,19 @@ void DYN_UTIL_generate_trigger_name( TDBB tdbb, GBL gbl, TEXT * buffer)
* Generate a name unique to RDB$TRIGGERS. * Generate a name unique to RDB$TRIGGERS.
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
USHORT found;
volatile SSHORT id; volatile SSHORT id;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = NULL; request = NULL;
id = -1; id = -1;
try { try {
bool found = false;
do { do {
id = drq_g_nxt_trg; id = drq_g_nxt_trg;
sprintf(buffer, "CHECK_%" QUADFORMAT "d", sprintf(buffer, "CHECK_%" QUADFORMAT "d",
@ -438,13 +436,13 @@ void DYN_UTIL_generate_trigger_name( TDBB tdbb, GBL gbl, TEXT * buffer)
request = (BLK) CMP_find_request(tdbb, drq_f_nxt_trg, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_f_nxt_trg, DYN_REQUESTS);
id = drq_f_nxt_trg; id = drq_f_nxt_trg;
found = FALSE; found = false;
FOR(REQUEST_HANDLE request) FOR(REQUEST_HANDLE request)
FIRST 1 X IN RDB$TRIGGERS WITH X.RDB$TRIGGER_NAME EQ buffer FIRST 1 X IN RDB$TRIGGERS WITH X.RDB$TRIGGER_NAME EQ buffer
if (!DYN_REQUEST(drq_f_nxt_trg)) if (!DYN_REQUEST(drq_f_nxt_trg))
DYN_REQUEST(drq_f_nxt_trg) = request; DYN_REQUEST(drq_f_nxt_trg) = request;
found = TRUE; found = true;
END_FOR; END_FOR;
if (!DYN_REQUEST(drq_f_nxt_trg)) if (!DYN_REQUEST(drq_f_nxt_trg))
@ -533,11 +531,10 @@ void DYN_UTIL_store_check_constraints(TDBB tdbb,
* Functional description * Functional description
* *
**************************************/ **************************************/
DBB dbb;
volatile BLK request; volatile BLK request;
SET_TDBB(tdbb); SET_TDBB(tdbb);
dbb = tdbb->tdbb_database; DBB dbb = tdbb->tdbb_database;
request = (BLK) CMP_find_request(tdbb, drq_s_chk_con, DYN_REQUESTS); request = (BLK) CMP_find_request(tdbb, drq_s_chk_con, DYN_REQUESTS);
@ -560,3 +557,4 @@ void DYN_UTIL_store_check_constraints(TDBB tdbb,
/* msg 122: "STORE RDB$CHECK_CONSTRAINTS failed" */ /* msg 122: "STORE RDB$CHECK_CONSTRAINTS failed" */
} }
} }

View File

@ -759,7 +759,8 @@ static ISC_STATUS error(ISC_STATUS * status_vector,
*status_vector++ = gds_arg_string; *status_vector++ = gds_arg_string;
*status_vector++ = (ISC_STATUS) string; *status_vector++ = (ISC_STATUS) string;
*status_vector++ = gds_arg_vms; *status_vector++ = gds_arg_vms;
*status_vector++ = status; *status_vector++ = gds_arg_end; *status_vector++ = status;
*status_vector++ = gds_arg_end;
return gds__sys_request; return gds__sys_request;
} }
@ -974,3 +975,4 @@ static int return_ok(ISC_STATUS * status_vector)
*status_vector = gds_arg_end; *status_vector = gds_arg_end;
return 0; return 0;
} }

View File

@ -127,9 +127,6 @@ BOOLEAN SHUT_database(DBB dbb, SSHORT flag, SSHORT delay)
/* Only platform's user locksmith can shutdown or bring online /* Only platform's user locksmith can shutdown or bring online
a database. */ a database. */
#pragma FB_COMPILER_MESSAGE("Locksmith?!")
// if (!attachment->att_user->usr_flags & (USR_locksmith | USR_owner)) {
if (!(attachment->att_user->usr_flags & (USR_locksmith | USR_owner))) { if (!(attachment->att_user->usr_flags & (USR_locksmith | USR_owner))) {
return FALSE; return FALSE;
} }