FreeUDFLib is a free UDF library for use with InterBase databases. It is written in Delphi, and all source code is provided. Just because it is free, however, does not mean that it is public domain. If you have questions regarding your rights, please see see section Licensing.
Hoagland, Longo, Moran, Dunst & Doukas is a law firm in New Brunswick, NJ. This law firm is one of the most technologically advanced law firms in New Jersey, due largely to the fact that their management team has a uniquely clear vision of the future use of technology in the legal field.
Hoagland, Longo, Moran, Dunst & Doukas is dedicated to providing quality legal services to the business community, healthcare and insurance industries. Since our founding in 1977 we have handled thousands of matters spanning the spectrum of business transactions and civil litigation including automobile negligence, commercial litigation, construction claims, coverage, D and O liability, employment practices liability, environmental claims, general liability, municipal liability, products liability, professional liability and workers compensation.
Very special thanks goes to Hoagland, Longo, Moran, Dunst & Doukas. If you ever require legal representation in the New Jersey area, you might want to look these guys up.
InterBase corporation has provided their support by providing a home for both FreeUDFLib and FreeUDFLib (see section About the author).
Obviously, without InterBase, FreeUDFLib would be virtually meaningless, so a special thanks goes to all at InterBase, with a strong vote of support to please continue the outstanding work!
Here is a list of all who have contributed or otherwise supported the project. If your name has been omitted, it is not on purpose:
Since FreeUDFLib is free, it is important to give developers a sense of what kind of support they can expect. Although there are no guarantees of any kind, I want to give developers reasonable assurances of what they can, in general, expect from me.
I believe that there are four basic levels of support developers require:
FreeUDFLib is intended to be used in production environments! To that end, a demonstrated bug will be fixed as promptly as possible.
Because FreeUDFLib is completely free, developers also have access to the source code. If a bug is fixed, send it to me, and I will incorporate it in future "official releases" of the product.
If a bug cannot be replicated, I will have a difficult time finding it, so I can't guarantee resolution of these so-called phantom bugs, but I will do my best to resolve them.
If you provide me with a bug fix, your name will be included in the acknowledgements section of this manual. Bug reports should be submitted as e-mail messages only.
The policy on resolving source code bugs also stands for correcting and maintaining good documentation. Please send me any and all corrections and/or enhancements to the documentation. Every product needs thorough and complete documentation. Even though this product is free, I have a desire to see it used in all environments. I can't expect a developer to use it if there is no documentation.
I can't guarantee that I will respond to you, only that your comments will be heard and possibly included in future releases.
Users can feel free to provide me with wish list requests and/or FreeUDFLib enhancements.
If you send me a wish list request, you will not receive a response from me, but you can be assured that your request will be considered for future releases.
If you send me an enhancement or extension to FreeUDFLib that you would like included in the distribution, I will consider it and respond accordingly. Keep in mind, however, that FreeUDFLib and all source code is free. Do not even think about asking to distribute proprietary products with FreeUDFLib.
If I distribute product enhancements written by others than myself, their names will be included in the acknowledgements section of this manual, and their source code will be acknowledged appropriately.
I don't do help desk support, at least not in general. You can feel free to e-mail me with questions, but it is more likely than not that you will not receive a response from me.
Help desk style questions should be directed to an appropriate Internet support group. The mailing list INTERBASE@dx100.mers.com, for example, provides excellent support for InterBase related questions.
If you absolutely require my assistance for some issue, I can provide services for standard consulting rates.
I have used a product called texinfo to produce all documentation for FreeUDFLib.
From a single source file, I can produce a formatted manual, ready for print-out (using tex), I can produce html, ready for viewing in a browser, and I can produce rich-text for the production of a help file.
I don't see the need for producing a help file, so I haven't included one... just the original texinfo documentation, a ready-produced Acrobat file, and a single HTML manual.
If the reader wishes to find more information on using texinfo with Windows, search the internet for "GNU tex texinfo Windows". (O yeah, texinfo is free, protected under the GNU Public License)
By default, FreeUDFLib uses thread-local variables to return strings and dates to InterBase. There has been some speculation that thread-local variables don't work as well as they should, although I haven't been able to verify the speculation, (nor has InterBase, for that matter).
However, FreeUDFLib can now be built to use dynamic memory allocation (with free_it) as opposed to thread-locals. In `udf_glob.pas', just uncomment the conditional define called FREE_IT.
{$FREE_IT}
This allows you to declare all string and date UDFs with the free_it convention.
New stuff:
Several functions were removed which did not work, and so were cluttering up the source.
Thread-safety has been pretty rigorously tested. Users should not have any problems with FreeUDFLib.
New functions:
EvaluateExpression
: evalute a textual expression with support for
symbols and string, date and numeric literals.
After unzipping FreeUDFLib.zip
, copy `FreeUDFLib.dll' to the
InterBase bin directory, most probably
c:\Program Files\InterBase Corp\InterBase\Bin - or - c:\Program Files\Borland\IntrBase\Bin
Whenever you require the use of FreeUDFLib in an InterBase database, run the `ext_funcs.sql' SQL script against the database.
GENERAL SOFTWARE LICENSE AGREEMENT CAUTION: THE COPYING, MODIFICATION, TRANSLATION OR DISTRIBUTION OF THE OBJECT CODE, PROGRAM, SOFTWARE OR SOURCE CODE IMPLIES ACCEPTANCE OF THE TERMS OF THIS GENERAL SOFTWARE PROGRAM LICENSE AGREEMENT. YOU SHOULD READ CAREFULLY THE FOLLOWING TERMS AND CONDITIONS BEFORE YOU COPY, MODIFY, TRANSLATE OR DISTRIBUTE THE OBJECT CODE, PROGRAM, SOFTWARE OR SOURCE CODE.
1.0 DEFINITIONS
1.1 Licensee - The person who has the privilege to copy, modify, translate or distribute the object code, program, software and source code, subject to the terms and conditions of this General Software License Agreement.
1.2 Object Code - The version of a computer program in machine language, and therefore, ready to be executed by the computer.
1.3 Program - A sequence of instructions for executions by a computer.
1.4 Software - The computer program plus program documentation, if applicable.
1.5 Source Code - The version of a computer program in assembly language or high-level language, and therefore, not ready to be executed by the computer.
1.6 Work - All forms of tangible or intangible property, based whole, in part or derived from the object code, program, software or source code.
1.7 You - The person who has the privilege to copy, modify, translate or distribute the object code, program, software and source code, subject to the terms and conditions of this General Software License Agreement.
2.0 LICENSE
2.1 The copyright holder hereby extends a license to you to use its copyrighted object code, program, software and source code, subject to the terms and conditions of this General Software License Agreement.
2.2 This license is applicable to the object code, program, software and source code distributed under the terms of this General Software License Agreement, any work containing the object code, program, software or source code distributed under the terms of this General Software License Agreement, any modification of the object code, program, software or source code distributed under the terms of this General Software License Agreement, any translation of the object code, program, software or source code distributed under the terms of this General Software License Agreement and any work containing a modification or translation of the object code, program, software or source code distributed pursuant to the terms and conditions of this General Software License Agreement.
2.3 You may copy, modify, translate and distribute the object code, program, software or source code distributed under the terms of this General Software License Agreement, subject to the terms and conditions of this General Software License Agreement.
2.4 If you copy, modify, translate or distribute the object code, program, software or source code distributed under the terms of this General Software License Agreement, you must publish and make known in a clear and conspicuous manner on each copy, modification, translation or distribution of the object code, program, software or source code that the copy, modification, translation or distribution of the object code, program, software or source code is subject to the terms and conditions of this General Software License Agreement and provide a copy of this General Software License Agreement with each copy, modification, translation or distribution of the object code, program, software or source code.
2.5 If you derive, publish or distribute any work that is based whole or in part on the object code, program, software or source code distributed under the terms of this General Software License Agreement, or any modification or translation thereof, you must publish and make known in a clear and conspicuous manner on each such work that the work is subject to the terms and conditions of this General Software License Agreement and provide a copy of this General Software License Agreement with each work.
2.6 If you copy, modify, translate or distribute the object code, program, software or source code distributed under the terms and conditions of this General Software License Agreement, you must provide clear and conspicuous notice that you have copied, modified, translated or distributed the object code, program, software or source code distributed under the terms of this General Software License Agreement, and indicate the date of each such copy, modification, translation or distribution.
2.7 If you copy, modify, translate or distribute the object code, program, software or source code distributed under the terms of this General Software License Agreement, or publish or distribute any work that is derived, in whole or in part, from any copy, modification, translation or distribution of the object code, program, software or source code distributed under the terms of this General Software License Agreement, you cannot impose any further obligations or restrictions on any third person or entity other than what is contained in this General Software License Agreement.
3.0 NO WARRANTY
3.1 THE OBJECT CODE, PROGRAM, SOFTWARE AND SOURCE CODE ARE PROVIDED "AS IS" WITHOUT ANY WARRANT OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR USE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE OBJECT CODE, PROGRAM, SOFTWARE AND SOURCE CODE IS WITH YOU. SHOULD THE OBJECT CODE, PROGRAM, SOFTWARE AND SOURCE CODE PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
4.0 LIMITATION OF DAMAGES
4.1 IN NO EVENT WILL THE COPYRIGHT HOLDER OR ANY OTHER PERSON OR ENTITY BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS, COMPENSATORY, GENERAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR THE INABILITY TO USE THE OBJECT CODE, PROGRAM, SOFTWARE AND SOURCE CODE, EVEN IF THE COPYRIGHT HOLDER OR ANY OTHER PERSON OR ENTITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
5.0 MISCELLANEOUS
5.1 The article and paragraph headings appearing in this General Software License Agreement have been asserted for the purpose of convenience and ready reference. They do not purport to, and shall not be deemed to define, limit, or extend the scope or intent of the articles and paragraphs to which they pertain.
5.2 This General Software License Agreement embodies the entire agreement respecting its subject matter. There are no promises, terms, conditions or obligations other than those expressly set forth herein. Unless otherwise expressly set forth herein, this General Software License Agreement supersedes all previous communications, representations, agreements, either verbal or written, warranties, promises, covenants or undertakings. 5.3 This General Software License Agreement shall not be modified, altered, amended or supplemented, except in writing signed by all parties hereto.
5.4 This General Software License Agreement shall be governed by the laws of the State of New Jersey.
The below functions are now considered obsolete. At some point in future releases of FreeUDFLib, they will no longer exist.
When a developer has a convincing argument as to why FreeUDFLib should continue to include the function, please let me know, and I will consider your argument.
UserMaintenance
is not a terribly useful function for
adding and deleting users. It asks IB to start the gsec procedure on the
server to add users, etc... Instead, the IBPassword
function can
be used with a direct connection to ISC4.GDB for adding, deleting and
modifying users.
Below is a list of all available routines. When appropriate, addition documentation will be provided. [This section is not complete, as the user can tell]
declare external function f_Character integer returns cstring(2) entry_point 'Character' module_name 'FreeUDFLib.dll';
declare external function f_CRLF returns cstring(3) entry_point 'CRLF' module_name 'FreeUDFLib.dll';
A format string is constructed as follows:
Commands: \<pretext>\<posttext>\P --> name prefix \<pretext>\<posttext>\F --> first name \<pretext>\<posttext>\M --> middle initial \<pretext>\<posttext>\L --> last name \<pretext>\<posttext>\S --> name suffix @ - escape character; anything following an will be printed as a literal --options (affect the entire string)-- \\\A --> print only alpha's, i.e. strip string of anything but alpha's \\\9 --> print only alpha's and numeric's, i.e. strip string of everything but alpha's \\\U --> uppercase string
All other strings are just printed as-is.
You use "pretext" and "posttext" values when the text preceding or succeeding a field depends on the presence of a value in the field. An example:
format string = '\\ \P\\ \F\\. \M\\\L\, \\S' 1. Name Prefix = Mr. First name = John Middle initial = M Last name = Smith Name suffix = III GenerateFormattedName yields Mr. John M. Smith, III 2. Same as (1), but Name prefix is blank Middle initial is blank Name suffix is blank GenerateFormattedName yields John Smith 3. Same as (1), but Name prefix is blank Name suffix is blank GenerateFormattedName yields John M. Smith
This function is convenient, but it is not, in general, terribly useful. After all, it won't ProperCase O'Connor correctly, or McNamara.
NOTE: This function is not yet implemented.
NOTE: This function is not yet implemented.
SetDebuggerOutput
, and Debug
.
This function closes whatever the currently set output handle is.
SetDebuggerOutput
and
CloseDebuggerOutput
. This function writes a string to the
currently set debugger handle.
A billing expression is
EvaluateCycleExpression('3', 0, '1/1/98', '4/1/98', 0) = 1; EvaluateCycleExpression('3', 0, '1/1/98', '3/1/98', 0) = 0;
EvaluateCycleExpression('>6', 0, '1/1/98', '8/1/98', 0) = 1; EvaluateCycleExpression('3', 0, '1/1/98', '3/1/98', 0) = 0;
EvaluateCycleExpression('$1000', 0, '1/1/98', '8/1/98', 3000) = 1; EvaluateCycleExpression('$1000', 0, '1/1/98', '3/1/98', 0) = 0;
OR <valid expression> <valid expression>This allows you to "or" two expressions together.
AND <valid expression> <valid expression>This allows you to "and" two expressions together.
NOT <valid expression>This allows you to negate the result of an expression.
EvaluteExpression
is a fully featured expression evaluator. It
allows you to use typical parenthesized syntax to compare values of
symbols passed in a symbol list with constants.
The full syntaxes of an expression and of a symbol list are listed in `ExprParser.y', and `Symbols.l', respectively.
This simple example of an expression should be enough to get you started, though:
EvaluateExpression( '(MyDate={1/1/98}) and (HelloWorld='hello') and (A=B + 9)' 'MyDate={1/1/98} HelloWorld='hello' A=18 B=9') = 1
Debug
and
CloseDebuggerOutput
. This function sets the current output to a
file, or to STDOUT
. To set the debugger output to a file, just
pass a file name in. The file name STDOUT
is a special file name
that tells SetDebuggerOutput
to set the output to the standard output.
EvaluateCycleExpression
, determine if the expression is
valid.
The following functions allow you to treat blobs as pseudo-strings. These functions have limited utility and should only be used when you are confident that your blob is not overly large.
This in mind, if you are using these functions, you might want to consider exactly why you need these functions, and you might possibly be better served by replacing your blobs with large varchars.
When UseMin is 1, then the minimum age returned is Min. When UseMax is 1, then the maximum age returned is Max. Calling this function with both UseMin and UseMax set to 0, is the same as calling its sister function above.
When UseMin is 1, then the minimum age returned is Min. When UseMax is 1, then the maximum age returned is Max. Calling this function with both UseMin and UseMax set to 0, is the same as calling its sister function above.
When UseMin is 1, then the minimum age returned is Min. When UseMax is 1, then the maximum age returned is Max. Calling this function with both UseMin and UseMax set to 0, is the same as calling its sister function above.
CDOWLong('1/1/98') = 'Thursday'
CDOWShort('1/1/98') = 'Thu'
CMonthLong('1/1/98') = 'January'
CMonthShort('1/1/98') = 'Jan'
With InterBase version 5.0, this function is effectively unnecessary, since version 5.0 now has the API calls isc_add_user, etc...
This function allows the user to invoke `gsec' on the server, thus allowing a remote SYSDBA to manage users without using the InterBase Server Manager.
Gregory Deatz is a senior programmer/analyst at Hoagland, Longo, Moran, Dunst & Doukas, a law firm in New Brunswick, NJ. His current focus is in legal billing and case management applications. He is the author of FreeUDFLib, a free UDF library for InterBase written entirely in Delphi, and FreeIBComponents, a set of native InterBase components for use with Delphi 3.0. Both of these tools can be found at at InterBase Corporation. He can be reached via e-mail at gdeatz@hlmdd.com, by voice at (732) 545-4717, or by fax at (732) 545-4579.
This document was generated on 6 August 1998 using the texi2html translator version 1.51a.