/[dtapublic]/to_be_filed/webprojs/fboprime/docs/manual/manual.tex
ViewVC logotype

Contents of /to_be_filed/webprojs/fboprime/docs/manual/manual.tex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations) (download) (as text)
Sat Oct 8 18:44:20 2016 UTC (7 years, 7 months ago) by dashley
File MIME type: application/x-tex
File size: 105410 byte(s)
Initial commit.
1 %$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/webprojs/fboprime/docs/manual/manual.tex,v 1.36 2006/04/10 04:28:07 dashley Exp $
2 %-----------------------------------------------------------------------------------
3 %Notational conventions:
4 % o Software product names are placed in italics (\emph{}), both in
5 % the text and in the index.
6 % o Unix commands are placed in italics (\emph{}).
7 % o Database table names are shown in italics (\emph{}), both in the text and
8 % in the index.
9 % o Database table field names are shown in italics (\emph{}).
10 % o Include file names are shown in Courier-like text (\texttt{}).
11 % o Standalone script names are shown in Courier-like text (\texttt{}).
12 %-----------------------------------------------------------------------------------
13 \documentclass[letterpaper,10pt,titlepage]{article}
14 %
15 %\pagestyle{headings}
16 %
17 \usepackage{amsmath}
18 \usepackage{amsfonts}
19 \usepackage{amssymb}
20 \usepackage[ansinew]{inputenc}
21 \usepackage[OT1]{fontenc}
22 \usepackage{graphicx}
23 \usepackage{makeidx}
24 %
25 %
26 %Define certain conspicuous global constants.
27 \newcommand{\productbasename}{FBO-Prime}
28 \newcommand{\productversion}{0.1}
29 \newcommand{\productname}{\productbasename{}-\productversion}
30 %
31 %New environments
32 %The following environment is for the glossary of terms at the end.
33 \newenvironment{docglossaryenum}{\begin{list}
34 {}{\setlength{\labelwidth}{0mm}
35 \setlength{\leftmargin}{4mm}
36 \setlength{\itemindent}{-4mm}
37 \setlength{\parsep}{0.85mm}}}
38 {\end{list}}
39 %%
40 %The following environment is for the database table and field
41 %documentation at the end.
42 \newenvironment{docdbtblfielddef}{\begin{list}
43 {}{\setlength{\labelwidth}{0mm}
44 \setlength{\leftmargin}{10mm}
45 \setlength{\itemindent}{-5mm}
46 \setlength{\parsep}{0.85mm}}}
47 {\end{list}}
48 %%
49
50 %Embarrassingly, I've forgotten why "makeindex" is necessary ...
51 \makeindex
52 %
53 \begin{document}
54 %-----------------------------------------------------------------------------------
55 %"See" References
56 %-----------------------------------------------------------------------------------
57 %%%%% M %%%%%
58 \index{Dawn Masternak|see{Masternak, Dawn}}
59 \index{Eric Metzger|see{Metzger, Eric}}
60 \index{Sunhee Metzger|see{Metzger, Sunhee}}
61 %%%%% W %%%%%
62 \index{Theresa Whiting|see{Whiting, Theresa}}
63 \index{Dan Wynja|see{Wynja, Dan}}
64 %-----------------------------------------------------------------------------------
65 \title{\emph{\productname{}} Installation, Maintenance, and User Manual}
66 \author{\vspace{1cm}\\David T. Ashley\\\texttt{dta@e3ft.com}\\\vspace{1cm}}
67 \date{\vspace*{8mm}\small{Version Control $ $Revision: 1.36 $ $ \\
68 Version Control $ $Date: 2006/04/10 04:28:07 $ $ (UTC) \\
69 $ $RCSfile: manual.tex,v $ $ \\
70 \LaTeX{} Compilation Date: \today{}}}
71 \maketitle
72
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
74 %Abstract confirmed OK, DTA, 20060304.
75 %
76 \begin{abstract}
77 This document describes in detail
78 the \emph{\productbasename{}} web-based
79 FBO support software, version \productversion{}\@. The
80 document provides substantial technical detail and is suitable
81 for server administrators, webmasters, and users.
82
83 At present, \emph{\productbasename{}}
84 software provides only web-based resource
85 scheduling (for aircaft, simulators,
86 and flight instructors)\@. However, in the future, it may be enhanced
87 to provide additional functionality for FBOs or
88 to provide support for the aviation community that almost
89 always surrounds an FBO (such as by providing support for various
90 types of aviation associations).
91
92 The software is designed to run satisfactorily in the environment
93 available through most web hosting companies on a shared
94 Linux server.
95
96 A single instance of the software has the capability to support only one FBO
97 (and it uses only one \emph{MySQL} database)\@. However, an arbitrary number of
98 instances of the software may be installed on a single server, supporting an
99 arbitrary number of FBOs (with each instance using one \emph{MySQL} database).
100
101 The software is offered under the GPL, and is free
102 both monetarily and in an intellectual property sense.
103 \end{abstract}
104
105 \clearpage{}
106 \pagenumbering{roman} %No page number on table of contents.
107 \tableofcontents{}
108 \clearpage{}
109 \listoffigures
110 \clearpage{}
111
112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113 %Force the page number to 1. We don't want to number the table of contents
114 %page.
115 %
116 \setcounter{page}{1}
117 \pagenumbering{arabic}
118 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
119
120 \section{Introduction, Overview, and Miscellany}
121 \label{siov0}
122
123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
124
125 \subsection{Acknowledgements}
126 \label{siov0:sack0}
127
128 I am very grateful to all of the following individuals and institutions:
129
130 \begin{itemize}
131 \item The original authors of
132 \index{ORS@\emph{ORS}}\emph{ORS} \cite{bibref:p:ors},
133 who answered all questions by e-mail and were very supportive in
134 this endeavor. Additionally, the designs of the
135 \emph{\productbasename{}} web pages are heavily borrowed from
136 \emph{ORS}\@. The authors of \emph{ORS} saved me \emph{much} design time in
137 figuring out how to achieve the desired effects with HTML.
138 \item \index{Masternak, Dawn}Dawn
139 Masternak \cite{bibref:i:masternakdawn} for original ideas about
140 reimplementing the website.
141 \item \index{Whiting, Theresa}Theresa Whiting \cite{bibref:i:whitingtheresa}
142 and
143 \index{Wynja, Daniel}Dan Wynja \cite{bibref:i:wynjadaniel}
144 for numerous technical, functionality, and usability
145 observations and suggestions.
146 \item \index{Metzger, Eric}Eric and
147 \index{Metzger, Sunhee} Sunhee Metzger \cite{bibref:i:metzgereric}
148 for allowing me to use the Marshall FBO as a testbed for
149 this software.
150 \item \index{Rostamian, Rouben}Rouben Rostamian \cite{bibref:i:rostamianrouben} for assistance with
151 the simple expression for scheduling interval overlap
152 (see Eq. \ref{eq:stbg0:sdov0:01}, p. \pageref{eq:stbg0:sdov0:01}).
153 \end{itemize}
154
155 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
156
157 \subsection{History}
158 \label{siov0:shis0}
159
160 In 2005, the \index{Marshall Aviation Center}Marshall Aviation Center
161 (hereinafter referred to as \index{MAC}\emph{MAC}) was succeeded by
162 \index{Metzger's Aircraft Services}Metzger's Aircraft Services (hereinafter
163 referred to as \index{MAS}\emph{MAS}) as the FBO at the Marshall,
164 Michigan, USA airport.
165
166 The web hosting and database development for MAC had been handled by
167 \index{Kalamazoo Software}Kalamazoo Software \cite{bibref:com:kalsoft}\@.
168 \index{Masternak, Dawn}Dawn Masternak \cite{bibref:i:masternakdawn},
169 the office manager at
170 MAC, had been dissatisfied with Kalamazoo Software for these reasons:
171
172 \begin{itemize}
173 \item The base price of \$99/month for the web presence with a scheduler
174 seemed high.
175 \item Dawn had the subjective impression that MAS was being overbilled
176 for website changes. Her impression was that changes
177 requiring about 1/2 hour of time were typically billed for 1-2 hours.
178 \end{itemize}
179
180 MAC spent, on average, approximately \$2,000/year for the web presence with
181 aircraft scheduler. For a small
182 business, this is a significant expenditure. It was natural to investigate
183 whether it could be done less expensively.
184
185 When MAS assumed the FBO in 2005, the arrangement with Kalamazoo Software was
186 discontinued, and MAS hosted the site with
187 \index{Ashley, David}Dave Ashley \cite{bibref:i:ashleydavidt} using
188 \index{ORS@\emph{ORS}}ORS \cite{bibref:p:ors} on an experimental basis.
189
190 After a period of experimentation, it was determined that ORS would perform
191 satisfactorily. Experimentally, the MAS website was moved to
192 \index{Hagen Hosting}Hagen Hosting \cite{bibref:hagenhostingweb}. After
193 a few weeks of hosting with Hagen Hosting, all user data was lost (and had to
194 be restored by Dave Ashley) twice in one week. Correspondence with
195 Hagen Hosting revealed that HTTP server issues that
196 could not be quickly resolved were the root cause (these issues
197 had caused difficulties for other customers as well). To prevent further hiccups, the MAS
198 website was moved back to Dave Ashley.
199
200 The nature of the technical hiccups with Hagen Hosting was probably that
201 an HTTPD process was dying unexpectedly. Because ORS works by fully reading
202 and then fully writing files, HTTPD processes that die unexpectedly could result
203 in truncated or incompletely written data files. The file that was damaged
204 when the site was hosted with Hagen Hosting was truncated to zero length twice
205 in one week. The technical design of ORS is sound, but an implementation
206 using a \index{MySQL@\emph{MySQL}}\emph{MySQL}
207 \cite{bibref:c:mysql} database would be more resilient with respect to
208 dying HTTPD processes (and hence might be more reliable on a heavily-loaded server).
209
210 In January of 2006, the ORS source code was examined in detail by
211 Dave Ashley with the aim of customizing it to provide more user privacy
212 and meet other goals of MAS\@. It was determined that it wasn't a good investment to
213 modify the source code, and instead it was decided to rewrite the resource scheduler
214 from scratch as a \emph{MySQL} implementation.
215 \emph{\productbasename{}} (the software described in this document)
216 is the rewrite.
217
218
219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
220
221 \subsection{Suboptimal Characteristics of ORS}
222 \label{siov0:ssco0}
223
224 It was determined (in 2005 and 2006)
225 that ORS \cite{bibref:p:ors}
226 has the following characteristics that make it suboptimal
227 for use by MAS:
228
229 \begin{enumerate}
230 \item The file-based database implementation is vulnerable to
231 dying HTTPD processes, and may make the product unsuitable for
232 hosting on heavily-loaded servers (which would impede the ability
233 to move the MAS site to a professional web hosting company).
234 \item Performance issues include:
235 \begin{enumerate}
236 \item Scheduler page loads were sometimes noticeably slow,
237 taking several seconds (but at other times taking less
238 than a second).
239 \item The file-based implementation requires that \emph{all}
240 data be read on every page load ($O(N)$ or worse).
241 \item The mutual exclusion mechanism (a lockfile to prevent
242 others processes from reading any scheduler file)
243 has performance disadvantages in a heavy usage environment.
244 \item Regular maintenance (backups, database pruning)
245 is integrated with the page loads. This also
246 contributes to slow page loads.
247 \end{enumerate}
248 \item There may be security issues, as some of the files intended to be
249 PHP include files can be directly executed by forming an appropriate
250 URL\@. It is unclear what attacks may be possible.
251 \item The paradigm of user privacy isn't what MAS desires. It is
252 possible for users to get unnecessary and potentially private
253 information about other users. Specific information that shouldn't be
254 obtainable in the MAS environment includes:
255 \begin{itemize}
256 \item A list of the other users (no relevance to a customer
257 scheduling an airplane, simulator, and/or instructor).
258 \item Identity of person reserving aircraft at various times (no relevance
259 to a person scheduling an airplane, simulator, or instructor).
260 \item Comments included with the reservation (for discovery flights, this often involves
261 names and phone numbers---not relevant to other customers).
262 \end{itemize}
263 \item For members of the line crew working at MAS, the authentication timeout
264 period is too short (as an employee works behind the counter during a
265 business day, they need to authenticate \emph{several} times).
266 \item The way in which the hours of a day's schedule are displayed means that
267 the late night and early morning hours can't be easily viewed. It would
268 be helpful to have scheduling views that are more ``free form'' where:
269 \begin{itemize}
270 \item One can freely scroll forward and backwards in time, without respect
271 to time and calendar boundaries.
272 \item One can freely zoom in and out, obtaining finer and coarser views
273 of scheduling.
274 \end{itemize}
275 \item The calendaring system makes it awkward to move around between dates.
276 It seems that a calendar with one or more months displayed and where one can
277 directly click on a day of interest might be easier to use.
278 \item The display of half-hours is awkward (the ``:30'')\@. A simpler
279 method is to textually display only whole hours but have it clear
280 by the geometry (i.e. where rectangles begin) whether a reservation
281 begins on a whole or half hour.
282 \item Aircraft/simulators and flight instructors have to be scheduled separately, even for
283 a simple instructional appointment.
284 \item The ORS notion of ``hiding'' aircraft a user can't schedule is a good one,
285 but there are those occasions where the user wants to see aircraft they can't
286 schedule, so there needs to be an override available to the user.
287 (Example: maybe a user can't fly a multi-engine aircraft, but they
288 want to get a quick ride somewhere in such an aircraft with a flight instructor.
289 In this case it would help to figure out the availability of the aircraft
290 before making a phone call.)
291 \item Users like \emph{Line}, \emph{Crew}, or \emph{Maint} are awkward (they require a separate
292 account under ORS). Instead, users should always log in as themselves (i.e.
293 authentication tied to the individual, always), and some users should by default have things
294 they schedule appear as a ``pseudo-user'' such as \emph{Line}, \emph{Crew}, or \emph{Maint}.
295 It is also important that they be able to schedule as themselves---this covers the case
296 where a line employee is taking flight lessons, and perhaps other cases as well.
297 \item Storing passwords in the clear is ill-advised. The more modern way of thinking
298 is hashed storage with password test and reset ability only.
299 \item ORS isn't the right framework for expansion to meet the other needs
300 of MAS (such as electronic maintenance of student training records,
301 support of other aviation organizations associated with the FBO, etc.).
302 \end{enumerate}
303
304
305 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
306
307 \subsection{Software and Documentation License}
308 \label{siov0:slic0}
309
310 The \emph{\productbasename{}} software and all associated documentation
311 (including this document)
312 is licensed under the
313 \index{GNU Public License (GPL)}GNU Public License \cite{bibref:gnuorgweb}.
314 The software is free both in a monetary and in an intellectual property sense.
315
316 Please note that the GPL may impose the requirement that if the source code
317 is modified, the modifications be made available publicly.
318
319
320 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
321
322 \subsection{Obtaining the Software}
323 \label{siov0:sosw0}
324
325 The software is viewable via \emph{ViewCVS}, and
326 later the server will be set up to make nightly tarballs of the tip of the
327 CVS archives and perhaps also to allow anonymous CVS
328 access. This will be finalized when the software is more mature.
329
330
331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
332
333 \subsection{Requesting Changes to this Document}
334 \label{siov0:scdo0}
335
336 I'm very sensitive to issues of readability, organization,
337 and indexing.
338
339 Please forward suggestions for simple changes
340 (typographical mistakes, grammar issues, indexing issues, etc.)
341 to me (Dave Ashley \cite{bibref:i:ashleydavidt}).
342
343 For more complex changes or enhancements
344 (such as the rewrite or addition of a paragraph or section),
345 you might consider
346 modifying the \LaTeX{} source code directly and e-mailing me the entire document
347 or the rewritten/added section. (There is, of course, a small possibility that I
348 would reject a change---so advance coordination about the proposed
349 changes would be prudent.)
350
351 This document is maintained under a version control system (note the revision
352 information on the title page), so changes are very easy to accommodate.
353
354
355 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356
357 \subsection{Feature Wish List}
358 \label{siov0:sfwl0}
359
360 The following features will be incorporated
361 in future releases of \emph{\productbasename{}}:
362
363 \begin{enumerate}
364 \item \textbf{Demonstration mode:}
365 a configuration constant that will allow the software to be
366 run on a demonstration website to demonstrate its capabilities.
367 Demonstration mode would include login without authentication
368 and automatic periodic purge of data.
369 \end{enumerate}
370
371 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
372
373 \subsection{Software Recommendations}
374 \label{siov0:ssrc0}
375
376 TBD\@. (This section is reserved for recommendations concerning software
377 an FBO might use to maintain a website.)
378
379 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
380
381 \subsection{Hosting Company Recommendations}
382 \label{siov0:shrc0}
383
384 TBD\@. (This section is reserved for recommendations for hosting companies
385 that provide hosting plans and equipment known to work well with \emph{\productbasename{}}.)
386
387 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388
389 \section{Theory of Operation, Installation, and Maintenance}
390 \label{sins0}
391
392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
393
394 \subsection{Theory of Operation}
395 \label{sins0:sots0}
396
397 Logically, the server source code is composed of three components:
398
399 \begin{itemize}
400 \item A set of PHP scripts that are executed in response
401 to HTTP requests (described in
402 \S{}\ref{swpg0}, p. \pageref{swpg0}). These files all reside in the same directory
403 of an \emph{Apache} \emph{DocumentRoot} or are \emph{Alias}'d or
404 \emph{ScriptAlias}'d into the \emph{Apache} namespace.
405
406 All of these files have the extension \emph{.php}.
407 \item A set of PHP library files that are included
408 and used by the \emph{.php} files
409 (described in \S{}\ref{sphl0}, p. \pageref{sphl0}).
410
411 All of these files have the extension \emph{.inc}.
412 \item A set of standalone PHP utility scripts that can be executed
413 to perform various utility functions
414 (described in \S{}\ref{ssas0}, p. \pageref{ssas0}). These
415 scripts are designed to be executed from a shell or a cron job.
416
417 These utility scripts
418 can be located anywhere except where they can be
419 executed in response to HTTP requests, but the recommended location
420 is with the PHP library files.
421
422 All of these utility scripts have the extension \emph{.php}.
423 \end{itemize}
424
425 The \emph{\productbasename{}} software works in the following way:
426
427 \begin{itemize}
428 \item Some \emph{.php} scripts
429 (\S{}\ref{swpg0})
430 are executed in response to web
431 visits. These \emph{.php} scripts allow users and
432 administrators to view and modify user and scheduling
433 information using a web browser.
434 \item Some utility \emph{.php} scripts
435 (\S{}\ref{ssas0})
436 are executed periodically
437 by the *nix system, normally via \emph{cron}.
438 These scripts perform database maintenance
439 and promote standby reservations.
440 \item Some utility \emph{.php} scripts
441 (\S{}\ref{ssas0})
442 are manually executed in special
443 circumstances (for example, to
444 initialize the database or if an administrator password is lost).
445 \item All \emph{.php} scripts may include \emph{.inc} files
446 (\S{}\ref{sphl0})
447 in the PHP library. (These include files are shared
448 between all PHP scripts, and provide a way to localize functionality
449 so that changes need to be made in only one place.)
450 \item All \emph{.php} scripts may interact with the
451 \emph{MySQL} server (by executing SQL queries)
452 in order to store, modify, and retrieve user and scheduling
453 information.
454 \end{itemize}
455
456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
457
458 \subsection{Administrator Requirements}
459 \label{sins0:sarq0}
460
461 The instructions in this document assume that the individual attempting to install
462 \emph{\productbasename{}} has solid Unix administration skills. The individual
463 attempting to install \emph{\productbasename{}} must have these skills:
464
465 \begin{itemize}
466 \item An understanding of Unix file and directory permissions, including:
467 \begin{itemize}
468 \item \index{UID}UID,
469 \index{GID}GID, and the standard Unix file and directory permission bits.
470 \item \index{chmod@\emph{chmod}}\emph{chmod},
471 \index{chown@\emph{chown}}\emph{chown}, and other commands used to modify
472 Unix file and directory permission bits.
473 \end{itemize}
474 \item An understanding of standard Unix commands, including
475 \index{cp@\emph{cp}}\emph{cp},
476 \index{mv@\emph{mv}}\emph{mv},
477 \index{rm@\emph{rm}}\emph{rm}, and
478 \index{tar@\emph{tar}}\emph{tar}.
479 \item An rudimentary understanding of how dynamic web content is generated and served,
480 including \index{Apache@\emph{Apache}}\emph{Apache}.
481 \item A rudimentary understanding \index{SQL}\emph{SQL} and \emph{MySQL}.
482 \end{itemize}
483
484 Attaining competence in Unix sufficient to install
485 \emph{\productbasename{}} is not trivial, especially if one has no experience
486 with Unix systems.
487
488 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
489
490 \subsection{Server System Requirements}
491 \label{sins0:ssyr0}
492
493 In order to run the \emph{\productname{}} software, the
494 \index{server requirements}server must meet the
495 following specifications.
496
497 \begin{itemize}
498 \item \emph{Linux} (necessary version uncertain).
499 \item \emph{Apache} (necessary version uncertain).
500 \item \emph{MySQL} (necessary version uncertain).
501 \item \emph{PHP} (necessary version uncertain).
502 \item The server must be configured so that \emph{cron} jobs can
503 be run.
504 \end{itemize}
505
506 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
507
508 \subsection{Server Software Installation Instructions}
509 \label{sins0:sssi0}
510
511 This section contains precise instructions for installing the
512 \emph{\productbasename{}} software on a server. The server must meet the
513 requirements in \S{}\ref{sins0:ssyr0}.
514
515 The steps in installing the \emph{\productbasename{}}
516 software are:
517
518 \begin{enumerate}
519 \item Choose the path where the \emph{PHP} web files,
520 \emph{PHP} library files, and web graphics will
521 be placed (\S{}\ref{sins0:sssi0:spwg0}, p. \pageref{sins0:sssi0:spwg0}).
522 \item Set up the \emph{MySQL} database software
523 (\S{}\ref{sins0:sssi0:smsq0}, p. \pageref{sins0:sssi0:smsq0}).
524 \item Set up the \emph{Apache} web server software
525 (\S{}\ref{sins0:sssi0:sapc0}, p. \pageref{sins0:sssi0:sapc0}).
526 \item Unpack the \emph{\productbasename{}} software
527 (\S{}\ref{sins0:sssi0:susc0}, p. \pageref{sins0:sssi0:susc0}).
528 \item Generate the \emph{\productbasename{}} hash key
529 (\S{}\ref{sins0:sssi0:sgsh0}, p. \pageref{sins0:sssi0:sgsh0}).
530 \item Customize the PHP library include path
531 (\S{}\ref{sins0:sssi0:sphl0}, p. \pageref{sins0:sssi0:sphl0}).
532 \item Customize the web page script include path
533 (\S{}\ref{sins0:sssi0:scwp0}, p. \pageref{sins0:sssi0:scwp0}).
534 \item Customize the \emph{MySQL} database access constants
535 (\S{}\ref{sins0:sssi0:sdac0}, p. \pageref{sins0:sssi0:sdac0}).
536 \item Initialize the \emph{MySQL} database
537 (\S{}\ref{sins0:sssi0:sdin0}, p. \pageref{sins0:sssi0:sdin0}).
538 \item Perform the functionality tests
539 (\S{}\ref{sins0:sssi0:sftt0}, p. \pageref{sins0:sssi0:sftt0}).
540 \item Customize the default FBO information
541 (\S{}\ref{sins0:sssi0:scdf0}, p. \pageref{sins0:sssi0:scdf0}).
542 \end{enumerate}
543
544 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
545
546 \subsubsection{Choice of PHP Source File, PHP Library, and Graphics Paths}
547 \label{sins0:sssi0:spwg0}
548
549 Server environments vary considerably. For example:
550
551 \begin{itemize}
552 \item On a server owned by the FBO, there is generally full freedom
553 in locating files (such as
554 \index{PHP library}PHP library files).
555 \item On a server owned by a web hosting company, there is generally
556 very little freedom in locating files (such as PHP library files).
557 Typically, all locations are specified by the web hosting company.
558 \end{itemize}
559
560 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
561
562 \paragraph{PHP Source File Path}
563
564 First, choose where to locate the PHP source files (these are the files that
565 are executed in response to HTTP requests---see \S{}\ref{swpg0}, \pageref{swpg0}), and record this choice to use
566 in later installtion steps. All of the files identified in \S{}\ref{swpg0} must be located in the
567 same directory.
568
569 For an FBO with website \texttt{http://myfbo.com}, a typical choice for a URL
570 to access the flight scheduler would be\\\\
571 \texttt{http://myfbo.com/flightschedule}.\\\\
572 This URL has associated with it a path on the server (usually, below the
573 Apache
574 \index{Apache@\emph{Apache}!DocumentRoot directive@\emph{DocumentRoot} directive}%
575 \index{DocumentRoot (Apache directive)@\emph{DocumentRoot} (Apache directive)}\emph{DocumentRoot}).
576 In this case, the server directory to contain the PHP source code should be chosen and created;
577 permissions should be checked to ensure that the Apache server
578 can read the files; and the choice should be recorded for later installation steps.
579
580 A second common choice is to locate the flight scheduler at a URL of the form
581 \texttt{http://flightschedule.myfbo.com}. The mechanics of setting up DNS and
582 Apache are not discussed here. If you are an inexperienced Unix administrator,
583 I recommend that you make the simpler choice described in the paragraph above.
584
585 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
586
587 \paragraph{PHP Library Path}
588
589 The PHP library path is the path where the PHP interpreter searches for
590 files specified in the PHP \emph{include()} and \emph{require()} commands.
591
592 The likely PHP library path chosen varies depending on whether the server is
593 owned.
594
595 For an server owned by the FBO, a typical choice is to place the library include files
596 in a subdirectory of the path specified in the \emph{php.ini} file.
597
598 For a server owned by a hosting company, a typical choice is anywhere not
599 aliased into Apache's URL space.\footnote{In other words, web clients should not be able to
600 choose a URL so as to point to the PHP library files.}
601
602 This choice should be made, the directory should be created, and permissions should be set
603 so that Apache can read but not modify the files, and the choice should be recorded.
604
605 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
606
607 \paragraph{Graphics File Path}
608
609 \emph{\productbasename{}} has some graphics (logos, arrows, icons, etc.) that must be
610 loadable by a browser. These files must all be together in the same directory.
611
612 A typical choice for a location for these graphics is\\\\
613 \texttt{http://myfbo.com/fboprimegraphics}.\\\\
614
615 The necessary directory should be created on the server, permissions should be set appropriately,
616 and the base URL of the graphics should be recorded.
617
618 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
619
620 \subsubsection{\emph{MySQL} Database Setup}
621 \label{sins0:sssi0:smsq0}
622
623 Setup of \index{MySQL@\emph{MySQL}!Setup for \productbasename{}@Setup for \emph{\productbasename{}}}%
624 \emph{MySQL} involves obtaining a database name,
625 userid, and password. (This is the only information
626 required to set up \emph{\productbasename{}}---creation of
627 database tables is handled by a script.)
628
629 The steps to set up \emph{MySQL} depend on how the software
630 is hosted.
631
632 \begin{itemize}
633 \item If the software is hosted by a hosting company, the
634 \emph{MySQL} database name, userid, and password will probably
635 be assigned by the hosting company.
636 \item If the software is hosted on an owned or dedicated server,
637 the setup must be performed by the individual
638 installing \emph{\productbasename{}}.
639 \end{itemize}
640
641 If the software is hosted on an owned or dedicated server,
642 the following steps should be used to set up \emph{MySQL}:
643
644 \begin{enumerate}
645 \item Choose a database name, userid, and password
646 for use with \emph{MySQL}. In subsequent description, these
647 are denoted \emph{dbname}, \emph{userid},
648 and \emph{password}.
649 \item Log into \emph{MySQL} as the root user.\footnote{Note that the
650 \emph{root} password for \emph{MySQL} is not the same
651 thing as the \emph{root} user password for \emph{Linux}.}
652 The command to do this is:
653
654 \texttt{mysql --user=root -p}
655 \item Create the database. The \emph{MySQL} command to do this is:
656
657 \texttt{create database \emph{dbname};}
658 \item Grant the user \emph{userid} all privileges on database
659 \emph{dbname} using password \emph{password} when connecting
660 from \emph{localhost}.\footnote{The normal arrangement is that the
661 \emph{MySQL} daemon runs on the same server as \emph{Apache}, hence
662 the connection from \emph{localhost}.} The command to do this is:
663
664 \texttt{grant all on \emph{dbname}.* to \emph{userid}@localhost\\identified by '\emph{password}';}
665 \item Log out of \emph{MySQL} (Control-D).
666 \item Test the permissions created by running
667
668 \texttt{mysql --user=\emph{userid} -p}
669
670 and entering the \emph{password} chosen. Issue the command:
671
672 \texttt{use database \emph{dbname};}
673
674 to verify permission to access \emph{dbname}.
675 \item Log out of \emph{MySQL} (Control-D).
676 \end{enumerate}
677
678 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
679
680 \subsubsection{\emph{Apache} Setup}
681 \label{sins0:sssi0:sapc0}
682
683 \index{Apache@\emph{Apache}!Setup for \productbasename{}@Setup for \emph{\productbasename{}}}%
684 As with \emph{MySQL}, the setup of \emph{Apache} is more complex
685 for an owned or dedicated server. Details TBD.
686
687
688 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
689
690 \subsubsection{Unpacking of \emph{\productbasename{}} Source Code}
691 \label{sins0:sssi0:susc0}
692
693 TBD.
694
695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
696
697 \subsubsection{Generation of \emph{\productname{}} Hash Key}
698 \label{sins0:sssi0:sgsh0}
699
700 The \emph{\productbasename{}} hash key must be defined in a file in the
701 PHP library named \emph{sitehashkey.inc}.
702
703 The \index{sitehashkeygen.php@\emph{sitehashkeygen.php}}\texttt{sitehashkeygen.php}
704 script (\S{}\ref{ssas0:shkg0}, p. \pageref{ssas0:shkg0}) should
705 be used to generate this file automatically.
706
707 Simply execute the \texttt{sitehashkeygen.php} script with the path to the
708 PHP library as the only parameter, then review
709 permissions on the \emph{sitehashkey.inc} file for appropriateness.
710
711 It would also be possible to generate the \emph{sitehashkey.inc}
712 file manually (although there should be no reason to do this).
713 The recommended approach would be to replicate the file contents
714 shown in Figure \ref{fig:ssas0:shkg0:00} (p. \pageref{fig:ssas0:shkg0:00}),
715 but with the key chosen randomly (perhaps by
716 typing random keystrokes in the text editor).
717
718 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
719
720 \subsubsection{Customization of Include Path in PHP Library Files}
721 \label{sins0:sssi0:sphl0}
722
723 TBD.
724
725 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
726
727 \subsubsection{Customization of Include Path in Web Pages}
728 \label{sins0:sssi0:scwp0}
729
730 TBD.
731
732 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
733
734 \subsubsection{Customization of \emph{MySQL} Database Access Constants}
735 \label{sins0:sssi0:sdac0}
736
737 TBD.
738
739 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
740
741 \subsubsection{Database Initialization}
742 \label{sins0:sssi0:sdin0}
743
744 TBD.
745
746 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
747
748 \subsubsection{Functionality Tests}
749 \label{sins0:sssi0:sftt0}
750
751 TBD.
752
753 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
754
755 \subsubsection{Customization of Default FBO Information}
756 \label{sins0:sssi0:scdf0}
757
758 TBD.
759
760 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
761
762 \subsection{Maintenance and Other Procedures}
763 \label{sins0:smpr0}
764
765 This section contains the precise instructions for installing the
766 \emph{\productname{}} software on a server. The server must meet the
767 requirements in \S{}\ref{sins0:ssyr0}.
768
769 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
770
771 \subsubsection{Backing Up \emph{MySQL} Database Contents}
772 \label{sins0:smpr0:sbak0}
773
774 TBD.
775
776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
777
778 \subsubsection{Backing Up FBO Web Content}
779 \label{sins0:smpr0:sbak1}
780
781 TBD.
782
783 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
784
785 \subsubsection{Restoring \emph{MySQL} Database Contents}
786 \label{sins0:smpr0:sres0}
787
788 TBD.
789
790 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
791
792 \subsubsection{Restoring FBO Web Content}
793 \label{sins0:smpr0:sres1}
794
795 TBD.
796
797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
798
799 \subsubsection{Upgrading to a Newer Version of \emph{\productbasename{}}}
800 \label{sins0:smpr0:sugd0}
801
802 TBD.
803
804 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
805
806 \section{Technical Background}
807 \label{stbg0}
808
809 This section provides technical background that may be useful in understanding
810 the \emph{\productbasename{}} software.
811
812
813 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
814
815 \subsection{The Site Hash Key}
816 \label{stbg0:sshk0}
817
818 \index{site hash key}In order to provide security for hashed passwords, session identifiers,
819 and other constructs, the
820 \emph{\productbasename{}} software must have available a string (or equivalently, a number)
821 that is not available to non-administrative users of the software. This string
822 is called the \emph{site hash key}.
823
824 It is most convenient to generate the site hash key using the \texttt{sitehashkeygen.php}
825 script, described in \S{}\ref{ssas0:shkg0}, p. \pageref{ssas0:shkg0}.
826
827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
828
829 \subsection{The MD5 Message Digest Algorithm}
830 \label{stbg0:smdf0}
831
832 \index{MD5 message digest algorithm}The MD5 message digest algorithm
833 \cite{bibref:rfc1321} is a cryptographic hash algorithm. The most important
834 properties of the algorithm are described in the executive summary of
835 \cite{bibref:rfc1321}:
836
837 \begin{quote}
838 \emph{This document describes the MD5 message-digest algorithm. The
839 algorithm takes as input a message of arbitrary length and produces
840 as output a 128-bit ``fingerprint'' or ``message digest'' of the input.
841 It is conjectured that it is computationally infeasible to produce
842 two messages having the same message digest, or to produce any
843 message having a given prespecified target message digest. The MD5
844 algorithm is intended for digital signature applications, where a
845 large file must be ``compressed'' in a secure manner before being
846 encrypted with a private (secret) key under a public-key cryptosystem
847 such as RSA.}
848 \end{quote}
849
850 The statement that ``\emph{it is computationally infeasible to produce
851 two messages having the same message digest, or to produce any message having
852 a given prespecified target message digest}'' means
853 that it is conjectured infeasible to ``work backwards'' from
854 a message digest to a message having that digest except by generating
855 random messages. Even by generating random messages and
856 evaluating their MD5 message digest at the rate of a billion ($10^9$) messages
857 per second (an unattainable rate on a single computing platform), the expected time
858 to find a message with a prespecified message digest is 5 trillion billion years.
859
860 The MD5 message digest function is ``one-way'' in that it is very inexpensive to
861 find the MD5 message digest given a message, but intractable to find a viable message
862 given its MD5.
863
864
865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
866
867 \subsection{\emph{\productbasename{}} Cryptographic Hash Functions}
868 \label{stbg0:sfch0}
869
870 The \emph{\productbasename{}} software provides a cryptographic hash function
871 used extensively in the software and denoted
872 the \index{site hash function}\emph{site hash function} or \index{SHF}\emph{SHF}\@.
873 The SHF function maps from an arbitrary number
874 of input strings to
875 an MD5 message digest.
876
877 The SHF is designed so that a potential attacker
878 cannot determine the MD5 message digest that would be generated from
879 a set of input strings. In order to accomplish this behavior,
880 the input strings are ``mixed'' with the
881 \index{site hash key} before the MD5 message digest is calculated.
882 If $s_i$ denotes the $i$th input string, $n$ denotes the number of
883 input strings, $h$ denotes the site hash key,
884 and ``$+$'' denotes string concatenation, the hash function used is
885
886 \begin{eqnarray}
887 \nonumber
888 & SHF(s_1, s_2, s_3, \ldots{}, s_n)& \\
889 \label{eq:stbg0:sfch0:00}
890 & = & \\
891 \nonumber
892 & MD5(h + s_1 + h + s_2 + h + s_3 + \ldots{} + s_n + h) . &
893 \end{eqnarray}
894
895 Note that given the input strings $s_1 \ldots{} s_n$, an attacker
896 cannot predict $SHF(s_1 \ldots{} s_n)$ without
897 knowledge of the site hash key. Note also that an attacker cannot deduce
898 the site hash key by observing a number of sets of strings and the
899 corresponding $SHF()$ output.
900
901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
902
903 \subsection{Password Storage}
904 \label{stbg0:spst0}
905
906 \index{password}Although unsafe computing practice, it is anticipated that
907 some users will use the same passwords for \emph{\productbasename{}}
908 as they use for other systems (such as e-mail and banking). It is unwise
909 to store \emph{\productbasename{}} passwords on the server in the clear,
910 in case the server is compromised or in the case of misconduct by
911 employees of the FBO or the hosting company.
912
913 Current doctrine with respect to password storage is:
914
915 \begin{itemize}
916 \item Passwords should not be stored on the server. Instead,
917 only cryptographic hashes of the passwords should be stored.
918 \item \index{salt}``Salt''\footnote{Some element of uncontrollability or randomness.} should be applied to
919 cryptographic hash generation. Without salt, two negative
920 circumstances are possible:
921 \begin{itemize}
922 \item It may be possible to determine if two users have the same password
923 (because the stored cryptographic hashes are identical).
924 \item Dictionary attacks may become easier. (Salt makes dictionaries
925 difficult to build.)
926 \end{itemize}
927 \item It should not be technically possible to view passwords.
928 \item Users and administrators should only be able to verify and
929 reset passwords (never to view them).
930 \end{itemize}
931
932 The algorithm used for password storage in \emph{\productbasename{}} is:
933
934 \begin{itemize}
935 \item When a user account is created, an SGUID and other
936 random elements are used to create 128 bits of ``salt''. This salt
937 is stored with the user record.
938 \item The password information stored is the SHF of
939 the user's salt and the password.
940 \end{itemize}
941
942 In order for an attacker to glean information about a user's password
943 based on information stored on the server:
944
945 \begin{itemize}
946 \item The site hash key would need to be compromised.
947 \item The user's salt would need to be compromised.
948 \item Even with the two previous conditions met, the only attack possible
949 is a dictionary attack.\footnote{The dictionary database could not be
950 built until the site hash key and user's salt were compromised. Additionally:
951 \begin{itemize}
952 \item Due to the salt, the dictionary would apply to only one user.
953 \item It would not be possible to determine whether two users
954 have the same password.
955 \end{itemize}}
956 \end{itemize}
957
958 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
959
960 \subsection{Unix Time vs. Scheduling Time}
961 \label{stbg0:sutv0}
962
963 Traditionally, time in Unix systems has been represented as integer seconds since
964 the \index{Unix epoch}\index{epoch}Unix epoch, where the Unix epoch is defined as
965 00:00:00 \index{UTC}UTC on January 1, 1970. Unix systems overall perform well,
966 but there are occasional glitches---for example, a carelessly-written Unix
967 \emph{cron} job might run twice or not at all as \index{daylight savings time}daylight
968 savings time comes or goes.
969
970 Note that traditional Unix time does not include the notion of daylight savings time.
971 UTC is never adjusted in this way. Only the offset of local time
972 with respect to UTC changes.
973
974 It would be possible to have the resource scheduler use the traditional
975 Unix time. There would be two disadvantages to such an approach:
976
977 \begin{enumerate}
978 \item GET and POST parameters would not be human-friendly (making debugging
979 more difficult).
980 \item There would be complexity in handling reservations near the transitions
981 to and from daylight savings time.
982 \end{enumerate}
983
984 For these reasons, this software uses two time schemes:
985
986 \begin{itemize}
987 \item For \index{SGUID}SGUIDs
988 (\S{}\ref{stdd0:sdty0:sgui0}, p. \pageref{stdd0:sdty0:sgui0})
989 and other special purposes where only time ordering is required, the software uses
990 traditional Unix time.
991 \item For reservation scheduling
992 (see \index{STIME}STIME, \S{}\ref{stdd0:sdty0:stim0}, p. \pageref{stdd0:sdty0:stim0}),
993 an abstract representation of local time is used. This abstract
994 representation does not consider daylight savings time.
995 \end{itemize}
996
997 In behavior, the scheduler resembles a large piece of paper with many
998 squares. There is no allowance made for the extra hour or missing hour
999 that accompany daylight savings time. This means that reservations
1000 spanning the transition may be longer or shorter by one hour than the
1001 scheduler calculates. In practice, this is not likely to be a problem, as
1002 very few pilots fly a rental plane at 2 a.m.
1003
1004 The Unix notion of time and the scheduler's notion of time intersect at these places:
1005
1006 \begin{itemize}
1007 \item The time and date displayed by the scheduler as the current time and date.
1008 \item Time of day and date assumed for deciding which calendar day and which portion of the day to
1009 display.
1010 \item Time of day used for deciding if a user is trying to schedule or cancel a reservation
1011 too close to the time of the reservation.
1012 \end{itemize}
1013
1014 It is anticipated that this software may be run on a server not in the same
1015 \index{locale (time)}locale
1016 as the FBO. For this reason, the software can be customized to
1017 use as the current time either:
1018
1019 \begin{itemize}
1020 \item The server local time with an optional offset.
1021 \item UTC (GMT) time with an optional offset.
1022 \end{itemize}
1023
1024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1025
1026 \subsection{Time Interval Conventions}
1027 \label{stbg0:stic0}
1028
1029 The \emph{\productbasename{}} software deals extensively
1030 with \index{time interval}time intervals.
1031 It is useful---and it prevents mistakes---to have
1032 a formal definition of what is intended by an interval.
1033
1034 For example, if \emph{Student A} reserves an airplane from 2 p.m. to
1035 3 p.m., and \emph{Student B} reserves the same airplane from 3 p.m. to
1036 4 p.m., which student has the airplane at exactly 3 p.m.?\footnote{Answer:
1037 \emph{Student B}, and the rationale follows.}
1038
1039 The convention used in the \emph{\productbasename{}} software
1040 is that reservation intervals are
1041 \index{closed interval}\index{interval!closed}closed on the left and
1042 \index{open interval}\index{interval!open}open
1043 on the right, that is, a scheduling interval from $t_0$ to
1044 $t_1$ encompasses all values or time $t$ such that
1045
1046 \begin{equation}
1047 t \in [ t_0, t_1),
1048 \end{equation}
1049
1050 \noindent{}or, equivalently but using different notation,
1051
1052 \begin{equation}
1053 t_0 \leq t < t_1 .
1054 \end{equation}
1055
1056 At first glance, it may seem frivolous to pay so much attention to
1057 this definition. However, in the formation of SQL queries and in definitions
1058 such as \emph{adjacency} or \emph{overlap}, uncertain definitions lead to
1059 software with uncertain behavior.
1060
1061
1062 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1063
1064 \subsection{Definition of Overlapping Intervals}
1065 \label{stbg0:sdov0}
1066
1067 \index{overlapping intervals}\index{interval!operlapping}Two time intervals
1068
1069 \begin{equation}
1070 \label{eq:stbg0:sdov0:000}
1071 \overline{c} = [c_0, c_1)
1072 \end{equation}
1073
1074 \noindent{}and
1075
1076 \begin{equation}
1077 \label{eq:stbg0:sdov0:0000}
1078 \overline{w} = [w_0, w_1)
1079 \end{equation}
1080
1081 \noindent{}overlap if there can be found some value of time $t$ which
1082 is in both intervals, i.e.
1083
1084 \begin{equation}
1085 \label{eq:stbg0:sdov0:00}
1086 \exists t : t \in \overline{c} \wedge t \in \overline{w} .
1087 \end{equation}
1088
1089 It can be shown that a simple test\footnote{Thanks to
1090 Rouben Rostamian \cite{bibref:i:rostamianrouben}
1091 for his post to the \texttt{sci.math} newsgroup containing this
1092 expression.} for
1093 overlap is
1094
1095 \begin{equation}
1096 \label{eq:stbg0:sdov0:01}
1097 (c_0 < y_1) \wedge (y_0 < c_1) .
1098 \end{equation}
1099
1100 It is also possible and potentially desirable to generalize the
1101 notion of a reservation to include
1102 \index{reservations!zero-length}zero-length reservations where
1103 $t_0 = t_1$. If this is done, we must accept
1104 the $t_0=t_1$ case as an idiom for $[t_0, t_1]$\footnote{Rather
1105 than for $[t_0, t_1)$, which wouldn't make sense with $t_0=t_1$}.
1106 In this case, the notion of overlap presented
1107 in (\ref{eq:stbg0:sdov0:00}) can still be applied. It is believed
1108 that the simplest expression for overlap of two potentially
1109 zero-length reservations is
1110
1111 \begin{equation}
1112 \label{eq:stbg0:sdov0:02}
1113 ((c_0 < y_1) \wedge (y_0 < c_1)) \vee (c_0 = y_0) .
1114 \end{equation}
1115
1116 No special results have been obtained for evaluating more than two intervals for
1117 overlap.
1118
1119
1120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1121
1122 \subsection[\mbox{\protect$O(\log N)$}, \mbox{\protect$O(N)$}, and \mbox{\protect$O(N^2)$}]
1123 {\mbox{\protect\boldmath$O(\log N)$},
1124 \mbox{\protect\boldmath$O(N)$}, and \mbox{\protect\boldmath$O(N^2)$}}
1125 \label{stbg0:sonn0}
1126
1127 \index{O() notation@$O()$ notation}``$O()$''
1128 notation comes from computer science, and denotes an upper bound
1129 on the number of steps required to perform a calculation or to execute
1130 an algorithm (such as a database search algorithm)\@. In this context, $N$ is
1131 used to denote some parameter that can be varied to represent more difficulty,
1132 such as more records in a database or more records to sort.
1133
1134 In designing the \emph{\productbasename{}} software, it is natural to be
1135 concerned with the performance of the software as the number of records
1136 (users, resources, reservations) increases. This is especially relevant
1137 because ORS had performance problems.
1138
1139 The nature of an $O(N)$ algorithm is easiest to comprehend.
1140 An $O(N)$ algorithm is normally an algorithm where a fixed amount of processing
1141 is performed for each of $N$ items. For example, reading $N$ items from a file
1142 tends to be an $O(N)$ operation. If it takes one second for a computer to
1143 read 1,000 items, it might be reasonable to expect it to take two seconds
1144 to read 2,000 items.
1145
1146 An $O(\log N)$ operation is an operation where the time to complete
1147 the operation varies roughly as the logarithm of the number of elements.
1148 For example, if it takes one second for a computer to perform an operation
1149 on 10 elements and two seconds on 100 elements; it might be reasonable to
1150 expect it to take three seconds on 1000 elements.\footnote{$\log 10 = 1$,
1151 $\log 100 = 2$, and $\log 1000 = 3$.}
1152
1153 An $O(N^2)$ is an operation where the time to complete the operation varies roughly
1154 as the square of the number of elements. For example, if it takes one second for
1155 a computer to perform an operation on 10 elements, it would be reasonable to expect
1156 it to take four seconds on 20 elements and nine seconds on 30 elements.
1157
1158 Note that $O(N^2)$ operations are frequently created (usually accidentally!) by
1159 nested loops over data, such as occur in the classic rock/bubble sorts.
1160 $O(N^2)$ algorithms are \emph{extremely} undesirable.
1161
1162 It is easy to see that $O(\log N)$ algorithms are more
1163 desirable than $O(N)$ algorithms, which are in
1164 turn more desirable than $O(N^2)$ algorithms.
1165
1166 The goal in designing the database for \emph{\productbasename{}} is to ensure as much
1167 as possible that all database queries require $O(\log N)$ time to execute, rather
1168 than $O(N)$ or $O(N^2)$ time.
1169
1170 $O(\log N)$ behavior is in general achieved by defining the fields used in important
1171 queries to be
1172 \index{key field}\index{MySQL@\emph{MySQL}!key field}\emph{key} fields.
1173 Definition as a key field has two effects on
1174 the behavior of database queries:
1175
1176 \begin{itemize}
1177 \item Queries involving equalities or inequalities of the key field become
1178 $O(\log N)$ rather than $O(N)$.
1179 \item Database insertions require somewhat more time (because of the overhead
1180 of maintaining special indexes or trees that assist in searching).
1181 \end{itemize}
1182
1183 As an example of a critical query, consider a user who is browsing airplane
1184 scheduling information. In order to allow the scheduling information to be quickly
1185 displayed,
1186 \emph{MySQL} must be able to quickly locate the scheduling records that
1187 correspond to the airplane and the time period being viewed. For this reason,
1188 database table fields identifying the airplane
1189 and the start and end of the reservation are
1190 key fields.
1191
1192 Comments and explanations involving $O()$ notation are found throughout the
1193 \emph{\productbasename{}} source code and throughout this document.
1194
1195
1196 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1197
1198 \subsection[\mbox{\protect$1\leftrightarrow{}1$},
1199 \mbox{\protect$1\leftrightarrow{}\infty{}$},
1200 and
1201 \mbox{\protect$\infty\leftrightarrow\infty{}$} Table Relationships]
1202 {\mbox{\protect\boldmath$1\leftrightarrow{}1$},
1203 \mbox{\protect\boldmath$1\leftrightarrow{}\infty{}$},
1204 and
1205 \mbox{\protect\boldmath$\infty\leftrightarrow\infty{}$} Table Relationships}
1206 \label{stbg0:sdbx0}
1207
1208 TBD.
1209
1210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1211
1212 \section{Technical Design Decisions}
1213 \label{stdd0}
1214
1215 TBD.
1216
1217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1218
1219 \subsection{Standard Web Page Appearance}
1220 \label{stdd0:swpa0}
1221
1222 TBD.
1223
1224 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1225
1226 \subsection{Data Types}
1227 \label{stdd0:sdty0}
1228
1229 \index{data types}%
1230 This section describes the custom data types maintained by the software.
1231
1232 PHP is primarily a string-based language. The important data types that
1233 are used to implement this software are, for the most part, forced into
1234 string form. String forms provide a way to represent data not inherently
1235 supported by PHP, such as long integers.
1236
1237 The string forms of data described here generally (but not always)
1238 have these characteristics.
1239
1240 \begin{itemize}
1241 \item String forms are typically constant-length.
1242 \item String forms typically have as their first two characters a type identifier.
1243 This provides a way for the software to trap typing mistakes.
1244 \item String forms are typically chosen so that the
1245 lexographic ordering of the strings corresponds to the desired ordering of the
1246 represented data.
1247 \end{itemize}
1248
1249
1250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1251
1252 \subsubsection{UTIME (Unix Timestamp)}
1253 \label{stdd0:sdty0:sutm0}
1254
1255 \index{UTIME}%
1256 A Unix timestamp is a decimal representation of the number of
1257 seconds since the Unix epoch, and includes a fractional part.
1258
1259 \begin{figure}
1260 \centering
1261 \includegraphics[width=4.6in]{utimeformat01.eps}
1262 \caption{Format of UTIME}
1263 \label{fig:stdd0:sdty0:sutm0:00}
1264 \end{figure}
1265
1266 Figure \ref{fig:stdd0:sdty0:sutm0:00} illustrates the format of
1267 an UTIME. A UTIME consists of 22 characters, with the following
1268 components.
1269
1270 \begin{itemize}
1271 \item \textbf{``UT'' (2 characters):}
1272 This fixed string aids in preventing type accidents with
1273 string data types.
1274 \item \textbf{Integer seconds since the Unix epoch (11 characters):}
1275 These 11 characters are an integer, zero-padded on the left as
1276 necessary, that represent the integer seconds since the Unix
1277 epoch.
1278 \item \textbf{Nanoseconds associated with the integer seconds (9 characters):}
1279 These 9 characters are an integer, zero-padded on the left as
1280 necessary, that represent the nanoseconds associated with the
1281 integer seconds since the Unix
1282 epoch.
1283 \end{itemize}
1284
1285 Note that UTIMEs as described have the property that the lexical
1286 string sort order corresponds to the time sort order.
1287
1288 Note that the UTIME format can be used only for values that:
1289
1290 \begin{itemize}
1291 \item Are used as part of generating a unique or random data value
1292 (see, for example, \S{}\ref{stdd0:sdty0:sgui0}).
1293 \item Are used to determine elapsed time.
1294 \end{itemize}
1295
1296 UTIMEs cannot be mixed directly with scheduling time, as the FBO
1297 may be in a different time zone than the server.
1298
1299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1300
1301 \subsubsection{SGUID (Server Globally-Unique Identifier)}
1302 \label{stdd0:sdty0:sgui0}
1303
1304 \index{SGUID}%
1305 \index{globally-unique identifier}%
1306 It is necessary or helpful in some contexts to have a way to create an
1307 identifier that is guaranteed to occur no more often than once in the lifetime
1308 of the server. \emph{MySQL} can be used to create such identifiers, and there
1309 are also methods based on file and IPC semantics that can be used.
1310
1311 The method used in the software is a \index{spin lock}spin lock on a precision
1312 timestamp; and the timestamp is concatenated with the PID. The method works
1313 because:
1314
1315 \begin{itemize}
1316 \item A single process (by virtue of the spin lock) can't generate the same
1317 precision timestamp twice.
1318 \item No two processes can have the same PID at the same time.
1319 \end{itemize}
1320
1321 \begin{figure}
1322 \centering
1323 \includegraphics[width=4.6in]{sguidformat01.eps}
1324 \caption{Format of SGUID}
1325 \label{fig:stdd0:sdty0:sgui0:00}
1326 \end{figure}
1327
1328 Figure \ref{fig:stdd0:sdty0:sgui0:00} illustrates the format of
1329 an SGUID. An SGUID consists of 32 characters, with the following
1330 components.
1331
1332 \begin{itemize}
1333 \item \textbf{``SG'' (2 characters):}
1334 This fixed string aids in preventing type accidents with
1335 string data types.
1336 \item \textbf{Integer seconds since the Unix epoch (11 characters):}
1337 These 11 characters are an integer, zero-padded on the left as
1338 necessary, that represent the integer seconds since the Unix
1339 epoch.\footnote{Note that 11 digits comfortably solves the Unix
1340 2037 A.D. issue, as this will guarantee SGUIDs
1341 beyond 5000 A.D.}
1342 \item \textbf{Nanoseconds associated with the integer seconds (9 characters):}
1343 These 9 characters are an integer, zero-padded on the left as
1344 necessary, that represent the nanoseconds associated with the
1345 integer seconds since the Unix
1346 epoch.\footnote{As of this writing, Linux provides time to a resolution
1347 of microseconds. It is anticipated that a resolution of nanoseconds will
1348 accommodate any hardware speed advances in the foreseeable future.}
1349 \item \textbf{PID (10 characters):}
1350 These 10 characters are an integer, zero-padded on the left as
1351 necessary, that represent Unix PID expressed
1352 as a decimal number.\footnote{As of this writing, PIDs are 16 bits only.
1353 However, it seems inevitable that PIDs will be expanded to 24 or 32 bits in the
1354 future.}
1355 \end{itemize}
1356
1357 Note that SGUIDs as described have a very important property---the lexical
1358 string sort order corresponds to the time sort order, with the PID used as a tie-breaker.
1359 This property is used to decide the priority of standby reservations
1360 (\S{}\ref{stdd0:ssby0}, p. \pageref{stdd0:ssby0}).
1361
1362 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1363
1364 \subsubsection{SID (Session Identifier)}
1365 \label{stdd0:sdty0:ssid0}
1366
1367 A \index{session identifier}session identifier (\index{SID}SID) is the
1368 cookie provided to the browser to authenticate the user after a successful login
1369 process is completed.
1370
1371 A session identifier is an identifier only. The state associated with the
1372 session is maintained on the server side.
1373
1374 A session identifier is exactly 66 characters long and consists of these components:
1375
1376 \begin{itemize}
1377 \item The two characters ``SI'' (2 characters).
1378 \item An SGUID as described in \S{}\ref{stdd0:sdty0:sgui0} (32 characters).
1379 \item The server cryptographic hash function of the first two fields described
1380 above (32 characters).
1381 \end{itemize}
1382
1383 The process of using an SID for authentication is protected by these mechanisms:
1384
1385 \begin{itemize}
1386 \item It is impossible for a client to forge an SID, as the client does not have
1387 access to the server hash key. (Additionally, it would be extremely for
1388 a client to guess an SGUID that is already associated with a session on the
1389 server, as this space is quite large.)
1390 \item The \emph{\productbasename{}} software also records the IP address of the
1391 connecting computer, records that information in the server-side session
1392 state, and will not accept the SID from a computer connecting from a different
1393 IP address. Thus (NAT schemes aside) an SID cannot be reused by a client
1394 other than the one it was issued to.
1395 \end{itemize}
1396
1397
1398 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1399
1400 \subsubsection{STIME (Scheduling Timestamp)}
1401 \label{stdd0:sdty0:stim0}
1402
1403 \index{STIME}%
1404 A scheduling timestamp is a timestamp in an abstract
1405 calendar format with a resolution appropriate for:
1406
1407 \begin{itemize}
1408 \item Representing the start times and end times of
1409 reservations.
1410 \item Marking database records with a modification time that will be
1411 formatted and displayed.
1412 \item Representing dates, such as expiration dates.
1413 \end{itemize}
1414
1415 \begin{figure}
1416 \centering
1417 \includegraphics[width=4.6in]{stimeformat01.eps}
1418 \caption{Format of STIME}
1419 \label{fig:stdd0:sdty0:stim0:00}
1420 \end{figure}
1421
1422 Figure \ref{fig:stdd0:sdty0:stim0:00} illustrates the format of
1423 an STIME\@. An STIME consists of 16 characters, with the following
1424 components.
1425
1426 \begin{itemize}
1427 \item \textbf{``ST'' (2 characters):}
1428 This fixed string aids in preventing type accidents with
1429 string data types.
1430 \item \textbf{Calendar year (4 characters).}
1431 \item \textbf{Calendar month (2 characters).}
1432 \item \textbf{Calendar day (2 characters).}
1433 \item \textbf{Hour, 24-hour time (2 characters).}
1434 \item \textbf{Minute (2 characters).}
1435 \item \textbf{Second (2 characters).}
1436 \item \textbf{Microsecond (6 characters).}
1437 \end{itemize}
1438
1439 Note that STIMEs as described have the property that the lexical
1440 string sort order corresponds to the time sort order.
1441
1442 An STIME is used only for scheduling time, and is necessarily the time in the
1443 client locale.
1444
1445
1446 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1447
1448 \subsubsection{DT8 (Short Calendar Date)}
1449 \label{stdd0:sdty0:sdat8}
1450
1451 \index{DT8}%
1452 The DT8 data type is used to specify dates in a shorthand
1453 format in GET/POST parameters and in software internals.
1454 The format is a string consisting of exactly 8
1455 characters:
1456
1457 \begin{itemize}
1458 \item Calendar year (4 characters).
1459 \item Calendar month (2 characters).
1460 \item Calendar day (2 characters).
1461 \end{itemize}
1462
1463 A DT8 is used only for scheduling time, and is necessarily the time in the
1464 client locale.
1465
1466
1467 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1468
1469 \subsubsection{T4 (Short Calendar Time)}
1470 \label{stdd0:sdty0:sdtt4}
1471
1472 \index{T4}%
1473 The T4 data type is used to specify times in a shorthand
1474 format in GET/POST parameters and in software internals.
1475 The format is a string consisting of exactly 4
1476 characters:
1477
1478 \begin{itemize}
1479 \item Hour (``00''-``23'', 2 characters).
1480 \item Minute (``00''-``59'', 2 characters).
1481 \end{itemize}
1482
1483 Note that the string ``2400'' is not a legal T4\@. Technically, ``2400'' is
1484 ``0000'' of the following day.
1485
1486 A T4 is used only for scheduling time, and is necessarily the time in the
1487 client locale.
1488
1489 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1490
1491 \subsubsection{T3 (Shorter Calendar Time)}
1492 \label{stdd0:sdty0:sdtt3}
1493
1494 \index{T3}%
1495 The T3 data type is used to specify times in a shorthand
1496 format in GET/POST parameters and in software internals, with
1497 a granularity of 10 minutes.
1498
1499 Because \emph{\productbasename{}} will only schedule with a granularity
1500 of 30 minutes, any start time of a reservation is expressible as a T3.
1501
1502 The format of a T3 is a string consisting of exactly 3
1503 characters:
1504
1505 \begin{itemize}
1506 \item Hour (``00''-``23'', 2 characters).
1507 \item Minutes divided by ten (``0''-``5'', 1 character).
1508 \end{itemize}
1509
1510 Note that the string ``240'' is not a legal T3\@. Technically, ``240'' is
1511 ``000'' of the following day.
1512
1513 A T3 is used only for scheduling time, and is necessarily the time in the
1514 client locale.
1515
1516 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1517
1518 \subsubsection{T2 (Shortest Calendar Time)}
1519 \label{stdd0:sdty0:sdtt2}
1520
1521 \index{T2}%
1522 The T2 data type is used to specify times in a shorthand
1523 format in GET/POST parameters and in software internals, with
1524 a granularity of 1 hour.
1525
1526 A T2 is simply the hour of the time, and may range from ``00''-``23''.
1527
1528 Note that the string ``24'' is not a legal T2\@. Technically, ``24'' is
1529 ``00'' of the following day.
1530
1531 A T2 is used only for scheduling time, and is necessarily the time in the
1532 client locale.
1533
1534 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1535
1536 \subsection{User Permissions}
1537 \label{stdd0:supm0}
1538
1539 TBD.
1540
1541 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1542
1543 \subsubsection{Permission Templates and Permission Schema}
1544 \label{stdd0:supm0:snap0}
1545
1546 There are [at least] two ways of thinking about user permissions:
1547
1548 \begin{itemize}
1549 \item A user is in a defined role (customer, FBO owner, line employee,
1550 flight instructor, etc.) and should have fixed privileges
1551 directly tied to to the role.
1552 \item The role of the user is only a starting point for the granting
1553 of permissions. Users may require more or fewer permissions, in
1554 a fine-grained sense, than is traditional for their role. For example,
1555 a line employee may be authorized to change fuel prices or have other
1556 privileges not granted to other line employees.
1557 \end{itemize}
1558
1559 The approach taken in the \emph{\productbasename{}} software is the second
1560 approach---fine-grained permissions. The specific approach taken is:
1561
1562 \begin{itemize}
1563 \item At the time a user is created, they are created as a ``permission template'' corresponding
1564 to their role or job. The permission template is a starting point.
1565 \item Permissions are very specific and fine-grained, and all permissions can be
1566 individually added or removed from an individual user after the user
1567 account is created.
1568 \item The permission templates and the associated permissions are
1569 customizable in the configuration file.
1570 \item Most user permissions are Boolean in nature, but some may have integer,
1571 floating point, or
1572 string values.
1573 \end{itemize}
1574
1575
1576 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1577
1578 \subsubsection{Mechanism of Storage and Query}
1579 \label{stdd0:supm0:sstq0}
1580
1581 PHP is an interpreted language. The steps that are interpreted run
1582 relatively slowly (because the interpreter must parse the PHP statements), whereas
1583 PHP built-in functions (compiled `C' code) run very quickly. One way to enhance
1584 efficiency is to be sure that things that happen often come down to
1585 built-in functions rather than PHP statements that must be interpreted.
1586
1587 SQL queries are also relatively slow, and a mechanism that avoids these
1588 is desirable.
1589
1590 The mechanism chosen to represent permissions is:
1591
1592 \begin{itemize}
1593 \item User permissions are represented as a single string (in \emph{MySQL}, a
1594 \emph{varchar} field).
1595 \item The user permission string is a group of permissions separated by
1596 the forward slash character (``/'').
1597 \item Each permission takes one of the following forms:
1598 \begin{itemize}
1599 \item \emph{``/ptag''}:
1600 For a boolean permission, presence of the
1601 \emph{ptag} indicates that the user has the permission, and absence
1602 of the \emph{ptag} indicates that the user does not have the permission.
1603 \item \emph{``/ptag=``value''}:
1604 The permission (or attribute) \emph{ptag} is assigned the
1605 \emph{value}.
1606 \end{itemize}
1607 \item Permission strings are escaped so that the string \emph{``/ptag''}
1608 can occur only at the start of the definition of the permission
1609 \emph{ptag}. Specifically:
1610 \begin{itemize}
1611 \item If the forward slash character occurs in the value of a
1612 permission, the forward slash character is escaped
1613 by suffixing it with the backslash character.
1614 \item The permission values allowed are very restrictive. Specifically:
1615 \begin{itemize}
1616 \item Backslashes are not allowed within permission values.
1617 \item Double-quotes are not allowed within permission values.
1618 \end{itemize}
1619 \end{itemize}
1620 \item Presence of a permission can be rapidly determined by using
1621 a string search\footnote{The string search functions are built into PHP, and are
1622 very quick because they are compiled `C' code.}
1623 by ``\emph{/ptag}''. Because of the escaping used,
1624 this string can only occur if permission \emph{ptag} exists.
1625 \end{itemize}
1626
1627
1628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1629
1630 \subsubsection{Administrator Permissions}
1631 \label{stdd0:supm0:sadp0}
1632
1633 TBD.
1634
1635 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1636
1637 \subsection{\emph{MySQL} Database Design}
1638 \label{stdd0:smdd0}
1639
1640 TBD.
1641
1642 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1643
1644 \subsubsection{Overall Relational Design}
1645 \label{stdd0:srds0}
1646
1647 Figure \ref{fig:stdd0:srds0:00} illustrates the overall relational
1648 database design. The design consists conceptually of only five tables.
1649 However, because the $\infty\leftrightarrow\infty$ relationships require
1650 a cross-reference table, seven physical tables are actually required.
1651
1652 \begin{figure}
1653 \centering
1654 \includegraphics[width=4.6in]{rdoveralldesign01.eps}
1655 \caption{\emph{\productname{}} Relational Database Overall Design}
1656 \label{fig:stdd0:srds0:00}
1657 \end{figure}
1658
1659 In the actual \emph{MySQL} database, the eight tables shown in
1660 Figure \ref{fig:stdd0:srds0:00} are named exactly
1661 as indicated:
1662 \index{usrs@\emph{usrs}}\emph{usrs},
1663 \index{resv@\emph{resv}}\emph{resv},
1664 \index{slot@\emph{slot}}\emph{slot},
1665 \index{rscs@\emph{rscs}}\emph{rscs},
1666 \index{sper@\emph{sper}}\emph{sper},
1667 \index{sess@\emph{sess}}\emph{sess},
1668 \index{loge@\emph{loge}}\emph{loge},
1669 and
1670 \index{dpar@\emph{dpar}}\emph{dpar}.
1671 The cross-reference table not shown in the figure is named by concatenating the
1672 cross-referenced table names:
1673 \index{usrsresv@\emph{usrsresv}}\emph{usrsresv}.
1674
1675 The seven tables shown in Figure \ref{fig:stdd0:srds0:00}
1676 have the following contents:
1677
1678 \begin{itemize}
1679 \item \textbf{\emph{usrs} (Users):}
1680 User information, including contact information and hashed password.
1681 \item \textbf{\emph{resv} (Reservations):}
1682 Reservations, including comments.
1683 \item \textbf{\emph{slot} (Slots):}
1684 Information about the actual time slot occupied by a reservations's
1685 linked resource, including start time and end time.\footnote{The
1686 \emph{slot} table allows a single reservation to use two or more different
1687 resources at different times. This occurs most commonly when a student
1688 schedules both ``ground'' and ``air'' time with an instructor, and the
1689 ``ground'' time extends either before or after the ``air'' time, or both.}
1690 \item \textbf{\emph{rscs} (Resources):}
1691 Schedulable resources, including aircraft, simulators, and flight instructors.
1692 \item \textbf{\emph{sper} (Scheduling Permissions):}
1693 The relationship between users and resources, in terms of the user's ability
1694 to schedule the resource with and without an instructor.\footnote{Instructors themselves
1695 have no scheduling restrictions---any student may schedule time with any instructor.}
1696 \item \textbf{\emph{sess} (Sessions):}
1697 State of user logins.
1698 \item \textbf{\emph{loge} (Log entries):}
1699 Significant and insignificant events for the software. These are stored
1700 in a database table rather than a file
1701 for easier sorting, viewing, manipulation, and pruning.
1702 \item \textbf{\emph{dpar} (Database parameters):}
1703 Parameters of the database as a whole, such as the current
1704 version of \emph{\productbasename{}} that created the
1705 database and an SGUID obtained at the time any table of
1706 the database was modified.
1707 \end{itemize}
1708
1709 Note in Figure \ref{fig:stdd0:srds0:00} that there is a 1:1 link indicated
1710 between resources and users. Every flight instructor resource is also a user, and so
1711 when a user (usually, a student) creates, modifies, or cancels a reservation,
1712 the flight instructor user may be automatically notified by e-mail. In order to
1713 determine the e-mail addresses associated with the flight instructor resource,
1714 the link from the resource to the user is followed. Without such a link, the
1715 flight instructor's e-mail addresses would have to be maintained in two places in
1716 the database.
1717
1718
1719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1720
1721 \subsubsection{Structure of Reservations}
1722 \label{stdd0:sres0}
1723
1724 A reservation consists of the following components (please
1725 refer to Figure \ref{fig:stdd0:srds0:00}):
1726
1727 \begin{itemize}
1728 \item One or more entries from the users table (\emph{usrs}). In the case
1729 of multiple users attached to a reservation, all have authority to
1730 modify the reservation.
1731 \item \textbf{Exactly one} record from the reservations table (\emph{resv}).
1732 \item One or more entries from the slots table (\emph{slot}).
1733 \item One or more entries from the resources table (\emph{rscs}), paired
1734 1:1 with the entries from the slots table. (Note also that a given reservation
1735 may include a given resource only once.)
1736 \end{itemize}
1737
1738 The format of a \emph{reservation} as presented above is deliberately general.
1739 It allows these reservation structures:
1740
1741 \begin{itemize}
1742 \item More than one user may be included on a reservation. This facilitates
1743 the case where two users schedule the same resource at the same time (for example,
1744 if two users fly together somewhere recreationally).
1745 \item If more than one resource is included on a reservation, the resources need not be
1746 scheduled at the same time. (For example, this accommodates the case where a student may have
1747 some ``ground'' time with a flight instructor before or after flying.)
1748 \item Any number of resources may be present on a reservation.
1749 (For example, a mechanic could reserve three planes at once for reservations.)
1750 \end{itemize}
1751
1752 Note that other rules (not related to database structure) may prohibit
1753 some of the structures above. For example, a student may be prohibited
1754 from scheduling more than one airplane and one instructor.
1755
1756 Zero-length reservations (reservations with $t_0 = t_1$) are currently prohibited.
1757
1758 Reservations can be of three types:
1759
1760 \begin{itemize}
1761 \item \index{active reservation}\index{reservation!active}\textbf{Active Reservations:}
1762 An active reservation is a reservation that currently blocks a resource
1763 (prevents other simultaneous active reservations).
1764 \item \index{standby reservation}\index{reservation!standby}\textbf{Standby Reservations:}
1765 A standby reservation is a reservation that can be promoted to
1766 an active reservation if the conflicting active reservation(s)
1767 are canceled.
1768 \item \index{banner reservation}\index{reservation!banner}\textbf{Banner Reservations:}
1769 A banner reservation is a ``reservation'' that is for
1770 information only, and cannot block active reservations or be
1771 promoted to an active reservation.
1772
1773 A banner reservation is for user information only. Sample
1774 uses of banner reservations:
1775
1776 \begin{itemize}
1777 \item To provide special instructions for scheduling an airplane
1778 or flight instructor. (Example: ``\emph{Please contact Jane
1779 directly to schedule instruction on Mondays}''.)
1780 \item To provide information about an airplane or flight
1781 instructor. (Example: ``\emph{Rates have been
1782 increased to \$100/hr for this aircraft}''.)
1783 \end{itemize}
1784 \end{itemize}
1785
1786 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1787
1788 \subsubsection{Treatment of Standby Reservations}
1789 \label{stdd0:ssby0}
1790
1791 A \index{standby reservation}\index{reservation!standby}\emph{standby reservation}
1792 is a reservation made for resource(s) when the resource is/are already
1793 committed to another reservation(s) at the same time. (\emph{At the same time} means
1794 any form of overlap.)
1795
1796 A standby reservation is represented in exactly the same way as an
1797 \index{active reservation}\index{reservation!active}active reservation, except that
1798 the Boolean table field
1799 \emph{isactive} (see \S{}\ref{sdtf0})
1800 is set FALSE.
1801
1802 Active and standby reservations are manipulated using the following
1803 rules.
1804
1805 \begin{enumerate}
1806 \item The maximum number (i.e. depth) of standby reservations is limited by
1807 a configuration constant in the \emph{TBD} file. If this configuration
1808 constant is 0, standby reservations are not allowed.
1809 \item The maximum depth of standby reservations configuration constant is
1810 only loosely enforced. There are some situations where depth of standby
1811 reservations will be underestimated (due to the computational complexity
1812 of evaluating the true depth), but \emph{at least} the number of configured
1813 standby reservations will be allowed.
1814 \item When a user schedules a reservation, the reservation is created as an
1815 active reservation if there are no resource conflicts. However, if there
1816 are resource conflicts and if the configuration allows it, the user is given the option of
1817 creating a standby reservation.
1818 \item When an active reservation is canceled, one or more standby reservations will be
1819 automatically promoted, if applicable, to occupy the resources freed up. If
1820 permission flags for the canceling user are appropriate, the promotion of standby
1821 reservations may be suppressed.
1822 \item If a cancelation is made too close to the reservation time, (the notion of
1823 ``too close'' is a configuration constant), a standby reservation cannot be
1824 promoted (rationale: not enough time for the person whose reservation is promoted
1825 to react).
1826 \item FBO staff may change active reservations to standby reservations and may promote a
1827 given standby reservation to active (thus changing all conflicting active
1828 reservations to standby reservations),
1829 \textbf{but standby reservations may not have their priority reordered}.
1830 The relative priority of multiple standby reservations is determined by the
1831 creation SGUID---this is an automatic assignment and cannot be changed manually.
1832 \end{enumerate}
1833
1834
1835 E-mail notifications are sent whenever:
1836
1837 \begin{itemize}
1838 \item Standby reservations are automatically or manually
1839 promoted to active reservations.
1840 \item A standby reservation can't be promoted to an active reservation
1841 because an active reservation was modified or deleted too close
1842 to the reservation time.
1843 \end{itemize}
1844
1845 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1846
1847 \subsection{Query Complexity}
1848 \label{stdd0:sqcx0}
1849
1850 It needs to be verified that all of the intended queries and maintenance
1851 operations are approximately $O(\log N)$ (see \S{}\ref{stbg0:sonn0}, p.
1852 \pageref{stbg0:sonn0}). In this section, the major queries are
1853 examined in detail.
1854
1855
1856 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1857
1858 \subsubsection{Resource Scheduling Views}
1859 \label{stdd0:sqcx0:ssvw0}
1860
1861 Scheduling views are perhaps the most important query. Users expect
1862 ``snappy'' response (near-instant display of scheduling information).
1863
1864 A scheduling view is parameterized by:
1865
1866 \begin{itemize}
1867 \item The set of resources whose schedules are to be displayed.
1868 \item The time window, identified by a lower and an upper bound.
1869 \end{itemize}
1870
1871 The set of resources whose scheduling information is to be displayed is a
1872 linear constant. It tends to be either of size one or every resource schedulable.
1873 In any case, it is a small number ($<$100).
1874
1875 The time window is parameterized for an SQL query on key fields.
1876
1877 $O(\log N)$.
1878
1879 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1880
1881 \subsubsection{User Views}
1882 \label{stdd0:sqcx0:suvw0}
1883
1884 All conceivable user views and edits (alphabetical, uid, whatever) are
1885 $O(\log N)$. There may be a few deceptive queries that become $O(N)$, but these
1886 can be massaged.
1887
1888 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1889
1890 \subsubsection{Standby Reservations}
1891 \label{stdd0:sqcx0:ssby0}
1892
1893
1894
1895
1896 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1897
1898 \subsection{Session Management}
1899 \label{stdd0:ssmg0}
1900
1901 TBD.
1902
1903 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1904
1905 \subsection{Mutual Exclusion and Database and Table Locking}
1906 \label{stdd0:sdbl0}
1907
1908 \index{locking (database}\index{database locking}\emph{MySQL} guarantees that
1909 each SQL statement will execute atomically. In many cases, necessary actions
1910 can be phrased as a single SQL statement, and no locking is required. However, in
1911 other cases, complex database updates must be completed atomically and locking
1912 is required.
1913
1914 In addition to database design issues, editing collisions due to the nature
1915 of HTTP must be handled appropriately.\footnote{Among web developers, these collisions
1916 are sometimes called \emph{midair collisions}\@. I don't believe
1917 this is suitable nomenclature in an aviation environment, and so the
1918 term \emph{HTTP editing collision} is used.}
1919 An HTTP editing collision occurs when two [or more] users obtain copies of data
1920 in web browser forms, one user commits changed data back, and the second user
1921 commits different changes, with no knowledge of the changes made by the first user,
1922 and thus may overwrite the first user's changes.
1923
1924 The strategy for mutual exclusion and database/table locking should meet
1925 these requirements and constraints:
1926
1927 \begin{itemize}
1928 \item The strategy must allow a database maintenance script to run concurrently
1929 with web access to the database.
1930 \item The strategy must not block web page views for too long (never longer than 1-4 seconds,
1931 and no delay for the vast majority of web page accesses).
1932 \item The strategy must be fair: no process should block indefinitely.
1933 \item The strategy should be simple.
1934 \item The strategy must at least detect and optionally correct HTTP editing collisions.
1935 \end{itemize}
1936
1937 The strategy employed is:
1938
1939 \begin{itemize}
1940 \item Any process (either maintenance or web access) that has mutual exclusion needs
1941 locks the entire database (rather than locking individual tables).
1942 \begin{itemize}
1943 \item This strategy is very simple.
1944 \item This strategy prevents the possibility of deadlock (due to ordering of table locks).
1945 \item This strategy inherently serializes and is fair (because of \emph{MySQL}'s behavior).
1946 \item Maintenance scripts can be written to check and correct the database
1947 incrementally and to lock the database only for short periods of time,
1948 thus not blocking web users for too long.
1949 \end{itemize}
1950 \item In any scenario where an HTTP editing collision is a potential problem:
1951 \begin{itemize}
1952 \item An SGUID is stored on a database record commit.
1953 \item The SGUID is provided as a hidden form field on editing pages.
1954 \item At the time a commit is attempted, if the SGUID held by the browser is different than the
1955 one in the database, there has been an editing collision. In this case, at minimum
1956 notification is made.
1957 \end{itemize}
1958 \end{itemize}
1959
1960 Finally, database locking has the standard software problem of how to embed a critical
1961 section within another critical section. The pseudo-code below should suffice.
1962
1963 \begin{verbatim}
1964 local_lock_var = global_lock_var;
1965 lock_database();
1966 global_lock_var = TRUE;
1967
1968 ...
1969 Take action, perhaps calling sub-functions with
1970 identical pseudo-code.
1971 ...
1972
1973 if (! local_lock_var)
1974 {
1975 unlock_database();
1976 global_lock_var = FALSE;
1977 }
1978 \end{verbatim}
1979
1980 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1981
1982 \section{Web Pages}
1983 \label{swpg0}
1984
1985 TBD.
1986
1987 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1988
1989 \subsection{\texttt{index.php} (Scheduler Entry Page / All Scheduling Views)}
1990 \label{swpg0:siph0}
1991
1992 TBD.
1993
1994 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1995
1996 \subsection{\texttt{logview.php} (Action / Event / Exception Log View)}
1997 \label{swpg0:slvw0}
1998
1999 TBD.
2000
2001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2002
2003 \subsection{\texttt{resourceadd.php} (Resource Addition)}
2004 \label{swpg0:srad0}
2005
2006 TBD.
2007
2008 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2009
2010 \subsection{\texttt{resourceedit.php} (Resource Edit)}
2011 \label{swpg0:sred0}
2012
2013 TBD.
2014
2015 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2016
2017 \subsection{\texttt{resourcemanage.php} (Resource List / Select Action)}
2018 \label{swpg0:srmg0}
2019
2020 TBD.
2021
2022 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2023
2024 \subsection{\texttt{resourceview.php} (Resource View)}
2025 \label{swpg0:srvw0}
2026
2027 TBD.
2028
2029 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2030
2031 \subsection{\texttt{signupadd.php} (Signup Addition)}
2032 \label{swpg0:ssad0}
2033
2034 TBD.
2035
2036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2037
2038 \subsection{\texttt{signupedit.php} (Signup Edit)}
2039 \label{swpg0:ssed0}
2040
2041 TBD.
2042
2043 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2044
2045 \subsection{\texttt{signupmanage.php} (Signup List / Select Action)}
2046 \label{swpg0:ssmg0}
2047
2048 TBD.
2049
2050 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2051
2052 \subsection{\texttt{signupview.php} (Signup View)}
2053 \label{swpg0:ssvw0}
2054
2055 TBD.
2056
2057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2058
2059 \subsection{\texttt{useradd.php} (User Addition)}
2060 \label{swpg0:susd0}
2061
2062 TBD.
2063
2064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2065
2066 \subsection{\texttt{useredit.php} (User Edit)}
2067 \label{swpg0:suse0}
2068
2069 TBD.
2070
2071 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2072
2073 \subsection{\texttt{useremail.php} (Send Mass E-mail / Announcement to Users)}
2074 \label{swpg0:seus0}
2075
2076 TBD.
2077
2078 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2079
2080 \subsection{\texttt{usermanage.php} (User List / Select Action)}
2081 \label{swpg0:sumg0}
2082
2083 TBD.
2084
2085 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2086
2087 \subsection{\texttt{userview.php} (User View)}
2088 \label{swpg0:suvw0}
2089
2090 TBD.
2091
2092 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2093
2094 \section{Standalone Scripts}
2095 \label{ssas0}
2096
2097 TBD.
2098
2099 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2100
2101 \subsection{\texttt{adminforce.php} (Emergency Administrator Password Reset)}
2102 \label{ssas0:samf0}
2103
2104 TBD.
2105
2106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2107
2108 \subsection{\texttt{dbconncheck.php} (Database Connectivity and Authentication Check)}
2109 \label{ssas0:sdbc0}
2110
2111 \index{dbconncheck.php@\texttt{dbconncheck.php}}The \texttt{dbconncheck.php}
2112 script takes the following actions:
2113
2114 \begin{itemize}
2115 \item Attempts to connect and authenticate to the \emph{MySQL} daemon
2116 using the information in
2117 \index{config.inc@\texttt{config.inc}}\texttt{config.inc}.
2118 \item Attempts to select the database specified in the
2119 \texttt{config.inc}.
2120 \item Attempts to close the \emph{MySQL} connection.
2121 \item Announces failure or success and provides details.
2122 \end{itemize}
2123
2124 The \texttt{dbconncheck.php} can be used to verify \emph{MySQL} database connectivity
2125 during the \emph{\productbasename{}} setup process.
2126
2127 The \texttt{dbconncheck.php} script takes no command-line parameters (it receives
2128 the \emph{MySQL} connection it requires by including \emph{PHP} library files).
2129
2130
2131 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2132
2133 \subsection{\texttt{dbinit.php} (Database Initialization and Upgrade)}
2134 \label{ssas0:sdbi0}
2135
2136 TBD.
2137
2138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2139
2140 \subsection{\texttt{mainthot.php} (In-Service Daily Database Maintenance)}
2141 \label{ssas0:smah0}
2142
2143 TBD.
2144
2145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2146
2147 \subsection{\texttt{phplibset.php} (Source File PHP Library Path Modification)}
2148 \label{ssas0:sphl0}
2149
2150 TBD.
2151
2152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2153
2154 \subsection{\texttt{sitehashkeygen.php} (Source Hash Key Generation)}
2155 \label{ssas0:shkg0}
2156
2157 The \index{sitehashkeygen.php@\emph{sitehashkeygen.php}}\texttt{sitehashkeygen.php}
2158 script generates a suitable site hash key as a constant in a PHP include file
2159 and places it in a file named \emph{sitehashkey.inc}.
2160
2161 By default, the \emph{sitehashkey.inc} is placed in the current working directory.
2162 However, the \texttt{sitehashkeygen.php} script accepts an optional parameter,
2163 the directory in which to place the file.
2164
2165 \begin{figure}
2166 \begin{scriptsize}
2167 \begin{verbatim}
2168 <?php
2169 //This PHP include file contains the FboPrime site hash key. This key is
2170 //normally automatically generated at the time the software is set up.
2171 //This key can be edited by hand safely--it is just an ordinary string of
2172 //arbitrary length. However, if it is manually edited, it should be
2173 //edited only at the time the system is set up. Modifying this key on a
2174 //working system will invalidate every user password and may have other ill
2175 //effects as well.
2176 //
2177 //Permissions on this file should be set so that FboPrime users cannot view
2178 //its contents (it should be private to the Apache server). If FboPrime
2179 //users can view this key, it may enable some security attacks on the
2180 //FboPrime software (as users may be able to forge some data).
2181 //
2182 //Generating program: $RCSfile: manual.tex,v $
2183 //Generating program CVS revision: $Revision: 1.36 $
2184 //Generating program CVS revision date: $Date: 2006/04/10 04:28:07 $
2185 //Time of key generation: 05-Feb-2006 14:15:26 (UTC -0500)
2186 //------------------------------------------------------------------------------------------
2187 define("SITEHASHKEY_SITEHASHKEY", "5bc9fc5b2fafd50c5ac9c267f03fecb1668cf4de80f37f392b" .
2188 "2fbe0fefd0e5f76G[o6BCR.pitb[z-GOgdk=3GzdwU=I2)8>ff" .
2189 "vS(s17Wc,f?F*fS70WOz<3dUMfLV9=<FCZ[D(OQ/-PtQ*5Y*=w" .
2190 "nUzAy5Q3_Z*ToqCg*r*DgRbJq?O8*zEad.LL2kO-3CGr+1HPtv" );
2191 ?>
2192 \end{verbatim}
2193 \end{scriptsize}
2194 \caption{Format of Automatically-Generated \emph{sitehashkey.inc} File}
2195 \label{fig:ssas0:shkg0:00}
2196 \end{figure}
2197
2198 A typical automatically-generated
2199 \emph{sitehashkey.inc} file is shown in Figure \ref{fig:ssas0:shkg0:00}.
2200
2201 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2202
2203 \subsection{\texttt{sbyrespromote.php} (Promotion of Standby Reservations)}
2204 \label{ssas0:spsr0}
2205
2206 TBD.
2207
2208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2209
2210 \section{PHP Library Files}
2211 \label{sphl0}
2212
2213 TBD.
2214
2215 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2216
2217 \subsection{\texttt{config.inc} (Global Configuration Constants)}
2218 \label{sphl0:siph0}
2219
2220 \index{config.inc@\texttt{config.inc}}The \texttt{config.inc} file contains particulars
2221 of the FBO and the installation, including:
2222
2223 \begin{itemize}
2224 \item FBO location and contact information (mailing address, phone numbers, etc.).
2225 \item Database connection information (host, database, userid, and password information).
2226 \item Behavioral constants (scheduling and data retention policy).
2227 \end{itemize}
2228
2229 This file must be customized as part of the
2230 \emph{\productbasename{}} installation process.
2231
2232 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2233
2234 \subsection{\texttt{confighard.inc} (Global Unmodifyable Configuration Constants)}
2235 \label{sphl0:scfh1}
2236
2237 \index{confighard.inc@\texttt{confighard.inc}}The \texttt{confighard.inc} file contains
2238 global configuration constants that either:
2239
2240 \begin{itemize}
2241 \item Would not need to be configured by the FBO, or
2242 \item Are bound tightly to the code and so can't be changed without also
2243 changing the code.
2244 \end{itemize}
2245
2246 The constants in this file should not be changed by the users of the
2247 \emph{\productbasename{}} software.
2248
2249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2250
2251 \subsection{\texttt{crhsh.inc} (Cryptographic Hash Functions)}
2252 \label{sphl0:schf0}
2253
2254 \index{crhsh.inc@\texttt{crhsh.inc}}The \texttt{crhsh.inc} file
2255 contains functions dealing with cryptographic hashes.
2256
2257 See \S{}\ref{stbg0:smdf0}, \S{}\ref{stbg0:sfch0}, and \S{}\ref{stbg0:spst0}.
2258
2259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2260
2261 \subsection{\texttt{datefunc.inc} (Date Calculation and Related Functions)}
2262 \label{sphl0:sdfc0}
2263
2264 \index{datefunc.inc@\texttt{datefunc.inc}}The \texttt{datefunc.inc} file
2265 contains functions that perform date calculations
2266 (for example, date differences and the day of the week corresponding
2267 to an arbitrary date). Many of the calculations are based on modulo
2268 arithmetic.
2269
2270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2271
2272 \subsection{\texttt{sitehashkey.inc} (Site Hash Key)}
2273 \label{sphl0:sshk0}
2274
2275 \index{sitehaskey.inc@\texttt{sitehashkey.inc}}The \texttt{sitehashkey.inc} file contains
2276 the site hash key. This file is normally automatically generated by the
2277 \index{sitehashkeygen.php@\emph{sitehashkeygen.php}}\texttt{sitehashkeygen.php}
2278 script as part of the \emph{\productbasename{}} installation process.
2279
2280 Please see:
2281
2282 \begin{itemize}
2283 \item \S{}\ref{sins0:sssi0:sgsh0} (p. \pageref{sins0:sssi0:sgsh0})
2284 for instructions about how to execute the \texttt{sitehashkeygen.php}
2285 script to generate the \texttt{sitehashkey.inc} file.
2286 \item \S{}\ref{ssas0:shkg0} (p. \pageref{ssas0:shkg0})
2287 for a description of the \texttt{sitehashkeygen.php}
2288 script.
2289 \item Fig. \ref{fig:ssas0:shkg0:00} (p. \pageref{fig:ssas0:shkg0:00})
2290 for the typical format of a site hash key.
2291 \end{itemize}
2292
2293 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2294
2295 \subsection{\texttt{timeraw.inc} (Raw Time Acquisition)}
2296 \label{sphl0:strw0}
2297
2298 \index{timeraw.inc@\texttt{timeraw.inc}}The \texttt{timeraw.inc} file contains
2299 functions that obtain the raw time from the server's clock.
2300
2301 Functions that obtain the raw time are localized in one file to ease
2302 Unix epoch issue changes if they have to be made.
2303
2304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2305
2306 \subsection{\texttt{utime.inc} (UTIME Acquisition and Operations)}
2307 \label{sphl0:sutm0}
2308
2309 \index{utime.inc@\texttt{utime.inc}}The \texttt{utime.inc} file contains
2310 functions that:
2311
2312 \begin{itemize}
2313 \item Obtain the raw time from the server's clock in the UTIME
2314 format (described in \S{}\ref{stdd0:sdty0:sutm0}).
2315 \item Perform operations on the UTIME data type
2316 (described in \S{}\ref{stdd0:sdty0:sutm0}).
2317 \end{itemize}
2318
2319 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2320
2321 \clearpage{}
2322 \section{\emph{MySQL} Database Tables and Fields}
2323 \label{sdtf0}
2324
2325 This section provides a detailed description of each \emph{MySQL} database table
2326 and field. Documentation is maintained in this document rather than in
2327 the software source code.
2328
2329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2330 \subsection{\emph{usrs} (Users) Table}
2331 \label{sdtf0:susr0}
2332
2333 The \emph{usrs} table contains information about each user, with each user stored in
2334 one database row.
2335
2336 \begin{docdbtblfielddef}
2337
2338 \item \index{uidx@\emph{uidx}}\textbf{\emph{uidx} (int)}
2339
2340 An integer index identifying the user, automatically assigned by the
2341 \emph{MySQL} database.
2342
2343 In many contexts (GET and POST parameters, for example), this index is
2344 used to identify a user. It provides a generally shorter way to identify
2345 a user than the \emph{userid}.
2346
2347 \item \index{userid@\emph{userid}}\textbf{\emph{userid} (varchar[20])}
2348
2349 The text string used to log in to the
2350 \emph{\productbasename{}} software. In the database table,
2351 this string is always stored in lower-case, but the software treats
2352 this string as case-insensitive when it is entered by a user.
2353
2354 This string must begin with a letter, and may contain letters and
2355 digits only.
2356
2357 The FBO may assign this text string arbitrarily. Common conventions
2358 are to use the first initial and last name (example: \emph{dashley}),
2359 first and middle initial and last name (example: \emph{dtashley}),
2360 or a nickname (example: \emph{womanizer}).
2361 \end{docdbtblfielddef}
2362
2363
2364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2365 \subsection{\emph{resv} (Reservations) Table}
2366 \label{sdtf0:srsv0}
2367
2368 \index{resv@\emph{resv}}The
2369 \emph{resv} table contains one record for each reservation.
2370
2371 \begin{docdbtblfielddef}
2372 \item \index{ridx@\emph{ridx}}\textbf{\emph{ridx} (int64)}
2373
2374 An integer index identifying the reservation, automatically
2375 assigned by the \emph{MySQL} database.
2376
2377 \item \index{sstime@\emph{sstime}}\textbf{\emph{sstime} (char[14])}
2378
2379 An STIME string identifying the start time of the reservation. This is
2380 necessarily the minimum of the start times of any of the \emph{slot}s linked
2381 to the reservation, and is used to facilitate more efficient queries.
2382
2383 \item \index{estime@\emph{estime}}\textbf{\emph{estime} (char[14])}
2384
2385 An STIME string identifying the end time of the reservation. This is
2386 necessarily the maximum of the end times of any of the \emph{slot}s linked
2387 to the reservation, and is used to facilitate more efficient queries.
2388
2389 \item \index{csguid@\emph{csguid}}\textbf{\emph{csguid} (SGUID)}
2390
2391 An SGUID assigned at the time the reservation is created. This provides
2392 information about when the reservation is created, and also provides a
2393 guaranteed unique sort order for standby reservations.
2394
2395 \item \index{msguid@\emph{msguid}}\textbf{\emph{msguid} (SGUID)}
2396
2397 An SGUID assigned at the time the reservation is created or modified.
2398 This is used to prevent editing collisions and double-commits.
2399
2400 \item \index{isactive@\emph{isactive}}\textbf{\emph{isactive} (BOOLEAN)}
2401
2402 TRUE if the reservation is an
2403 \index{active reservation}\index{reservation!active}active reservation,
2404 or FALSE if the reservation is a standby reservation.
2405 \end{docdbtblfielddef}
2406
2407 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2408 \subsection{\emph{slot} (Slots) Table}
2409 \label{sdtf0:sslt0}
2410
2411 \index{slot@\emph{slot}}
2412
2413 TBD.
2414
2415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2416 \subsection{\emph{rscs} (Resources) Table}
2417 \label{sdtf0:srsc0}
2418
2419 \index{rscs@\emph{rscs}}
2420
2421 TBD.
2422
2423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2424 \subsection{\emph{sper} (Scheduling Permissions) Table}
2425 \label{sdtf0:sspr0}
2426
2427 \index{sper@\emph{sper}}
2428
2429 TBD.
2430
2431 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2432 \subsection{\emph{sess} (Sessions) Table}
2433 \label{sdtf0:sses0}
2434
2435 \index{sess@\emph{sess}}
2436
2437 TBD.
2438
2439 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2440 \subsection{\emph{loge} (Log Entries) Table}
2441 \label{sdtf0:slge0}
2442
2443 \index{loge@\emph{loge}}
2444
2445 TBD.
2446
2447 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2448 \subsection{\emph{dpar} (Database Parameters) Table}
2449 \label{sdtf0:sdpr0}
2450
2451 \index{dpar@\emph{dpar}}
2452
2453 TBD.
2454
2455
2456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2457
2458 \clearpage{}
2459 \section{User Permission Flags and Values}
2460 \label{supf0}
2461
2462 \begin{docdbtblfielddef}
2463
2464 \item \index{slvl@\emph{slvl}}\textbf{\emph{slvl} (Security Level)}
2465
2466 The general security level of the user. Security levels are in descending
2467 security order. In general, a user at security level $n$
2468 cannot modify the settings of users with security level $<n$.
2469
2470 The levels used are:
2471
2472 \begin{itemize}
2473 \item \textbf{0:}
2474 System administrators.
2475 \item \textbf{1:}
2476 FBO management and senior staff.
2477 \item \textbf{2:}
2478 Flight instructors and mechanics.
2479 \item \textbf{3:}
2480 Line employees.
2481 \item \textbf{4:}
2482 Customers.
2483 \end{itemize}
2484
2485 \end{docdbtblfielddef}
2486
2487 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2488
2489 \clearpage{}
2490 \section{Glossary of Database Parameters}
2491 \label{sgld0}
2492
2493 This glossary describes the parameters that may be stored in the
2494 \emph{dpar} database table (see \S{}\ref{sdtf0:sdpr0}).
2495
2496 \begin{docglossaryenum}
2497 \item \index{MAINT_SCRIPT_ACTIVE@\emph{MAINT\_SCRIPT\_ACTIVE}}\textbf{MAINT\_SCRIPT\_ACTIVE}
2498
2499 Has the value of `0' if the maintenance script is not active, or
2500 the value of a UTIME (described in \S{}\ref{stdd0:sdty0:sutm0}) representing
2501 the time at which the maintenance script was started if the
2502 maintenance script is active.
2503
2504 This parameter is used
2505 so that a second instance of the maintenance script cannot be started while
2506 an earlier invocation is still in progress.
2507
2508 This parameter is also used to detect when a maintenance script has
2509 been terminated abormally, so that future invocations are not
2510 blocked indefinitely. The criterion used is that the maintenance
2511 script has apparently been active for too long (this can easily
2512 be determined from the UTIME value).
2513
2514 \item \index{FBOPRIME_VERSION@\emph{FBOPRIME\_VERSION}}\textbf{FBOPRIME\_VERSION}
2515
2516 The version number of \emph{\productbasename{}} that created the database.
2517 This version number is used only for database upgrades.
2518 The version of \emph{\productbasename{}} described by this document is
2519 \emph{\productversion{}}.
2520 \end{docglossaryenum}
2521
2522
2523 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2524
2525 \clearpage{}
2526 \section{Glossary of GET/POST Parameters}
2527 \label{sglo0}
2528
2529 TBD.
2530
2531 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2532
2533 \clearpage{}
2534 \section{Glossary of Terms, Acronyms, and Nomenclature}
2535 \label{sglo1}
2536
2537 \begin{docglossaryenum}
2538
2539 \item \index{GMT}\textbf{GMT}
2540
2541 See \emph{UTC} in this section.
2542
2543 \item \textbf{MAC}\index{MAS@\emph{MAC}}
2544
2545 Marshall Aviation Center.
2546
2547 \item \textbf{MAS}\index{MAS@\emph{MAS}}
2548
2549 Metzger's Aircraft Services.
2550
2551 \item \index{UTC}\textbf{UTC}
2552
2553 \emph{UTC} (universal time)
2554 is the time kept on the Greenwich meridian (longitude zero), and is
2555 normally five hours ahead of
2556 \index{Eastern Standard Time}Eastern Standard Time (\index{EST}EST).
2557 UTC is sometimes also called
2558 \index{GMT}GMT (\index{Greenwich Mean Time}Greenwich Mean Time)
2559 or \index{Zulu time}Zulu time.
2560
2561 \end{docglossaryenum}
2562
2563
2564 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2565 \clearpage{}
2566 \addcontentsline{toc}{section}{References}
2567
2568 \begin{thebibliography}{000}
2569 \bibitem{bibref:com:kalsoft}
2570 \index{Kalamazoo Software}\emph{Kalamazoo Software}\\
2571 \texttt{http://www.kal-soft.com}
2572 \bibitem{bibref:i:masternakdawn}
2573 \index{Masternak, Dawn}\emph{Dawn Masternak}\\
2574 \texttt{d\_masternak@hotmail.com}
2575 \bibitem{bibref:i:whitingtheresa}
2576 \index{Whiting, Theresa}\emph{Theresa Whiting}\\
2577 \texttt{limeshoes@yahoo.com}
2578 \bibitem{bibref:i:wynjadaniel}
2579 \index{Wynja, Daniel}\emph{Daniel Wynja}\\
2580 \texttt{danielwynja@hotmail.com}
2581 \bibitem{bibref:i:metzgereric}
2582 \index{Metzger, Eric}\emph{Eric Metzger}\\
2583 \texttt{ericmetzger@charter.net}
2584 \bibitem{bibref:i:ashleydavidt}
2585 \index{Ashley, David}\emph{Ashley, David}\\
2586 \texttt{dta@e3ft.com}
2587 \bibitem{bibref:p:ors}
2588 \index{ORS@\emph{ORS}}\emph{ORS} (\emph{O}nline \emph{R}esource \emph{S}cheduler)\\
2589 \texttt{http://ors.sourceforge.net}
2590 \bibitem{bibref:hagenhostingweb}
2591 \index{Hagen Hosting}\emph{Hagen Hosting}\\
2592 \texttt{http://www.hagenhosting.com}
2593 \bibitem{bibref:c:mysql}
2594 \index{MySQL@\emph{MySQL}}\emph{MySQL} \\
2595 \texttt{http://www.mysql.com}
2596 \bibitem{bibref:annarboraviationcenterweb}
2597 \emph{Ann Arbor Aviation Center} \\
2598 \texttt{http://www.aviationcenter.aero}
2599 \bibitem{bibref:gnuorgweb}
2600 \emph{GNU} \\
2601 \texttt{http://www.gnu.org}
2602 \bibitem{bibref:rfc1321}
2603 \index{RFC 1321}\index{MD5 message digest algorithm}\emph{RFC 1321---The MD5 Message-Digest Algorithm} \\
2604 \texttt{http://www.faqs.org/rfcs/rfc1321.html}
2605 \bibitem{bibref:i:rostamianrouben}
2606 \index{Rostamian, Rouben}\emph{Rouben Rostamian}\\
2607 \texttt{rouben@pc18.math.umbc.edu}
2608 \end{thebibliography}
2609
2610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2611 \clearpage{}
2612 \addcontentsline{toc}{section}{Index}
2613 \printindex
2614 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2615 \end{document}
2616 %
2617 %$Log: manual.tex,v $
2618 %Revision 1.36 2006/04/10 04:28:07 dashley
2619 %Edits.
2620 %
2621 %Revision 1.35 2006/04/08 04:03:02 dashley
2622 %Edits.
2623 %
2624 %Revision 1.34 2006/04/08 00:25:11 dashley
2625 %Edits.
2626 %
2627 %Revision 1.33 2006/04/05 02:04:35 dashley
2628 %Edits.
2629 %
2630 %Revision 1.32 2006/04/02 23:18:42 dashley
2631 %Edits.
2632 %
2633 %End of $RCSfile: manual.tex,v $.
2634

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25