Filename.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <NdbOut.hpp>
  15. #include "Filename.hpp"
  16. #include "ErrorHandlingMacros.hpp"
  17. #include "Error.hpp"
  18. #include "RefConvert.hpp"
  19. #include "DebuggerNames.hpp"
  20. #include <signaldata/FsOpenReq.hpp>
  21. static const char* fileExtension[] = {
  22.   ".Data",
  23.   ".FragLog",
  24.   ".LocLog",
  25.   ".FragList",
  26.   ".TableList",
  27.   ".SchemaLog",
  28.   ".sysfile",
  29.   ".log",
  30.   ".ctl"
  31. };
  32. static const Uint32 noOfExtensions = sizeof(fileExtension)/sizeof(char*);
  33. Filename::Filename() :
  34.   theLevelDepth(0)
  35. {
  36. }
  37. void
  38. Filename::init(Uint32 nodeid,
  39.        const char * pFileSystemPath,
  40.        const char * pBackupDirPath){
  41.   DBUG_ENTER("Filename::init");
  42.   if (pFileSystemPath == NULL) {
  43.     ERROR_SET(fatal, AFS_ERROR_NOPATH, ""," Filename::init()");
  44.     return;
  45.   }
  46.   BaseString::snprintf(theFileSystemDirectory, sizeof(theFileSystemDirectory),
  47.    "%sndb_%u_fs%s", pFileSystemPath, nodeid, DIR_SEPARATOR);
  48.   strncpy(theBackupDirectory, pBackupDirPath, sizeof(theBackupDirectory));
  49.   DBUG_PRINT("info", ("theFileSystemDirectory=%s", theFileSystemDirectory));
  50.   DBUG_PRINT("info", ("theBackupDirectory=%s", theBackupDirectory));
  51. #ifdef NDB_WIN32
  52.   CreateDirectory(theFileSystemDirectory, 0);
  53. #else
  54.   mkdir(theFileSystemDirectory, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP);
  55. #endif
  56.   theBaseDirectory= 0;
  57.   DBUG_VOID_RETURN;
  58. }
  59. Filename::~Filename(){
  60. }
  61. void 
  62. Filename::set(BlockReference blockReference, 
  63.       const Uint32 filenumber[4], bool dir) 
  64. {
  65.   char buf[PATH_MAX];
  66.   theLevelDepth = 0;
  67.   const Uint32 type = FsOpenReq::getSuffix(filenumber);
  68.   const Uint32 version = FsOpenReq::getVersion(filenumber);
  69.   if (version == 2)
  70.     theBaseDirectory= theBackupDirectory;
  71.   else
  72.     theBaseDirectory= theFileSystemDirectory;
  73.   strncpy(theName, theBaseDirectory, PATH_MAX);
  74.       
  75.   switch(version){
  76.   case 1 :{
  77.     const Uint32 diskNo = FsOpenReq::v1_getDisk(filenumber);
  78.     const Uint32 table  = FsOpenReq::v1_getTable(filenumber);
  79.     const Uint32 frag   = FsOpenReq::v1_getFragment(filenumber);
  80.     const Uint32 S_val  = FsOpenReq::v1_getS(filenumber);
  81.     const Uint32 P_val  = FsOpenReq::v1_getP(filenumber);
  82.     if (diskNo < 0xff){   
  83.       BaseString::snprintf(buf, sizeof(buf), "D%d%s", diskNo, DIR_SEPARATOR);
  84.       strcat(theName, buf);
  85.       theLevelDepth++;
  86.     }
  87.     
  88.     {
  89.       const char* blockName = getBlockName( refToBlock(blockReference) );
  90.       if (blockName == NULL){
  91. ERROR_SET(ecError, AFS_ERROR_PARAMETER,"","No Block Name");
  92. return;
  93.       }
  94.       BaseString::snprintf(buf, sizeof(buf), "%s%s", blockName, DIR_SEPARATOR);
  95.       strcat(theName, buf);
  96.       theLevelDepth++;
  97.     }
  98.     
  99.     if (table < 0xffffffff){
  100.       BaseString::snprintf(buf, sizeof(buf), "T%d%s", table, DIR_SEPARATOR);
  101.       strcat(theName, buf);
  102.       theLevelDepth++;
  103.     }
  104.     
  105.     if (frag < 0xffffffff){
  106.       BaseString::snprintf(buf, sizeof(buf), "F%d%s", frag, DIR_SEPARATOR);
  107.       strcat(theName, buf);
  108.       theLevelDepth++;
  109.     }
  110.     
  111.     
  112.     if (S_val < 0xffffffff){
  113.       BaseString::snprintf(buf, sizeof(buf), "S%d", S_val);
  114.       strcat(theName, buf);
  115.     }
  116.     if (P_val < 0xff){
  117.       BaseString::snprintf(buf, sizeof(buf), "P%d", P_val);
  118.       strcat(theName, buf);
  119.     }
  120.     
  121.   }
  122.   break;
  123.   case 2:{
  124.     const Uint32 seq = FsOpenReq::v2_getSequence(filenumber);
  125.     const Uint32 nodeId = FsOpenReq::v2_getNodeId(filenumber);
  126.     const Uint32 count = FsOpenReq::v2_getCount(filenumber);
  127.     
  128.     BaseString::snprintf(buf, sizeof(buf), "BACKUP%sBACKUP-%d%s",
  129.      DIR_SEPARATOR, seq, DIR_SEPARATOR); 
  130.     strcat(theName, buf);
  131.     if(count == 0xffffffff) {
  132.       BaseString::snprintf(buf, sizeof(buf), "BACKUP-%d.%d",
  133.        seq, nodeId); strcat(theName, buf);
  134.     } else {
  135.       BaseString::snprintf(buf, sizeof(buf), "BACKUP-%d-%d.%d",
  136.        seq, count, nodeId); strcat(theName, buf);
  137.     }
  138.     theLevelDepth = 2;
  139.     break;
  140.   }
  141.   break;
  142.   case 3:{
  143.     const Uint32 diskNo = FsOpenReq::v1_getDisk(filenumber);
  144.     if(diskNo == 0xFF){
  145.       ERROR_SET(ecError, AFS_ERROR_PARAMETER,"","Invalid disk specification");
  146.     }
  147.     BaseString::snprintf(buf, sizeof(buf), "D%d%s", diskNo, DIR_SEPARATOR);
  148.     strcat(theName, buf);
  149.     theLevelDepth++;
  150.   }
  151.   break;
  152.   default:
  153.     ERROR_SET(ecError, AFS_ERROR_PARAMETER,"","Wrong version");
  154.   }
  155.   if (type >= noOfExtensions){
  156.     ERROR_SET(ecError, AFS_ERROR_PARAMETER,"","File Type doesn't exist");
  157.     return;
  158.   }
  159.   strcat(theName, fileExtension[type]);
  160.   
  161.   if(dir == true){
  162.     for(int l = strlen(theName) - 1; l >= 0; l--){
  163.       if(theName[l] == DIR_SEPARATOR[0]){
  164. theName[l] = 0;
  165. break;
  166.       }
  167.     }
  168.   }
  169. }
  170. /**
  171.  * Find out directory name on level
  172.  * Ex: 
  173.  * theName = "/tmp/fs/T0/NDBFS/D0/P0/S27.data"
  174.  * level = 1 
  175.  * would return "/tmp/fs/T0/NDBFS/
  176.  */
  177. const char* Filename::directory(int level)
  178. {
  179.   const char* p;
  180.   
  181.   p = theName;
  182.   p += strlen(theBaseDirectory);
  183.   
  184.   for (int i = 0; i <= level; i++){
  185.     p = strstr(p, DIR_SEPARATOR);
  186.     p++;
  187.   } 
  188.   
  189.   strncpy(theDirectory, theName, p - theName - 1);
  190.   theDirectory[p-theName-1] = 0;
  191.   return theDirectory;
  192. }