8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 20:43:02 +01:00
This commit is contained in:
asfernandes 2009-01-03 19:02:04 +00:00
parent 291845fab1
commit 79e89d573d
21 changed files with 64 additions and 69 deletions

View File

@ -8,16 +8,19 @@ Architecture
------------ ------------
Firebird allow you to specify character sets and collations in every field/variable declaration. Firebird allow you to specify character sets and collations in every field/variable declaration.
You can also specify the default character set at database create time and every CHAR/VARCHAR declaration that omit character set will use it. You can also specify the default character set at database create time and every CHAR/VARCHAR
declaration that omit character set will use it.
At attachment time you can specify the character set that the client want to read all the strings. At attachment time you can specify the character set that the client want to read all the strings.
If you don't specify one, NONE is assumed. If you don't specify one, NONE is assumed.
There are two specials character sets: NONE and OCTETS. There are two specials character sets: NONE and OCTETS.
Both can be used in declarations but OCTETS can't be used in attachment. Both can be used in declarations but OCTETS can't be used in attachment.
They are very similar with the exception that space of NONE is ASCII 0x20 and space of OCTETS is 0x00. They are very similar with the exception that space of NONE is ASCII 0x20 and space of OCTETS
is 0x00.
They are specials because they don't follow the rule of others character sets regarding conversions. They are specials because they don't follow the rule of others character sets regarding conversions.
With others character sets conversion is performed with CHARSET1->UNICODE->CHARSET2. With NONE/OCTETS the bytes is just copied: NONE/OCTETS->CHARSET2 and CHARSET1->NONE/OCTETS. With others character sets conversion is performed with CHARSET1->UNICODE->CHARSET2. With
NONE/OCTETS the bytes is just copied: NONE/OCTETS->CHARSET2 and CHARSET1->NONE/OCTETS.
Enhancements Enhancements
@ -28,13 +31,15 @@ Enhancements
---------------------- ----------------------
Some character sets (specially multi-byte) don't accept everything. Some character sets (specially multi-byte) don't accept everything.
Now, the engine verifies if strings are wellformed when assigning from NONE/OCTETS and strings sent by the client (the statement string and parameters). Now, the engine verifies if strings are wellformed when assigning from NONE/OCTETS and strings
sent by the client (the statement string and parameters).
Uppercase Uppercase
--------- ---------
In FB 1.5.X only ASCII characters are uppercased in character sets default collation order (without collation specified). Ex: In FB 1.5.X only ASCII characters are uppercased in character sets default collation order
(without collation specified). Ex:
isql -q -ch dos850 isql -q -ch dos850
SQL> create database 'test.fdb'; SQL> create database 'test.fdb';
@ -91,7 +96,9 @@ New character sets and collations
UTF8 character set UTF8 character set
------------------ ------------------
The UNICODE_FSS character set has a number of problems: it's an old version of UTF8, accepts malformed strings and doesn't enforce correct maximum string length. In FB 1.5.X UTF8 it's an alias to UNICODE_FSS. The UNICODE_FSS character set has a number of problems: it's an old version of UTF8, accepts
malformed strings and doesn't enforce correct maximum string length. In FB 1.5.X UTF8 it's an
alias to UNICODE_FSS.
Now UTF8 is a new character set, without these problems of UNICODE_FSS. Now UTF8 is a new character set, without these problems of UNICODE_FSS.
@ -134,7 +141,8 @@ New character sets and collations
Brazilian collations Brazilian collations
-------------------- --------------------
Two case-insensitive/accent-insensitive collations was created for Brazil: PT_BR/WIN_PTBR (for WIN1252) and PT_BR (for ISO8859_1). Two case-insensitive/accent-insensitive collations was created for Brazil: PT_BR/WIN_PTBR
(for WIN1252) and PT_BR (for ISO8859_1).
Sort order and equality sample: Sort order and equality sample:
isql -q -ch dos850 isql -q -ch dos850
@ -202,9 +210,10 @@ ICU character sets
------------------ ------------------
All non-wide and ascii-based character sets present in ICU can be used by Firebird. All non-wide and ascii-based character sets present in ICU can be used by Firebird.
But for small distribution kit, we customize ICU to include only essentials character sets or the ones we had feature request. But for small distribution kit, we customize ICU to include only essentials character sets or the
If the character set you need is not included in it, you can replace ICU libraries by a complete one found in our site or ones we had feature request.
installed in your OS. If the character set you need is not included in it, you can replace ICU libraries by a complete
one found in our site or installed in your OS.
To use, you first need to register it in intl/fbintl.conf as follow: To use, you first need to register it in intl/fbintl.conf as follow:
<charset NAME> <charset NAME>
@ -227,8 +236,10 @@ Example:
UNICODE collation UNICODE collation
----------------- -----------------
You can use unicode collation (case sensitive and case insensitive) in all character sets present in fbintl. You can use unicode collation (case sensitive and case insensitive) in all character sets present
They're already registerd in fbintl.conf, but you need to register in the databases you want with the attributes you desire. in fbintl.
They're already registerd in fbintl.conf, but you need to register in the databases you want with
the attributes you desire.
They should use this name convention: charset_collation. Ex: They should use this name convention: charset_collation. Ex:
create collation win1252_unicode create collation win1252_unicode
for win1252; for win1252;
@ -255,7 +266,8 @@ Valid for: collations of narrow character sets.
Format: DISABLE-EXPANSIONS={0 | 1} Format: DISABLE-EXPANSIONS={0 | 1}
Example: DISABLE-EXPANSIONS=1 Example: DISABLE-EXPANSIONS=1
ICU-VERSION: Specify what version of ICU library will be used. Valid values are the ones defined in the config file (intl/fbintl.conf) in entry intl_module/icu_versions. ICU-VERSION: Specify what version of ICU library will be used. Valid values are the ones defined in
the config file (intl/fbintl.conf) in entry intl_module/icu_versions.
Valid for: UNICODE and UNICODE_CI. Valid for: UNICODE and UNICODE_CI.
Format: ICU-VERSION={default | major.minor} Format: ICU-VERSION={default | major.minor}
Example: ICU-VERSION=3.0 Example: ICU-VERSION=3.0

View File

@ -92,8 +92,7 @@ int EXE_action(const TEXT* database, const ULONG switches)
if (tdgbl->status[1] && if (tdgbl->status[1] &&
// Ignore isc_shutdown error produced when we switch to full shutdown mode. It is expected. // Ignore isc_shutdown error produced when we switch to full shutdown mode. It is expected.
(tdgbl->status[1] != isc_shutdown || !(switches & sw_shut) || (tdgbl->status[1] != isc_shutdown || !(switches & sw_shut) ||
tdgbl->ALICE_data.ua_shutdown_mode != SHUT_FULL) tdgbl->ALICE_data.ua_shutdown_mode != SHUT_FULL))
)
{ {
error = true; error = true;
} }

View File

@ -1513,12 +1513,14 @@ static void close_out_transaction(gbak_action action, isc_tr_handle* handle)
} }
} }
else else
{
/* A backup shouldn't touch any data - we ensure that /* A backup shouldn't touch any data - we ensure that
* by never writing data during a backup, but let's double * by never writing data during a backup, but let's double
* ensure it by doing a rollback * ensure it by doing a rollback
*/ */
if (isc_rollback_transaction(status_vector, handle)) if (isc_rollback_transaction(status_vector, handle))
BURP_print_status(status_vector); BURP_print_status(status_vector);
}
} }
} }
@ -2090,4 +2092,3 @@ static ULONG get_size(const SCHAR* string, burp_fil* file)
file->fil_length = size; file->fil_length = size;
return size; return size;
} }

View File

@ -554,7 +554,6 @@ UCHAR MVOL_write(const UCHAR c, int* io_cnt, UCHAR** io_ptr)
#ifndef WIN_NT #ifndef WIN_NT
cnt = write(tdgbl->file_desc, ptr, nBytesToWrite); cnt = write(tdgbl->file_desc, ptr, nBytesToWrite);
#else #else
DWORD ret = 0; DWORD ret = 0;
if (!WriteFile(tdgbl->file_desc, ptr, (DWORD) nBytesToWrite, &cnt, NULL)) if (!WriteFile(tdgbl->file_desc, ptr, (DWORD) nBytesToWrite, &cnt, NULL))
{ {
@ -1282,12 +1281,12 @@ static bool write_header(DESC handle,
{ {
#ifdef WIN_NT #ifdef WIN_NT
DWORD bytes_written = 0; DWORD bytes_written = 0;
const bool err = WriteFile(handle, tdgbl->mvol_io_header, const BOOL err = !WriteFile(handle, tdgbl->mvol_io_header,
tdgbl->mvol_io_buffer_size, &bytes_written, NULL) == 0; tdgbl->mvol_io_buffer_size, &bytes_written, NULL);
#else #else
ULONG bytes_written = write(handle, tdgbl->mvol_io_header, ULONG bytes_written = write(handle, tdgbl->mvol_io_header,
tdgbl->mvol_io_buffer_size); tdgbl->mvol_io_buffer_size);
const bool err = false; const BOOL err = FALSE;
#endif // WIN_NT #endif // WIN_NT
if (err || bytes_written != tdgbl->mvol_io_buffer_size) if (err || bytes_written != tdgbl->mvol_io_buffer_size)

View File

@ -363,13 +363,12 @@ void system_call_failed::raise(const char* syscall)
fatal_exception::fatal_exception(const char* message) : fatal_exception::fatal_exception(const char* message) :
status_exception(0, false) status_exception(0, false)
{ {
const ISC_STATUS temp[] = const ISC_STATUS temp[] = {
{ isc_arg_gds,
isc_arg_gds, isc_random,
isc_random, isc_arg_string, dupStringTemp(message),
isc_arg_string, dupStringTemp(message), isc_arg_end
isc_arg_end };
};
set_status(temp, false); set_status(temp, false);
} }

View File

@ -6904,7 +6904,6 @@ void CompiledStatement::append_meta_string(const char* string)
{ {
thread_db* tdbb = JRD_get_thread_data(); thread_db* tdbb = JRD_get_thread_data();
//ISC_STATUS_ARRAY status_vector = {0};
UCharBuffer nameBuffer; UCharBuffer nameBuffer;
CsConvert cv(INTL_charset_lookup(tdbb, CS_dynamic)->getStruct(), CsConvert cv(INTL_charset_lookup(tdbb, CS_dynamic)->getStruct(),

View File

@ -1428,10 +1428,10 @@ static bool file_rename(TEXT* file_nameL, const TEXT* extension, const TEXT* new
// back up to the last extension (if any) // back up to the last extension (if any)
#ifdef WIN_NT #ifdef WIN_NT
while ((p != file_nameL) && (*p != '.') && (*p != '/') && (*p != '\\')) while (p != file_nameL && *p != '.' && *p != '/' && *p != '\\')
--p; --p;
#else #else
while ((p != file_nameL) && (*p != '.') && (*p != '/')) while (p != file_nameL && *p != '.' && *p != '/')
--p; --p;
#endif #endif
@ -2892,4 +2892,3 @@ static SSHORT skip_white()
return c; return c;
} }

View File

@ -2202,8 +2202,6 @@ static dsc* evlOverlay(Jrd::thread_db* tdbb, const SysFunction* function, Jrd::j
length = len2 / cs->maxBytesPerChar(); length = len2 / cs->maxBytesPerChar();
} }
// Not sure "length" is set in all paths, Adriano please review. Set it to zero by default
// several lines above when it was defined.
length = MIN(length, len1 - from + 1); length = MIN(length, len1 - from + 1);
blb* newBlob = NULL; blb* newBlob = NULL;

View File

@ -564,10 +564,7 @@ bool TempSpace::validate(offset_t& free) const
for (const Segment* space = freeSegments; space; space = space->next) for (const Segment* space = freeSegments; space; space = space->next)
{ {
free += space->size; free += space->size;
#ifdef DEV_BUILD fb_assert(!(space->next) || (space->next->position > space->position));
bool ok = !(space->next) || (space->next->position > space->position);
fb_assert(ok);
#endif
} }
offset_t disk = 0; offset_t disk = 0;

View File

@ -2794,7 +2794,7 @@ static USHORT compress_root(thread_db* tdbb, index_root_page* page)
UCHAR* p = (UCHAR*) page + dbb->dbb_page_size; UCHAR* p = (UCHAR*) page + dbb->dbb_page_size;
index_root_page::irt_repeat* root_idx = page->irt_rpt; index_root_page::irt_repeat* root_idx = page->irt_rpt;
for (const index_root_page::irt_repeat* const end = root_idx + page->irt_count; for (const index_root_page::irt_repeat* const end = root_idx + page->irt_count;
root_idx < end; root_idx++) root_idx < end; root_idx++)
{ {
if (root_idx->irt_root) { if (root_idx->irt_root) {

View File

@ -378,9 +378,6 @@ GDS_TIMESTAMP CVT_get_timestamp(const dsc* desc)
static bool transliterate(const dsc* from, dsc* to, CHARSET_ID& charset2, ErrorFunction err) static bool transliterate(const dsc* from, dsc* to, CHARSET_ID& charset2, ErrorFunction err)
{ {
//UCHAR* p = to->dsc_address;
//const UCHAR* q = from->dsc_address;
CHARSET_ID charset1; CHARSET_ID charset1;
if (INTL_TTYPE(from) == ttype_dynamic) if (INTL_TTYPE(from) == ttype_dynamic)
charset1 = INTL_charset(NULL, INTL_TTYPE(from)); charset1 = INTL_charset(NULL, INTL_TTYPE(from));

View File

@ -78,11 +78,11 @@ typedef struct dsc
{ {
dsc() dsc()
: dsc_dtype(0), : dsc_dtype(0),
dsc_scale(0), dsc_scale(0),
dsc_length(0), dsc_length(0),
dsc_sub_type(0), dsc_sub_type(0),
dsc_flags(0), dsc_flags(0),
dsc_address(0) dsc_address(0)
{} {}
UCHAR dsc_dtype; UCHAR dsc_dtype;
@ -292,11 +292,11 @@ typedef struct dsc
// between Ods::Descriptor and struct dsc // between Ods::Descriptor and struct dsc
dsc(const Ods::Descriptor& od) dsc(const Ods::Descriptor& od)
: dsc_dtype(od.dsc_dtype), : dsc_dtype(od.dsc_dtype),
dsc_scale(od.dsc_scale), dsc_scale(od.dsc_scale),
dsc_length(od.dsc_length), dsc_length(od.dsc_length),
dsc_sub_type(od.dsc_sub_type), dsc_sub_type(od.dsc_sub_type),
dsc_flags(od.dsc_flags), dsc_flags(od.dsc_flags),
dsc_address((UCHAR*)(IPTR)(od.dsc_offset)) dsc_address((UCHAR*)(IPTR)(od.dsc_offset))
{} {}
operator Ods::Descriptor() const operator Ods::Descriptor() const

View File

@ -47,11 +47,11 @@ struct dsc
dsc() dsc()
: dsc_dtype(0), : dsc_dtype(0),
dsc_scale(0), dsc_scale(0),
dsc_length(0), dsc_length(0),
dsc_sub_type(0), dsc_sub_type(0),
dsc_flags(0), dsc_flags(0),
dsc_address(0) dsc_address(0)
{} {}
explicit dsc(const dtype_t dtype) : explicit dsc(const dtype_t dtype) :

View File

@ -343,7 +343,6 @@ static ULONG internal_fss_substring(charset* obj, ULONG srcLen, const UCHAR* src
if (length == 0) if (length == 0)
return 0; return 0;
//const UCHAR* srcStart = src;
const UCHAR* dstStart = dst; const UCHAR* dstStart = dst;
const UCHAR* const srcEnd = src + srcLen; const UCHAR* const srcEnd = src + srcLen;
const UCHAR* const dstEnd = dst + dstLen; const UCHAR* const dstEnd = dst + dstLen;

View File

@ -105,7 +105,6 @@ void ConfigRoot::osConfigRoot()
// go to the parent directory // go to the parent directory
const size_t index = install_dir().rfind(PathUtils::dir_sep, install_dir().length()); const size_t index = install_dir().rfind(PathUtils::dir_sep, install_dir().length());
root_dir = (index ? install_dir().substr(0, index) : install_dir()) + PathUtils::dir_sep; root_dir = (index ? install_dir().substr(0, index) : install_dir()) + PathUtils::dir_sep;
#endif #endif
return; return;
} }

View File

@ -1382,7 +1382,7 @@ void PAG_header_init(thread_db* tdbb)
const ArchitectureType* matrix = ods_version < ODS_VERSION11 ? archMatrix10 : archMatrix; const ArchitectureType* matrix = ods_version < ODS_VERSION11 ? archMatrix10 : archMatrix;
const int hdrImpl = header->hdr_implementation; const int hdrImpl = header->hdr_implementation;
if (hdrImpl < 0 || hdrImpl > classmax || if (hdrImpl < 0 || hdrImpl > classmax ||
matrix[hdrImpl] == archUnknown || matrix[hdrImpl] != matrix[CLASS]) matrix[hdrImpl] == archUnknown || matrix[hdrImpl] != matrix[CLASS])
{ {
ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_filename)); ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_filename));
} }

View File

@ -58,7 +58,7 @@ private:
public: public:
ICU() ICU()
: inModule(NULL), ucModule(NULL) : inModule(NULL), ucModule(NULL)
{ {
} }
@ -356,7 +356,6 @@ ULONG UnicodeUtil::utf16ToUtf8(ULONG srcLen, const USHORT* src, ULONG dstLen, UC
srcLen /= sizeof(*src); srcLen /= sizeof(*src);
//const USHORT* const srcEnd = src + srcLen;
const UCHAR* const dstStart = dst; const UCHAR* const dstStart = dst;
const UCHAR* const dstEnd = dst + dstLen; const UCHAR* const dstEnd = dst + dstLen;
@ -423,7 +422,6 @@ ULONG UnicodeUtil::utf8ToUtf16(ULONG srcLen, const UCHAR* src, ULONG dstLen, USH
if (dst == NULL) if (dst == NULL)
return srcLen * sizeof(*dst); return srcLen * sizeof(*dst);
//const UCHAR* const srcEnd = src + srcLen;
const USHORT* const dstStart = dst; const USHORT* const dstStart = dst;
const USHORT* const dstEnd = dst + dstLen / sizeof(*dst); const USHORT* const dstEnd = dst + dstLen / sizeof(*dst);
@ -615,7 +613,6 @@ ULONG UnicodeUtil::utf16Substring(ULONG srcLen, const USHORT* src, ULONG dstLen,
if (length == 0) if (length == 0)
return 0; return 0;
//const USHORT* const srcStart = src;
const USHORT* const dstStart = dst; const USHORT* const dstStart = dst;
const USHORT* const srcEnd = src + srcLen / sizeof(*src); const USHORT* const srcEnd = src + srcLen / sizeof(*src);
const USHORT* const dstEnd = dst + dstLen / sizeof(*dst); const USHORT* const dstEnd = dst + dstLen / sizeof(*dst);

View File

@ -3327,7 +3327,7 @@ ISC_STATUS API_ROUTINE GDS_DSQL_PREPARE(ISC_STATUS* user_status,
sqlda_sup& dasup = statement->das; sqlda_sup& dasup = statement->das;
const USHORT buffer_len = sqlda_buffer_size(PREPARE_BUFFER_SIZE, sqlda, dialect); const USHORT buffer_len = sqlda_buffer_size(PREPARE_BUFFER_SIZE, sqlda, dialect);
//Attachment* attachment = statement->parent; //Attachment* attachment = statement->parent;
Array<SCHAR> db_prepare_buffer; Array<SCHAR> db_prepare_buffer;
SCHAR* const buffer = db_prepare_buffer.getBuffer(buffer_len); SCHAR* const buffer = db_prepare_buffer.getBuffer(buffer_len);

View File

@ -565,6 +565,7 @@ static bool connect_init(ISC_STATUS* status)
} }
#endif #endif
static void connect_fini() static void connect_fini()
{ {
/************************************** /**************************************
@ -1080,7 +1081,6 @@ static rem_port* connect_client(PACKET* packet, ISC_STATUS* status_vector)
#ifndef SUPERCLIENT #ifndef SUPERCLIENT
return NULL; return NULL;
#else #else
if (!xnet_initialized) if (!xnet_initialized)
{ {
Firebird::MutexLockGuard guard(xnet_mutex); Firebird::MutexLockGuard guard(xnet_mutex);

View File

@ -77,8 +77,8 @@ int CLIB_ROUTINE main( int argc, char **argv)
const TEXT* instance = FB_DEFAULT_INSTANCE; const TEXT* instance = FB_DEFAULT_INSTANCE;
const TEXT* username = 0; const TEXT* username = NULL;
const TEXT* password = 0; const TEXT* password = NULL;
// Let's get the root directory from the instance path of this program. // Let's get the root directory from the instance path of this program.
// argv[0] is only _mostly_ guaranteed to give this info, // argv[0] is only _mostly_ guaranteed to give this info,
@ -214,7 +214,7 @@ int CLIB_ROUTINE main( int argc, char **argv)
if (sw_version) if (sw_version)
printf("instsvc version %s\n", GDS_VERSION); printf("instsvc version %s\n", GDS_VERSION);
if (sw_command == COMMAND_NONE || (username != 0 && sw_command != COMMAND_INSTALL)) if (sw_command == COMMAND_NONE || (username && sw_command != COMMAND_INSTALL))
{ {
usage_exit(); usage_exit();
} }

View File

@ -82,7 +82,7 @@ static int* database_handle;
static int* request_handle; static int* request_handle;
void stats_analyze(const fb_stats* before, const fb_stats* after, print_callback callback, SCHAR *arg) void stats_analyze(const fb_stats* before, const fb_stats* after, print_callback callback, SCHAR* arg)
{ {
/************************************** /**************************************
* *