parsav  Diff

Differences From Artifact [fc1c52be55]:

To Artifact [cb3e1743a5]:


   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   	): {}