mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-31 23:23:04 +01:00
236 lines
5.8 KiB
C++
236 lines
5.8 KiB
C++
/*
|
|
* PROGRAM: JRD Access Method
|
|
* MODULE: DbImplementation.cpp
|
|
* DESCRIPTION: Database implementation
|
|
*
|
|
* The contents of this file are subject to the Initial
|
|
* Developer's 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.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
|
*
|
|
* Software distributed under the License is distributed AS IS,
|
|
* 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 Alexander Peshkoff
|
|
* for the Firebird Open Source RDBMS project.
|
|
*
|
|
* Copyright (c) 2009 Alexander Peshkoff <peshkoff@mail.ru>
|
|
* and all contributors signed below.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
*/
|
|
|
|
#include "firebird.h"
|
|
#include "../common/classes/DbImplementation.h"
|
|
|
|
#include "../jrd/ods.h"
|
|
|
|
namespace {
|
|
|
|
static const UCHAR CpuIntel = 0;
|
|
static const UCHAR CpuAmd = 1;
|
|
static const UCHAR CpuUltraSparc = 2;
|
|
static const UCHAR CpuPowerPc = 3;
|
|
static const UCHAR CpuPowerPc64 = 4;
|
|
static const UCHAR CpuMipsel = 5;
|
|
static const UCHAR CpuMips = 6;
|
|
static const UCHAR CpuArm = 7;
|
|
static const UCHAR CpuIa64 = 8;
|
|
static const UCHAR CpuS390 = 9;
|
|
static const UCHAR CpuS390x = 10;
|
|
static const UCHAR CpuSh = 11;
|
|
static const UCHAR CpuSheb = 12;
|
|
static const UCHAR CpuHppa = 13;
|
|
static const UCHAR CpuAlpha = 14;
|
|
|
|
static const UCHAR OsWindows = 0;
|
|
static const UCHAR OsLinux = 1;
|
|
static const UCHAR OsDarwin = 2;
|
|
static const UCHAR OsSolaris = 3;
|
|
static const UCHAR OsHpux = 4;
|
|
static const UCHAR OsAix = 5;
|
|
static const UCHAR OsMms = 6;
|
|
static const UCHAR OsFreeBsd = 7;
|
|
static const UCHAR OsNetBsd = 8;
|
|
|
|
static const UCHAR CcMsvc = 0;
|
|
static const UCHAR CcGcc = 1;
|
|
static const UCHAR CcXlc = 2;
|
|
static const UCHAR CcAcc = 3;
|
|
static const UCHAR CcSunStudio = 4;
|
|
static const UCHAR CcIcc = 5;
|
|
|
|
static const UCHAR EndianLittle = 0;
|
|
static const UCHAR EndianBig = 1;
|
|
static const UCHAR EndianMask = 1;
|
|
|
|
const char* hardware[] = {
|
|
"Intel/i386",
|
|
"AMD/Intel/x64",
|
|
"UltraSparc",
|
|
"PowerPC",
|
|
"PowerPC64",
|
|
"MIPSEL",
|
|
"MIPS",
|
|
"ARM",
|
|
"IA64",
|
|
"s390",
|
|
"s390x",
|
|
"SH",
|
|
"SHEB",
|
|
"HPPA",
|
|
"Alpha"
|
|
};
|
|
|
|
const char* operatingSystem[] = {
|
|
"Windows",
|
|
"Linux",
|
|
"Darwin",
|
|
"Solaris",
|
|
"HPUX",
|
|
"AIX",
|
|
"MVS",
|
|
"FreeBSD",
|
|
"NetBSD"
|
|
};
|
|
|
|
const char* compiler[] = {
|
|
"MSVC",
|
|
"gcc",
|
|
"xlC",
|
|
"aCC",
|
|
"SunStudio",
|
|
"icc"
|
|
};
|
|
|
|
// This table lists pre-fb3 imlementation codes
|
|
const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =
|
|
{
|
|
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha
|
|
/* Windows */ 50, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* Linux */ 60, 66, 65, 69, 0, 71, 72, 75, 76, 79, 78, 80, 81, 82, 83,
|
|
/* Darwin */ 70, 73, 0, 63, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* Solaris */ 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* HPUX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0,
|
|
/* AIX */ 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* MVS */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* FreeBSD */ 61, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
/* NetBSD */ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
};
|
|
|
|
const UCHAR backEndianess[FB_NELEM(hardware)] =
|
|
{
|
|
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha
|
|
0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0
|
|
};
|
|
|
|
} // anonymous namespace
|
|
|
|
namespace Firebird {
|
|
|
|
DbImplementation::DbImplementation(const Ods::header_page* h)
|
|
: di_cpu(h->hdr_cpu), di_os(h->hdr_os), di_cc(h->hdr_cc), di_flags(h->hdr_compatibility_flags)
|
|
{
|
|
}
|
|
|
|
#define GET_ARRAY_ELEMENT(array, elem) ((elem) < FB_NELEM(array) ? array[(elem)] : "** Unknown **")
|
|
|
|
const char* DbImplementation::cpu() const
|
|
{
|
|
return GET_ARRAY_ELEMENT(hardware, di_cpu);
|
|
}
|
|
|
|
const char* DbImplementation::os() const
|
|
{
|
|
return GET_ARRAY_ELEMENT(operatingSystem, di_os);
|
|
}
|
|
|
|
const char* DbImplementation::cc() const
|
|
{
|
|
return GET_ARRAY_ELEMENT(compiler, di_cc);
|
|
}
|
|
|
|
string DbImplementation::implementation() const
|
|
{
|
|
string rc("Firebird/");
|
|
rc += os();
|
|
rc += "/";
|
|
rc += cpu();
|
|
return rc;
|
|
}
|
|
|
|
const char* DbImplementation::endianess() const
|
|
{
|
|
return (di_flags & EndianMask) == EndianBig ? "big" : "little";
|
|
}
|
|
|
|
const DbImplementation DbImplementation::current(
|
|
FB_CPU, FB_OS, FB_CC,
|
|
#ifdef WORDS_BIGENDIAN
|
|
EndianBig);
|
|
#else
|
|
EndianLittle);
|
|
#endif
|
|
|
|
bool DbImplementation::compatible(const DbImplementation& v) const
|
|
{
|
|
return di_flags == v.di_flags;
|
|
}
|
|
|
|
void DbImplementation::store(Ods::header_page* h) const
|
|
{
|
|
h->hdr_cpu = di_cpu;
|
|
h->hdr_os = di_os;
|
|
h->hdr_cc = di_cc;
|
|
h->hdr_compatibility_flags = di_flags;
|
|
}
|
|
|
|
void DbImplementation::stuff(UCHAR** info) const
|
|
{
|
|
UCHAR* p = *info;
|
|
*p++ = di_cpu;
|
|
*p++ = di_os;
|
|
*p++ = di_cc;
|
|
*p++ = di_flags;
|
|
*info = p;
|
|
}
|
|
|
|
DbImplementation DbImplementation::pick(const UCHAR* info)
|
|
{
|
|
//DbImplementation(UCHAR p_cpu, UCHAR p_os, UCHAR p_cc, UCHAR p_flags)
|
|
return DbImplementation(info[0], info[1], info[2], info[3]);
|
|
}
|
|
|
|
DbImplementation DbImplementation::fromBackwardCompatibleByte(UCHAR bcImpl)
|
|
{
|
|
for (UCHAR os = 0; os < FB_NELEM(operatingSystem); ++os)
|
|
{
|
|
for (UCHAR hw = 0; hw < FB_NELEM(hardware); ++hw)
|
|
{
|
|
USHORT ind = USHORT(os) * FB_NELEM(hardware) + USHORT(hw);
|
|
if (backwardTable[ind] == bcImpl)
|
|
{
|
|
return DbImplementation(hw, os, 0xFF, backEndianess[hw] ? EndianBig : EndianLittle);
|
|
}
|
|
}
|
|
}
|
|
|
|
return DbImplementation(0xFF, 0xFF, 0xFF, 0x80);
|
|
}
|
|
|
|
UCHAR DbImplementation::backwardCompatibleImplementation() const
|
|
{
|
|
if (di_cpu >= FB_NELEM(hardware) || di_os >= FB_NELEM(operatingSystem))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return backwardTable[USHORT(di_os) * FB_NELEM(hardware) + USHORT(di_cpu)];
|
|
}
|
|
|
|
} // namespace Firebird
|