@@ -1446,5 +1446,95 @@
1446 1446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&q);
1447 1447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1448 1448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
1449 1449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1450 1450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Renders the list of attachments for artifact pManifest as JSON to
1453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** blob pOut. If pManifest->type is not one of (CFTYPE_TICKET,
1454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CFTYPE_FORUM, CFTYPE_EVENT, CFTYPE_WIKI) then it behaves as if the
1455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** result set is empty.
1456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If there are no matching attachments then its behavior depends on
1458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** emptyPolicy:
1459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <0 = emit a JSON NULL
1461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0 = emit no output
1462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** >0 = emit an empty JSON array
1463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If bLatestOnly is true then only the most recent entry for a given
1465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** attachment is emitted, else all versions are emitted in descending
1466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mtime order.
1467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns the number of attachments.
1469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Output format:
1471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [{
1473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "uuid": attachment artifact hash,
1474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "src": hash of the attachment blob,
1475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "target": wiki page name or ticket/event ID,
1476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "filename": filename of attachment,
1477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "mtime": ISO-8601 timestamp UTC,
1478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "isLatest": true if this is the latest version of this file
1479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** else false,
1480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** }, ...once per attachment]
1481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int attachments_to_json(const Manifest *pManifest,
1484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *pOut, int bLatestOnly,
1485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int emptyPolicy){
1486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i = 0;
1487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q = empty_Stmt;
1488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zToFree = 0;
1489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTgt = 0;
1490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch(pManifest->type){
1491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_FORUM: zTgt = zToFree = rid_to_uuid(pManifest->rid);
1492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
1493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_WIKI: zTgt = pManifest->zWikiTitle; break;
1494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_EVENT: zTgt = pManifest->zEventId; break;
1495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_TICKET: zTgt = pManifest->zTicketUuid; break;
1496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
1497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto empty_result;
1498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
1500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT datetime(mtime), src, target, filename, isLatest,"
1501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " (SELECT uuid FROM blob WHERE rid=attachid) uuid"
1502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM attachment"
1503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE target=%Q"
1504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND (isLatest OR %d)"
1505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY target, isLatest DESC, mtime DESC",
1506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTgt, !bLatestOnly
1507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while(SQLITE_ROW == db_step(&q)){
1509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zTime = db_column_text(&q, 0);
1510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zSrc = db_column_text(&q, 1);
1511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zTarget = db_column_text(&q, 2);
1512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zName = db_column_text(&q, 3);
1513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int isLatest = db_column_int(&q, 4);
1514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zUuid = db_column_text(&q, 5);
1515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!i++){
1516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, '[');
1517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, ',');
1519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(
1521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut,
1522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "{\"uuid\": %!j, \"src\": %!j, \"target\": %!j, "
1523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "\"filename\": %!j, \"mtime\": %!j, \"isLatest\": %s}",
1524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUuid, zSrc, zTarget,
1525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName, zTime, isLatest ? "true" : "false");
1526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zToFree);
1528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
1529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!i){
1530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ empty_result:
1531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( emptyPolicy>0 ){
1532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(pOut, "[]");
1533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( emptyPolicy<0 ){
1534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(pOut, "null");
1535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(pOut, ']');
1538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return i;
1540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1451 1541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!