Differences From
Artifact [fc1c52be55]:
550 550 from parsav_artifact_claims as a where uid = $1::bigint and rid = $2::bigint
551 551 ]];
552 552 };
553 553 artifact_load = {
554 554 params = {uint64}, sql = [[
555 555 select content, mime from parsav_artifacts where id = $1::bigint
556 556 ]];
557 + };
558 + artifact_folder_enum = {
559 + params = {uint64}, sql = [[
560 + select distinct folder from parsav_artifact_claims where
561 + uid = $1::bigint and folder is not null
562 + order by folder
563 + ]];
557 564 };
558 565 post_attach_ctl_ins = {
559 566 params = {uint64, uint64}, cmd=true, sql = [[
560 567 update parsav_posts set
561 568 artifacts = artifacts || $2::bigint
562 569 where id = $1::bigint and not
563 570 artifacts @> array[$2::bigint] -- prevent duplication
................................................................................
826 833 lib.pq.PQclear(res)
827 834 return pqr {0, nil}
828 835 else
829 836 return pqr {ct, res}
830 837 end
831 838 end
832 839 end
840 +
841 +local terra row_to_artifact(res: &pqr, i: intptr): lib.mem.ptr(lib.store.artifact)
842 + var id = res:int(uint64,i,0)
843 + var idbuf: int8[lib.math.shorthand.maxlen]
844 + var idlen = lib.math.shorthand.gen(id, &idbuf[0])
845 + var desc = res:_string(i,2)
846 + var folder = res:_string(i,3)
847 + var mime = res:_string(i,4)
848 + var m = [ lib.str.encapsulate(lib.store.artifact, {
849 + desc = {`desc.ptr, `desc.ct + 1};
850 + folder = {`folder.ptr, `folder.ct + 1};
851 + mime = {`mime.ptr, `mime.ct + 1};
852 + url = {`&idbuf[0], `idlen + 1};
853 + }) ]
854 + m.ptr.rid = id
855 + return m
856 +end
833 857
834 858 local terra row_to_post(r: &pqr, row: intptr): lib.mem.ptr(lib.store.post)
835 859 var subj: rawstring, sblen: intptr
836 860 var cvhu: rawstring, cvhlen: intptr
837 861 if r:null(row,3)
838 862 then subj = nil sblen = 0
839 863 else subj = r:string(row,3) sblen = r:len(row,3)+1
................................................................................
1581 1605 uid: uint64,
1582 1606 folder: pstring
1583 1607 )
1584 1608 var res = queries.artifact_enum_uid.exec(src,uid,folder)
1585 1609 if res.sz > 0 then
1586 1610 var m = lib.mem.heapa([lib.mem.ptr(lib.store.artifact)], res.sz)
1587 1611 for i=0,res.sz do
1588 - var id = res:int(uint64,i,0)
1589 - var idbuf: int8[lib.math.shorthand.maxlen]
1590 - var idlen = lib.math.shorthand.gen(id, &idbuf[0])
1591 - var desc = res:_string(i,2)
1592 - var folder = res:_string(i,3)
1593 - var mime = res:_string(i,4)
1594 - m.ptr[i] = [ lib.str.encapsulate(lib.store.artifact, {
1595 - desc = {`desc.ptr, `desc.ct + 1};
1596 - folder = {`folder.ptr, `folder.ct + 1};
1597 - mime = {`mime.ptr, `mime.ct + 1};
1598 - url = {`&idbuf[0], `idlen + 1};
1599 - }) ]
1600 - m(i).ptr.rid = id
1612 + m.ptr[i] = row_to_artifact(&res, i)
1601 1613 m(i).ptr.owner = uid
1602 1614 end
1603 1615 return m
1604 1616 else return [lib.mem.lstptr(lib.store.artifact)].null() end
1605 1617 end];
1618 +
1619 + artifact_fetch = [terra(
1620 + src: &lib.store.source,
1621 + uid: uint64,
1622 + rid: uint64
1623 + )
1624 + var res = queries.artifact_fetch.exec(src,uid,rid)
1625 + if res.sz > 0 then
1626 + var a = row_to_artifact(&res, 0)
1627 + a.ptr.owner = uid
1628 + res:free()
1629 + return a
1630 + end
1631 + return [lib.mem.ptr(lib.store.artifact)].null()
1632 + end];
1606 1633
1607 1634 artifact_load = [terra(
1608 1635 src: &lib.store.source,
1609 1636 rid: uint64
1610 1637 ): {binblob, pstring}
1611 1638 var r = queries.artifact_load.exec(src,rid)
1612 1639 if r.sz == 0 then return binblob.null(), pstring.null() end
................................................................................
1615 1642 var mbin = r:bin(0,0)
1616 1643 var bin = lib.mem.heapa(uint8,mbin.ct)
1617 1644 lib.mem.cpy(bin.ptr, mbin.ptr, bin.ct)
1618 1645
1619 1646 r:free()
1620 1647 return bin, mime
1621 1648 end];
1649 +
1650 + artifact_folder_enum = [terra(
1651 + src: &lib.store.source,
1652 + uid: uint64
1653 + )
1654 + var r = queries.artifact_folder_enum.exec(src,uid)
1655 + if r.sz == 0 then return [lib.mem.ptr(pstring)].null() end
1656 + defer r:free()
1657 + var lst = lib.mem.heapa(pstring, r.sz)
1658 + for i=0,r.sz do lst.ptr[i] = r:String(i,0) end
1659 + return lst
1660 + end];
1622 1661
1623 1662 post_attach_ctl = [terra(
1624 1663 src: &lib.store.source,
1625 1664 post: uint64,
1626 1665 artifact: uint64,
1627 1666 detach: bool
1628 1667 ): {}