Select A Section home public service database mgr. data access data modeler site notes |
Currently In This Section AxleBase Operation Manual page 1 ( Please Scroll Down ) |
Section Pages summary description design limits notable tests shortcomings nomenclature operation |
__________________________________________________
( Document management is by John Ragan's CoreDoc.) __________________________________________________
__________________________________________________
Please read this preface.
Descriptions of 3 similar web pages.
AxleBase began life as "Empirical" computer science research. At a time when serious computer jobs were handled entirely by mainframe computers, the author wanted to know how far the lowly desktop computer hardware could be pushed by software engineering. As computer science, it was a decade of fun while his Creator allowed him to do that which was obviously impossible; i.e., the AxleBase project. Work on it stopped in 2015.
Surely, he thought, the billionaire software companies have eclipsed AxleBase, and nobody else is interested. Friends and aquaintences disagreed, and arqued that AxleBase is too sophisticated to be outclassed. So it is tentatively being revived by placing this Operation manual on the web site. Acquisition:
To discuss acquisition of the AxleBase technology, please contact
Description:
Manual Update:
System Coverage:
-- . --
__________________________________________________
. . . . . . . . . . . . . . . . . . Preface Chapter 1 . . . . . . . . Introduction . . . . . . . . . . The Instance . . . . . . . . 1 . General . . . . . . . . . . . . . . . . . . AxleBase Description . . . . . . . . . . . . . . . . . . Documentation Characterization . . . . . . . . . . . . . . . . . . Documentation Wordcount . . . . . . . . . . . . . . . . . . System Solidity . . . . . . . . . . . . . . . . . . System Security . . . . . . . . . . . . . . . . . . AxleBase System Testing . . . . . . . . . . . . . . . . . . Support For Mobility . . . . . . . . . . . . . . . . . . Operator Hints . . . . . . . . . . . . . . . . . . Design Objectives . . . . . . . . . . . . . . . . . . Installation Architectures . . . . . . . . . . . . . . . . . . Military Systems . . . . . . . . . . . . . . . . . . Interrupted Development . . . . . . . . . . . . . . . . . . Programming Interfaces . . . . . . . . . . . . . . . . . . Socket Programming . . . . . . . . . . . . . . . . . . ODBC Drivers . . . . . . . . . . . . . . . . . . System Identifiers . . . . . . . . . . . . . . . . . . AxleBase Design Limits . . . . . . . . . . . . . . . . . . Very Large . . . . . . . . 2 . System Installation . . . . . . . . . . . . . . . . . . Development Environment . . . . . . . . . . . . . . . . . . Production Environment . . . . . . . . 3 . GUI Front End . . . . . . . . 4 . Getting Started Chapter 2 . . . . . . . . Test And Demo Software . . . . . . . . 1 . GUI Test Host - AxHandle . . . . . . . . . . . . . . . . . . AxHandle Introduction . . . . . . . . . . . . . . . . . . AxHandle Assistance . . . . . . . . . . . . . . . . . . AxHandle Object Control . . . . . . . . . . . . . . . . . . Passing AxHandle Commands . . . . . . . . . . . . . . . . . . AxHandle Returns . . . . . . . . . . . . . . . . . . AxHandle Help . . . . . . . . . . . . . . . . . . AxHandle Stored Connection Strings . . . . . . . . . . . . . . . . . . AxHandle Demonstration Databases . . . . . . . . . . . . . . . . . . AxHandle VLDB Expansion . . . . . . . . . . . . . . . . . . Testing AxleBase . . . . . . . . . . . . . . . . . . AxHandle Continuous Cycling . . . . . . . . . . . . . . . . . . AxHandle Step By Step Operation . . . . . . . . 2 . Database Server - AxServer . . . . . . . . . . . . . . . . . . Description . . . . . . . . . . . . . . . . . . What It Is Not . . . . . . . . . . . . . . . . . . Step By Step Start . . . . . . . . . . . . . . . . . . SysLink Protocol . . . . . . . . 3 . Point-n-Click Query App - Axon . . . . . . . . . . . . . . . . . . Description Chapter 3 . . . . . . . . Embedding And Running AxleBase . . . . . . . . 1 . Designing and Coding . . . . . . . . . . . . . . . . . . Data Connectivity . . . . . . . . . . . . . . . . . . Indexing . . . . . . . . . . . . . . . . . . Remote Access And Paths . . . . . . . . . . . . . . . . . . Installation Design . . . . . . . . . . . . . . . . . . The Database Domain . . . . . . . . . . . . . . . . . . Concurrent Operations . . . . . . . . . . . . . . . . . . Coding Tips & Techniques . . . . . . . . . . . . . . . . . . Important Coding Note . . . . . . . . . . . . . . . . . . The AxleBase Interface . . . . . . . . . . . . . . . . . . Manager Object . . . . . . . . . . . . . . . . . . Data Vector Object . . . . . . . . . . . . . . . . . . Client Connection Protection . . . . . . . . . . . . . . . . . . Examples Visual Basic v. 6.0 sp. 5 . . . . . . . . . . . . . . . . . . Examples Microsoft Access . . . . . . . . . . . . . . . . . . Examples WinBatch . . . . . . . . 2 . System Lock Design . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . AxleBase Lock-Space Domains . . . . . . . . . . . . . . . . . . Concurrency Locking . . . . . . . . . . . . . . . . . . AxleBase Lock Granularity . . . . . . . . . . . . . . . . . . Lock Types . . . . . . . . 3 . Column-Data Types . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . Blob . . . . . . . . . . . . . . . . . . Boolean . . . . . . . . . . . . . . . . . . Date . . . . . . . . . . . . . . . . . . Datetime . . . . . . . . . . . . . . . . . . Datetimex . . . . . . . . . . . . . . . . . . Integer . . . . . . . . . . . . . . . . . . Numeric . . . . . . . . . . . . . . . . . . Serial . . . . . . . . . . . . . . . . . . String . . . . . . . . . . . . . . . . . . Time . . . . . . . . . . . . . . . . . . Timestamp . . . . . . . . . . . . . . . . . . Timex . . . . . . . . . . . . . . . . . . Mapping From Other Systems . . . . . . . . 4 . AxleBase Error Protocol . . . . . . . . . . . . . . . . . . Error Introduction . . . . . . . . . . . . . . . . . . Sub-System Shortcomings . . . . . . . . . . . . . . . . . . Error Message Format . . . . . . . . . . . . . . . . . . Show Exceptions . . . . . . . . . . . . . . . . . . Standard Error List . . . . . . . . 5 . Security . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . Additional Security . . . . . . . . . . . . . . . . . . Security Activation . . . . . . . . . . . . . . . . . . Visibility Of Stops . . . . . . . . . . . . . . . . . . Canonical Permeability . . . . . . . . . . . . . . . . . . The Architecture's Impact . . . . . . . . . . . . . . . . . . Passwords . . . . . . . . . . . . . . . . . . Granting Access . . . . . . . . . . . . . . . . . . Step-By-Step Turn On . . . . . . . . . . . . . . . . . . VPN (Virtual Private Network) . . . . . . . . 6 . High Audit Requirements . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . Structural Support . . . . . . . . . . . . . . . . . . Configurable Support . . . . . . . . . . . . . . . . . . Specialized System Columns . . . . . . . . . . . . . . . . . . Detrimental Factors . . . . . . . . 7 . System Function Compendiums . . . . . . . . . . . . . . . . . . System State Compendium . . . . . . . . . . . . . . . . . . Data Retrieval Tools Compendium . . . . . . . . . . . . . . . . . . Retrieval Protection Technology . . . . . . . . . . . . . . . . . . Security Tools Compendium Chapter 4 . . . . . . . A.P.I. Lexicon And Syntax . . . . . . . . 1 . Functions, Operators, And Extensions . . . . . . . . . . . . . . . . . . Limitations . . . . . . . . . . . . . . . . . . Commenting SQL Code . . . . . . . . . . . . . . . . . . Conditional Select Operator . . . . . . . . . . . . . . . . . . Appendix . . . . . . . . . . . . . . . . . . CacheReturn . . . . . . . . . . . . . . . . . . DateAdd . . . . . . . . . . . . . . . . . . DateConvert . . . . . . . . . . . . . . . . . . DateDiff . . . . . . . . . . . . . . . . . . DateFromSerial . . . . . . . . . . . . . . . . . . DateNow . . . . . . . . . . . . . . . . . . DateToSerial . . . . . . . . . . . . . . . . . . Delimiter Escape . . . . . . . . . . . . . . . . . . In . . . . . . . . . . . . . . . . . . IsDate . . . . . . . . . . . . . . . . . . IsTime . . . . . . . . . . . . . . . . . . Math Operators . . . . . . . . . . . . . . . . . . QueryId . . . . . . . . . . . . . . . . . . ReturnProtocol . . . . . . . . . . . . . . . . . . Row Clause In SQL . . . . . . . . . . . . . . . . . . Segment Clause In SQL . . . . . . . . . . . . . . . . . . SQL Summary Functions . . . . . . . . . . . . . . . . . . String . . . . . . . . . . . . . . . . . . Sys_Archive . . . . . . . . . . . . . . . . . . Test SQL . . . . . . . . . . . . . . . . . . Wildcard Characters . . . . . . . . . . . . . . . . . . Work Area . . . . . . . . 2 . The Interface Overview . . . . . . . . 3 . The AbstractInterface Object . . . . . . . . . . . . . . . . . . General Description . . . . . . . . . . . . . . . . . . UniCom Interface . . . . . . . . . . . . . . . . . . UniString Interface . . . . . . . . . . . . . . . . . . SysLink Interface . . . . . . . . . . . . . . . . . . SysLinkMsgMake . . . . . . . . . . . . . . . . . . SyslinkMsgSplit . . . . . . . . . . . . . . . . . . SyslinkSession Preceeding subjects are on this page. Operation Manual Page 1 Suceeding subjects are on Operation Manual Page 2 and Operation Manual Page 3 Selecting one will transfer you to that page. You will find links back to this page, or you can press {Alt Left Arrow} to return to previous text. . . . . . . . . 4 . The Manager Object . . . . . . . . . . . . . . . . . . Manager Introduction . . . . . . . . . . . . . . . . . . AbortJob . . . . . . . . . . . . . . . . . . ActivateObject . . . . . . . . . . . . . . . . . . AlterDatabaseAttribute . . . . . . . . . . . . . . . . . . AlterDomainAttribute . . . . . . . . . . . . . . . . . . AlterInstance . . . . . . . . . . . . . . . . . . AlterTable . . . . . . . . . . . . . . . . . . AlterTableAttribute . . . . . . . . . . . . . . . . . . Authenticate . . . . . . . . . . . . . . . . . . Backup . . . . . . . . . . . . . . . . . . ClearFailedQuery . . . . . . . . . . . . . . . . . . ClearLastError . . . . . . . . . . . . . . . . . . CloseDatabase . . . . . . . . . . . . . . . . . . ConnectionString . . . . . . . . . . . . . . . . . . CreateDatabase . . . . . . . . . . . . . . . . . . CreateIndex . . . . . . . . . . . . . . . . . . CreateJob . . . . . . . . . . . . . . . . . . CreateTable . . . . . . . . . . . . . . . . . . CreateView . . . . . . . . . . . . . . . . . . CreateVirtualTable . . . . . . . . . . . . . . . . . . Crypt (Encrypt and Decrypt) . . . . . . . . . . . . . . . . . . DataObjectCreate . . . . . . . . . . . . . . . . . . DataObjectDestroy . . . . . . . . . . . . . . . . . . DropDatabase . . . . . . . . . . . . . . . . . . DropDomain . . . . . . . . . . . . . . . . . . DropIndex . . . . . . . . . . . . . . . . . . DropJob . . . . . . . . . . . . . . . . . . DropTable . . . . . . . . . . . . . . . . . . Grant . . . . . . . . . . . . . . . . . . LockObject . . . . . . . . . . . . . . . . . . MoveObject . . . . . . . . . . . . . . . . . . NetworkScan . . . . . . . . . . . . . . . . . . OpenDatabase . . . . . . . . . . . . . . . . . . OpenDomain . . . . . . . . . . . . . . . . . . Purge . . . . . . . . . . . . . . . . . . RestoreBackup . . . . . . . . . . . . . . . . . . Revoke . . . . . . . . . . . . . . . . . . RunJob . . . . . . . . . . . . . . . . . . ScanSegments . . . . . . . . . . . . . . . . . . ShareDatabase . . . . . . . . . . . . . . . . . . ShareDomain . . . . . . . . . . . . . . . . . . ShowColumns . . . . . . . . . . . . . . . . . . ShowCopyright . . . . . . . . . . . . . . . . . . ShowCount . . . . . . . . . . . . . . . . . . ShowDatabase . . . . . . . . . . . . . . . . . . ShowDatabaseAttributes . . . . . . . . . . . . . . . . . . ShowDatabaseCatalogue . . . . . . . . . . . . . . . . . . ShowDomainAttributes . . . . . . . . . . . . . . . . . . ShowErrorList . . . . . . . . . . . . . . . . . . ShowHealth . . . . . . . . . . . . . . . . . . ShowHostAttributes . . . . . . . . . . . . . . . . . . ShowIndices . . . . . . . . . . . . . . . . . . ShowInstanceAttributes . . . . . . . . . . . . . . . . . . ShowInstanceID . . . . . . . . . . . . . . . . . . ShowJobs . . . . . . . . . . . . . . . . . . ShowJobState . . . . . . . . . . . . . . . . . . ShowLastError . . . . . . . . . . . . . . . . . . ShowLicense . . . . . . . . . . . . . . . . . . ShowLicenseGrant . . . . . . . . . . . . . . . . . . ShowLocks . . . . . . . . . . . . . . . . . . ShowLog . . . . . . . . . . . . . . . . . . ShowPermissions . . . . . . . . . . . . . . . . . . ShowRelease . . . . . . . . . . . . . . . . . . ShowReservedWordList . . . . . . . . . . . . . . . . . . ShowReturnProtocol . . . . . . . . . . . . . . . . . . ShowSegments . . . . . . . . . . . . . . . . . . ShowTable . . . . . . . . . . . . . . . . . . ShowTableAttributes . . . . . . . . . . . . . . . . . . ShowTables . . . . . . . . . . . . . . . . . . ShowTopology . . . . . . . . . . . . . . . . . . ShowVersion . . . . . . . . . . . . . . . . . . ShutDown . . . . . . . . . . . . . . . . . . TestMode . . . . . . . . . . . . . . . . . . TruncateLog . . . . . . . . . . . . . . . . . . WriteMap . . . . . . . . 5 . The Data Vector Object . . . . . . . . . . . . . . . . . . General Comments . . . . . . . . . . . . . . . . . . Table Name Precedence . . . . . . . . . . . . . . . . . . ColumnContents . . . . . . . . . . . . . . . . . . ColumnCount . . . . . . . . . . . . . . . . . . ColumnName . . . . . . . . . . . . . . . . . . ColumnStart . . . . . . . . . . . . . . . . . . ColumnType . . . . . . . . . . . . . . . . . . ColumnWidth . . . . . . . . . . . . . . . . . . CurrentTupleIndex . . . . . . . . . . . . . . . . . . ExecuteSQL . . . . . . . . . . . . . . . . . . . . . . . Delete . . . . . . . . . . . . . . . . . . . . . . . Insert . . . . . . . . . . . . . . . . . . . . . . . Insert Array . . . . . . . . . . . . . . . . . . . . . . . Select . . . . . . . . . . . . . . . . . . . . . . . Select Into . . . . . . . . . . . . . . . . . . . . . . . Truncate . . . . . . . . . . . . . . . . . . . . . . . Update . . . . . . . . . . . . . . . . . . . . . . . Super-System Extensions . . . . . . . . . . . . . . . . . . Export . . . . . . . . . . . . . . . . . . Import . . . . . . . . . . . . . . . . . . InternalNameGet . . . . . . . . . . . . . . . . . . InternalNameSet . . . . . . . . . . . . . . . . . . Move . . . . . . . . . . . . . . . . . . MoveFirst . . . . . . . . . . . . . . . . . . MoveLast . . . . . . . . . . . . . . . . . . MoveNext . . . . . . . . . . . . . . . . . . MovePrior . . . . . . . . . . . . . . . . . . ReturnCache . . . . . . . . . . . . . . . . . . ReturnDataSet . . . . . . . . . . . . . . . . . . ReturnDataStream . . . . . . . . . . . . . . . . . . SetVectorColumnSeparator . . . . . . . . . . . . . . . . . . SetVectorEncryption . . . . . . . . . . . . . . . . . . SetVectorReturnProtocol . . . . . . . . . . . . . . . . . . ShowDatasetAttributes . . . . . . . . . . . . . . . . . . ShowRowsChanged . . . . . . . . . . . . . . . . . . Tuple . . . . . . . . . . . . . . . . . . TupleCount ____________________________ Preceeding topics are on Operation Manual Page 1 and Operation Manual Page 2 Suceeding topics are on Operation Manual Page 3 Selecting one will transfer you to that page. You will find links back to this page, or you can press {Alt Left Arrow} to return to previous text. ____________________________ Chapter 5 . . . . . . . . Configuration . . . . . . . . 1 . Overview . . . . . . . . 2 . Manual Edits Of Attributes . . . . . . . . 3 . Configurable Attributes . . . . . . . . . . . . . . . . . . Audit Trail . . . . . . . . . . . . . . . . . . Axsys Enabled . . . . . . . . . . . . . . . . . . Backfill Segments . . . . . . . . . . . . . . . . . . Buffer Loader Size . . . . . . . . . . . . . . . . . . Buffer Size . . . . . . . . . . . . . . . . . . Cache Returns . . . . . . . . . . . . . . . . . . Column And Row Storage . . . . . . . . . . . . . . . . . . Comm Authenticate . . . . . . . . . . . . . . . . . . Comm Envelope Encrypt . . . . . . . . . . . . . . . . . . Comm Hide Error AxleBase . . . . . . . . . . . . . . . . . . Comm Hide Error In Server . . . . . . . . . . . . . . . . . . Comm Hide Error Syslink . . . . . . . . . . . . . . . . . . Comm Message Size Limit . . . . . . . . . . . . . . . . . . Comm Use Syslink . . . . . . . . . . . . . . . . . . Connection Limit . . . . . . . . . . . . . . . . . . Connection String . . . . . . . . . . . . . . . . . . Data Failover . . . . . . . . . . . . . . . . . . Data Failover By All . . . . . . . . . . . . . . . . . . Dataset Size Limit . . . . . . . . . . . . . . . . . . Default Database . . . . . . . . . . . . . . . . . . Deny DDL . . . . . . . . . . . . . . . . . . Deny SQL Updates . . . . . . . . . . . . . . . . . . Deny Table Scans . . . . . . . . . . . . . . . . . . Description . . . . . . . . . . . . . . . . . . Encrypt Inbound . . . . . . . . . . . . . . . . . . Encrypt Outbound . . . . . . . . . . . . . . . . . . Encryption Depth . . . . . . . . . . . . . . . . . . Export Column Separator . . . . . . . . . . . . . . . . . . Export Row Terminator . . . . . . . . . . . . . . . . . . Fail Open Toggle . . . . . . . . . . . . . . . . . . Hide Security Stops . . . . . . . . . . . . . . . . . . Lock . . . . . . . . . . . . . . . . . . Lock Timeout . . . . . . . . . . . . . . . . . . Log Toggle . . . . . . . . . . . . . . . . . . Log Auto Truncate . . . . . . . . . . . . . . . . . . Log Size Max . . . . . . . . . . . . . . . . . . Make String . . . . . . . . . . . . . . . . . . Name Alias . . . . . . . . . . . . . . . . . . Node Sleep . . . . . . . . . . . . . . . . . . Null Token . . . . . . . . . . . . . . . . . . Password . . . . . . . . . . . . . . . . . . Pointer Load Limit . . . . . . . . . . . . . . . . . . Return Protocol . . . . . . . . . . . . . . . . . . Segment Size . . . . . . . . . . . . . . . . . . Shared Database . . . . . . . . . . . . . . . . . . Shared Table . . . . . . . . . . . . . . . . . . Source Type . . . . . . . . . . . . . . . . . . Spinlock . . . . . . . . . . . . . . . . . . SPT Limit . . . . . . . . . . . . . . . . . . Statistics Toggle . . . . . . . . . . . . . . . . . . Storage Location . . . . . . . . . . . . . . . . . . Storage Space . . . . . . . . . . . . . . . . . . Timeout Connect . . . . . . . . . . . . . . . . . . Timeout Query . . . . . . . . . . . . . . . . . . Timeout Temp . . . . . . . . . . . . . . . . . . Time Zone . . . . . . . . . . . . . . . . . . Type Of Database . . . . . . . . . . . . . . . . . . Variable Delimiter . . . . . . . . . . . . . . . . . . VPN (Virtual Private Network) . . . . . . . . . . . . . . . . . . Wildcard Multiple . . . . . . . . . . . . . . . . . . Wildcard Single . . . . . . . . . . . . . . . . . . Yield Processor Chapter 6 . . . . . . . . Advanced Topics . . . . . . . . 1 . General . . . . . . . . . . . . . . . . . . General Topics . . . . . . . . . . . . . . . . . . Data Sampling . . . . . . . . . . . . . . . . . . Techniques And Hints . . . . . . . . . . . . . . . . . . Manual Changes . . . . . . . . 2 . Entity Segmentation . . . . . . . . . . . . . . . . . . Description . . . . . . . . . . . . . . . . . . Studies In Segmentation . . . . . . . . . . . . . . . . . . Segment Boundaries . . . . . . . . 3 . Table Dispersal . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . Dispersed Table Operations . . . . . . . . . . . . . . . . . . VLT Write Control Map . . . . . . . . . . . . . . . . . . After The Fact . . . . . . . . 4 . Virtual Tables . . . . . . . . . . . . . . . . . . General . . . . . . . . . . . . . . . . . . Altering Definitions . . . . . . . . 5 . Massive Imports . . . . . . . . 6 . Processing Errors . . . . . . . . 7 . Query Returns . . . . . . . . 8 . Data Object Design . . . . . . . . 9 . Indices Of Very Large Objects . . . . . . . . . . . . . . . . . . Storage Location . . . . . . . . . . . . . . . . . . Size Of Indices . . . . . . . . 10. Cognate Clusters . . . . . . . . . . . . . . . . . . Cognate Dirty Data Portal . . . . . . . . . . . . . . . . . . Cognate Fail From . . . . . . . . . . . . . . . . . . Cognate Fail To . . . . . . . . . . . . . . . . . . Cognate Feed From . . . . . . . . . . . . . . . . . . Cognate Feed To . . . . . . . . . . . . . . . . . . Cognate Flicker . . . . . . . . . . . . . . . . . . Cognate Mirror Of . . . . . . . . . . . . . . . . . . Cognate Mirror To . . . . . . . . 11. The Axsys Super-System . . . . . . . . . . . . . . . . . . Description . . . . . . . . . . . . . . . . . . What It Is Not . . . . . . . . . . . . . . . . . . An Axsys Architecture . . . . . . . . . . . . . . . . . . Domain Space Generation . . . . . . . . . . . . . . . . . . Definitions . . . . . . . . . . . . . . . . . . Plasticity . . . . . . . . . . . . . . . . . . Node Appendix Clause . . . . . . . . . . . . . . . . . . Node Type, Query . . . . . . . . . . . . . . . . . . Node Type, Insert . . . . . . . . . . . . . . . . . . Node Type, Mirror . . . . . . . . . . . . . . . . . . Node Type, Satellite . . . . . . . . . . . . . . . . . . Node Type, Index . . . . . . . . . . . . . . . . . . Node Type, Master Console . . . . . . . . . . . . . . . . . . Node Type, Error Controller . . . . . . . . . . . . . . . . . . Node Type, Data . . . . . . . . . . . . . . . . . . Data Storage . . . . . . . . . . . . . . . . . . Axsys Links . . . . . . . . . . . . . . . . . . Node Hosts . . . . . . . . . . . . . . . . . . Axsys State Assessment . . . . . . . . . . . . . . . . . . Booting An Axsys . . . . . . . . . . . . . . . . . . Auto-Configuration . . . . . . . . . . . . . . . . . . Node Work Areas . . . . . . . . . . . . . . . . . . Process Control . . . . . . . . . . . . . . . . . . Fault Tolerant Recresence . . . . . . . . . . . . . . . . . . Synchronization Warning . . . . . . . . . . . . . . . . . . Communication Protocol . . . . . . . . . . . . . . . . . . Security And Log . . . . . . . . . . . . . . . . . . Cascading Axsys . . . . . . . . . . . . . . . . . . Massive Returns . . . . . . . . . . . . . . . . . . VLT Query And Join Mechanics . . . . . . . . . . . . . . . . . . Very Large Table Builds . . . . . . . . . . . . . . . . . . AxsysAlterAlias . . . . . . . . . . . . . . . . . . AxsysAlterNode . . . . . . . . . . . . . . . . . . AxsysAlterRowLimit . . . . . . . . . . . . . . . . . . AxsysAlterRunningNode . . . . . . . . . . . . . . . . . . AxsysAlterSegmentLimit . . . . . . . . . . . . . . . . . . AxsysAlterWorkLocation . . . . . . . . . . . . . . . . . . AxsysClear . . . . . . . . . . . . . . . . . . ShowAxsys . . . . . . . . . . . . . . . . . . ShowAxsysNode . . . . . . . . . . . . . . . . . . AxsysReloadNode . . . . . . . . 12 . Performance Tuning Tips . . . . . . . . . . . . . . . . . . Work Area Relocation . . . . . . . . . . . . . . . . . . Base Table Segment Size . . . . . . . . . . . . . . . . . . Log Relocation . . . . . . . . . . . . . . . . . . Segment Pointer Management . . . . . . . . . . . . . . . . . . Yield Processor . . . . . . . . . . . . . . . . . . Other Configurations . . . . . . . . 13 . Catastrophic Loss Recovery Chapter 8 . . . . . . . Appendices B. Naming Standards . . . . . . . . 1 . Implementation . . . . . . . . 2 . Invalid Characters . . . . . . . . 3 . Reserved Words C. Code Tables . . . . . . . . 1 . Backup Retention Type . . . . . . . . 3 . Boolean Toggle States . . . . . . . . 4 . Column Types . . . . . . . . 5 . Table Sources . . . . . . . . 6 . Return Protocols
-- . --
__________________________________________________
_________________________ You will encounter many references to "instance" as you read. The instance is an instance of AxleBase that is loaded and running in the computer's RAM. The instance is actually the entire AxleBase object that is loaded and functioning in the computer's RAM. As such, a computer can have many instances working. An extended working object can consist of many instances on many computers scattered across a continent. But relax because, although that instance object is usually important, it can sometimes become a nebulous transient object. A computer/system user may never encounter a need for using the instance, but a system builder must be familiar with it. If you are unfamiliar with the concept, you might find it helpful to look at the "AlterInstance" command in the "Manager" object. That might give you a feel for it.
-- . --
_________________________
|-------------------| The primary objective of AxleBase is the management of inconceivably large data stores. See the "Design Limits" page. He can manage the usual small or mid-sized databases (He has managed his builder's personal data tables for many years), but he has the muscle for large loads. He contains special mechanisms that give him the ability to handle unbelievably "Large" data tables. AxleBase is a complete "Relational" database manager. When completed, it was probably, and may still be, the world's most powerful. He is sometimes also described as a database engine because he was designed to be compiled into other software projects. AxleBase does not just claim to be embeddable. He was built for that purpose so that he lives and functions entirely within a host system. He is a DLL component that is invisible and that a system engineer can compile into a product. After he installs the DLL on the computer, when the software engineer declares the AxleBase object in his code, all of the AxleBase interfaces, commands, objects, error handlers, etc. are immediately available within his project. The host will use industry standard ANSI-92 SQL(Structured Query Language) to control him. He has SQL enhancements to handle very "Large" objects, but they do not interfere with standard "SQL", and when a deviation is made from the ANSI-92 standard, the deviation is openly and explicitly stated in this document. (Some basic SQL usage is presented in sub-sections following the "ExecuteSQL" sub-section.) He provides selectable universal "Interfaces" that offer specialized services, such as the security-hardened "SysLink" communication interface that is built around the "SysLink" communication protocol. All of them are designed to be the link into any production system. That and his light weight make him easily deployable. A secondary objective is cost reduction. Instead of paying for a super-computer or mainframe to handle very large databases, he is designed with the ability to do it on low cost desktop computers; thereby bringing giant data tables wherever they may be needed.
-- . --
|-------------------| Intended Audience :
AxleBase is designed for the performance of :
Its documentation must serve disparate professional groups including :
Which is why the documentation is large and expanding. There are sections that address one of those tasks for one of those groups, and there are sections that are needed for all tasks for all groups. ( The builder was forced to reenter the code for months in 2022 to complete the unfinished "ShareDatabase" utility.
The documentation attempts to assist the manager in planning for the acquisition and implementation of AxleBase and for the allocation of manpower and other resources. Software engineers will find that AxleBase can be viewed as a programming language, which allows them to embed it in their systems and languages; that allows them to create systems that drive a powerful database manager as a tool for manipulating databases. The engineers know that a "DBA" probably should work with them. The implementers are those who design and create databases, tables, jobs, and security protocols in those databases. The DBA monitors performance, monitors system health, and performs daily administration, such as unattended system operation, security, and hardware load. Frequently, the DBA is also the implementer since he performs the never-ending job of database administration.
( For Software Engineers:
Advanced System Tutorials:
-- . --
|-------------------| Intended Audience :
Documentation Word-Count
Word counts exclude special characters and HTML code. -- . -- ( * Embedded in system code.)
Embedded comments are required by the complexity of large systems, which can rival the complexity of biological systems. The complexity is so great in large systems that even the embedded comments become complex. The AxleBase builder decided early in the project that he would comment as extensively as possible. AxleBase is so large and complex that its unseen comments may be more important than this published documentation. Various systems were built to support the AxleBase project. A system named Seeper, was built to translate a system's code into the C++ language, but was abandoned when AxleBase development ceased. At that point, Seeper could partially translate and report a target system's internal characteristics. The Seeper run on 20221203 reported 259,437 words in internal AxleBase comments.
An Actual Seeper Run and Analysis Of AxleBase
-- . --
|-------------------| Intended Audience :
This subject, which is so important to all of us, cannot be answered definitively. For substantiation of that statement, see the "Incompleteness Theorem" appendix of the "Theory" document. But there can be strong indicators, such as the following. Experience:
Formal Testing :
Other Trials :
-- . --
|-------------------| Intended Audience :
-- . -- See the "Feasibility Testing In AxleBase" section of the "SysLink Protocol" documentation.
-- . -- See also the 10 sub-sections of the "Security"" section of this AxleBase documentation.
-- . -- Be alert also for many other security mechanisms scattered through the AxleBase system. For example, see the many configuration settings for the DBA such as the three "Comm Hide Error"" settings that obviate hacker probes.
-- . --
|-------------------| Intended Audience :
The builder has made a concerted effort to find and fix every error and shortcoming in the
-- Formal Testing --
The "Notable Tests" page presents a number of documented tests with their published results. Note that the reported times reflect execution on hardware from the last century. Merely replacing the old disk drives with today's solid state storage might increase those speeds by a hundred times. To get a feel for that, mentally move decimal points two places to the left when reading the published test durations Not all formal tests are shown. For example, this ten or fifteen year-old note was found while editing this document in 2022:
-- Informal Trials --
When a feature, command, or query was completed, it was tried with every invalid parameter that was imagined. AxleBase has managed my personal database for five or ten years. It is 01:00 in a morning of 2022 as I type this because AxleBase is big and my memory is too small to be a "DBA". I have been looking for years for a bug in my personal system, which uses AxleBase as its embedded database manager. Discovered tonight was that it is not a bug, but one of the many protective system configurations, the "Dataset Size Limit", which an "AxleBase Error Protocol" error message had been telling me for years, but... etc.
-- Mechanized Tests --
As work progressed on AxleBase, it quickly became obvious that its size and complexity required constant testing of everything. Yes, everything. The effort to reduce size and code by reusing code and objects compounded complexity, and routine work began to break things that "had worked before". Therefore, work stopped to build a testing app, "AxHandle", that became fairly sophisticated in itself. It ran nearly every command and query in AxleBase when a button was pressed, so the button was pressed often.
-- Stress Tests --
Various stress tests were run through the years. The most impressive was when networked computers ran AxleBase "Instances" 24-7 for years building a test table that contained 100 Billion rows. It was spread across 16 computers in 38,005 files on 22 disk drives. It was fun, and delivered impressive SQL queries for local techies. See the "VLT" test report. It was difficult for the builder to believe that AxleBase could manage the number of files that might be created for very large tables. A stress test was devised, run, and recorded. The operating system had begun to experience problems when the test was stopped, but the AxleBase file management sub-system reported no problems. At that point, the AxleBase file manager was managing 10 million (10,009,096) data files. That number of data files could hold 20 petabytes, or 20,018,192,000,000,000 bytes. See the "File Manager Stress" test report.
-- . --
|-------------------| Intended Audience :
Purpose :
The original purpose of the "SysLink" protocol development was to give AxleBase a secure and controlled autonomy on a public network such as the internet. Therefore, the "SysLink" protocol has been embedded in AxleBase to help with database support for mobile operations, including the fact that high-end database managers usually operate 24-7 as unattended, or autonomous, servers. Accessing that communication interface is discussed in the "SysLink Interface" sub-section and others. Serious high-end database managers offer a universal link to any application through the "SQL" language. Any app. can be built to communicate with an AxleBase instance to query an AxleBase database. Any point-and-click interface that translates the user's commands into SQL commands in the background will allow the user to send sophisticated queries to the database without knowing how it happens. Or power users can enter SQL strings. (The writer has built many and varied applications that used SQL links to various brand-name database managers for users who knew neither SQL nor databases.) Mobile operations have peculiar needs for database support, but database managers can have features that serve those needs. For example, AxleBase has features specifically designed to provide dependable data support in hostile environments. For example, the DBA can configure settings for each AxleBase database to support mobile users with or without SysLink (although the use of SysLink is recommended). Dangerous Data Returns AxleBase is designed to manage databases of many tables with many exabytes in each table, and he could quickly respond to a query "Joining" some of those tables. Those responsible for the networks being traversed and those sharing them might not respond well to that dataset traversing their infrastructure. For safety, the database administrator can set a value in each database's configuration that limits the "Dataset Size" of data returns. If a query exceeds that value, AxleBase will return an error to the user who can then correct his query or use the mechanism described below to incrementally retrieve his massive dataset. Broken Data Connections A broken or noisy connection to a standard database manager requires that the query be resubmitted and rerun, thereby straining expensive resources and users' patience. The DBA can tell AxleBase to automatically handle that problem. See "Cache Returns" in Configurable Attributes. If a connection is broken after initiating a query, AxleBase will continue running the query and save the return when finished. He will then continue processing other queries while waiting for the user or his app to reconnect and ask for the saved dataset. If the break occurs after the return begins, AxleBase will save the unretrieved portion of the dataset until it is again requested. (See "Data Retrieval Tools" compendium, and the "the Data Transfer Protection Technology" sub-section. The return of the dataset will resume until complete or until the connection again breaks. AxleBase is designed to build and return datasets larger than any computer can handle, so such a return can be interrupted and resumed many times. That feature supports many users simultaneously in continuous operation. Perhaps that feature will encourage those who investigate networks that may be cut frequently. Deferred Data Returns The mechanism described for broken data connections can be controlled by the user without DBA configuration. If the user has a query that will run a long time, he can specify a "Return Cache" within the query, submit it, turn off his cell phone to take a nap, and reconnect later to get the results. This feature can support installations that serve both mobile and fixed station users. The fixed station user will conserve the resources that would otherwise be used by the mobile users' deferred returns. Mangled Data Returns Datasets can be disrupted in transit by undetectable tiny ambience anomalies that might not affect other types of communications. (I isolated and identified this problem in a network of twenty thousand workstations, and a multitude of autonomic processes, that used various big-name database managers.) Therefore, AxleBase allows the user or the user's app to request retransmission of all or specified parts of large datasets. See "Data Retrieval Tools" compendium, and the "the Data Transfer Protection Technology" sub-section. Data Security "Security" is built into serious database managers and access to data can be controlled as tightly as desired. Each database has its own security settings administered by the DBA. (Some of these features are found only in AxleBase.) Where an owner is nervous about mobile access to his database, there are features that can impose universal restrictions. Because AxleBase can manage gigantic tables that are too big to be backed up, each database has a switch whereby the DBA can override security with "Deny All DDL" operations to protect tables. Similar switches can override security to "Deny All Data Updates" and "Deny Table Scans" of large tables in each database. (A table scan is a query that performs at least one read that does not use an index, which could run for years against an AxleBase-class table.) (For example, if a computer can read a row every one thousandth of a second, it will take close to 4 months to read the hundred billion row test table in the AxleBase lab.) The DBA can turn on ( "Encrypt Outbound") encryption in a database, which will cause all data returns to be encrypted. The user cannot turn that off, but if the DBA is not using that feature, the user can encrypt each query with the "SetVectorEncryption" or the "SetVectorReturnProtocol" options, or he can "Encrypt" each deferred return. That feature is constructed so that an app, also, can add the option to each query. If the DBA activates the SysLink interface, then AxleBase will accept and send only SysLink traffic which makes available the floating-key tri-level encryption and authentication for all traffic. If the DBA turns on permission security, then access permissions must be "Granted" to individuals and/or groups using the standard CRUD model with AxleBase extensions. Permissions are create, read, update, delete, execute, metadata update, etc. for each table, database, and database domain. Installation domains and databases also have access permissions. Each user must then be assigned access permissions for domains, databases, tables, etc., thereby creating vertical and horizontal security partitions. Sensitive data should not be casually exposed to mobile access, but where it is needed, the DBA can activate a hardened "Audit" trail for every data row in the entire database. After activation, that feature's hardness prevents de-activation even by the DBA. Each row in the database carries its own detailed audit data that cannot be accessed, and audit history can be destroyed only by destroying the entire database and its backups. Audit trails are in addition to standard logging by the database manager. AxleBase was designed for unusual uses, so the security features administered by the DBA are a longer list than covered here. If the installation is secure, hardware is locked down, database security administered well, and data in transit protected by SysLink, then support for mobile users will be as secure as possible. Privacy And Anonymity The relational database construct simplifies protection of privacy and anonymity that can be left to the professional DBA during his design phase. If told to protect certain data, he will design the database with that sensitive data in separate table(s). Since it is a relational database, that sensitive data table(s) can be easily rejoined to other tables in queries as usual, but only by those who have access permission to that sensitive data table as described above. The database manager will insure that data inserts go into the correct tables. Note: Data is seldom, if ever, entirely unstructured. For example, although not designed to do so, the SMTP protocol automatically structures email for insertion into relational databases (,which certain spy agencies love).
Dependability When enabled and configured, multi-level hot table segmented failover for self-healing, with automatic anomaly detection, can be entirely managed by AxleBase throughout multiple catastrophic failures. Resilience of the configuration is limited only by allocated resources, and by the service speed that the DBA is willing to sacrifice. (Configuring for catastrophic failure is covered on the advanced features page.) (Increasing resilience increases the load on AxleBase, which the DBA will evaluate and report.) Server-Side Mobility Some specialized mobile operations, such as the military, that exhibit highly fluid and rapidly changing deployment topologies, also require extremely fast reaction time and high dependability from dedicated local mobile database servers. The size of AxleBase may be part of the solution because the world's most powerful database manager occupies less than a megabyte of space; i.e., so he can be deployed in tiny hardware. (This addresses group operations where speed and deployment topology fluidity substantially exceed those of city traffic, and includes instant catastrophic loss management for multi-node entities, as covered in failover options of the advanced technology page.) Embedded Interface AxleBase has his own interface that is always independent of other apps, including those in which he is embedded. All of the above described features are behind that interface and can be accessed and used only through that interface and only where AxleBase allows it. That means, for example, that AxleBase security is only AxleBase security. Database programmers are familiar with this fact and, using this documentation, give their software hooks into the database manager's interface for control and querying as needed. Containing nearly a half million "Words", the AxleBase documentation tells them how to do such things.
-- . --
|-------------------| Intended Audience :
The operation of AxleBase can be difficult. Some commands take many parameters, and a SQL query can be a huge character string. Such clerical tasks can take hours and overwhelm the AxleBase builder. Following are a few techniques that help him. The AxleBase builder usually uses "AxHandle" to operate AxleBase because AxHandle handles much of the work. For example, when a double click on a database name tells him to open a database, AxHandle automatically loads an AxleBase instance, and runs the "OpenDatabase" command. Then when he is told to run a command, he first opens a "Manager" or "Data Vector" object, whichever is appropriate, and hands the command to the object. When working with a command that requires a long string such as a long parameter list, or a very long SQl query, the AxleBase builder displays notepad and composes the string in notepad. He usually makes many mistakes, so he corrects the notepad display and copies the update into AxHandle for each attempt. When working with a command that may load erroneous data or configurations into the database, which could keep the database from opening, he is careful to keep the system running (sometimes all day) until he corrects any errors. And do not forget AxleBase's test abilities. When the system "Test" toggle is on, or the command carries a "Test" command in an Appendix capsule, the command will run up to the point of commitment and exit. That will allow debugging of the command or query for as long as the operator wishes before commitment. (You may have noticed that neither the builder, nor AxHandle locked the database before running the command. He could modify the AxHandle app to automatically lock the database before running the command, but he is tired of messing around with the system at the moment.)
-- . --
|-------------------| Intended Audience :
A database manager that can manage
( * Data tables and control files are designed to be totally visible to their owners; even accessible by text editors.) ( ** If you know how to use a DLL object in a program, then you know how to embed and distribute AxleBase.) ( Although nearly hopeless at this time, even the speed of light was repeatedly addressed as an engineering problem for AxleBase-class systems. For example, see the axsys super-system section's "Domain Space Generation" sub-section.)
-- . --
|-------------------| Intended Audience :
-- Definition -- As used in this sub-section, installation refers to the physical and geographical location of an AxleBase system, its organizational service limits, and its configuration.
The installation was defined because it points out an unusual characteristic of AxleBase that, if grasped by managers, database designers, and "DBAs", can deliver unexpected benefits; i.e., unlike other database managers, AxleBase was intentionally designed and built with great task-plasticity as you will see below. -- Enablers -- The AxleBase builder worked assiduously to keep the AxleBase object as small as possible by
- Therefore, an AxleBase file can be a database server, a database client, or both; whichever you need.
- Although more work for the system's "DBA", an extended "Security" mechanism can configure a hardened installation of AxleBase that can be destroyed only by the larger natural or man-made disasters.
- Administration of an AxleBase system is assisted by his internal tools, some of which are listed in the "System State Compendium" They include everything from a simple manual one-time check of a table up to around-the-clock autonomous systems that can lock and restore data tables and notify management and the "DBA" team. - An AxleBase data object that we call a "table" is designed with definition flexibility that allows the "DBA" to define it as other tables in the local database, or tables in remote databases, or text files, or etc...
- AxleBase guarantees data validity by monitoring data objects that service queries before and during queries. When a SQL query is initiated, AxleBase evaluates all data objects and networks that will be used by the query, and monitors their health as the query progresses. AxleBase will not return a dataset if he cannot get all of the data.
- A security mechanism that could, in theory, make it possible to lose AND recover storage hardware, data tables, and network segments during a query without disruption of the query is the "recrescense" technology that is covered in the "Interrupted Development" sub-section. - AxleBase is designed to manage astronomically large tables. If you have one or more tables that fit that description, then the "DBA" can configure the AxleBase "Super-System" for speed. See the "Super-System" section and the dozens of sub-sections that follow it in the "Advanced Topics".
-- More -- Et etc.... There is more. As you work and study, you will discover other tools and configurations such as the data source "Torrent" handler and the "Dirty Data"-source manager. The 2015 development shutdown left a few things unfinished. See the following "Interrupted Development" sub-section for a list of uncompleted work. If they may be needed, see the comments in the "Interrupted Development" sub-section concerning mechanisms for alleviating problems that will be raised by relativistic distances in extraterrestrially-dispersed data management. -- Additional Coverage -- See the following "Military Systems" sub-section) -- . -- -- Computer Science Theory -- Among other things, AxleBase development was inspired by the biology sciences. This "Installation" sub-section shows the impact of his computer science research on the builder in 1999. In this case, the impact of "Phenotypic Plasticity" in biological organisms on their genomic development is demonstrated in the inordenately vast configuration reach of the little AxleBase object.
-- . -- -- Miscellaneous -- The following notes were found years after work stopped. The AxleBase system is capable of constructing a database that is geographically distributed world-wide, that is dynamically reconfigurable while operating, that can be linked to other databases and unlinked as needed, that can create data tables as needed and on the fly, that can redefine foreign objects as native tables, and many other abilities. The definition of a topological construct with a dynamic visual interface might be valuable for the management and administration of such a database.
-- . --
|-------------------| Intended Audience :
Although AxleBase was not specifically designed for military environments, that was a possibility that was in the mind of the builder as he worked. (See the previous "Installation Architectures" sub-section.) Each AxleBase installation can be designed by the "DBA" for local needs. The speed, responsiveness, and reliability that can be achieved by that installation design were part of the reason for some of the unusual features of AxleBase.
See the "extremely high processing speed" that is addressed in the "Unmanned Vehicles" section of the "SysLink" protocol that handles communication for AxleBase. That and other parts of "SysLink" and AxleBase were designed for emergency and battlefield application. The military mission requires equipment that can move easily and unobtrusively. The entire sophistication of the AxleBase system is in a single computer file of less than one megabyte. In theory, AxleBase could be deployed with every vehicle and every soldier. (Again, note that the little AxleBase object contains everything to allow you to deploy it as both client and server.) Note the high speed maleability of the AxleBase "Family" network that allows configuration of AxleBase as an unattended autonomic system. Such a system could provide split-second totally automatic recovery from the loss of even an entire database and its server without interrupting a high speed process. Such responses are supported by his internal 24-7 monitors. That recovery can be repeated until every cluster participant is lost. Although of probable benefit for other applications, that feature was specifically designed for high-speed front line air, sea, and land battlefield conditions. Since he was designed for high speed processing of very Large" data objects, other AxleBase features may be of benefit at the headquarters level.
-- . --
|-------------------| Intended Audience :
When the project was shut down, there were objects in development, some being planned, and some being investigated, all of which were terminated. For a list, see the "Unfinished When Project Stopped" on this web site's "Shortcomings" page. Due to the extreme nature of AxleBase, one that his builder would like to see completed is SQL-controlled table locks. It is not on that page, but see the warning about it in the "SQL Select" sub-section. Mechanisms for alleviating relativistic impacts on extraterrestrially-dispersed data management were being addressed at project shutdown. On a conceptual level, it was found that the AxleBase architecture was conceptually well positioned to support solutions for relativistic problems. It appeared to be an interesting, fun, and rewarding challenge, but it was discontinued with the shutdown.
The "Fault Tolerant Recrescence" in the "Fault Tolerance" sub-section of this manual is one of the advanced AxleBase security mechanisms. Its objective is recovery of lost storage hardware, data tables, and network segments during a query without disruption of the query. See also the "recrescense" technology in the "Fault Tolerance" sub-section of the "Description" page.
-- . --
|-------------------| Intended Audience :
"Error Protocol" And Functions :
Objects :
The Vector handles data. Generally speaking, the Vector functions like the biological vector and the math vector, which is why he was given that name. The Manager handles everything else. (I type this seven years after I stopped AxleBase development, so there could be exceptions, but that will not be a problem because the function instructions include which object to use.) -- . -- As an example, let us look at an abbreviated copy of the instructions function, "Share Database". For those who are unable to build a server to host AxleBase, this command allows a database to be shared across a network after it is created. (Not recommended because of security problems.) This is the "Share Database" command that the user will enter into your software, which will submit it to AxleBase:
"TestMode" :
Execution :
-- . --
-- . --
|-------------------| Intended Audience :
AxleBase contains socket programming in one of its sub-systems, which used Windows sockets to give AxleBase the ability to communicate with remote systems. You are being informed of this so that you can be prepared for communication problems. Socket programming, and certainly the Windows socket programming, is fraught with engineering challenges. The worst, in this developer's opinion, was the difficulty of trapping and reporting runtime problems. At no time did this developer feel confident that his socket communication code was as professionally solid as the rest of the code in AxleBase. However, perhaps that is just the nature of communications, which must deal with a fluid reality. In any case, you have been warned, so that you can build in extra control and caution where communication takes place.
-- . --
|-------------------| Intended Audience :
ODBC is "Open Database Connectivity". An ODBC driver is a small piece of software that assists with using a database manager. It is not needed by AxleBase, because AxleBase contains the ODBC apparatus. However, since AxleBase was engineered to the ODBC requirements, the organization is free to create its own ODBC drivers to standardize its own software if it wants. You will find an industry standard ODBC interface waiting inside AxleBase, and documented in this operation manual. ( This sub-section is written quite a few years after the writer left the software engineering environment, so maybe the ODBC technology has been entirely dropped by the industry.)
-- . --
|-------------------| Intended Audience :
( ! The identifiers that are generated are linked ONLY to that which is stated. The systems that I build do not secretly obtain, store, or transmit any information about you or anything that you own! Not because I am good, but simply because the one for whom I work commanded us to not be deceitful with each other.) -- . -- Version numbers came close to losing their function after the billionaires started playing marketing games with them. Therefore, AxleBase version numbers mainly serve tradition. The version is always stored in the system. The ShowVersion command will display the system's internal version number. -- . -- Release numbers are the best guide to the current level of development. They are seldom consecutive, but they are always sequential. They are a five digit "Integer". A new release number is simply and truly the identification of the system that was released to the end user. It may be for a major change or for minor cleanups. The release number is stored in the product and the "ShowRelease" command will display the system's internal release number. -- . -- The storage architecture model (SAM) version should usually be of little or no interest. It is mainly for internal use, but is made public because it can be seen in system files. The SAM has its own versioning identifier. Each time that the SAM is changed, it is assigned a new identifier that may or may not be the same as the AxleBase version or release number. -- . -- One of the AxleBase interfaces is an abstracted interface that can be used to simplify the host when it is a database server. The SysLink protocol uses release numbers, and AxleBase stores the SysLink release number that he is currently servicing. -- . -- The system contains the following object and process identifiers that are available to the host through the API.
There are commands to retrieve handles such as IDs and names. For example, there are approximately 32 "show" commands such as ShowInstanceID, and some reports contain IDs. The identifiers (IDs) are in addition to names that are assigned to objects by human operators and in addition to version and release numbers. All identifiers are unique. They are generated by AxleBase. A vector name may be assigned by the host. If a vector name is not assigned by the host, it will be assigned by the system. The vector name is unique when assigned by the system. Identifiers are stored only for permanent objects such as a database. They are stored only as part of the object's properties. When a transient object dies, such as a connection, its identifier dies. When a permanent object is destroyed, such as a table, its identifier is destroyed. The great amount of identification is provided because the differences between some of the objects are subtle but important while the system is active. Not only do the identifiers provide control, they can be helpful in debugging.
-- . --
|-------------------| Intended Audience :
This advanced technology has been temporarily The concept of "very large" has historical precedence in database work. It was first applied to databases as "VLDB" and expanded later to include individual tables as "VLT". The concept has remained the same through the years to mean a larger than ordinary object, but its application has changed as hardware and software changed. That which was a very large table on a mainframe before the PC revolution is now routinely managed in a desktop database manager.
-- . --
_________________________
|-------------------| AxleBase was developed in Windows 2000. More on this later. After AxleBase is installed on a computer, it will automatically appear among the tools or components in any development environment that is aware of components on the computer. For example, Visual Basic will show it in the list of components that can be referenced. When a reference is set to it in that kind of environment, the AxleBase commands automatically become available within the development environment as part of the development language.
Method 1 At a glance:
Place the current AxleBase package in a temporary directory on your local disk. That package is an executable packed file with an exe extension. It does not need WinZip or any other program. When it is run, it unpacks itself into several files in your temporary directory. When the package is told to unpack itself, it creates several files, one of which is setup.exe. When setup.exe is run, it installs AxleBase on the computer in the system directory. Save copies of your package. You may need to roll back to a previous release if an upgrade does not work for you. After installation, the database manager is available for embedding into your host system. Reference it and code to its interface in your project. When you compile and distribute your system, the referenced database manager will go with it. This will not uninstall a previously installed release. Use the command in Method 2 to do that. Method 2 A method that some developers use is to place the DLL where they want it and then manually install it. To do this:
That method can be especially useful when upgrading to a new release. To uninstall, run regsvr32 /u [path]\AxleBase.DLL. A fictitious example:
Method 3 A more complex, method is to use a system call from inside the host system to install it every time that the host system runs. That is the method that is used by "AxHandle", but not by "CoreReader". Every time AxHandle is used, he re-registers his internal database manager. That method works well, but is not recommended because it can lead to confusing problems during system development. Method 4 If AxleBase was installed and shared by another system on the computer, then it will be available for use by your own system. If it is uninstalled and upgraded, then systems that use it may need to be upgraded to run the new AxleBase release.
-- . --
|-------------------| Like any component, AxleBase should usually be installed on a production system as part of the installation process of the host system. What happens after installation is up to the host system. For example, when "CoreReader" starts up, he checks the environment to see if his database exists. If it does not, he gives AxleBase instructions for creating it. The tools for doing all of this are covered later in the documentation.
-- . --
_________________________ Intended Audience :
GUI = Graphical User Interface. The GUI is that which is seen on the computer monitor, and any programming that is needed to create and control the GUI. AxleBase is designed to be embedded in an application, so he has no GUI. His interface is designed for the app in which he is embedded, and the systems with which he must communicate. The host apps should handle the control and administration of their databases. If a GUI is needed in an emergency, "AxHandle" may be pressed into service as an ad-hoc database administration tool, but that is not his purpose and he is not a production-quality app. If you need a GUI control for AxleBase, just create one. That is, after all, why AxleBase is embeddable.
-- . --
_________________________ Unpack and install the system as described in the installation section. Reference AxleBase in the host system. Decide how the database(s) should be constructed, used, and maintained. Write the commands in the host system to tell AxleBase what to do.
-- . --
__________________________________________________ The test software is simple software that is designed to demonstrate and test the AxleBase system.
_________________________
|-------------------| Intended Audience :
The primary purpose of AxHandle is routine testing of AxleBase in his development environment. He is also made available for demonstration purposes. AxleBase is embedded in AxHandle. In this case, the host has a point and click GUI interface for interactive control of AxleBase, but an unattended server can also have an embedded AxleBase. AxHandle is not intended for production use. His purpose is test and demonstration. A hidden problem is that he may be too powerful. For example he simplifies the quick dropping of a very large database. The Windows operating system sometimes runs out of handles in intense and long-running tests. If that happens, everything can be restarted to release those handles. AxHandle is multi-instancing. AxHandle is not multi-threaded and is not multi-tasking. (See more AxHandle sub-sections folowing this one.)
-- . --
|-------------------| Address : jragan.com/axledoc_1.htm#15.10.10
Intended Audience :
If you use AxHandle, he tries to help. For example, after you run a select query, he runs the "ShowDatasetAttributes" command to see what happened. If it shows that data is available in a standard return, he runs the ColumnName, ColumnStart, and ColumnWidth commands to build a display header, runs the ReturnDataset command to return formatted data, etc. etc. until he has built a data display. So, although many operations are needed, it will appear that all you need to do is run queries. That sort of help is provided throughout AxHandle to help as much as possible to save time and trouble for all of us. It also provides an example for other GUI developers to follow if they want.
-- . --
|-------------------| AxHandle can use any of the AxleBase interfaces. They are selectable on his configuration panel that can be displayed by pressing the Config button. The fastest is the standard interface. AxHandle defaults to it the first time that he is run. The standard interface uses two objects, the "Manager" and the "Vector". They are covered in detail in later sections. For now, just be aware that they exist and that AxHandle tells AxleBase to create them as you need them. When AxHandle loads, he creates a Manager object for you. You will initialize it by opening a domain and a database. The easiest way to do that is by pressing the demo_db button. When the operation is complete, you will be connected to the new demonstration database.
-- . --
|-------------------| All commands are listed in the scrolling windows. The top window lists all of the "Manager" commands and the bottom window lists the commands that are used by the data "Vector". Each set of commands has a do_it button. To run a command, highlight it and press its do_it button to execute it. For example, select the ShowCopyright command and press the do_it button. The copyright will appear in the return window. There is a parameter window next to each command window in which a parameter can be typed. When the do_it button is pressed, AxHandle will combine the parameter with the command before passing it to AxleBase. Example :
-- . --
|-------------------| Address : jragan.com/axledoc_1.htm#15.10.30
Messages, errors, and data returns will appear in the bottom window on the screen. AxHandle sometimes puts instructions in that window to show how he performed an action. For example, when you tell him to create a new demonstration database, he will list the commands that he used so you can create your own databases. If AxleBase returns an overwhelmingly large dataset, AxHandle will tell you that the return was too large for the window. When that happens, AxHandle will remind you that there are AxleBase commands that you can use to step through the dataset.
-- . --
|-------------------| There are help options for each major operation on the help menu. The AxleBase command syntax is available from the help menu. Click on help and then click on a topic. It will tell you how to find and display what you need. If you need help only for a specific AxleBase command, display the documentation and double click that command. ( AxHandle uses the same documentation mechanism that is used in the CoreReader and CoreModel family. This is not because it is so great, but simply because Microsoft's was so bad. Since this was done, others have created and offered better documentation tools, but they were simply too late. ) For a minimal amount of help with the SQL language, look in the ExecuteSQL sub-section of the API chapter. The entire syntax is presented for each of the commands. The SQL language is one of the simplest languages in existence, but its use is one of the most complex. If you are not familiar with it, you may want to buy one of the many books on the subject. Use the CoreReader tool for major assistance with constructing SQL queries. You can use it to query databases just by pointing and clicking on data objects and it will show you the SQL statements that it builds. ( The creation of CoreReader showed others how to create similar tools in the early part of the century, so there are now many fine products on the market. However, aside from their user interfaces, they are no better than CoreReader at what CoreReader does, so you might as well use the original. )
-- . --
|-------------------| Each time that the ConnectionString command is used by AxHandle, he stores the "String". He also saves the connection strings when he creates the demo databases. If the new string is identical to one on file, he will not save it, but the slightest difference will cause it to be saved. Press the open_db button to display all stored connections. To open the desired database, highlight the one needed and press the do_it button, or just double click the desired string. In conformance with the AxleBase design philosophy, the AxHandle connection strings are saved in a text file that can be edited in notepad. It is named connects.txt.
-- . --
|-------------------| When the AxleBase project began, every time that a test garbaged the database, it had to be laboriously reconstructed by hand. (Yuck!) Therefore, AxHandle was given the ability to destroy and re-create test databases on demand. Pressing the demo_db button will create a demonstration database domain, demoDom, under the app's location. Various databases will then be created in that domain; demo_main, demo_citizen, demo_seg, demo_virtual, and demo_audit. Each contains a dozen or so tables. AxHandle contains scripts that consist of the commands and SQL statements required for the operations. When the button is pressed, AxHandle starts passing the commands to AxleBase. The complete demo databases may be re-created at any time just by pressing the button. AxHandle asks AxleBase if they already exist, and if they do, AxHandle tells AxleBase to drop them, and then begins creating new ones. The domain is preserved after it is first created. This is done to allow creating and populating databases with various domain-level parameters. It also allows you to create other databases in that domain. The entire domain and the demo databases may be removed by deleting the db directory. The demos contain a few simple tables that contain some rows for experimentation. The column types are mixed so they can be used to test performance. The demo_virtual database also contains a few virtual tables. Some of the virtual tables can function only if their attributes are modified to fit the local environment. As it is being created, the system writes a script in the returns window that shows the commands that are used. This can be copied and saved for reference when creating other databases. If additional databases are created in the demo domain, AxHandle will retain them when re-creating the demo databases. Feel free to manually alter the demo database and bang on it to experiment with it. If it becomes so badly corrupted that AxleBase cannot even destroy it, manually delete the entire \db directory under the app, and then press the demo button again.
-- . --
|-------------------| For "VLDB" testing, AxHandle has been given the ability to generate very large test tables. Each table that is created in the demonstration database may be expanded by selecting the appropriate option on the enlarger menu. AxHandle uses individual SQL statements to insert rows into tables. He creates an individual statement for each insert and then passes the command to AxleBase. Allow the generator to run for a day or two or whatever is required to generate a table of the needed size. Each table has a different rate of growth. Depending upon which table it is, a four hundred megahertz processor can generate a million or so rows every day or two. Caution ! :
AxHandle gives unique rows to some tables. Select the AxleBase command ShowTables to get the table names, and then use the ShowTable command to inspect the structure of each table. HINT :
-- . --
|-------------------| Instead of just using a script to write test data and reports to disk, AxHandle actually drives AxleBase for the task, which tests many of the AxleBase commands and functions when the button is pressed. AxHandle has additional miscellaneous tests built into it that he runs every time that he builds any database. They include many commands and SQL queries that are not used in building that database. You will see them run when you create a new demo database.
AxleBase run time: 0:8.609 for 588 tests. Total run time: 0:21.171 No errors. Any error would have stopped the operation. Below are the commands that were passed to AxleBase. ____________________________________________ runtime . . command . . . . . . parameters . . . (parameters are truncated for display) ____________________________________________ *Note* Following creates and prepares the database domain. 0:0.234 OpenDomain domain = c:\axhandle\db\demoDom\ ; UserInstanceId = jragan ; userLocation = RAGAN6 ; create = yes ; 0:0.000 AlterDomainAttribute QueryTimeout = 3 0:0.000 AlterDomainAttribute spinlock = 3 0:0.000 ShowDomainAttributes ______________________________________________ *Note* Following creates the demo_citizen database. 0:0.000 CloseDatabase 0:0.000 ShowDatabaseCatalogue name, demo_citizen 0:0.015 OpenDatabase demo_citizen, , , 0:0.000 LockObject database, x 0:0.046 DropDatabase demo_citizen 0:0.046 CreateDatabase demo_citizen, c:\axhandle\db\demo_citizen 0:0.000 ShowDatabaseCatalogue name, demo_citizen 0:0.000 AlterDatabaseAttribute description=This demo / test database copyright 2003-2023 John Ragan 0:0.000 AlterDatabaseAttribute timeOuttemp = 1 0:0.015 OpenDatabase demo_citizen, , , 0:0.015 CreateTable create table T_ATTITUDE_SCALE ( attitude integer , description string(70) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_CITIZEN ( citizen_id serial , name_first string(30) , name_last string(30) , licensed_breeder boolean , d_o_b datetime , d_o_d datetime , assigned_residence numeric , occupation_cat string(10) , occupation_sub string(10) , education_c 0:0.000 CreateTable create table T_CITIZEN_STATUS ( citizen_id serial , location string(16) , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_COUNTRY_CODE ( country string(2) , internet_code string(3) , country_name string(50) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_DESCRIPTORS ( citizen_id integer , dna_chart blob(100) , face_hologram blob(100) , hologram_date datetime , holographer integer , brain_wave_print blob(100) , brain_wave_date datetime , brain_scanner integer , thought_scan_analysis b 0:0.000 CreateTable create table T_EMPLOYMENT_HISTORY ( citizen_id integer , permit integer , start datetime , end datetime , employer_id integer , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_INTIMATE ( citizen_id integer , parent_male integer , parent_female integer , sexual_1 integer , sexual_type_1 string(2) , sexual_2 integer , sexual_type_2 string(2) , sexual_3 integer , sexual_type_3 string(2) , friend_1 integer 0:0.000 CreateTable create table T_INTIMATE_HISTORY ( citizen_id integer , date_start datetime , date_end datetime , associate integer , type_associate string(2) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_MARRIAGE_PERMIT ( permit integer , citizen integer , date_assigned datetime , approved_by integer , expiration datetime , rescinded datetime , rescinded_by integer , last_review datetime , reviewed_by integer , last_update date 0:0.000 CreateTable create table T_PERSONAL_PERMITS ( citizen_id integer , birth integer , employment integer , marriage integer , night_movement integer , residence integer , travel integer , vehicle integer , voter integer , last_update dat 0:0.000 CreateTable create table T_RESIDENCE ( citizen_id integer , date_assigned datetime , last_review datetime , residence_id integer , coordinates numeric , country string(2) , political_unit string(50) , sub_unit string(50) , city string(50) , city_zone string(50) 0:0.000 CreateTable create table T_RESIDENCE_HISTORY ( citizen_id integer , date_assigned datetime , date_vacated datetime , residence_id integer , coordinates numeric , country string(2) , political_unit string(50) , sub_unit string(50) , city string(50) , city_zone st 0:0.000 CreateTable create table T_STATUS_CODE ( status string(2) , status_name string(10) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_STATUS_HISTORY ( citizen_id integer , start_status datetime , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_TRAVEL_HISTORY ( citizen_id integer , permit integer , start datetime , end datetime , destination string(20) , purpose string(20) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_WATCH_CODE ( watch_type string(2) , watch_name string(10) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_WATCHER ( citizen_id integer , unit_id integer , officer_id integer , last_update datetime , updater string(20) ) ; a-ppendix( description ( Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers.) ; activateObject( yes) ; ) 0:0.000 AlterTableAttribute T_ATTITUDE_SCALE.description = Designed for very large database research. Provides codes to describe the attitude of each citizen so the government can monitor the people. 0:0.000 AlterTableAttribute T_CITIZEN.description = Designed for very large database research. Provides unique ID numbers on each row so the government can watch each person. 0:0.000 AlterTableAttribute T_CITIZEN_STATUS.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.description = Designed for very large database research. Contains citizen country code lookups. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.shared = yes. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.password = for simplicity sake 0:0.000 AlterTableAttribute T_COUNTRY_CODE.shared = yes 0:0.000 AlterTableAttribute T_DESCRIPTORS.description = Designed for very large database research. Contains BLOBS. 0:0.000 AlterTableAttribute T_EMPLOYMENT_HISTORY.description = Designed for very large database research. Citizen employment history. 0:0.000 AlterTableAttribute T_INTIMATE.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_INTIMATE_HISTORY.description = Designed for very large database research. Citizen close relations history. 0:0.000 AlterTableAttribute T_MARRIAGE_PERMIT.description = Designed for very large database research. One of the citizen permit tables. 0:0.000 AlterTableAttribute T_PERSONAL_PERMITS.description = Designed for very large database research. Citizen permits currently in effect. 0:0.000 AlterTableAttribute T_RESIDENCE.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_RESIDENCE_HISTORY.description = Designed for very large database research. Citizen residence history. 0:0.000 AlterTableAttribute T_STATUS_CODE.description = Designed for very large database research. Contains citizen status code description lookups. 0:0.000 AlterTableAttribute T_STATUS_HISTORY.description = Designed for very large database research. Citizen status code history. 0:0.000 AlterTableAttribute T_TRAVEL_HISTORY.description = Designed for very large database research. Citizen travel history. 0:0.000 AlterTableAttribute T_WATCH_CODE.description = Designed for very large database research. Contains citizen watch type code description lookups. 0:0.046 ExecuteSql insert into T_CITIZEN array ( 0, "kAte", "first" , true , "2000082713270100" , null ,994248211, null , null , null , null , 0.0, DateNow(DateTime) , "Big Sister" ) ( 0, "ericA" , "first" , false, "2001082713270100" , null ,414865261, null , null , null , null , .0 , DateNow(DateTime) , "Big Sister" ) ( 0, "hEidi" , "first" , no , "2002082713270100" , null ,887434900, null , null , null , *Note* ExecuteSql inserted fifty rows individually here and each operation was added to the total time. 0:0.000 ExecuteSql insert into T_ATTITUDE_SCALE array ( 1 ,"Absolute acquiesence." ,DateNow(DateTime) , "Big Sister" ) ( 2 ,"Sometimes notices actions of the authorities." ,DateNow(DateTime) , "Big Sister" ) ( 3 ,"Considers actions of the authorities." ,DateNow(DateTime) , "Big Sister" ) ( 4 , null ,DateNow(DateTime) , "Big Sister" ) ( 5 , null ,DateNow(DateTime) , "Big Sister" ) ( 6 , null ,DateNow(Dat 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS array ( 0 , "s87450528740882", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s74589309692382", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s47075096964836", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s15715605020523", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s19794080853462", "A" , "A" , null, DateNow(DateTime) , "p 0:0.062 ExecuteSql insert into T_INTIMATE array ( 76498740 , 73294344 , 82907532 , 54067967,"B",67144659, "B", null , null , 12815330, 64344775, 62872131, 93847960, 74362476, 79703136, null , DateNow(DateTime) , "Big Sister" ) ( 11747198 , 67549171 , 26701046 , 22687625,"A",null, null , null , null , 5338405, 86775548, 69021816, 95725117, 15615213, null , null , DateNow(DateTime) , "Big Sister" ) ( 57272363 , 0:0.062 ExecuteSql insert into T_RESIDENCE array (1, DateNow(DateTime), DateNow(DateTime), 1,0, "ac", "", "", "", "", "", 800,"","", DateNow(DateTime), "wanda" ) (6, DateNow(DateTime), DateNow(DateTime), 2,0, "au", "", "", "", "", "", 2000, "","", DateNow(DateTime), "summer" ) (3, DateNow(DateTime), DateNow(DateTime), 3,0, "an", "", "", "", "", "", 800,"","", DateNow(DateTime), "kate" ) (4, DateNow(DateTime 0:0.000 ExecuteSql insert into T_STATUS_CODE array ( "A" , "controlled" , "Bears no discernable threat." ,DateNow(DateTime) , "98172301236770" ) ( "B" , "suspect", "May harbor dangerous intent." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "suspect", "In an intimate relationship with one of dangerous intent." , DateNow(DateTime) , "Big Sister" ) ( "D" , "activist" , "Harbors dangerous or subversive thoughts. 0:0.000 ExecuteSql insert into T_WATCH_CODE array ( "A" , "normal" , "Standard sampling with statistically derived pattern." , DateNow(DateTime) , "98172301236770" ) ( "B" , "normal" , "Normal daily surveillance." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "normal" , "Daily surveillance with individual statistical analysis." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "suspect", "Assigned a dedicated offic 0:0.015 ExecuteSql insert into T_WATCHER array ( 0, 50104840 , 55445501, DateNow(DateTime) , "Big Sister" ) ( 0, 39423520 , 87489462, DateNow(DateTime) , "Big Sister" ) ( 0, 16733640 , 2443411, DateNow(DateTime) , "Big Sister" ) ( 0, 71871994 , 37028149, DateNow(DateTime) , "Big Sister" ) ( 0, 41559784 , 81080670, DateNow(DateTime) , "Big Sister" ) ( 0, 35960017 , 44764180, DateNow(DateTime) , "Big Sist ____________________________________________ *Note* Following creates the demo_seg database. 0:0.000 CloseDatabase 0:0.000 ShowDatabaseCatalogue name, demo_seg 0:0.093 OpenDatabase demo_seg, , , 0:0.000 LockObject database, x 0:0.015 DropDatabase demo_seg 0:0.046 CreateDatabase demo_seg, c:\axhandle\db\demo_seg 0:0.000 ShowDatabaseCatalogue name, demo_seg 0:0.000 AlterDatabaseAttribute description=This demo / test database copyright 2003-2023 John Ragan 0:0.000 AlterDatabaseAttribute segmentsize=2000. 0:0.000 AlterDatabaseAttribute timeouttEmp = 1 0:0.015 OpenDatabase demo_seg, , , 0:0.000 CreateTable create table T_APP_CRUD ( person string(15) not null, object_id string(15) , creates string(1) , reads string(1) , updates string(1) , deletes string(1) , executes string(1) , last_update datetime , OWNER string(20) ) 0:0.000 CreateTable create table T_CITIZEN ( citizen_id serial , name_first string(30) , name_last string(30) , licensed_breeder boolean , d_o_b datetime , d_o_d datetime , assigned_residence numeric , occupation_cat string(10) , occupation_sub string(10) , education_c 0:0.000 CreateTable create table T_CITIZEN_STATUS ( citizen_id serial , location string(16) , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_CITIZEN_STATUS_BAK ( citizen_id serial , location string(16) , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_CONFIG ( row_id serial , owner string(10) , last_change datetime , setting_name string(50) , setting_value string(50) ) 0:0.000 CreateTable create table T_LOG ( log_time datetimex not null, error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) 0:0.000 AlterTableAttribute T_APP_CRUD.description = Tests indexing and updates of standard fixed width rows. 0:0.000 AlterTableAttribute T_CITIZEN.description = Tests indexing and updates of standard terminators with non-standard separators. 0:0.000 AlterTableAttribute T_CITIZEN_STATUS.description = Tests indexing and updates of standard fixed width rows. 0:0.000 AlterTableAttribute T_CITIZEN_STATUS.dataFailover = T_CITIZEN_STATUS_BAK 0:0.000 AlterTableAttribute T_CITIZEN_STATUS_BAK.description = This is a data failover table for t_citizen_status. 0:0.000 AlterTableAttribute T_CONFIG.description = Tests indexing and updates of non-standard terminators and separators. 0:0.000 AlterTableAttribute T_LOG.description = Tests indexing and updates of standard fixed width rows. 0:0.000 AlterTableAttribute T_LOG.shared = yes 0:0.015 ExecuteSql insert into T_APP_CRUD array ( "30504430329455" , "52935223517513" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "kate") ( "85642833953340" , "14077922353347" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "erica") ( "28772677153326" , "31572563338410" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "heidi") ( "49730824490647" , "95256031033936" ,"Y" , "N" , "Y" , "Y" , "N" ,Date 0:0.031 ExecuteSql insert into T_APP_CRUD array ( "20000209463679" , "59521130795018" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "kate") ( "40958356801000" , "23204608490544" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "erica") ( "49907933714422" , "69797948042788" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "heidi") ( "36685824765179" , "36022204598006" ,"Y" , "N" , "Y" , "Y" , "N" ,Date 0:0.031 ExecuteSql insert into T_APP_CRUD array ( "88019616609796" , "44630676084418" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "kate") ( "48239587953065" , "10854932639635" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "erica") ( "49566828287412" , "59989051051571" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "heidi") ( "75606533344116" , "55312006173969" ,"Y" , "N" , "Y" , "Y" , "N" ,Date 0:0.046 ExecuteSql insert into T_CITIZEN array ( 0, "kAte", "first" , true , "2000082713270100" , null ,109741041, null , null , null , null , 0.0, DateNow(DateTime) , "Big Sister" ) ( 0, "ericA" , "first" , false, "2001082713270100" , null ,112332114, null , null , null , null , .0 , DateNow(DateTime) , "Big Sister" ) ( 0, "hEidi" , "first" , no , "2002082713270100" , null ,635717336, null , null , null , 0:0.046 ExecuteSql insert into T_CITIZEN array ( 0, "kAte", "first" , true , "2000082713270100" , null ,365590042, null , null , null , null , 0.0, DateNow(DateTime) , "Big Sister" ) ( 0, "ericA" , "first" , false, "2001082713270100" , null ,846249939, null , null , null , null , .0 , DateNow(DateTime) , "Big Sister" ) ( 0, "hEidi" , "first" , no , "2002082713270100" , null ,404270237, null , null , null , 0:0.046 ExecuteSql insert into T_CITIZEN array ( 0, "kAte", "first" , true , "2000082713270100" , null ,999888479, null , null , null , null , 0.0, DateNow(DateTime) , "Big Sister" ) ( 0, "ericA" , "first" , false, "2001082713270100" , null ,173380860, null , null , null , null , .0 , DateNow(DateTime) , "Big Sister" ) ( 0, "hEidi" , "first" , no , "2002082713270100" , null ,184062191, null , null , null , 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS array ( 0 , "s44449879527091", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s70041452646255", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s17168863415718", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s85786631107330", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s12129067778587", "A" , "A" , null, DateNow(DateTime) , "p 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS array ( 0 , "s70774505734443", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s11769936084747", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s56587905287742", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s12133997678756", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s31593590378761", "A" , "A" , null, DateNow(DateTime) , "p 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS array ( 0 , "s32276448607444", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s16298073530197", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s40331068634986", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s58232083320617", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s28431169390678", "A" , "A" , null, DateNow(DateTime) , "p 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS_BAK array ( 0 , "s28893528580665", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s75270075798034", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s50042564272880", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s77920838594436", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s84286015629768", "A" , "A" , null, DateNow(DateTime) 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS_BAK array ( 0 , "s49633237719535", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s82084914445877", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s26925624012947", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s60207755565643", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s50361360907554", "A" , "A" , null, DateNow(DateTime) 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS_BAK array ( 0 , "s14433396458625", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s52288930416107", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s94820198416709", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s81128524541854", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s74399285912513", "A" , "A" , null, DateNow(DateTime) 0:0.015 ExecuteSql insert into T_CONFIG array ( 0, "kAte" ,DateNow(DateTime), "alias table names", "yes" ) ( 0, "kAte" ,DateNow(DateTime), "multiple app instances","no") ( 0, "kAte" ,DateNow(DateTime), "multiple browsers", "no") ( 0, "kAte" ,DateNow(DateTime), "non standard characters in names","no") ( 0, "kAte" ,DateNow(DateTime), "query name","first_name" ) ( 0, "kAte" ,DateNow(DateTime), "query outpu 0:0.031 ExecuteSql insert into T_CONFIG array ( 0, "kAte" ,DateNow(DateTime), "alias table names", "yes" ) ( 0, "kAte" ,DateNow(DateTime), "multiple app instances","no") ( 0, "kAte" ,DateNow(DateTime), "multiple browsers", "no") ( 0, "kAte" ,DateNow(DateTime), "non standard characters in names","no") ( 0, "kAte" ,DateNow(DateTime), "query name","first_name" ) ( 0, "kAte" ,DateNow(DateTime), "query outpu 0:0.031 ExecuteSql insert into T_CONFIG array ( 0, "kAte" ,DateNow(DateTime), "alias table names", "yes" ) ( 0, "kAte" ,DateNow(DateTime), "multiple app instances","no") ( 0, "kAte" ,DateNow(DateTime), "multiple browsers", "no") ( 0, "kAte" ,DateNow(DateTime), "non standard characters in names","no") ( 0, "kAte" ,DateNow(DateTime), "query name","first_name" ) ( 0, "kAte" ,DateNow(DateTime), "query outpu 0:0.015 ExecuteSql insert into T_LOG array (DateNow(DateTimef) , "", "john","SERVER4","CoreReader GUI load sequence started. ") (DateNow(DateTimef) , "", "kate","SERVER4","Started the internal database manager.") (DateNow(DateTimef) , "", "mary","SERVER4","CoreReader database opened by the GUI.") (DateNow(DateTimef) , "", "wanda", "SERVER4","Created internal objects. ") (DateNow(DateTimef) , "", "pam", " 0:0.015 ExecuteSql insert into T_LOG array (DateNow(DateTimef) , "", "john","SERVER4","CoreReader GUI load sequence started. ") (DateNow(DateTimef) , "", "kate","SERVER4","Started the internal database manager.") (DateNow(DateTimef) , "", "mary","SERVER4","CoreReader database opened by the GUI.") (DateNow(DateTimef) , "", "wanda", "SERVER4","Created internal objects. ") (DateNow(DateTimef) , "", "pam", " 0:0.015 ExecuteSql insert into T_LOG array (DateNow(DateTimef) , "", "john","SERVER4","CoreReader GUI load sequence started. ") (DateNow(DateTimef) , "", "kate","SERVER4","Started the internal database manager.") (DateNow(DateTimef) , "", "mary","SERVER4","CoreReader database opened by the GUI.") (DateNow(DateTimef) , "", "wanda", "SERVER4","Created internal objects. ") (DateNow(DateTimef) , "", "pam", " . . . . Backup by a standard database manager. 0:0.031 Backup database , , c:\axhandle\db\backup\ , no, , ____________________________________________ *Note* Following creates the demo_main database. 0:0.000 CloseDatabase 0:0.000 ShowDatabaseCatalogue name, demo_main 0:0.156 OpenDatabase demo_main, , , 0:0.000 LockObject database, x 0:0.062 DropDatabase demo_main 0:0.046 CreateDatabase demo_main, c:\axhandle\db\demo_main 0:0.000 ShowDatabaseCatalogue name, demo_main 0:0.000 AlterDatabaseAttribute description=This demo / test database copyright 2003-2023 John Ragan 0:0.000 AlterDatabaseAttribute timEouttemp = 1 0:0.015 OpenDatabase demo_main, , , 0:0.000 CreateTable create table T_ACTIVITY ( PERSON string(10) not null, now_on_line string(1) , workstation string(30) , entry datetime , exit datetime , last_access datetimex ) 0:0.000 CreateTable create table T_APP_CRUD ( person string(15) not null, object_id string(15) , creates string(1) , reads string(1) , updates string(1) , deletes string(1) , executes string(1) , last_update datetime , OWNER string(20) ) 0:0.000 CreateTable create table T_AUTHORIZATION ( person string(10) not null, first_name string(30) , last_name string(30) , level_authorized string(2) , active string(1) , department string(20) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_CONFIG ( row_id serial , owner string(10) , last_change datetime , setting_name string(50) not null, setting_value string(50) ) 0:0.015 CreateTable create table T_CONNECTION ( connection_name string(50) not null, owNer string(10) not null, database_brand string(20) , connection_type string(8) , cursor_location string(6) , database_name string(100), server_name string(50) , server_ip string(20) , dsn 0:0.000 CreateTable create table T_DEMO_SCRIPT ( row_id string(5) , row_value string(150) , create_date datetimex ) 0:0.000 CreateTable create table T_IMAGE ( image_NAME string(50) not null, subject string(20) , date_created date , image_type string(3) , category string(1) , source string(20) , source_location string(20) , source_medium string(20) , date_acquired date , description string(100) , 0:0.000 CreateTable create table T_JOB ( owner string(10) , owner_share_code string(1) , department string(20) default engineering, dept_share_code string(1) , date_created datetimex , job_name string(50) not null, description string(200) , date_code string(1) , scheduled_date string(20) , scheduled_hour 0:0.000 CreateTable create table T_LARGE_ROW ( identifier serial , last_change datetimex , changed_by string(10) , misc_data string(1000000) , row_terminator string(30) ) 0:0.000 CreateTable create table T_LOG ( log_time datetimex not null, error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) 0:0.000 CreateTable create table T_LOG_DUP ( log_time datetimex not null, error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) 0:0.000 CreateTable create table T_QUERY ( owner string(10) , owner_share_code string(1) , department string(20) , dept_share_code string(1) , save_date datetimex , query_name string(50) not null, description string(200) , query_body string(1000) ) 0:0.000 CreateTable create table T_SCREEN ( owner string(10) not null, screen_name string(30) not null, department string(20) , last_change datetimex , screen_top integer , screen_left integer , screen_height integer , screen_width integer ) 0:0.000 CreateTable create table T_STATISTIC ( statistic_name string(30) not null, statistic_value string(16) ) 0:0.000 AlterTableAttribute T_APP_CRUD.description = The first two columns of this table are randomized to create unique rows. 0:0.000 AlterTableAttribute T_CONNECTION.description = This table has variable width rows. 0:0.000 AlterTableAttribute T_DEMO_SCRIPT.description = This table stores the demo script after it is run. 0:0.000 AlterTableAttribute T_LARGE_ROW.description = This table has very large rows that can quickly use a lot of space. 0:0.000 AlterTableAttribute T_LOG.NameAlias = TestNameAlias 0:0.000 AlterTableAttribute T_LOG.shared = yes 0:0.000 AlterTableAttribute T_LOG_DUP.description = This table tests the import and the insert from a sub-select. 0:0.000 AlterTableAttribute T_LOG_DUP.shared = yes 0:0.000 CreateTable create table T_ATTITUDE_SCALE ( attitude integer , description string(70) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_CITIZEN ( citizen_id serial , name_first string(30) , name_last string(30) , licensed_breeder boolean , d_o_b datetime , d_o_d datetime , assigned_residence numeric , occupation_cat string(10) , occupation_sub string(10) , education_c 0:0.000 CreateTable create table T_CITIZEN_STATUS ( citizen_id serial , location string(16) , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_COUNTRY_CODE ( country string(2) , internet_code string(3) , country_name string(50) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_DESCRIPTORS ( citizen_id integer , dna_chart blob(100) , face_hologram blob(100) , hologram_date datetime , holographer integer , brain_wave_print blob(100) , brain_wave_date datetime , brain_scanner integer , thought_scan_analysis b 0:0.000 CreateTable create table T_EMPLOYMENT_HISTORY ( citizen_id integer , permit integer , start datetime , end datetime , employer_id integer , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_INTIMATE ( citizen_id integer , parent_male integer , parent_female integer , sexual_1 integer , sexual_type_1 string(2) , sexual_2 integer , sexual_type_2 string(2) , sexual_3 integer , sexual_type_3 string(2) , friend_1 integer 0:0.000 CreateTable create table T_INTIMATE_HISTORY ( citizen_id integer , date_start datetime , date_end datetime , associate integer , type_associate string(2) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_MARRIAGE_PERMIT ( permit integer , citizen integer , date_assigned datetime , approved_by integer , expiration datetime , rescinded datetime , rescinded_by integer , last_review datetime , reviewed_by integer , last_update date 0:0.000 CreateTable create table T_PERSONAL_PERMITS ( citizen_id integer , birth integer , employment integer , marriage integer , night_movement integer , residence integer , travel integer , vehicle integer , voter integer , last_update dat 0:0.000 CreateTable create table T_RESIDENCE ( citizen_id integer , date_assigned datetime , last_review datetime , residence_id integer , coordinates numeric , country string(2) , political_unit string(50) , sub_unit string(50) , city string(50) , city_zone string(50) 0:0.000 CreateTable create table T_RESIDENCE_HISTORY ( citizen_id integer , date_assigned datetime , date_vacated datetime , residence_id integer , coordinates numeric , country string(2) , political_unit string(50) , sub_unit string(50) , city string(50) , city_zone st 0:0.000 CreateTable create table T_STATUS_CODE ( status string(2) , status_name string(10) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_STATUS_HISTORY ( citizen_id integer , start_status datetime , status string(2) , watch_type string(2) , flag boolean , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_TRAVEL_HISTORY ( citizen_id integer , permit integer , start datetime , end datetime , destination string(20) , purpose string(20) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_WATCH_CODE ( watch_type string(2) , watch_name string(10) , description string(100) , last_update datetime , updater string(20) ) 0:0.000 CreateTable create table T_WATCHER ( citizen_id integer , unit_id integer , officer_id integer , last_update datetime , updater string(20) ) ; a-ppendix( description ( Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers.) ; activateObject( yes) ; ) 0:0.000 AlterTableAttribute T_ATTITUDE_SCALE.description = Designed for very large database research. Provides codes to describe the attitude of each citizen so the government can monitor the people. 0:0.000 AlterTableAttribute T_CITIZEN.description = Designed for very large database research. Provides unique ID numbers on each row so the government can watch each person. 0:0.000 AlterTableAttribute T_CITIZEN_STATUS.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.description = Designed for very large database research. Contains citizen country code lookups. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.shared = yes. 0:0.000 AlterTableAttribute T_COUNTRY_CODE.password = for simplicity sake 0:0.000 AlterTableAttribute T_COUNTRY_CODE.shared = yes 0:0.000 AlterTableAttribute T_DESCRIPTORS.description = Designed for very large database research. Contains BLOBS. 0:0.000 AlterTableAttribute T_EMPLOYMENT_HISTORY.description = Designed for very large database research. Citizen employment history. 0:0.000 AlterTableAttribute T_INTIMATE.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_INTIMATE_HISTORY.description = Designed for very large database research. Citizen close relations history. 0:0.000 AlterTableAttribute T_MARRIAGE_PERMIT.description = Designed for very large database research. One of the citizen permit tables. 0:0.000 AlterTableAttribute T_PERSONAL_PERMITS.description = Designed for very large database research. Citizen permits currently in effect. 0:0.000 AlterTableAttribute T_RESIDENCE.description = Designed for very large database research. The T_CITIZEN tables have a unique link through the citizen id numbers. 0:0.000 AlterTableAttribute T_RESIDENCE_HISTORY.description = Designed for very large database research. Citizen residence history. 0:0.000 AlterTableAttribute T_STATUS_CODE.description = Designed for very large database research. Contains citizen status code description lookups. 0:0.000 AlterTableAttribute T_STATUS_HISTORY.description = Designed for very large database research. Citizen status code history. 0:0.000 AlterTableAttribute T_TRAVEL_HISTORY.description = Designed for very large database research. Citizen travel history. 0:0.000 AlterTableAttribute T_WATCH_CODE.description = Designed for very large database research. Contains citizen watch type code description lookups. 0:0.031 ExecuteSql insert into T_ACTIVITY array ( "kate", "N" , "station1", DateNow(DateTime) ,DateNow(DateTime) , DateNow(DateTimef) ) ( "erica" , "N" , "station2", DateNow(DateTime) ,DateNow(DateTime) , DateNow(DateTimef) ) ( "heidi" , "N" , "station3", DateNow(DateTime) ,DateNow(DateTime) , DateNow(DateTimef) ) ( "mary", "N" , "station4", DateNow(DateTime) ,DateNow(DateTime) , DateNow(DateTimef) ) ( "w 0:0.031 ExecuteSql insert into T_APP_CRUD array ( "55940435762386" , "72366943738495" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "kate") ( "96529490102681" , "50599770717611" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "erica") ( "88388938872821" , "48463504699701" ,"Y" , "N" , "Y" , "Y" , "N" ,DateNow(DateTime) , "heidi") ( "94797736926552" , "29237110538508" ,"Y" , "N" , "Y" , "Y" , "N" ,Date 0:0.031 ExecuteSql insert into T_AUTHORIZATION array ( "kate", "kate", "a" , "1" , "Y" , "personnel",DateNow(DateTime) , "theboss") ( "erica" , "erica" , "b" , "2" , "Y" , "personnel",DateNow(DateTime) , "theboss") ( "heidi" , "heidi" , "c" , "3" , "Y" , "accounting" ,DateNow(DateTime) , "theboss") ( "mary", "mary", "d" , "4" , "Y" , "accounting" ,DateNow(DateTime) , "theboss") ( "wanda" , "wanda" , "e" , 0:0.031 ExecuteSql insert into T_CITIZEN_STATUS array ( 0 , "s67501685023307", "A" , "A" , null, DateNow(DateTime) , "olivia" ) ( 0 , "s64617725610733", "A" , "A" , false , DateNow(DateTime) , "kate" ) ( 0 , "s73269603848457", "A" , "A" , no, DateNow(DateTime) , "mary" ) ( 0 , "s47313969135284", "A" , "A" , 0 , DateNow(DateTime) , "wanda" ) ( 0 , "s35180873274803", "A" , "A" , null, DateNow(DateTime) , "p 0:0.000 ExecuteSql insert into T_STATUS_CODE array ( "A" , "controlled" , "Bears no discernable threat." ,DateNow(DateTime) , "98172301236770" ) ( "B" , "suspect", "May harbor dangerous intent." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "suspect", "In an intimate relationship with one of dangerous intent." , DateNow(DateTime) , "Big Sister" ) ( "D" , "activist" , "Harbors dangerous or subversive thoughts. 0:0.000 ExecuteSql insert into T_WATCH_CODE array ( "A" , "normal" , "Standard sampling with statistically derived pattern." , DateNow(DateTime) , "98172301236770" ) ( "B" , "normal" , "Normal daily surveillance." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "normal" , "Daily surveillance with individual statistical analysis." ,DateNow(DateTime) , "Big Sister" ) ( "C" , "suspect", "Assigned a dedicated offic 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_CONNECTION values ( "paradox_dba_param_ole", "ownerid", "dbBrand", "oledb", "", "databaseName", "servername", "ip", "", "provider", "driver", "connString", "path", "userid", "userPword", 7, 7, "a description of this connection", "appends", "cat", "prefix", "names", "qual", "yes", "yes", "yes", "yes", "yes", 200, "", "[", "]", "limit", "no", "no", "paintshop", "pointers", "yes" 0:0.000 ExecuteSql insert into T_IMAGE array ("Andromeda Galaxy", "landscape","19980507","jpg", null , "Hubble", null, null,null,null,null,DateNow(DateTimef), "Katie" ) ("church picnic","landscape","19920820","jpg", null , "mine", null, "",null,"",null,DateNow(DateTimef), "Katie" ) ("sunset in Oklahoma City","landscape","19911224","jpg", null , "mine", null, null,null,null,null,DateNow(DateTimef), "Kati 0:0.015 ExecuteSql insert into T_JOB array ("jessica","N", "", "N", DateNow(DateTimef),"manop_buyers_orders_items_2" , "join buyers with orders and with order items", "W", "all", "23", "00", "00", "8_manop_odb_param" , "manop_buyer_orders_2","text file", "manop_2","","Y", DateNow(DateTime) ) ("rachel", "N", "", "N", DateNow(DateTimef),"3_B_access_manop_ole_cartesian_2", "an access cartesian join using an ole co 0:0.015 ExecuteSql insert into T_LOG array (DateNow(DateTimef) , "", "john","SERVER4","CoreReader GUI load sequence started. ") (DateNow(DateTimef) , "", "kate","SERVER4","Started the internal database manager.") (DateNow(DateTimef) , "", "mary","SERVER4","CoreReader database opened by the GUI.") (DateNow(DateTimef) , "", "wanda", "SERVER4","Created internal objects. ") (DateNow(DateTimef) , "", "pam", " 0:0.031 ExecuteSql insert into T_QUERY array ("wanda", "Y", "", "N",DateNow(DateTimef),"admin_factbook2_affiliation","", "selectset_1.* from T_AFFILIATION set_1" ) ("summer","Y", "", "N",DateNow(DateTimef),"factbook_2002_access_6", "from server6", "selectset_1.CAPITAL,set_1.COUNTRY from T_CAPITAL set_1" ) ("kate","N", "", "N",DateNow(DateTimef),"factbook_equal_link","uses an equal link for oracle, but works i 0:0.031 ExecuteSql insert into T_SCREEN array ( "sarah", "frmdoc", "",DateNow(Datetimef),3375 , 1800 , 3500 , 9000) ( "anna","frmtextoutput","",DateNow(Datetimef),3390 , 2055 , 3800 , 8000) ( "obediah", "frmquerylib","",DateNow(Datetimef),3420 , 1245 , 4080 , 4755) ( "summer","frmdoc", "",DateNow(Datetimef),3375 , 1605 , 3500 , 9000) ( "kate","frmdoc", "",DateNow(Datetimef),1125 , 1575 , 6750 , 9000) ( 0:0.031 ExecuteSql insert into T_CONFIG array ( 0, "kAte" ,DateNow(DateTime), "alias table names", "yes" ) ( 0, "kAte" ,DateNow(DateTime), "multiple app instances","no") ( 0, "kAte" ,DateNow(DateTime), "multiple browsers", "no") ( 0, "kAte" ,DateNow(DateTime), "non standard characters in names","no") ( 0, "kAte" ,DateNow(DateTime), "query name","first_name" ) ( 0, "kAte" ,DateNow(DateTime), "query outpu 0:0.000 ExecuteSql insert into T_STATISTIC array ("last GUI startup",DateNow(DateTime) ) ("last GUI shutdown" ,DateNow(DateTime) ) ("last GUI connection" ,DateNow(DateTime) ) ("last GUI database load",DateNow(DateTime) ) ("last GUI query",DateNow(DateTime) ) ("last server startup" ,DateNow(DateTime) ) ("last server shutdown",DateNow(DateTime) ) ("last server connection",DateNow(DateTime) ) ("last *Note* Backup by a standard database manager. 0:0.062 Backup database , , c:\axhandle\db\backup\ , no, , ____________________________________________ *Note* Following creates the demo_virtual database. 0:0.000 CloseDatabase 0:0.000 ShowDatabaseCatalogue name, demo_virtual 0:0.046 OpenDatabase demo_virtual, , , 0:0.000 LockObject database, x 0:0.015 DropDatabase demo_virtual 0:0.046 CreateDatabase demo_virtual, c:\axhandle\db\demo_virtual 0:0.000 ShowDatabaseCatalogue name, demo_virtual 0:0.000 AlterDatabaseAttribute description=This demo / test database copyright 2003-2023 John E. Ragan. 0:0.000 AlterDatabaseAttribute failOpen=yes 0:0.000 AlterDatabaseAttribute timeOutteMp = 1 0:0.015 OpenDatabase demo_virtual, , , 0:0.000 CreateTable create table T_LOG ( log_time datetimex not null, error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) 0:0.000 AlterTableAttribute T_LOG.description = Identical to the table in demo_main for table concatenation across databases. 0:0.000 AlterTableAttribute T_LOG.shared = yes 0:0.000 CreateVirtualTable T_VIRTUAL_COUNTRY_CODE_AXLEBASE ( doesn"t matter what is put here. ) | sourceType = x | sourceTable = t_country_code | sourceDatabase = demo_citizen | passwordTable = for simplicity sake 0:0.000 AlterTableAttribute T_VIRTUAL_COUNTRY_CODE_AXLEBASE.description = This table is a virtualization of a table in another database. 0:0.015 CreateVirtualTable T_VIRTUAL_LOG_CAT ( ) | sourceType = c | sourceTable = t_log , t_log_dup , t_log, t_log, t_log | sourceDatabase = demo_main , demo_main , demo_virtual, demo_main, demo_seg 0:0.000 AlterTableAttribute T_VIRTUAL_LOG_CAT.description = This table is a virtualized concatenation of other tables. 0:0.000 CreateVirtualTable T_VIRTUAL_TEXT ( log_time datetimex , error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) | sourceType = t | textFile = export_fix.txt | textLocation = c:\axhandle\db\backup\ | textColumnType = f | textRowTerminator = -*eol*- 0:0.000 AlterTableAttribute T_VIRTUAL_TEXT.description = This is a virtual table. This table"s data resides in an external text file. 0:0.015 ExecuteSql insert into T_LOG array (DateNow(DateTimef) , "", "john","SERVER4","CoreReader GUI load sequence started. ") (DateNow(DateTimef) , "", "kate","SERVER4","Started the internal database manager.") (DateNow(DateTimef) , "", "mary","SERVER4","CoreReader database opened by the GUI.") (DateNow(DateTimef) , "", "wanda", "SERVER4","Created internal objects. ") (DateNow(DateTimef) , "", "pam", " ____________________________________________ *Note* Following creates the demo_audit database. 0:0.000 CloseDatabase 0:0.000 ShowDatabaseCatalogue name, demo_audit 0:0.046 OpenDatabase demo_audit, , , 0:0.000 LockObject database, x 0:0.015 DropDatabase demo_audit 0:0.046 CreateDatabase demo_audit, c:\axhandle\db\demo_audit 0:0.000 ShowDatabaseCatalogue name, demo_audit 0:0.000 AlterDatabaseAttribute description=This demo / test database copyright 2003-2023 John Ragan 0:0.000 AlterDatabaseAttribute timeOuttemp = 1 0:0.000 AlterDatabaseAttribute AuditTrail = yes 0:0.015 OpenDatabase demo_audit, , , 0:0.000 CreateTable create table T_LOG_AUDIT ( log_time datetimex not null, error_flag string(1) , owner string(10) , station string(10) , log_msg string(100) ) 0:0.000 CreateTable create table T_ACTIVITY_AUDIT ( PERSON string(10) not null, now_on_line string(1) , workstation string(30) , entry datetime , exit datetime , last_access datetimex ) 0:0.000 ExecuteSql insert into T_LOG_AUDIT array ( DateNow(DateTimef) , "", "john", "SERVER4", "Row 1 of an auditable table. ", "RAGAN6" , DateNow(DateTimef) , "jragan" ) ( DateNow(DateTimef) , "", "kate", "SERVER4", "Row 2 of an auditable table. ", "RAGAN6" , DateNow(DateTimef) , "jragan" ) ( DateNow(DateTimef) , "", "mary", "SERVER4", "Row 3 of an auditable table. ", "RAGAN6" , DateNow(Date 0:0.000 ExecuteSql insert into T_ACTIVITY_auDit array ( "kate" , "N" , "station1" , DateNow(DateTime) , DateNow(DateTime) , DateNow(DateTimef) , "RAGAN6" , DateNow(DateTimef) , "jragan" ) ( "erica" , "N" , "station2" , DateNow(DateTime) , DateNow(DateTime) , DateNow(DateTimef) , "RAGAN6" , DateNow(DateTimef) , "jragan" ) ( "heidi" , "N" , "station3" , DateNow(DateTime) , DateNow(DateTime) , DateNow( *Note* Force an error. Try to insert without audit data. 0:0.0000 ExecuteSql insert into T_ACTIVITY_auDit values ( "kate" , "N" , "station1" , DateNow(DateTime) , DateNow(DateTime) , DateNow(DateTimef) , "" , DateNow(DateTimef) , "" ) 0:0.031 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_seg ; ____________________________________________ *Note* Update tests follow. *Note* Update of fixed width table with a where. 0:0.015 ExecuteSql update t_log set log_msg = "atest" where owner = "kate" *Note* Check negation in fixed width table. 0:0.046 ExecuteSql update t_log set log_msg = "btest" where owner <> "kate" *Note* Select to check it. 0:0.015 ExecuteSql select * from t_log where log_msg = "atest" 0:0.000 TupleCount *Note* Update entire fixed width table. 0:0.062 ExecuteSql update t_log set owner = "me" *Note* Select to check it. 0:0.015 ExecuteSql select * from t_log where owner <> "me" *Note* Update of variable width with odd terminator. 0:0.015 ExecuteSql update t_config set setting_name = "atest" where owner = "elise" *Note* Select to check it. 0:0.015 ExecuteSql select * from t_config where setting_name = "atest" 0:0.000 TupleCount *Note* Update entire variable width table. 0:0.062 ExecuteSql update t_config set setting_name = "me" *Note* Select to check it. 0:0.015 ExecuteSql select * from t_config where owner <> "me" *Note* Update variable width with a standard row terminator. 0:0.015 ExecuteSql update t_citizen set updater = "atest" where name_first = "elise" and name_last = "first" *Note* Check negation. 0:0.078 ExecuteSql update t_citizen set updater = "btest" where name_first <> "elise" *Note* Select to check it. 0:0.015 ExecuteSql select * from t_citizen where updater = "atest" 0:0.000 TupleCount *Note* Check updates of the counts. 0:0.000 ExecuteSql select count(*) from t_citizen 0:0.000 Tuple *Note* Check updates of the counts. 0:0.000 ExecuteSql select count(*) from t_config 0:0.000 Tuple *Note* Check updates of the counts. 0:0.000 ExecuteSql select count(*) from t_log 0:0.000 Tuple *Note* Restoration of database after tests. 0:0.046 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_seg ; userLocation = RAGAN6 ; UserInstanceId = jragan ; 0:0.015 OpenDatabase demo_seg, , , 0:0.000 LockObject database, x 0:0.046 RestoreBackup c:\axhandle\db\backup\backup_demo_seg\demo_seg\ 0:0.015 OpenDatabase demo_seg, , , ______________________________________________________ *Note* . . . . Index tests follow. *Note* Lock database for the alter table command. 0:0.000 LockObject database, x *Note* Use alter table to create a primary key. 0:0.187 AlterTable alter table T_APP_CRUD add constraint PK primary key ( PERSON, owner ) *Note* Unlock database after the alter table command. 0:0.000 LockObject database, *Note* First insert to test the unique trap. 0:0.015 ExecuteSql insert into T_APP_CRUD(PERSON, owner) values ( 33333333333333 , kate) *Note* Next insert testing the unique trap. 0:0.031 ExecuteSql insert into T_APP_CRUD(PERSON, owner) values ( 33333333333333 , kate) *Note* Lock database for the alter table command. 0:0.000 LockObject database, x *Note* Use alter table to drop key. 0:0.000 AlterTable alter table T_APP_CRUD drop constraint PK *Note* Unlock database after the alter table command. 0:0.000 LockObject database, *Note* Use the axsys node option. 0:0.000 CreateIndex create index person on T_APP_CRUD ( person ) ; a-ppendix( node ( cell26 ) ; ) *Note* Variable width rows with user defined terminator. *Note* Index of non-standard row terminator and colomn separator. *Note* Single column indices from a multi column index. 0:0.093 CreateIndex create index owner on T_config ( owner, row_id ) *Note* Select from non-standard row terminator and column separator. 0:0.015 ExecuteSql select * from t_config where ( owner = "sheila" and row_id = 25 ) or ( row_id = 122 and owner = "sheila" ) 0:0.000 TupleCount *Note* Include an un-indexed column. 0:0.015 ExecuteSql select * from t_config where ( owner = "sheila" and row_id = 25 ) or ( row_id = 122 and owner = "sheila" and setting_value = "yes" ) 0:0.000 TupleCount *Note* Test the negation. 0:0.015 ExecuteSql select * from t_config where owner <> "elise" 0:0.000 TupleCount *Note* Check sql max function. 0:0.000 ExecuteSql select max(owner) from t_config 0:0.000 Tuple 0:0.000 TupleCount *Note* Check sql min function. 0:0.000 ExecuteSql select min(owner) from t_config 0:0.000 Tuple 0:0.000 TupleCount *Note* Check the between. 0:0.015 ExecuteSql select * from t_config where owner between "elise" and "katrina" 0:0.000 TupleCount *Note* Check the greater than. 0:0.015 ExecuteSql select * from t_config where owner > "katrina" 0:0.000 TupleCount *Note* Check the less than. 0:0.015 ExecuteSql select * from t_config where owner < "katrina" 0:0.000 TupleCount *Note* Update non-standard row terminator and column separator. 0:0.109 ExecuteSql update t_config set owner = "leona" where owner = "katrina" *Note* Check the update. 0:0.015 ExecuteSql select * from t_config where owner = "leona" 0:0.000 TupleCount *Note* Redo it. 0:0.125 ExecuteSql update t_config set owner = "katrina" where owner = "leona" *Note* Select a row_id that was moved by the update. 0:0.015 ExecuteSql select * from t_config where row_id = 42 0:0.000 TupleCount *Note* Index variable width rows with standard terminator. Also test the activate command. 0:0.046 CreateIndex create index name_first on T_CITIZEN ( name_first ) ; a-ppendix ( activateObject (no ) ; ) *Note* Test the activate command. 0:0.015 ExecuteSql select * from T_CITIZEN where name_first > "sarah" *Note* Test the activate command. 0:0.000 ActivateObject index , t_citizen *Note* Select from variable width rows with standard terminator. 0:0.015 ExecuteSql select * from T_CITIZEN where name_first > "sarah" 0:0.000 TupleCount *Note* Update variable width rows with standard terminator." 0:0.031 ExecuteSql update T_CITIZEN set name_first = "leona" where name_first = "sarah" *Note* Reverse the update. 0:0.031 ExecuteSql update T_CITIZEN set name_first = "sarah" where name_first = "leona" *Note* Check updates of variable width rows with standard terminator. 0:0.015 ExecuteSql select * from T_CITIZEN where name_first = "sarah" 0:0.000 TupleCount *Note* Standard fixed width rows. *Note* Create a unique, numeric, sorted index. 0:0.046 CreateIndex create unique index id on T_CITIZEN_STATUS ( citizen_id ) ; *Note* Create a natural random index. 0:0.046 CreateIndex create index updater on t_CITIZEN_STATUS ( updater ) *Note* Create a datetime index. 0:0.046 CreateIndex create index updated on T_CITIZEN_STATUS ( last_update ) *Note* Create a boolean index. 0:0.031 CreateIndex create index flag on T_CITIZEN_STATUS ( flag ) *Note* Show indices of one table. 0:0.000 ShowIndices ShowIndices t_citizen_status *Note* Join was duplicating indexed rows. 0:0.031 ExecuteSql select * from t_citizen_status a left join t_log on a.updater = t_log.owner where a.updater = "sarah" 0:0.000 TupleCount *Note* Right join. Join column and where column are indexed. 0:1.234 ExecuteSql select * from t_citizen_status a right join t_log on a.updater = t_log.owner where a.updater = "sarah" 0:0.000 TupleCount *Note* A "where" that "ands" two tables was always returning false. 0:0.171 ExecuteSql select * from t_config left join t_citizen on t_citizen.name_first = t_config.owner where t_citizen.name_first = "kate" and t_config.owner = "kate" 0:0.000 TupleCount *Note* Check numeric and less than. 0:0.000 ExecuteSql select * from t_citizen_status where citizen_id < 11 0:0.000 TupleCount *Note* Check sql max function. 0:0.015 ExecuteSql select max( updater ) from t_citizen_status where updater < "j" 0:0.000 Tuple 0:0.000 TupleCount *Note* Check sql min function. 0:0.000 ExecuteSql select min( updater ) from t_citizen_status 0:0.000 Tuple 0:0.000 TupleCount *Note* Check sql sum function. 0:0.000 ExecuteSql select sum( citizen_id ) from t_citizen_status 0:0.000 Tuple 0:0.000 TupleCount *Note* Check between. 0:0.015 ExecuteSql select * from t_citizen_status where updater between "kate" and "marsha" 0:0.000 TupleCount *Note* Update using the number. 0:0.031 ExecuteSql update T_CITIZEN_STATUS set updater = "leona" where citizen_id = 40 *Note* Repeat the update to see if it finds the row. 0:0.015 ExecuteSql update T_CITIZEN_STATUS set updater = "leona" where citizen_id = 40 *Note* Change it using the string. 0:0.015 ExecuteSql update T_CITIZEN_STATUS set updater = "natalie" where updater = "leona" *Note* Multiple row update. 0:0.093 ExecuteSql update T_CITIZEN_STATUS set updater = "sabrina" where updater = "sarah" *Note* Reverse that update. 0:0.093 ExecuteSql update T_CITIZEN_STATUS set updater = "sarah" where updater = "sabrina" *Note* Insert to update all indices. 0:0.015 ExecuteSql insert into T_CITIZEN_STATUS values ( 999999999, "4th and harvey", "A", "A", null, "1962012910010100", "me") *Note* Multi index select. 0:0.015 ExecuteSql select * from t_citizen_status where location = "4th and harvey" and last_update < "20000112910010100" and updater = "me" 0:0.000 TupleCount *Note* A delete update of all indices. 0:0.000 ExecuteSql delete from T_CITIZEN_STATUS where updater = "me" *Note* Multi-column index 0:0.109 CreateIndex create index multicol on t_citizen_status ( updater, status ) *Note* Check not equal, greater and less than. 0:0.015 ExecuteSql select * from t_citizen_status where updater <> "kate" 0:0.000 TupleCount *Note* Check object health of an indexed database. 0:0.062 ShowHealth *Note* Drop one index from a table. 0:0.000 DropIndex t_citizen_status.NDX_id *Note* Drop all indices from one table. 0:0.015 DropIndex t_citizen_status.* *Note* Restoration of database after tests. 0:0.031 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_seg ; userLocation = RAGAN6 ; UserInstanceId = jragan ; 0:0.015 OpenDatabase demo_seg, , , 0:0.000 LockObject database, x 0:0.046 RestoreBackup c:\axhandle\db\backup\backup_demo_seg\demo_seg\ 0:0.015 OpenDatabase demo_seg, , , 0:0.046 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_main ; ____________________________________________ . . . . . . . . Miscellaneous tests follow. *Note* Axsys: Purge it in case it"s running with an existing database. 0:0.000 AxsysClear *Note* Axsys: Create a node. 0:0.000 AxsysAlterNode create , server22 , me , assignedname=test_instance, cell=5, fromcomputer=server23, interval= 5 ,dataprotocol = standard, port=3333, sendpause=.01, buffer=2458, commprotocol= syslink , encrypt=no, authenticate=no, description= a_test_node *Note* Axsys: Insert a segment configuration. 0:0.000 AxsysAlterSegmentLimit create , server22 , me , t_log , 20000000 , 1000000 *Note* Axsys: Insert an alias configuration. 0:0.000 AxsysAlterAlias create , server22 , me , t_log , t_alias *Note* Axsys: Update a node configuration. 0:0.000 AxsysAlterNode update , server22 , me , assignedname=test_instance, cell=5, fromcomputer=server23, interval= 5 ,dataprotocol = standard, port=3333, sendpause=.01, buffer=2458, commprotocol= syslink , encrypt=no, authenticate=no, description= a_test_node_update *Note* Axsys: Reload node in a running instance. 0:0.000 ReloadNode server22, me *Note* Axsys: Clear node in a running instance. 0:0.000 ReloadNode *Note* Axsys: Update a node description 0:0.000 AxsysAlterNode update , server22 , me , description= a_different_description *Note* Axsys: Retrieve the axsys information. 0:0.000 ShowAxsys *Note* Axsys: Drop an entire node. 0:0.000 AxsysAlterNode delete , server22 , me *Note* Axsys: Create a free node. 0:0.000 AxsysAlterNode create , free_node_1 , , assignedname=free_node_1, status =a, type=fr, axsysname= test_instance, cell=1, port=3333, sendpause=.01, buffer=2458, commprotocol= syslink , encrypt=no, authenticate=no, description= test_node_created_by_the_test_script. *Note* Axsys: Create a table alias for the free node. 0:0.000 AxsysAlterAlias create , free_node_1 , , t_log , t_log_node_alias *Note* Axsys: Create a segment spec for the free node. 0:0.000 AxsysAlterSegmentLimit create , free_node_1 , , t_statistic , 20000000 , 1000000 *Note* Axsys: Drop the entire axsys configuration. 0:0.000 AxsysClear *Note* Jobs: Create a simple job. 0:0.000 CreateJob j_simple_job DoComm* executesql CommParm* select count(*) from t_log_dup *Note* Jobs: Create a compound job. 0:0.000 CreateJob j_compound_job DoComm* runjob CommParm* j_simple_job DoComm* executesql CommParm* select * from t_log *Note* Jobs: Run a job. 0:0.015 RunJob j_compound_job *Note* Jobs: Drop job. 0:0.000 DropJob j_simple_job *Note* Jobs: Drop job. 0:0.000 DropJob j_compound_job *Note* Check the status of a single table. 0:0.000 ShowHealth t_log *Note* Check the health of the entire database. 0:0.062 ShowHealth *Note* Network scan. 0:0.015 NetworkScan yes *Note* Backup and recovery are done by all query tests, *Note* so this is only for a distributed database manager. *Note* Encryption. 0:0.109 Crypt e,c,n,,"this is a truly very nice key","This string is testing the encryption mechanisms." *Note* Decryption 0:0.046 Crypt d,n,c,,"this is a truly very nice key", Return deleted for AxleBase security. *Note* Authentication. 0:0.328 Authenticate *Note* Authenticate the return. 0:0.265 Authenticate "Return deleted for AxleBase security." *Note* Specify a non-standard protocol within a query. 0:0.015 ExecuteSql SELECT * FROM T_JOB ; a-ppendix ( returnprotocol (xml) ; ) *Note* Non-standard returns: Switch to XML protocol. 0:0.000 AlterDatabaseAttribute ReturnProtocol = xml *Note* Non-standard returns: Get an XML dataset. 0:0.000 ExecuteSql SELECT * FROM T_JOB *Note* Non-standard returns: Read the dataset. 0:0.000 ReturnDataStream *Note* Non-standard returns: Switch to SOAP protocol. 0:0.000 AlterDatabaseAttribute ReturnProtocol = soap *Note* Non-standard returns: Get a SOAP dataset. 0:0.000 ExecuteSql SELECT count ( * ) FROM T_LOG *Note* Non-standard returns: Read the SOAP return. 0:0.000 ReturnDataStream *Note* Non-standard returns: Return to the standard protocol. 0:0.000 AlterDatabaseAttribute ReturnProtocol = standard *Note* The query a-ppendix cached return. 0:0.000 ExecuteSql select * from t_statistic ; a-ppendix ( CacheReturn() ; ) *Note* Get one row of the delayed return 0:0.000 ReturnCache 1 *Note* Check the cached return 0:0.000 TupleCount *Note* Query encryption a-ppendix test has been removed for AxleBase security. *Note* Retrieval of the encrypted return has been removed for AxleBase security. *Note* Use a select-into to export into a variable width text file. 0:0.015 ExecuteSql select * into export_var in c:\axhandle\db\backup\ from t_log where owner <> "test" ; a-ppendix( Columntype(v) ; ) *Note* Use a select-into to export into a fixed width text file. 0:0.015 ExecuteSql select * into export_fix in c:\axhandle\db\backup\ from t_log where owner <> "test" *Note* Use a select-into to export xml into a file. 0:0.015 ExecuteSql select * into export_soap in c:\axhandle\db\backup\ from t_log ; a-ppendix( returnProtocol (soap) ; ) *Note* Use a select-into to create a table. 0:0.015 ExecuteSql select * into T_TEMP from T_LOG where station = "server4" ; a-ppendix( row ( t_log , 5 , 10 ) ; ) *Note* Lock database for the alter table command. 0:0.000 LockObject database, x *Note* Unlock database after the alter table command. 0:0.000 LockObject database, *Note* Drop the table with a complete sql command. 0:0.031 DropTable drop table T_temp *Note* Prepare a table for import tests. 0:0.000 ExecuteSql delete from t_log_dup *Note* Import fixed width column to column. 0:0.046 ExecuteSql import source = c:\axhandle\db\backup\export_fix.txt ; target =T_LOG_DUP ; ColumnCount = 5 ; ColumnWidths = 21,1,10,10,100 ; ColumnType= f ; Index= no ; StopOnBadData = yes ; RowStart = 2 ; RowGet = 10 ; *Note* Import fixed width using a column map, *Note* and the import command. 0:0.046 Import import source = c:\axhandle\db\backup\export_fix.txt ; target =T_LOG_DUP ; map = owner < 3 , station <4 , log_msg< 3 ; ColumnCount = 5 ; ColumnWidths = 21,1,10,10,100 ; ColumnType= f ; Index= no ; StopOnBadData = yes ; RowStart = 6 ; RowGet = 3 ; *Note* Import variable width column to column. 0:0.046 ExecuteSql import source = c:\axhandle\db\backup\export_var.txt ; target =T_LOG_DUP ; ColumnCount = 5 ; ColumnWidths = 21,1,10,10,100 ; ColumnType= v ; columnSepArator = ^ ; RowTerminator = -*eol*- ; Index= no ; StopOnBadData = yes ; RowStart = 23 ; RowGet = 10 ; *Note* Import variable width using a column map. 0:0.046 ExecuteSql import source = c:\axhandle\db\backup\export_var.txt ; target =T_LOG_DUP ; map = owner < 3 , station <4 , log_msg < 5 ; ColumnCount = 5 ; ColumnWidths = 21,1,10,10,100 ; ColumnType= v ; columnSepArator = ^ ; RowTerminator = -*eol*- ; Index= no ; StopOnBadData = yes ; RowStart = 2 ; RowGet = 10 ; *Note* Check the imports. 0:0.000 ExecuteSql SELECT count ( * ) FROM T_LOG_DUP 0:0.000 Tuple *Note* Restore the import test table. 0:0.000 ExecuteSql delete from t_log_dup *Note* Virtual tables: Switch to the virtual database for tests. 0:0.031 ConnectionString domain = c:\axhandle\db\demodom\ ; database = demo_virtual ; *Note* Virtual tables: Select from a virtualized text file. 0:0.000 ExecuteSql select * from T_VIRTUAL_TEXT 0:0.000 TupleCount *Note* Virtual tables: Select from a virtualized external table. 0:0.015 ExecuteSql select * from T_virtual_country_code_AXLEBASE 0:0.000 TupleCount *Note* Virtual tables: Select from a virtual concatenation. 0:0.015 ExecuteSql select * from T_VIRTUAL_LOG_CAT *Note* Switch back to the demo_main database. 0:0.046 ConnectionString domain = c:\axhandle\db\demodom\ ; database = demo_main ; description = This is a demonstration and test database. ; *Note* Show segment report for a single table. 0:0.000 ShowSegments T_JOB *Note* Purge: Exclusive lock required on the database. 0:0.000 LockObject database, x *Note* Purge: Purge the entire database. 0:0.015 Purge *Note* Purge: Purge a single table with forced recount. 0:0.000 Purge t_log, force *Note* Purge: Purge with node spec. AxHandle was corrupting it. *Note* Purge: Purge only the system tables. 0:0.000 Purge system *Note* Purge: Remove the lock. 0:0.000 LockObject database, *Note* Restoration of database after tests. 0:0.031 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_seg ; userLocation = RAGAN6 ; UserInstanceId = jragan ; 0:0.015 OpenDatabase demo_seg, , , 0:0.000 LockObject database, x 0:0.031 RestoreBackup c:\axhandle\db\backup\backup_demo_seg\demo_seg\ 0:0.015 OpenDatabase demo_seg, , , ____________________________________________ *Note* . . Additional Select tests follow. *Note* Open the target database for tests. 0:0.062 ConnectionString domain = c:\axhandle\db\demodom\ ; database = demo_main ; *Note* Test the table master alias with a sql alias. 0:0.000 ExecuteSql select testNameAlias.owner m from testNameAlias n where n.m = "kate" 0:0.000 Tuple 0:0.000 TupleCount *Note* In with a not-like. 0:0.000 ExecuteSql select ownEr, log_msg from t_log wherE owner iN ("kate" , "joHn", "deborah", "cecilia", "carie" ) and statIon noT liKe "server3" 0:0.000 Tuple 0:0.000 TupleCount *Note* Not-in with a not-like. 0:0.000 ExecuteSql select owner, log_msg from t_log wherE owner not iN ("kate" , "joHn", "deborah", "cecilia", "carie" ) and station not like "server3" 0:0.000 Tuple 0:0.000 TupleCount *Note* Between in a reverse. 0:0.000 ExecuteSql select owner, log_msg from t_log where ownEr betWeen "s" and "laura" 0:0.000 Tuple 0:0.000 TupleCount *Note* Not-between in a reverse. 0:0.000 ExecuteSql select owner, log_msg from t_log where ownEr not betWeen "s" and "laura" 0:0.000 Tuple 0:0.000 TupleCount *Note* Sort. 0:0.000 ExecuteSql select * from t_log oRder by owNer, log_time, log_msg, station, error_flag 0:0.000 TupleCount *Note* Row clause. 0:0.000 ExecuteSql select owner, owner_share_code, job_name, description from t_job order by owner, job_name ; a-ppendix( row ( t_job , 1 , 9 ) ; ) 0:0.000 Tuple 0:0.000 TupleCount *Note* Select from non-standard row terminator and column separator. 0:0.000 ExecuteSql select owner, setting_name, setting_value from t_config where ownEr <> "elise" 0:0.000 Tuple 0:0.000 TupleCount *Note* Join: Left. 0:0.046 ExecuteSql select * from t_log lefT join t_screen on t_log.owner = t_screen.owner 0:0.000 TupleCount *Note* Join: Right. 0:0.046 ExecuteSql select * from t_log riGht join t_screen on t_log.owner = t_screen.owner 0:0.000 TupleCount *Note* Join: Outer. 0:0.078 ExecuteSql select * from t_log outer join t_screen on t_log.owner = t_screen.owner 0:0.000 TupleCount *Note* Join: Inner. 0:0.046 ExecuteSql select * from t_log inner join t_screen on t_log.owner = t_screen.owner 0:0.000 TupleCount *Note* Join: Left with a where. 0:0.015 ExecuteSql select t_screen.screen_top, t_screen.screen_left, t_screen.screen_height, t_screen.screen_width from t_screen left join t_job on t_screen.owner = t_job.owner where t_screen.owner = "sarah" 0:0.000 Tuple 0:0.000 TupleCount *Note* Join: Left when base has a where. 0:0.062 ExecuteSql select t_log.owner, t_app_crud.owner from t_log lEft joiN t_app_crud on t_app_crud.owner = t_log.owner where t_log.owner = "laura" 0:0.000 TupleCount *Note* Join: Right when base has a where. *Note* Using alias for both tables. 0:0.015 ExecuteSql select a.owner, b.owner from t_log a right joiN t_app_crud b on b.owner = a.owner where a.owner = "laura" 0:0.000 Tuple 0:0.000 TupleCount *Note* Join: Multiple with a segment clause. 0:0.062 ExecuteSql select * from t_log inNer join t_screen on t_log.owner = t_screen.owner right join t_job on t_screen.owner = t_job.owner ; a-ppendix ( segment( t_log , 1, 50 ) ; ) 0:0.000 TupleCount *Note* Join: More multiples. 0:0.109 ExecuteSql select T_APP_CRUD.owner, t_log.owner, t_log.station, t_log.log_msg from t_log left join t_screen on t_log.owner = t_screen.owner outer join t_job on t_screen.owner = t_job.owner inner join T_APP_CRUD on t_log.owner = T_APP_CRUD.owner where t_log.owner < "laura" 0:0.000 Tuple 0:0.000 TupleCount *Note* SQL aliasing in where clause. 0:0.000 ExecuteSql select count ( * ) from t_log as t where t.station = "aardvark" 0:0.000 Tuple 0:0.000 TupleCount *Note* SQL aliasing in a join. 0:0.062 ExecuteSql select * from t_config lEft joiN t_screen t on t_config.owner = t.owner where t.owner <> "xtestx" 0:0.000 TupleCount *Note* Join with column spec and number comparison in a where. 0:0.078 ExecuteSql select t_cOnfig.owner , t_config.setting_name , t_config.setting_value, t_screen.owner, t_screen.screen_name, t_screen.screen_top, t_scReen.screen_left, t_screen.screen_height, t_screen.screen_width from t_config left join t_scrEen on t_config.owner = t_screen.owner where 2000 > t_screeN.screen_lEft 0:0.000 Tuple 0:0.000 TupleCount *Note* Row clause. 0:0.000 ExecuteSql select * from t_qUery ; a-ppendix( row ( t_query , 3 , 2 ) ; ) 0:0.000 TupleCount *Note* A like in the where clause. 0:0.000 ExecuteSql select statistic_name from t_statistic wHere statistic_name like "*connect*" 0:0.000 Tuple 0:0.000 TupleCount *Note* Node clause with no qualifying nodes. 0:0.000 ExecuteSql select * from t_log ; a-ppendix ( node ( xerver26 , xerver204 , cell2 ) ; ) *Note* Node clause that qualifies the entire axsys. 0:0.000 ExecuteSql select * from t_log ; a-ppendix ( node ( * ) ; ) *Note* Row clause with a where. 0:0.000 ExecuteSql select * from t_query where owner = "malachai" ; a-ppendix( row ( t_query , 5 , 2 ) ; ) 0:0.000 TupleCount *Note* Multiple row clauses with multiple segment clauses. 0:0.015 ExecuteSql select a.owner, a.screen_name, a.screen_top, a.screen_left, a.screen_height, a.screen_width from t_screen a left join t_job on a.owner = t_job.owner where a.owner = "sarah" ; a-ppendix( row(t_screen, 20, 300) ; segment(t_screen, 1, 32) ; ) 0:0.000 Tuple 0:0.000 TupleCount *Note* The where date comparison less than. 0:0.000 ExecuteSql select count ( * ) from t_job where date_created < "2005" 0:0.000 Tuple 0:0.000 TupleCount *Note* The where date comparison greater than. 0:0.000 ExecuteSql select count ( * ) from t_job where date_created > "2005" 0:0.000 Tuple 0:0.000 TupleCount *Note* Compound parenthetical where groups. 0:0.000 ExecuteSql select connection_name, query_name, owner, job_name, description from t_job where owner like "j*" or ((job_name like "3*" and owner > "deborah" ) or output_type = "text file" ) 0:0.000 Tuple 0:0.000 TupleCount *Note* Row clause with a like. 0:0.000 ExecuteSql select owner from t_log where log_msg like "* is no*" ; a-ppendix( row( t_log, 5, 10) ; ) 0:0.000 Tuple 0:0.000 TupleCount *Note* Internal column comparision. 0:0.000 ExecuteSql select job_name from t_job where date_created = last_update *Note* Test a-ppendix, CacheReturn, and queryId. 0:0.000 ExecuteSql select job_name from t_job ; a-ppendix ( CacheReturn() ; queryid( myfirstquery ) ; ) *Note* Slightly complex where logic. 0:0.000 ExecuteSql select * from t_log where ( owner like "c*" and log_time like "20*" ) or ( log_msg like "c*" and owner > "deb" ) 0:0.000 TupleCount *Note* Select with DateConvert. 0:0.000 ExecuteSql select * from t_log where dateconvert ( "may 6, 3020" to date ) > log_time 0:0.000 TupleCount *Note* AxleBase functions in an insert. 0:0.015 ExecuteSql insert into t_citizen(name_first, last_update) values( string( 5, 30 , "Anna" & datetoserial("2007091817254623") & "ksld" & dateconvert( "feb 7, 2008" to date ) & string ( 1, 7, "AnnaRight") ) , dateadd( "m" , 5 , dateconvert(datefromserial(733309) *Note* Compound where clustering with AxleBase functions. 0:0.015 ExecuteSql select licensed_breeder, name_first, name_last from t_citizen where ((( name_first = string( 5, 30 , "Anna" & datetoserial("2007091817254623") & "ksld" & dateconvert( "feb 7, 2008" to date ) & string ( 1, 7, "AnnaRight")) and string( 1, 25 , last_update ) = dateadd( "m" , 5 , 0:0.000 Tuple 0:0.000 TupleCount *Note* An insert without column names. 0:0.000 ExecuteSql insert into t_image values ( "test insert", "", null, null, null, null, null, null, null, null, null, null, null ) *Note* An insert with partial column name specification. 0:0.000 ExecuteSql insert into t_image ( image_name , subject ) values ( "test insert", "sandra" ) *Note* An insert with all columns specified. 0:0.000 ExecuteSql insert into t_image ( image_NAME , subject , date_created , image_type , category , source , source_location , source_medium , date_acquired , description , image , last_change , changed_by ) values ( "test insert", "sandra", dateconVert("augUst 2, 1964" to date), null, null, null, null, null, null, null, null, datenow(datetimex), *Note* Check the previous inserts. 0:0.000 ExecuteSql select image_name, subject from t_image where image_name = "test insert" 0:0.000 TupleCount *Note* An insert from a select without column specs. 0:0.015 ExecuteSql insert into t_log_dup select * from t_log *Note* An insert from a select with specified columns and a where. 0:0.015 ExecuteSql insert into t_log_dup ( log_time , log_msg ) select last_change , screen_name from t_screen where screen_name = "frmdoc" *Note* Test previous inserts. 0:0.000 ExecuteSql select * from t_log_dup 0:0.000 TupleCount *Note* Restoration of database after tests. 0:0.046 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_main ; userLocation = RAGAN6 ; UserInstanceId = jragan ; 0:0.031 OpenDatabase demo_main, , , 0:0.000 LockObject database, x 0:0.078 RestoreBackup c:\axhandle\db\backup\backup_demo_main\demo_main\ 0:0.031 OpenDatabase demo_main, , , 0:0.046 ConnectionString domain =c:\axhandle\db\demoDom\ ; database = demo_main ; *Note* 0:1.171 An arrayed insert of 743 rows with 79,248 characters saved the test results into demo_main.T_DEMO_SCRIPT. ____________________________________________ Speed Checks Benchmark is currently 0.3 seconds. It may be changed in the configuration. Following operations exceeded the benchmark. 0:1.234 ExecuteSql select * from t_citizen_status a right join t_log on a.updater = t_log.owner where a.updater = 'sarah' 0:0.328 Authenticate ____________________________________________
-- . --
|-------------------| The previously described tests can be run in a continuous cycle from a menu option. This is designed for stressing AxleBase; running load tests. It is not designed to be a test of speed. Select the stop option from the same menu to stop the tests. A well designed application would recover when AxleBase returns an "Error". For example, if AxleBase reports a query timeout, the app might regenerate the failed request or ask the user if he wants to retry. However, AxHandle is a development tool, so it is designed to stop on error and display it. The tests are designed to run against a fresh copy of the demo database. When they are started, AxHandle performs a few checks on the tables for that reason. The slowest test cycle puts a minute between tests. That test can take over two minutes to stop because of the length of the pauses. Since AxHandle is not multitasking, the cycling must be stopped before doing anything else. AxHandle should not be unloaded while a test is running. "YieldProcessor" :
Logging :
If logging is on, its overhead and the impact of the log size should be assessed. Some errors that can be logged cannot be passed back to the host, so AxHandle will not know about them. All errors that can be detected by AxleBase are logged if logging is on, whether or not they can be returned to the host. Hardware danger :
Test statistics and the SQL queries are displayed in the return window during the test cycling. A test setup can be designed as needed. A single instance can be run at low speed to watch the operation, or can be run at high speed to watch the effect. Multiple instances can be run to load the system, and remote multiple instances can be run against a database to watch the effect. ( These are NOT recommendations. See the previous warning. )
-- . --
|-------------------| Load the system. Accept the license terms to display the main screen. Press the demo_db button. This will create demonstration databases under the app. The path may be something like c:\program files\AxHandle\db\demo\ After it creates the demo database, it will it will remain open so you can immediately begin querying and investigating. You can change to a different database with a couple of different methods. If using the ConnectionString command, enter the domain path which will be something like c:\program files\AxHandle\db\demoDom and enter the name of the database such as demo_virtual. Then press the do_it button. Find the "ShowDomainAttributes" command and select it. Press the top do_it button. The domain's attributes will be displayed in the return window. Select the "OpenDatabase" command. Type the name of a database, demo or demo_virtual in the parameters window. Press the do_it button. The database will be opened. Select the "ShowDatabaseAttributes" command and press the do_it button. Attributes will appear that describe the currently open database. Select the "ShowTables" command and press the do_it button. The names of the tables in the database will appear. Select the "ShowTable" (singular) command. Enter the name of a table. Press the do_it button. The table's characteristics will appear. Now, try it with the ShowTableAttributes command. Select the "ExecuteSql" command in the lower window. Enter a query in the lower parameter window, such as "select * from t_log". Press the lower do_it button. The rows will appear. Try a select after unloading and reloading the app. You will find that it does not work. AxHandle creates a new "Manager" object and data "Vector" object for you when he loads, but you need to open a database as was done previously.
-- . --
_________________________
|-------------------| AxServer is a simple database server that uses AxleBase as its database manager. It demonstrates the server support that is built into AxleBase for a database server host. AxServer uses the Socket Programming interface for communication. Its protocol stack is SysLink/ TCP/ IP. ( Pursuant to the commands of Him for whom I work, my software will transmit only that which is openly and simply specified. Furthermore, in His trust, care is taken to insure that every transmission is only what you would want if you had the time to study every transmission and all documentation.) When it goes on line, AxServer loads an "Instance" of AxleBase in the background to do its work. An "AxHandle" client on a different computer can send commands to it and it will return the data or results. When a communication session is established, only the server's AxleBase instance is used. The client passes commands straight to the server and the server passes them to AxleBase. The server then returns the result to the client. The demo systems are not intended for production work. The Windows operating system requires a new handle for almost every event and the demo apps cannot release those handles so they eventually reach the Windows limits. AxServer hits the limit quicker than AxHandle because Windows communication objects also use handles. ( Reminder: The AxleBase API supports "ODBC" if you want to build an ODBC driver for your server.)
-- . --
|-------------------| This is a simple demonstration app. Not a production-quality system. Not designed for high speed operations. Not designed for unattended operation.
It has limited error handling. It cannot handle multiple NICs on either end. The primary function of this database server is research and testing in the AxleBase lab so, unlike a true database server, this one is designed to stop processing and report when certain kinds of errors happen. Obviously, if for no other reason, that one prevents it from being used as a production server. AxServer is not solid. The majority of the development effort is put into AxleBase and secondarily into the test apps. That leaves little time for communication development and leaves the server in a primitive state.
-- . --
|-------------------| The demonstration requires two computers that communicate with each other on a network. Perform these operations in the sequence shown. Uninstall "AxHandle" and AxServer if you already have them. New versions are needed. Install AxHandle on a computer. Install the server, AxServer, on the other computer. Start AxServer and AxHandle. Press the button on AxServer to start its server. Press the server button on AxHandle to display the communication panel. Enter the server's computer name and press the connect button. Press AxHandle's demo_db button to create the demonstration database on the other computer. If everything was done correctly, you will see the system building a database on the AxServer computer and then running a series of tests. The two systems will talk to each other during the process and will show you parts of their conversation. After the tests are complete, you will be connected to the remote database so you can run tests. Select the ExecuteSQL option in the lower window, enter
-- . --
|-------------------| "SysLink" is the application-level communication protocol that is used by the AxleBase suite. Any app that uses the SysLink / TCP / IP stack can communicate with AxHandle and AxServer. The entire "SysLink" protocol can be seen on the jragan.com/ "SysLink" page on this web site. See also the discussion of the AxleBase "Virtual Private Network".
-- . --
|-------------------| -- . --
|-------------------| Query options are contained in Axon's drop-down lists. Options can be selected by clicking on them until all are selected that are needed in a query. The query is then run by pressing a button. After Axon is told to open a database, options such as table names, column names, etc., automatically fill drop-down boxes from the database, so the user has them at his fingertips. He selects whatever is needed and runs the query. Connecting to a database loads all of the database's table names into a list from which can be selected the tables that are needed for the query. As each table is selected, its column names are automatically loaded into a drop-down list for selection. Up to six tables can be joined in a query. The details of making a database connection can be a pain in the neck, so a database connection is saved after it is created. Many connections can be made, so the databases can be opened with point-n-click. Data returns are displayed in Notepad.
-- . --
__________________________________________________ -- . --
_________________________ -- . --
|-------------------| AxleBase is designed to be embedded inside a host application. He talks directly to the host. As soon as he is installed, the host application can send commands to him. He provides his own interface for programming. No other software is needed. Not even an "ODBC Driver". If AxleBase is embedded in a server, then that server may use an ODBC driver. The AxleBase interface is designed to support the ODBC protocol without additional programming.
-- . --
|-------------------| An AxleBase "Index" is different. A database manager cannot be optimized for both the large and the ordinary. One or the other must be slighted, so AxleBase is internally optimized for very "Large" data object indices. Since AxleBase is not intended for heavy concurrent access, the degradation on very small tables may not be noticeable, but the improvement on very large tables will be obvious. Small Repeating Datasets :
Boolean Columns :
Indexing a very large AxleBase table can have a tremendous positive impact on speed. Scanning a twenty billion row table, that is stored on disk drives, for a value can take weeks or months. An AxleBase index can sometimes reduce that time to a fraction of a second. ( One of the tables that was built in the lab to test AxleBase, contains 100 Billion rows.
The AxleBase approach to indexing is unlike that of ordinary database managers. This is necessary to optimize AxleBase for his specialized abilities. A management method that sometimes appeals to the "DBA" is to index every column in the database, but that can slow some operations in a very large database. Since the slowed operations in normal databases are not heavily used by most people, the cost is seldom noticed. For example, if it takes two thousandths of a second to insert a row instead of one thousandth of a second, nobody notices. But what happens if the database manager is handling a truly large table? One thousandth of a second per row will add a week to the construction of a billion-row table. And if the table will become very big, that millisecond can turn into months. The big name brands also sometimes use that approach. In some cases, a database manager will automatically create an index without the knowledge of the DBA. However, to do that in an AxleBase database could be disastrous simply because AxleBase is designed for the management of very large data objects. Therefore, the DBA can expect no unexplained gain in speed as sometimes happens with a big name brand. A point of interest is the way that AxleBase handles a multi-column index. He creates the multi-column index and, while he is at it, he creates single-column indices for each column in the multi-column index. His query optimizer knows that, so he mixes and matches as needed by each query. AxleBase has special tools to help the DBA with building and indexing. An index in a table will slow a high speed build greatly. Dramatic speed improvement can sometimes be attained by first building the table, and then indexing in a separate operation.
A normal table build usually hides the slow speed caused by indexing because the system spends much time just waiting for work. It is therefore sometimes advisable to allow the index to build during the table build for normal slow operations so that it can be immediately used. AxleBase recognizes complex relationships between data characteristics, data object size, and the environment. He also knows that the characteristics of that data may change in ways that are important but are too subtle for a human to detect. He uses specialized internal algorithms that help him decide upon the best way to index each data object for the fastest build speed and for the fastest index concomitant with his specialized mission objectives. Before indexing a table file, he analyzes the entire file to choose the best options for it. If the file has little or no data, then AxleBase makes his best guess about how to index it, but it is only a guess, so in that case, the index for that segment should be rebuilt after the segment is filled. Some analysis operations use the buffer to determine the characteristics of the final index. The larger the buffer, if it is not too large for the hardware, the more efficient will be those indices after they are built. When possible, the fastest insert and index operation, by far, is attained by first completely populating a table, and then indexing it afterwards. Creating an index while a table is built will result in much slower indices. If the hardware or operating system stops or has a problem while indexing a file, then the entire index for that file must be restarted. Reading a table that has been partially indexed may result in data being missed until that data is indexed. Therefore, for a "VLDB" that is being built over a long period and that must be used during that period, it may be prudent to bring each table's data file on line only after it is fully populated and entirely indexed. See also the "VLDB" Addendum to the "CreateIndex" command, and the ShowIndices command in the API chapter.
-- . --
|-------------------| AxleBase is designed for the host, so he will always be running on the same machine on which his host is running. The objects that he creates are expected to be used only by his host on the local machine. There will be times, however, when it is desirable to share local data with remote locations and the organization does not want to build a database server into their host. In such a case, domains and databases can be shared across a network without a database server. Objects are shared after they are created. If a database is shared, then its controlling domain will also be shared. The "ShareDatabase" command is covered in the API chapter. Of course, sharing in that manner obviates "Security" controls.
-- . --
|-------------------| These features may help in the design of an installation.
-- . --
|-------------------| AxleBase groups databases into domains. An installation can have any number of domains and each domain can contain many databases. The attributes and data for each domain are stored in its own database. The character of each domain is controlled by the DBA. Each database can be in its own domain, all can be in a single domain, they may be assigned to domains by a certain characteristic, or whatever. The domain is an administration tool: It can be used or ignored, but AxleBase requires that every database must be in a domain. Before a database can be opened, its controlling domain must be opened. A database domain is opened by the "Manager" object according to the attributes stored in the domain's database. It reads the attributes and uses them to configure itself. After the domain is active, its client databases can be created and/or opened. A domain may be opened regardless of whether or not it exists. If it does not exist, the specified location is valid, and the create parameter is "yes", then AxleBase initializes a new domain database for the domain at that location. After a domain is opened, its client databases may be created or opened. Let us make this point explicit: Opening a domain either opens it, if it exists, or creates and opens it. That is why there is no "CreateDomain" command. For that reason, the DBA should take care in opening domains, or he will end up with cluttered disks. Pseudo Code Example:
In steps 1 and 2 above, a new Manager object is created. The new Manager object is named oMgr in the example, but can be named anything appropriate. In step 3, oMgr is told to open the domain that is named demoDom with the "OpenDomain" command. In step 4, oMgr is told to open the client database named prodClient3 with the "OpenDatabase" command.. oMgr is then ready to work with the prodClient3 database. A database domain may be distributed across spindles, controllers, and computers. The client databases are not required to be on the same medium and may be located as desired. The same is true of other objects as covered in subsequent sections. See also: OpenDomain; DropDomain; CreateDatabase; ConnectionString
-- . --
|-------------------| Concurrent operation is the simultaneous use of a database by multiple systems or people. Without controls, concurrent operations can disrupt each other by locking data objects and by trying to update the same data. The results are unpredictable and can result in data loss, and sometimes even the loss of entire data objects. AxleBase was designed with the concurrency problem in mind so that he can handle multiple users, but it should be noted that his trials and tests ended when his development ended and did not include the heavy concurrency that is handled by ordinary database managers. AxleBase Complexity:
The tests that are published on the "Notable Tests" document present the results of concurrency stress tests. As can be seen from those results, AxleBase can handle a substantial load, but it should be stressed that he is not designed for high-speed, heavy-concurrency "OLTP". Actual use should not exceed the limits of those tests until more concurrency testing is done. AxleBase Failsafe:
Failure Envelope:
System Locks:
A decision should be made during the design of the host app concerning what the host should do when AxleBase reports a "Lock" conflict.
-- . --
|-------------------| AxleBase tries to make life as easy as possible for the developer. Character case is usually unimportant. Do it the way that you want. The system will accept anything and try to standardize internally for you. If white space is required for delimitation, be sure that at least one character is present. Otherwise, use it as you want and AxleBase will clean up after you. AxleBase does not store space padding. He trims leading and trailing spaces from data before saving it. All in-code comparisons must be constructed accordingly. (This is not in compliance with ANSI-92 SQL.) Where parentheses, commas, colons, etc., are used, such as in standard SQL commands, be sure that they are present. However, do not be overly concerned about the presence or absence of a space before or after a parenthesis or a comma or whatever. Wherever possible, AxleBase attempts to read what you mean and not what you write. AxleBase will accept formatting in a SQL command. Most of us format long SQL statements so that we can understand them when they quit working six months later. Never use an undocumented feature that you might stumble across in AxleBase. Such features tend to change or go away during development. AxleBase does not return nulls. If a value is null, there is nothing to return, so he returns nothing. Perhaps that seems silly, but it saves the host developers from writing tons of extra code to protect their systems. Some database managers return nulls, which crashes the system in every return. Where a command tells AxleBase whether or not to do something, you can give him a simple yes or no. A state may or may not become true or false after the command is executed, but that state is after the command is submitted. His "Boolean" column data type also accepts yes and no.
-- . --
|-------------------| I am just plain tired of my own inability to use bad logic, regardless of masses of people who do it. After many years of programming, I am well aware that the zeroth element is how the programming community identifies the first element of a set, but that is far from logical. Of course, it is possible to become comfortable with logic flaws, as evidenced by the many old software engineers around the world. And it is possible to aspire to poor logic, as evidenced by the many young wannabe software engineers. But I have become fed up with it. Therefore, AxleBase respects mathematical logic by numbering the first element of a set as the first element.
I am hoping that few thinking people will object to this particular deviation from an industry standard. The fact that something is accepted, commonplace, and standard sometimes means only that millions of people are of equal intelligence.
-- . --
|-------------------| AxleBase has multiple interfaces, any one of which may be selected for the current session. One of them is the standard interface and the others are abstractions of the standard interface. The usage of each is covered in the "Interface" section of the API chapter. All of them have access to the entire AxleBase functionality, but each is designed to meet a unique inter-system interface theoretical function. "Standard Interface" :
His entire standard interface resides in two objects: the "Manager" object and the "Vector" object. The interface is immediately available when those objects are instantiated. Commands are sent to those two objects and all responses come from them. "Abstract Interface :
"UniCom" and The "UniString" Interfaces :
The "Unicom Interface" accepts any standard interface command with its parameters. The "UniString Interface" accepts only a single "String" that can contain any standard command with all of its parameters. Abstraction and simplification does come at a price, however. Be sure to closely read the discussions in the API chapter. To use UniCom or UniString, instantiate the "AbstractInterface" object. It will instantiate any objects that it requires. Do not instantiate the standard interface objects when using the AbstractInterface object because the results will be unpredictable. Remember that the AbstractInterface object creates any objects that it needs such as the "Manager" and the "Vector". AxleBase is just another DLL on the computer. When he is installed on a computer, his programming interface is immediately available to any host system. If you know how to use Windows objects in your code, then you can use AxleBase. He runs as a COM server inside a host system, and only inside a host system. The syntax that is used to instantiate the objects depends upon the language of the host system and how the developer wants to use the objects. If the developer wants a tightly coupled interface, then he can compile a reference to AxleBase within the host system. The code can then refer directly to the objects. For example, the "AxHandle" system does not have a reference compiled into it. The objects change so often in the development environment that a hard coded reference interfered with testing, so AxHandle creates interface objects on the fly. An existing DLL can be unregistered, a new one placed where AxHandle can see it, and when AxHandle starts, he registers the new one and creates objects on the fly.
-- . --
|-------------------| The "Manager" object is an internal AxleBase software object that handles the management and administrative affairs of databases and domains. He creates domains, databases, tables, etc.; destroys objects; maintains them; handles "Security"; performs backups and Purges; etc. (Data is handled by the other object.) Depending upon the language, using the Manager object follows this pattern :
Before a database can be opened, the appropriate database domain must be opened. After a domain is opened, its databases can be opened. A database must be opened before any action can be taken on it. If it does not exist, it must be created and opened. Opening a database requires the execution of thousands of lines of code and many disk reads and writes. When the same database will be opened and closed repeatedly throughout the host system, a developer may decide to open and configure a Manager once at the top of his code and close it only as the host prepares to shut down.
-- . --
|-------------------| The "Data Vector" object is an internal AxleBase software object that handles data. He updates, inserts, deletes, retrieves, etc. He is the system vector for data. SQL queries such as select, insert, update, and delete are passed to him to tell him what to manipulate or return. The Vector object is a vector in both the mathematical and biological sense. There are two ways to create a data Vector object. One uses an object creation command such as the VB CreateObject command, and the other way tells a "Manager" object to create it. When a Vector object is created, it automatically connects to the Manager object. Using the other method, a Manager object is told to create a Vector object. A database that the Manager object opens is available to the Vector through the manager. Each Manager object can create any number of Vector objects and each may be in use. ( For command syntax, see the API chapter, Manager section, DataObjectCreate command. ) In either case, a Manager object may support any number of data Vector objects. The AxHandle system was creating free-standing Data objects at one time. Currently, there is always a Manager object available for a Vector as soon as the Vector is created. A line of Visual Basic code from AxHandle that creates a Vector object: A line of Visual Basic code from AxHandle that tells the AxleBase Manager to create an object: Depending on the programming language, using the data object may follow this pattern :
-- . --
|-------------------| When a client operates in a hostile environment, such as a mobile client, one can expect to frequently experience disruption of communications during long-running queries. AxleBase provides a function to ameliorate short-term communication disruptions during massive queries. When used by a client, it almost guarantees a data return if the query is received. If all clients are in a hostile environment, the "DBA" can tell the system to apply the function to all queries. (The maximum return size that it will protect is two billion " tuples".) Every query is assigned an identifier. The user can append an indentifier to his query, or if he does not, the system generates a unique identifier for it. The query user is usually unconcerned about it and may never know of it, but it serves as a handle on the query. After running a query, the "ShowDatasetAttributes" command will show the identifier of the current query, which will also be the ID of the dataset that it successfully created. Client Usage :
System-Wide Protection :
Timeout :
Server Loss :
Also, see the "ReturnCache", the "CacheReturn" SQL clause, and the "CacheReturns" system configurations and the "API" chapters.
-- . --
|-------------------| Visual Basic code to open a database might look something like this:
Visual Basic code to open a client database and run queries might look something like this:
-- . --
|-------------------| See the previous Visual Basic examples.
-- . --
|-------------------| WinBatch code to open and/or create a database would resemble the following. ( Some code lines are broken for readability. )
-- . --
_________________________ See also the following sub-sections, and the "LockObject" command. -- . --
|-------------------| The AxleBase locking mechanism is designed to support his very special objectives that include very "Large" data entities. For example, if an AxleBase "Instance" needs to read an index for a table query, he suspends other operations until finished with the index, applies the appropriate read lock to the index, does the operation, and unlocks the index. This results in faster over-all operation in the AxleBase environment. Locks take precedence over "Security" Grants. See Also :
-- . --
|-------------------|
A lock-space domain is a concept and is not a functional object. Its application to the subject helps describe how the system actually works. Discretionary Lock Domain Discretionary locks may be applied and removed by the host or user at any time by using the "LockObject" command. For example, the "DBA" might lock the database in preparation for a Backup. That type of lock will exist until the user exits, or the user removes the lock, or the lock expires. If an "Instance" abends and leaves a discretionary lock, it will expire and will be removed by the next system "Purge". Persisted Lock Domain The distributed architecture and independent nature of the AxleBase instances requires persisted as well as discretionary locks. Persisted locks are similar to discretionary locks. The difference is that they are object attributes and, therefore, are persisted indefinitely. They are controlled by the AlterTableAttribute, AlterDatabaseAttribute, and the AlterDomainAttribute commands. Autonomic Lock Domain Autonomic locks are invisible system locks and are described here only to complete the picture. They are seldom noticed and are visible only when a desired action is denied because of a system lock. A complete description of the autonomic locks would be so large that it might require separate documentation. AxleBase is continually applying and removing autonomic locks during any operation. The autonomic locks are applied and removed by the system as needed to support user activity. The previous index example used an autonomic lock. Autonomic locks are owned and controlled by the system and are part of the source of the AxleBase magic. Share locking is used whenever possible. Share locks permit simultaneous reads, but prevent writes to the object while it is being red. In some areas, such as small system tables, he uses only write locks to preclude all reads until the write is complete and employs Spinlocks to prevent read failures. Autonomic locks allow data updates to use dirty reads or read-through locks that allows the data to be red during an update. They increase speed and are used with success in many database manager brands. A row update failure is not retried. If the update fails, an "Error" is returned and the host or user is expected to take the appropriate action. Row updates are checked by automatic system rereads. Discretionary locks, persisted locks, and autonomic locks are operationally integrated and respect each other. Autonomic locks take precedence, but discretionary and persisted locks honor each other. See also the "LockObject" user discretionary command.
-- . --
|-------------------| Before addressing concurrency, it is important to observe a few very important facts in the AxleBase operation.
Concurrency is handled entirely by autonomic locks. Their activity is never registered in the lock tables since they are answerable only to each other, but they generate "Error" messages appropriate to each concurrency problem. The host must be prepared to react to those error messages. An important part of concurrency control is the "Spinlock" value that may be adjusted by the "DBA". When an "Instance" encounters an object with a system lock, it performs a "Spinlock" until the object is available up to the specified interval. If the object is not released in that period, the instance executes an access failure. The spinlock value must be neither too large nor too small to adequately support concurrency for each environment in which the distributed system is operating. (See the Spinlock section of the Configuration chapter.) The query timeout and the connection timeout are used in ways that are similar to the "Spinlock". In general, the query timeout is applied to a table object, the "Spinlock" value is applied to system objects, and connection timeouts are applied to domains and databases. As AxleBase operates, he uses many kinds of "Locks" on various objects and sometimes locks objects simultaneously and sometimes sequentially in a single operation. It is, therefore, difficult to describe the operations in this small document. In general, he uses share locks for reads and exclusive locks for data updates, but that is only a general statement. When he begins querying a table, he places share locks on table objects. As he finishes with each object, he removes the lock. Therefore, it is possible that a complex query could, in some situations, be interrupted by another "Instance" putting a write lock on the table's index or pointer table, for example. That could happen if the query accessed the index multiple times. It might also happen if the table has billions of rows because its pointers are accessed. Although unlikely, those events are possible. Tests, however, show AxleBase performing well at his concurrency design objective. The requirements of updates are more complex than those of reads. Keep in mind the fact that AxleBase must be prepared to update petabyte-sized tables. The rows must first be located, and then red like a query. They must next be prepared for the update, and then the new rows must be committed, and finally, the old rows must be deleted. The easiest way to control an update would be to lock the entire table and all of its component objects, and that works in ordinary database managers, but that would ruin concurrency in very "Large" tables, so it is not a viable option for AxleBase. The traditional atomic transactions were also considered because they work so well for Oracle and others, but they would slow operations tremendously in large tables. The AxleBase solution for updates is to update with shared locking. All of the target rows are located, red, marked, and recorded, and new rows are constructed. Then the writes begin. The new updated rows are all inserted into the table and the old ones are then deleted. For very large tables, all updates are performed simultaneously for the entire table. Each update step moves through the table like a wave. When a step reaches the end of the table, the next step-wave starts at the beginning of the table. Notice that a reader can jump into the middle of an update and query a row before the update is committed. That is by design; the data is presented "as is" until the commit. A simple insert is another matter. If it is a normal insert, which is usually a relatively small number of rows, it will be a quick operation, and locks will usually not even be noticed. If it is a very large table build, then the "DBA" wants a high speed operation so that millions of rows can be inserted around the clock and may even build off site. In either case, a write lock is needed, so a write lock is placed on each table segment until the write is complete or until the segment is filled. Note that those concurrency locks are not recorded and will not show up in the ShowLocks report. All of those lock operations are expected to be far quicker than the generation of a report. Even the build of a very large table uses quick intermittent locking. See Also ShowLocks command in the API chapter, and the "LockObject" user discretionary command. ( See the Testing section for results of concurrency stress tests. )
-- . --
|-------------------|
Column level locking has not been implemented due to a perceived lack of need. It may be re-considered later. Locks may be placed at each level, but are vertically additive through the object hierarchy. For example, an operation involving a table may automatically apply locks for the table, database, and domain before attempting the operation. An operation at the database level will first check both the database and the domain locks.
-- . --
|-------------------| AxleBase CRUD Table
The lock types follow an extended crud model. Each is a denial of a type of service. They are additive and multiple types may be set simultaneously. They are also additive hierarchically, so no level over-rides another. ( Note that the denial of service is unlike the "Security" system that grants service.) A type x exclusive lock takes an object offline and locks out all other users and processes until it is removed. A lock type may be used in multiple levels and multiple lock domains. For example, an exclusive lock is discretionary and not persisted. A "z" lock is the only system lock that may sometimes appear as an explicit code.
-- . --
_________________________ -- . --
|-------------------| A column-data type is neither a column type nor a data type, but is a combination of the two. They agree in most cases, so we tend to refer to them as one or the other, but the technical difference should be remembered because the two are not always the same. If you have a favorite name-brand database manager, there is a comparison table in the "Data Type Mapping" sub-section. ( This builder has worked with only a dozen or so database manager brand names.)
-- . --
|-------------------| BLOB is an abbreviation for Binary Large OBject. A blob can be anything that can be stored by a computer in a file. It is therefore, not considered data. It might be a photograph, music, text, etc. A BLOB is any object that can be retrieved and manipulated by software that is specially built for that type of object. (In theory, anything can be stored as a BLOB, but storage of anything that is not a Binary Large OBject can produce administrative problems, and might cause data loss.) Every BLOB in the database has a handle that completely and uniquely identifies the BLOB and that completely and uniquely identifies its location. The BlobHandle in the Windows operating system is the path and name, so the BlobHandle is a file pointer. A query for the BLOB object will return its handle which is a pointer to the file. The pointer can be used by BLOB handling software to load the BLOB object. AxleBase may be embedded in the BLOB handler or the handler can use a different host to do the querying.
The blob column width is discretionary because it must be able to contain the entire BlobHandle. Other characteristics are identical to the "String" type. The operation of this type is unlike any of the others.
Advanced Topic :
Tests :
Experience :
-- . --
|-------------------| The boolean type has only two value states that usually specify affirmation and negation. Table columns are defined as boolean with no length. The boolean type is stored as a single numeric character of either a 1 or a 0, and that is the form in which it is returned. The one is affirmative and the zero is negative. The following boolean values are recognized by AxleBase in most cases.
-- . --
|-------------------| Table columns are defined as date with no length. Storage and return are in the standard "CoreDate" protocol format that has been truncated to its leftmost eight digits; i.e., YYYYMMDD; e.g, 19620130, which many people read as January 30, 1962 or perhaps as 30 January 62. Since the DATE type is a truncated version of the coredate protocol, it has lost the BC descriptor character. If dates BC are required, then the standard "DateTime type or the standard "DateTimex type must be used. The DATE type is based upon the "CoreDate" protocol. All operations use the truncated coredate format. The convert function may be used to reformat other date formats. See also "DateTime, "DateTimex, "Time, and "Timex data types. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| Table columns are defined as datetime with no length. Storage and return are in the standard sixteen digit "CoreDate" format; i.e., YYYYMMDDHHMMSSNN; e.g. 2010012410230400, which many people read as January 24, 2010 at 10 23 04 AM or perhaps as 24 January 10, 10 23 04 AM. The coredate protocol specifies that the final character of the string may be a digit or a minus sign descriptor character. If it is a digit value, the date is AD; if it is a minus sign, the date is BC. The last two digits are decimal parts of a second. Tenths and hundredths. If greater precision is required, see the DateTimex type. The acceptable DateTime range is from 99990101 BC to 99991231 AD. Dates outside that twenty thousand year range must be stored as String types. The DateTime type is based upon the "CoreDate" protocol. All operations use the standard coredate format. The convert function may be used to reformat other date formats. See also "DateTime, "DateTimex, "Time, and "Timex data types data types and the "CoreDate" protocol. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| Table columns are defined as datetimex with no length. Storage and return are in the standard extended twenty one digit "CoreDate" format without the optional time zone designator; i.e., YYYYMMDDHHMMSSNNNNNNN; e.g. 201001241023040062384, which many people read as January 24, 2010 at 10 23 04 AM or perhaps as 24 January 10, 10 23 04 AM. The coredate protocol specifies that the final character of the string may be a digit or a minus sign descriptor character. If it is a digit value, the date is AD; if it is a minus sign, the date is BC. The acceptable DateTimex range is from 99990101 BC to 99991231 AD. Dates outside that twenty thousand year range must be stored as String types. The last seven numeric characters are decimal parts of a second. Accuracy is limited to one millionth of a second. The DateTimex type is based upon the coredate protocol that may be found in the appendices. All operations use the standard extended coredate format. The convert function may be used to reformat other date formats. See also "DateTime, "DateTimex, "Time, and "Timex data types. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| A column width should not be specified for this type. The actual storage width is 20 characters. The Integer data type accepts any literal printable whole number up to twenty characters that may include a minus sign. Commas and decimals are disallowed. The Integer data type was added to speed indexing because indexing the numeric type is far slower and the operation of numeric indices is slower. AxleBase does not tokenize, categorize, segregate or alter numbers. They are stored as literal strings. The twenty characters sets the maximum size. If the number of characters in an integer exceeds twenty, the number is truncated to the left-most twenty characters. Therefore, a number may be no larger than 99, 999, 999, 999, 999, 999, 999, and no smaller than -9, 999, 999, 999, 999, 999, 999. See also the "NUMERIC data type. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| A column width should not be specified for this type. The actual storage width is 20 characters. The Numeric data type accepts any literal printable number up to twenty characters that may include a sign and a decimal point. Decimals must follow the American standard. Symbolic representation is not acceptable. Commas are disallowed. Where possible, the Numeric type is recommended for speed. The Numeric data type was added to speed indexing because indexing the Numeric type is far slower and the operation of the resulting indices is slower. AxleBase does not tokenize, categorize, segregate or alter numbers. Thus, float, decimal, tinyint, bigint, integer, plus, minus, etc. ad infinitum, are all stored as the numeric type. This also means that AxleBase respects precision. If a fifteen decimal place number is handed to AxleBase, he precisely stores all fifteen places. The twenty characters set the value limit and precision of the number. If the character count in a number exceeds twenty, the number is truncated to the left-most twenty characters.
See also the "Integer" data type. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| A column width need not be specified for this type. The actual storage width is 20 characters. Each table can have only one "Serial" column type. The Serial type is numeric and is maintained by the system. Each row of a column may be expected to have a unique numeric value for that column and row. Values are incremented for each new row, but are not necessarily consecutive and cannot be predicted because of other potential activity in the table. Where the system requires a value, such as in an arrayed insert, any value or a null value may be specified for the serial column in the SQL statement. The least confusing option may be the placement of a zero in that position. The actual insert will become a system-generated value. A speed increase may be achieved in some cases by using a Serial column as the table key. This is certainly true where a table requires a key and there are no unique indices in it. Consistent with the AxleBase objectives, this column is not automatically indexed as some database managers do. The database administrator makes those decisions. The values may be expected to be unique through the entire column across segment boundaries. However, be cautious of assuming uniqeness in every Serial column. For example, virtual concatenated tables will certainly not be unique, and there are other exceptions. Serial columns cannot be updated. A serial column in a row that is updated will not be changed. The value of a Serial column may not indicate the physical location of a row in a table because some operations cause the system to move rows. At this time, the maximumn value for each Serial column is 1x10^18, or 1,000,000,000,000,000,000. To add a serial column to a table that is in production :
-- . --
|-------------------| It is called String because it is any string of characters including the IBM ASCII extension. The maximum length must be specified when creating a table, and that will become the enforced width of the column. ( This type is sometimes referred to as "alphanumeric", which is fine as long as we remember that the AxleBase system can also include all of the other characters. ) Control characters and control strings are removed from string data before it is inserted into a database to safeguard the database. They are returned when data is retrieved. However, it may be better to store strings that contain extended or unprintable ASCII characters as "Blob" data. AxleBase trims leading and trailing white space in and out. (Since this is contrary to the ANSI 92 standard, it may be revisited in the future.) The maximum String length is determined by the maximum row length, which is approximately two gigabytes. For long String data, BLOB storage is sometimes a better management alternative. Review the AxleBase Limits sub-section before designing data objects.
-- . --
|-------------------| Table columns are defined as time with no length. Storage and return are in the standard "CoreDate" format that has been truncated to its six digit time; i.e., HHMMSS; e.g. 202304, which many people read as 8:23:04 P.M., or as 20:23:04. For precision better than a second, see the "TIMEX" data type. BC times cannot be stored in this data type. See the "DateTime" and the "DateTimex" types for BC time storage. The Time type is based upon the "CoreDate" protocol. All operations use the truncated coredate format. The convert function may be used to reformat other "Date" formats. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| Table columns are defined as timestamp with no length. Storage and return are in the standard "CoreDate" format of datetime with the optional two-character time zone and the three character environment code for a total of twenty-one characters. The column content is a system-generated datetime value that is inserted by AxleBase when the row is created and it is not maintainable. The value includes the standard "CoreDate" time zone appendix of two digits and includes a three character date-time environment. The time zone and environment codes may be changed in the database configuration parameters. The CoreDate standard specifies that no characters may be empty, but a governing body does not yet exist for code assignation to date-time environments. Therefore, the default environment code is TER, meaning standard terrestrial, until a governing body exists. ( Note that the value inserted into the table will be determined by the inserting AxleBase "Instance". The business system or host software should be designed with that in mind.) See also "DateTime, "DateTimex, "Time, and "Timex data types. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| Table columns are defined as timex with no length. Storage and return are in the extended "CoreDate" format that has been truncated to its thirteen digit time; i.e., HHMMSSNNNNNNN; e.g. 2023040060523, which many people read as 8:23:04 P.M., or as 20:23:04. The last seven numeric characters are decimal parts of a second. Accuracy is limited to one millionth of a second. If accuracy of that depth is not needed, perhaps the "Time" data type might be more viable for the application. BC times cannot be stored in this data type. See the "DateTime" and the "DateTimex" types for BC time storage. The Timex type is based upon the "CoreDate" protocol. All operations use the truncated extended coredate format. The AxleBase "DateConvert" function may be used to reformat other date formats. See also "DateTime, , "Time, and "Timex data types data types. ( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)
-- . --
|-------------------| Unfortunately, there is not enough time to study all of the products on the market. The following are data types from some of the more popular database managers with suggested data type mappings. An import of the source type will probably be accepted in the specified AxleBase type. Included are Oracle, MySql, MsSql, InterBase, Ms Access, Paradox, FoxPro, and Ingress. The list may not be exhaustive, but can provide extrapolative assistance.
-- . --
_________________________ See also the following and the sub-sections following this section :
-- . --
|-------------------| The host system is expected to be able to react to all error situations. AxleBase's deeply embedded nature precludes all GUI error messages, so all user interaction must be handled by the host system. If the host system is incapable of accepting AxleBase errors, then Axlebase logging may be turned on to capture them, but that is not recommended because operation should not be blindly continued after an error. All operations are capable of returning error messages as variable length character "Strings. If an unexpected return is detected, it is probably an error message. In any event, all returns should be inspected for an error notification. The last error is stored and is not cleared until the next error overwrites it. The host system can clear that message. The LastError functions are covered in the API chapter. If the activity log has been turned on, when an error message is returned, it is additionally written into the activity log. A message is sometimes written as multiple log rows. The first row always contains the header and the identifier. Logged errors are usually terminated by the entry, "End of error report.**". For most errors, AxleBase will simply raise the error and abort the process. In any case, AxleBase will attempt to recover and continue operation through the error situation. In the event of a system crash, AxleBase will attempt to log the situation before going down, but that is not possible in some operating system crashes. In the event that a table becomes corrupted beyond repair, and there are no backups, the host application may delete the table. AxleBase will re-initialize it and continue operations. With Reservations :
-- . --
|-------------------| Shortcoming 1. :
Shortcoming 2. :
Being unable to correct such problems at the root caused the builder to turn to unusual solutions. See the "Fault Tolerance" sub-section of the "Advanced Technologies".
-- . --
|-------------------| Format of error messages:
The purpose of this message format is to allow unattended, or autonomous, systems to automatically process and react to error messages. The return consists of seven elements. The element separator consists of a colon and two spaces. Elements may sometimes be zero length. Only elements 1, 4, 5, and 6 are required, but all separators are always present to increase processing speed. AxleBase may sometimes include responses from other systems in the addendum when those might be helpful. Therefore, when evaluating an error, the host should proceed from the header to avoid the confusion of appended responses. The first element is the message header. The message header is always present and consists of the ten-character string, If AxleBase can identify the type of error, the type may follow the header. Otherwise, the type may be blank. The type has variable content. The source of the error follows the type. It is usually blank. The source is the source of the error message and not the cause of the error. The source has variable content. So that the host can positively identify the message, the string "AxleBase" follows the source. Character case will usually be as shown, but may be changed under some circumstances or by other systems. The error identifier, errId, is a five byte alpha-numeric identifier. It always follows the AxleBase identifier and precedes the text message. Host code that references specific errors must be reviewed when upgrading to a new release of AxleBase. All error codes currently consist of an alpha character followed by four digits. Element six, the "text", is the literal text description that is intended for human communication. Its text string is standard and usually describes only one message identifier. To enhance human readability and to format log entries, text stings will sometimes contain characters 13 and 10 and white space. The addendum is additional explication that is sometimes present. It is intended to amplify and/or qualify the standard text message, but does not change the ID. It is frequently an empty string. A given message may be generated by various sources for various reasons and causes. Therefore, an error message may sometimes appear to be duplicated by some identifiers, sources, etc.
-- . --
|-------------------| The error master list is made available to the host application by the "Manager" object. Use the ShowErrorList command to return a list of all of the errors, or use the optional error number parameter to return the specified error. Syntax :
Returns the message specified by errorNumber. If errorNumber is blank, the entire list is returned with each message terminated by characters 13 and 10, carriage return and line feed. The identification number and the text are returned. The size of the entire list varies and depends upon the current system release. It may be fifteen to twenty thousand bytes. Example:
Example:
The interface also provides a means of recalling the last error. See "ShowLastError"
-- . --
|-------------------| As described in the previous sub-section, use the ShowErrorList command to return a list of all of the errors, or use the optional error number parameter to return the specified error. The following is the list of AxleBase standard error messages as of July 2022 :
-- . --
_________________________ ( Scroll down for security sub-sections.) ( Axiom : Any software-based security system can be defeated. )
-- . --
|-------------------| AxleBase security is designed to be:
It is unobtrusive because, unlike the big-name brands (I have programmed against Oracle, MS SQL Server, MySql, etc. etc.), AxleBase does not force the use of security. A new AxleBase installation requires no security configuration, no passwords, no user setup, etc. Tables can be read as soon as they are created. However, it is possible to design and implement an extremely tight and complex security structure for an installation. Security features are effective when the host is a database server. For example, password access means little when somebody can locally access the password file. By restricting access to remote connections, the database server completes the security. Security in any kind of computer system is a reptilian nightmare for administrators, engineers, and users. That is sometimes especially so in an advanced AxleBase installation, so security defaults to off upon installation. The "DBA" can then begin turning on security as he learns and as needed in the installation. AxleBase offers basic security at three levels that are controlled by the DBA.
Basic AxleBase security uses an extended crud model. (See "AxleBase Lock Granularity") Crud permissions are applicable at all three levels. After security is turned on, every permission for every object defaults to "no". Enabling security also enables the passthrough control, which is separate from crud controls. Passthrough access can be controlled by name and password at the domain level and at the database level. For example, if access is restricted at the domain level, then the databases in that domain can be accessed only by user name and password at the domain level before encountering the database passthrough controls. Basic security automatically extends with system expansion into an axsys Super-System. Whether security is turned on before or after system distribution, the extended system is entirely subject to the DBA's security administration. If it is turned on after distribution, then the ReloadNode command can tell all nodes to reload all node and system configurations from disk. The administration of basic security remains the same for a super-system. However, the distribution raises the internal complexity, and the DBA must understand how the distribution model affects each type of node. Each node is subject to control by parts of the security of various levels and that control varies by node type. (See the "Distributed Database Manager" section of the "Advanced Topics" chapter on page 3 for additional discussion of this topic.)
-- . --
|-------------------| The following are part of the AxleBase security suite. These are separate because they are not members of the AxleBase canonical security sub-system. Some of them even perform duties in addition to security. But they can provide powerful security functions for the database administrator. The "Authenticate" directive. The "Comm Authenticate" database, domain, and table attribute changes. The "Encrypt" command. The "Decrypt" command. The "SetVectorEncryption" toggle for the current Vector. The "Audit Trail" database configuration provides evidence of malevolent activity. The "Deny SQL Updates " configuration.
The "Deny DDL" configuration.
The "Comm Use Syslink" configuration. The "Comm Encrypt Envelope" configuration. The "Comm Hide Error" configuration. The "Dataset Size Limit" directive. Prevents malicious queries. The "Hide Security Stops" configuration.
The "Log Toggle" configuration.
-- . --
|-------------------| AxleBase installs with security turned off. When he creates a domain or database, the created object defaults to open to all access. Toggle :
If a database has a master password, then access is restricted only for that database and for that entire database. Access can be restricted for the entire domain by setting a password on the domain. If a password is set on the domain and no database in the domain has a password, then entry into the domain will permit unlimited access to all databases in the domain. The "AlterDomainAttribute" and the "AlterDatabaseAttribute" commands are used to set passwords. The password parameter in the "Configuration" chapter has guidance and examples. If that were all of the security, then security would be a state of all or nothing. But finer granularity is provided by the Grant and Revoke commands. (See GRANT and REVOKE in the API chapter.) Individual grants over-ride master passwords. If security is turned on for a database and an individual has been granted access to it, then that individual can enter the database with his personal identifier and password without knowing the master password. However, that over-ride only allows passage through that level and gives access to objects only insofar as the Grant allows. The Grant and REVOKE commands provide additional granularity. Providing the master password in the connection command is not what is usually desired because it immediately allows unconditional access to the object as an owner. When access is controlled by granted privileges, then those privileges are each explicitly granted to the individual. The AxleBase GRANT and REVOKE commands allow control of domain and database ownership. For example, granting ownership to the domain allows the individual to use the GRANT and REVOKE commands. Before turning on security, insure that the administrators have been granted the necessary privileges. Before turning on domain-level security, be sure that individuals have been granted access to the domain so that they can pass through it to get to their databases. To do that, create a grant to the domain with no privileges. The domain will recognize the individual and let him pass through. If the grant is made with a password, then the individual must enter his password before he can pass through. Recommendation: Domain level security is not required for database level security. For the implementation of serious security for an installation, the domain level security may be turned on and configured in addition to the database security.
-- . --
|-------------------| A security stop is a refusal by the system to perform an operation for somebody who does not have the required permission/ rights/ clearance. It is customary for high end database managers to hide security stops. That is not a bad thing and it certainly enhances security. However, millions of manhours have been wasted by hidden security stops. People who have a tendency to assume responsibility have spent endless hours debugging a healthy app because the database server simply had not been correctly updated by an administrator. (It is such a problem that this old man is still angry about it years after retirement.) Additionally, security stops can sometimes hide valid problems. I have personally found problems in big-name brand systems that appeared to either be in my code or was a security problem. Another problem is simply the complexity of all of the involved systems. Telling a DBA that you cannot access a table does not give him much information. The problem could simply be in your local network router. So security can be equally problematic on the server side. AxleBase allows security stops to show. When the time comes to put the database into production, if security is a serious issue, the administrator can turn off the return of security stops. The value of HideSecurityStops for each database and domain defaults to no. When security is turned on for an object, that value should be evaluated. In a development environment, the value can be turned off in dev databases and turned on in prod databases. Although a security stop is not a system "Error", it will be an error as far as the host system or operator is concerned. "AlterDomainAttribute" stops are returned as error messages. See also the "Hide Security Stops" section of the "Configuration" chapter.
-- . --
|-------------------| AxleBase is designed to maintain canonical integrity at all times. Those who seek the undocumented tricks that can be done in other database managers will not find them. Other systems have excellent security that was created for design objectives that are very different from those of AxleBase. Oracle's security is legendary although it uses canonical transparency. Ms. SQL Server has great security although it uses canonical permeability. So this is not to suggest that the canonical transparency or canonical permeability of others is wrong. But AxleBase has chosen to strive for canonical integrity. The closest that AxleBase might come to behaving like others would be in his virtual objects, but those are voluntary with their own security.
-- . --
|-------------------| The architecture of an AxleBase installation is designed to present multiple levels of administrative control, and each of those levels is segmented to permit zoned administration. That administrative control includes the realm of security. Multiple levels are achieved by placing a group of databases under the control of a domain. A database can be opened only by first opening its domain and then opening the database through the domain. Security can be turned on and applied at the domain level or at the database level or at both levels. And, of course, after the database level is crossed, the table level has its own security. AxleBase is universally vertically segmented so that parts of an installation can go to any extreme or degree of security independently of other parts. For example, multiple domains may be established in an installation so that databases can be grouped under the various segmented security umbrellas. The same applies to the various databases. ( Additional lower levels and segmentation at those levels are being considered. ) All of those points apply to the SAM ( Storage Architecture Model ) that has been developed for AxleBase.
An AxleBase installation may also be designed as a Super-System (an axsys) that is also discussed in the Tuning section. An axsys is expected to be distributed across computers and disks to give the installation more processing power. Distribution may be of AxleBase "Instances", database domains, databases within domains, or within databases. If the installation is distributed, then the physical attributes of the segments may be used to further increase security. For example, segments may be placed on computers that limit access through the operating system permissions.
-- . --
|-------------------| AxleBase provides the ability to set master passwords for each database domain and for each database in the domain. The security system is turned on by setting a master password. It must be turned on for each domain and for each database. Setting Passwords :
Opening an object with its master password allows operation of the object with ownership privileges. Ownership operation also reduces audit logging. It is therefore prudent practice for the "DBA" to Grant access rights to himself as well as others so he can log on with his identity. Unique passwords may also be assigned for each operator-object combination that would be required when the object is accessed by that individual. (See also the Grant and Revoke commands in the API chapter.) Individual passwords are effective only when security is turned on. Commands are designed to fail silently when incorrect passwords are passed; i.e., no "Error" is returned. If the host application fails to check the state of the object, the host may continue processing, oblivious to the fact that it is talking to nothing. This can be expected to produce inexplicable errors and potential instability in the entire system. Passwords should be considered locally secure only if the computer is secure. Maximum password length is 100 characters, but fewer characters may be used. Passwords are case sensitive. Semi-colons are permitted in passwords, but a password that has a semi-colon cannot be used in a connection string. End-of-line characters, ASCII characters 13 and 10, are ignored and automatically removed from the password. Any other character that can be passed by the host system may be used. That feature allows systems to use all of the unprintable ASCII characters for additional obfuscation. Delimiters :
To protect internal apostrophes, the value is not checked for escaped apostrophes. If the password has an external apostrophe, it must have delimiting apostrophes. (The system does not normally require apostrophes. They are allowed when needed to delimit a value to insure its literal acceptance.) Use care when using extended ASCII characters. AxleBase does not mind, but if they are also used by a participating system such as the operating system, the results can be unpredictable.
-- . --
|-------------------| AxleBase offers more flexibility and power than may be common. For that reason, what may appear to the user to be a simple command can actually produce powerful and complex results. When granting and denying access, the user should give thought to even the simplest command. A crud table specifies the type of access to an object that is allowed for each person or entity. (See "AxleBase Lock Granularity") When AxleBase receives a request for access to an object, he reads the appropriate crud table to determine actions that are permitted for the person or entity. Crud Values :
The type of operation that is being controlled is interpreted by AxleBase. For example, the create privilege for a table allows the insertion of rows, but for a database allows the creation of tables, and for a domain allows the creation of databases. And if the "DBA" does not have update rights on a database, he cannot alter a table. Creating and dropping indices are actually updates of a table's characteristics, so they require update rights on the table. Passthrough Control :
The crud table is updated by the Grant and Revoke commands. See their usage in the API chapter. Rights at the domain level should be granted only for administrators at that level. For example, domain update rights allow the person to Grant privileges at that level. Delete rights will allow dropping an entire database. The flexibility and power given to the "DBA" in the Grant command makes it possible for a careless DBA to create duplicate, ambiguous, or conflicting grants. When he receives a GRANT command, AxleBase attempts to find any existing grants that may be duplicates, conflicts, or ambiguous, but subtle needs cannot be checked. Because security maintenance can be confusing for a human, the host app should provide an administration GUI to support the task. If it does not, then it may be prudent to first use the ShowPermissions command and then analyze the existing security state. Other than simple passthrough, rights at the database level should be granted only for administrators at that level. When security has been turned on, each person must be granted access rights to each object in the database. A Simplification :
The keyword "all" can be used in any combination in the Grants, the type of object, the object name, and the person's name. For example, a person may be granted rights to all tables in a database. The administrator must insure that such grants do not conflict with detailed grants. When used for the object type, it will not be applied to the domain and database objects. Permissions can be especially confusing for the inexperienced and for those who do them rarely. Permissions at the domain level are usually needed only by the domain DBA. Everybody else is just passing through. Likewise, permissions at the database level are usually needed only by the database DBA, and perhaps by the domain DBA. Domain and database permissions are both maintained at the domain level. Permissions at the table and job level are needed by all who work with the data. The create and delete permissions that are granted for those objects pertain to the rows within them. The ability to create and drop tables and jobs is controlled by the create and delete at the database level. Likewise, the ability to create and drop databases is controlled by permissions at the domain level. Updating permissions must be done with the Revoke and/or grant command. It may seem easier at first glance, but it is actually more complicated. The most positive way to insure that the correct permissions are given is to first revoke all permissions for the individual, check the file, then grant a new set, and check the file again.
-- . --
|-------------------| Security begins at the domain level, then to the database level, and then to the objects within the database. A very light security that might be appropriate for a single user might be set simply by setting the domain password. Since no grants had been made, access could be attained simply by presentation of the password. The problem with that is that only the owner of the domain could get to any of the databases, and if the password were shared with others, then they would have all of the owner's permissions. To prevent sharing domain ownership, permissions could be set at the domain level for individuals without giving any permissions. That would allow them to pass through the domain level to the databases. We will now try some heavy security in the following example. Hypothetical situation: AxleBase has been embedded in a server. It serves only a small department, but the very "Large" database cost a great deal to build. The institution directors are considering selling access to other institutions, so they want to lock it down very tightly. Since the database is being used already, the lockdown must have a minimal impact. The senior "DBA" takes the following steps in sequence. 1. Every employee is granted access to the domain.
2. At the domain level, the senior DBA grants himself "all" rights. This is not entirely necessary but it will allow him to work in the system without using the master password so as to maintain adequate audit trails. 3. Each database DBA is given ownership of that database by granting each of them "owner" rights to the database. That will allow them to administer the database including security.
4. Every employee is granted access to the appropriate database.
5. Each is granted appropriate access to tables and other objects in the database. 6. A connection string is prepared for each employee and he/she is briefed on how to open the database the next day.
7. If it is not already on, AxleBase logging is turned on at all levels. 8. The "hide security stops" parameter is set to yes for maximum security. Note that security is not yet on. Everybody continues to use the system as before. 9. After working hours, the senior DBA turns on security for the entire installation by setting a master password for the domain and for each database. This example may be too extreme for many installations and is presented only to show what might be possible.
-- . --
|-------------------| AxleBase can establish and maintain his own VPN (Virtual Private Network), which is a sophisticated means of securing the communication channel. No specialized VPN hardware and software are needed, and third-party software and hardware cannot participate in an AxleBase VPN. Every AxleBase "Instance" can establish his own tunnel and every AxleBase instance can function as a VPN server. No middleware is needed because every participating instance communicates directly. The operating system is not allowed to participate. AxleBase provides all protocols that are needed so that users and host software are shielded from that task. See brief discussion of the AxleBase "Communication Interface" that AxleBase uses for communication in its sub-section of the API chapter. His VPN is based upon the "SysLink" communication protocol, but he has his own tunneling protocol to increase security. When an AxleBase VPN comes up, all supporting infrastructure will continue it's normal operation. He can use any network that can carry his traffic to create a tunnel. He will tunnel to and from all operating systems on which he can run regardless of the age or cost of the computer on which he is running. Because the VPN belongs to a database manager, AxleBase will automatically become the VPN server and router. That capability is built into every AxleBase instance. Each database has a single VPN toggle attribute that controls its VPN.
The exception : The VPN in an instance can be turned on or off by the configuration of a database when it opens the database. But its host can only turn it on. To turn it off, the host must unload and reload the instance to entirely clear it. That behaviour is part of the security. When the VPN attribute is turned on in an AxleBase instance, it can communicate only with another AxleBase instance, and only if the VPN is on in the other instance. If it must communicate with a server instance, then it may be necessary to turn on the VPN locally before opening the database. Expect difficulty in establishing and debugging a VPN setup. Because its traffic is "Encrypted", it intentionally hides most "Error"s, and it gives little or no operation and state information. An example is the database toggle. The client will never know whether the database toggle is on or off unless the "DBA" makes the information available, so the client will appear to be broken. Caveat : An AxleBase VPN is a heavy-weight that is verbose and relatively slow and may be expected to double the AxleBase network load. It is believed that the deployment of a VPN by the DBA indicates serious intent, to which AxleBase responds in kind. There is currently no plan to change the technology to increase speed or to lessen weight. System logic requires that the host be the system controller, which means that the host or external hardware and software would normally provide a VPN. However, internal VPN technology can add tremendously to the host cost, or it must be added through acquisition of expensive and complex third-party hardware and software. Therefore, AxleBase provides an optional VPN service that the DBA can turn on with a single toggle. Those who specialize in such things are expected to build better VPN technology, and this is not intended to say otherwise. But whether they do or do not, AxleBase can meet the need, and can do it with simplicity. Caveat : The downside is that all participating hosts must have an embedded AxleBase instance to participate in an AxleBase VPN, which is part of the security.
-- . --
_________________________ ( As well as can be recalled, the audit mechanisms were complete and functional in 2015. But as noted on the "Shortcomings" page, the mechanism to review and retrieve the locked and hidden audit history files had not been created when the AxleBase project was halted.) This section and its sub-sections are written primarily for auditing authorities. The professional Database Administrator will be familiar with them if the auditing authorities direct him to make his database compliant with auditing requirements. Many impinging factors can be known only by the "DBA", so the auditing authorities should discuss issues with him before he creates any databases and before they and he make design decisions. -- . --
|-------------------| AxleBase provides support for applications that require very high levels of audit ability with extremely secure audit trails. Support for government and military applications are especially addressed, but other operation types can benefit. Much of the audit support is designed into the AxleBase architecture and cannot be turned off.
-- . --
|-------------------| Structural support in this case refers to the basic architecture of AxleBase that supports the building of audit trails. It requires no parameter settings or database configuration. It is always present and cannot be turned off. Data rows in AxleBase databases are never removed. When somebody using a front end application tells AxleBase to delete a row from a table, the row appears to be deleted, but it is only flagged. To the user and to the application, it is deleted, is impossible to access, and cannot be undeleted. But AxleBase knows that it is still there. Also, when somebody using a front end application tells AxleBase to update a row in a table, the row is not over-written. It is flagged as deleted, and the new row is inserted into the table. It is impossible for the user and application to see the old row and it appears to be replaced by the new row. The result is that when data is inserted into an AxleBase database, it remains there. Deleted and updated rows never go away. The only way to get rid of them is for the Purge command to be run against the database. The purge command is designed for that one purpose. Only somebody with database administrator "Security" clearance can run that command. Before the purge command is run, the Backup command will be run by the database administrator. The backup command copies all data including deleted and updated rows. If the front end application includes support for a data warehouse, which will be covered later, the "DBA" will use it to update the warehouse before purging. It is recommended that the front-end applications include warehouse support such as a utility that copies the nightly backup into permanent tables. AxleBase is designed so that he can handle any size table. For example, if the government is creating a million new rows every day in a table, and that table is added to its permanent storage table every night, that can be done for centuries before it will become a large table by AxleBase standards. Thus, permanent audit trails can be achieved. Furthermore, AxleBase is specifically engineered to store those huge audit data tables on very cheap desktop computers if so desired. AxleBase tables have been designed to be readable by any software that can read a text file. Notepad, for example. Therefore, historic audit trails will be available to auditors in perpetuity.
-- . --
|-------------------| Configurable audit support is that which can be configured and/or turned on by the database administrator. In this case, it is the "Security" sub-system, the system logs, and a toggle that is turned on by the AuditTrail command. Operation and use of the AuditTrail toggle is covered in the AuditTrail section of the Configuration chapter. The security system is covered in another section of this chapter. It should be adequate for controlling system access for the most extreme audit needs. It targets database domains, each database, each table, and individual users. Operation and use of the system logs is covered in more detail in the Log section of the Configuration chapter. If used, the AuditTrail command must be turned on immediately after the database is created and before a table is created in it. It cannot be turned on after a table is created. After it is turned on, it cannot be turned off. Even if the database administrator gives the command that turns it off, AxleBase will turn it back on. When turned on :
AxleBase accepts standard ANSI-92 SQL so the administrator creates tables in the standard manner. When the AuditTrail toggle is turned on, AxleBase adds audit trail columns to every table that is created. Thereafter, AxleBase will require that any data that is entered into those tables must include the audit data. In other words, AxleBase will force the design of the front end applications to include that data with every data entry or update. Audit data includes the name of the person entering the data, the name of the workstation where the data is entered, and the "Date" and time. That data is available to front end applications so they can enter it and the user need not be concerned with it. Every database and every database domain has its own log and each has its own toggle. They are normally turned off by default to increase operation speed. Turning them on is a simple toggle that the audit authorities can direct the database administrator to execute. When the logs are on, they record users accessing the system, commands, command parameters, security issues, queries, query text, internal "Error" messages, external errors, and other items of interest to auditors.
-- . --
|-------------------| Activation of the audit sub-system will thereafter cause the insertion of three system columns into every table that is created in the database. They are appended to the columns that are specified by the DBA when the table is created. Thereafter, a data row can be entered into the database only if it contains that audit data. The host must automatically enter that information when a row is inserted or updated. The "Date" and time column can be populated by the AxleBase DateNow function. The loc column data should be determined by the auditors and is usually expected to be the workstation name that can be extracted from the operating system. The user may be extracted from the operating system login or from the database login.
Those columns can be created in a table only by the system. They cannot be altered and cannot be removed, and data in them cannot be edited. The data is required in every row entered in the database. The datetimex data type is specified by the "CoreDate" protocol. The specified ordinality begins after the "DBA"'s columns. Note that 121 bytes are added to every row, which can be substantial in a very "Large" table. That quantity may be made more tolerable by variable width rows when tables are created. The columns can be red by standard SQL queries.
-- . --
|-------------------| Work Load If audit authorities direct a database administrator to enable auditing in a database, most of the operations will increase his work load only slightly. Turning on the security sub-system, however, can add a considerable amount of work because it requires detailed administration for every person who uses a database. For large installations, the security work may require additional personnel. Administering the data warehouse will add some load to the "DBA". Its impact will depend upon the size of the operation. System Load System load is usually noticed primarily in the speed of operations. As mentioned earlier, most of the audit operations are a fundamental part of an AxleBase database. Their load is always present. Turning on the AuditTrail option will increase the system load very slightly because it will require the storage and manipulation of additional data. But as a percentage of the system load, it will not be noticed. Turning on the Security sub-system will hardly be noticed by the user because most of the security operations involve the system initialization that takes place when the user first opens the database. The speed of data operations will hardly change. Logging can have a very big impact on the system speed. The magnitude of the impact will be determined mainly by the usage of the database. If the database administrator is directed to enable auditing, he will probably want to redesign his system storage profile to increase speed. System Access System users will hardly notice a difference in data access if auditing is on. Since it must be enabled before the system is used, they will probably not be aware of it at all. The fact that security is turned on will be obvious because everybody will need to enter credentials to use the system. Since most systems require security anyway, that will probably be overlooked. Data Warehouse ( Also see the following sub-section.) For these measures to be effective, a data warehouse must be established and maintained. The data warehouse is a special database that stores a copy of every data transaction from every specified time period such as daily or weekly. That is a trivial requirement for AxleBase, but it can greatly increase hardware requirements to store it. Fortunately, AxleBase is specifically engineered to use very low cost hardware. It will also increase the work load for the database administrator. He must insure that the data warehouse is routinely updated before his databases are Purged and that it is safeguarded. As mentioned earlier, all of the AxleBase data objects and controls are designed to be accessed by any software that can read a standard text file so auditors can easily inspect everything. However, a data warehouse database will soon outgrow the ability of notepad. If the audit authorities have no other suitable tool, a special auditor's version of AxleBase can be made available with such things as read-only ability and the ability to scan all data. Physical Access For these tools and techniques to be effective, the systems must be physically locked down with limited access. There must also be adequate backups and security of backup storage. These are matters that are handled by the professional DBA who will expect his actions to be audited by the auditing authority.
-- . --
_________________________ -- . --
Following are links to some of the AxleBase tools for assessing the system's state.
-- . --
Following are links to some of the AxleBase tools for data retrieval.
-- . --
AxleBase is designed to assist with the managment of data retrieval within extremely adverse conditions such as:
Poor Communication Links:
Extremely Large Datasets:
Uncommitted commands and queries:
There are more features that are covered in the various instructions for each of the mechanisms used in the retrieval. -- . --
( While editing the operation document, it was noticed that the ReturnDataset command does not specify a QueryId. Apparantly, that seemed appropriate at the time since the ReturnCache specifies a QueryId and the two commands can be queued into the AxleBase server, but the builder now feels that it may be a shortcoming that should be corrected.)
-- . --
The following are the database administrator's security suite tools. Discussion of the canonical Security sub-system and its tools are in the "Security" section. Additional tools are listed below. The "Authenticate" directive. The "Comm Authenticate" database, domain, and table attribute changes. The "Encrypt" command. The "Decrypt" command. The "SetVectorEncryption" toggle for the current Vector. The "Audit Trail" database configuration provides evidence of malevolent activity. The "Deny SQL Updates " configuration.
The "Deny DDL" configuration.
The "Comm Use Syslink" configuration. The "Comm Encrypt Envelope" configuration. The "Comm Hide Error" configuration. The "Dataset Size Limit" directive. Prevents malicious queries. The "Hide Security Stops" configuration.
The "Log Toggle" configuration.
-- . --
_________________________ -- . --
|-------------------| If post-return processing is needed, then the host is expected to provide it. The AxleBase API is intended to provide the functionality that is required for data storage and retrieval. It is not intended to be a full function programming language although some "DBA"s attempt to use SQL for that purpose.
-- . --
|-------------------| The AxleBase parser permits commenting SQL. This may be helpful where SQL is heavily used every day. See also the optional non-standard Appendix encapsulator. Requirements:
( If SQL commenting is found useful, it can be expanded and moved into the body of the SQL without a great deal of trouble.) Example:
-- . --
|-------------------| The following symbols are, or were at one time in database history, standard logic operators. The 'like' and the 'sounds' operators do not take advantage of indices. They always do a table scan. To help beginners and those who know only one or two SQL dialects, AxleBase supports more conditional constructs than necessary. (Some of the lesser known are, or have been, used in extant or dead big-name database managers.) The following logical operators are currently supported by AxleBase in the SQL "where" clause. Those who want to continue using their favorite syntax can do so without penalty. The conversion is shown as a suggestion toward the simplicity of AxleBase uniformity. Continued support of those operators is a service and not approval. Following Are Standard Operators
AxleBase Accepts and Converts The Following
The "SOUNDS LIKE" uses the original soundex algorithm. (Courtesy of the American taxpayer like so much of what we take for granted despite the Big Names taking credit.) Soundex delivers approximate results and works for standard American pronunciation of people's first names. It can increase processing time tremendously for large tables. The logical constructs that use null follow the same conversions. Some attempt is made to standardize incorrect null constructs, but that cannot be depended upon simply because I have moved on to other areas. There is currently no plan to support the old "isnull".
-- . --
|-------------------| Syntax:
Purpose :
It must be separated from the primary command or query by a semi-colon. The appendix parentheses are required. The clauses with their parentheses are contained within those parentheses. Double Spaces :
Clauses :
Usage :
Node :
See also how to use "Data Transfer Protection" technology.
Refer to the appropriate sections for usage of each. See also the Data Retrieval Tools compendium. A returned dataset will contain the "queryID" compendium that can be red in the ShowDatasetAttributes return. Example:
Example identifies the dataset:
Example returns 1,000 of the deferred rows:
Example:
Example gets the Encrypted data stream:
-- . --
|-------------------| Syntax:
The CacheReturn is an AxleBase-specific SQL option that is placed inside the "Appendix" clause. This tells the data "Vector" to compile the data return and cache it on disk. All other operations in the query are performed up to the dataset build. The building of a dataset is deferred until a return of the cache is requested. After the SQL runs, it appears that nothing happens, but the "ShowDatasetAttributes" command will show the size of the cached return. The "ReturnCache" command will perform controlled returns of segments of the dataset. The maximum quantity that can be requested in a return is two billion " tuples". (See the ShowDatasetAttributes sub-section of the Vector section.) Only standard returns may be cached. For example, an XML return or a variable width return will not be honored. Purpose 1 :
Purpose 2 :
QueryName :
( This is a non-standard AxleBase SQL extension to support a "VLT". Beginners are advised to avoid non-standard SQL in any database manager and to be wary of those brands that do not provide this warning.) See also the Data Retrieval Tools compendium and how to use the Data Transfer Protection Technology. Return expected: None.
Example:
Example:
Example:
Example sets an ID for a deferred return:
Example retrieves 100 rows of the specified return:
Example retrieves the entire specified return:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It adds the specified number of units to the specified date. The unitType is one of those shown in the datediff table. Only whole number quantities are accepted. The "Date" must be one of the AxleBase date types; date, dateTime, dateTimex. (See the Column Data Types section of the Embedding And Running AxleBase chapter.) The operation construct must be consonant with the fact that dates BC are respected. Accuracy : AxleBase does not yet account for leap-seconds or leap-centuries. The calling operation must be prepared for the return of an "Error" message. If a datum is encountered in the job stream that cannot be coerced to a valid value and value type, then AxleBase returns an error. (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) See also
Return expected: Date.
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements to convert a string to a date datatype. Variable is a date that is formatted in one of the commonly used date formats or is an AxleBase date format. It may be either the name of a column or a delimited literal. The return will be in the format that is specified by the datatype parameter. If the request includes data that is not contained in the variable, then the extra data will be returned as zeros. Fictitious data may be generated by specifying the fictitious DateTimeF datatype. Datatype is a literal expression that specifies an AxleBase data type. If a datum is encountered in the job stream that cannot be coerced to a valid datatype, AxleBase returns an "Error". (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.)
The calling operation must be prepared for the return of an error message. See also
Example:
Example:
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It returns the number of whole units by which the two dates differ. The second date is subtracted from the first. The unitType specification must be one of those listed. (Note: One purpose of the "CoreDate" protocol is to ease data handling. If the objective is a date comparison and the two dates are in the same format, then dateDiff is not needed and a direct comparison will work. For example, '2007090214253604' > '1997082523153245' will work. Permissible unitTypes:
The data type of the values must be date, datetime, or datetimex, although they are not required to be the same. (See the Column Data Types section of the Embedding And Running AxleBase chapter.) The operation construct is consonant with the fact that dates B.C. are respected. The complexities of date arithmetic can be misleading due to its nonlinear logic and due to psychology. For example,
Accuracy :
The calling operation must be prepared for the return of a non-numeric value to allow for an "Error" return. If a datum is encountered in the job stream that cannot be coerced to a valid value and value type, then AxleBase returns an error. (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) See also
Return expected: Numeric.
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It returns a date from the specified number of days. Negative numbers return dates B.C.. A number outside the valid date range will generate an "Error". The date will be an AxleBase DATE datatype. Accuracy: AxleBase does not yet account for leap-seconds and leap-centuries. The calling operation must be prepared for the return of an error message. (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) See also
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It may be used to insert the current date as a literal in the SQL string. The optional parameter may be one of the AxleBase data types; date, datetime, datetimex, time, or timex. If omitted, the datetime type will be returned. The parentheses in this function are not optional. Times that are generated by computers are generally suspect. Times that include seconds are especially suspect and greater precision than that increasingly so. AxleBase will return a time that includes hundredths of a second, but the caller must be aware that the precision is only a relative value. Timex and datetimex values will contain only placeholder zeros after that value. Testing sometimes requires the generation of unique datetimex values. The host can coerce AxleBase into returning fictitious values in place of the placeholder zeros by entering the fictitious DateTimef parameter in the type option. DateTimef values are assigned sequentially from a pool of 100,000 for all current processes by AxleBase. The generation of 100,000 values per second may be expected to produce unique values for each object at the current speed of computers. (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) The calling operation must be prepared for the return of an "Error" message. Spaces are not permitted in the string. Return expected: Date string.
Example:
Example:
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It returns the number of days in the specified date as a long "Integer". In other words, the return is a numeric variable and is not a string. Dates B.C. are returned as negative numbers. The specified date must be one of the AxleBase date data types; date, dateTime, dateTimex. Accuracy :
If a datum is encountered in the job stream that cannot be coerced to a valid datatype, AxleBase returns an "Error". See also
(The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) Example :
-- . --
|-------------------| Where a delimiter must be used inside a SQL string, you can escape it by placing a slash immediately before it. AxleBase will then look for a value that contains the delimiter character. AxleBase is universally aware so he will perform this even if the "DBA" changes the delimiter, including multiple-character delimiters. Example :
Example where the value contains two of the delimiters :
-- . --
|-------------------| Syntax:
Provides a way to specify a match of any single value in a list of values. Values are evaluated from left to right until all are tested. The process exits at the first match. AxleBase takes advantage of the logic involved;e.g., when any value in the list is found, he selects the row, exits the operation for that row, and moves to the next row. Hint :
Hint :
AxleBase takes advantage of the logic involved;e.g., when any value in the list is found, he selects the row and exits the operation for that row. Example:
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. Returns a "Boolean" evaluation of the value. If the value is a valid "Date" or datetime value, the evaluation is positive. This example returns yes.
This example returns no.
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. Returns a "Boolean" evaluation of the value. If the value is a valid time or timex value, the evaluation is positive. This example returns yes.
-- . --
|-------------------| ( Under consideration and not available. ) Math operators are:
Math operators are supported only in the select and where clauses. Hosts are expected to be capable of manipulating returns.
-- . --
|-------------------| Syntax:
Every query receives a unique queryId from the system. It allows identification of a query by the operator. The operator may overwrite that Id with his own. It is especially useful with a CacheReturn SQL clause in a multi-user database because it allows the user to specify the staged dataset that he wants returned. It is an appendix option. When a dataset is returned by a query, the return from the ShowDatasetAttributes command will include its QueryId. It must be placed within the appendix clause and requires parentheses around the identification string. Delimiters :
The identification string must be unique within the current database activity. If it is not unique, then another query may over-write it or it may be over-written and users may receive erroneous data. Name Specification :
Suggestions :
Life Span :
Caution : :
See also the Data Retrieval Tools compendium. Example:
-- . --
|-------------------| Syntax:
This option will cause a query's data return to be formatted with the specified protocol. Available protocols :
The DBA can set the data return protocol in the
See also the Data Retrieval Tools compendium. Example:
-- . --
|-------------------| Syntax:
This advanced technology has been temporarily The row clause is an AxleBase-specific function that may be used to target specific table rows in a SQL statement. It was developed primarily as a VLDB tool for use in an "OLAP" environment to target a range of rows in very "Large" tables. It should be used with care in a concurrent "OLTP" environment should be avoided. Speed :
-- . --
|-------------------| This advanced technology has been temporarily
-- . --
|-------------------| The following summary functions may be used in the SQL select clause. (See the data "Vector" object - Select sub-section for discussion of the SQL select.
A select function returns a calculated value that is derived from the contents of the specified column. Multiple functions may not be used in a query. The function return logic does not permit row returns with it. A query that contains a function will return a single tuple containing the function result. An AxleBase function may be run against any column regardless of the defined data type. The validity of the return should be ascertained by the host. If the defined type is numeric, then the function will treat the data as such in the evaluations and calculations.
Column Specification :
Standard Deviation :
The maximum value bound for a function is 1.79769313486232E308. Each of the following examples will return a one-row dataset with the specified value(s) contained in that row. Example uses sReturn to catch "Error" returns. Example:
Example:
Example:
-- . --
|-------------------| Syntax:
This is an AxleBase function that is provided for use in SQL statements. It may be used to perform one or more of any of the following operations on a string of characters:
The concatenation operator is the ampersand. Leave a space on each side of the ampersand so that it can be recognized as a stand-alone character and not part of a variable. Values may be literals and may be column names in the where clause. (The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.) Example:
-- . --
|-------------------| ( Under construction, consideration, or study and not yet available. ) Allows an ordinary "OLTP" table to be expanded into the "VLT" realm of a Data Warehouse using only the where clause in a SQL query. Most of an "OLAP" table is seldom needed, whereas some of it may be needed frequently. The "OLAP" portion is valuable when needed, but greatly slows the usual "OLTP" operations and can even confuse ordinary operations. Therefore, the two types of table are usually separated into different tables and even different databases, and the "OLTP" data is periodically moved into the "OLAP". AxleBase allows the "DBA" to create a table-family with similar and separate tables. In a family, the master table contains the "OLTP" data for high speed processing, and the expansion table contains the "OLAP" data. Queries usually run against only the master "OLTP" table, but a query can instantly expand it into a single VLT. The action is entirely transparent to the query user. The SQL query conforms to the industry-standard ANSI-92 SQL. The expansion occurrs when the sys_archive column is referenced in a "where" clause. There is no sys_archive column in the table, but the value is available as a virtual column. It becomes declared when used in a where clause and its value can be returned in the query. Any SQL operation can be performed on it in the "where" clause that can be performed on standard columns. Each table in the family is separately maintainable. The expanded table is read-only. An expansion table can be assigned a value by the DBA. In the following example, the database contains a century of data that the DBA has separated into one hundred tables, each of which is identified by its year. The query will temporarily combine all tables greater than 1998 to return the requested information. Example:
-- . --
|-------------------| The test option is a member of the group that is passed within the appendix clause. Please review the "Appendix" sub-section for additional information. When you must run a command or query of which you are afraid in the production environment, see if it can first be safely run with this "Test" option. If a command can receive an appendix clause, and if it can be tested, then this option provides a means of testing without commitment. It allows testing a SQL statement on a table that might be endangered such as a critical "VLT". When this option is passed with a command, the command will execute as usual to the point where it would commit to the action, or to the point where an "Error" occurs. It will halt and return at that point. If no error is returned, then the command would have executed successfully. Where possible and appropriate, this option will test :
For example, a query will do everything as it normally would up to the point where the data read would physically start reading the storage medium. It will stop at that point and return. Many "DBA"s dislike returning security errors because that might weaken security. Those errors can be returned only if the DBA has configured the system for it. The TestMode and the test option in the Appendix clause are exclusive. If either is true, then the command will only be tested. See also: the Data Retrieval Tools compendium. Example:
-- . --
|-------------------| Variables in the SQL where clause may include wildcard characters. Those characters are recognized by AxleBase as wildcards when the "like" construct is used. The industry standard default multiple-character wildcard character is an asterisk. The multiple-character wildcard character represents any string of characters. The industry standard default single-character wildcard character is a question mark. The single-character wildcard character represents any single character in that position in the variable. Cautiion :
Example:
Example:
-- . --
|-------------------| Syntax:
The WorkArea command may be used to reduce disk thrashing and disk contention, and to increase processing speed of very large queries. It is used in the optional SQL "Appendix". It does not replace the database TempDb, but will be used with TempDb. For example, very large data returns that are sorted may run hours longer because a very large dataset cannot be sorted in RAM, but must be sorted on disk. Sorting it on disk requires that the massive return must be red and re-written numerous times. Each read and write requires the physical disk to move from file to file every time. A twenty million row return might need to perform a half billion disk accesses, which can take many hours on a slow or heavily used computer. If that query carries a work area assignment in its appendix, AxleBase will use that location and the tempDb for the sort. As each operation is completed, AxleBase will write the next file on the unused location, swapping back and forth, until the sort is done. This temporary work area can be thought of as a personal work area for the query. That work area will be neither cleaned nor cleared by AxleBase because the operator may carelessly use a location that is being used by other files. Location :
See also: tempDb, and the Data Retrieval Tools compendium. Example:
-- . --
_________________________ API : Application Programming Interface The following API discussions can become confusing. For example, it recognizes the fact that both ends of the communication session must have a host for an AxleBase "Instance", but only one host may be interested in the fact that a variable return from AxleBase is byref. The AxleBase interface consists of multiple optional interfaces. The software engineer may select any one of them through which he can communicate with AxleBase. They are :
The standard interface is similar to that of other database managers. It has many functions and commands that operate in familiar ways like the functions and commands of many programming languages. They are divided between the "Manager" object and the "Vector" object, so the standard interface uses two objects. The other interfaces may be used as needed, but are provided mainly to allow the simplification of the host in which AxleBase is embedded. They are abstractions of the standard interface that allow all of the standard interface commands to be passed to them in a single command. Thus, each of the abstracted interfaces is only a single command-function. They are all contained in the AbstractInterface object. The Unicom interface is an abstraction of the Standard interface. It is similar to a C++ function. It accepts all standard commands, with parameters, in a single command. The Unistring interface is an abstraction of the Unicom interface. It allows all standard commands, with their parameters, to be passed as a single string of characters. The "SysLink" interface is an abstraction of the Unistring interface. It accepts entire SysLink transmissions into a SysLink front end for additional simplification of the host where the SysLink protocol is needed. That abstraction hierarchy, from bottom to top, is :
The three interface objects are :
The interfaces with their objects are :
( See the "SysLink" sub-section for an embarrassing and accidental year-long test of the interface abstractions.)
-- . --
_________________________
-- . --
|-------------------| The interface hierarchy from the top down is :
The abstract interfaces are all contained in the AbstractInterface object. Each of the abstract interfaces has a single command-function, and the entire AxleBase lexicon is encapsulated in that single command. That allows a tremendous simplification of remote servers. They can receive any command from a client and hand it to a single AxleBase command, or the clients can pass everything to the server in a single command. The AbstractInterface object converts the abstract commands into the standard commands so they can be executed by the Standard Interface. Therefore, although using a simplified command, the software engineer must understand the syntax and usage of the standard command that he passes in the simplified command.
-- . --
|-------------------| The UniCom interface consists of just one function that is named UniCom. It is an abstraction of the standard interface; i.e., every standard command and function can be executed through it. Obtain the UniCom interface by instantiating the AbstractInterface object. That object presents the UniCom function. The advantage of the UniCom interface is a simplification of the entire Standard interface into
Object Instantiation :
UniCom Syntax :
The UniCom function becomes the entry point for all functions and commands to AxleBase. All of the standard commands and functions may be entered through it. StandardCommand :
Parameters :
Parameter Data Types :
Returns :
"Error"s :
Speed Comparison To Standard Interface :
Example:
Example:
Example:
-- . --
|-------------------| The UniString interface consists of just one function that is named UniString. It is an abstraction of the UniCom interface. The standard commands and functions can be executed through it. Obtain the UniString interface by instantiating the AbstractInterface object. That object presents the UniString function. The advantage of the UniString interface is a simplification of the entire AxleBase interface into
Object Instantiation :
Syntax:
The UniString function becomes the entry point for all commands to AxleBase. The standard commands and functions may be entered through it. CommandAndParameterString :
Returns :
Parameters :
Data Types :
"Error"s :
Speed Comparison To Standard Interface :
Internal Separators :
Example:
Example:
Example:
Example:
-- . --
|-------------------| The "SysLink" interface is a single command that abstracts and compresses. It abstracts the UniString interface and compresses the entire Syslink communication protocol into that command. Obtain the SysLink interface by instantiating the AbstractInterface object. That object will present the SysLink command. The SysLink interface allows additional simplification of host servers by compressing the SysLink communication protocol into a single command.
Use of this function changes the nature of the relationship between AxleBase and the host so that AxleBase becomes the controller although called by the host. This is a highly abstracted function. It sits on top of the UniString function, which abstracts the UniCom function, which abstracts the standard interface. Familiarity with the underlying layers is recommended. Internal Construct :
Syntax:
Entry Point :
Format :
Benefits :
InboundMsg :
Messages :
AxleBase Command Format :
Errors :
Speed :
Returns :
Return 1 :
Return 2 :
Return 3 :
Return 4 :
Return 5 :
Security Deviations :
Example:
Testing :
-- . --
|-------------------| Syntax:
Purpose :
This command may be sent to any of the interfaces at any time. Security and database connections are not checked for this command to allow its use by remote clients. The "Encryption") and authentication settings for envelope creation in the AxleBase instance will be respected. SysLinkString :
Payload :
AxleBase Command Payloads :
Envelope :
ResponseToId :
Return expected: Nothing.
Example:
Example:
-- . --
|-------------------| Syntax:
Purpose :
In a situation where the host is handling everything else, but has trouble with the SysLink protocol, transmissions can be passed to this function so that AxleBase handles SysLink matters. This function first insures conformance to all SysLink specifications. Then it extracts the payload. A deviation from protocol will stop processing with an "Error" return. The "Encryption") and authentication setting requirements in the AxleBase instance will be respected. SyslinkString :
commandReturn :
Payload :
Return expected: Nothing.
Example:
-- . --
|-------------------| Syntax:
Purpose :
This maintains the status of a communication session in the local AxleBase "Instance". The SysLink function automatically maintains it. Otherwise, it can be maintained with this command. When making a change, all values must be passed. Action :
requestorId :
SessionId :
DateTime :
Return expected: Nothing.
Example:
-- . --
__________________________________________________ |
AxleBase Technology And Documentation |
||
Web site is maintained with Notepad.
|