1 /*************** Tabmul H Declares Source Code File (.H) ***************/ 2 /* Name: TABMUL.H Version 1.5 */ 3 /* */ 4 /* (C) Copyright to PlugDB Software Development 2003-2017 */ 5 /* Author: Olivier BERTRAND */ 6 /* */ 7 /* This file contains the TDBMUL and TDBDIR classes declares. */ 8 /***********************************************************************/ 9 #if defined(_WIN32) 10 #include <io.h> 11 #else // !_WIN32 12 #include <sys/types.h> 13 #include <unistd.h> 14 #include <sys/stat.h> 15 #include <dirent.h> 16 #endif // !_WIN32 17 //#include "osutil.h" 18 #include "block.h" 19 20 typedef class TDBMUL *PTDBMUL; 21 typedef class TDBSDR *PTDBSDR; 22 23 /***********************************************************************/ 24 /* This is the MUL Access Method class declaration for files that are */ 25 /* physically split in multiple files having the same format. */ 26 /***********************************************************************/ 27 class DllExport TDBMUL : public TDBASE { 28 //friend class MULCOL; 29 public: 30 // Constructor 31 TDBMUL(PTDB tdbp); 32 TDBMUL(PTDBMUL tdbp); 33 34 // Implementation GetAmType(void)35 virtual AMT GetAmType(void) {return Tdbp->GetAmType();} 36 virtual PTDB Duplicate(PGLOBAL g); 37 38 // Methods 39 virtual void ResetDB(void); 40 virtual PTDB Clone(PTABS t); IsSame(PTDB tp)41 virtual bool IsSame(PTDB tp) {return tp == (PTDB)Tdbp;} GetFile(PGLOBAL g)42 virtual PCSZ GetFile(PGLOBAL g) {return Tdbp->GetFile(g);} GetRecpos(void)43 virtual int GetRecpos(void) {return 0;} 44 virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); 45 bool InitFileNames(PGLOBAL g); 46 47 // Database routines MakeCol(PGLOBAL g,PCOLDEF cdp,PCOL cprec,int n)48 virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) 49 {strcpy(g->Message, MSG(MUL_MAKECOL_ERR)); return NULL;} 50 virtual int Cardinality(PGLOBAL g); 51 virtual int GetMaxSize(PGLOBAL g); 52 virtual int GetProgMax(PGLOBAL g); 53 virtual int GetProgCur(void); 54 virtual int RowNumber(PGLOBAL g, bool b = false); 55 virtual bool OpenDB(PGLOBAL g); 56 virtual int ReadDB(PGLOBAL g); 57 virtual int WriteDB(PGLOBAL g); 58 virtual int DeleteDB(PGLOBAL g, int irc); 59 virtual void CloseDB(PGLOBAL g); 60 61 protected: 62 63 // Members 64 PTDB Tdbp; // Points to a (file) table class 65 char* *Filenames; // Points to file names 66 int Rows; // Total rows of already read files 67 int Mul; // Type of multiple file list 68 int NumFiles; // Number of physical files 69 int iFile; // Index of currently processed file 70 }; // end of class TDBMUL 71 72 #if 0 73 /***********************************************************************/ 74 /* This is the MSD Access Method class declaration for files that are */ 75 /* physically split in multiple files having the same format. */ 76 /* This sub-class also include files of the sub-directories. */ 77 /***********************************************************************/ 78 class DllExport TDBMSD : public TDBMUL { 79 //friend class MULCOL; 80 public: 81 // Constructor 82 TDBMSD(PTDB tdbp) : TDBMUL(tdbp) {} 83 TDBMSD(PTDBMSD tdbp) : TDBMUL(tdbp) {} 84 85 // Implementation 86 virtual PTDB Duplicate(PGLOBAL g); 87 88 // Methods 89 virtual PTDB Clone(PTABS t); 90 bool InitFileNames(PGLOBAL g); 91 92 // Database routines 93 94 protected: 95 96 // Members 97 }; // end of class TDBMSD 98 #endif 99 100 /***********************************************************************/ 101 /* Directory listing table. */ 102 /***********************************************************************/ 103 class DllExport DIRDEF : public TABDEF { /* Directory listing table */ 104 friend class CATALOG; 105 friend class TDBDIR; 106 public: 107 // Constructor DIRDEF(void)108 DIRDEF(void) {Fn = NULL; Incl = false; Huge = false;} 109 110 // Implementation GetType(void)111 virtual const char *GetType(void) {return "DIR";} 112 113 // Methods 114 virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); 115 virtual PTDB GetTable(PGLOBAL g, MODE m); 116 117 protected: 118 // Members 119 PSZ Fn; /* Path/Name of file search */ 120 bool Incl; /* true to include sub-directories */ 121 bool Huge; /* true if files can be larger than 2GB */ 122 bool Nodir; /* true to exclude directories */ 123 }; // end of DIRDEF 124 125 /***********************************************************************/ 126 /* This is the DIR Access Method class declaration for tables that */ 127 /* represent a directory listing. The pathname is given at the create */ 128 /* time and can contain wildcard characters in the file name, and the */ 129 /* (virtual) table is populated when it is in use. */ 130 /***********************************************************************/ 131 class TDBDIR : public TDBASE { 132 friend class DIRCOL; 133 friend class TDBMUL; 134 public: 135 // Constructor 136 TDBDIR(PDIRDEF tdp); 137 TDBDIR(PSZ fpat); 138 139 // Implementation GetAmType(void)140 virtual AMT GetAmType(void) {return TYPE_AM_DIR;} 141 142 // Methods GetRecpos(void)143 virtual int GetRecpos(void) {return iFile;} 144 145 // Database routines 146 virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); 147 virtual int GetMaxSize(PGLOBAL g); GetProgMax(PGLOBAL g)148 virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} GetProgCur(void)149 virtual int GetProgCur(void) {return iFile;} 150 virtual bool OpenDB(PGLOBAL g); 151 virtual int ReadDB(PGLOBAL g); 152 virtual int WriteDB(PGLOBAL g); 153 virtual int DeleteDB(PGLOBAL g, int irc); 154 virtual void CloseDB(PGLOBAL g); 155 156 protected: 157 void Init(void); 158 char *Path(PGLOBAL g); 159 160 // Members 161 PSZ To_File; // Points to file search pathname 162 int iFile; // Index of currently retrieved file 163 #if defined(_WIN32) 164 PVAL Dvalp; // Used to retrieve file date values 165 WIN32_FIND_DATA FileData; // Find data structure 166 HANDLE hSearch; // Search handle 167 char Drive[_MAX_DRIVE]; // Drive name 168 #else // !_WIN32 169 struct stat Fileinfo; // File info structure 170 struct dirent *Entry; // Point to directory entry structure 171 DIR *Dir; // To searched directory structure 172 bool Done; // true when _splipath is done 173 char Pattern[_MAX_FNAME+_MAX_EXT]; 174 #endif // !_WIN32 175 char Fpath[_MAX_PATH]; // Absolute file search pattern 176 char Direc[_MAX_DIR]; // Search path 177 char Fname[_MAX_FNAME]; // File name 178 char Ftype[_MAX_EXT]; // File extention 179 bool Nodir; // Exclude directories from file list 180 }; // end of class TDBDIR 181 182 /***********************************************************************/ 183 /* This is the DIR Access Method class declaration for tables that */ 184 /* represent a directory listing. The pathname is given at the create */ 185 /* time and can contain wildcard characters in the file name, and the */ 186 /* (virtual) table is populated when it is in use. In addition, this */ 187 /* class also includes files of included sub-directories. */ 188 /***********************************************************************/ 189 class TDBSDR : public TDBDIR { 190 friend class DIRCOL; 191 friend class TDBMUL; 192 public: 193 // Constructors TDBSDR(PDIRDEF tdp)194 TDBSDR(PDIRDEF tdp) : TDBDIR(tdp) {Sub = NULL;} TDBSDR(PSZ fpat)195 TDBSDR(PSZ fpat) : TDBDIR(fpat) {Sub = NULL;} 196 197 // Database routines 198 virtual int GetMaxSize(PGLOBAL g); GetProgMax(PGLOBAL g)199 virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} 200 virtual bool OpenDB(PGLOBAL g); 201 virtual int ReadDB(PGLOBAL g); 202 //virtual void CloseDB(PGLOBAL g); 203 204 protected: 205 int FindInDir(PGLOBAL g); 206 207 typedef struct _Sub_Dir { 208 struct _Sub_Dir *Next; 209 struct _Sub_Dir *Prev; 210 #if defined(_WIN32) 211 HANDLE H; // Search handle 212 #else // !_WIN32 213 DIR *D; 214 #endif // !_WIN32 215 size_t Len; // Initial directory name length 216 } SUBDIR, *PSUBDIR; 217 218 // Members 219 PSUBDIR Sub; // To current Subdir block 220 }; // end of class TDBSDR 221 222 /***********************************************************************/ 223 /* Class DIRCOL: DIR access method column descriptor. */ 224 /* This A.M. is used for tables populated by DIR file name list. */ 225 /***********************************************************************/ 226 class DIRCOL : public COLBLK { 227 public: 228 // Constructors 229 DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "DIR"); 230 DIRCOL(DIRCOL *colp, PTDB tdbp); // Constructor used in copy process 231 232 // Implementation GetAmType(void)233 virtual int GetAmType(void) {return TYPE_AM_DIR;} 234 235 // Methods 236 virtual void ReadColumn(PGLOBAL g); 237 238 protected: 239 // Default constructor not to be used DIRCOL(void)240 DIRCOL(void) {} 241 #if defined(_WIN32) 242 void SetTimeValue(PGLOBAL g, FILETIME& ftime); 243 #endif // _WIN32 244 245 // Members 246 PTDBDIR Tdbp; // To DIR table 247 int N; // Column number 248 }; // end of class DIRCOL 249