Fossil SCM
Refactored ATTACHMENT crosslinking a bit to remove some duplicate code (tested on libfossil repo). Replaced free() with fossil_free() (consistency). Added fossil_is_uuid(), the c-string counterpart of blob_is_uuid().
Commit
b7ff537dca972087d412c527681598d49e70da76
Parent
1762a72f0e29518…
2 files changed
+28
-34
+10
+28
-34
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -135,16 +135,16 @@ | ||
| 135 | 135 | ** Clear the memory allocated in a manifest object |
| 136 | 136 | */ |
| 137 | 137 | void manifest_destroy(Manifest *p){ |
| 138 | 138 | if( p ){ |
| 139 | 139 | blob_reset(&p->content); |
| 140 | - free(p->aFile); | |
| 141 | - free(p->azParent); | |
| 142 | - free(p->azCChild); | |
| 143 | - free(p->aTag); | |
| 144 | - free(p->aField); | |
| 145 | - free(p->aCherrypick); | |
| 140 | + fossil_free(p->aFile); | |
| 141 | + fossil_free(p->azParent); | |
| 142 | + fossil_free(p->azCChild); | |
| 143 | + fossil_free(p->aTag); | |
| 144 | + fossil_free(p->aField); | |
| 145 | + fossil_free(p->aCherrypick); | |
| 146 | 146 | if( p->pBaseline ) manifest_destroy(p->pBaseline); |
| 147 | 147 | memset(p, 0, sizeof(*p)); |
| 148 | 148 | fossil_free(p); |
| 149 | 149 | } |
| 150 | 150 | } |
| @@ -1608,11 +1608,11 @@ | ||
| 1608 | 1608 | blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with " |
| 1609 | 1609 | "%d other change%s", |
| 1610 | 1610 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus, |
| 1611 | 1611 | pManifest->nField, pManifest->nField==1 ? "" : "s" |
| 1612 | 1612 | ); |
| 1613 | - free(zNewStatus); | |
| 1613 | + fossil_free(zNewStatus); | |
| 1614 | 1614 | blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s", |
| 1615 | 1615 | pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField, |
| 1616 | 1616 | pManifest->nField==1 ? "" : "s" |
| 1617 | 1617 | ); |
| 1618 | 1618 | } |
| @@ -1621,11 +1621,11 @@ | ||
| 1621 | 1621 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle |
| 1622 | 1622 | ); |
| 1623 | 1623 | blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid, |
| 1624 | 1624 | pManifest->zTicketUuid); |
| 1625 | 1625 | } |
| 1626 | - free(zTitle); | |
| 1626 | + fossil_free(zTitle); | |
| 1627 | 1627 | db_multi_exec( |
| 1628 | 1628 | "REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)" |
| 1629 | 1629 | "VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)", |
| 1630 | 1630 | tktTagId, pManifest->rDate, rid, pManifest->zUser, |
| 1631 | 1631 | blob_str(&comment), blob_str(&brief) |
| @@ -1753,11 +1753,11 @@ | ||
| 1753 | 1753 | TAG_COMMENT, rid, p->rDate |
| 1754 | 1754 | ); |
| 1755 | 1755 | zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event" |
| 1756 | 1756 | " WHERE rowid=last_insert_rowid()"); |
| 1757 | 1757 | wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE); |
| 1758 | - free(zCom); | |
| 1758 | + fossil_free(zCom); | |
| 1759 | 1759 | |
| 1760 | 1760 | /* If this is a delta-manifest, record the fact that this repository |
| 1761 | 1761 | ** contains delta manifests, to free the "commit" logic to generate |
| 1762 | 1762 | ** new delta manifests. |
| 1763 | 1763 | */ |
| @@ -1822,11 +1822,11 @@ | ||
| 1822 | 1822 | char zLength[40]; |
| 1823 | 1823 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1824 | 1824 | nWiki = strlen(p->zWiki); |
| 1825 | 1825 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1826 | 1826 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1827 | - free(zTag); | |
| 1827 | + fossil_free(zTag); | |
| 1828 | 1828 | prior = db_int(0, |
| 1829 | 1829 | "SELECT rid FROM tagxref" |
| 1830 | 1830 | " WHERE tagid=%d AND mtime<%.17g" |
| 1831 | 1831 | " ORDER BY mtime DESC", |
| 1832 | 1832 | tagid, p->rDate |
| @@ -1850,11 +1850,11 @@ | ||
| 1850 | 1850 | TAG_BGCOLOR, rid, |
| 1851 | 1851 | TAG_BGCOLOR, rid, |
| 1852 | 1852 | TAG_USER, rid, |
| 1853 | 1853 | TAG_COMMENT, rid |
| 1854 | 1854 | ); |
| 1855 | - free(zComment); | |
| 1855 | + fossil_free(zComment); | |
| 1856 | 1856 | } |
| 1857 | 1857 | if( p->type==CFTYPE_EVENT ){ |
| 1858 | 1858 | char *zTag = mprintf("event-%s", p->zEventId); |
| 1859 | 1859 | int tagid = tag_findid(zTag, 1); |
| 1860 | 1860 | int prior, subsequent; |
| @@ -1862,11 +1862,11 @@ | ||
| 1862 | 1862 | char zLength[40]; |
| 1863 | 1863 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1864 | 1864 | nWiki = strlen(p->zWiki); |
| 1865 | 1865 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1866 | 1866 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1867 | - free(zTag); | |
| 1867 | + fossil_free(zTag); | |
| 1868 | 1868 | prior = db_int(0, |
| 1869 | 1869 | "SELECT rid FROM tagxref" |
| 1870 | 1870 | " WHERE tagid=%d AND mtime<%.17g AND rid!=%d" |
| 1871 | 1871 | " ORDER BY mtime DESC", |
| 1872 | 1872 | tagid, p->rDate, rid |
| @@ -1901,22 +1901,26 @@ | ||
| 1901 | 1901 | ); |
| 1902 | 1902 | } |
| 1903 | 1903 | } |
| 1904 | 1904 | if( p->type==CFTYPE_TICKET ){ |
| 1905 | 1905 | char *zTag; |
| 1906 | - | |
| 1907 | 1906 | assert( manifest_crosslink_busy==1 ); |
| 1908 | 1907 | zTag = mprintf("tkt-%s", p->zTicketUuid); |
| 1909 | 1908 | tag_insert(zTag, 1, 0, rid, p->rDate, rid); |
| 1910 | - free(zTag); | |
| 1909 | + fossil_free(zTag); | |
| 1911 | 1910 | db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)", |
| 1912 | 1911 | p->zTicketUuid); |
| 1913 | 1912 | } |
| 1914 | 1913 | if( p->type==CFTYPE_ATTACHMENT ){ |
| 1914 | + char *zComment = 0; | |
| 1915 | + char const isAdd = (p->zAttachSrc && p->zAttachSrc[0]) ? 1 : 0; | |
| 1916 | + char const attachToType = fossil_is_uuid(p->zAttachTarget) | |
| 1917 | + ? 't' /* attach to ticket */ | |
| 1918 | + : 'w' /* attach to wiki page */; | |
| 1915 | 1919 | db_multi_exec( |
| 1916 | 1920 | "INSERT INTO attachment(attachid, mtime, src, target," |
| 1917 | - "filename, comment, user)" | |
| 1921 | + "filename, comment, user)" | |
| 1918 | 1922 | "VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);", |
| 1919 | 1923 | rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName, |
| 1920 | 1924 | (p->zComment ? p->zComment : ""), p->zUser |
| 1921 | 1925 | ); |
| 1922 | 1926 | db_multi_exec( |
| @@ -1925,45 +1929,35 @@ | ||
| 1925 | 1929 | " WHERE target=%Q AND filename=%Q))" |
| 1926 | 1930 | " WHERE target=%Q AND filename=%Q", |
| 1927 | 1931 | p->zAttachTarget, p->zAttachName, |
| 1928 | 1932 | p->zAttachTarget, p->zAttachName |
| 1929 | 1933 | ); |
| 1930 | - if( strlen(p->zAttachTarget)!=UUID_SIZE | |
| 1931 | - || !validate16(p->zAttachTarget, UUID_SIZE) | |
| 1932 | - ){ | |
| 1933 | - char *zComment; | |
| 1934 | - if( p->zAttachSrc && p->zAttachSrc[0] ){ | |
| 1934 | + if( 'w' == attachToType ){ | |
| 1935 | + if( isAdd ){ | |
| 1935 | 1936 | zComment = mprintf( |
| 1936 | 1937 | "Add attachment [/artifact/%s|%h] to wiki page [%h]", |
| 1937 | 1938 | p->zAttachSrc, p->zAttachName, p->zAttachTarget); |
| 1938 | 1939 | }else{ |
| 1939 | 1940 | zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]", |
| 1940 | 1941 | p->zAttachName, p->zAttachTarget); |
| 1941 | 1942 | } |
| 1942 | - db_multi_exec( | |
| 1943 | - "REPLACE INTO event(type,mtime,objid,user,comment)" | |
| 1944 | - "VALUES('w',%.17g,%d,%Q,%Q)", | |
| 1945 | - p->rDate, rid, p->zUser, zComment | |
| 1946 | - ); | |
| 1947 | - free(zComment); | |
| 1948 | 1943 | }else{ |
| 1949 | - char *zComment; | |
| 1950 | - if( p->zAttachSrc && p->zAttachSrc[0] ){ | |
| 1944 | + if( isAdd ){ | |
| 1951 | 1945 | zComment = mprintf( |
| 1952 | 1946 | "Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]", |
| 1953 | 1947 | p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1954 | 1948 | }else{ |
| 1955 | 1949 | zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]", |
| 1956 | 1950 | p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1957 | 1951 | } |
| 1958 | - db_multi_exec( | |
| 1952 | + } | |
| 1953 | + db_multi_exec( | |
| 1959 | 1954 | "REPLACE INTO event(type,mtime,objid,user,comment)" |
| 1960 | - "VALUES('t',%.17g,%d,%Q,%Q)", | |
| 1961 | - p->rDate, rid, p->zUser, zComment | |
| 1962 | - ); | |
| 1963 | - free(zComment); | |
| 1964 | - } | |
| 1955 | + "VALUES('%c',%.17g,%d,%Q,%Q)", | |
| 1956 | + attachToType, p->rDate, rid, p->zUser, zComment | |
| 1957 | + ); | |
| 1958 | + fossil_free(zComment); | |
| 1965 | 1959 | } |
| 1966 | 1960 | if( p->type==CFTYPE_CONTROL ){ |
| 1967 | 1961 | Blob comment; |
| 1968 | 1962 | int i; |
| 1969 | 1963 | const char *zName; |
| 1970 | 1964 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -135,16 +135,16 @@ | |
| 135 | ** Clear the memory allocated in a manifest object |
| 136 | */ |
| 137 | void manifest_destroy(Manifest *p){ |
| 138 | if( p ){ |
| 139 | blob_reset(&p->content); |
| 140 | free(p->aFile); |
| 141 | free(p->azParent); |
| 142 | free(p->azCChild); |
| 143 | free(p->aTag); |
| 144 | free(p->aField); |
| 145 | free(p->aCherrypick); |
| 146 | if( p->pBaseline ) manifest_destroy(p->pBaseline); |
| 147 | memset(p, 0, sizeof(*p)); |
| 148 | fossil_free(p); |
| 149 | } |
| 150 | } |
| @@ -1608,11 +1608,11 @@ | |
| 1608 | blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with " |
| 1609 | "%d other change%s", |
| 1610 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus, |
| 1611 | pManifest->nField, pManifest->nField==1 ? "" : "s" |
| 1612 | ); |
| 1613 | free(zNewStatus); |
| 1614 | blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s", |
| 1615 | pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField, |
| 1616 | pManifest->nField==1 ? "" : "s" |
| 1617 | ); |
| 1618 | } |
| @@ -1621,11 +1621,11 @@ | |
| 1621 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle |
| 1622 | ); |
| 1623 | blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid, |
| 1624 | pManifest->zTicketUuid); |
| 1625 | } |
| 1626 | free(zTitle); |
| 1627 | db_multi_exec( |
| 1628 | "REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)" |
| 1629 | "VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)", |
| 1630 | tktTagId, pManifest->rDate, rid, pManifest->zUser, |
| 1631 | blob_str(&comment), blob_str(&brief) |
| @@ -1753,11 +1753,11 @@ | |
| 1753 | TAG_COMMENT, rid, p->rDate |
| 1754 | ); |
| 1755 | zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event" |
| 1756 | " WHERE rowid=last_insert_rowid()"); |
| 1757 | wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE); |
| 1758 | free(zCom); |
| 1759 | |
| 1760 | /* If this is a delta-manifest, record the fact that this repository |
| 1761 | ** contains delta manifests, to free the "commit" logic to generate |
| 1762 | ** new delta manifests. |
| 1763 | */ |
| @@ -1822,11 +1822,11 @@ | |
| 1822 | char zLength[40]; |
| 1823 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1824 | nWiki = strlen(p->zWiki); |
| 1825 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1826 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1827 | free(zTag); |
| 1828 | prior = db_int(0, |
| 1829 | "SELECT rid FROM tagxref" |
| 1830 | " WHERE tagid=%d AND mtime<%.17g" |
| 1831 | " ORDER BY mtime DESC", |
| 1832 | tagid, p->rDate |
| @@ -1850,11 +1850,11 @@ | |
| 1850 | TAG_BGCOLOR, rid, |
| 1851 | TAG_BGCOLOR, rid, |
| 1852 | TAG_USER, rid, |
| 1853 | TAG_COMMENT, rid |
| 1854 | ); |
| 1855 | free(zComment); |
| 1856 | } |
| 1857 | if( p->type==CFTYPE_EVENT ){ |
| 1858 | char *zTag = mprintf("event-%s", p->zEventId); |
| 1859 | int tagid = tag_findid(zTag, 1); |
| 1860 | int prior, subsequent; |
| @@ -1862,11 +1862,11 @@ | |
| 1862 | char zLength[40]; |
| 1863 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1864 | nWiki = strlen(p->zWiki); |
| 1865 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1866 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1867 | free(zTag); |
| 1868 | prior = db_int(0, |
| 1869 | "SELECT rid FROM tagxref" |
| 1870 | " WHERE tagid=%d AND mtime<%.17g AND rid!=%d" |
| 1871 | " ORDER BY mtime DESC", |
| 1872 | tagid, p->rDate, rid |
| @@ -1901,22 +1901,26 @@ | |
| 1901 | ); |
| 1902 | } |
| 1903 | } |
| 1904 | if( p->type==CFTYPE_TICKET ){ |
| 1905 | char *zTag; |
| 1906 | |
| 1907 | assert( manifest_crosslink_busy==1 ); |
| 1908 | zTag = mprintf("tkt-%s", p->zTicketUuid); |
| 1909 | tag_insert(zTag, 1, 0, rid, p->rDate, rid); |
| 1910 | free(zTag); |
| 1911 | db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)", |
| 1912 | p->zTicketUuid); |
| 1913 | } |
| 1914 | if( p->type==CFTYPE_ATTACHMENT ){ |
| 1915 | db_multi_exec( |
| 1916 | "INSERT INTO attachment(attachid, mtime, src, target," |
| 1917 | "filename, comment, user)" |
| 1918 | "VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);", |
| 1919 | rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName, |
| 1920 | (p->zComment ? p->zComment : ""), p->zUser |
| 1921 | ); |
| 1922 | db_multi_exec( |
| @@ -1925,45 +1929,35 @@ | |
| 1925 | " WHERE target=%Q AND filename=%Q))" |
| 1926 | " WHERE target=%Q AND filename=%Q", |
| 1927 | p->zAttachTarget, p->zAttachName, |
| 1928 | p->zAttachTarget, p->zAttachName |
| 1929 | ); |
| 1930 | if( strlen(p->zAttachTarget)!=UUID_SIZE |
| 1931 | || !validate16(p->zAttachTarget, UUID_SIZE) |
| 1932 | ){ |
| 1933 | char *zComment; |
| 1934 | if( p->zAttachSrc && p->zAttachSrc[0] ){ |
| 1935 | zComment = mprintf( |
| 1936 | "Add attachment [/artifact/%s|%h] to wiki page [%h]", |
| 1937 | p->zAttachSrc, p->zAttachName, p->zAttachTarget); |
| 1938 | }else{ |
| 1939 | zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]", |
| 1940 | p->zAttachName, p->zAttachTarget); |
| 1941 | } |
| 1942 | db_multi_exec( |
| 1943 | "REPLACE INTO event(type,mtime,objid,user,comment)" |
| 1944 | "VALUES('w',%.17g,%d,%Q,%Q)", |
| 1945 | p->rDate, rid, p->zUser, zComment |
| 1946 | ); |
| 1947 | free(zComment); |
| 1948 | }else{ |
| 1949 | char *zComment; |
| 1950 | if( p->zAttachSrc && p->zAttachSrc[0] ){ |
| 1951 | zComment = mprintf( |
| 1952 | "Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]", |
| 1953 | p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1954 | }else{ |
| 1955 | zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]", |
| 1956 | p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1957 | } |
| 1958 | db_multi_exec( |
| 1959 | "REPLACE INTO event(type,mtime,objid,user,comment)" |
| 1960 | "VALUES('t',%.17g,%d,%Q,%Q)", |
| 1961 | p->rDate, rid, p->zUser, zComment |
| 1962 | ); |
| 1963 | free(zComment); |
| 1964 | } |
| 1965 | } |
| 1966 | if( p->type==CFTYPE_CONTROL ){ |
| 1967 | Blob comment; |
| 1968 | int i; |
| 1969 | const char *zName; |
| 1970 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -135,16 +135,16 @@ | |
| 135 | ** Clear the memory allocated in a manifest object |
| 136 | */ |
| 137 | void manifest_destroy(Manifest *p){ |
| 138 | if( p ){ |
| 139 | blob_reset(&p->content); |
| 140 | fossil_free(p->aFile); |
| 141 | fossil_free(p->azParent); |
| 142 | fossil_free(p->azCChild); |
| 143 | fossil_free(p->aTag); |
| 144 | fossil_free(p->aField); |
| 145 | fossil_free(p->aCherrypick); |
| 146 | if( p->pBaseline ) manifest_destroy(p->pBaseline); |
| 147 | memset(p, 0, sizeof(*p)); |
| 148 | fossil_free(p); |
| 149 | } |
| 150 | } |
| @@ -1608,11 +1608,11 @@ | |
| 1608 | blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with " |
| 1609 | "%d other change%s", |
| 1610 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus, |
| 1611 | pManifest->nField, pManifest->nField==1 ? "" : "s" |
| 1612 | ); |
| 1613 | fossil_free(zNewStatus); |
| 1614 | blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s", |
| 1615 | pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField, |
| 1616 | pManifest->nField==1 ? "" : "s" |
| 1617 | ); |
| 1618 | } |
| @@ -1621,11 +1621,11 @@ | |
| 1621 | pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle |
| 1622 | ); |
| 1623 | blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid, |
| 1624 | pManifest->zTicketUuid); |
| 1625 | } |
| 1626 | fossil_free(zTitle); |
| 1627 | db_multi_exec( |
| 1628 | "REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)" |
| 1629 | "VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)", |
| 1630 | tktTagId, pManifest->rDate, rid, pManifest->zUser, |
| 1631 | blob_str(&comment), blob_str(&brief) |
| @@ -1753,11 +1753,11 @@ | |
| 1753 | TAG_COMMENT, rid, p->rDate |
| 1754 | ); |
| 1755 | zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event" |
| 1756 | " WHERE rowid=last_insert_rowid()"); |
| 1757 | wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE); |
| 1758 | fossil_free(zCom); |
| 1759 | |
| 1760 | /* If this is a delta-manifest, record the fact that this repository |
| 1761 | ** contains delta manifests, to free the "commit" logic to generate |
| 1762 | ** new delta manifests. |
| 1763 | */ |
| @@ -1822,11 +1822,11 @@ | |
| 1822 | char zLength[40]; |
| 1823 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1824 | nWiki = strlen(p->zWiki); |
| 1825 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1826 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1827 | fossil_free(zTag); |
| 1828 | prior = db_int(0, |
| 1829 | "SELECT rid FROM tagxref" |
| 1830 | " WHERE tagid=%d AND mtime<%.17g" |
| 1831 | " ORDER BY mtime DESC", |
| 1832 | tagid, p->rDate |
| @@ -1850,11 +1850,11 @@ | |
| 1850 | TAG_BGCOLOR, rid, |
| 1851 | TAG_BGCOLOR, rid, |
| 1852 | TAG_USER, rid, |
| 1853 | TAG_COMMENT, rid |
| 1854 | ); |
| 1855 | fossil_free(zComment); |
| 1856 | } |
| 1857 | if( p->type==CFTYPE_EVENT ){ |
| 1858 | char *zTag = mprintf("event-%s", p->zEventId); |
| 1859 | int tagid = tag_findid(zTag, 1); |
| 1860 | int prior, subsequent; |
| @@ -1862,11 +1862,11 @@ | |
| 1862 | char zLength[40]; |
| 1863 | while( fossil_isspace(p->zWiki[0]) ) p->zWiki++; |
| 1864 | nWiki = strlen(p->zWiki); |
| 1865 | sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki); |
| 1866 | tag_insert(zTag, 1, zLength, rid, p->rDate, rid); |
| 1867 | fossil_free(zTag); |
| 1868 | prior = db_int(0, |
| 1869 | "SELECT rid FROM tagxref" |
| 1870 | " WHERE tagid=%d AND mtime<%.17g AND rid!=%d" |
| 1871 | " ORDER BY mtime DESC", |
| 1872 | tagid, p->rDate, rid |
| @@ -1901,22 +1901,26 @@ | |
| 1901 | ); |
| 1902 | } |
| 1903 | } |
| 1904 | if( p->type==CFTYPE_TICKET ){ |
| 1905 | char *zTag; |
| 1906 | assert( manifest_crosslink_busy==1 ); |
| 1907 | zTag = mprintf("tkt-%s", p->zTicketUuid); |
| 1908 | tag_insert(zTag, 1, 0, rid, p->rDate, rid); |
| 1909 | fossil_free(zTag); |
| 1910 | db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)", |
| 1911 | p->zTicketUuid); |
| 1912 | } |
| 1913 | if( p->type==CFTYPE_ATTACHMENT ){ |
| 1914 | char *zComment = 0; |
| 1915 | char const isAdd = (p->zAttachSrc && p->zAttachSrc[0]) ? 1 : 0; |
| 1916 | char const attachToType = fossil_is_uuid(p->zAttachTarget) |
| 1917 | ? 't' /* attach to ticket */ |
| 1918 | : 'w' /* attach to wiki page */; |
| 1919 | db_multi_exec( |
| 1920 | "INSERT INTO attachment(attachid, mtime, src, target," |
| 1921 | "filename, comment, user)" |
| 1922 | "VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);", |
| 1923 | rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName, |
| 1924 | (p->zComment ? p->zComment : ""), p->zUser |
| 1925 | ); |
| 1926 | db_multi_exec( |
| @@ -1925,45 +1929,35 @@ | |
| 1929 | " WHERE target=%Q AND filename=%Q))" |
| 1930 | " WHERE target=%Q AND filename=%Q", |
| 1931 | p->zAttachTarget, p->zAttachName, |
| 1932 | p->zAttachTarget, p->zAttachName |
| 1933 | ); |
| 1934 | if( 'w' == attachToType ){ |
| 1935 | if( isAdd ){ |
| 1936 | zComment = mprintf( |
| 1937 | "Add attachment [/artifact/%s|%h] to wiki page [%h]", |
| 1938 | p->zAttachSrc, p->zAttachName, p->zAttachTarget); |
| 1939 | }else{ |
| 1940 | zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]", |
| 1941 | p->zAttachName, p->zAttachTarget); |
| 1942 | } |
| 1943 | }else{ |
| 1944 | if( isAdd ){ |
| 1945 | zComment = mprintf( |
| 1946 | "Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]", |
| 1947 | p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1948 | }else{ |
| 1949 | zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]", |
| 1950 | p->zAttachName, p->zAttachTarget, p->zAttachTarget); |
| 1951 | } |
| 1952 | } |
| 1953 | db_multi_exec( |
| 1954 | "REPLACE INTO event(type,mtime,objid,user,comment)" |
| 1955 | "VALUES('%c',%.17g,%d,%Q,%Q)", |
| 1956 | attachToType, p->rDate, rid, p->zUser, zComment |
| 1957 | ); |
| 1958 | fossil_free(zComment); |
| 1959 | } |
| 1960 | if( p->type==CFTYPE_CONTROL ){ |
| 1961 | Blob comment; |
| 1962 | int i; |
| 1963 | const char *zName; |
| 1964 |
+10
| --- src/util.c | ||
| +++ src/util.c | ||
| @@ -312,5 +312,15 @@ | ||
| 312 | 312 | return 1; |
| 313 | 313 | #else |
| 314 | 314 | return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF; |
| 315 | 315 | #endif |
| 316 | 316 | } |
| 317 | + | |
| 318 | +/* | |
| 319 | +** Returns TRUE if zSym is exactly UUID_SIZE bytes long and contains | |
| 320 | +** only lower-case ASCII hexadecimal values. | |
| 321 | +*/ | |
| 322 | +int fossil_is_uuid(char const * zSym){ | |
| 323 | + return zSym | |
| 324 | + && (UUID_SIZE==strlen(zSym)) | |
| 325 | + && validate16(zSym, UUID_SIZE); | |
| 326 | +} | |
| 317 | 327 |
| --- src/util.c | |
| +++ src/util.c | |
| @@ -312,5 +312,15 @@ | |
| 312 | return 1; |
| 313 | #else |
| 314 | return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF; |
| 315 | #endif |
| 316 | } |
| 317 |
| --- src/util.c | |
| +++ src/util.c | |
| @@ -312,5 +312,15 @@ | |
| 312 | return 1; |
| 313 | #else |
| 314 | return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF; |
| 315 | #endif |
| 316 | } |
| 317 | |
| 318 | /* |
| 319 | ** Returns TRUE if zSym is exactly UUID_SIZE bytes long and contains |
| 320 | ** only lower-case ASCII hexadecimal values. |
| 321 | */ |
| 322 | int fossil_is_uuid(char const * zSym){ |
| 323 | return zSym |
| 324 | && (UUID_SIZE==strlen(zSym)) |
| 325 | && validate16(zSym, UUID_SIZE); |
| 326 | } |
| 327 |