)
;
+create view filerefs as
+select F.hash,
+count(PF.hash) + count(S.hash) + count(EL.file) + count(N.file) as refcount
+from files F
+left join packagefiles PF on PF.hash = F.hash
+left join scripts S on S.hash = F.hash
+left join elflibraries EL on EL.file = F.hash
+left join notes N on N.file = F.hash
+group by F.hash
+;
+
-- information about packages
-- a package is identified by a package,version,release triple
create table packages (
release integer,
path text, -- filesystem path
- mode text not null, -- perms, use text for octal rep?
- username text not null, -- name of owner
- groupname text not null, -- group of owner
+ mode text not null default '0644', -- perms, use text for octal rep?
+ username text not null default 'root', -- name of owner
+ groupname text not null default 'root', -- group of owner
uid integer, -- numeric uid, generally ignored
gid integer, -- numeric gid, generally ignored
configuration integer not null default 0, -- boolean if config file
end
;
+create trigger packagefiles_delete_trigger instead of
+delete on packagefiles_pkgid
+begin
+ delete from packagefiles
+ where package = OLD.package
+ and version = OLD.version
+ and release = OLD.release
+ and path = OLD.path
+ ;
+ update packages set hash = null
+ where package = OLD.package
+ and version = OLD.version
+ and release = OLD.release
+ ;
+end
+;
+
create view installed_ref_count as
select I.path, count(*) as refcount
from installedfiles I
where status = 'installed'
;
-create view install_status as
-
-select 'new' as op, PN.*
-from packagefiles_status PN
-left join installed_ref_count RC on RC.path = PN.path
-where RC.refcount is null
-and PN.status = 'installing'
-
-union all
-
-select 'update' as op, PN.*
-from packagefiles_status PN
-inner join installedfiles PI on PI.path = PN.path and PI.package = PN.package
-left join installed_ref_count RC on RC.path = PN.path
-where RC.refcount = 1
-and PN.status = 'installing'
-and PI.hash is not PN.hash
-
-union all
-
-select 'conflict' as op, PI.*
-from packagefiles_status PN
-inner join installedfiles PI on PI.path = PN.path and PI.package != PN.package
-where PN.status = 'installing'
-
-union all
-select 'remove' as op, PI.*
-from installedfiles PI
-left join packagefiles_status PN
- on PI.path = PN.path and PI.package = PN.package
- and PI.pkgid != PN.pkgid
-where PN.path is null
-and PI.package in (select package from packages where status = 'installing')
-
-union all
--- remove files in removing, but not installing
-select distinct 'remove' as op, PR.*
-from packagefiles_status PR
-left join packagefiles_status PN
-on PR.path = PN.path
-and PR.pkgid != PN.pkgid and PN.status in ('installing', 'installed')
-where PN.path is null
-and PR.status = 'removing'
-;
-
create table pathtags (
-- package id triple
package text,
)
without rowid
;
+create index elf_library_name_index on elflibraries(soname);
create table elfneeded (
- file text,
+ file text, -- hash of file
needed text, -- soname of dependency
primary key (file, needed)
)
priority integer not null default 1,
refreshed integer -- last refresh time
);
+-- force the url to be repourl/info.repo
+-- package urls repourl/pkgid.zpm
-- urls for downloading packages. possibly unneeded
create table repository_packages (
where path in (select path from md_conflict where mdcount > 1)
;
+create view needed_libraries as
+with recursive
+libs(file,needs,provider) as (
+ select N.file, N.needed as needs, L.file as provider
+ from elfneeded N left join elflibraries L on N.needed = L.soname
+ union
+ select L.file, N.needed as needs, EL.file as provider
+ from libs L
+ join elfneeded N on N.file = L.provider
+ left join elflibraries EL on N.needed = EL.soname
+)
+select * from libs;
+
create view syncinfo as
with
preserved as (
select distinct
SS.path,
SS.username, SS.uid, SS.groupname, SS.gid, SS.mode, SS.filetype,
- SS.mtime, SS.hash, SS.configuration, SS.target, SS.device,
+ SS.mtime, SS.hash,
+ SS.configuration + case when OS.configuration = 1 then 2 else 0 end
+ as configuration,
+ SS.target, SS.device,
OS.hash as ohash, SS.mds, OS.mds as omds
from syncstatus SS
join syncstatus OS
SS.rstatus in ('installing')
),
-- preserve: libraries needed by something in installed or installing
+/*
needed as (
select distinct
ED.library
where status in ('installed', 'installing')
and library is not null
),
+*/
+needed as (
+ select NL.file as needslib, NL.provider as libraryhash
+ from needed_libraries NL
+ inner join syncstatus SS on SS.hash = NL.file
+ and SS.status in ('installed', 'installing')
+),
preserve as (
select distinct
path,username,uid,groupname,gid,mode,filetype,mtime,hash,
configuration,target,device, null as ohash
from syncstatus SS
- where path in (select library from needed)
- and SS.rstatus in ('removing', 'removed')
+ join needed N on SS.hash = N.libraryhash
+ where SS.rstatus in ('removing', 'removed')
+-- where SS.hash in (select libraryhash from needed)
+-- where path in (select library from needed)
+-- and SS.rstatus in ('removing', 'removed')
),
-- remove: cur, not preserved, not in final set
remove as (