From: dan Date: Wed, 27 Dec 2017 21:13:21 +0000 (+0000) Subject: Improve the shell tool ".ar --list --verbose" command. X-Git-Tag: version-3.22.0~108^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b5090e489784941c91e559cc23e5cbe497dab52c;p=thirdparty%2Fsqlite.git Improve the shell tool ".ar --list --verbose" command. FossilOrigin-Name: b64681a644c419bb98d00980a6cb56ef5a0aff5ef5321955631f0b4c88aac283 --- diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index cf9666a7ae..188d4fc2ea 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -50,6 +50,9 @@ typedef unsigned long u32; #define ZIPFILE_BUFFER_SIZE (64*1024) + +#define ZIPFILE_EXTRA_TIMESTAMP 0x5455 + /* ** Set the error message contained in context ctx to the results of ** vprintf(zFmt, ...). @@ -341,7 +344,14 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){ pCsr->iNextOff += pCsr->cds.nComment; } - /* Scan the "extra" fields */ + /* Scan the cds.nExtra bytes of "extra" fields for any that can + ** be interpreted. The general format of an extra field is: + ** + ** Header ID 2 bytes + ** Data Size 2 bytes + ** Data N bytes + ** + */ if( rc==SQLITE_OK ){ u8 *p = &aRead[pCsr->cds.nFile]; u8 *pEnd = &p[pCsr->cds.nExtra]; @@ -351,7 +361,7 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){ u16 nByte = zipfileRead16(p); switch( id ){ - case 0x5455: { /* Extended timestamp */ + case ZIPFILE_EXTRA_TIMESTAMP: { u8 b = p[0]; if( b & 0x01 ){ /* 0x01 -> modtime is present */ pCsr->mTime = zipfileGetU32(&p[1]); @@ -359,9 +369,6 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){ } break; } - - case 0x7875: /* Info-ZIP Unix (new) */ - break; } p += nByte; diff --git a/manifest b/manifest index 0cc3ca2bdd..d6c9a543e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sshell\stool\s".ar\s--list"\sand\s".ar\s--extract"\scommands\ssupport\szip\nfiles.\sCurrently\sthe\s"-zip"\sswitch\sis\srequired. -D 2017-12-27T18:54:11.166 +C Improve\sthe\sshell\stool\s".ar\s--list\s--verbose"\scommand. +D 2017-12-27T21:13:21.423 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in ceb40bfcb30ebba8e1202b34c56ff7e13e112f9809e2381d99be32c2726058f5 @@ -302,7 +302,7 @@ F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 F ext/misc/vtablog.c 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9 F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 96148b78b56664fe82f774e50dcdf6c83d693a1449b88011eba00cd6c697fedf +F ext/misc/zipfile.c ced1aa768904cf8182c3da93d42df4e3cf30fe7a2e66c9216f6bc64a8df4fd5b F ext/rbu/rbu.c ea7d1b7eb44c123a2a619332e19fe5313500705c4a58aaa1887905c0d83ffc2e F ext/rbu/rbu1.test 43836fac8c7179a358eaf38a8a1ef3d6e6285842 F ext/rbu/rbu10.test 1846519a438697f45e9dcb246908af81b551c29e1078d0304fae83f1fed7e9ee @@ -483,7 +483,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bbee7e31d369a18a2f4836644769882e9c5d40ef4a3af911db06410b65cb3730 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c 8b22abe193e4d8243befa2038e4ae2405802fed1c446e5e502d11f652e09ba74 -F src/shell.c.in d1be3030ee7afbbfb67972e4614b6d08dcae2e76460114d6b200fd28d0f008fb +F src/shell.c.in 9177b6cc706b1dd1ed81b05344641597d7ed8bba97a8fc31192309189846fab7 F src/sqlite.h.in 2126192945019d4cdce335cb236b440a05ec75c93e4cd94c9c6d6e7fcc654cc4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h c02d628cca67f3889c689d82d25c3eb45e2c155db08e4c6089b5840d64687d34 @@ -1692,7 +1692,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8e366b99b13d765d8bf000a7ec5919e582702e51dc07c27a746b6002898a2302 -R 0d0cb33644ad535bd9f83812fd2ec78d +P a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91 +R 7075030d907b0ffe212621eb709bb967 U dan -Z 54715bdb695d1dc399a9b1cd512f6d24 +Z 1c430e112380037cc2bfad44bf8be92e diff --git a/manifest.uuid b/manifest.uuid index 6167e93eb4..aaba04f0ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91 \ No newline at end of file +b64681a644c419bb98d00980a6cb56ef5a0aff5ef5321955631f0b4c88aac283 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 15a018bb9c..f7edb53f06 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4577,12 +4577,43 @@ static void arWhereClause( *pzWhere = zWhere; } +/* +** Argument zMode must point to a buffer at least 11 bytes in size. This +** function populates this buffer with the string interpretation of +** the unix file mode passed as the second argument (e.g. "drwxr-xr-x"). +*/ +static void shellModeToString(char *zMode, int mode){ + int i; + + /* Magic numbers copied from [man 2 stat] */ + if( mode & 0040000 ){ + zMode[0] = 'd'; + }else if( (mode & 0120000)==0120000 ){ + zMode[0] = 'l'; + }else{ + zMode[0] = '-'; + } + + for(i=0; i<3; i++){ + int m = (mode >> ((2-i)*3)); + char *a = &zMode[1 + i*3]; + a[0] = (m & 0x4) ? 'r' : '-'; + a[1] = (m & 0x2) ? 'w' : '-'; + a[2] = (m & 0x1) ? 'x' : '-'; + } + zMode[10] = '\0'; +} + /* ** Implementation of .ar "lisT" command. */ static int arListCommand(ShellState *p, sqlite3 *db, ArCommand *pAr){ - const char *zSql = "SELECT name FROM %s WHERE %s"; + const char *zSql = "SELECT %s FROM %s WHERE %s"; const char *zTbl = (pAr->bZip ? "zipfile(?)" : "sqlar"); + const char *azCols[] = { + "name", + "mode, sz, datetime(mtime, 'unixepoch'), name" + }; char *zWhere = 0; sqlite3_stmt *pSql = 0; @@ -4591,12 +4622,23 @@ static int arListCommand(ShellState *p, sqlite3 *db, ArCommand *pAr){ rc = arCheckEntries(db, pAr); arWhereClause(&rc, pAr, &zWhere); - shellPreparePrintf(db, &rc, &pSql, zSql, zTbl, zWhere); + shellPreparePrintf(db, &rc, &pSql, zSql, azCols[pAr->bVerbose], zTbl, zWhere); if( rc==SQLITE_OK && pAr->bZip ){ sqlite3_bind_text(pSql, 1, pAr->zFile, -1, SQLITE_TRANSIENT); } while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ - raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0)); + if( pAr->bVerbose ){ + char zMode[11]; + shellModeToString(zMode, sqlite3_column_int(pSql, 0)); + + raw_printf(p->out, "%s % 10d %s %s\n", zMode, + sqlite3_column_int(pSql, 1), + sqlite3_column_text(pSql, 2), + sqlite3_column_text(pSql, 3) + ); + }else{ + raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0)); + } } shellFinalize(&rc, pSql);