]> pd.if.org Git - zpackage/blobdiff - DATABASE
large commit of C work
[zpackage] / DATABASE
diff --git a/DATABASE b/DATABASE
new file mode 100644 (file)
index 0000000..d54da7b
--- /dev/null
+++ b/DATABASE
@@ -0,0 +1,140 @@
+Packages are sqlite databases
+
+get application id and userver
+
+Primitive operations:
+
+add blob to repo
+add path to repo
+associate path with package
+associate blob with path?
+extract blob to a path
+compare blob to filesystem path
+create package with info
+
+Extra primitives:
+
+record elf information about blob
+compress blob
+uncompress blob
+sign a package?  What are we verifying?
+
+Signatures
+----------
+
+things:
+
+files, just a table of file contents, hash to content,
+avoids redundancy.  possibly type? size? internal compression?
+blobs might make more sense as a name.
+
+package files: table of pathnames in a package, with metadata
+file hash, type (directory, file, symlink, etc), permissions,
+owner, group, acls?, config file, and package name...
+
+create table paths (
+       path    text,
+       mode    integer, -- perms, use text for octal rep?
+       hash    text, -- what should go here, null for dir
+       mtime   integer -- seconds since epoch, but allow finer?
+);
+
+create table packagefiles (
+       package text,
+       subpackage      text, -- libs, dev, client, server, whatever
+       path    text,
+       filetype        text -- e.g. config, etc?
+);
+
+-- TODO just elf information?
+create table libraries (
+       package text,
+       subpackage      text,
+       path    text,
+       soname  text
+);
+
+create table librarydeps (
+       package text,
+       subpackage      text,
+       path    text,
+       soname  text -- soname of dependency
+);
+
+-- package scripts: table of package, stage, file
+create table scripts (
+       package text,
+       subpackage      text,
+       hash    text
+);
+
+-- package dependencies: table of package, dependency, dep type (package, soname)
+create table packagedeps (
+       package text,
+       subpackage      text,
+       requires        text, -- package name
+       subreq  text, -- if requires only a sub package, probably most common for libs
+       minversion      text,
+       maxversion      text
+);
+
+-- capability labels
+create table provides (
+       package text,
+       subpackage      text,
+       label   text -- a capability label
+);
+
+create table requires (
+       package text,
+       subpackage      text,
+       label   text -- a capability label
+);
+
+create table packages (
+       package text,
+       version text, -- the upstream version string
+       release integer, -- the local release number
+       description     text,
+       architecture    text,
+       url     text,
+       licenses        text, -- hash of actual license?  need table for more than one?
+       packager        text,
+       build_date      integer,
+       install_date    integer
+);
+
+create table packagegroups (
+       package text,
+       group   text
+);
+
+packages: table of package info
+name, version, release,
+tied package?  i.e. another package/version/release this one goes with.
+
+Actual Package Install DB:
+--------------------------
+
+packages table:
+package, name, version, release, install ts, uninstall/upgrade ts
+
+contents table:
+from package files table in package, plus install info
+
+Installing a Package
+--------------------
+
+insert into DB.packages the package info from the .zpkg file, leave install date null
+extract the pre-install script and run it.  abort if exit failure
+insert into the contents table info from the ZP.packagefiles table
+for each file in the new contents, extract the file to a temporary location
+in the same directory, rename into place, update as installed
+for each file in the old contents, remove the file if it's not in the new contents
+delete the row from the contents table
+update the uninstall and install ts as a single transaction
+extract and run post-install script
+
+pre/post install scripts get arguments:
+package name, new version, new release, old version, old release
+old version/release only if upgrade.