polardbxengine/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp

407 lines
10 KiB
C++

/*
Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is also distributed with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef FS_OPEN_REQ_H
#define FS_OPEN_REQ_H
#include "SignalData.hpp"
#define JAM_FILE_ID 148
/**
*
* SENDER:
* RECIVER: Ndbfs
*/
class FsOpenReq {
/**
* Reciver(s)
*/
friend class Ndbfs; // Reciver
friend class AsyncFile; // Uses FsOpenReq to decode file open flags
friend class PosixAsyncFile; // FIXME
friend class Win32AsyncFile; // FIXME
friend class Filename;
friend class VoidFs;
friend class AsyncIoThread;
/**
* Sender(s)
*/
friend class Backup;
friend class Dbdict;
friend class Ndbcntr; // For initial start...
friend class Dbdih;
friend class Lgman;
friend class Tsman;
friend class Restore;
friend class Dblqh;
friend class Dbtup;
friend class Cmvmi;
/**
* For printing
*/
friend bool printFSOPENREQ(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiverBlockNo);
public:
/**
* Length of signal
*/
STATIC_CONST( SignalLength = 11 );
SECTION( FILENAME = 0 );
private:
/**
* DATA VARIABLES
*/
UintR userReference; // DATA 0
UintR userPointer; // DATA 1
UintR fileNumber[4]; // DATA 2 - 5
UintR fileFlags; // DATA 6
Uint32 page_size;
Uint32 file_size_hi;
Uint32 file_size_lo;
Uint32 auto_sync_size; // In bytes
STATIC_CONST( OM_READONLY = 0 );
STATIC_CONST( OM_WRITEONLY = 1 );
STATIC_CONST( OM_READWRITE = 2 );
STATIC_CONST( OM_APPEND = 0x8 ); // Not Implemented on W2k
STATIC_CONST( OM_SYNC = 0x10 );
STATIC_CONST( OM_CREATE = 0x100 );
STATIC_CONST( OM_TRUNCATE = 0x200 );
STATIC_CONST( OM_AUTOSYNC = 0x400 );
STATIC_CONST( OM_CREATE_IF_NONE = 0x0800 );
STATIC_CONST( OM_INIT = 0x1000 ); //
STATIC_CONST( OM_CHECK_SIZE = 0x2000 );
STATIC_CONST( OM_DIRECT = 0x4000 );
STATIC_CONST( OM_GZ = 0x8000 );
STATIC_CONST( OM_THREAD_POOL = 0x10000 );
STATIC_CONST( OM_WRITE_BUFFER = 0x20000 );
STATIC_CONST( OM_READ_SIZE = 0x40000 );
STATIC_CONST( OM_DIRECT_SYNC = 0x80000 );
enum Suffixes {
S_DATA = 0,
S_FRAGLOG = 1,
S_LOGLOG = 2,
S_FRAGLIST = 3,
S_TABLELIST = 4,
S_SCHEMALOG = 5,
S_SYSFILE = 6,
S_LOG = 7,
S_CTL = 8
};
enum BasePathSpec
{
BP_FS = 0, // FileSystemPath
BP_BACKUP = 1, // BackupDataDir
BP_DD_DF = 2, // FileSystemPathDataFiles
BP_DD_UF = 3, // FileSystemPathUndoFiles
BP_MAX = 4
};
static Uint32 getVersion(const Uint32 fileNumber[]);
static Uint32 getSuffix(const Uint32 fileNumber[]);
static void setVersion(Uint32 fileNumber[], Uint8 val);
static void setSuffix(Uint32 fileNumber[], Uint8 val);
/**
* V1
*/
static Uint32 v1_getDisk(const Uint32 fileNumber[]);
static Uint32 v1_getTable(const Uint32 fileNumber[]);
static Uint32 v1_getFragment(const Uint32 fileNumber[]);
static Uint32 v1_getS(const Uint32 fileNumber[]);
static Uint32 v1_getP(const Uint32 fileNumber[]);
static void v1_setDisk(Uint32 fileNumber[], Uint8 val);
static void v1_setTable(Uint32 fileNumber[], Uint32 val);
static void v1_setFragment(Uint32 fileNumber[], Uint32 val);
static void v1_setS(Uint32 fileNumber[], Uint32 val);
static void v1_setP(Uint32 fileNumber[], Uint8 val);
/**
* V2 - Backup
*/
static Uint32 v2_getSequence(const Uint32 fileNumber[]);
static Uint32 v2_getNodeId(const Uint32 fileNumber[]);
static Uint32 v2_getPartNum(const Uint32 fileNumber[]);
static Uint32 v2_getCount(const Uint32 fileNumber[]);
static Uint32 v2_getTotalParts(const Uint32 fileNumber[]);
static void v2_setSequence(Uint32 fileNumber[], Uint32 no);
static void v2_setNodeId(Uint32 fileNumber[], Uint32 no);
static void v2_setPartNum(Uint32 fileNumber[], Uint32 no);
static void v2_setCount(Uint32 fileNumber[], Uint32 no);
static void v2_setTotalParts(Uint32 fileNumber[], Uint32 no);
/**
* V4 - Specified filename
*/
static Uint32 v4_getBasePath(const Uint32 fileNumber[]) {
return v5_getLcpNo(fileNumber);
}
static void v4_setBasePath(Uint32 fileNumber[], Uint32 no) {
v5_setLcpNo(fileNumber, no);
}
/**
* V5 - LCP
*/
static Uint32 v5_getLcpNo(const Uint32 fileNumber[]);
static Uint32 v5_getTableId(const Uint32 fileNumber[]);
static Uint32 v5_getFragmentId(const Uint32 fileNumber[]);
static void v5_setLcpNo(Uint32 fileNumber[], Uint32 no);
static void v5_setTableId(Uint32 fileNumber[], Uint32 no);
static void v5_setFragmentId(Uint32 fileNumber[], Uint32 no);
};
/**
* File flags (set according to solaris standard)
*
o = Open mode - 2 Bits -> max 3
c = create new file - 1 Bit
t = truncate existing - 1 Bit
1111111111222222222233
01234567890123456789012345678901
oo ct
*/
/**
* -- v1 --
* File number[0] = Table
* File number[1] = Fragment
* File number[2] = S-value
* File number[3] =
* p = v1_P 0 - 7
* d = v1_disk 8 - 15
* s = v1_suffix 16 - 23
* v = version 24 - 31
*
* 1111111111222222222233
* 01234567890123456789012345678901
* ppppppppddddddddssssssssvvvvvvvv
*
* -- v2 --
* File number[0] = Backup Sequence Number
* File number[1] = Node Id
* File number[3] =
* v = version 24 - 31
* s = v1_suffix 16 - 23
*
* 1111111111222222222233
* 01234567890123456789012345678901
* ssssssssvvvvvvvv
*
* -- v5 --
* File number[0] = Table
* File number[1] = LcpNo
* File number[2] = Fragment Id
* v = version 24 - 31
* s = v1_suffix 16 - 23
*
* 1111111111222222222233
* 01234567890123456789012345678901
* ssssssssvvvvvvvv
*/
inline
Uint32 FsOpenReq::getVersion(const Uint32 fileNumber[]){
return (fileNumber[3] >> 24) & 0xff;
}
inline
void FsOpenReq::setVersion(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
fileNumber[3] = (t & 0x00FFFFFF) | (((Uint32)val) << 24);
}
inline
Uint32 FsOpenReq::getSuffix(const Uint32 fileNumber[]){
return (fileNumber[3] >> 16)& 0xff;
}
inline
void FsOpenReq::setSuffix(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
fileNumber[3] = (t & 0xFF00FFFF) | (((Uint32)val) << 16);
}
inline
Uint32 FsOpenReq::v1_getDisk(const Uint32 fileNumber[]){
return (fileNumber[3]>>8) & 0xff;
}
inline
void FsOpenReq::v1_setDisk(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
fileNumber[3] = (t & 0xFFFF00FF) | (((Uint32)val) << 8);
}
inline
Uint32 FsOpenReq::v1_getTable(const Uint32 fileNumber[]){
return fileNumber[0];
}
inline
void FsOpenReq::v1_setTable(Uint32 fileNumber[], Uint32 val){
fileNumber[0] = val;
}
inline
Uint32 FsOpenReq::v1_getFragment(const Uint32 fileNumber[]){
return fileNumber[1];
}
inline
void FsOpenReq::v1_setFragment(Uint32 fileNumber[], Uint32 val){
fileNumber[1] = val;
}
inline
Uint32 FsOpenReq::v1_getS(const Uint32 fileNumber[]){
return fileNumber[2];
}
inline
void FsOpenReq::v1_setS(Uint32 fileNumber[], Uint32 val){
fileNumber[2] = val;
}
inline
Uint32 FsOpenReq::v1_getP(const Uint32 fileNumber[]){
return fileNumber[3] & 0xff;
}
inline
void FsOpenReq::v1_setP(Uint32 fileNumber[], Uint8 val){
const Uint32 t = fileNumber[3];
fileNumber[3] = (t & 0xFFFFFF00) | val;
}
/****************/
inline
Uint32 FsOpenReq::v2_getSequence(const Uint32 fileNumber[]){
return fileNumber[0];
}
inline
void FsOpenReq::v2_setSequence(Uint32 fileNumber[], Uint32 val){
fileNumber[0] = val;
}
inline
Uint32 FsOpenReq::v2_getNodeId(const Uint32 fileNumber[]){
return (fileNumber[1] & 0x0000FFFF);
}
inline
void FsOpenReq::v2_setNodeId(Uint32 fileNumber[], Uint32 val){
const Uint32 t = fileNumber[1];
fileNumber[1] = (t & 0xFFFF0000) | (((Uint32)val) & 0x0000FFFF);
}
inline
Uint32 FsOpenReq::v2_getPartNum(const Uint32 fileNumber[]){
return ((fileNumber[1] >> 16) & 0x0000FFFF);
}
inline
void FsOpenReq::v2_setPartNum(Uint32 fileNumber[], Uint32 val){
Uint32 t = fileNumber[1] ;
fileNumber[1] = (t & 0x0000FFFF) | ((val << 16) & 0xFFFF0000);
}
inline
Uint32 FsOpenReq::v2_getCount(const Uint32 fileNumber[]){
return (fileNumber[2] & 0x0000FFFF);
}
inline
void FsOpenReq::v2_setCount(Uint32 fileNumber[], Uint32 val){
const Uint32 t = fileNumber[2];
fileNumber[2] = (t & 0xFFFF0000) | (((Uint32)val) & 0x0000FFFF);
}
inline
Uint32 FsOpenReq::v2_getTotalParts(const Uint32 fileNumber[]){
return ((fileNumber[2] >> 16) & 0x0000FFFF);
}
inline
void FsOpenReq::v2_setTotalParts(Uint32 fileNumber[], Uint32 val){
Uint32 t = fileNumber[2] ;
fileNumber[2] = (t & 0x0000FFFF) | ((val << 16) & 0xFFFF0000);
}
/****************/
inline
Uint32 FsOpenReq::v5_getTableId(const Uint32 fileNumber[]){
return fileNumber[0];
}
inline
void FsOpenReq::v5_setTableId(Uint32 fileNumber[], Uint32 val){
fileNumber[0] = val;
}
inline
Uint32 FsOpenReq::v5_getLcpNo(const Uint32 fileNumber[]){
return fileNumber[1];
}
inline
void FsOpenReq::v5_setLcpNo(Uint32 fileNumber[], Uint32 val){
fileNumber[1] = val;
}
inline
Uint32 FsOpenReq::v5_getFragmentId(const Uint32 fileNumber[]){
return fileNumber[2];
}
inline
void FsOpenReq::v5_setFragmentId(Uint32 fileNumber[], Uint32 val){
fileNumber[2] = val;
}
#undef JAM_FILE_ID
#endif