mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-27 06:43:04 +01:00
242 lines
6.4 KiB
C++
242 lines
6.4 KiB
C++
/*
|
|
* PROGRAM: JRD access method
|
|
* MODULE: val.h
|
|
* DESCRIPTION: Definitions associated with value handling
|
|
*
|
|
* The contents of this file are subject to the Interbase Public
|
|
* License Version 1.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy
|
|
* of the License at http://www.Inprise.com/IPL.html
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
|
|
* or implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code was created by Inprise Corporation
|
|
* and its predecessors. Portions created by Inprise Corporation are
|
|
* Copyright (C) Inprise Corporation.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
*
|
|
* 2002.10.29 Sean Leyne - Removed obsolete "Netware" port
|
|
*
|
|
* 2002.10.30 Sean Leyne - Removed support for obsolete "PC_PLATFORM" define
|
|
*
|
|
*/
|
|
|
|
#ifndef JRD_VAL_H
|
|
#define JRD_VAL_H
|
|
|
|
#include "../include/fb_blk.h"
|
|
#include "../common/classes/array.h"
|
|
#include "../common/classes/MetaName.h"
|
|
#include "../common/classes/QualifiedName.h"
|
|
|
|
#include "../jrd/RecordNumber.h"
|
|
#include "../common/dsc.h"
|
|
|
|
#define FLAG_BYTES(n) (((n + BITS_PER_LONG) & ~((ULONG)BITS_PER_LONG - 1)) >> 3)
|
|
|
|
// Random string block -- as long as impure areas don't have
|
|
// constructors and destructors, the need this varying string
|
|
|
|
class VaryingString : public pool_alloc_rpt<SCHAR, type_str>
|
|
{
|
|
public:
|
|
USHORT str_length;
|
|
UCHAR str_data[2]; // one byte for ALLOC and one for the NULL
|
|
};
|
|
|
|
const UCHAR DEFAULT_DOUBLE = dtype_double;
|
|
const ULONG MAX_RECORD_SIZE = 65535;
|
|
|
|
namespace Jrd {
|
|
|
|
class ArrayField;
|
|
class blb;
|
|
class jrd_req;
|
|
class jrd_tra;
|
|
class PatternMatcher;
|
|
|
|
// Various structures in the impure area
|
|
|
|
struct impure_state
|
|
{
|
|
ULONG sta_state;
|
|
};
|
|
|
|
struct impure_value
|
|
{
|
|
dsc vlu_desc;
|
|
USHORT vlu_flags; // Computed/invariant flags
|
|
VaryingString* vlu_string;
|
|
union
|
|
{
|
|
UCHAR vlu_uchar;
|
|
SSHORT vlu_short;
|
|
SLONG vlu_long;
|
|
SINT64 vlu_int64;
|
|
SQUAD vlu_quad;
|
|
SLONG vlu_dbkey[2];
|
|
float vlu_float;
|
|
double vlu_double;
|
|
GDS_TIMESTAMP vlu_timestamp;
|
|
GDS_TIME vlu_sql_time;
|
|
GDS_DATE vlu_sql_date;
|
|
bid vlu_bid;
|
|
|
|
// Pre-compiled invariant object for nod_like and other string functions
|
|
Jrd::PatternMatcher* vlu_invariant;
|
|
} vlu_misc;
|
|
|
|
void make_long(const SLONG val, const signed char scale = 0);
|
|
void make_int64(const SINT64 val, const signed char scale = 0);
|
|
};
|
|
|
|
// Do not use these methods where dsc_sub_type is not explicitly set to zero.
|
|
inline void impure_value::make_long(const SLONG val, const signed char scale)
|
|
{
|
|
this->vlu_misc.vlu_long = val;
|
|
this->vlu_desc.dsc_dtype = dtype_long;
|
|
this->vlu_desc.dsc_length = sizeof(SLONG);
|
|
this->vlu_desc.dsc_scale = scale;
|
|
this->vlu_desc.dsc_sub_type = 0;
|
|
this->vlu_desc.dsc_address = reinterpret_cast<UCHAR*>(&this->vlu_misc.vlu_long);
|
|
}
|
|
|
|
inline void impure_value::make_int64(const SINT64 val, const signed char scale)
|
|
{
|
|
this->vlu_misc.vlu_int64 = val;
|
|
this->vlu_desc.dsc_dtype = dtype_int64;
|
|
this->vlu_desc.dsc_length = sizeof(SINT64);
|
|
this->vlu_desc.dsc_scale = scale;
|
|
this->vlu_desc.dsc_sub_type = 0;
|
|
this->vlu_desc.dsc_address = reinterpret_cast<UCHAR*>(&this->vlu_misc.vlu_int64);
|
|
}
|
|
|
|
struct impure_value_ex : public impure_value
|
|
{
|
|
SINT64 vlux_count;
|
|
blb* vlu_blob;
|
|
};
|
|
|
|
const int VLU_computed = 1; // An invariant sub-query has been computed
|
|
const int VLU_null = 2; // An invariant sub-query computed to null
|
|
const int VLU_checked = 4; // Constraint already checked in first read or assignment to argument/variable
|
|
|
|
|
|
class Format : public pool_alloc<type_fmt>
|
|
{
|
|
public:
|
|
Format(MemoryPool& p, int len)
|
|
: fmt_length(0), fmt_count(len), fmt_version(0),
|
|
fmt_desc(p, fmt_count), fmt_defaults(p, fmt_count)
|
|
{
|
|
fmt_desc.resize(fmt_count);
|
|
fmt_defaults.resize(fmt_count);
|
|
|
|
for (fmt_defaults_iterator impure = fmt_defaults.begin();
|
|
impure != fmt_defaults.end(); ++impure)
|
|
{
|
|
memset(&*impure, 0, sizeof(*impure));
|
|
}
|
|
}
|
|
|
|
~Format()
|
|
{
|
|
for (fmt_defaults_iterator impure = fmt_defaults.begin();
|
|
impure != fmt_defaults.end(); ++impure)
|
|
{
|
|
delete impure->vlu_string;
|
|
}
|
|
}
|
|
|
|
static Format* newFormat(MemoryPool& p, int len = 0)
|
|
{
|
|
return FB_NEW(p) Format(p, len);
|
|
}
|
|
|
|
ULONG fmt_length;
|
|
USHORT fmt_count;
|
|
USHORT fmt_version;
|
|
Firebird::Array<dsc> fmt_desc;
|
|
Firebird::Array<impure_value> fmt_defaults;
|
|
|
|
typedef Firebird::Array<dsc>::iterator fmt_desc_iterator;
|
|
typedef Firebird::Array<dsc>::const_iterator fmt_desc_const_iterator;
|
|
|
|
typedef Firebird::Array<impure_value>::iterator fmt_defaults_iterator;
|
|
};
|
|
|
|
|
|
// Blob passing structure
|
|
// CVC: Moved to fun.epp where it belongs.
|
|
|
|
// Scalar array descriptor, "external side" seen by UDF's
|
|
|
|
struct scalar_array_desc
|
|
{
|
|
DSC sad_desc;
|
|
SLONG sad_dimensions;
|
|
struct sad_repeat
|
|
{
|
|
SLONG sad_lower;
|
|
SLONG sad_upper;
|
|
} sad_rpt[1];
|
|
};
|
|
|
|
// Sorry for the clumsy name, but in blk.h this is referred as array description.
|
|
// Since we already have Scalar Array Descriptor and Array Description [Slice],
|
|
// it was too confusing. Therefore, it was renamed ArrayField, since ultimately,
|
|
// it represents an array field the user can manipulate.
|
|
// There was also confusion for the casual reader due to the presence of
|
|
// the structure "slice" in sdl.h that was renamed array_slice.
|
|
|
|
class ArrayField : public pool_alloc_rpt<Ods::InternalArrayDesc::iad_repeat, type_arr>
|
|
{
|
|
public:
|
|
UCHAR* arr_data; // Data block, if allocated
|
|
blb* arr_blob; // Blob for data access
|
|
jrd_tra* arr_transaction; // Parent transaction block
|
|
ArrayField* arr_next; // Next array in transaction
|
|
jrd_req* arr_request; // request
|
|
SLONG arr_effective_length; // Length of array instance
|
|
USHORT arr_desc_length; // Length of array descriptor
|
|
ULONG arr_temp_id; // Temporary ID for open array inside the transaction
|
|
|
|
// Keep this field last as it is C-style open array !
|
|
Ods::InternalArrayDesc arr_desc; // Array descriptor. !
|
|
};
|
|
|
|
// Parameter passing mechanism for UDFs.
|
|
// Also used for returning values, except for scalar_array.
|
|
|
|
enum FUN_T
|
|
{
|
|
FUN_value,
|
|
FUN_reference,
|
|
FUN_descriptor,
|
|
FUN_blob_struct,
|
|
FUN_scalar_array,
|
|
FUN_ref_with_null
|
|
};
|
|
|
|
// Blob passing structure
|
|
|
|
struct udf_blob
|
|
{
|
|
SSHORT (*blob_get_segment) (blb*, UCHAR*, USHORT, USHORT*);
|
|
void* blob_handle;
|
|
SLONG blob_number_segments;
|
|
SLONG blob_max_segment;
|
|
SLONG blob_total_length;
|
|
void (*blob_put_segment) (blb*, const UCHAR*, USHORT);
|
|
SLONG (*blob_seek) (blb*, USHORT, SLONG);
|
|
};
|
|
|
|
} //namespace Jrd
|
|
|
|
#endif // JRD_VAL_H
|