Archive

Posts Tagged ‘Configuration’

Installing UniData on Fedora 14

For some future upcoming posts, I needed to install UniData on a Linux Machine.

Since I’m already going through the effort of freshly installing both Fedora and UniData, I thought I would share required steps so anyone else who wanted to create a similar test system can do so just as easily. It turns out to be quite simple and straight forward, with only minor set up tasks along the way.

Firstly, I suggest you do this in a Virtual Machine so that you can create as many dedicated test systems as your heart desires (or storage limits). For this I’ve used Sun’s Oracle’s Virtual Box which is available for free. To make it easier, I’ve also got instructions for the few extra preparation steps you will need to do the Fedora installation in Virtual Box

Requirements

Okay, so to start, let’s make sure we have everything we need to do this:

  1. Suggested: Dual Core CPU or better (particularly if running as a VM)
  2. Suggested: 1GB RAM or better (particularly if running as a VM)
  3. Virtual Box software
  4. Fedora 14 ISO
  5. UniData Personal Edition for Linux

Preparing the VM

After you have installed Virtual Box and have it running, we will need to create a new image to run Fedora. Doing this is as simple as clicking the ‘New’ button and follow the prompts. Most questions can be left as is, except for the operating system. For the operating system, set it to ‘Linux’ with version ‘Fedora’.

The default 8GB Dynamic disk is just fine. You can always create and add more disks later.

Now that you have your machine image ready, select the image and click on the settings button. In this screen click on the storage option and select the DVD drive from the IDE Controller. On the right-side there is a small CD/DVD image you can click on. This will let you select the Fedora 14 ISO you downloaded so that it will boot from it.

While in the settings screen, you should also add a shared folder and click on the read-only and auto-mount checkbox options.

Installing Fedora

Fedora 14 VM for UniData

Fedora 14 VM for UniData


If you are not installing this as a virtual machine, you can burn the ISO image to CD/DVD and start the machine with the CD/DVD in the drive. Only do this is you know what you are doing or are intending to have the Fedora as the sole operating system.

If you are installing this as a virtual machine, select the VM image and click on the start button.

Fedora should auto-boot from the Fedora image. Once it has loaded and is sitting at the desktop, there is an ‘Install to Hard-Disk option’. Click on this and simply follow the installation instructions Fedora provides

Installing UniData

Before you can install UniData on Fedora 14, you must first install the libgdbm.so.2 library. You can download and install the RPM for libgbdm.so.2 here

Apart from the above missing dependency, it is as simple as following the installation manual provided by Rocket Software.

The only other point of note from the initial installation is that not all the escape characters in udtinstall are processed correctly, so expect to see a few lines like “\tWould you like to continue?”

Now you will need to set up the environment variables you will need. To do this, ensure you are in a shell as root or that you run these commands as root. Change to the /etc/profile.d directory. In here we are going to create a unidata.sh file that will contain all the environment variables UniData requires.

Just type in ‘gedit unidata.sh &’ to bring up a text editor (or just use vi/emacs) to paste the following into:

   UDTHOME=/usr/ud72 ; export UDTHOME
   UDTBIN=$UDTHOME/bin ; export UDTBIN
   PATH=$PATH:$UDTBIN ; export PATH
   LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$UDTBIN ; export LD_LIBRARY_PATH
   UDTERRLOG_LEVEL=2 ; export UDTERRLOG_LEVEL

Restart the machine or run the new script as root and you should be able to run ‘startud’ as root. If UniData boots up correctly, open a non-root shell and type in ‘cd $UDTHOME/demo’ then ‘udt’ and you should successfully jump into ECL.

There you have it, a working UniData server running in a Virtual Machine

Disclaimer: This does not create a UniData server that will be appropriate to run as a production server.

Categories: Database Tags: , , ,

The problem with numbers

October 11, 2010 2 comments

UniData, like other weakly-typed systems, makes some programming tasks easier by not needing the developer to declare and adhere to a data type with variables. The general pros and cons of this have been debated many times across many languages and hence will not discussed here. What will be discussed is specific cases where this can cause you unexpected headaches.

A posting was made on the u2ug forums by Koglan Naicker about some unexpected issues when finding duplicates in a data-set.

In short, he found that when strings contained large numbers, it would sometimes incorrectly evaluate two different strings as equal. For example:

IF '360091600172131297' EQ '360091600172131299' THEN CRT "Equal"

The above code results in “Equal” being displayed on the screen. This is caused by a combination of 2 factors.

The first being that UniData is weakly typed. This means that it does not explicitly distinguish between strings and numbers, but attempts to determine the data type by examining the data. In this case, since the strings are numeric, it automatically treats them as numbers.

The second part of this issue is because now that it is treating those 2 strings as numbers, it needs to handle them in an appropriate data type on the CPU. Since the 2 strings are too large to be treated as an integer, they get converted to a floating-point number. Due to rounding that occurs, this actually results in both of these strings being converted to the same float-point representation! A better method may have been to use something such as Bignum instead of converted to floating-point. There would be a speed trade-off, but surely that would have been better than potentially incorrect programs.

Some people suggest prefixing or appending a non-number character to each string to force them to be treated as a string. Not entirely elegant and can have performance implications. Fortunately, UniData does have proper functions to handle these situations. In the case where you will be comparing strings that may consist of only numeric characters, you should use the SCMP function. This function compares two strings as strings, regardless of the actual data in them. Using this when you need to be certain how the comparison is performed can save you a lot of headaches in the future.

Also of interest is that this issue doesn’t just apply to UniBasic, but can also affect UniQuery!

It should be noted though, this only affects UniQuery when the dictionary item is right-aligned with the format field (eg, 20R in attribute 5).

You can tested this by creating a file and creating 3 records with the @ID of ’360091600172130474′, ’360091600172131297′ and ’360091600172131299′.

Now, select upon the file where the @ID = ’360091600172131297″ and you can see that 2 records are returned!

Results of selection

Non Unique Select

When explicitly selected a record via a unique key, this isn’t the result a database should return.

So, when dealing with large, potentially numeric fields with UniQuery, you may need 2 dictionary items. A left-aligned one for selecting on and a right-aligned one if you require numerical sorting.