Skip to content

Commit 03d95e8

Browse files
richardo2016xicilion
authored andcommitted
Stat, feat: reduce members in Stat, support APIs about detecting device type.
1 parent 8e7da88 commit 03d95e8

File tree

4 files changed

+130
-66
lines changed

4 files changed

+130
-66
lines changed

fibjs/include/Stat.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,11 @@ class Stat : public Stat_base {
8383
virtual result_t isReadable(bool& retVal);
8484
virtual result_t isExecutable(bool& retVal);
8585
virtual result_t isHidden(bool& retVal);
86+
virtual result_t isBlockDevice(bool& retVal);
87+
virtual result_t isCharacterDevice(bool& retVal);
8688
virtual result_t isDirectory(bool& retVal);
8789
virtual result_t isFile(bool& retVal);
90+
virtual result_t isFIFO(bool& retVal);
8891
virtual result_t isSymbolicLink(bool& retVal);
8992
virtual result_t isMemory(bool& retVal);
9093
virtual result_t isSocket(bool& retVal);
@@ -97,21 +100,21 @@ class Stat : public Stat_base {
97100
void init();
98101
void init(Stat_base* st);
99102

100-
public:
101-
exlib::string name;
103+
private:
102104
int64_t dev, rdev;
103105
int64_t ino;
104-
int64_t mode;
106+
uint64_t m_mode;
105107
int64_t nlink;
106108
int64_t uid, gid;
107-
int64_t size;
108109
int64_t blksize;
109110
int64_t blocks;
111+
112+
public:
113+
exlib::string name;
114+
int64_t size;
110115
date_t mtime, atime, ctime, birthtime;
111116
int64_t mtimeNs, atimeNs, ctimeNs, birthtimeNs;
112-
bool m_isBlockDevice, m_isCharacterDevice, m_isFIFO;
113-
bool m_isWritable, m_isReadable, m_isExecutable, m_isHidden;
114-
bool m_isDirectory, m_isFile, m_isSymbolicLink;
117+
bool m_isHidden;
115118
bool m_isMemory, m_isSocket;
116119
};
117120
}

fibjs/include/ifs/Stat.h

+54
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ class Stat_base : public object_base {
4444
virtual result_t isReadable(bool& retVal) = 0;
4545
virtual result_t isExecutable(bool& retVal) = 0;
4646
virtual result_t isHidden(bool& retVal) = 0;
47+
virtual result_t isBlockDevice(bool& retVal) = 0;
48+
virtual result_t isCharacterDevice(bool& retVal) = 0;
4749
virtual result_t isDirectory(bool& retVal) = 0;
50+
virtual result_t isFIFO(bool& retVal) = 0;
4851
virtual result_t isFile(bool& retVal) = 0;
4952
virtual result_t isSymbolicLink(bool& retVal) = 0;
5053
virtual result_t isMemory(bool& retVal) = 0;
@@ -85,7 +88,10 @@ class Stat_base : public object_base {
8588
static void s_isReadable(const v8::FunctionCallbackInfo<v8::Value>& args);
8689
static void s_isExecutable(const v8::FunctionCallbackInfo<v8::Value>& args);
8790
static void s_isHidden(const v8::FunctionCallbackInfo<v8::Value>& args);
91+
static void s_isBlockDevice(const v8::FunctionCallbackInfo<v8::Value>& args);
92+
static void s_isCharacterDevice(const v8::FunctionCallbackInfo<v8::Value>& args);
8893
static void s_isDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
94+
static void s_isFIFO(const v8::FunctionCallbackInfo<v8::Value>& args);
8995
static void s_isFile(const v8::FunctionCallbackInfo<v8::Value>& args);
9096
static void s_isSymbolicLink(const v8::FunctionCallbackInfo<v8::Value>& args);
9197
static void s_isMemory(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -101,7 +107,10 @@ inline ClassInfo& Stat_base::class_info()
101107
{ "isReadable", s_isReadable, false },
102108
{ "isExecutable", s_isExecutable, false },
103109
{ "isHidden", s_isHidden, false },
110+
{ "isBlockDevice", s_isBlockDevice, false },
111+
{ "isCharacterDevice", s_isCharacterDevice, false },
104112
{ "isDirectory", s_isDirectory, false },
113+
{ "isFIFO", s_isFIFO, false },
105114
{ "isFile", s_isFile, false },
106115
{ "isSymbolicLink", s_isSymbolicLink, false },
107116
{ "isMemory", s_isMemory, false },
@@ -447,6 +456,36 @@ inline void Stat_base::s_isHidden(const v8::FunctionCallbackInfo<v8::Value>& arg
447456
METHOD_RETURN();
448457
}
449458

459+
inline void Stat_base::s_isBlockDevice(const v8::FunctionCallbackInfo<v8::Value>& args)
460+
{
461+
bool vr;
462+
463+
METHOD_NAME("Stat.isBlockDevice");
464+
METHOD_INSTANCE(Stat_base);
465+
METHOD_ENTER();
466+
467+
METHOD_OVER(0, 0);
468+
469+
hr = pInst->isBlockDevice(vr);
470+
471+
METHOD_RETURN();
472+
}
473+
474+
inline void Stat_base::s_isCharacterDevice(const v8::FunctionCallbackInfo<v8::Value>& args)
475+
{
476+
bool vr;
477+
478+
METHOD_NAME("Stat.isCharacterDevice");
479+
METHOD_INSTANCE(Stat_base);
480+
METHOD_ENTER();
481+
482+
METHOD_OVER(0, 0);
483+
484+
hr = pInst->isCharacterDevice(vr);
485+
486+
METHOD_RETURN();
487+
}
488+
450489
inline void Stat_base::s_isDirectory(const v8::FunctionCallbackInfo<v8::Value>& args)
451490
{
452491
bool vr;
@@ -462,6 +501,21 @@ inline void Stat_base::s_isDirectory(const v8::FunctionCallbackInfo<v8::Value>&
462501
METHOD_RETURN();
463502
}
464503

504+
inline void Stat_base::s_isFIFO(const v8::FunctionCallbackInfo<v8::Value>& args)
505+
{
506+
bool vr;
507+
508+
METHOD_NAME("Stat.isFIFO");
509+
METHOD_INSTANCE(Stat_base);
510+
METHOD_ENTER();
511+
512+
METHOD_OVER(0, 0);
513+
514+
hr = pInst->isFIFO(vr);
515+
516+
METHOD_RETURN();
517+
}
518+
465519
inline void Stat_base::s_isFile(const v8::FunctionCallbackInfo<v8::Value>& args)
466520
{
467521
bool vr;

fibjs/src/fs/Stat.cpp

+51-59
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void Stat::fill(exlib::string path, uv_stat_t* statbuf)
5454

5555
dev = statbuf->st_dev;
5656
ino = statbuf->st_ino;
57-
mode = statbuf->st_mode;
57+
m_mode = statbuf->st_mode;
5858

5959
nlink = statbuf->st_nlink;
6060

@@ -80,26 +80,6 @@ void Stat::fill(exlib::string path, uv_stat_t* statbuf)
8080
birthtimeNs = (double)statbuf->st_birthtim.tv_nsec;
8181
birthtime = (double)statbuf->st_birthtim.tv_sec * 1000ll + (birthtimeNs / 1000000000.0);
8282

83-
#ifdef _WIN32
84-
m_isBlockDevice = false;
85-
86-
m_isCharacterDevice = false;
87-
m_isFIFO = false;
88-
#else
89-
m_isBlockDevice = S_ISBLK(statbuf->st_mode);
90-
m_isCharacterDevice = S_ISCHR(statbuf->st_mode);
91-
m_isFIFO = S_ISFIFO(statbuf->st_mode);
92-
#endif
93-
94-
m_isReadable = (S_IRUSR & statbuf->st_mode) != 0;
95-
m_isWritable = (S_IWUSR & statbuf->st_mode) != 0;
96-
m_isExecutable = (S_IXUSR & statbuf->st_mode) != 0;
97-
98-
m_isDirectory = (S_IFDIR & statbuf->st_mode) != 0;
99-
m_isFile = (S_IFREG & statbuf->st_mode) != 0;
100-
101-
m_isSymbolicLink = S_ISLNK(statbuf->st_mode);
102-
10383
m_isMemory = false;
10484
m_isSocket = false;
10585
}
@@ -108,7 +88,7 @@ void Stat::init()
10888
{
10989
name.resize(0);
11090
size = 0;
111-
mode = 0;
91+
m_mode = 0;
11292

11393
mtime = 0;
11494
mtimeNs = 0;
@@ -121,22 +101,6 @@ void Stat::init()
121101

122102
gid = 0;
123103
uid = 0;
124-
125-
m_isBlockDevice = false;
126-
m_isCharacterDevice = false;
127-
m_isFIFO = false;
128-
129-
m_isReadable = false;
130-
m_isWritable = false;
131-
m_isExecutable = false;
132-
133-
m_isDirectory = false;
134-
m_isFile = false;
135-
136-
m_isSymbolicLink = false;
137-
138-
m_isMemory = false;
139-
m_isSocket = false;
140104
}
141105

142106
void Stat::init(Stat_base* st)
@@ -150,7 +114,7 @@ void Stat::init(Stat_base* st)
150114
size = d_tmp;
151115

152116
st->get_mode(i32_tmp);
153-
mode = i32_tmp;
117+
m_mode = i32_tmp;
154118

155119
st->get_mtime(mtime);
156120
st->get_atime(atime);
@@ -163,19 +127,6 @@ void Stat::init(Stat_base* st)
163127
st->get_uid(i32_tmp);
164128
uid = i32_tmp;
165129

166-
// st->isBlockDevice(m_isBlockDevice);
167-
// st->isCharacterDevice(m_isCharacterDevice);
168-
// st->isFIFO(m_isFIFO);
169-
170-
st->isReadable(m_isReadable);
171-
st->isWritable(m_isWritable);
172-
st->isExecutable(m_isExecutable);
173-
174-
st->isDirectory(m_isDirectory);
175-
st->isFile(m_isFile);
176-
177-
st->isSymbolicLink(m_isSymbolicLink);
178-
179130
st->isMemory(m_isMemory);
180131
st->isSocket(m_isSocket);
181132
}
@@ -200,7 +151,7 @@ result_t Stat::get_ino(int32_t& retVal)
200151

201152
result_t Stat::get_mode(int32_t& retVal)
202153
{
203-
retVal = mode;
154+
retVal = m_mode;
204155
return 0;
205156
};
206157

@@ -296,19 +247,22 @@ result_t Stat::get_birthtimeMs(double& retVal)
296247

297248
result_t Stat::isWritable(bool& retVal)
298249
{
299-
retVal = m_isWritable;
250+
retVal = (S_IWUSR & m_mode) != 0;
251+
300252
return 0;
301253
}
302254

303255
result_t Stat::isReadable(bool& retVal)
304256
{
305-
retVal = m_isReadable;
257+
retVal = (S_IRUSR & m_mode) != 0;
258+
306259
return 0;
307260
}
308261

309262
result_t Stat::isExecutable(bool& retVal)
310263
{
311-
retVal = m_isExecutable;
264+
retVal = (S_IXUSR & m_mode) != 0;
265+
312266
return 0;
313267
}
314268

@@ -318,33 +272,71 @@ result_t Stat::isHidden(bool& retVal)
318272
return 0;
319273
}
320274

275+
result_t Stat::isBlockDevice(bool& retVal)
276+
{
277+
#ifdef _WIN32
278+
retVal = false;
279+
#else
280+
retVal = S_ISBLK(m_mode);
281+
#endif
282+
283+
return 0;
284+
}
285+
286+
result_t Stat::isCharacterDevice(bool& retVal)
287+
{
288+
#ifdef _WIN32
289+
retVal = false;
290+
#else
291+
retVal = S_ISCHR(m_mode);
292+
#endif
293+
294+
return 0;
295+
}
296+
321297
result_t Stat::isDirectory(bool& retVal)
322298
{
323-
retVal = m_isDirectory;
299+
retVal = (S_IFDIR & m_mode) != 0;
300+
301+
return 0;
302+
}
303+
304+
result_t Stat::isFIFO(bool& retVal)
305+
{
306+
#ifdef _WIN32
307+
retVal = false;
308+
#else
309+
retVal = S_ISFIFO(m_mode);
310+
#endif
311+
324312
return 0;
325313
}
326314

327315
result_t Stat::isFile(bool& retVal)
328316
{
329-
retVal = m_isFile;
317+
retVal = (S_IFREG & m_mode) != 0;
318+
330319
return 0;
331320
}
332321

333322
result_t Stat::isSymbolicLink(bool& retVal)
334323
{
335-
retVal = m_isSymbolicLink;
324+
retVal = S_ISLNK(m_mode);
325+
336326
return 0;
337327
}
338328

339329
result_t Stat::isMemory(bool& retVal)
340330
{
341331
retVal = m_isMemory;
332+
342333
return 0;
343334
}
344335

345336
result_t Stat::isSocket(bool& retVal)
346337
{
347338
retVal = m_isSocket;
339+
348340
return 0;
349341
}
350342
}

idl/zh-cn/Stat.idl

+15
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,26 @@ interface Stat : object
8181
*/
8282
Boolean isHidden();
8383

84+
/*! @brief 查询 Stat 是否描述了一个 block device
85+
@return 为 true 表示描述了一个 block device
86+
*/
87+
Boolean isBlockDevice();
88+
89+
/*! @brief 查询 Stat 是否描述了一个 character device
90+
@return 为 true 表示描述了一个 character device
91+
*/
92+
Boolean isCharacterDevice();
93+
8494
/*! @brief 查询文件是否是目录
8595
@return 为 true 则是目录
8696
*/
8797
Boolean isDirectory();
8898

99+
/*! @brief 查询 Stat 是否描述了一个 FIFO 管道
100+
@return 为 true 表示描述了一个 FIFO 管道
101+
*/
102+
Boolean isFIFO();
103+
89104
/*! @brief 查询文件是否是文件
90105
@return 为 true 则是文件
91106
*/

0 commit comments

Comments
 (0)