Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

pase

Experimental case

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

pase

Experimental case developed using free pascal and Lazarus

About

This is an experiment on build up a general purpose c.a.s.e. [https://en.wikipedia.org/wiki/Computer-aided_software_engineering] useful to autogenerate (inheritable?) sources, technical and user documentation. Currently focused in data modeling, in embrional and experimental state: is not ready for production but ready for study and code :)

Graphic status

pascal
Data Model (automatic history tracking) 
  |
  +- User data type 
     |
     +- Technical documentation (to do)
     |
     +- RDBMS Implementation
        |
        +- Firebird SQL (work in progress)

To do

Improve nested templates Improve runtime type information detection

Example of use

Starting from a data model definition (eg. Employee)...

pascal
procedure CreateDiagramEmployee(Analysis: TPaseModel);
begin
  Analysis.Name:='Employee';
  Analysis.Caption:='Employee data model';
  Analysis.Release:='0.1';
pascal
// - - - - - - - - - - - - - - - - - -
// user data type
// - - - - - - - - - - - - - - - - - -
Analysis.AddUserType('ADDRESSLINE', 'SizedString', 30);
Analysis.AddUserType('BUDGET', 'Float', 12, 2)
   .SetDefaultValue(50000)
   .SetCheckValue('CHECK (VALUE > 10000 AND VALUE <= 2000000)');
Analysis.AddUserType('COUNTRYNAME', 'SizedString', 15);
Analysis.AddUserType('CUSTNO', 'Integer')
   .SetCheckValue('CHECK (VALUE > 1000)');
Analysis.AddUserType('DEPTNO', 'FixedString', 3)
   .SetCheckValue('CHECK (VALUE = ''000'' OR (VALUE > ''0'' AND VALUE <= ''999'') OR VALUE IS NULL)');
Analysis.AddUserType('EMPNO', 'Smallint');
Analysis.AddUserType('FIRSTNAME', 'SizedString', 15);
Analysis.AddUserType('JOBCODE', 'SizedString', 5)
   .SetCheckValue('CHECK (VALUE > ''99999'')');
Analysis.AddUserType('JOBGRADE', 'Smallint')
   .SetCheckValue('CHECK (VALUE BETWEEN 0 AND 6)');
Analysis.AddUserType('LASTNAME', 'SizedString', 20);
Analysis.AddUserType('PHONENUMBER', 'SizedString', 20);
Analysis.AddUserType('PONUMBER', 'FixedString', 8)
   .SetCheckValue('CHECK (VALUE STARTING WITH ''V'')')
   .HasFixedSize:=TRUE;
Analysis.AddUserType('PRODTYPE', 'SizedString', 12)
   .SetCheckValue('CHECK (VALUE IN (''software'', ''hardware'', ''other'', ''N/A''))')
   .SetDefaultValue('software')
   .SetRequired(True);
Analysis.AddUserType('PROJNO', 'FixedString', 5)
   .SetCheckValue('CHECK (VALUE = UPPER (VALUE))');
Analysis.AddUserType('SALARY', 'Float', 10, 2)
   .SetDefaultValue(0)
   .SetCheckValue('CHECK (VALUE > 0)');
pascal
end;

... and using this template...

pascal
CREATE DOMAIN {+Name+}
       AS {+BaseType [-pftSizedString=VARCHAR({<Size>})-]
                     [-pftFixedString=CHAR({<Size>})-]
                     [-pftInteger=integer-]
                     [-pftIntegerSmall=smallint-]
                     [-pftFloat=DECIMAL({<Size>},{<Decimal>})-]
           +}
       {+DefaultValue[-Format=DEFAULT {<DefaultValue>}-]+}
       {+IsRequired[-True=NOT NULL-][-False=-]+}
       {+CheckValue+}
       {+Collate+}
;

... pase will generate this SQL script

pascal
/*
 * =============================================
 * some info about this file
 * - - - - - - - - - - - - - - - - - - - - - - -
 * template: .../rdbms_firebird.sql
 * =============================================
*/
pascal
/* 
 * - - - - - - - - - - - - - - - - - - - - - - -
 * user data type 
 * - - - - - - - - - - - - - - - - - - - - - - -
*/
pascal
/* template: .../rdbms_firebird_datatype.sql */
pascal
CREATE DOMAIN ADDRESSLINE
       AS VARCHAR(30)
       COLLATE NONE
;
pascal
CREATE DOMAIN BUDGET
       AS DECIMAL(12,2)
       DEFAULT 50000
       CHECK (VALUE > 10000 AND VALUE <= 2000000)
;
pascal
CREATE DOMAIN COUNTRYNAME
       AS VARCHAR(15)
       COLLATE NONE
;
pascal
CREATE DOMAIN CUSTNO
       AS integer
       CHECK (VALUE > 1000)
;
pascal
CREATE DOMAIN DEPTNO
       AS CHAR(3)
       CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL)
       COLLATE NONE
;
pascal
CREATE DOMAIN EMPNO
       AS smallint
;
pascal
CREATE DOMAIN FIRSTNAME
       AS VARCHAR(15)
       COLLATE NONE
;
pascal
CREATE DOMAIN JOBCODE
       AS VARCHAR(5)
       CHECK (VALUE > '99999')
       COLLATE NONE
;
pascal
CREATE DOMAIN JOBGRADE
       AS smallint
       CHECK (VALUE BETWEEN 0 AND 6)
;
pascal
CREATE DOMAIN LASTNAME
       AS VARCHAR(20)
       COLLATE NONE
;
pascal
CREATE DOMAIN PHONENUMBER
       AS VARCHAR(20)
       COLLATE NONE
;
pascal
CREATE DOMAIN PONUMBER
       AS CHAR(8)
       CHECK (VALUE STARTING WITH 'V')
       COLLATE NONE
;
pascal
CREATE DOMAIN PRODTYPE
       AS VARCHAR(12)
       DEFAULT 'software'
       NOT NULL
       CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))
       COLLATE NONE
;
pascal
CREATE DOMAIN PROJNO
       AS CHAR(5)
       CHECK (VALUE = UPPER (VALUE))
       COLLATE NONE
;
pascal
CREATE DOMAIN SALARY
       AS DECIMAL(10,2)
       DEFAULT 0
       CHECK (VALUE > 0)
;

in the same time, we can query the history of data model, checking out when an update was made...

pascal
2017-06-29 09:12:5 Model      + TPaseModel    undefined             : undefined
2017-06-29 09:12:5 DataType   + TPaseDataType Unknown               : pftUnknown
2017-06-29 09:12:5 DataType   + TPaseDataType SizedString           : pftSizedString(-1)
2017-06-29 09:12:5 DataType   + TPaseDataType FixedString           : pftFixedString
2017-06-29 09:12:5 DataType   + TPaseDataType Integer               : pftInteger
2017-06-29 09:12:5 DataType   + TPaseDataType Smallint              : pftIntegerSmall
2017-06-29 09:12:5 DataType   + TPaseDataType Float                 : pftFloat(-1)
2017-06-29 09:12:5 DataType   + TPaseDataType String                : pftString
2017-06-29 09:12:5 DataType   + TPaseDataType Boolean               : pftBoolean
2017-06-29 09:12:5 Model      e TPaseModel    Employee              : Renamed: Employee
2017-06-29 09:12:5 Model      e TPaseModel    Release               : 0.1
2017-06-29 09:12:5 DataType   + TPaseDataType ADDRESSLINE           : pftSizedString(30)
2017-06-29 09:12:5 DataType   + TPaseDataType BUDGET                : pftFloat(12,2)
2017-06-29 09:12:5 DataType   e TPaseDataType BUDGET                : DEFAULT: 50000
2017-06-29 09:12:5 DataType   e TPaseDataType BUDGET                : CHECK (VALUE > 10000 AND VALUE <= 2000000)
2017-06-29 09:12:5 DataType   + TPaseDataType COUNTRYNAME           : pftSizedString(15)
2017-06-29 09:12:5 DataType   + TPaseDataType CUSTNO                : pftInteger
2017-06-29 09:12:5 DataType   e TPaseDataType CUSTNO                : CHECK (VALUE > 1000)
2017-06-29 09:12:5 DataType   + TPaseDataType DEPTNO                : pftFixedString
2017-06-29 09:12:5 DataType   e TPaseDataType DEPTNO                : CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL)
2017-06-29 09:12:5 DataType   + TPaseDataType EMPNO                 : pftIntegerSmall
2017-06-29 09:12:5 DataType   + TPaseDataType FIRSTNAME             : pftSizedString(15)
2017-06-29 09:12:5 DataType   + TPaseDataType JOBCODE               : pftSizedString(5)
2017-06-29 09:12:5 DataType   e TPaseDataType JOBCODE               : CHECK (VALUE > '99999')
2017-06-29 09:12:5 DataType   + TPaseDataType JOBGRADE              : pftIntegerSmall
2017-06-29 09:12:5 DataType   e TPaseDataType JOBGRADE              : CHECK (VALUE BETWEEN 0 AND 6)
2017-06-29 09:12:5 DataType   + TPaseDataType LASTNAME              : pftSizedString(20)
2017-06-29 09:12:5 DataType   + TPaseDataType PHONENUMBER           : pftSizedString(20)
2017-06-29 09:12:5 DataType   + TPaseDataType PONUMBER              : pftFixedString
2017-06-29 09:12:5 DataType   e TPaseDataType PONUMBER              : CHECK (VALUE STARTING WITH 'V')
2017-06-29 09:12:5 DataType   + TPaseDataType PRODTYPE              : pftSizedString(12)
2017-06-29 09:12:5 DataType   e TPaseDataType PRODTYPE              : CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))
2017-06-29 09:12:5 DataType   e TPaseDataType PRODTYPE              : DEFAULT: software
2017-06-29 09:12:5 DataType   + TPaseDataType PROJNO                : pftFixedString
2017-06-29 09:12:5 DataType   e TPaseDataType PROJNO                : CHECK (VALUE = UPPER (VALUE))
2017-06-29 09:12:5 DataType   + TPaseDataType SALARY                : pftFloat(10,2)
2017-06-29 09:12:5 DataType   e TPaseDataType SALARY                : DEFAULT: 0
2017-06-29 09:12:5 DataType   e TPaseDataType SALARY                : CHECK (VALUE > 0)
2017-06-29 09:12:5 Entity     + TPaseEntity   COUNTRY               : Caption=COUNTRY;
2017-06-29 09:12:5 Field      + TPaseField    COUNTRY               : Type=COUNTRYNAME;Caption=Country name;
2017-06-29 09:12:5 Field      + TPaseField    CURRENCY              : Type=SizedString[?];Caption=Currency name;
2017-06-29 09:12:5 Index      + TPaseIndex    INTEG_2               : Primary Key: COUNTRY