| Index: experimental/webtry/DESIGN.md
|
| diff --git a/experimental/webtry/DESIGN.md b/experimental/webtry/DESIGN.md
|
| index 0bc214512833beb6c84a2f0c6fc416ccd45d0a44..4c0cee277af5e989d8cc9fc19e261d49194d1541 100644
|
| --- a/experimental/webtry/DESIGN.md
|
| +++ b/experimental/webtry/DESIGN.md
|
| @@ -133,34 +133,51 @@ Initial setup of the database, the user, and the only table:
|
| CREATE DATABASE webtry;
|
| USE webtry;
|
| CREATE USER 'webtry'@'%' IDENTIFIED BY '<password is in valentine>';
|
| - GRANT SELECT, INSERT, UPDATE ON webtry.webtry TO 'webtry'@'%';
|
| - GRANT SELECT, INSERT, UPDATE ON webtry.workspace TO 'webtry'@'%';
|
| - GRANT SELECT, INSERT, UPDATE ON webtry.workspacetry TO 'webtry'@'%';
|
| + GRANT SELECT, INSERT, UPDATE ON webtry.webtry TO 'webtry'@'%';
|
| + GRANT SELECT, INSERT, UPDATE ON webtry.workspace TO 'webtry'@'%';
|
| + GRANT SELECT, INSERT, UPDATE ON webtry.workspacetry TO 'webtry'@'%';
|
| + GRANT SELECT, INSERT, UPDATE ON webtry.source_images TO 'webtry'@'%';
|
|
|
| // If this gets changed also update the sqlite create statement in webtry.go.
|
|
|
| CREATE TABLE webtry (
|
| - code TEXT DEFAULT '' NOT NULL,
|
| - create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| - hash CHAR(64) DEFAULT '' NOT NULL,
|
| - PRIMARY KEY(hash)
|
| + code TEXT DEFAULT '' NOT NULL,
|
| + create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| + hash CHAR(64) DEFAULT '' NOT NULL,
|
| + source_image_id INTEGER DEFAULT 0 NOT NULL,
|
| + PRIMARY KEY(hash),
|
| +
|
| + FOREIGN KEY (source) REFERENCES sources(id)
|
| );
|
|
|
| CREATE TABLE workspace (
|
| name CHAR(64) DEFAULT '' NOT NULL,
|
| create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| - PRIMARY KEY(name)
|
| + PRIMARY KEY(name),
|
| );
|
|
|
| CREATE TABLE workspacetry (
|
| - name CHAR(64) DEFAULT '' NOT NULL,
|
| - create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| - hash CHAR(64) DEFAULT '' NOT NULL,
|
| - hidden INTEGER DEFAULT 0 NOT NULL,
|
| + name CHAR(64) DEFAULT '' NOT NULL,
|
| + create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| + hash CHAR(64) DEFAULT '' NOT NULL,
|
| + source_image_id INTEGER DEFAULT 0 NOT NULL,
|
| + hidden INTEGER DEFAULT 0 NOT NULL,
|
|
|
| - FOREIGN KEY (name) REFERENCES workspace(name)
|
| + FOREIGN KEY (name) REFERENCES workspace(name),
|
| );
|
|
|
| + CREATE TABLE source_images (
|
| + id INTEGER PRIMARY KEY NOT NULL,
|
| + image MEDIUMBLOB DEFAULT '' NOT NULL, -- Stored as PNG.
|
| + width INTEGER DEFAULT 0 NOT NULL,
|
| + height INTEGER DEFAULT 0 NOT NULL,
|
| + create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
| + hidden INTEGER DEFAULT 0 NOT NULL
|
| + );
|
| +
|
| + ALTER TABLE webtry ADD COLUMN source_image_id INTEGER DEFAULT 0 NOT NULL AFTER hash;
|
| + ALTER TABLE workspacetry ADD COLUMN source_image_id INTEGER DEFAULT 0 NOT NULL AFTER hash;
|
| +
|
| Common queries webtry.go will use:
|
|
|
| INSERT INTO webtry (code, hash) VALUES('int i = 0;...', 'abcdef...');
|
| @@ -183,6 +200,10 @@ Common queries for workspaces:
|
|
|
| SELECT name FROM workspace GROUP BY name;
|
|
|
| +Common queries for sources:
|
| +
|
| + SELECT id, image, width, height, create_ts FROM source_images ORDER BY create_ts DESC LIMIT 100;
|
| +
|
| Password for the database will be stored in the metadata instance, if the
|
| metadata server can't be found, i.e. running locally, then a local sqlite
|
| database will be used. To see the current password stored in metadata and the
|
| @@ -202,6 +223,29 @@ the metadata server:
|
| N.B. If you need to change the MySQL password that webtry uses, you must change
|
| it both in MySQL and the value stored in the metadata server.
|
|
|
| +Source Images
|
| +-------------
|
| +
|
| +For every try the user can select an optional source image to use as an input.
|
| +The id of the source image is just an integer and is stored in the database
|
| +along with the other try information, such as the code.
|
| +
|
| +The actual image itself is also stored in a separate table, 'sources', in the
|
| +database. On startup we check that all the images are available in 'inout',
|
| +and write out the images if not. Since they are all written to 'inout' we can
|
| +use the same /i/ image handler to serve them.
|
| +
|
| +When a user uploads an image it is decoded and converted to PNG and stored
|
| +as a binary blob in the database.
|
| +
|
| +The bitmap is available to user code as a module level variable:
|
| +
|
| + SkBitmap source;
|
| +
|
| +The bitmap is read, decoded and stored in source before the seccomp jail is
|
| +instantiated.
|
| +
|
| +
|
| Squid
|
| -----
|
|
|
|
|