Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | On file listing pages, sort files that have numbers as part of their name in numeric order. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
59dfca5ed575d6e321b895e392ca2140 |
User & Date: | drh 2022-03-08 20:47:08 |
Context
2022-03-10
| ||
12:35 | Graph layout: Strive harder for merge arrows to come straight up out of the top of leaf nodes. ... (check-in: a3bfe425 user: drh tags: trunk) | |
2022-03-08
| ||
20:47 | On file listing pages, sort files that have numbers as part of their name in numeric order. ... (check-in: 59dfca5e user: drh tags: trunk) | |
13:08 | Faster implementation of start_of_branch() using a CTE. ... (check-in: 8736de8b user: drh tags: trunk) | |
Changes
Changes to src/browse.c.
︙ | ︙ | |||
328 329 330 331 332 333 334 | /* Generate a multi-column table listing the contents of zD[] ** directory. */ mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/"); if( mxLen<12 ) mxLen = 12; mxLen += (mxLen+9)/10; | > | | 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | /* Generate a multi-column table listing the contents of zD[] ** directory. */ mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/"); if( mxLen<12 ) mxLen = 12; mxLen += (mxLen+9)/10; db_prepare(&q, "SELECT x, u FROM localfiles ORDER BY x COLLATE uintnocase /*scan*/"); @ <div class="columns files" style="columns: %d(mxLen)ex auto"> @ <ul class="browser"> while( db_step(&q)==SQLITE_ROW ){ const char *zFN; zFN = db_column_text(&q, 0); if( zFN[0]=='/' ){ zFN++; |
︙ | ︙ | |||
366 367 368 369 370 371 372 | /* If the directory contains a readme file, then display its content below ** the list of files */ db_prepare(&q, "SELECT x, u FROM localfiles" " WHERE x COLLATE nocase IN" " ('readme','readme.txt','readme.md','readme.wiki','readme.markdown'," | | | 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | /* If the directory contains a readme file, then display its content below ** the list of files */ db_prepare(&q, "SELECT x, u FROM localfiles" " WHERE x COLLATE nocase IN" " ('readme','readme.txt','readme.md','readme.wiki','readme.markdown'," " 'readme.html') ORDER BY x COLLATE uintnocase LIMIT 1;" ); if( db_step(&q)==SQLITE_ROW ){ const char *zName = db_column_text(&q,0); const char *zUuid = db_column_text(&q,1); if( zUuid ){ rid = fast_uuid_to_rid(zUuid); }else{ |
︙ | ︙ | |||
788 789 790 791 792 793 794 | Stmt q; compute_fileage(rid, 0); db_prepare(&q, "SELECT filename.name, blob.uuid, fileage.mtime\n" " FROM fileage, filename, blob\n" " WHERE filename.fnid=fileage.fnid\n" " AND blob.rid=fileage.fid\n" | | | 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 | Stmt q; compute_fileage(rid, 0); db_prepare(&q, "SELECT filename.name, blob.uuid, fileage.mtime\n" " FROM fileage, filename, blob\n" " WHERE filename.fnid=fileage.fnid\n" " AND blob.rid=fileage.fid\n" " ORDER BY filename.name COLLATE uintnocase;" ); while( db_step(&q)==SQLITE_ROW ){ const char *zFile = db_column_text(&q,0); const char *zUuid = db_column_text(&q,1); double mtime = db_column_double(&q,2); if( nD>0 && (fossil_strncmp(zFile, zD, nD-1)!=0 || zFile[nD-1]!='/') ){ continue; |
︙ | ︙ | |||
811 812 813 814 815 816 817 | db_prepare(&q, "SELECT\n" " (SELECT name FROM filename WHERE filename.fnid=mlink.fnid),\n" " (SELECT uuid FROM blob WHERE blob.rid=mlink.fid),\n" " max(event.mtime)\n" " FROM mlink JOIN event ON event.objid=mlink.mid\n" " GROUP BY mlink.fnid\n" | | | 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 | db_prepare(&q, "SELECT\n" " (SELECT name FROM filename WHERE filename.fnid=mlink.fnid),\n" " (SELECT uuid FROM blob WHERE blob.rid=mlink.fid),\n" " max(event.mtime)\n" " FROM mlink JOIN event ON event.objid=mlink.mid\n" " GROUP BY mlink.fnid\n" " ORDER BY 1 COLLATE uintnocase;"); while( db_step(&q)==SQLITE_ROW ){ const char *zName = db_column_text(&q, 0); const char *zUuid = db_column_text(&q,1); double mtime = db_column_double(&q,2); if( nD>0 && (fossil_strncmp(zName, zD, nD-1)!=0 || zName[nD-1]!='/') ){ continue; } |
︙ | ︙ |
Changes to src/db.c.
︙ | ︙ | |||
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 | if( (db.protectMask & PROTECT_SENSITIVE)==0 ){ sqlite3_result_int(context, 0); return; } zSetting = (const char*)sqlite3_value_text(argv[0]); sqlite3_result_int(context, db_setting_is_protected(zSetting)); } /* ** Register the SQL functions that are useful both to the internal ** representation and to the "fossil sql" command. */ void db_add_aux_functions(sqlite3 *db){ sqlite3_create_function(db, "checkin_mtime", 2, SQLITE_UTF8, 0, db_checkin_mtime_function, 0, 0); sqlite3_create_function(db, "symbolic_name_to_rid", 1, SQLITE_UTF8, 0, db_sym2rid_function, 0, 0); sqlite3_create_function(db, "symbolic_name_to_rid", 2, SQLITE_UTF8, 0, db_sym2rid_function, 0, 0); sqlite3_create_function(db, "now", 0, SQLITE_UTF8, 0, | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 | if( (db.protectMask & PROTECT_SENSITIVE)==0 ){ sqlite3_result_int(context, 0); return; } zSetting = (const char*)sqlite3_value_text(argv[0]); sqlite3_result_int(context, db_setting_is_protected(zSetting)); } /* ** Copied from SQLite ext/misc/uint.c... ** ** Compare text in lexicographic order, except strings of digits ** compare in numeric order. ** ** This version modified to also ignore case. */ static int uintNocaseCollFunc( void *notUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2 ){ const unsigned char *zA = (const unsigned char*)pKey1; const unsigned char *zB = (const unsigned char*)pKey2; int i=0, j=0, x; (void)notUsed; while( i<nKey1 && j<nKey2 ){ if( fossil_isdigit(zA[i]) ){ int k; if( !fossil_isdigit(zB[j]) ) return x; while( i<nKey1 && zA[i]=='0' ){ i++; } while( j<nKey2 && zB[j]=='0' ){ j++; } k = 0; while( i+k<nKey1 && fossil_isdigit(zA[i+k]) && j+k<nKey2 && fossil_isdigit(zB[j+k]) ){ k++; } if( i+k<nKey1 && fossil_isdigit(zA[i+k]) ){ return +1; }else if( j+k<nKey2 && fossil_isdigit(zB[j+k]) ){ return -1; }else{ x = memcmp(zA+i, zB+j, k); if( x ) return x; i += k; j += k; } }else if( zA[i]!=zB[j] && (x = fossil_tolower(zA[i]) - fossil_tolower(zB[j]))!=0 ){ return x; }else{ i++; j++; } } return (nKey1 - i) - (nKey2 - j); } /* ** Register the SQL functions that are useful both to the internal ** representation and to the "fossil sql" command. */ void db_add_aux_functions(sqlite3 *db){ sqlite3_create_collation(db, "uintnocase", SQLITE_UTF8,0,uintNocaseCollFunc); sqlite3_create_function(db, "checkin_mtime", 2, SQLITE_UTF8, 0, db_checkin_mtime_function, 0, 0); sqlite3_create_function(db, "symbolic_name_to_rid", 1, SQLITE_UTF8, 0, db_sym2rid_function, 0, 0); sqlite3_create_function(db, "symbolic_name_to_rid", 2, SQLITE_UTF8, 0, db_sym2rid_function, 0, 0); sqlite3_create_function(db, "now", 0, SQLITE_UTF8, 0, |
︙ | ︙ |