Advanced Database Manager

Power by Design




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


                                             


__________________________________________________
Copyright 2003 - 2023 John E. Ragan

This is a legally copyrighted work,
so none of it can,
legally or honorably,
be copied, used, or claimed by anyone other than the owner.
__________________________________________________






__________________________________________________

Operation Manual page 1

Click   HERE   for page 2

          HERE   for page 3

  HERE   for the
Table Of Contents,
Lexicon, and Syntax Reference;

Or {Alt Left Arrow} to return to prior location.
__________________________________________________

Address: jragan.com/axledoc_1.htm#01.00.00
-- . --

Documentation Approximate Statistics

last update   20230919
word-count   nearly a half million *
HTML links   3,459
published bytes   1,905,578
( * See the "Word-Count Analysis" sub-section.)
( Document management is by John Ragan's CoreDoc.)

__________________________________________________






__________________________________________________
Preface To The Operation Manual
__________________________________________________
Address : jragan.com/axledoc_1.htm#01.01.00
-- . --

Please read this preface.


-- . --


Descriptions of 3 similar web pages.
      "Executive Summary"
      An abbreviated and simplified description of AxleBase. It is designed for busy executives and for those who are not technically oriented.
      "Description"
      An expansion and technical enhancement of the executive summary. It may give the best overall description of the system and its abilities.
      "Operation Manual"
      This operation manual is for the managers and technicians who will implement and operate AxleBase. It is documentation for organization managers, database administrators, data administrators, system designers, and software engineers.


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.
      ( Research Findings:   See the "Research" page.)

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:
      Mr. Bahani Agalheir and his wife are dear friends, and, for years, he has wanted to sell AxleBase. Bahani is highly educated, hard working, trustworthy, and one of the finest gentlemen and fathers that I have ever known. Since Bahani believes that he can find somebody who needs AxleBase, it is for sale.

To discuss acquisition of the AxleBase technology, please contact
      Mr. Bahani Agalhier
      bahani.agalheir@gmail.com
      501-366-3383

Description:
      This Operation Manual is designed for professional database administrators with years of experience, so it is rather technical.
      Whether or not you are technical, it is suggested that you read the "Description" document before this one. It too is technical, but far gentler than this document. It describes what the system can do instead of how to run it.

Manual Update:
      This manual has never been edited, so it is being updated and edited in 2023. The builder wrote various portions as stream of consciousness while building. With over a hundred thousand words, it is being divided into several documents to be more manageable.

System Coverage:
      The AxleBase system is extensive and sophisticated, and can do things never before imagined. After being away from it for years, reading about this technology has been fun for its creator.



John Ragan
AxleBase Builder



-- . --

End of the Preface.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.




__________________________________________________

Table Of Contents
Of The Entire Operation Manual,
With The AxleBase Lexicon, And Syntax Reference.
__________________________________________________


. . . . . . . . . . . . . . . . . .
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

-- . --

End of the Table Of Contents.





__________________________________________________
Chapter 1
Introduction
__________________________________________________

Address : jragan.com/axledoc_1.htm#10.00.00
-- . --






_________________________

The Instance

a section of
Introduction




Address : jragan.com/axledoc_1.htm#10.10.01
-- . --


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.

-- . --

End of the Instance section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

General

a section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.00
-- . --







|-------------------|

Description

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.05
-- . --



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.

-- . --

End of the Description sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Documentation Characterization

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.10
-- . --



Intended Audience :
      All personnel.

AxleBase is designed for the performance of :
      Very Large,
      Unusual,
      Delicate, and
      Complex tasks.

Its documentation must serve disparate professional groups including :
      Managers,
      Software Engineers,
      Database Implementers,
      System Administrators, ( "DBA"s),
      End Users.

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.
      For one in whom the Creator placed a love for logic, relearning the internal beauty of AxleBase has been tremendously enjoyable.)

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.
      Depending upon the size and complexity of the database administration, its hours of availability, and the importance and cost of the data, the business managers may even decide that a DBA group is needed for its administration.
      Depending upon how AxleBase is used, the end user may not have enough technical training or experience. In that case, the DBA may be tasked with user training and support. For example a common use of a database is routine queries of the data tables, which may not be as easy as it is for ordinary database managers.
( Warning :
      See the table "Lock" warning in the "SQL Select" sub-section. )

( For Software Engineers:
      In addition to this documentation, AxleBase contains internal documentation that was specifically designed for system engineers.
      The Seeper app was intended to translate apps from one language into another, and was abandoned when AxleBase development ceased. At that point, it could partially translate, and completely report on the target's internal characteristics.
      The Seeper app reports 259,437 words in the comments inside AxleBase, making it even greater than this documention. Last run 20221203.)

Advanced System Tutorials:
      The advanced features at the end of this documentation have extensive comments that cover operation and theory tutorials; i.e., such things as very large distributed table and system design and operation, and error management for such tables and systems.

-- . --

End of the Documentation Characterization.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Documentation
Word-Count Analysis

a sub-section of
Introduction Section



Address : jragan.com/axledoc_1.htm#10.10.11

Initial upload 20221208
Last update 20230310
-- . --



Intended Audience :
      Organization Managers,
      Software Engineers.


Documentation Word-Count
Location count
  operation manual page 1     57,910
  operation manual page 2     45,123
  operation manual page 3     71,855
  total operation manual     201,620
  technical description page     13,609
  embedded documentation  *     259,437
  grand total     474,666  

Word counts exclude special characters and HTML code.



-- . --
For Managers And System Engineers


( * Embedded in system code.)
      Professional system development includes embedding technical documentation within the programming code as the code is written to support maintenance and alteration by system engineers. Most major organizations require such in-code documentation. Software engineers; i.e., the designers, developers, and programmers, usually refer to it as comments, and will be very interested in seeing these numbers, so the decision was recently (20221205) made to report all of the system's documentation.

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
Run Time 0:4:6 h:m:s
Lines Total Start 74,210 not blank
Lines Total End 60,734  
Lines Code 53,302in source
Comments 27,084in source
Comment word count 259,437  
Code Bytes 1,771,502 in source
Bytes Translated 1,546,441 result
Percent Changed 87 % of source
Classes 17  
Forms 0  
Modules 2  
Functions Global 499 subs & props
Functions Total 908 subs & props
Variables Module 1,127 private and global.
Variables Function 5,185  
Arrays Total 599  
Loops 1,137  
API Calls 0 not translated *

* No windows API calls were used in
    AxleBase to insure its portability.

-- . --

End of Documentation Wordcount analysis.

Click here to go to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

System Solidity

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.12
-- . --



Intended Audience :
      Managers,
      Software Engineers,
      Database Designers,
      System Administrators, ( "DBA"s),
      End Users.

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:
      Starting in the last century, this author designed and coded autonomic systems with complex system-to-system and system-to-people interaction including querying database servers on mainframes, checking hardware, compiling and distributing complex reports, etc. that ran on networks.
      One of them had run fifteen years at last check, performing high-speed mission-critical emergency work-crew dispatching for one of the world's largest corporations with no errors and no down time. It worked so well in its first major emergency, dispatching twenty-five thousand men around the clock for days, that a plan to rewrite it and move it from its little PC to a mainframe was cancelled.

Formal Testing :
      See the "Notable Tests" page for documented and published test results.

Other Trials :
      - Except where incomplete or noted otherwise in its documentation, every one of the hundreds of commands, functions, queries, configurations, etc. was tried multiple times after its coding was completed. If it appeared to be fragile, it was attacked in attempts to break it. It was intentionally run with invalid parameters.
      - High speed looping systems were constructed that ran commands until forced to stop. Their intensity sometimes destroyed disk drives and computers.
      - For five or ten years, the builder's personal system, built around AxleBase, has been used many times nearly every day without detectable errors in AxleBase. (It did, however, continue to point out his incompetence as an administrator for several years. AxleBase has no sense of humor.)

-- . --

End of the System Solidity sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

AxleBase System Security

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.13
-- . --



Intended Audience :
      Primarily management,
      but Software engineers,
      and ( "DBA"s) may be interested.



-- . --

See the "Feasibility Testing In AxleBase" section of the "SysLink Protocol" documentation.
      Since the SysLink protocol is built into AxleBase, the following SysLink sub-sections might also be of interest.
      "Processor Load"
      "System Interfaces"
      "Encryption"
      "Autonomic Systems"


-- . --

See also the 10 sub-sections of the "Security"" section of this AxleBase documentation.
    Sub Sections
      "Introduction"
      "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)"


-- . --

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.

-- . --

End of the System Security sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

AxleBase System Testing

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.14

updated 20221110
-- . --



Intended Audience :
      Primarily management,
      but Software engineers,
      and ( "DBA"s) may be interested.

The builder has made a concerted effort to find and fix every error and shortcoming in the
            theory,
            design,
            engineering, and
            programming
of the AxleBase system through exhaustive test and trial.



-- 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:
      "A virtual table of trillions of rows was joined to billion-row tables. However, it was decided that since people were having trouble understanding basic AxleBase, and since the big name brands were simply copying tables and calling them virtual, people would certainly be confused by real virtual tables. So virtual table tests were withdrawn. But that was alright with the builder because those petabyte-sized joins were beating the daylights out of equipment that he could not afford to replace."
      See "CreateVirtualTable" in the API chapter, and the various "Virtual Tables" discussions in the "Advanced Topics".



-- 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.
      So as of this morning, I can safely write that, as far as I can remember, AxleBase has evinced neither bug nor error nor shortcoming in the past decade of daily use.



-- 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.

-- . --

End of the AxleBase System Testing sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Support For Mobility

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.15

uploaded 20230503
-- . --



Intended Audience :
      Organization managers, Database Administrators, System Developers, operators.

Purpose :
      The purpose of this sub-section is to describe the various AxleBase abilities and mechanisms that support and protect mobile operations, and that can overcome problems that are inherent in those operations.

      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.

-- . --

End of the Support For Mobility sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Operator Hints

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.16
-- . --



Intended Audience :
      Operators. Those who will be using AxleBase.

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.)

-- . --

End of the Operator Hints sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Design Objectives

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.20
-- . --



Intended Audience :
      Primarily management, but everybody will be interested.

A database manager that can manage
       very "Large" data objects
       on the cheapest equipment available
       as an embedable object.



Accessibility Highest possible. *
Use Any software that can embed it **
Interface Detailed and programmable.
Language Uses standard ANSI-92 SQL.
Scalability The biggest imaginable.
Platform Cheap desktop PCs.

( * 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.)

-- . --

End of the Design Objectives sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Installation Architectures

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.25
-- . --


Intended Audience :
      Managers,
      Software Engineers,
      Database Designers,
      System Administrators, ( "DBAs").


-- 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.
      As such, an installation may be a part of a single desktop computer, or it may be an organization's continent-wide sphere of operation.
      In any case, a particular installation is ultimately defined and created by the organization's task and its organizational managers.

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
      - multi-tasking internal code
      - and using multi-tasked object-based engineering.
      Of some importance to organizational managers is the fact that the AxleBase object, which provides everything covered in this document, is a single executable file smaller than a megabyte. Ergo, the entire advanced AxleBase technology can be deployed on a single very small chip plus data storage.

      - Therefore, an AxleBase file can be a database server, a database client, or both; whichever you need.
      - That allows you to design your system architecture as a central database server that serves clients and other database servers.
      - Or a series of data servers supporting each other.
      - Or a group of data servers that specialize in data or tasks.
      - Or etc...

      - 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.
      - Or that can be destroyed only by a global event.
      - Or, if you have offworld assets, can be destroyed only by an interplanetary event.

      - 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...
      - The "DBA" can even define a table by combining geographically dispersed tables. See the CreateVirtualTable command.

      - 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.
      For example, every query of the 100-Billion-row table initiated health checks of that table's 38 thousand dispersed files, and he monitored their health as the query proceeded, but notice how fast each query executed. (Such ancillary activities are included in the run times reported on the "Notable Tests" page.)

      - 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".
      - AxleBase also contains mechanisms that the query operator can use in his queries to protect computers and networks from damage by very large dataset transits. See the "Data Retrieval Tools Compendium".
      - All of the functions and services that you will read about in this manual are integrated with all of the above abilities, unless stated otherwise. (As you can understand by now, that "unless" qualification is only in case I have forgotten something.)

-- 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.
      Brought to mind decades later by this recent publication.
      (*ref. Source: "American Scientist", vol. 110, Mar 2022, pp. 94-101, "Evolution And The Flexible organism" by Prof. David Pfennig)

-- . --

-- 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.

-- . --

End of Installation Architectures sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Military Systems

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.30
-- . --


Intended Audience :
      Managers,
      Software Engineers,
      Database Designers,
      System Administrators, ( "DBA"s),
      End Users.

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.
      ( The speed reported on the "Notable Tests" page was delivered on disk drives from the last century. The new solid state storage might make AxleBase a hundred times faster.)

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.

-- . --

End of the Military Systems sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Interrupted Development

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.35
-- . --


Intended Audience :
      Managers,
      Software Engineers,
      Database Designers,
      System Administrators, ( "DBA"s),

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.
      See "relativistic disruption" technology in the "Fault Tolerance" sub-section of the "Description" document. (That sub-section was written while the subject was fresh on the builder's mind, so it may be too positively worded, but it still appears possible.)

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.
      Coding and some testing had been done, but testing and evaluation of this feature was underway when interrupted by development cessation, so let us consider it experimental at this time. April of 2022.)

-- . --

End of the Interrupted Development sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Programming Interfaces

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.40
-- . --


Intended Audience :
      Primarily system engineers and DBA's, but suggested for everybody.

"Error Protocol" And Functions :
      Everything in AxleBase is a function. If you remember that while you develop your code, it can save you a ton of debugging and troubles. If all of your code expects a return, you will not miss an error message. Regardless of how deeply an error occurs, its report will bubble up to the top of the code. (See the AxleBase Error Protocol, and the ShowErrorList function. Note that the error message is standardized for reading by unattended systems as well as by people.)

Objects :
      Internally, AxleBase is an object based construct. He exposes various interfaces of objects that can be used by the engineer. For example, the two main objects are the "Manager" and the "Vector" which can be instantiated by the GUI when ordered by the operator.

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.)

-- . --
Example

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:
oManagerObject.ShareDatabase DatabasePath , DomainPath [, IndexPath [, LogPath [, SegmentPointerPath [, TempDbPath ]]]]

"TestMode" :
      If the user has a concern about system stability, he can first turn on TestMode. As long as it is on, commands will run up to the commit point and exit without committing. It will allow errors to stop the process and return error messages before the commit point.

Execution :
      He will execute AxleBase to load an "Instance" of AxleBase.
      He will use that instance to create a manager object into which, he will pass the commands. See the "Manager Object Interface Introduction". He will pass the above function and the following functions to the manager object for execution.
      The "OpenDomain" function will open the domain that contains the database.
      The "OpenDatabase" function will open the database that will be shared.
      The "ShareDomain" function will share the database domain.
      He will execute the "ShareDatabase" function.
      He will watch for error returns after each step.

-- . --
End Of Example

-- . --

End of Programming Interface sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Socket Programming

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.50
-- . --


Intended Audience :
      Primarily system engineers.

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.

-- . --

End of Sockets sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

ODBC Drivers

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.55
-- . --


Intended Audience :
      Primarily system engineers.

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.)

-- . --

End of the ODBC Drivers sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

System Identifiers

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.60
-- . --


Intended Audience :
      All personnel.

( ! 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

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:

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.

-- . --
SAM versions:

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.

-- . --
"SysLink" release:

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.

-- . --
system ID numbers:

The system contains the following object and process identifiers that are available to the host through the API.
      Instance ID.
          Temporary for life of the Instance.
          See "ShowInstanceID"
      Vector name.
          Temporary for life of the Vector.
          May be set by operator.
      Domain connection ID.
      Database connection ID.
      Dataset ID.
          Temporary for life of the Dataset.
          See "ShowDatasetAttributes"
      Query ID.
          Same as dataset ID.
          May be set by operator.
      Domain ID.
          See "ShowDomainAttributes"
      Database ID.
          See "ShowDatabaseAttributes"
      Table ID.
          See ShowTableAttributes
      Index ID.
      Report IDs.
      Row IDs in some tables.
      Host computer name.
      Operator name.

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.

-- . --

End of the System Identifiers sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Very Large

a sub-section of
Introduction



Address : jragan.com/axledoc_1.htm#10.10.75
-- . --
^



Intended Audience :
      Everybody.



This advanced technology has been temporarily

moved off line during the documentation editing.



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.

-- . --

End of the Very Large sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

Installing AxleBase

a section of
Introduction



Address : jragan.com/axledoc_1.htm#10.40.00
-- . --







|-------------------|

Development Environment Installation

a sub-section of
Installing AxleBase




Address : jragan.com/axledoc_1.htm#10.40.10
-- . --



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:
1.   Place the exe pack in a temporary directory.
2.   Run that exe to unpack it.
3.   Run setup.exe to install.
That's all.

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:
    Relocate the DLL.
    At the DOS prompt,
    run the command regsvr32 [path]\AxleBase.DLL.
    Watch the return to insure installation

That method can be especially useful when upgrading to a new release. To uninstall, run regsvr32 /u [path]\AxleBase.DLL.

A fictitious example:
    regSvr32 /u c:\windows\AxleBase.DLL
    regSvr32 c:\dev\AxleBase.DLL

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.

-- . --

End of the Installation sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Production Environment Installation

a sub-section of
Installing AxleBase



Address : jragan.com/axledoc_1.htm#10.40.20
-- . --



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.

-- . --

End of the Production Installation sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

GUI Front End

a section of
Introduction



Address: jragan.com/axledoc_1.htm#10.50.00
-- . --



Intended Audience :
      Management and software engineers.

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.

-- . --

End of the GUI Front End section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

Getting Started

a section of
Introduction



Address : jragan.com/axledoc_1.htm#10.70.00
-- . --



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.

-- . --

End of the Getting Started section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





__________________________________________________
Chapter 2
Test And Demo Software
__________________________________________________


Address : jragan.com/axledoc_1.htm#15.00.00
-- . --



The test software is simple software that is designed to demonstrate and test the AxleBase system.





_________________________
AxHandle ; GUI Test Host

a section of
Test And Demo Software



Address : jragan.com/axledoc_1.htm#15.10.00
-- . --


End of the AxHandle header section.





|-------------------|

Introduction

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.05
-- . --



Intended Audience :
      Everybody.

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.)

-- . --

End of the Introduction sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

AxHandle Assistance

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.10
-- . --



Intended Audience :
      Everybody.

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.

-- . --

End of the AxHandle Assistance sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Object Control

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.20
-- . --


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.

-- . --

End of the AxleBase Objects sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Passing Commands

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.25
-- . --



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 :
        1. Click on the OpenDomain command in the top command window to highlight the command.
        2. Then, enter the domain path in the parameter window.
        3. Press the do_it button.
            AxleBase will open the domain.
        4. Click on the "ShowDomainAttributes" command.
        5. Press the do_it button.
        A list of the domain's attributes will be displayed.

-- . --

End of the Passing Commands sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Returns

a sub-section of the
AxHandle section



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.

-- . --

End of the Returns sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Help

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.35
-- . --



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. )

-- . --

End of the Help sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Stored Connection Strings

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.37
-- . --



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.

-- . --

End of the Stored Connections sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Demonstration Databases

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.40
-- . --



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.

-- . --

End of the Demo Databases sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

VLDB Expansion

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.45
-- . --



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 ! :
        This operation can fill a disk so it should be monitored.
        AxHandle has a row limit on his configuration screen. If an amount is entered before starting the operation, the table size will not exceed it.

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 :
        For large tables, do a "SQL Count" query to get a row count. Then use the AxleBase "Row" clause in a SQL command to go directly to a specific area of the table for the operation.

-- . --

End of the VLDB Expansion sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Testing AxleBase

a sub-section of the
AxHandle section


Address : jragan.com/axledoc_1.htm#15.10.50

Updated 20221013
last update 20221130
-- . --



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.


      - Report of AxleBase test.
      - AxHandle generates a report each time that he is commanded to test AxleBase, and prints it to the screen when it is complete. If there is an error during the run, he cancels the entire run and reports only that error, which saves tremendous time in tedious error searches.
      - The following report is expanded with blank lines to make it easier to read.
      - Count:
      - The job consists of every command that he is able to run and check autonomously. (That the absent-minded builder did not overlook.) It currently contains 588 identifiable discreet tests.
      - Some contain multiple tests, and some also contain intentional errors such as spelling and character case, to always insure that changes have not sensitized AxleBase to them.
      - Since it is actually a test, AxHandle checks each return, and will abort the entire job for any detected error, error message, anomalous condition, or unexpected return.
      - Inconsistency:
      - Commands in the test that are interdependent are sequentially checked for failed or inconsistent returns
      - Notes:
      - AxHandle prints notes within the report, and those have been prefixed with "*Note*" on this copy to make it more understandable.
      - Speed:
      - Digits before each command are approximate run times. Minutes-seconds-decimal parts of a second. Remember that the times reflect the fact that this was run on an old mechanical disk drive.
      - Where there are only zeros, the execution was faster than the computer could measure it. Because of the internal axleBase design and because it was compiled to native code using a C++ compiler, you will find that approximately 60% of the tests in the following report are that fast.
      - Returns
      - Returns from the encrypt and authenticate commands have been deleted from this copy to protect proprietary work.
      - Some very long parameter strings are truncated by AxHandle for readability.
      - Commands that produce a report such as the "ShowDomainAttributes" frequently have no printed return because AxHandle found no error or anomally in the return.
      - Some points will be obscured if you are not familiar with AxleBase. For example, AxHandle reports that the single SQL insert into the "T_CITIZEN" table inserted 50 rows instead of 1. But notice that the command specified an "Arrayed Insert", and the very long SQL insert string had to be truncated by AxHandle to display it.
      - Persistence:
      - All objects and data created by the test are left on disk afterward. They can be queried, altered, or deleted as you wish. If they are not damaged beyond recognition, the next test run will drop and recreate them.
      - Created are 5 databases containing 73 tables with a small number of data rows.
      - Simplicity:
      -The test is so easy to run that it was usually run many times per day during development.
      - When the test is complete, it uses the "Arrayed Insert" command to create an insert of the entire test with one test on each row into the T_DEMO_SCRIPT table. If you do a select * query, it will return a list of tests with descriptions.
      - Stress Tests:
      - Since the test has a heavy footprint, it was given a cycler on the AxHandle menu to allow it to run continuously to test the entire system, including hardware. Many such stress tests have been run.
      - Last test run:
      - 20201007.



* * * * * * * * *
The copy of AxHandle's report follows the next line of stars, and ends with the note,
"The copy of AxHandle's test report ends here.".
* * * * * * * * *


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 copy of AxHandle's test report ends here.
* * * * * * * * *

-- . --

End of the System Tests sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Continuous Cycling

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.55
-- . --



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" :
        Turning off the "YieldProcessor" toggle can increase the system load, but if a high load is attained with it off, it may be extremely difficult to stop a test. If multiple instances of AxHandle are run simultaneously against the same database, then a yield is necessary to force them to cooperate.

Logging :
        Logging is the best way to see what happens in a test, but logging will increase the system load. Running multiple "Instances" simultaneously with logging on may increase the load significantly.

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 :
        This feature of AxHandle is designed to stress the system. That includes the entire computer system. AxHandle is the tool that is used in the AxleBase development environment, so you can set up its tests to overwhelm a system and perhaps even destroy hardware and operating systems. Do not depend on an AxleBase collapse to protect your hardware, because AxleBase is designed to ignore everything until his job is done or everything is dead.

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. )

-- . --

End of the Continuous Cycling sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Step By Step Operation

a sub-section of the
AxHandle section



Address : jragan.com/axledoc_1.htm#15.10.65
-- . --



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.

-- . --

End of Step By Step Operation sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________
Database Server

a section of the
Test And Demo Software chapter



Address : jragan.com/axledoc_1.htm#15.20.00
-- . --







|-------------------|

Description

a sub-section of the
Database Server section



Address : jragan.com/axledoc_1.htm#15.20.10
-- . --



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.)

-- . --

End of the Description sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

What It Is Not

a sub-section of the
Database Server section



Address : jragan.com/axledoc_1.htm#15.20.20
-- . --



This is a simple demonstration app.

Not a production-quality system.

Not designed for high speed operations.

Not designed for unattended operation.
( Since it has a GUI it can display an error message for the user, which will hang all computer operations until the user returns to clear the message.)

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.

-- . --

End of the What It Is Not sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Step By Step Start

a sub-section of the
Database Server section



Address : jragan.com/axledoc_1.htm#15.20.40
-- . --



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
    SELECT * FROM T_LOG, and press the do_it button.
( The server will return data to AxHandle and AxHandle will display it. )

-- . --

End of the Step By Step Start sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

SysLink Communication Protocol

a sub-section of the
Database Server section



Address : jragan.com/axledoc_1.htm#15.20.50
-- . --



"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".

-- . --

End of the Server SysLink sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Point-n-Click Query App - Axon

a section of the
Test And Demo Software chapter



Address : jragan.com/axledoc_1.htm#15.30.00
-- . --

-- . --

End of the Query App section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Description

a sub-section of the
Point-n-Click Query App section



Address : jragan.com/axledoc_1.htm#15.30.10
-- . --



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.

-- . --

End of the Query App Description sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





__________________________________________________
Chapter 3
Embedding And Running AxleBase
__________________________________________________

Address : jragan.com/axledoc_1.htm#20.00.00
-- . --

-- . --

End of the chapter header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

Designing and Coding

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.30.00
-- . --

-- . --

End of the Designing and Coding section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Data Connectivity

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.15
-- . --



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.

-- . --

End of the Data Connectivity sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Indexing

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.17
-- . --



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 :
      Many columns in databases contain small repeating datasets. The most common is the "Boolean" column, where a billion rows will have only two different values in the entire column.
      A standard index of that kind of column can be slower than no index, so AxleBase offers a special index, type 61, for it.
      AxleBase always forces boolean columns to have a type 61 index. For other columns, he analyzes the data and forces it to type 61 if it consists of a small repeating dataset.
      But what about columns that currently have no data or that are ambiguous? In that case, you can specify a type 61 in the "CreateIndex" command. For example, lookup link values from other tables are sometimes small repeating datasets.
      If queries become extremely slugish in a large table, an indexed column may need to be re-indexed with this type.
      A few thousand rows are usually enough for AxleBase to recognize a small repeating dataset, so re-indexing will cure the problem unless it is impossible for him to recognize the data as discussed above.
      ( See ForceType in the "CreateIndex" command sub-section. )

Boolean Columns :
      AxleBase forces boolean columns to have a type 61 index.
      There is usually no speed advantage in boolean column indices.

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.
      If the hardware could read a row from it
      in a millisecond,
      then scanning that table for a row would
      run around the clock for 5.5 months.)

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.
      ( See the optional segment clause in the "CreateIndex" command sub-section.)

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.

-- . --

End of the Indexing sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Remote Access And Paths

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.20
-- . --



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.

-- . --

End of the Remote Access sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Installation Design

a sub-section of the
Designing and Coding section



vAddress : jragan.com/axledoc_1.htm#20.30.25
-- . --



These features may help in the design of an installation.
1 AxleBase supports multiple database domains in an installation.
2 Each domain supports multiple client databases.
3 Distribution across multiple spindles and computers is supported for speed.
4 Its domain/client database structure can help organize and control.
5 Multiple host apps can share a database.
6 A host app can tell its AxleBase instance to create multiple database manager "Instances", and each will configure itself independently.
7 Each of those database manager instances can open a different database.
8 The master app can use all of those instances simultaneously.
9 Each database manager instance can support any number of data objects that can operate independently.

-- . --

End of the Installation Design sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

The Database Domain

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.30
-- . --



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:
1.     dim oMgr as Manager
2.     set oMgr = new Manager
3.     oMgr. OpenDomain "\path\demoDom\"
4.     oMgr.OpenDatabase "prodClient3"

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

-- . --

End of the Database Domain sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Concurrent Operations

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.40

Updated 20221013
-- . --



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:
      If the host is a server and only a single server is allowed to access each database, then much of the concurrency problem is thereby handled. But AxleBase was designed for far more complex organizational operation. He allows multiple hosts and even multiple database servers to run against the same database. Although the hosts are entirely independent and could therefore conflict in theory, each and every AxleBase "Instance" operates with the problem in mind to protect the data.
      ( Yes, even multiple servers per database such as might be found in multi-system military operations. See "high speed" in the "SysLink Protocol" document.)

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:
      ( Concurrency testing is an operation that must be run to failure so that a valid value can be reported; i.e., the test load must be increased each time that the test is run to force a system failure. The failure point will be found somewhere below that point.
      There are also complex issues within that forced failure that must be studied. For example, how will the internal AxleBase failsafe structure react to that kind of failure when it is forced upon him?
      Those failure tests were planned but the project was stopped before they could be done.
      Please also read the "Concurrency" section on the "Test" page.)

Failure Envelope:
      His engineering is for a benign failure envelope. In other words, if a concurrency failure does occur, it will take place within the "Error" handler envelope. The result will usually be client lockout and an extreme condition would be database shutdown.

System Locks:
      All "System Locks have a built-in timeout that is set by the "DBA" so that they will self-clear after that period. An extreme problem can be handled with a database Purge by the "DBA" and should seldom require a restore.
      AxleBase manages his own System Locks, so he does not use the operating system or the host for object locking. That design decision was made for flexibility, portability, and to allow many simultaneous remote hosts, but it has a shortcoming of which the DBA must be aware; i.e., along with that decision was the design decision to allow the DBA to directly access the database. Therefore, the DBA must always keep that in mind during operation and during his "Security" design.
      See also the "System Lock Design" section and the "Concurrency Locking" sub-system.

A decision should be made during the design of the host app concerning what the host should do when AxleBase reports a "Lock" conflict.

-- . --

End of the Concurrent Operations sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Coding Tips & Techniques

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.50
-- . --



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.

-- . --

End of the Coding Tips & Techniques sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Important Coding Note

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.55


Updated 20221013
-- . --



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.
      The first element of a set is the first element.
      The number of elements in a set is the number of elements in the set.
      It is not the number of elements in the set minus one.
      To get the fourth row, tell AxleBase that you want row 4 ; not row 3.
      For the first row, tell AxleBase that you want the first row; not row 0.
      In this entire massive project, there is not a single zeroth item. None.
( Please look at the absolute stupidity of those points to see why I am adamant about this matter.)

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.

-- . --

End of the Coding Note sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

The AxleBase Interface

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.60

Updated 20221013
-- . --



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" :
      The "Standard Interface maintains the close interface between the software engineer and the system that most developers expect. It presents the entire set of commands and functions to the software engineer with close interaction.

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 :
      The abstracted interfaces are abstractions of the standard interface. Their purpose is to allow simplification of server hosts, and that allows much smaller hosts on the network. That does not, however, simplify the job of the developer because he must still understand the commands that are being abstracted to insure that they are correctly formatted and used.

"UniCom" and The "UniString" Interfaces :
      There are two abstracted interfaces; i.e., UniCom and UniString. Each of them has only a single command; i.e., UniCom and UniString. UniCom is an abstraction of the standard interface to a higher level. UniString is an additional abstraction of UniCom to another level.

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.

-- . --

End of the AxleBase Interface sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

The Manager Object

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.65
-- . --



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 :
      Declare the object.
      Instantiate the object.
      Pass the command.
      Check for "Error" messages.
      Destroy the object.
The code might look something like this.
      dim oMgr as Manager
      set oMgr = new Manager
      oMgr.OpenDomain
      oMgr.OpenDatabase "prodClient3"
Close the domain and database, and destroy the object.
      set oMgr = nothing

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.

-- . --

End of the Manager Object sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

The Data Vector Object

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.70
-- . --



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:

Set oData = CreateObject("AxleBase.Vector")
This creates a Data object named oData that needs an open database before it can be used.

A line of Visual Basic code from AxHandle that tells the AxleBase Manager to create an object:

Set oData = goMgr.DataObjectCreate
This also creates an object named oData that is connected to the Manager that created it.

Depending on the programming language, using the data object may follow this pattern :
      Declare the Manager object.
      Instantiate the Manager object.
      Open the database domain.
      Open the target database.
      Check for "Error" messages.
      Declare the Vector object.
      Instantiate the Vector object.
      Pass the SQL command to the Vector object.
      Check for error messages.
      Do the job.
      Destroy the Vector object.
      Destroy the Manager object.

-- . --

End of the Data Vector Object sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Client Connection Protection

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.80
-- . --



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 :
      When a query is received and processed, the result will be available even if the session connection is broken. Reconnect to the server and to the database. Then issue a "ReturnCache" command using the query name in the optional parameter and with a " tuple" count if needed. The data will return normally.

System-Wide Protection :
      If all clients are subject to such disruptions, the "DBA" can configure the system to defer all returns to protect them. In that case, the client software should generate a query name for each query. If the connection is lost, the client software can show the query id to the user, or add it to the next query. The query name must be protected to avoid "Security" problems.

Timeout :
      Each database has a timeout for its work location.
      The "DBA" maintains that value.
      A deferred return will remain on file for that duration.
      ( The system has various timeout values.)

Server Loss :
      If the server completes the query, then the deferred dataset return will be safe through server crashes, shut downs, and loss of the database connection. The dataset will persist for the time that the "DBA" specified for the temp timeout in the database configurations. If the "Instance" crashes during the query or while returning the dataset, then, of course, the dataset will be corrupt.

Also, see the "ReturnCache", the "CacheReturn" SQL clause, and the "CacheReturns" system configurations and the "API" chapters.

-- . --

End of the Connection Protection sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Visual Basic Examples

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.85
-- . --



Visual Basic code to open a database might look something like this:
      dim oMgr as Manager
      set oMgr = new Manager
      sReturn = oMgr.OpenDomain ( "c:\domain\" )
      sReturn = oMgr.OpenDatabase ( "mydb" )
      sReturn = oMgr.ShutDown
      set oMgr = nothing

Visual Basic code to open a client database and run queries might look something like this:
      dim oMgr as Manager
      set oMgr = new Manager
      sReturn = oMgr.OpenDomain ( "c:\axlebase\db\" )
      sReturn = oMgr.OpenDatabase ( "mydb" )
      dim oQuery as Vector
      set oQuery = new Vector
      sReturn = oQuery. ExecuteSQL ("select * from myTable")
      for i =1 to oQuery.TupleCount
      sVariable = oQuery.ColumnContents ( 1, i )
      next i
      set oQuery = nothing
      sReturn = oMgr.ShutDown
      set oMgr = nothing

-- . --

End of the VB Examples sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Microsoft Access Examples

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.90
-- . --



See the previous Visual Basic examples.

-- . --

End of the Access Examples sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

WinBatch Examples

a sub-section of the
Designing and Coding section



Address : jragan.com/axledoc_1.htm#20.30.95
-- . --



WinBatch code to open and/or create a database would resemble the following. ( Some code lines are broken for readability. )


; first, create the AxleBase database object
oMgr = ObjectOpen("AxleBase.Manager")

#DefineFunction fnInitializeDatabase(oMgr, sDatabase)
      sSql = ""
      sSql = strCat( sSql, "CREATE TABLE T_TEST ( ")
      sSql = strCat( sSql, "PROCESS string ( 20 ) , ")
      sSql = strCat( sSql, "PARAM_NAME string ( 35 ) , ")
      sSql = strCat( sSql, "PARAM_VALUE ( 30 ) )")
      sReturn = oMgr.CreateTable( sSql )
      if sReturn <> "" then goto unloader
      sSql = ""
      sSql = strCat( sSql, "CREATE TABLE T_LOG ( " )
      sSql = strCat( sSql, "DATE_TIME string ( 30 ) , " )
      sSql = strCat( sSql, "PROCESS string ( 20 ) , " )
      sSql = strCat( sSql, "LOG_NOTE string ( 50 ) )")
      sReturn = oMgr.CreateTable( sSql )
      if sReturn <> "" then goto unloader
      :unloader
      return sReturn
#EndFunction

#DefineFunction fnOpenDatabase(oMgr,
            sMasterDatabase, sDatabase)
      sReturn = oMgr.OpenDomain( sMasterDatabase )
      if sReturn <> "" then goto unloader
      sReturn = oMgr.ShowDatabase
          if sReturn == ""
          sReturn = oMgr. CreateDatabase( sDatabase )
          if sReturn <> "" then goto unloader
      else
          iFound = StrIndex( sReturn,
            sDatabase, 1, @FWDSCAN )
          if iFound < 1
              sReturn = oMgr.CreateDatabase( sDatabase )
              if sReturn <> "" then goto unloader
          endif
      endif
      sReturn = oMgr. OpenDatabase( sDatabase )
      if sReturn <> "" then goto unloader
      sReturn = oMgr.ShowTables
      if sReturn == ""
          sReturn = fnInitializeDatabase(oMgr, sDatabase)
          if sReturn <> "" then goto unloader
      else
          ; could also check here for specific tables
      endif
      :unloader
      return sReturn
#EndFunction

#DefineFunction fnReadData( oMgr, )

      ; first, create an AxleBase data object
      LastError( )
      oDs = ObjectOpen("AxleBase.Vector")
      iErr = LastError( )
      if iErr != 0
          sReturn = "Failed to create an AxleBase DataSet object."
          goto unloader
      endif

      ; set the data connection for the dataset
      ; Winbatch can't handle complex objects
      ; so tell the object to set its own connection
      ; This feature was added and will be in the next release.
      sReturn = oDs.Connect( oMgr )
      if sReturn <> "" then goto cleanup

      sReturn = oDs. ExecuteSQL( "Select count(*) from myTable" )
      if sReturn <> ""
          ; a count can return a number as an error
          if isnumber(sReturn) then
          if sReturn < 0 then sReturn =
          "**ERROR: The AxleBase database manager
          returned an
          error during the data retrieval."
          endif
          if StrSub( sReturn, 1, 8) == "**ERROR:"
          then goto cleanup
      endif

      i = oDs.tupleCount
      if i < 1 then goto cleanup

      sReturn = oDs.tuple

:cleanup
      objectClose( oDs )

:unloader
      return sReturn
#EndFunction

sReturn = fnOpenDatabase( oMgr, "c:\db", "c:\db\thisApp" )
; the above will open the database.
; if it does not exist, the function will create it.
if sReturn <> "" then goto unloader

; close the AxleBase database object
ObjectClose(oMgr)

-- . --

End of the WinBatch Examples sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

System Lock Design

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.40.00
-- . --

See also the following sub-sections, and the "LockObject" command.

-- . --

End of the System Lock Design section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

General

a sub-section of the
System Lock Design section



Address : jragan.com/axledoc_1.htm#20.40.10
-- . --



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 :
      the "LockObject" user discretionary command.

-- . --

End of the General sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

AxleBase Lock-Space Domains

a sub-section of the
System Lock Design section



Address : jragan.com/axledoc_1.htm#20.40.20
-- . --



Domain Description
D Discretionary.
P Persisted.
A Autonomic.

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.

-- . --

End of the Lock Space sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Concurrency Locking

a sub-section of the
System Lock Design section



Address : jragan.com/axledoc_1.htm#20.40.30
-- . --



Before addressing concurrency, it is important to observe a few very important facts in the AxleBase operation.
      Extremely large tables are involved and each may be distributed across a network.
      A database may be directly accessed by many remotely located systems.
      The system may be a distributed database manager whose components may simultaneously access tables at high speed.
      The entire system must run on desktop computers.

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. )

-- . --

End of the Concurrency Locking sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

AxleBase Lock Granularity

a sub-section of the
System Lock Design section



Address : jragan.com/axledoc_1.htm#20.40.40
-- . --



Level Description Lock Domain Control
1 db domain     D, P
2 database     D, P
3 table     A, P
4 segment     A
5 column     P
6 row     A, P
7 file     A
D     Discretionary.
P     Persisted.
A     Autonomic.

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.

-- . --

End of the Lock Granularity sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Lock Types

a sub-section of the
System Lock Design section



Address : jragan.com/axledoc_1.htm#20.40.50
-- . --



AxleBase CRUD Table
Code Description Domain Level
c create P 1,2,3
r read P 1,2,3
u update P 1,2,3
d delete P 1,2,3
e execute P 1,2
x exclusive D 1,2
i in use A  
z system A  
See previous table for lock domain codes.

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.

-- . --

End of the Lock Types sub-section.

End of the System Lock Design section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

Column-Data Types

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.50.00
-- . --

-- . --

End of the Column-Data Types section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

General

a sub-section of the
Column Data Types section



Address : jragan.com/axledoc_1.htm#20.50.05
-- . --



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.)

-- . --

End of the General sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

BLOBs

a sub-section of the
Column Data Types section



Address : jragan.com/axledoc_1.htm#20.50.10
-- . --



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.
        For example, the system builder's personal system handles his music collection in a BLOB table. Selecting the title of a song tells the system to load the player and tells the player to play that BLOB, or selection of the Beethovan composer tells it to play all of his work.

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.
        A row may have an empty BlobHandle.
        A row may have a null BlobHandle.
        BlobHandles must be delimited like string data.
        BLOB objects are validated. If not empty and not null,
            the BlobHandle must identify a valid BLOB object.
        Drops and deletes are designed to protect BLOB objects.
        BLOB objects are NOT destroyed by:
                Table drops.
                Database drops.
                Table truncations.
                Row deletes.
        Systems may use standard SQL queries of BLOB rows.

Advanced Topic :
      The BLOB column-datatype is the recommended manner of handling BLOBs. AxleBase also allows the "DBA" to design tables that allow the storage of BLOB objects within a table's column, which is discouraged.
      Remember that loss of a table that contains BlOB objects in a column will also lose the BLOBs, which is one of the reasons for recommending their remote storage.
      After investigating the many management and adminstrative problems with the BLOB data, if you are certain that you want to store BlOBs within a data table :
      "Create" a new table with a BLOB column.
      "Alter" the column so it does not use delimiters that may be found in the BLOBs.
      If needed, you can also "Alter" the rows so their terminators do not conflict with BLOBs.
      Fixed width rows are strongly recommended for speed, if possible.
      "Indexing" of at least one of the standard columns is recommended for speed. It might, for example, be the BLOB indentifier, such as a name.

Tests :
      Please note that the "tests document" carries stress tests using very large row queries, "Very Large Row Stress" using up to 10 megabytes per row.

Experience :
      The AxleBase builder's personal system uses AxleBase to store his data including two types of BLOBs; audio and visual. To use a BLOB, he selects the one that he wants from a drop-down list, which tells AxleBase to load its type of player, hands the BLOB data to the player, and activates the player. He can also select multiple BLOBs.
      That personal system has been in use for an indeterminate length of time that may go back two decades.

-- . --

End of the BLOB sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Boolean

a sub-section of the
Column Data Types section



Address : jragan.com/axledoc_1.htm#20.50.20
-- . --



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.

True False   note
yes no preferred
1 0  
true false  
t f  
on off limited usage

Name Max Size Return Size
BOOLEAN 0 1

-- . --

End of the Boolean sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Date

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.25
-- . --



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.)

Name Max Size Return Size
DATE 0 8

-- . --

End of the Date type sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Datetime

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.30
-- . --



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.)

Name Max Size Return Size
DateTime 0 16

-- . --

End of the Datetime sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Datetimex

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.35
-- . --



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.)

Name Max Size Return Size
DateTimex 0 21

-- . --

End of the Datetimex sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Integer

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.40
-- . --



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.)

Name Max Size Return Size
Numeric 0 20

-- . --

End of the Integer sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Numeric

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.41
-- . --



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.

max value 99, 999, 999, 999, 999, 999, 999
min value -9, 999, 999, 999, 999, 999, 999
precision .000,000,000,000,000,000,1

See also the "Integer" data type.

( Storage is in human readable form without tokenization in consonance with the AxleBase design objectives.)

Name Max Size Return Size
NUMERIC 0 20

-- . --

End of the Numeric sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Serial

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.45
-- . --



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 :
      Back up the database.
      Copy the table file to another location.
      Drop the table.
      Create the table with the serial column.
      Import data from the copy.
      Re-index.

Name Max Size Return Size
Serial 0 20

-- . --

End of the Serial sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

String

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.50
-- . --



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.

Name Max Size Return Size
String 2 gig defined

-- . --

End of the String sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Time

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.55
-- . --



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.)

Name Max Size Return Size
Time 0 8

-- . --

End of the Time sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Timestamp

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.57
-- . --



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.)

Name Max Size Return Size
TimeStamp 0 21

-- . --

End of the Timestamp sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Timex

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.60

-- . --



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.)

Name Max Size Return Size
Timex 0 13

-- . --

End of the Timex sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Mapping From Other Systems

a sub-section of the
Column-Data Types section



Address : jragan.com/axledoc_1.htm#20.50.90
-- . --



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.

Other System Type       AxleBase Type
alpha string
alphanumeric string
bfile blob
bigint numeric
bigserial numeric
binary blob
bit numeric
blob blob
boolean boolean or string
byte numeric
bytea blob
char string
clob blob
currency string
date string
dateTime string
decimal numeric
double numeric
double precision numeric
float numeric
geometry blob
geometrycollection blob
image blob
int numeric
integer numeric
line blob
linestring blob
long numeric
long (Oracle) blob
longblob blob
longraw blob
longtext blob
longvarchar blob
lseg blob
mediumblob blob
mediumint numeric
mediumtext string
memo string or blob
money string
multilinestring blob
multipoint blob
multipolygon blob
nChar blob
nclob blob
number numeric
nText blob
nVarChar blob
OLE object blob
point blob
polygon blob
raw blob
real numeric
serial numeric
short numeric
single numeric
smallDateTime string
smallint numeric
text string or blob
time string
timeStamp string
tinyblob blob
tinyInt numeric
tinytext string
varBinary blob
varChar string
varchar2 string

-- . --

End of Other System Data Types sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

AxleBase Error Protocol

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.60.00
-- . --

See also the following and the sub-sections following this section :
    "ClearLastError",
    "ShowErrorList",
    "ShowLastError"
    "Comm Hide Error AxleBase"
    "Comm Hide Error In Server"
    "Comm Hide Error Syslink"
    The Axsys super-system "Error Controller"

-- . --

End of the Error Protocol section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Introduction

a sub-section of the
AxleBase Error Protocol section



Address : jragan.com/axledoc_1.htm#20.60.10
-- . --



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 :
      The completion of some operations may be desired regardless of errors. For example, a database drop quickly reaches a point where a halt would leave a mess of errors. If errors occur after that point, the system will attempt to work through them. The return will include a list of all errors and the first error will be a "completed with reservations" error.

-- . --

End of the Error Introduction sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Sub-System Shortcomings

a sub-section of the
AxleBase Error Protocol section



Address : jragan.com/axledoc_1.htm#20.60.15
-- . --



Shortcoming 1. :
The unforseen and unexpected :
      As mentioned in the previous "Introduction" sub-section, AxleBase attempts to monitor the state of the entire environment as well as his own state. When any error hits, his error handling sub-system attempts to trap it, analyse it, and report it before any damage is done.
      However, the realistic fact is that the error domain is so large that some situations are beyond his control, and some unimagined events may slip past him. But a great effort has been expended in protecting data in storage and data in transit. Where the operators take advantage of the many AxleBase sub-systems, the builder expects extreme data integrity and protection.

Shortcoming 2. :
The overwhelming error cascade :
      When an error hits anywhere in the system, control is passed to the error handling sub-system. It stops operations, compiles an error report including error and situation characteristics, and the report begins bubbling up from the interior of the system.
      However, a subsquent error may then occur. If that happens, it will over-write the initial error.
      That behavior was detected early in AxleBase development. For example, opening a database is complex and a problem can generate a cascade of errors. In such situations, AxleBase sometimes attempts to build an error chain report. But such reports quickly become uselessly complex.

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".

-- . --

End of the Sub-System Shortcomings.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Error Message Format

a sub-section of the
AxleBase Error Protocol section



Address : jragan.com/axledoc_1.htm#20.60.20
-- . --



Format of error messages:
**ERROR: [ type ]: [ source ]: AxleBase: errID: text: [ addendum ]

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,

"**ERROR: "
, including the separator. No other type of AxleBase return will have that header. (A shortcoming of HTML is that it converts multiple spaces into a single space. There are two spaces in each of the seperators.)

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.

-- . --

End of the Error Message Format sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Show Exceptions

a sub-section of the
AxleBase Error Protocol section



Address : jragan.com/axledoc_1.htm#20.60.30
-- . --



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 :
ManagerObject.ShowErrorList errorNumber

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:
dim oMgr as Manager as
set oMgr = New Manager
sReturn = oMgr.ShowErrorList

sReturn will contain the entire list.

Example:
dim oMgr as Manager as
set oMgr = New Manager
sReturn = oMgr.ShowErrorList "E3025"

sReturn will contain "E3025: Column width exceeds 60,000."

The interface also provides a means of recalling the last error. See "ShowLastError"

-- . --

End of the Show Exceptions sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Standard Error List

a sub-section of the
AxleBase Error Protocol section



Address : jragan.com/axledoc_1.htm#20.60.40
-- . --



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 :

C0001: SAM is obsolete, which precludes the specified operation.
C0002: An invalid or unrecognized SAM was encountered. Expect a corrupted database.
C0003: An object is upgraded to the current SAM. Reload all systems immediately.
C0004: Database catalogue upgraded to current SAM. Recommend domain re-open.
C0005: Table catalogue upgraded to current SAM. Recommend database re-open.
C0006: Caution: One or more items were upgraded to the current SAM.
C0007: Reminder: The evaluation version is not intended for production.
C0008: Unlicensed system. Please request a valid AxleBase license.
C0009: License requirements are not met.
D0001: Under construction or consideration. Currently unavailable.
D0002: Query complexity level exceeded current development level.
D0003: Not supported at this time.
D0004: Test stopped at this point.
D0005: Processing aborted by operator or host. ' done by the abort utility.
D0006: Timeout. The requested timeout was exceeded.
D0007: Processed to completion with reservations.
D0008:
D0009: SysLink protocol error.
E1001: The command or parameter is invalid.
E1002: Node exclusion. ' not an error. just excluded from the job.
E1003: Authentication is invalid.
E1004: This AxleBase instance is already being used.
E1005: Un-indexed table scans are blocked. Contact your DBA for advice.
E1006: DDL is disabled by this database's DBA. Create, drop, alter, etc.
E1007: Requested object or value was not found.
E1008: Invalid object structure for specified operation.
E1009: Parameter length exceeds maximum allowed.
E2001: Row count update failed. Run purge with force to repair the table or segment.
E2002: Database is in an inconsistent state.
E2003: Database contains an item that cannot be removed.
E2004:
E2005: Database drop failed after partial processing. System may be inconsistent.
E2006: A database must first be opened.
E2007: Database cannot be opened because it belongs to a different domain.
E2008: Database creation failed for unknown causes.
E2009: Database has no table definitions.
E2010: Database contains no tables.
E2011: Database not found in catalogued location.
E2012: Database is not in the catalogue.
E2013: Domain database catalogue is empty.
E2014: Database specification is invalid.
E2015:
E2016: A domain must be opened first.
E2017: Domain specification is invalid.
E2018:
E2019: Domain location is invalid.
E2020: Database already exists in this domain.
E2021: Database is already open.
E2022: Database must be closed first.
E2023:
E2024:
E2025: System location contains unrecognized objects.
E2026: Path cannot be created.
E2027: Domain activation failed.
E2028: Domain drop failed after partial processing. System may be inconsistent.
E2050: Location is invalid.
E2051: That computer or its network is down or inaccessible.
E2052:
E2053: The location/path already exists.
E3001: Value is not numeric.
E3002: Value is illogical.
E3003: Parameter is invalid.
E3004: Database catalogue was not found and could not be initialized.
E3005: A database catalogue action was not recognized.
E3006:
E3007: Configuration file creation failed.
E3008: Parenthetical construct is invalid or unrecognized.
E3009: Multi-level parenthetical construct not yet available.
E3013: Data type is invalid.
E3014: Column name was not found where expected.
E3015: Column size is erroneous.
E3016:
E3017: Name contains a disallowed character.
E3018: Name length exceeds the maximum.
E3019: Names must start with an alpha character.
E3020: Name or value is a reserved word.
E3021: Column name is duplicated.
E3022: Database catalogue is corrupted.
E3023: Table catalogue is corrupt.
E3024:
E3025: Erroneous column type.
E3026: Column specification is erroneous.
E3027: Table row terminator is erroneous
E3028: Table is not in the database.
E3029: Table source type is invalid.
E3040: Table already exists.
E3041:
E3042: Import command is invalid.
E3043: Import source does not exist.
E3044: Import failed at row number -
E3045: Concurrent database connections have reached the currently set limit.
E4004: Requested column name index is below zero.
E4005: Requested column name index is greater than the number of elements.
E5001: Request does not match the specified data return protocol.
F0001: Unrecognized operation in file open.
F0002: File is not open.
F0003: Unable to open file.
F0004: Unrecognized file type.
F0005: Update failure.
F0006: Erroneous copy spec.
F0007: Location is invalid, unavailable, or can't be seen from here.
F0008: Object destruction failed.
F0009: Read past end of table.
F0010: File is already open.
F0011: Spinlock failure.
F0012: File is unavailable, invalid, or can't be seen from here.
F0013: Table seg is missing or unavailable.
F0014: Network or infrastructure failure. Database connection lost.
F0015: Data failover failed.
F0016: A data failover executed successfully. Please resend your request.
F0017: File is corrupt.
G0001: Log initialization failed.
G0002: Log use without initialization.
G0003: Logging must be turned on for the requested operation.
G0004: Buffer size exceeded by the operation.
K0001: Access denied.
K0002: Specified access denied to the specified object.
K0003: You have not been granted CREATE access to the specified object.
K0004: You have not been granted READ access to the specified object.
K0005: You have not been granted UPDATE access to the specified object.
K0006: You have not been granted DELETE access to the specified object.
K0007: You have not been granted EXECUTE access to the specified object.
K0008:
K0009:
K0010: Unrecognized security operation.
K0011:
K0012:
K0013:
K0014:
K0015: A conflicting, duplicated, or ambiguous grant exists.
L0001: Lock timeout encountered on the specified object.
L0002: Object is locked.
L0003: Lock failure. Object cannot now be locked.
L0004: Lock failure for specified row. Lock or unlock.
L0005: Lock code is invalid.
L0006: Lock is inappropriate for the operation.
L0007: Lock has expired.
L0008: Lock collision. ' object is locked.
M0001: Object exceeds the 2x(10^19) size limit.
M0002: SPT not found for seg number.
M0003: Segment specification is invalid.
M0004: SPT is corrupt.
M0005: SPT file is corrupt.
M0006: Object exceeds the 2.1 gig limit.
M0007: Seg name is invalid.
M0008: Seg size is too small for current operation.
M0009: Seg write map is invalid.
M0010: Seg location in SQL is not in a write map.
M0011: Stop encountered in the table write map.
M0012: Seg write map is exhausted.
S0001:
S0002: Backup failed.
S0003: Archive purge failed.
S0004: Archive contains an unrecognized or non-generational object.
S0201: The Vector object is not connected to a database.
S0202: Database is not open.
S0203: Object is not in the database.
S0204: Invalid object or variable specification.
S0205: A blank query was passed.
S0206: Ambiguous column qualifier or column name mismatch.
S0207: Column names not specified.
S0210: Table is undefined.
S0211: A table is not specified for column definitions.
S0302: Table is already keyed.
S0303: Index name is already used.
S0304: Unique index violation.
S0305: Table is not keyed.
S0306: Index storage location is invalid.
S0307: Table is corrupt. ' bad file, etc.
S0308:
S0309: Index structure failure.
S0310: Index requested for segments larger than 2.1 gig.
S0311: Purge table before indexing to remove deleted rows.
S0312: Index requested for invalid data type.
S0400: SQL statement is invalid, incomplete, or not recognized.
S0401:
S0402: SQL keyword not found where expected.
S0450: SQL function specification is invalid or unrecognized.
S0451: SQL function return request is illogical in current context.
S0501: SQL FROM clause was not found where expected.
S0502:
S0503: SQL FROM clause has an extraneous comma.
S0504: A column name may be needed. Use asterisk for count functions.
S0601:
S0602: SQL value is wider than the target column.
S0603: SQL statement is invalid in the INTO clause.
S0604:
S0605: SQL INSERT of null into a column defined as not nullable.
S0606: SQL INSERT value count does not match the column count.
S0607: SQL INSERT values were not found where expected.
S0608:
S0609: SQL INSERT attempted without an empty value and without a null.
S0610: SQL contains a non-numeric variable without delimitation.
S0701: SQL JOIN construction is invalid.
S0702: SQL table alias is invalid.
S0720:
S0721: SQL statement is incomplete or invalid near the ORDER keyword.
S0722: SQL ORDER BY clause specifies an invalid direction.
S0730: SQL statement table name was not found where expected.
S0731: SQL statement column identifier is invalid, unspecified, or unidentifiable.
S0732: SQL statement column names were not found where expected.
S0733: SQL statement specifies a blank column.
S0734: SQL statement has 'AND' or 'OR' where a column was expected.
S0735: SQL statement has 'AND' or 'OR' where a table name was expected.
S0736: SQL ROW limit clause is invalid.
S0737: SQL statement has unrecognized elements at the end.
S0738: SQL SEGMENT clause is invalid.
S0739: SQL ROW clause cannot be used with an indexed where clause.
S0740: SQL UPDATE column name is missing.
S0741: SQL UPDATE value is missing.
S0750:
S0751: SQL WHERE clause is incomplete.
S0754: SQL WHERE clause contains an unidentifiable variable.
S0755: SQL WHERE clause contains an invalid or unrecognized logic specification.
S0756: SQL WHERE clause is invalid.
S0757: SQL WHERE clause is invalid or unrecognized.
S0758: SQL contains an incorrectly constructed AxleBase function.
S0759: Host is expected to manipulate data after the return.
S0803: The table opener requires a file type specification.
S0804: Table was not found in the database.
S0805: Statement has an invalid logic connector.
S0806: SQL SELECT INTO cannot target an existing table.
S0807:
S0808: No database is defined by the loader.
S0809: A value cannot be typed as specified.
S0811: Data type is invalid.
S0812:
S0813:
S0814: Attempt to move beyond the beginning of the data set.
S0815: Attempt to move beyond the end of the data set.
S0816: The dataset is empty.
S0817: No current tuple pointer.
S0818: Tuple not found.
S0819: An unbalanced variable delimiter was encountered.
S0820: Invalid delimiter encountered.
S0821: Query timeout.
S0822: Job is incorrectly constructed.
S0840: Virtual table has no target name. ' alias
S0841: Virtual table has no location. ' alias
S0842: Virtual table file does not exist.
S0843: Virtual table cannot complete that operation.
S0844:
S0845: Virtual connection failure. 'these two are used differently
S0846: Virtual connection not available and FailOpen is true. 'those are used differently
S0847: Virtual makeString is invalid in the table attributes.
S0860: A shared table cannot be altered.
S0913: Invalid column encountered.
S0914: Invalid column count encountered.
S1103: Row update failed.
S1104: Serial columns cannot be updated.
S1105: Successfully reversed a failed update. Error(s) follow.
S1106: Failed to reverse a failed update. Check your data. Error(s) follow.
S1107: Failed transaction encountered! Exit the database and confer with your DBA.
U0001: An uncatalogued error was encountered.
U0002: There may be a problem with a computer.
U0003: The computer's dynamic memory has been exceeded.
U0004: The computer stack space has been exceeded.
U0005: The command failed.
U0006: The infrastructure has a problem. Hardware, operating system, etc.
U0007: Internal error.
U0008: Operation failure. ' for complex ops that return multiple errors or addenda.
U9999: DEV STOP. Administrative stop in the AxleBase lab.

-- . --

End of the Standard Error List sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

Security

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.70.00
-- . --

( Scroll down for security sub-sections.)

( Axiom : Any software-based security system can be defeated. )

-- . --

End of the Security section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Introduction

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.05
-- . --



AxleBase security is designed to be:
      Unobtrusive.
      Multi-level.
      Segmented.
      Very tight.

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.
      Domain
      Database
      Table
      Access to each level is controlled by the level above it.
      The domain is the database domain. Every AxleBase database is created inside a database domain and can be opened only through its domain. An installation may have any number of domains and each domain may contain any number of databases.

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.)

-- . --

End of the Security Introduction sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Additional Security

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.07
-- . --



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.
      This over-rides security permissions by setting a toggle to protect "VLT"s. When it is on, the data in the database cannot be updated by anybody. No other command or setting can over-ride this.

The "Deny DDL" configuration.
      See the above note.

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.
      Prevents malicious probes.

The "Log Toggle" configuration.
      Collects activity records on an entire database.

-- . --

End of the Additional Security sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Security Activation

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.10
-- . --



AxleBase installs with security turned off. When he creates a domain or database, the created object defaults to open to all access.

Toggle :
      The security toggle is the password for domains and databases.
          On : Assigning a password turns security on.
          Off : Removing all passwords turns it off.

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.

-- . --

End of the Security Activation sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Visibility Of Stops

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.15
-- . --



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.

-- . --

End of the Stop Visibility sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Canonical Permeability

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.20
-- . --



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.

-- . --

End of the Canonical Permeability sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

The Architecture's Impact

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.30
-- . --



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.
( Although attempts may be made to copy parts of it, it was developed exclusively 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.

-- . --

End of the Architecture's Impact sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Passwords

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.40
-- . --



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 :
      A master password is set or cleared with the AlterDomainAttribute and the AlterDatabaseAttribute commands. See the command in the API section for syntax and the appropriate section in the Permanent Configuration Of Objects section for discussion.

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 :
      Optionally, the password may be delimited by apostrophes. That permits the use of leading or trailing characters that might otherwise be confusing to the systems. Delimiters do not become part of the password. For example, AxleBase must strip leading and trailing blanks from all variables. If the password begins or ends with blank characters, then delimit it with apostrophes to protect those blanks.

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.

-- . --

End of the Passwords sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Granting Access

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.70
-- . --



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 :
      These are configurable permissions for every object, for every person :
      create
      read
      update
      delete
      execute

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 can allow passage without rights. If, for example, security is turned on in the domain and in all databases, then granting a user-domain access with no privileges will allow that person to pass through the domain to get to his database.

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 :
      A design objective of AxleBase is to return ownership to the rightful owner, so now that we have a strong and sophisticated security system in place, let's honor that objective. Many who need security do not need such a detailed system. Therefore, AxleBase provides a means of crud table simplification by allowing the keyword "all".

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.

-- . --

End of the Granting Access sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Step-By-Step Turn On

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.80
-- . --



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.
This will allow them into the domain so they can access their database, but they are granted no privileges at the domain level.

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.
Since the remainder of the security can become tedious because every object has its own set of options, the senior DBA may elect to allow the DBAs to administer database security.

4. Every employee is granted access to the appropriate database.
Like the domain level, this will allow them into the database, but they are granted no privileges at the database level.

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.
      If they are working through a sophisticated client-server app, then the app might shoulder part of that task.

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.

-- . --

End of the Turn On sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Virtual Private Network

a sub-section of the
Security section



Address : jragan.com/axledoc_1.htm#20.70.90
-- . --



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.
( See the "VPN" attribute in the Configuration chapter. )
Each AxleBase instance has a VPN toggle that controls its VPN.
( See the "AlterInstance" command in the API chapter. )
No other configurations are needed.
The VPN attribute is independent of other security settings.

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.

-- . --

End of the VPN sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

High Audit Requirements

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.80.00
-- . --

( 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.

-- . --

End of the Audit section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

General

a sub-section of the
High Audit Requirements section



Address : jragan.com/axledoc_1.htm#20.80.05
-- . --



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.

-- . --

End of the General High Audit sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Structural Support

a sub-section of the
High Audit Requirements section



Address : jragan.com/axledoc_1.htm#20.80.10
-- . --



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.

-- . --

End of the Structural Support sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Configurable Support

a sub-section of the
High Audit Requirements section



Address : jragan.com/axledoc_1.htm#20.80.20
-- . --



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 :
      It adds audit columns to every table that is created.
      The audit columns are required data.

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.

-- . --

End of the Configurable Support sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Specialized System Columns

a sub-section of the
High Audit Requirements section



Address : jragan.com/axledoc_1.htm#20.80.30
-- . --



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.

System Audit Columns
Name Type Size Ordinal
sys_zsmx_audit_loc string 50 1
sys_zsmx_audit_time datetimex 21 2
sys_zsmx_audit_user string 50 3

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.

-- . --

End of the Specialized System Columns sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Detrimental Factors

a sub-section of the
High Audit Requirements section



Address : jragan.com/axledoc_1.htm#20.80.40
-- . --



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.

-- . --

End of the Detrimental Factors sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

System Function Compendiums

a section of the
Embedding And Running AxleBase chapter



Address : jragan.com/axledoc_1.htm#20.36.00
-- . --

-- . --

End of the System Function Compendiums section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.






|-------------------|

System State Compendium

a sub-section of the
Summaries section



Address : jragan.com/axledoc_1.htm#20.36.01
-- . --



Following are links to some of the AxleBase tools for assessing the system's state.



Axsys State Assessment
The super-system can be configured by the DBA to monitor itself.

Audit Trail
When it is enabled, the built-in audit mechanism can record all operations. It is a one-way toggle. When turned on, it cannot be turned off.

ScanSegments
Designed to support always-available databases.
In use, it cycles unattended through a large table until told to stop. Can be set to autonomously recover lost data files.

ShowHealth
A detailed report that can be run for table or database.
Formatted for reading by people and by autonomic systems.

ShowTopology
Returns a report of the physical topology of tables.

Processing Errors
Guidance for the DBA.

DataFailover
A database attribute that can be set for a table.
Detection of a missing data file by a query instance
"Lock"s the table and initiates a persisted failover
to backup within the query instance.
Completion unlocks the table for continued service
allowing queued instances into the table.

DataFailoverByAll
A more sophisticated version of the above database attribute.

CognateFailTo
AxleBase offers the DBA the ability to configure an entire installation to assume autonomic maintenance of a running system with autonomic recovery of lost data objects if desired.

"Test"
When you must run a command or query, of which
you are afraid, in the production environment,
this lets you see if it can first be safely run
with the "Test" option.
Or you might elect to set your AxleBase "instance"
into the "TestMode".

-- . --

End of System State Compendium sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.






|-------------------|

Data Retrieval Tools Compendium

a sub-section of the
Summaries section



Address : jragan.com/axledoc_1.htm#20.36.02
-- . --



Following are links to some of the AxleBase tools for data retrieval.
Some reference more tools.
Some are apex tools that reference support tools.
Some allow you to expand the AxleBase system.
Some allow you to redefine the world of data.
Some are major AxleBase sub-systems.



AbortJob
AxleBase is built for very large data movement.
This command is designed to kill a "Vector"'s running job.

Appendix
A non-standard SQL clause that supports SQL query extensions.

ExecuteSql Select
The ExecuteSql command runs standard SQL queries and commands.

Import
The import command moves data into the database from an external source.

QueryId
A query handle created by all SQL queries.
A non-standard SQL clause in the query can replace it.
Allows an operator to work directly with extant datasets.

ReturnCache
A vector command that builds the specified number
of rows of a cached return in a dataset so that
a ReturnDataset command can retrieve the data

ReturnDataset
To retrieve the staged dataset, the client will send the Vector's ReturnDataset command. See previous.

ReturnDatastream
A vector command that retrieves cached free-form data,
such as is produced by "Encryption". See ReturnCache.

CacheReturn
A SQL clause addendum that caches its dataset.

CacheReturns
A persisted database configuration that caches all datasets.

ShowDatasetAttributes
Displays the attributes of a cached dataset including its ID.

ReturnProtocol
The 8 data return protocols available in AxleBase.

ReturnProtocol
Set the data return protocol for a database.
Supercedes query settings.
The various protocols are described.
These protocols also assist the DBA in designing for
communications between autonomic unattended systems.

ShowReturnProtocol
Reports protocol setting in the currently open database.
Data return protocols can be set in the domain, database, vector, AxleBase instance, and the SQL query.

SetVectorReturnProtocol
Set the return protocol of an extant Vector.

QueryReturns
It and its following sub-sections discuss management of very large data returns.

SuperSystem
Configuration of AxleBase for very large and very fast.

Cognate Clusters
Another Configuration for very large and very fast.
Administration may be simpler than the SuperSystem
and, maybe, greater potential power.

TimeoutTemp
AxleBase attempts protection of queries in hostile
environments; e.g., the TimeoutTemp.

"Test"
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 the "Test"
option.
Or you might elect to set your AxleBase "instance"
into the "TestMode".

-- . --

End of Data Retrieval Tools Compendium sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.






|-------------------|

Data Transfer Protection Technology

a sub-section of the
Summaries section



Address : jragan.com/axledoc_1.htm#20.36.03
-- . --



AxleBase is designed to assist with the managment of data retrieval within extremely adverse conditions such as:
      Communication link loss.
      Intermittent communication link quality.
      Extremely large datasets.
The technology does require some configuration and management.

Poor Communication Links:
      If an AxleBase server receives a query that is properly constructed for the problem, that is all that he needs. The client can break the communication link, give AxleBase time to complete the return, reconnect, and retrieve his dataset.

Extremely Large Datasets:
      If a data return will be larger than can be handled by the infrastructure, or so large that the duration of the return will expose it to a hostile environment, the client can code the query for the return to be controlled by the client. The client can then retrieve portions of the data by specifying the portion size each time until the entire dataset is returned.
      Many system configurations can be set by the DBA to control and protect the system such as the "Dataset Size Limit".

Uncommitted commands and queries:
      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 the "Test" option.
      Or you might elect to set your AxleBase "instance" into the "TestMode".

There are more features that are covered in the various instructions for each of the mechanisms used in the retrieval.

-- . --
Mechanisms Listed In Usage Sequence


1. Query Or Command:
ExecuteSql SELECT
      The AxleBase SQL query or command that looks like the ones that you submit to other database managers can be altered to tell AxleBase to prepare the data return for a controlled retrieval by the client, and then stop.

2. Container for instructions:
Appendix
      A SQL query to AxleBase can have an Appendix Command-Capsule that can contain special instructions to the server.

3. Controller:
CacheReturn
      When AxleBase finds a CacheReturn in an appendix, he executes the query, prepares a pending dataset, saves it, and resumes his other operations.

4. Data Preparation For Retrieval:
ReturnCache
      The staged data needs to be prepared for retrieval. The ReturnCache is a "Vector" command that copies the specified number of rows of a cached return into a dataset.

5. Retrieval:
ReturnDataset
      To retrieve the dataset, the client will send the Vector's ReturnDataset command.

Data Preparation For Retrieval:
ReturnDatastream
When the return protocol is changed to a non-standard type of return, the data is not staged in a dataset. It is saved in an unformatted string which includes all of that protocol's transmission controls.
Also, operations on data, such as "Encryption"), change it from formatted to freeform.
ReturnDatastream is a vector command that retrieves free-form data.

( 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.)

-- . --

End of Transfer Protection Technology sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.






|-------------------|

Security Tools Compendium

a sub-section of the
Summaries section



Address : jragan.com/axledoc_1.htm#20.36.04
-- . --



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.
      This over-rides security permissions by setting a toggle to protect "VLT"'s. When it is on, the data in the database cannot be updated by anybody. No other command or setting can over-ride this.

The "Deny DDL" configuration.
      See the above note.

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.
      Prevents malicious probes.

The "Log Toggle" configuration.
      Collects activity records on an entire database.

-- . --

End of Security Tools Compendium sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.






__________________________________________________
Chapter 4
A.P.I.
Lexicon And Syntax

__________________________________________________

Address : jragan.com/axledoc_1.htm#70.00.00
-- . --







_________________________

Functions and Operators

a section of the
API Lexicon And Syntax Reference chapter



Address : jragan.com/axledoc_1.htm#70.10.00
-- . --

-- . --

End of the Functions and Operators section header.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Limitations

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.01
-- . --



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.

-- . --

End of the Limitations sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Commenting SQL Code

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.03
-- . --



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 present, the comment must precede the SQL.
        Only one comment is allowed.
        (This may be expanded in the future to multiple comments.)
        It can be of any length and may be formatted.
        The first two characters must be "/*".
        The last two characters must be "*/".

( 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:
/* This is a comment in this query. */ select avg ( PERSON_AGE ) from T_PEOPLE

-- . --

End of the Commenting SQL Code sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Conditional Select Operators

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.05
-- . --



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
=
<
>
>=
<=
<>
like    Forces a table scan.
not like    Forces a table scan.
sounds like    Forces a table scan.
not sounds like    Forces a table scan.
in  
between  


AxleBase Accepts and Converts The Following
Non-standard Operator     Converts To
is like   like
is not like   not like
not is like   not like
! like   not like
is   =
is equal   =
eq   =
equal   =
equals   =
!>   <=
!<   >=
!   <>
!=   <>
not   <>
is not   <>
not is   <>
not equal   <>
not equals   <>
is not equal  <>
not is equal  <>
not eq   <>
is not eq   <>
not is eq   <>
!in   not in
!between  not between

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".
It must be "is null".

-- . --

End of the Conditional Select Operators sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Appendix Command Capsule

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.07
-- . --



Syntax:
/* comment */
SQL
[ ; APPENDIX ( [ clause1( parameters ) ; ] [ clause2( parameters) ; ] [ n... ] )

Where SQL is a valid command or SQL statement.

Purpose :
      APPENDIX is an encapsulator.
      It permits passing non-standard commands and parameters to the AxleBase SQL engine with a SQL query.
      It must be at the end of the command or SQL statement.
      It is a non-standard AxleBase extension that should be ignored by beginners. It is not ANSI-92 compliant, but assists with administration and usage of some of the advanced AxleBase technology.

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 :
      Double spaces are not recognized within appendix options. Where double spaces are required, the AlterAttribute command should be used.

Clauses :
      Single and multiple options are permitted.
      Clause sequence is arbitrary.
      Each clause must be terminated by a semi-colon.
      See option sub-sections in this document.

Usage :
      The documentation of commands and SQL statements that can use it explain the various optional clauses.

Node :
      If a node specification is present, then only the "Instances" that meet the spec will execute. :
      Note that this also excludes instances that are not part of the super-system in case they accidentally receive the command.

See also how to use "Data Transfer Protection" technology.

Appendix Clauses
Clause Used By
"ActivateObject" table, index create
CacheReturn query
ColumnSeparator table create
ColumnType table create
Comments all *
Description table create
Encrypt query
ForceType index create
Locate index create
NameAlias table create
Node all *
NullToken table create
QueryId query
"ReturnProtocol" query
Rollback index create
Row all *
RowTerminator table create
Segment all *
Shared table create
Test all *
WorkArea all *
_______________ ___________________
      * Any command or SQL that can use the appendix.
      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:
The following query assigns an identifier to itself, tells the server to cache the return, and specifies multiple nodes to service the query.
select * from t_log where owner = 'them' ;
APPENDIX( QUERYID(myquery ); CacheReturn(); NODE ( server6 , server29jparks, 15) ; )

Example identifies the dataset:
sReturn = oData.ShowDatasetAttributes

Example returns 1,000 of the deferred rows:
ReturnCache 1000 , myquery

Example:
select * from t_log where owner = 'them' ;
APPENDIX ( en Crypt ( mypersonalkey ) ; )

Example gets the Encrypted data stream:
returnDataStream

-- . --

End of the Appendix Command Capsule sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

CacheReturn

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.08
-- . --



Syntax:
SQL Statement
; "Appendix" ( [ CacheReturn() ; ] [ queryId( queryName ) ; ] )

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 :
      Control of very large data returns. If a very large data return is expected, this function will defer the return so that it can be retrieved in manageable portions with the "ReturnCache" command.

Purpose 2 :
      Hostile environment. In a hostile environment, such as a mobil client, this function can be used with every query to protect the return. If the communications link terminates after the query has started, no data will be lost because it will be cached until requested. If all clients are in a hostile environment, then the system can be configured to defer all returns.
      A cached return can be requested after a broken link with the ReturnCache command.

QueryName :
      Optional.
      The name is not needed for immediate returns.
      The query name serves as the handle for a cached return.
      Every query is named by the system, or may be specified.
      A new database connection requires a handle for a return.
      (See the QueryId sub-section for additional discussion.)

( 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.
Return on "Error" :   Error message.

Example:
select * from t_log row ( 14000000 , 1000000 ) ; appendix ( CacheReturn() ; )

This will return nothing because it terminates with a CacheReturn command. One million rows will be staged.

Example:
ReturnCache 100

This will return the first 100 of the million rows that were requested above.

Example:
ReturnCache 2000

This will return the next 2000 rows starting with row 101.

Example sets an ID for a deferred return:
select * from t_log where owner = 'them'
;APPENDIX ( QUERYID(myuniquequeryid ) ; CacheReturn() ; )

Example retrieves 100 rows of the specified return:
ReturnCache 100 , , myuniquequeryid

Example retrieves the entire specified return:
ReturnCache , , myuniquequeryid

-- . --

End of the CacheReturn sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateAdd

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.10
-- . --



Syntax:
DateAdd ( unitType , quantity , date )

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
"DateAdd"
"DateConvert"
"DateDiff"
"DateFromSerial"
"DateToSerial"

Return expected:   Date.
Return on error :   Error message.

Example:
sReturn = dateadd ( m , 2, 2005081218550400 )

sReturn will contain 2005081218580400.

-- . --

End of the DateAdd sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateConvert

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.15
-- . --



Syntax:
DateConvert ( variable to datatype )

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.)

Datatype Return Description
date YYYYMMDD date
datetime YYYYMMDDHHMMSSNN datetime
datetimex YYYYMMDDHHMMSSNNNNNNN datetimex
time HHMMSSNN time
timex HHMMSSNNNNNNN timex

The calling operation must be prepared for the return of an error message.

See also
"DateAdd"
"DateConvert"
"DateDiff"
"DateFromSerial"
"DateToSerial"

Example:
select * from T_LOG where log_date < '2005081218550400'

Example:
select * from T_LOG where log_date < dateconvert ( '01 JUN 98' to date )

Example:
select LOGGED_EVENT , dateConvert ( LOGGED_DATE to datetime ) from T_LOG

-- . --

End of the DateConvert sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateDiff

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.20
-- . --



Syntax:
DateDiff ( unitType , date1 , date2 )

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:
       century, centuries, c
      year, years, y
      month, months, m
      week, weeks, w *
      day, days, d
      hour, hours, h
      minute, minutes, n
      second, seconds, s

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,
      weeks are sometimes thought of as whole calendar units and sometimes as seven day units.
      Or consider the possibilities when a year is added to a date preceding a leap year.
      Or consider the effect of adding one month to 28, 29, 30, or 31 Jan.

Accuracy :
      AxleBase does not yet account for leap-seconds and leap-centuries.

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
"DateAdd"
"DateConvert"
"DateDiff"
"DateFromSerial"
"DateToSerial"

Return expected:   Numeric.
Return on error :   Error message.

Example:
sReturn = datediff ( m , 2004081218550400 , 200505121855042354352 )

sReturn will contain 9.

-- . --

End of the DateDiff sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateFromSerial

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.22
-- . --



Syntax:
DateFromSerial ( number )

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
"DateAdd"
"DateConvert"
"DateDiff"
"DateFromSerial"
"DateToSerial"

Example:
The following will insert 7 September 2007.
sReturn = oData. ExecuteSQL ( "insert into T_citizen values ( '' , '' , dateFromSerial(732941) , '' )

sReturn allows error returns.

-- . --

End of the DateFromSerial sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateNow

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.25
-- . --



Syntax:
DateNow ( [ optionalType ] )

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.
Return on error :   Error message.

Example:
sReturn = dateNow

sReturn will contain 20050506.

Example:
sReturn = dateNow ( datetime )

sReturn will contain 2005050619072300.

Example:
sReturn = oData. ExecuteSQL ( "insert into T_LOG values ( dateNow ( datetimex ), '', '', '')

sReturn allows error returns.

-- . --

End of the DateNow sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

DateToSerial

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.30
-- . --



Syntax:
DateToSerial ( date )

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 :
      AxleBase does not yet account for leap-seconds and leap-centuries.

If a datum is encountered in the job stream that cannot be coerced to a valid datatype, AxleBase returns an "Error".

See also
"DateAdd"
"DateConvert"
"DateDiff"
"DateFromSerial"
"DateToSerial"

(The host is expected to be able to perform its own calculations, so functions are not acceptable in the SQL column return clause.)

Example :
      If today is 7 September 2007, then the following will insert a row containing only the citizen_id field with a value of 732941.
sReturn = oData. ExecuteSQL ( " insert into t_citizen (citizen_id) values( datetoserial ( datenow ( date ) ) ) " )

That is the same as the following.
sReturn = oData. ExecuteSQL ( " insert into t_citizen (citizen_id) values( datetoserial ( '20070907' ) ) " )

Example uses sReturn to catch error returns.

-- . --

End of the DateToSerial sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Delimiter Escape

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.32
-- . --



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 :
      Select * from t_citizen where upater = 'kate/'s'

Example where the value contains two of the delimiters :
      Select * from t_citizen where upater = 'kate/'/'s'

-- . --

End of the Delimiter Escape sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

In

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.38
-- . --



Syntax:
[ NOT ] IN ( value1 [ , value2 [,...n] ] )

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 :
      When selecting from a very "Large" table, remember that the list must be evaluated every time that a row is red. Speed can sometimes be increased by placing the value with the greatest probability of being found at the beginning of the list.

Hint :
      If the system will use an index in the search, and the probability of a match is approximately the same for all values in the list, then speed can sometimes be increased by placing the values in sorted order.

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:
select * from t_log where owner IN ( 'kate' , 'ruth', 'naomie' )

This will return any row where the owner value is kate, ruth, or naomie.

Example:
select * from t_log where owner NOT IN ( 'kate' , 'ruth', 'naomie' )

This will return any row that is not kate, ruth, and naomie. It will return sarah, julie, and dana.

-- . --

End of the In sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

IsDate

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.40
-- . --



Syntax:
isDate ( value )

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.
sReturn = IsTime ( 2007131803152600 )

This example returns no.
sReturn = IsTime ( 2007137803152600 )

-- . --

End of the IsDate sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

IsTime

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.42
-- . --



Syntax:
isTime ( value )

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.
sReturn = IsTime ( 03152600 )

-- . --

End of the IsTime section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Math Operators

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.50
-- . --



( Under consideration and not available. )

Math operators are:
+ Add
- Subtract
/ Divide
* Multiply
^ Raise

Math operators are supported only in the select and where clauses. Hosts are expected to be capable of manipulating returns.

-- . --

End of the Math Operators sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

QueryId

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.53
-- . --



Syntax:
SQL
; "Appendix" ( queryId ( identification string ) ; )

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 :
      Apostrophe delimiters are optional.

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 :
      Min.: Eight characters.
      Max.: Will be truncated to the leftmost twenty characters.
      Characters: Only letters and/or digits.

Suggestions :
      The identification can be re-used after the retrieval.
      If the string is generated by the user, the user identifier usually may suffice.
      If the string is generated by the client software, the concatenated workstation and user identifiers usually may suffice.

Life Span :
      A name identifying a dataset will remain valid until:
          A cached return is retrieved.
          Or until the database timeout setting.
      After the timeout, the dataset is subject to purging.

Caution : :
      As in all "Security" matters, a pending named query return can be a security risk until the data is retrieved if the name is not protected by the user.

See also the Data Retrieval Tools compendium.

Example:
select * from t_log ; appendix ( CacheReturn() ; queryid ( mynewquery ) ; )

This will return nothing because it terminates with a CacheReturn. Billions of rows might be staged.

-- . --

End of the QueryId sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

ReturnProtocol

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.54
-- . --



Syntax:
SQL
; "Appendix" ( ReturnProtocol ( protocol name ) ; )

This option will cause a query's data return to be formatted with the specified protocol.

Available protocols :
      html
      htmlpage
      soap
      standard
      text
      textseparated
      xml

The DBA can set the data return protocol in the
      domain or
      database.
Operators can specify protocols in their local
      "Vector",
      AxleBase instance,
      or SQL queries.

See also the Data Retrieval Tools compendium.

Example:
select * from t_log ; appendix ( ReturnProtocol ( htmlpage ) ; )

This will return the data in an html page, perhaps to serve an autonomic interactive web site.

-- . --

End of the ReturnProtocol sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Row Clause In SQL

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.55
-- . --
^



Syntax:
row ( tableName, firstRow , returnRows )



This advanced technology has been temporarily

moved off line during the documentation editing.



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 :
      - Accessing a fixed width row is usually very fast.
      - In most cases, expect to access target table rows
      within a table of billions, and possibly trillions,
      within seconds. If returning data, expect the
      hardware read to take longer than the access.
      - Use with segment clause to increase speed.
      - Variable width tables are slower then fixed width tables.
      - This tool cannot overcome relativistic-distance data
      dispersal problems,
      - but there are other AxleBase mechanisms such as his
      cognate clusters that may alleviate relativity problems.

-- . --

End of the ROW Clause sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Segment Clause In SQL

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.57
^



This advanced technology has been temporarily

moved off line during the documentation editing.



-- . --

End of the Segment Clause sub-section.

Click here to go to the document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

SQL Summary Functions

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.60
-- . --


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.

Function Return
count( ) row count
sum( ) column summation
avg( ) column average
min( ) minimum value
max( ) maximum value
std( ) standard deviation

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.
      A string type will be treated as such, but if a numeric operation is specified for string column, he will attempt the numeric operation on rows that contain numeric characters. (The builder remembers intending that functionality, but does not remember doing it.)

Column Specification :
      The column must be specified.
      Only the count() will accept an asterisk specification.
      An asterisk will include all undeleted rows.
      A column name excludes rows with null values in that column.

Standard Deviation :
      The standard deviation is slow. It is the only function that makes multiple reads. It performs multiple calculations for each column and it must make two scans through the entire table.

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:
sReturn = oData. ExecuteSQL ( "select sum ( PERSON_AGE ) from T_PEOPLE" )

Example:
sReturn = oData. ExecuteSQL ( "select avg ( PERSON_AGE ), min ( PERSON_AGE ), sum ( income ) from T_PEOPLE" )

Example:
sReturn = oData.ExecuteSql ( "select count ( * ) from t_statistic" )

-- . --

End of the SQL Summary sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

String Function

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.65
-- . --



Syntax:
string ( [ start , length , ] value [ & value [ & n.... ] ] )

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:
      Converts to a string datatype.
      Concatenates.
      Extracts a sub-string.

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:
sReturn = oData. ExecuteSQL ( "insert into t_log (log_msg) values(string(15, 6, datenow('datetimex') & 'test' & 2594 ) )" )

-- . --

End of the String Function sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Sys_Archive

For "OLTP" and "OLAP" Tables
a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.67
-- . --



( 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:
sReturn = oData. ExecuteSQL ( "select * from t_log where sys_archive > '1998'" )

-- . --

End of the Sys_Archive sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Test

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.68
-- . --



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 :
          syntax
          security
          object existence
          location existence
          itself

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:
select * from t_log ; appendix ( queryid ( mynewquery ) ; test( yes) ; )

This will return nothing because it is a test.

-- . --

End of the Test function sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Wildcard Characters

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.70
-- . --



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 :
      AxleBase permits changing the wildcard characters in each domain, but that is discouraged because there are so many factors that the "DBA" must consider before changing them. See the Configuration chapter, Wildcard sub-sections.

Example:
like '*r*' will return mary, morrie, marie, fred

Example:
like 'm?r*' will return mary, morrie, marie

-- . --

End of the Wildcard Characters sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

Work Area SQL Extension

a sub-section of the
Functions and Operators section



Address : jragan.com/axledoc_1.htm#70.10.75
-- . --



Syntax:
SQL query
; "Appendix" ( workArea ( path ) ; )

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 :
      It must be on a disk not used by the database tempDb.
      Should be on a physically separate disk ; not a virtual disk.
      It must exist. The query will not create a location.
      The AxleBase "Instance" must have security clearance to it.
      If a server runs the query, the server will use the work area.
      Ideally, it will be a small disk on the same computer.

See also: tempDb, and the Data Retrieval Tools compendium.

Example:
select * from t_log ; appendix ( workarea ( g:\dbwork\ ) ; )

-- . --

End of the Work Area sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

The Interface Overview

a section of the
API Lexicon And Syntax Reference chapter



Address : jragan.com/axledoc_1.htm#70.30.00
-- . --



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 :
      Standard.
      Unicom.
      Unistring.
      "SysLink".
All do the same job, but are very different in usage.

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 :
      Standard.
      Unicom.
      Unistring.
      Syslink.

The three interface objects are :
      Manager
      Vector
      AbstractInterface

The interfaces with their objects are :
      Standard.
            Manager and Vector objects.
      Unicom.
            AbstractInterface object.
      Unistring.
            AbstractInterface object.
      Syslink.
            AbstractInterface object.
The commands are passed directly into those objects.

( See the "SysLink" sub-section for an embarrassing and accidental year-long test of the interface abstractions.)

-- . --

End of the Interface Overview section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





_________________________

The AbstractInterface Object

a section of the
The Interface Overview section



Address : jragan.com/axledoc_1.htm#70.35.00
-- . --



-- . --

End of the AbstractInterface Header section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

General Description

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.10
-- . --



The interface hierarchy from the top down is :
      "SysLink" Interface
      UniString Interface
      UniCom Interface
      Standard Interface
The top three are each an abstraction of the level below it.

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.

-- . --

End of the Description sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

UniCom Interface

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.30
-- . --



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
      a single function
      with a variable number of parameters.

Object Instantiation :
      Instantiate only the AbstractInterface object.
      Do not instantiate a "Manager" or "Vector" object.
      (AxleBase will instantiate them for you as needed.)
      AbstractInterface will create any objects that it needs.

UniCom Syntax :
oObject.UniCom   standardCommand ( [, parm1 [, parm2 [, parm3 [, parm4 [, parm5 [, parm6 [, parm7 [, parm8 [, parm9 [, parm10 ]]]]]]]]]] )

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 :
      The first parameter is the name of the standard command.
      AbstractInterface will route the action to that command.

Parameters :
      All parameters after the standard command are optional.
      They are all by reference.
      They map to the parameters in the standard commands.
      If a parameter is used, all preceding parameters must be used.
      Pass the parameters that the standard command needs.
      If the standard command requires none, then pass none.

Parameter Data Types :
      All parameters are passed as strings.
      AbstractInterface retypes them as needed.
      Each must be correctly convertable.

Returns :
      UniCom is a function.
      It returns whatever is expected of the standard functions.
      Its parameters can return by reference.
      They return whatever is expected of the standard functions.

"Error"s :
      The AxleBase error protocol bubbles up through all layers.

Speed Comparison To Standard Interface :
      It varies by operation.
      The average seems to take about two percent longer.
      A one second standard run will be about 1.02 second here.
      May be noticeable in loops.

Example:
sReturn = oObject.UniCom ( " "AbortJob"" )

UniCom will route that to the Manager's AbortJob command.

Example:
sReturn = oObject.UniCom (" ExecuteSQL", "SELECT * FROM LOG ")

UniCom will route that to the Vector's ExecuteSql command.
Example uses sReturn to catch error returns.

Example:
sReturn = oObject.UniCom ( "crypt", "e", "n", , "thisismy1Favoritekey", "This is a test." )

UniCom will route that to the Manager's "Encrypt" command.
The return will contain the encrypted text.

-- . --

End of the UniCom Interface sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

UniString Interface

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.40
-- . --



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
      a single function
      with a single parameter.

Object Instantiation :
      Instantiate only the AbstractInterface object.
      Do not instantiate a "Manager" or "Vector" object.
      (AxleBase will instantiate them for you as needed.)
      Send all commands through the UniString command.
      AbstractInterface will create the other objects that it needs.

Syntax:
oObject.UniString   CommandAndParameterString

The UniString function becomes the entry point for all commands to AxleBase. The standard commands and functions may be entered through it.

CommandAndParameterString :
      It consists of the standard command with its parameters.
      First in the string is the name of the standard command.
      AbstractInterface will route the action to that command.

Returns :
      UniString is a function.
      It returns whatever is expected of the standard functions.

Parameters :
      As a string, its parameters become by value.
      Parameters cannot return by reference.

Data Types :
      The interface converts the string to required data types.
      Conversion must obtain the correct type.

"Error"s :
      The AxleBase error protocol bubbles up through all layers.

Speed Comparison To Standard Interface :
      It varies by operation.
      The average seems to take about three percent longer.
      A one second standard run will be about 1.03 second here.
      May be noticeable in loops.

Internal Separators :
      *^*
      Comma separators in the string could be confused with commas that are needed within standard parameters.
      Use the three character string *^* as the separator.
      Do not prefix or suffix the string with the separator.

Example:
sReturn = oObject.UniString ( " "AbortJob"" )

UniString will route it to the Manager's AbortJob command.

Example:
sReturn = oObject.UniString ("ExecuteSql*^* SELECT * FROM LOG ")

UniString will route it to the Vector's ExecuteSql command.
Example uses sReturn to catch error returns.

Example:
sReturn = oObject.UniString ( "backup*^* database*^* demo*^* c:\backup\*^**^**^**^* node( cell23" )

UniString will route it to the Manager's Backup command.

Example:
sReturn = oObject.UniCom ( "crypt*^* e*^* n*^**^* thisismy1Favoritekey*^* This is a test." )

UniString will route it to the Manager's "Encrypt" function.
The return will contain the encrypted text.

-- . --

End of the UniString Interface sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

SysLink Interface

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.50
-- . --



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.
      It can also be used for testing the local host's use of the SysLink protocol. See the AxHandle app for an example of this use. But this use is not necessarilly recommended because it requires the construction of complex logic threads.

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 :
      AxleBase contains a full-function SysLink object, that meets all requirements of the syslink communication protocol.

Syntax:
oObject.SysLink inboundMsg, response, responseType, hostReturnType, returnToHost

Where inboundMsg is a syslink envelope containing a message.
Last four variables are empty for returns by reference.

Entry Point :
      The SysLink object becomes the entry point for all functions and commands to AxleBase.

Format :
      The content of the envelope must be formatted for the UniString function.

Benefits :
      Handles entire communication streams.
      Administers comm sessions.
      Allows a VPN interface.
      Increases "Security".
      Relieves the host of SysLink protocol processing.
      Evaluates inbound communication responses.
      Formulates most outbound responses.
      Simplifies the host software.

InboundMsg :
      Must be a SysLink envelope.
      The host server will pass transmissions straight through to its AxleBase instance with no processing. This function will handle all processing, including communication security, "Error" handling, "Encryption"), "Decryption"), etc., and the host will handle the higher level communication needs.

Messages :
      Must be constructed according to the SysLink protocol.
      The AxleBase internal SysLink function will parse, validate, and route the envelope contents.
      It passes AxleBase commands to the UniString function.

AxleBase Command Format :
      Format AxleBase commands for the UniString function.
      ( See previous discussions of UniString and UniCom. )

Errors :
      Errors may be SysLink, local system, or SQL.
      Database configuration controls the return of errors.
      The syslink protocol also has its own error protocol, to which the AxleBase SysLink object conforms.

Speed :
      This is the slowest of all the interfaces because it must instantiate and use "Socket" communication objects. It may be undetectable in most operations, but may take ten to twenty percent longer in some.

Returns :
      This function has five returns.
      1. Function
      2. Response
      3. ResponseType
      4. ReturnToHostType
      5. ReturnToHost

Return 1 :
      Function
      This is the standard function return. The host should monitor it for errors.

Return 2 :
      Response
      This return is By Reference.
      A non-blank return is a response to the remote system.
      It will be a SysLink envelope.
      The host is expected to transmit it.

Return 3 :
      ResponseType
      This return is By Reference.
      A copy of the SysLink CCS that was sent in the response.

Return 4 :
      ReturnToHostType
      This return is By Reference.
      AxleBase will return even when he handles everything.
      The value is usually the inbound SysLink CSS.
      The host must evaluate it for action requirement.
      If the value is a ShutDown directive to the host, then AxleBase prepared himself before returning it, so the host can immediately end operations.

Return 5 :
      ReturnToHost
      This return is By Reference.
      It is any value or data in which the host may be interested.
      This is any value that the return type requires.
      AxleBase terminates the thread after returning.

Security Deviations :
      For security, AxleBase will not honor or respond to the following :
          Transmission size limits.
          Re-send a transmission.
          Identification requests.
          A client error message.
          Encryption commands.
          Authentication commands.
      This failure to respond complies with the SysLink protocol.
      These matters are controlled by the local DBA.
      ( An Encryption request in a query may be honored.)
      The execution thread allows the host to deviate from the AxleBase design, but that is strongly recommended against.

Example:
sReturn = oObject.Syslink ( inboundEnvelope, responseVar, responseTypeVar, retTypeVar, retVar )

Testing :
      Thanks to God for giving the AxleBase builder a poor memory. The SysLink interface was permanently selected in the AxHandle test system, and forgotten.
      It was noticed a year later after thousands of tests including many runs of the AxHandle test suite. It was noticed only because high speed multi-day tests were running a bit slower than expected for the standard interface.
      The AxleBase builder was amazed that the processing load had not crashed the various systems involved during that year.

-- . --

End of the SysLink Interface sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

SysLinkMsgMake

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.55
-- . --



Syntax:
oManagerObject.SysLinkMsgMake syslinkString, payload, envelope [, responseToId ]

Purpose :
      This command is provided as a service to allow simplification of the host software for client-server communication because the SysLink envelope can be a daunting programming task. It is not a standard database manager function. A command and parameters can be passed to this command, and it will return them in a valid SysLink envelope.

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 :
      Required.
      This is one of the SysLink protocol's command strings.
      Do not append a right pointer (>).

Payload :
      Some exchanges require that this be blank.
      This may be a target app, command, and parameters.

AxleBase Command Payloads :
      Format an AxleBase command for the UniString function.
      Remember that you are using multiple layers and protocols.
      Example: AxleBase|UniString|ExecuteSql*^*drop table*^*temp|
      That satisfies SysLink, UniString, UniCom, and ExecuteSql.

Envelope :
      This is the expected return.
      It is returned by reference.
      It is the entire SysLink envelope.

ResponseToId :
      Optional.
      The identifier of a message to which this is a response.

Return expected:   Nothing.
Return on "Error" :   Error message.

Example:
sReturn = oMgr.MessagePrep ( "** execute local app command**", "AxleBase|UniString|ExecuteSql*^*select * from t_log", envelopeReturn )

Example uses sReturn to catch error returns.

Example:
sReturn = oMgr.SysLinkMsgMake ( "**break our comm connections**", "", envelopeReturn )

Example uses sReturn to catch the error returns.

-- . --

End of the SysLinkMsgMake sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|

SyslinkMsgSplit

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.60
-- . --



Syntax:
oManagerObject.SyslinkMsgSplit syslinkString, commandReturn, payload

Purpose :
      This function is provided as a service to allow simplification of the host software for client-server communication because the SysLink envelope can be a daunting programming task. It is not a standard database manager function.

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 :
      This is the entire inbound communication transmission.

commandReturn :
      This variable is a return by reference.
      It is the SysLink command that prefixes the payload.
      It is the SysLink CCS, command and control string.
      Example : "** open new syslink session **"

Payload :
      This variable is a return by reference.
      It is the enclosed payload.
      It may be blank or empty.
      The command and enclosing characters are removed.

Return expected:   Nothing.
Return on error :   Error message.

Example:
sReturn = oMgr.SyslinkMsgSplit ( syslinkString, commandReturn, payloadReturn )

Example uses sReturn to catch error returns.

-- . --

End of the SyslinkMsgSplit sub-section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





|-------------------|
SyslinkSession

a sub-section of the
AbstractInterface Object section



Address : jragan.com/axledoc_1.htm#70.35.62
-- . --



Syntax:
oManagerObject.SyslinkSession action, requestorId, sessionId, datetime

Purpose :
      Testing.
      This allows simplification of the host software.
      This is not a standard database manager function.

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 :
      Required.
      Must be "open", "close", "change", or "status".
      Other than action, the parameters are by reference, so the status action will return the current parameters.

requestorId :
      Required to open a session to maintain communication security features.

SessionId :
      Not required to open a session.
      If not passed, a value is returned by reference.

DateTime :
      Not required to open a session.
      It is returned by reference in the variable

Return expected:   Nothing.
Return on "Error" :   Error message.

Example:
sReturn = oMgr.SyslinkSession ( "status", var1, var2, var3 )

Example uses sReturn to catch the error returns.

-- . --

End of the SyslinkSession section.

Click to return to document contents.

Or press {Alt Left Arrow} to return to previous text.





__________________________________________________
End Of page 1 Of The Operation Manual.
Click HERE to load page 2,
or HERE to load page 3.
or   HERE   to load the
manual's Table Of Contents.

or {Alt Left Arrow} to return to prior location.
__________________________________________________
Address : jragan.com/axledoc_1.htm#01.02.00
-- . --





                                             




AxleBase Technology And Documentation
Copyright 2003 - 2023 John E. Ragan.

Web site is maintained with Notepad.
By intent, so don't bother me about it.