Electronic Manual - EasyData
© SunnyScript - www.sunnyscript.com

 
Table of contents
 
Installation and configuration [go] Directory structure
[go] File transfer to the server
[go] Configuration
General information about databases [go] Successful database planning
[go] Database size vs. system resources
Administration panel [go] Admin menu
Database creation and maintenance [go] Create a new database (table)
[go] Create table fields
[go] Edit or remove existing fields
[go] Category handling
[go] Moderated user actions
[go] Table maintenance
[go] View, add, clone, update and delete records
[go] Search requests statistics
Advanced features in detail [go] User managed record modifications (record owner)
[go] Set user permissions and limitations
[go] Voting and comments
[go] Record time management
[go] Images / Binaries / Memos
[go] Temporarily blocking of records
[go] Send out mailings
[go] Searching of databases (tables)
[go] Re-randomization
[go] Sorting by record popularity
[go] Bookmarking records
[go] Sending records via e-mail
[go] Automatic backup generation
[go] Database import and export tools
Web-frontend and template management [go] Adjust table parameters
[go] Available templates and basic overview
[go] Customization of templates
[go] Web integration: Embedding EasyData into websites
[go] Web integration: HTML based forms
[go] Web integration: HTML based forms - perform an advanced search
[go] Web integration: HTML based forms - add a new record
[go] Web integration: HTML based forms - rating of resources
[go] Web integration: Browse tables with custom visible fields
[go] Web integration: Create URLs performing search operations
Helpful hints and technical reference [go] Internal database handling
[go] Forgot your admin password ?
[go] Web-frontend and template translations
[go] Field output formatting with display masks
[go] Edit control alterations using edit control templates
[go] Custom field validations (Perl expressions)
[go] Interaction between tables
[go] Some collected tips and tricks
Customer services [go] Need help ? Contact the SunnyScript service department !

Smart tip: This handbook is also designed to be printed... set your printer's page orientation to landscape format, so there is enough space to place hand-written notes on the left and right margin easily.
 


 
Installation and configuration
 
SunnyScript offers an optional available installation service, if you don't want to install the software yourself.
Please contact our customer service department by e-mail for detailed information and pricing.
 
Directory structure...

The software can be installed at any place that allows the execution of CGI software: Most server systems provide a special directory called "cgi-bin" where you have to install the application, while others are not limited to a particular location.

In a common environment, we recommend to create a new sub-directory within the existing "cgi-bin" folder to separate the software from other already installed products.

Required "template.en" directory:

Inside the directory you desired for installation, please create a new sub-directory called "template.en". It's used to hold the content of "template.en" directory delivered with your software package.

Adjust path to Perl:

Open all program files (*.pl and *.cgi) in a text editor and change the first line "#!/usr/bin/perl" that it reflects the correct path to Perl 5 (or higher version) on your system. This is required to let your server know where the Perl interpreter is located.

Usage note: On most systems, /usr/bin/perl is already the default path to Perl and so no modifications are required.
 

File transfer to the server...

Upload all files to the created directories. If a ftp client is used, ensure to set the "ASCII transfer mode" for file submissions.

Detailed file table: Scheme: [filename | suggested place to upload (short description); file permission]:
 
Filename...
Description...
Filename...
Description...
* cgi-bin (program & data files); 755 template.en/* template.en (templates); 666

Important notes: Please double-check file permissions and transfer mode, otherwise the software may not work as intended. Depending upon the server configuration, different file permissions than the ones stated above may be necessary.

Smart tip: Our installation helper install.cgi makes it easier... just call it from your web browsing software (requires correct installation of this script) and it automatically checks your entire installation, adjusts permissions and fixes typical errors.
 

Configuration...

After you have uploaded all files, you may wish to start the admin panel first time to initialize the system parameters. In order to do so, please call admin.cgi with your favorite web browsing software:
 
Action to perform...
URL to call (location varies on your system, of course)...
Open admin panel http://www.sunnyscript.com/cgi-bin/ed/admin.cgi

Before you proceed, it is highly recommended to set an administration password. After this is done, access to the admin panel is granted only by using "admin" as login together with the chosen password.

Now click on the button "Edit system parameters" and configure the shown parameters according your needs.

Usage note: Since all parameters are automatically filled with correct values, modifications on your side may not be required.

Directories and files:
 
Name of parameter to set...
Description...
CGI files directory
Example: /usr/www/cgi-bin/ed
Absolute path to the location of EasyData on your server.
"data" directory
Example: /usr/www/cgi-bin/ed/data
Absolute path to the location that holds databases and related files.
"binarydata" directory *
Example: /usr/www/cgi-bin/ed/bindata
Absolute path to the location that holds binary database content.
"templates" directory
Example: /usr/www/cgi-bin/ed/template.en
Absolute path to the location of web and mail templates.
"auth" directory
Example: /usr/www/cgi-bin/ed/auth
Absolute path to the location of session info files (e.g. passwords).

* Technical note: The software tries to create this directory at a web-accessible place (certain cgi-bin locations doesn't allow to deliver multimedia content). If you experience problems in content delivery, please move it manually to a suited location.

Platform specific settings:
 
Name of parameter to set...
Description...
Mailing program (for Unix only)
Example: /usr/bin/sendmail
Absolute path to Sendmail (or compatible) application on your server.
SMTP server
Example: smtp.sunnyscript.com
SMTP server for handling mails; when left blank, default mail application is used. This setting is required for non-Unix systems, otherwise optional.
Don't use flock
Example: Unchecked
"flock" is normally supported directly by the operating system; should it be unavailable for any reason (e.g. on Win9x, WinMe), mark this checkbox.
Admin e-mail address
Example: admin@sunnycript.com
E-mail address of the system administrator (e.g. webmaster).

URLs:
 
Name of parameter to set...
Description...
Binary directory URL
Example: http://www.sunnyscript.com/cgi-bin/ed/bindata
URL to the location that holds binary database content.
URL of CGI files directory
Example: http://www.sunnyscript.com/cgi-bin/ed
URL to the location of EasyData on your server.
URL of user's help document (optional)
Example: http://www.sunnyscript.com/myhelp.htm
URL to an optional help document (not included); may also consist of an e-mail link (e.g. "mailto:support@sunnyscript.com").

Various parameters:
 
Name of parameter to set...
Description...
Authentication time (in seconds)
Example: 10800
Time frame keeping user authentications active (after expiration, people must log in again); recommended range: 1 to 12 hours.
Default records per page
Example: 25
Maximum number of records (unless specified exactly) appearing on one page; recommended range: 5 to 30 records.
Max. number of links
Example: 10
Max. number of selectable links on a page flicker when displaying search results; recommended range: 5 to 30 links.
Default table (optional)
Example: firsttable
Standard table used when no specific table is called.

After you have verified all settings carefully, click on the button "Save parameters" to take over modifications to the system. It is also possible to bring back previous values with the "Let the script restore defaults" button.
 

Congratulations - you have successfully installed the software :-)

 
General information about databases
Successful database planning...

1. Determine required database fields:

Write down all fields required for your database on a piece of paper to ensure having a consistent and logical data structure. For example, a database containing business contacts has other field demands than a product catalogue.

If you're very unsure which fields are needed, just think about the content you want to store in the database and create some sample records based upon this. Have still problems ? Don't worry, you can add, modify and delete fields later at any time.

2. Assign field types, edit controls and verification parameters:

Field types describe the content of the concerned fields closer. By default, EasyData uses the type "text" which accepts any input - but it can be wiser to be a bit more specific (e.g. a field like "Birthday" should be set to the type "date").

Edit controls determine how particular fields are displayed. By default, EasyData uses a single input line. But it is possible to work with any edit control supported by HTML (like text boxes, radiobuttons, drop-down lists, checkboxes, ...).

Verification parameters are intended to ensure that only correct data is entered for a particular field. EasyData offers many pre-set verifications for date formats, e-mail addresses and value ranges but also allows custom settings.

Please take some time to work out suited field parameters. Especially when having different people working on one database, meaningful settings will increase data consistency dramatically - and so, this makes also search operations easier.

Helpful hint: Confused about all this stuff ? Don't worry, the correct usage will be explained later. At this stage, you should just have a basic understanding of the database structure and your desired application.

3. Check all of your planning steps:

Last but not least you should go carefully through your planning and check it. It's a matter of course, that you can do changes to existing databases at any time, but it will save some time and trouble to start right away from the beginning.

Has your planning matched the application your database is intended to ? Try to perform some search operations on the sample records you invented previously and see how users are able to access particular records.

Furthermore you may think about some extras, like desired sorting, scheduled record availability, user permissions and other stuff. But for now, don't care about this too much. It will all be explained later step by step in this handbook.
 

Database size vs. system resources...

EasyData is highly optimized and supports databases of an unlimited size (number of records, data volume to handle), so the performance mainly depends upon the used server type and available system resources.

Accesses to your databases are handled very efficiently, so also high traffic websites are generally managed fine by EasyData. Our special database backend provides you with SQL-like performance, but neither with the need to have a SQL software server installed nor to deal with SQL's complexity and typical hang-ups.

In a common system environment, you don't have to take care about this issue. However if you have more specific questions regarding this topic, please contact SunnyScript's customer service department for personal assistance.
 


 
Administration panel

The administration panel is a convenient way to work interactively with EasyData. You can start the admin panel by calling admin.cgi with your favorite web browsing software:
 
Action to perform...
URL to call (location varies on your system, of course)...
Open admin panel http://www.sunnyscript.com/cgi-bin/ed/admin.cgi

How to access your databases:

Please refer to the chapter "Web-frontend and template management" for detailed information about web integration.
 

Admin menu...

This screen allows the following actions:
 
Main menu options...
Description...
Manage (existing) tables Select the desired action and click on the submit button.
Quick statistics View summarized system statistics.
Create new table This form is intended to create a new database.
Change password Change admin password.
Other administrative features
Edit templates Click on this link to edit the layout templates.
Edit system parameters Click on this link to modify system related parameters.
Import / export data Click on this link to import or export data and tables from/to EasyData.

The top menu line provides additional selections (depending on the current system status):
 

Top menu options...
Description...
Admin Go to the main admin menu.
Home Browse the currently active database.
Search Search the currently active database.
Search stats Show usage statistics of the currently active database.
Bookmarks Show bookmarks created for the currently active database.
Login / Logout Login or logout as administrator.
Moderate Approve or decline user modifications made to database.
Restructure Modify structures and parameters of the currently active database.
Mailings Send out mailings to record owners of currently active database.
Categories Manage categories for currently active database.
Add / Clone / Update / Delete Add, clone, update or delete records.
 

 
Database creation and maintenance
Create a new database (table)...

First of all, call the admin panel and go to the part "Create new table". Now just follow these steps:
 
EasyData asks...
Description...
Enter new table name Short internal name of the new table (alphanumerical chars, except spaces).
Set optional system fields
 
Available option...
Description...
Include category field Use categories inside the table.
Include record addition date/time field Time stamp of record creation.
Include record update date/time field Time stamp of last record update.
Include user feedback fields Voting and comments for records.
Include record owner e-mail / pwd. fields * User managed records.
Include expiration field Individual expiration of records.
Make additions moderated Moderation of public record additions.
Make modifications moderated Moderation of public record modifications.
 

After this is done, just click on the "Create new table" button in order to create the new database.

By the way: You can add and remove system fields manually later at any time; so if you are unsure about an optional setting described above, just leave it empty and read more about below in this manual.

* What exactly is a record owner ?

Each record can have an assigned e-mail address as well as a password (optional). In this way, people are able to modify their owned records. Additionally, the mailing utility allows sending of e-mails to all registered record owners.

Why is there an ID field in each table ?

This field is required for some internal functions of EasyData (mainly used to distinguish records); so you can commonly ignore it. If you like, you may also rename its label, hide it when showing records or even make it editable by users.

Technical note: Since each record must have a unique ID field value, this field is of autoincrement type by default.
 

Create table fields...

Choose the desired table and select "Restructure table". Alternatively click on "Restructure" in the upper right corner of the screen. If you just created a table, this screen appears automatically.

Go to "New field name", type in the desired name and select the data type. In order to finish action, click on "Create new field".

There are also various system fields available, required for advanced features. Type in the field names exactly as they appear in the following list to enable the concerned feature (refer to following chapters for details):
 

System field...
Description...
_email Record owner e-mail field; required for record modifications made through users (record owners) and for sending of mailings (see _subscribed field below).
_login Alternative to the record owner e-mail field; if both are available, this field holds the login information and _email stores the e-mail addresses for mailings.
_pwd Record owner password field (optional), requires record owner to specify a password before a record can be modified or removed.
_add_datetime Date/time stamp containing the date of record creation (auto-filled by EasyData).
_update_datetime Date/time stamp containing the date of last record update (auto-filled by EasyData).
_category Category field; required to handle categories (auto-filled by EasyData).
_blocked Flag to allow blocking of records (admin only).
_effective_since Individual appearance date for each record.
_expires Individual expiration date for each record.
_rating, _votes Rating fields; required to allow user ratings of records.
_comments, _comments_data Comment fields; required to allow user comments for records.
_views_number Auto-increasing field; shows number of total detailed record views.
_subscribed Flag to allow reception of mailings (in connection with _email).
_addbookmark Bookmarking field; creates the edit control to bookmark a record.

After a field was created successfully, the screen "Field properties" appears (see next part of this chapter).
 

Edit or remove existing fields...

Select the desired table and choose "Restructure table" from admin panel. Alternatively you can click on "Restructure" in the upper right corner of the screen.

How to delete a field:

Look for the field you wish to remove from the table and click on "Delete". However, please note that once a field is removed, all related content will get lost and cannot be recovered.

By the way: All table parameters are automatically updated and the concerned field becomes removed from these settings.

How to change sorting of fields:

Look for the field you wish to move around and click on either "move up" or "move down" to change the field's position.

Technical note: Sorting of fields takes effect only to various admin panel screens. Use "Table parameters and layout" settings to change the default field order for the web-frontend.

How to edit a field:

Look for the field you wish to modify and click either on "Edit" or the field name. Now the screen "Field properties" appears. Depending of the selected field, you can modify these options:
 

EasyData asks...
Description...
Field name Contains the name of the table field; you can change it at any time (table parameters are automatically updated with new field name).
Data type Select the type of content being stored in this field:
 
Type...
Description...
text Any content with unlimited size (default).
int Positive and negative integers.
float Real numbers.
date Date in format YYYY-MM-DD.
time Time in format HH:MM:SS.
datetime Date and time in format YYYY-MM-DD HH:MM:SS.
boolean Empty value = false; any other value = true.
image GIF, JPG, PNG & BMP pictures (stored in "binary" directory).
binary Binary content (stored in "binary" directory).
memo Textual content (stored in "binary" directory).
htmlmemo HTML-formatted content (stored in "binary" directory).
uploadmemo See "memo", but use with "upload (other files)" edit control only.
autoinc Autoincrement integer field.
URL Same as text, but URL validation and embedded HTML.
email Same as text, but e-mail validation and embedded HTML.
 
Display label Field label appearing instead of field name set above.
Display comment Comments which appear when adding or updating records, giving some hints to users.
Display mask Advanced users only: Active template for Perl scripts used to format concerned field value in HTML code or to make manipulations with value before output.

Available system variables are $id (contains record ID), $fields{FIELDNAME} and $value (contains the current field's value).

Sample application for display mask:
 

Description...
How to realize...
Field value in bold characters Type in: &"<b>$value</b>"
 
Default value Type in a default value you wish to use for this field, if it is kept unfilled by the user; can be also a Perl script.

Sample applications for default value:
 

Description...
How to realize...
Text based (no Perl scripting) Just type in the desired default value.
Current date & time Type in: &datetime2str(time)
 
Required Click here to mark this field as required.
Unique Click here to mark that this field's content has to be unique in the entire table.
Verification rules Type in rules to verify field's content (multiple rules separated by semicolon); if this is left empty, verification is done based upon used field type.
 
Rule...
Description...
int Positive and negative integers.
float All numbers ("+", "-", "." and digits).
alpha Characters only (A-Z, a-z).
alphanum Characters and digits only (A-Z, a-z, 0-9).
positive Positive numbers only.
negative Negative numbers only.
range:x,y All numbers from x to y.
values:val1,val2, ... Only given values are allowed.
min_size:x Minimum length of required input.
max_size:x Maximum length of allowed input.
valid_email E-mail address checking for correct format.
valid_URL URL checking for correct format.
accepted Required field (same as "required" in field types); e.g. used for checkboxes.
format:<x>::<error> <x> must match a Perl regular expression.
<error> may contain a customized error message, shown instead of the default one when verification failed.

Samples for field verification:
 

Rule...
Allowed content...
range:1,10 All positive numbers from 1 to 10 (e.g. 2, 9.35, ...).
values:yes,no Allowed input "yes" or "no" only.
min_size:5 At least 5 chars required, e.g. postal code check.

Refer to the chapter "Helpful hints and technical reference" for advanced samples.

Edit control Choose the intended edit control type:
 
Edit control type...
Description...
Automatic selection Let EasyData automatically select the matching edit control type based upon the field type.
Text input control Standard text input field.
Text input with dropdown list * Combined text input and dropdown list control (requires JavaScript enabled).
Password input control Password text input field.
Checkbox Checkbox (value = 1 when enabled).
Checkbox list * List of multiple checkboxes.
Upload (image) "Upload file" field for images (uploaded content will be stored in "binary" directory).
Upload (other files) "Upload file" field for binaries and memos (uploaded content will be stored in "binary" directory).
Text area Multi-line textbox (applicable for data types "text", "memo" and "htmlmemo").
Radio buttons * Radio buttons.
Combobox (Dropd. list) * Dropdown list.
List * Same as combobox, but items appears as listing.
Multiselectable list * Same as list, but allows to choose multiple items.
Hidden Hidden from users, but may have a value (as it is specified in "Default value")
* Values must be specified in field "Edit control data" below.
 
Edit control data Applicable for radio buttons, comboboxes, lists and multiselectable lists to determine the field content. Format: <Internal used value>|<Displayed value>

For example:
 
  01|Get YourAffiliates now
02|Get EasyData now
03|Get AccessGuardian now
...
 

Edit control width Applicable for text and password input fields as well as text areas. Type in the width of concerned field in characters (this does not set maximum length of field input).
Edit control height Applicable for text areas, lists and multiselectable lists. Type in the height of concerned field in lines (field content can contain more or fewer lines than set here).
Edit control template Advanced users only: Active template for executing Perl scripts.
Column width Type in the width of the table column concerned field appears in. Use either percentage value or pixels; leave empty for standard setting.
Column alignment Select alignment of the table column concerned field appears in.
Cell vertical alignment Select alignment of the table cell concerned field appears in.
Max. size Type in max. number of characters allowed for input.
Images, binary & memo fields: Type in max. file size (bytes) allowed being uploaded.

Important notes: If you edit a system field, some of the settings above may be not available for selection. Don't touch pre-filled settings for system fields; you may negatively affect their behavior.
 

Category handling...

Usage note: Before you can use categories, ensure that the system field _category is available within your table.

From admin panel, select the desired table and choose "Edit table categories". Alternatively you can click on "Categories" in the upper right corner of the screen.

How to create a new category:

Type in a category name and short description (optional; can be displayed when browsing by categories).

Now click either on the button "Add new top-level category" to create a new main category or "Add new category inside current category" to add a sub-category within the currently selected category.

How to edit a category:

Click on the ID of the category you wish to modify:
 

EasyData asks...
Description...
ID (category code) Category codes are assigned automatically; but if desired, you can customize them (use alphanumerical characters only).
Name Type in a new category name or correct the old one.
Description Type in a new category description or correct the old one.

In order to take over the changes to the system, click on the button "Save".

Helpful hint: Since categories are sorted alphabetically by their IDs (category codes), changing their displayed default order is very easy by altering the concerned category codes according your desired arrangement.

How to delete a category:

Select the ID of the category you wish to remove and then click on the appropriate deletion button to remove the concerned category from the table (please be careful when doing so; once deleted, categories cannot be recovered).

Important note: Records related to removed categories are re-assigned to the concerned upper level category.

Category trees - overview:

EasyData comes with a feature allowing website developers to implement an interactive JavaScript-powered category tree to websites in just a few minutes. Ideally suited for easy database navigation on category-based tables.

Each tree is built with graphical elements and can be individualized to allow highest flexibility. It is also based upon an own template (treeview.htm), so even surrounding HTML elements are possible.

Category trees - website implementation:

Call treeview.cgi to display a table's tree:
 

Action to perform...
URL to call (location varies on your system, of course)...
Display a category tree http://www.sunnyscript.com/cgi-bin/ed/treeview.cgi?tbl=<name>
<name>: Desired table to display tree for (required parameter).

Implementation by using SSI-tags:

Example: <!--#include virtual="/cgi-bin/ed/treeview.cgi?tbl=TABLE"-->
Description: Replace "TABLE" with the concerned table's name.

Technical note: Remove all HTML initializing tags from template treeview.htm (mainly <HTML> and <HEAD>) to avoid display errors caused when inserting the category tree codes into an existing webpage via SSI.

Important note: In order to use category trees, at least the permission "Search" is required for anonymous users.

Category trees - available settings:

Choose the desired table and select "Restructure table". Alternatively click on "Restructure" in the upper right corner of the screen. If you just created a table, this screen appears automatically. Now click on the button "Edit treeview parameters".

Layout options:
 

EasyData asks...
Description...
Show number of records Mark this button to show the number of records available per category.
Show category description Mark this button to include available category descriptions.
Show "Expand all" link Mark this button to display a link at the end of the tree allowing to expand it entirely.
Show "Collapse all" link Mark this button to display a link at the end of the tree allowing to collapse it entirely.
Initial tree state Select the status of the tree when called (all expanded, all collapsed)
Target frame If the category tree is used in a frame-based environment, specify the target frame to display the table content (when tree element is clicked).

Keep this empty to open the content in the same window where the category tree is located in (this removes the category tree).

Usage note: Use "_blank" to open a new browser window for displaying table content.

Template of tree node Specify or edit a template file applicable to the web-frontend.

Drawing icons:
 

EasyData asks...
Description...
... URL Alternatively to the hardcoded icons, you can specify own images being displayed. Keep the concerned setting empty to use the default elements.

Technical note: Even images are located at the same server, please use full URLs only (starting with "http://...").

Use background vertical line Mark this button to display a filling element used for large categories (taking more than one line in space, e.g. when displaying category descriptions).

Folder/leaf icons:
 

EasyData asks...
Description...
Show folder/leaf icons Mark this button to show icons for folders and leafs.
... URL Alternatively to the hardcoded icons, you can specify own images being displayed. Keep the concerned setting empty to use the default elements.

Technical note: Even images are located at the same server, please use full URLs only (starting with "http://...").

Root category:
 

EasyData asks...
Description...
Root category label Type in the label used for the root category (at top of tree).
Root category icon URL Specify an image being shown as icon near the root category. Keep the setting empty to not show an icon for root.

Technical note: Even the image is located at the same server, please use full a URL only (starting with "http://...").

 
Moderated user actions...

If this feature is active, administrator can approve (or decline) changes submitted by users (mainly additions, modifications or deletions of records). Enable moderated modifications by configuring the appropriate fields on the screen "Table parameters".

Important note: It is strongly recommended to enable this feature, if you allow people adding their own records. Otherwise you have no control about the database content.

Enable moderation mode:

Check fields "Make additions moderated" and/or "Make modifications moderated" during table creation or go to "Change table parameters and layout" and modify "Permissions" according your needs.
 

EasyData asks...
Description...
Moderate additions Make all record additions to your table moderated (anonymous / registered users).
Moderate updates Make all record updates to your table moderated (anonymous / registered users).
Moderate deletions Make all record removements from your table moderated (anon. / registered users).

Usage note: For more details about permissions and user groups, please take a look at the next chapter.

How to moderate actions:

From admin panel (you must be logged in as admin), select the desired table and choose "Moderate table". Alternatively you can click on "Moderate" in the upper right corner of the screen.

Now you see a list containing all queued requests. Each request can be approved or declined by selecting the concerned radio button. Select "Hold" and the concerned record will be still kept in moderation queue.

After you moderated all requests, click on the button at the end of this screen to take over your decisions to the system.

How to edit records in moderation queue:

If you wish to modify records that are currently in moderation queue, mark the button "Remind to update" when approving the concerned records. Now the moderation result screen allows you to edit them right away (new browser window opens).
 

Table maintenance...

Select the desired table and choose "Restructure table" from admin panel. Alternatively you can click on "Restructure" in the upper right corner of the screen.

How to remove a table (be very careful):

Go to "Delete table" and then click on "Delete files". You can either remove parts of this table or the entire database structure.

How to clear selected table files (be very careful):

Go to "Empty table", select the appropriate files you wish to clear and then click on "Clear data" to carry out this action.

How to rename a table:

Go to "Rename table" and specify the new name. Click on "Rename" to take over the changes to the system.
 

View, add, clone, update and delete records...

Go to the admin panel, select the desired table and choose "View/Add/Update/Delete records".

On the following screen, you may browse through all categories, search for records, add new ones, remove, update or clone existing records and do all other database administration tasks (see menu on the upper right corner of the screen).

Technical note 1: When updating records (admin only), all fields are shown regardless of the "Visible fields" settings at the "Table parameters" screen for convenience reasons (however other screens in admin panel consider these preferences).

Technical note 2: Cloning a record means to take over all field values from an existing record to a new one showing the "Add record" screen. It is not possible to clone fields of type "image", "binary" and "uploadmemo".
 

Search requests statistics...

The search requests statistics shows how people are using your database regarding search queries. All search queries are logged and then presented in a comprehensive graphical report searchable by date/time and sorted by usage frequency.

You can use these statistics for various marketing and performance analysis (e.g. most popular search queries, behavior of the users when doing search operations) or just for your personal interest.

How to enable search requests logging ?

Go to the screen "Table layout parameters", "Search requests logging":
 

EasyData asks...
Description...
Log all modifications to file... Mark "Don't log" to disable logging or any other entry to enable it.

Sending of statistics via e-mail: See also "Table layout parameters" screen, but now part "Table automatic maintenance":
 

EasyData asks...
Description...
Search requests statistics mailing EasyData is able to send a summary of all statistics to the admin's e-mail address.

If you wish to receive mailed statistics, just decide for the mailing time period. If no option is checked, the mailing feature is disabled.

How to access the statistics ?

Click on "Search stats" available in the upper left corner of the screen to access the statistics of the currently active table.

Search requests statistics form:
 

EasyData asks...
Description...
Select time period The following selections are available:
 
Selection...
Description...
All available dates Display data for the entire time period parsed.
Date range Type in a start and end date of the time period you wish to receive reports from.
Month Select a particular month to display data (available selections bases upon the parsed logs).
Year Select a particular year to display data (available selections bases upon the parsed logs).
 
Limit number of top requests Keep the default "Unlimited number" entry to show all search queries or limit it to a more reasonable range of top requested search queries.

Smart tip 1: The generated reports can be printed easily: Depending upon the used paper size, you may need to set the printer's page orientation to landscape format. In this case, there is also space for placing hand-written notes at the margins.

Smart tip 2: Since EasyData doesn't use image files to create bar graphs, you can simply copy the report to a disk and carry it to other computers, still keeping the layout (reports are generated in HTML language).
 


 
Advanced features in detail
User managed record modifications (record owner)...

How to enable managed records:

As mentioned in the previous chapter, users can be assigned to records they added to a table. By using this feature, record owners are able to modify or delete their owned records online and even prolong the life of them (if expiration feature is active).

In order to enable managed records, just ensure that you have the system field _email (e-mail address) within your table. Higher security will be achieved by adding another system field called _pwd, which contains a user determinable password.

Registered users are required to log in by using the login screen of EasyData providing their e-mail address and password.

Usage note: Alternatively to _email, also the field _login can be used. While _email needs to contain an e-mail address, the _login field may hold any content (e.g. alphanumerical values). If both fields are available, _login has a higher priority.

Configure the password reminder utility:

If a record owner forgot the password, it can be re-send automatically by the system at request. In order to configure this utility, please go to the "Table parameters" screen:
 

EasyData asks...
Description...
Pwd. remember msg. body template Specify the mail message template or keep the default one.

Important note: Since the admin password is saved encrypted for higher security, it cannot be restored. See chapter "Helpful hints and technical reference" about information on how to reset the admin password.

Technical note: For this feature, the system field _email is required.
 

Set user permissions and limitations...

Available types of users:

Anonymous users are not logged in and just work with the system (e.g. searching or browsing a database).
Registered users refers to record owners logged in with their e-mail address (or login ID) and password.

Set permissions for anonymous users:
 

EasyData asks...
Description...
Search, View Allows to search table and/or view record details.
Add, Update, Delete Enables record additions, updates or removements.
Moderate add., updates, deletions User actions will be placed in moderation queue first to allow verification by admin.

Set permissions for registered users (record owners):
 

EasyData asks...
Description...
Search, View Allows to search table and/or view record details.
Add, Update *, Delete * Enables record additions, updates or removements (ANY record in table).
Moderate add., updates, deletions User actions will be placed in moderation queue first to allow verification by admin.
* Please be careful, since record owners can also modify or remove records they not own. So moderation of these actions is recommended, unless you restrict them (see following permission set).

Set permissions for (registered users') owned records:
 

EasyData asks...
Description...
Search own, View own Restricts users to search and/or view only their very own records (as logged in).

Technical note: When "Search own" is enabled, also browsing of not-owned records is disabled, while "View own" hides only detailed entry views of not-owned records. 

Update own, Delete own Users are able to update and/or delete own records.
Moderate updates, deletions User actions will be placed in moderation queue first to allow verification by admin.

Enable moderation for record comments:
 

EasyData asks...
Description...
Moderate visitor comments Mark the button to moderate comments done for records.

Usage note: Votings (numerical ratings) are always unmoderated.

Enable "flood" prevention (anonymous and registered users):
 

EasyData asks...
Description...
Max. number of daily record
additions per unique IP
Number of records, each single user (each IP address) is allowed to add per day. Keep this parameter empty to disable it.

If a user tries to add more records than allowed, an error message is shown and further record additions will be declined by the system.

Usage note: Especially suited to prevent abuse when allowing anonymous users to add records without enabled moderation.

By the way: Record additions done by the admin are not counted, of course.

 
Voting and comments...

How to enable voting and/or comments for a table:

Add system field _rating to the table to allow user ratings. Optionally add system field _votes to count number of ratings.
Add system field _comments_data to the table to allow comments. Optionally add system field _comments to count them.

Helpful hint: During table creation, mark "Include user feedback fields" to allow rating as well as comments; so you don't have to add the system fields above manually.

Voting and comments settings:

Select the desired table and choose "Change table parameters and layout" from admin panel. Go to the part "Voting and comment parameters".
 

EasyData asks...
Description...
View comments per page Type in the number of comments displayed per page when showing comments.
Rate choices Specify the choices a user can choose from to rate a record. You must use pairs of "Rating number | Rating display text" (higher number means better rating), for example:
 
  |Rate this resource
0|So-so
2|Okay
4|Good
6|Excellent
...

By the way: You can also use negative numbers (for very bad rating).

Default votes number EasyData uses the value of _votes field to calculate an average rating value. If this system field is not present, the number specified here will be used instead of.
Use fraud blocking (IP saving) Enable this option to save all IP addresses. One IP address is allowed to leave one rating per record only; so it prevents this feature from being abused.
Clear IP lock file when
doing maintenance
Enable this option to let EasyData automatically clear the IP lock file when doing maintenance. If disabled, you should clear this file from time to time by yourself.

Technical note:  Admin can remove unwanted comments by editing the field _comments_data of the concerned record.

Helpful hint: It is also possible to make comments moderated. Please refer to "Set user permissions and limitations" above.

Voting and comments web-frontend:

Please refer to the chapter "Web-frontend and template management" for more details.

Technical note: The default maximum size for _rating field is five characters. Since it is in float data type, digits are chopped off if field size exceeds the maximum size (however admin can adjust field properties).
 

Record time management...

General information:

EasyData provides the ability to schedule the appearance and disappearance of records. In case of removements, notification messages may be sent before and records are able to be prolonged by their concerned owners.

There are several ways to set appearance dates, expiration dates and periods (e.g. based upon record creation date or last record update, for the entire table or unique for each record).

Pre-requisites for automatic record expiration:

1. Maintenance interval: Ensure that a maintenance interval is specified. See screen "Table parameters", "Table automatic maintenance". Recommended range: 3600 to 43200 seconds (1 to 12 hours).

2. Record owner: If you wish to allow record owners to prolong the life of their assigned record(s), the system fields _email (alternatively _login) and _pwd are required (password field is optional).

Technical note: Record appearance tasks are automatically handled when accessing the concerned table.

Appearance... table-wide appearance date (valid for all new records):

Add system field _effective_since and type in the following string as "Default value" setting at "Field properties" screen:
  Appears in <x> days

<x>: Number of days counted from record creation till appearance.

Usage note: This string is a special command, only valid for the above particular application.

Technical note: Until appearance date, the record exists but is not allowed being shown when searching or browsing the table. While for the admin such records are always visible, registered users can update them only by using a direct link.

Appearance... individual appearance date for each unique record - absolute date:

Add the system field _effective_since which contains the date of first desired appearance (format: YYYY-MM-DD or YYYY-MM-DD HH:MM:SS). It must be filled during record addition; leave field empty to make the record available immediately.

Appearance... individual appearance date for each unique record - relative date:

Same procedure as done for a table-wide appearance date, but don't set a default value for _effective_since, just use "Appears in <x> days" individually for each created record as field value.

Expiration... table-wide expiration date (valid for all records):

Ensure that either the system field _add_datetime or _update_datetime is present for the concerned table - based upon these date/time stamps, the expiration dates are calculated:
 
  _add_datetime contains the date/time stamp of record creation.
_update_datetime contains the date/time stamp of last record update.

Helpful hint: _update_datetime should be used, if you wish to allow record owners to prolong life of their records.

At "Table automatic maintenance" (see "Table parameters" screen), you'll find the record expiration settings:
 

EasyData asks...
Description...
Expiration time (days) * Type in the number of days records are kept in table before they expire.
Allow record life be prolonged Check this button to allow record owners to prolong the life of their record(s). A notification is sent by e-mail to the record owner when it's time doing so.
Warn on ... days before expiration In order to give record owners some time to prolong the life of their record(s), type in the number of days, notification message will be sent before records expires definitively.
* Leave this field empty to disable record expiration feature.

If you activated the setting "Allow record life be prolonged", notification mails are sent out to record owners with instructions on how to prolong the life of concerned record:
 

EasyData asks...
Description...
Warning message template Specify the mail message template or keep the default one.

If you wish to notify the record owner as soon as a record is removed, fill out also these settings:
 

EasyData asks...
Description...
Notify about deletion Check the button to activate this feature.
Notification message template Specify the mail message template or keep the default one.

Expiration... individual expiration of each unique record - absolute date:

Add the system field _expires which contains the date of expiration (format: YYYY-MM-DD or YYYY-MM-DD HH:MM:SS). This field must be filled during record addition; leave it empty to disable expiration for a particular record.

Important note: Setting an expiration time (see above) is required also here to determine a maximum applicable time frame; you may wish to set the expiration time parameter to a high value, like 3650 days (about ten years).

Helpful hint: If you allow record owners to prolong the life of their assigned records, ensure that the system field _expires is accessible for updates (see "Table parameters", "Record update mode - visible fields").

Expiration... individual expiration of each unique record - relative date:

Alternatively to the date input described before, simply type in this as "Default value" setting for the field _expires:
  Expires in <x> days

<x>: Number of days counted from record creation till expiration.

Usage note: This string is a special command, only valid for the above particular application.

Expiration... combination of table wide and individual expiration dates:

If _expires and one date/time stamp as well as an expiration time exists, then the expiration date in _expires applies.
If both date/time stamps and an expiration time exists, then _update_datetime is used for calculating the expiration time.

General priority of date/time stamps and expiration field: _expires, _update_datetime, _add_datetime.

Expiration... Templates (warning / notification mails):

Please refer to the chapter "Web-frontend and template management" for more details.
 

Images / Binaries / Memos...

You can have multiple image fields as well as binary fields and memos in each table. Just create a table field and set its data type to "image", "binary" or a memo one. Depending on your selection, the concerned field has a specific behavior:
 
Selected data type...
Description...
image Image fields (GIF, JPG, PNG & BMP formats); will show an image as field value.
binary Binary fields; will show a link to allow file downloads.
memo / htmlmemo Memo fields (for textual or HTML content); will show its content as field value.
uploadmemo Same as memo fields, but used together only with edit control "upload (other files)".

By using the parameter "Max. size" at "Field properties", you can specify the maximum file size in bytes allowed for uploads. Setting a file size limitation is strongly recommended, if you want to enable public record additions or modifications.

Important note: It is not possible to perform search operations upon these fields' content.
 

Temporarily blocking of records...

An existing record can be blocked, which means that it cannot be found during table browsing or search operations. In order to enable this feature, you must have the system field _blocked in your table.

How to block a record:

Search for the concerned record to block, click on "Update" (can be found in the upper right corner of the screen) and then just check the appropriate button (edit control of the field _blocked).

How to unblock a record:

Search for the concerned record to unblock, click on "Update" (can be found in the upper right corner of the screen) and then just uncheck the appropriate button (edit control of the field _blocked).
 

Send out mailings...

In order to create a mailing, select the desired table and choose "Send out mailings" from admin panel. Alternatively you can click on "Mailings" in the upper right corner of the screen.

You can send out mailings either to all record owners of a selected table (recipients filter set to "Send to all") or just mail such people who have allowed you to do so (recipients filter set to "Send to subscribed users only").

Mark "Do not send duplicate e-mails" in order to send only one single mail, even a particular address is found multiple times.

Custom recipients filter:

You can specify a search query that filters only recipients matching particular criteria. It is possible to use any field available in the table this mailing is intended for. Click on "view filter results" to get a listing of all selected records.

For example: income>=3000 AND education="high"
Only recipients will receive this mailing which have an income of more than 3000 currency units and a "high" education level.

Usage note: For more details about how to perform search operations, please refer to "Searching of databases (tables)" below.

Personalized mailings:

Personalized mailings contain an individual "To:" field for each recipient. In addition, you can include fields from the concerned table  (format: <!--$FIELDNAME-->) which are replaced by appropriate content.
 

EasyData asks...
Description...
Sender's name and e-mail Type in the name and e-mail address used in the header of outgoing mails.
Message subject Type in the subject line used in the header of outgoing mails.
Message format Select message format, "Plain text" or "HTML" (applicable to recipients' mail clients).
Message body Type in the content of your mailing here.

Sample personalized mailing:
 
  Dear <!--$first_name--> <!--$last_name-->,

you recently added your website <!--$URL--> to our database.

If you would like to increase the popularity of your <!--$BUSINESSTYPE--> company, you should take a closer look at our valuable offers !

With kind regards,
John Smith (my sample company).

Technical note: If "Do not send duplicate e-mails" is marked, a recipient with multiple records receives mail for the first found record only (and so will just see content of table fields for this specific record).

Quick mailings:

Quick mailings are used to send identical messages to all recipients (faster processing). However the usage of personalized elements is not possible (included table tags are removed automatically).
 

EasyData asks...
Description...
Mailing method Mark "Quick" to send out messages by using blind carbon copies.
 
EasyData asks...
Description...
"To:" field Specify one visible "To:" address for the mailing (user addresses are hidden).
Max. number of BCC recipients
per message
Max. number of recipients allowed per message; recommended value: 99.
 

Intelligent mail content delivery:

The most powerful feature is the delivery of intelligent message parts based on a record's content and "if/then/else" conditions. So a mailing can be written absolutely targeted, which leads to higher response rates and increased user convenience.

Important note: This works only with "Personalized" mailing method. "Quick" mailings will ignore intelligent message parts.

Each "intelligent message part" has the following structure:
 
  <!--if <expression>-->
Message delivered when <expression> is true.
<!--else-->
Message delivered when <expression> is false.
<!--endif-->

Usage notes: "if" and "endif" tags are required, while the "else" part is optional. Recurrent tags may also be used.

<expression> can contain these operators:
 

Type...
Allowed operator...
Possible applications...
Mathematical operators +, -, /, *, == Any kind of calculations with numerical field content, e.g. indices, formulae.
String comparison operators eq (equal)
le (less than or equal)
ge (greater than or equal)
lt (less than)
gt (greater than)
ne (not equal)
Comparison of string based field content, e.g. names and selected options.
Numerical comparison operators =, <=, =>, >, <, <> Comparison of numerical values, e.g. age, size.
Logical operators AND, OR, NOT Relationships between fields, calculation and comparison results.

Format of field values: $fieldname (field names are handled case-sensitive).

Sample applications (non-recurrent tags):
 
  <!--if $gender eq "m"-->
Ties for 5 Euro only.
Just a limited time, buy now !
<!--else-->
Parfums starting at 10 Euro.
<!--endif-->

<!--if $income < 20000 AND $intelligence_quotient <= 30-->
Hi <$name>,
participate in our "get rich fast" special offers !
This is your chance to live like the <rich & beautiful>.
<b><i>So start acting now - start today.</b></i>
<!--endif-->

<!--if $index * 10 / $basetax + 0.03 == 2 AND $taxstatus eq "high"-->
Save taxes by ordering our book "1001 (il)legal tax tricks".
<!--else-->
Increase your income by ordering our book "1001 ways to get wealthy".
<!--endif-->

Usage notes: Second sample does not have an "else" tag, which means that a false result will lead into not displaying anything. Should a field value be unavailable (spelling error, non-existing field), then the argument is considered as being empty.

Technical note: It is also possible to use HTML and client-sided scripts (like JavaScript) within intelligent message parts.

Sample application (recurrent tags):
 
  <!--if $gender eq "m"-->
Special offer for <b>men</b> from our drug store:
<!--if $age > 50-->
Gray hair remover for just 9,99 Euro.
<!--else-->
Shaving foam - just 3,99 Euro.
<!--endif-->
<!--else-->
Special offer for <b>women</b> from our drug store:
<!--if $age > 50-->
Wrinkle remover for just 9,99 Euro.
<!--else-->
Lavender bath salt - just 3,99 Euro.
<!--endif-->
<!--endif-->

Usage notes: Parts in green text belonging together. Do not forget to close all "if" tags avoiding malfunctions.

How to perform a test of personalized and intelligent mailings:

In order to let the system process a sample message, click on the button "Send test message to admin". The system then generates a mailing, which is sent to the administrator under real life conditions.

And these default values are used: Numerical = 0; date/time related fields = actual date/time; URLs = http://test.<fieldname>/; e-mail addresses = test@<fieldname>.test; fields in general = test-<fieldname>.

Smart tip: Have a look at MailingStar (plus) - professional mailing list management and e-mail marketing software.
 

Searching of databases (tables)...

Searching for information:

EasyData provides a wide range of powerful search features to retrieve information from your stored data fast and accurate. In the following, we want to show how to built search operations in an effective way.

Let's first have a look at these two records used to explain the sample operations below:
 
id: 1
firstname: John
lastname: Smith
age: 27
postcode: 12345
city: Samplecity
country: Somewhere
id: 2
firstname: Max
lastname: Smith
age: 12
postcode: 02345
city: Samplecity
country: Somewhere

Usage note: All samples don't consider special features like searchable fields, whole word or case-sensitive search operations. They just refer exclusively to their concerned explained features.

Interpreting keyword searches:

In most cases, you can use any text string for query fields in order to start searching a table.

Sample query: smith
Delivered records: 1, 2

Multiple keywords should be separated by spaces. EasyData automatically adds the logical operator AND unless an other one is specified (read below for details and additional explanations).

Sample query: john blanche
Delivered records: none ("john" is found in record 1, but "blanche" is not existing)

If you are not sure about the spelling of a word (e.g. singular/plural or different spelling alternatives), then just type in a partial word.  EasyData will perform a sub-string search for the provided string.

Sample query: some
Delivered records: 1, 2 (finds string "some" in values of field "country")

Boolean operators: AND (&) OR (|) NOT (!)

The logical operators AND, OR, NOT are supported. Instead of the words AND, OR and NOT you can also use the operator characters ampersand (&), pipe (|) and exclamation mark (!).

Sample query: john AND smith
Delivered records: 1

Sample query: john OR max
Delivered records: 1, 2

Sample query: john ! max
Delivered records: 1 ("!" stands for "NOT")

Technical note: At advanced searches or custom search forms you can specify a default operator. Please have a look at the chapter "Web-frontend and template management", parts "Web integration: HTML based forms..." for more information.

Parentheses: ( )

Operations put within parentheses are processed first; the result is then used for further operations within the search string.

Sample query: (john NOT max) AND samplecity
Delivered records: 1 ("john NOT max" delivers record 1; then looks there for "samplecity"; both statements are true (AND))

Phrases: " "

Strings put within phrases are searched exactly as they are (not case-sensitive).

Sample query: "sample"
Delivered records: 1, 2 (finds "samplecity")

Sample query: "JOHN"
Delivered records: 1

Wildcards: * ? \

Beside of the standard sub-string search, it is possible to use more specific wildcards for automatically expanding a search operation. Wildcards marking variable parts of a string; they are helpful when looking for word variations and different spellings.

The asterisk (*) is considered as placeholder for none, one or more characters; the question mark (?) is considered as placeholder for exactly one character.

Place an escape character (\) before any symbol to disable its special meaning (e.g. a search for the string "book\*" will look for "book*" as it is written and does not consider the special meaning of the asterisk character).

Sample query: sample*
Delivered records: 1, 2 (would also find "sampletown", "samplevillage" or just "sample")

Sample query: ?2345
Delivered records: 1, 2 (but would not find "012345", since only one character is allowed being there).

Comparison operators: = == < > <= >= <> ~ !~ ~~

Within a search query you may address a specific record field being searched for a given string or numerical value.

Available operators:
 
= wildcard match (wildcard symbols allowed) == exact match (disabled wildcard search, "as is")
< less than > greater than
<= less or equal than >= greater or equal than
<> or != not equal ~ contains text (default operator)
!~ does not contain text ~~ whole word match

Sample query: age <= 12
Delivered records: 2 (looks exactly at the field "age" and disregards other fields)

Technical note: When just entering a string, EasyData converts it into <searchable field> ~ <search string>. In case of using "whole word" match, the search string is converted into <searchable field> ~~ <search string>.

Priority of used operators:

When processing a search request, EasyData first handles all parentheses, then comparisons and finally any boolean operator found (in this priority: NOT, AND, OR).

Search options at "Advanced search" screen:

By clicking at the "Search" link in the upper left corner of the screen you will come to the advanced search area for the concerned active table. Beside of a standard search mask, also the following options are available:

Case-sensitive: Mark this button to handle search operations case-sensitive (CAPITAL and lowercase chars are differed).

Whole words: Mark this button to search for entire words only (recognizes space characters).

Match method: Select whether all arguments must be found (AND) or just one is sufficient to list a record (OR).

Sort by / then sort by: Define sorting of search results over two levels.

Additional references within this handbook:

For complete information, please also have a look at the chapter "Web-frontend and template management", parts "Adjust table parameters" and "Web integration: HTML based forms..." for more details and advanced possibilities.
 

Re-randomization...

What exactly is re-randomization ?

When browsing categories or viewing search results, all shown records are presented in a given order. However in some cases, you may wish to achieve a random order (e.g. to provide a fair rotation of records).

The re-randomization feature allows to fill one or more table fields with random numerical values; these fields can be used for sorting records by chance. Each table maintenance, the field values are refreshed and so also records are sorted differently.

Pre-requisites for re-randomization feature:

Maintenance interval: Ensure that a maintenance interval is specified. Please see screen "Table parameters", "Table automatic maintenance". Recommended range: 3600 to 43200 seconds (1 to 12 hours).

Create a "randomizable" field:
 

Action to perform...
Description...
Create a table field Click on "Restructure table" and create a new table field (used name doesn't matter).
Hide field from being visible * Go to the screen "Table parameters" and remove its name from all "Visible fields" parameters (table browsing mode and detailed entry view mode).
Mark field for sorting * On the same screen, add the random field to "Sort records" parameters. Random fields can be used together with other fields for flexible sorting.
Set re-randomization parameters On the same screen, go to the "Field re-randomization" part:
 
EasyData asks...
Description...
Re-randomization interval (sec.) Time frame before refreshing random fields (same or higher value as maintenance interval).
Re-randomization fields Choose field(s) being intended as random ones.
 
* More details can be found at the chapter "Web-frontend and template management".
 
Sorting by record popularity...

What is meant with "popularity" ?

Popularity refers to the number of times, a particular record is shown in detailed entry view mode.

How to count the popularity of records ?

Add the system field _views_number to your table. Its numerical content is automatically handled by EasyData and becomes increased by 1 each time a record is shown detailed (as higher the value, as more popular the record).

How to sort search results by popularity ?

When wishing to sort records by popularity, just ensure that _views_number is added to all "Sort records" parameters at the "Table parameters" screen.

Usage note: You can also show the field's content (e.g. color it with "Display mask" parameter when it exceeds a given number to attract users) or embed it into search forms - there are many more types of usage than just sorting.
 

Bookmarking records...

What exactly is record bookmarking ?

Each time a user browses through a table, it is possible to bookmark records (a cookie is set on user's computer containing the table name and record ID) for finding them later again easily. It is possible to bookmark as many records as desired.

How to enable record bookmarking ?

You just need to add the system field _addbookmark to the concerned table. This will lead that the necessary links and screen elements are created automatically allowing records being bookmarked, bookmarked ones viewed and unbookmarked.

Each bookmark will kept stored for seven days to allow later visits without losing already found information.

View set bookmarks:

Click on "Bookmarks" available in the upper left corner of the screen to see a list with all bookmarked records of the actual table. In order to remove a bookmark, uncheck "Keep bookmark" of the concerned record and click on "Refresh bookmarks".

Usage notes: Records are shown as specified for table browsing mode (as first column, a "Keep bookmark" button is shown). All bookmarks are alive for about seven days before they will be removed automatically.
 

Sending records via e-mail...

EasyData provides the ability to send records via e-mail. This allows users to forward records very convenient to other people (or putting them into their own mailboxes, of course).

How to enable sending of records via e-mail:

Please select the desired table and choose "Change table parameters and layout" from admin panel. Go to the part "'Send records by e-mail' feature".
 

EasyData asks...
Description...
Mode of "send this record by
e-mail" feature
Allow users of this table to show records to other people by sending an e-mail message together with some personal greetings.
 
Selection...
Description...
Don't show anything Disable this feature.
Show popup when link clicked Form is shown at request (popup window).
Show form when link clicked Form is shown at request (on detailed entry views).
Always show form Form is shown on each detailed entry view screen.
 
Fields to be mailed Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or "Up" and "Down" to change field order.

Alternatively you can type in a comma delimited list of fields manually.

Default "from" address of ... msg. Type in the default e-mail address used in the header of outgoing e-mails.
"Record by e-mail" msg. template Specify the mail message template or keep the default one.

Technical notes: Any applying field formatting (defined in display masks) is ignored (plain text message is sent). Binary, memo and image typed fields are shown as links to their respective files.
 

Automatic backup generation...

What exactly is backup generation ?

EasyData is able to generate backups of its data files automatically to allow restoring them later. Generated backup files (extension .db.bak) are located within the "data" directory.

Pre-requisites for generating backups:

Maintenance interval: Ensure that a maintenance interval is specified. Please see screen "Table parameters", "Table automatic maintenance". Recommended range: 3600 to 43200 seconds (1 to 12 hours).

Important note: The backup update period must be longer than the specified maintenance interval.

Enable / disable backup generation:

Select the desired table and choose "Change table parameters and layout" from admin panel. Alternatively you can click on "Restructure" in the upper right corner of the screen and then click on "Edit table parameters".

Go to the part "Table automatic maintenance" to find the appropriate settings:
 

EasyData asks...
Description...
Number of backup files Type in the number of different backup file levels generated (max. 5). Increasing this value gives you a better chance to restore elder data, but also requires more diskspace.
Backup file #1 update period (hours) Specify the time frame between backups are generated.
Rename backup file #x to #x
after this number of updates...
Type in the number of updates processed for the concerned backup file before it will be replaced by the next generation of backups.

Technical notes: In order to disable the backup feature, set "Number of backup files" to 0 or leave it empty. New backups are not generated for unchanged files (since backup already exists).

Recommended backup settings:

Maintenance interval = 3600; number of backup files = 4; backup file #1 update period = 6
Rename backup file #1 to #2 after this number of updates of backup file #1: 4
Rename backup file #2 to #3 after this number of updates of backup file #2: 5
Rename backup file #3 to #4 after this number of updates of backup file #3: 6

<TABLENAME>.db.bak1 holds 0 to 6 hours old database content.
<TABLENAME>.db.bak2 holds 6 to 24 hours old database content.
<TABLENAME>.db.bak3 holds 1 to 5 days old database content.
<TABLENAME>.db.bak4 holds 5 to 30 days old database content.

<TABLENAME>: Name of the table, concerned backup file belongs to.

Retrieve data from backup:

If you wish to roll-back a corrupted data file, just replace the original file with the latest error-free backup copy.

Before doing so, please ensure that the table definition did not change recently (e.g. by adding new fields). In this case, the table definition needs to be set to the configuration of the data file to restore.

Important note: Restoring data files should be managed by an experienced system administrator only. In case of emergency, SunnyScript can provide you with special assistance to professionally handle this task (optional fee-based service).

Helpful hint: In order to create a backup of an entire database, you may use the "Download/upload table package" feature.
 

Database import and export tools...

In order to import or export data, click on the button "Import / export data" available on the main admin menu.

Import data into database:

Click at the button "Start data import..." to begin reading in an existing 3rd-party database.
 

EasyData asks...
Description...
Determine data file being uploaded Choose the file holding the data intended for being imported to EasyData or select an already uploaded one * for processing.

* It is also possible to upload files directly to the server (e.g. via ftp) and then use the admin panel for importing them - please refer below for more information.

Specify data format Select the type of the importable file; alternatively to the pre-defined types, you can also set up a custom format in case of reading special database structures.

Please consult the manual of the 3rd-party database product you wish to import data. If it directly supports EasyData, mark "EasyData exchange format".

Important note: Please ensure to decide for the correct data format, otherwise the imported data may appear being destroyed.

Determine the target table New table:

Select this radiobutton to create a new table for the importable data.

Important note: Ensure to mark "Add autoincrement key field" to automatically add a key field (if not existing) - the first table field must be unique to allow identifying records.

Existing table:

Select this radiobutton and choose the desired table (must have the same structure as the one to import); decide either to replace or update already existing data.

Fields selection and post-processing Determine whether you want to import all fields or just selected ones.

If "Let me select fields after uploading" was chosen, a screen appears after the file was read in that shows a list with fields for being importable.

Mark "Delete uploaded file after processing" to remove the source file from the system as soon as the data import has been finished (recommended).

Click on the button "Import data" to start the importing process. After it is finished successfully, please check the read in data for consistency first. It is also recommended to keep a backup copy of all original database files for later references.

Technical note: Data formats "... with field names" requires that the first line of the importable file holds the names of the fields. Alternatively, default names are chosen you can rename later at any time.

Importing already uploaded source files:

This feature is useful especially when trying to import huge databases, because the file size allowed to read in through the admin panel may be limited by your server or webbrowsing software...

Just place the source file into the directory data/import.tmp. Now go to the admin panel, click on "Import / export data" and select the concerned file from the list (see parameter "Determine data file being uploaded").

Export data from database:

Select the appropriate source table and click on "Continue..." to go to the next screen.
 

EasyData asks...
Description...
Specify data format Select the type of file you wish to build: You can either decide for a pre-defined format or a custom one suited for special applications.

Usage note: If supported by the target database software, choose "EasyData exchange format" to achieve best results.

Select fields to export By default, all fields and their contents will be exported; however you can uncheck fields not required in your target application (e.g. the ID field may be of no usage there).
Set optional data filter Depending upon the available system fields, you are able to set additional filters.

Only records matching the filter criteria (multiple filters can be connected with AND / OR operators) will be exported. This may save additional diskspace.

For example, you can specify a range of records by using the key field filter (ID field) or enter a search query to export only a determined group of records.

Now click on "Export data" to start the exporting process. A "save file" dialog is shown by your web browsing software to store the exported data file on your computer.

Advantages of the "EasyData exchange format":

The "EasyData exchange format" is a tab-delimited text-based format also storing binary field content, like images or software files together with the textual data (URL-encoded).

Where possible, this format should be used for data import and export tasks to ensure best results when handling non-textual contents (all other supported formats cannot handle binary fields).

Technical note: If you are a programmer interested in implementing our exchange format into your own applications, please let us know. We are able to provide you with additional information upon request.

Helpful hint: Should you wish to manually back up an entire database or to carry an existing one over to an other EasyData installation, you may decide to create a "table package" as described more closer in the following.

Table packages - overview:

A table package contains an entire database (the table and all related elements) in one single file (TABLENAME.ede). So table packages are ideally suited for carrying an entire database to an other server or for generating manual backups.

Download table package:
 

EasyData asks...
Description...
Specify source table Select the table being intended for package downloading.
Include log files Mark this button to add all log files to the package (may become very large).
No compression Click here to not compress the table package.
Use internal gzip compression Use the internal compression utility (to pack the table package) or unmark this checkbox and specify external utility as followed.
Use external compression program Click here to compress the table package by using a server-sided tool.

"Compression command template": Contains the command used for compression. By default, EasyData tries to use the gzip compression utility of the server.

The compression command usually has two variables: $file_to reflects the compressed file, $file_from reflects the original source.

"Compressed file extension": Extension appended at file marking it as compressed.

Now click on "Download table" to save the table package. A "save file" dialog is shown by your web browsing software.

Upload table package:
 

EasyData asks...
Description...
Specify ".ede" file Select a local ".ede" file being intended for package uploading.
Decompression method
Compressed table packages needs to be decompressed first.
No decompression Click here to not decompress the uploaded package.

Important note: In the case a compressed package is uploaded but not decompressed correctly, an error message will be displayed and installation aborts.

Use internal gzip compression Use the internal decompression utility (to unpack the table package) or unmark this checkbox and specify external utility as followed.
Use external compression program Click here to decompress the table package by using a server-sided tool.

"Decomp. command template": Contains the command used for decompression. By default, EasyData tries to use the gzip compression utility of the server.

The decompression command usually has two variables: $file_to reflects the target ".ede" file, $file_from reflects the original source.

"Expected filename after decompression is complete": Select either to autodetect the package filename or specify one (has to end with .ede).

Now click on "Upload table" to copy the table package to the server.

Technical note 1: Should there already exist a table with equal name, EasyData chooses a new name for the uploaded table (may be changed later at "Restructure table" screen).

Technical note 2: The choices "Use internal GZIP compression" respectively "Use internal GZIP decompression" for table package down- and uploads are only available, if there is the Perl module "Compress::Zlib" installed.
 


 
Web-frontend and template management

With EasyData it's a matter of just minutes to create new databases and bring them online. We provide the following three ways to access data online and to work with the powerful web-frontend:

Important note: Ensure that you are logged out as admin, otherwise you may see a slightly different web-frontend.

1. Pre-defined web-frontend (default template scheme):

This is the easiest way, because you just need to add the following URLs as links to your website to allow people working with your tables (depending upon the set configuration).

Please refer to the part "Web integration: Embedding EasyData into websites" within this chapter for more details and usage samples of the web-frontend.

It's a matter of course, that the default template scheme can be customized (color and font schemes) according your needs achieving a similar layout as the one of your business website...

Go to the admin menu, click on the button "Edit templates" and search for "main template" labelled entries. These contains various layout settings taking effect to all sub-templates connected with the concerned main template.

2. Full set of freely configurable templates:

Beside of just customizing color and font schemes with style sheet commands, you can create your own set of templates or re-write the standard ones (they are a good basis for your own templates).

Each template is written in HTML and contains special tags which will be replaced by appropriate content. There's nothing you cannot customize, however you should have a familiar understanding of EasyData and HTML programming.

3. Integration of EasyData with HTML based forms:

Another method is to write own webpages and use HTML based forms to embed EasyData. Available for selected actions like searching databases and adding new records. They can be also used in combination with templates.
 

Adjust table parameters...

Choose the desired table and select "Change table parameters and layout" from main admin menu.

Table layout parameters:
 

EasyData asks...
Description...
Table display label Name of your table, visible for users.
Table browsing mode
This mode is used when people browsing your entire database (e.g. by categories) or while viewing search results. It is mainly intended to give an overview about available records (e.g. choose only important fields for "Visible fields" parameter).
Show subcategory entries Check it to allow also showing of records contained in subcategories.
Records belonging to multiple
categories
Records, which are members of multiple categories, are normally shown in their respective primary categories only.

If you wish to show records in all categories they belong to, select "Display in all categories" instead of.

Category entry template Specify or edit a template file applicable to the web-frontend.
Sort records by (when browsing) Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or "Up" and "Down" to change field order. You may also decide for descending or ascending sorting (standard).

Alternatively you can type in a comma delimited list of fields manually. Add "-" before a fieldname to sort in descending order (ascending sorting done by standard).

View records per page Number of records displayed per page.
Visible fields * Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

Linked columns Field content is linked and if clicked on, concerned record will be displayed in detailed entry view mode.

Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

Table entry template Specify or edit a template file applicable to the web-frontend.
Detailed entry view mode
This mode is used when a user decides to view a record more detailed (e.g. done by clicking on one of the "Linked columns" in table browsing mode). In this mode, only one particular record is shown per screen (with all or just selected fields).
Visible fields * Fieldnames shown when viewing a record detailed.

Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

"Add record" mode
Visible fields * Fieldnames shown when adding a record.

Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

"Record update" mode
Visible fields * Fieldnames shown when modifying a record.

Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

* These are required (and important) fields; double-check them for containing correct values.

Search layout parameters:
 

EasyData asks...
Description...
Sort records by default Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or "Up" and "Down" to change field order. You may also decide for descending or ascending sorting (standard).

Alternatively you can type in a comma delimited list of fields manually. Add "-" before a fieldname to sort in descending order (ascending sorting done by standard).

View records per page Number of records displayed per page.
Search fields * Fieldnames available for searching (no binary, memo & image fields).

Right box (available selections): Choose field and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove a field or use "Up" and "Down" buttons to change field order.

Alternatively you can type in a comma delimited list of fields manually.

Found entry template Specify or edit a template file applicable to the web-frontend.

* These are required (and important) fields; double-check them for correct values.

Categories list layout:
 

EasyData asks...
Description...
Show number of records Check to let EasyData count the number of records and display it beside the category name. For example: "My category (200)".
Number of columns Number of columns to display categories in.
Root category display label Label for root (main) category; may be "All" or "Start here" for example.

Behavior:
 

EasyData asks...
Description...
"Add record" mode Available parameters:

"Data verification script": Perl script being executed after pressing the "Submit" button (before data is added); suited for input validation.

"Run this code before applying actual changes": Perl script being executed after the data verification script or (in moderated environments) record approval. It is not executed when data verification script returns an error or admin declines a moderation request.

Possible applications:

Modify some field values before posting, validate input or update data in other tables or perform other actions (e.g. calling 3rd-party software).

Notes for using Perl codes:

Field values are read- and writable via hash $fields{<fieldname>}. Just replace <fieldname> with a field of the concerned table.

Cancel posting to the table by making Perl code return number below zero. Return -2 in order to don't display "add form" again. Add error messages to global @errors array.

Usage example ("Data verification script"):

At least one of both fields, option1 or option2, must be chosen...

if ($fields{option1} eq "" && $fields{option2} eq "") {push (@errors, "One of these options must be selected.");-1;} else {0;}

"Record update" mode Available parameters:

"Data verification script": Perl script being executed after pressing the "Submit" button (before data is updated); suited for input validation.

"Run this code before applying actual changes": Perl script being executed after the data verification script or (in moderated environments) record approval. It is not executed when data verification script returns an error or admin declines a moderation request.

Possible applications:

Modify some field values before posting, validate input or update data in other tables or perform other actions (e.g. calling 3rd-party software).

Notes for using Perl codes:

Cancel posting to the table by making Perl code return number below zero. Return -2 in order to don't display "update form" again. Add error messages to @errors array.

Usage example: See above for "Add record" mode.

"Record delete" mode Available parameters:

"Data verification script": Perl script being executed after sending a deletion request (before data is removed); suited for input validation.

"Run this code before applying actual changes": Perl script being executed after the data verification script or (in moderated environments) record approval. It is not executed when data verification script returns an error or admin declines a moderation request.

Possible applications:

Validate input or remove data from child table(s) or perform other actions (e.g. calling 3rd-party software).

Notes for using Perl codes:

Cancel deletion from the table by making Perl code return -1 and adding error messages to global @errors array.

Usage example ("Data verification script"):

If field can_delete is empty, concerned record cannot be deleted...

if ($fields{"can_delete"} eq "") {push (@errors, "Record is marked as locked and can't be removed.");-1;} else {0;}

"Log in" mode Possible applications:

Verify additional conditions before allowing user to log in (e.g. date or time, calling 3rd-party software).

Notes for using Perl codes:

Login variable is $login; password variable is $pwd, Decline logging in by making Perl code returning -1 and adding error messages to global @errors array.

Usage example ("Run this script after logging in"):

If field balance is <= 0, then no login is granted...

if ($table->FindKey($login) && $table->{FieldByName}->{balance}<=0) { push (@errors, "Your balance is not positive. Please remit money to your account first."); -1;} else {0;}

After logging in redirect user to
this URL
Possible applications:

After users are successfully logged in, they can be redirected to specific URLs.

Notes for using Perl codes:

It's an active template ("&" at beginning initializes Perl script).

Available variables are $login (user login), $pwd (user password) and $table_name (name of the concerned table).

Usage example: Redirect user to a page with owned records...

&"search.cgi?tbl=$table_name&filter._email=".escape("='$login'")."&action=search"

Moderation request alert If moderation is enabled you can select to be automatically notified by e-mail when new moderation requests are waiting in queue.
 
Selection...
Description...
Don't send alerts Disable this feature.
After first moderation request Send one message regardless of the number of incoming requests.
After each moderation request Send a message for each new incoming request.
 
Moderation decline note
When declining a moderation request you can optionally send an e-mail notification to the record owner (field _email).
Send "On decline" message when
modification is declined by admin
Mark this button to send out an e-mail notification to record owners telling them about declined moderation requests.
"On decline" message body templ. Specify the template file used as notification text.
Record addition / update / deletion note
Whenever an action happens to a record, you can send a notification to the record owner (field _email) as well as to a separately specified e-mail address (e.g. webmaster or admin).
Send "..." message to record owner Mark this button to send out an e-mail notification to record owners telling them about the concerned record action (addition, update, deletion).
Send "..." message also to Type in a comma-separated list of e-mail addresses also notified.
"..." message body template Specify the template file used as notification text.

Important note: It is recommended to modify these settings (except moderation request alert / decline note) only if you're an experienced user. These settings can negatively affect the behavior of EasyData.

Permissions:

Permissions are described closer in the chapter "Advanced features in detail".

Menu layout (applicable to all modes):
 

EasyData asks...
Description...
Menu items separator Characters that will appear between the top menu items (standard value: " | ").
Main menu (upper left corner of screen)
Main menu entries Right box (available selections): Choose entry and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove an entry or use "Up" and "Down" buttons to change entry order.

Alternatively you can type in a comma delimited list of entries manually.

"Home", "Search", "Bookmarks", "Login", "Logout" and "Help" entry text * Labels (linking text) used for top menu entries.
Sub-menu (upper right corner of screen)
Sub-menu entries Right box (available selections): Choose entry and click on "Add" to select it.

Left box (current selections): Click on "Delete" to remove an entry or use "Up" and "Down" buttons to change entry order.

Alternatively you can type in a comma delimited list of entries manually.

"Add", "Clone", "Update" and
"Delete" entry text *
Labels (linking text) used for top menu entries.
* You can also insert image tags according valid HTML standard. "Help" allows also an e-mail address, like "mailto:support@sunnyscript.com".

Database script pages headers / Login script page headers / Search script pages headers:

Customize the headlines of generated pages; also usage of images (IMG tags according HTML) is allowed.

Voting and comment parameters / Table automatic maintenance / Password reminder utility / "Send record by e-mail" feature:

These settings are described closer in the chapters "Database creation and maintenance" and "Advanced features in detail".

Table modifications logging:

Check this button in order to log all table modifications (add, update and delete records) to TABLENAME.modif.log located in the "data" directory (TABLENAME is replaced with the name of the concerned table).

In this way, you are able to manually recover lost data or track IP addresses of users trying to cheat your system.

Technical notes: Content of memo / image / binary field types is not logged.

Search requests logging:

This setting is described closer in the chapter "Database creation and maintenance".

Table automatic maintenance - Log files cleanup:

Specify the maximum size of system-generated log files (it is recommended to fill these parameters, otherwise the logs are growing indefinitely). Recommended range: 2048 to 5120 KB.

Templates substitution:

If you wish to use your own templates instead of the pre-defined ones, please select your desired templates here (more details about templates can be found below). "--use default--" will activate the standard template for concerned output.

Helpful hint: If you're unable to find your recently created templates within the lists, hold CTRL or SHIFT key and click on the "Reload" button of your browser software to reload the browser window (to replace an old copy in cache).

Table filename substitutions:

Important note: You should be familiar with EasyData, before you modify these settings. Also please refer to "Helpful hints and technical reference" for more details.
 

EasyData asks...
Description...
Datafile name Name of the data file used instead of the default TABLENAME.db (e.g. make two table definitions referring to the same datafile).
Categories tree filename Name of the categories tree file used instead of the default TABLENAME.tr (e.g. make two table definitions referring to the same categories tree file).
Autoincrement counter filename Name of the file used to store values of autoincrement datatyped fields.
Moderation queue filename Name of the moderation queue file used instead of the default TABLENAME.mod.
Moderation record locks filename Name of the moderation record locking file used inst. of the TABLENAME.mod_locks.
IP addresses locks filename Name of the IP address locking file used instead of the default TABLENAME.ip_locks (e.g. point one IP locking file to multiple tables).

<TABLENAME>: Name of the table, concerned file belongs to.
 

Available templates and basic overview...

Available templates:

There are three kinds of templates: Main templates contain the master layout; sub-templates hold the layout of output blocks appearing in these main templates; independent templates stand alone.

A detailed list with comprehensive descriptions of all template files is available from the admin panel (see "Templates editor" screen). Please contact our customer service for pre-sale inquiries asking for this list.

Helpful hints: If you create your own template sets, start creating the main templates first to have a better overview. After each single template is ready, run a test-drive to check correct functionality.

By the way: We strongly recommend to keep backup copies of the original template files for later referencing purposes.

Location of templates:

All template files are physically located in the templates directory you specified during installation of EasyData.

As long as you create or modify templates using the admin panel, you don't have to care about. However if you create templates manually, you must copy them to this location, because EasyData only recognizes files in this directory.

Create templates for your tables:

Each table can have its own set of templates - so you are able to run different applications simultaneously on one installation. In order to modify templates or create new ones, go to the admin menu and click on the button "Edit templates".

Activate your own templates for a table:

Please take a look at the part "Adjust table parameters" above to see how to select specific templates for a table.
 

Customization of templates...

As you may have seen above, each template contains special tags in the format <!--$TAGNAME--> which will be replaced by EasyData with appropriate content (like search results or system messages).

For some advanced functions, Perl code is used on the templates together with internal script variables. You may just surround these codes with additional HTML tags or modify it as desired (suggested only if you are familiar with Perl).

Important notes: Some tags are specific for selected templates. If you add a tag to a template which cannot use it, concerned tag will be simply ignored. However a missing tag can cause that users are not able to get access to selected features.

If you wish to customize templates, go to the admin menu and click on the button "Edit templates".

List of tags and Perl script variables you can use on templates:

A detailed list with comprehensive descriptions of all valid variables and tags is available from the admin panel (see "Templates editor" screen). Please contact our customer service for pre-sale inquiries asking for this list.

Expert note: Common script variables available in all templates are $in{<form_var>}, which gives access to form variables submitted by the user (<form_var>) and $namespace->{'TAG'}, which offers access to special tag variables.

Helpful hint: An alternative of template modification is to create own HTML based forms. However not all features can be customized in this way. Please refer to the next part for more details.

Custom software solutions:

Contact our sales department to request a free quote for our individual programming and customization services. Our team of experienced programmers and website designers looks forward to take over your project at affordable rates.
 

Web integration: Embedding EasyData into websites...

The following scheme shows how to create URLs for using EasyData with websites or other online documents:
 
Action to perform...
URL to call (location varies on your system, of course)...
Browse table http://www.sunnyscript.com/cgi-bin/ed/db.cgi                or
http://www.sunnyscript.com/cgi-bin/ed/db.cgi?tbl=<name>
Browse table (specific record) http://.../ed/db.cgi?tbl=<name>&id=<recID>
Browse table (specific category) http://.../ed/db.cgi?tbl=<name>&category=<catID>
Browse table (category tree) http://www.sunnyscript.com/cgi-bin/ed/treeview.cgi?tbl=<name>
Perform search operation http://www.sunnyscript.com/cgi-bin/ed/search.cgi            or
http://www.sunnyscript.com/cgi-bin/ed/search.cgi?tbl=<name>
Show table overview http://www.sunnyscript.com/cgi-bin/ed/tables.cgi
<name>: Desired table name (alternatively the default table will be used; mandatory parameter for category trees).
<recID>, <catID>: Record ID or category ID the request is intended for.
 
Web integration: HTML based forms...

General notes:

It is recommended to be familiar with HTML programming, before starting to create own forms. Please refer to available literature regarding more information about this issue.

Instead of using the POST form submission method, you can also use GET in most cases.
 

Web integration: HTML based forms - perform an advanced search...

The following HTML commands are required to build an (advanced) search form for your website:

1. FORM action tag:

Example: <FORM action="http://www.sunnyscript.com/cgi-bin/ed/search.cgi" method="POST">
Description: Change path that it points to the location of EasyData.

2. Action field:

Example: <INPUT name="action" type="hidden" value="search">
Description: Let EasyData know that this is a search form.

3. Table selector:

Example: <INPUT name="tbl" type="hidden" value="TABLE">
Description: Replace "TABLE" with the name of table used to perform search operations.

Helpful hint: Make the field visible to allow your users selecting a table.

4. Query field:

Example: <INPUT type="text" name="query" size=25>
Description: Allow keyword searches over all table fields.

5. Optional form fields:

By the way: All valid HTML edit controls can be used for these search options (e.g. input fields, radiobuttons, selectboxes, ...).
 

Action to perform...
Sample field and description...
Search multiple tables at a time Example: <INPUT name="searchtables" type="hidden" value="table1,table2,table3,...">

Description: Specify a comma separated list of tables used for search operations. Also suited very well for being visible to the user.

Important note: It is still necessary to define a "tbl" form field to specify a main table from which all layout preferences are taken.

Helpful hint: Layout of search results can be individually designed for each table (see "Table parameters"). By default, the layout from the main table is used.

Search specific table fields
(filter operations)
Example: <INPUT type="text" name="filter.fieldname" size="25">

Description: Allows search operations done for field "fieldname" only. Replace name part through the desired field (e.g. name="filter.company").

Helpful hint: Filter operations works with all HTML form elements like checkboxes and selectlists. "contains text" (~) operator is used by default.

Special use 1: Look for "fieldname" being within a range of values (here from 1 to 5):
Example: <INPUT type="radio" name="filter.fieldname" value=">=1 & <=5">

Special use 2: If filter is empty, it will be ignored for the search operation:
Example: <INPUT type="checkbox" name="filter.fieldname" value="">

Special use 3: In order to allow comparing operators for a text based input field, add the following special hidden form field before the visible filter field to your search form:
Example: <INPUT type="hidden" name="filter.fieldname" value=">=">

Display only selected fields
in search results
Example: <input type="hidden" name="view_fields" value="_email,username">

Description: Each record delivered by the search results shows only the given fields. May be also user selectable to customize delivered fields for each search.

Search selected categories only Example: <INPUT type="checkbox" name="category" value="catID"

Description: Search is done on specified categories (and sub-categories) only. May be a comma delimited list for enabling multiple categories.

Case-sensitive search ? Example: <INPUT type="checkbox" name="case_sensitive" value="1"

Description: Generates checkbox; if marked, case-sensitive search is enabled.

Select match method Example: <INPUT type=radio name="match_method" checked value="method">
 
Possible values for method...
Description...
"" (empty) Intelligent default; all search operators are allowed.
exact Exact match search.
all Keywords and conditions with unknown linking logic are linked with the AND operator.
any Keywords and conditions with unknown linking logic are linked with the OR operator.

Description: Determines the matching method for search operations.

Show records per page Example: <SELECT name="records_per_page" size=1><OPTION>10<OPTION>20</SELECT>

Description: Limit the number of search results shown per page. If missing, standard settings will be used (see admin panel).

Sort search results by Example: <INPUT type="hidden" name="order_by" value="field1,-field2,field3">

Description: Sort search results by the fields specified here. Apply "-" before the field to sort in descending order (ascending sorting done by standard).

Technical note: This parameter overwrites a table's default sorting preferences.

Helpful hint 1: Use randomized fields to sort records by chance.
Helpful hint 2: Field can be also visible (e.g. selectlist) to allow user selectable sorting.

6. "Submit"-Button and end of form tag:

Example: <INPUT type="SUBMIT" value="SUBMIT"> and </FORM>
Descriptions: Both commands are mandatory; the first generates the submit button and the second closes the form.
 

Web integration: HTML based forms - add a new record...

The following HTML commands are required to build a form for record additions:

1. FORM action tag:

Example: <FORM action="http://www.sunnyscript.com/cgi-bin/ed/db.cgi" method="POST" enctype="multipart/form-data">
Description: Change path that it points to the location of EasyData.

2. Action field:

Example: <INPUT name="action" type="hidden" value="add">
Description: Let EasyData know that this is a record addition form.

3. Table selector:

Example: <INPUT name="tbl" type="hidden" value="TABLE">
Description: Replace "TABLE" with the name of table used to add record.

Helpful hint: Make the field visible to allow your users selecting a table.

4. Table fields to fill in:

Example: <INPUT type="text" name="field.fieldname" size=25>
Description: Provided input will be the new value of table field "fieldname".

Helpful hint 1: If a required field is missing, an error message is shown. In order to prevent this, you may add a pre-set value (like space character) to each field, for example <INPUT type="text" name="field.fieldname" value=" " size=25>.

Helpful hint 2: Using the _expires system field requires a special value (replace <days> with the # of days till expiration).
Example: <input type="hidden" name="field._expires" value="<!--%%datetime2str(time+<days>*24*3600)%%-->">

5. "Submit"-Button and end of form tag:

Example: <INPUT type="SUBMIT" value="SUBMIT"> and </FORM>
Descriptions: Both commands are mandatory; the first generates the submit button and the second closes the form.
 

Web integration: HTML based forms - rating of resources...

Beside of achieving a custom layout, this method is also very well suited to allow remote ratings of resources (make the form source public to let people add it to their websites).

1. FORM action tag:

Example: <FORM action="http://www.sunnyscript.com/cgi-bin/ed/db.cgi" method="POST">
Description: Change path that it points to the location of EasyData.

2. Action field:

Example: <INPUT name="action" type="hidden" value="rate">
Description: Let EasyData know that this is a record rating form.

3. Table and record ID:

Example: <INPUT name="tbl" type="hidden" value="TABLE"> and <INPUT name="ID" type="hidden" value="RECID">
Description: Replace "TABLE" with the table name and "RECID" with the record ID (ID field value) used for rating.

4. Rating selectbox:

Example: <SELECT name="rating"><option value="">Please rate<option value="0">0<option value="1">1</SELECT>
Description: Values must match to the ones you have set in admin panel for rating this table.

5. "Submit"-Button and end of form tag:

Example: <INPUT type="SUBMIT" value="SUBMIT"> and </FORM>
Descriptions: Both commands are mandatory; the first generates the submit button and the second closes the form.

Rating of resources & leaving comments:

In addition of just rating resources, you can also allow people to leave comments. Add the following parts after point 4 above.

4.1. Request e-mail address:

Example: <INPUT type="text" name="Email" size=25>
Description: Request the e-mail address of the user leaving a comment.

4.2. Request name (required):

Example: <INPUT type="text" name="Name" size=25>
Description: Request the user's name.

4.3. Request location:

Example: <INPUT type="text" name="Location" size=25>
Description: Request the physical location of the user (e.g. country and city).

4.4. Comment text (required):

Example: <TEXTAREA name="Comment" rows=5 cols=30 wrap="physical"></TEXTAREA>
Description: Request the user's comment about the current record.
 

Web integration: Browse tables with custom visible fields...

It may be desired for some applications to show not all fields of a record (as set at "Visible fields"), but just selected ones.

EasyData provides the optional argument view_fields available when browsing a table (entire table or category), viewing a particular record detailed or performing a search operation.

Important note: In order to avoid abuse, it is not possible for anonymous or registered users to show fields unless they were selected by the admin as being "Visible fields" for concerned view mode (see part "Adjust table parameters" within this chapter).

Sample for browsing a table:
 
  http://.../ed/db.cgi?tbl=<name>&view_fields=<fields>

<name>: Desired table name.
<fields>: Comma-separated list of fieldnames being shown.

Usage note: This works also when browsing tables by categories.

Sample for viewing a record detailed:
 
  http://.../ed/db.cgi?tbl=<name>&id=<recID>&view_fields=<fields>

<recID>: Record ID the request is intended for.

Sample for performing a search operation:
 
  http://.../ed/search.cgi?tbl=<name>&view_fields=<fields>

Usage note: For advanced search forms, create a field named view_fields to use this feature there.
 

Web integration: Create URLs performing search operations...

Beside of having forms which allows user determinable search operations, it is also possible to call search.cgi directly in order to perform a search. This is useful to provide text or image based links starting search actions.

A sample URL looks like the following:
 
  http://www.sunnyscript.com/search.cgi?action=search&tbl=paint&filter.color=yellow

The argument "action=search" within the URL is mandatory to indicate a search operation. All other features of performing an advanced search (see above) are also allowed here; just enhance the arguments accordingly.

Hexadecimal URL encoding:

Within the values of arguments (e.g. filter operations), you must take care about replacing special characters by hexadecimal values (at least all chars having a special meaning to the web browser or server software, like spaces and quotation marks).

Sample: http://www.sunnyscript.com/cgi-bin/ed/search.cgi?action=search&tbl=TABLE&filter.name=%3E%3DA+AND+%3CB
Description: This search looks for names (field "name") starting with the letter "A" (>=A AND <B).
 


 
Helpful hints and technical reference
Internal database handling...
 
Filename *...
Description...
TABLE.def Table definition file; stores all table related information (parameters, table structure).
TABLE.db Table data file; stores non-binary table data. Values are delimited with tab character, records are delimited with newline [LF] character (hex value Unix: 0A, Windows: 0D0A).
TABLE.tr Categories tree file; contains category information.
TABLE.counter Autoincrement counter file; automatic counter is used to store default value of fields having "autoinc" as data type.
TABLE.mod Moderation queue file; if you enabled moderated actions, submitted data from user is stored here as long as you have not approved or declined it.
TABLE.mod_locks Moderation record lock file; in moderated environment, requested record modification blocks record for being modified again unless first changes are approved or declined.
TABLE.ip_locks
TABLE.ip_add
IP address lock files; to prevent abuse of the table, applicable to votings & comments as well as record additions (flood prevention).
TABLE.maint Maintenance state file; stores information about last run of maintenance routines.
TABLE.maint.log Maintenance log file; stores information about maintenance actions.
TABLE.modif.log Table modification log file; if enabled, this file keeps all table modifications.
TABLE.db.bak<x> Backup files; if enabled, these files will hold backup information from TABLE.db.
* Please note that part TABLE in filenames above becomes replaced with the concerned table name.

Helpful hint: If you decide to make manual backups, use either "Download table package" from "Import / export data" screen or manually download all files from the concerned table's location.
 

Forgot your admin password ?

If you forgot your admin password, you must remove the admin password file named admin.pass located in "auth" directory (see software directory of EasyData). Then you can set a new password next time you access the admin panel.

Technical note: The admin password cannot be send by the reminder utility, because it is encrypted for maximum security.
 

Web-frontend and template translations...

The web-frontend of EasyData is fully customizable and translatable by modifying the existing templates accordingly. In addition, also system messages may be translated:

In order to translate system messages into your desired language, download the files *.en (located in the software directory), which holds all pre-defined text parts and load them into a text editor.

Each language file uses the same structure:
  <Meaning or default text> => <Translation>

Please change only the part <Translation> while keeping the left-sided ones. After you finished translation, please upload the files to your server and give them a try.

Important note: You should create a backup copy of all original *.en for later reference.
 

Field output formatting with display masks...

When creating or editing a table field (screen "Field properties"), the parameter "Display mask" allows to treat the field's output in search results by using HTML and Perl commands. So you are able to easily add powerful goodies to your tables.

Important note: It is recommended to be slightly experienced in HTML and Perl before working with display masks.

Here are some interesting sample applications for the "Display mask" parameter:

1. Link a field with the content of an other field (URL or e-mail address):
 
  &"<a href='$fields{URL}'>$fields{business_name}</a>"

Usage note: Sample above will link the content of the field business_name with the field URL. Please note that any existing content of the field holding this display mask is ignored for the output (but not for search operations).

2. Link a field to perform search operation based upon a current record's field value:
 
  &qq|<a href="search.cgi?tbl=second_table&action=search&query=|.
escape("userid='$fields{userid}'").qq|">Personal details</a>|

Usage note: Sample above will show the string "Personal details" as hyperlink to process a search for table second_table which bases upon the field userid (must be a valid field of the actual table; field value will be URL encoded). Please note that the content of the field holding this display mask is ignored for the output.

Helpful hint: This is a great method to connect multiple tables; e.g. one table holds projects data and the second one personal details about persons participating in these projects. Depending upon delivered search results, personal details can be viewed although not stored in the originally searched table.

3. Show default text in case of an empty field value:
 
  &$value?$value:"No data available"

Usage note: Sample above will show "No data available" if there is no field value.

4. Show default picture in case of an empty image typed field:
 
  &if ($value ne "") {qq|<img src="$binurl/$table->{TableName}.my_picture/$value"
border="0">|} else {qq|<img src="http://www.sunnyscript.com/sunny.gif"|}

Usage note: Sample above will show the image www.sunnyscript.com/sunny.gif if the field my_picture is empty.

5. Use different text colors for particular alphanumerical field content:
 
  &if ($value eq "OK") {"<font color=green>$value</font>"} elsif ($value eq "ERROR")
{"<font color=red>$value</font>"} else {"$value"}

Usage note: Sample above will use green text color for value "OK" and red text color for value "ERROR". Not matching content is displayed in the standard color (e.g. black).

6. Use different text color for particular numerical field content:
 
  &if ($value>=0) {"<font color=green>$value</font>"} elsif ($value<0) {"<font
color=red>$value</font>"}

Usage note: Sample above will use green text color for positive values and red text color for negative values.

7. Link a field to display its record showing selected fields only / to perform a new search (on a given table):
 
  &qq|<a href="search.cgi?tbl=usertable&action=search&filter.id=|.escape("'$fields
{id}'").qq|&view_fields=id,field1,field2,field3">$value</a>|

Usage note: Replace "usertable" with the desired table name and specify within the argument &view_fields the fields to display.

8. Format field output with HTML tags:
 
  Sample 1: &"<b>$value</b>"
Sample 2: &"<font color=red><i>$value</i></font>"

Usage note: Just surround "$value" with HTML tags to format the output of the concerned field. However it is important to close all HTML tags again (see sample 2), otherwise the formatting you set here may take also effect to the following displayed fields.

9. Show uploaded images in fixed dimensions:
 
  &qq|<img src="$binurl/$table->{TableName}.my_picture/$value" border="0"
width="150" height="50">|

Usage note: Sample above will show the image stored in my_picture in dimensions of 150*50 pixels.

10. Display an image as one field's value when value of an other field contains a specific string:
 
  &if ($fields{show} eq "yes") {"<img src=\"http://sunnyscript.com/sunny.gif\">"}

Usage note: Sample above will show the image sunnyscript.com/sunny.gif at the field holding this display mask, if the field show contains the string "yes" (otherwise current field is left empty).

11. Calculate with fields (adding up numerical fields):
 
  &$fields{"field1"}+$fields{"field2"}+$fields{"field3"}

Usage note: Sample above adds up numerical values stored at field1, field2 and field3 and shows the result at the field holding this display mask.

Helpful hint: Similar to above, you can also create other spreadsheet-like calculations, e.g. average value or loan interest. 
 

Edit control alterations using edit control templates...

On the screen "Field properties" you can adjust the default edit control definitions (parameter "Edit control template") using Perl expressions. This feature is recommended for experienced users having some Perl knowledge.

Important note: It is recommended to be slightly experienced in HTML and Perl before working with edit control templates.

Here are some interesting sample applications for the "Edit control template" parameter:

1. Set font within a "text input control" box:
 
  &qq |<input style="font-family:Arial,Helvetica,sans-serif" name="$name" value="$value" size="$size" maxlength="$maxlength">|

2. Set wrap attribute at a "text area" multi-line text box:
 
  &qq |<textarea name="$name" rows="$rows" cols="$size" wrap="off">$value</textarea>|

3. Tables interaction - drop-down list:

The following edit control template is intended for a drop-down list using values from an outside table.
 
  &
# Lookup table name
my $lookup_table_name = "<source_table>";

# Lookup value field
my $lookup_value_field = "<source_field>";

# Lookup display template, use %FIELDNAME meta-chars for inserting field content.
my $lookup_display_template = "%<source_field> - %<source_field2>";

# Configuration complete, don't edit anything below !

my @values=("");
my @display_values=("--please select--");
my $lookup_table = table->new($lookup_table_name);
$lookup_table->Open("r");

while ( $lookup_table->Next) {
  my %f = %{$lookup_table->{FieldByName}};
  push (@values, $f{$lookup_value_field});
  my $display = $lookup_display_template;
  $display =~ s/%(\w+)/$f{$1}/esg;
  push (@display_values, $display);
}
$lookup_table->Close;
my $res=qq |<select name="$name">\n|;
my $i=0;
foreach (@values){$res.='<option value="'.safe_tag($_).'"'.(($val eq $_)?"
SELECTED":"").">".$display_values[$i++]."</option>";
};
$res.="</select>";
$res;

Replace <source_table>, <source_field|2> placeholders with appropriate table and field names to take values from.

4. Tables interaction - "text input with dropdown list" typed edit control:

As sample before, but this one uses the more complex JavaScript-powered edit control.
 
  &
# Lookup table name
my $lookup_table_name = "<source_table>";

# Lookup value field
my $lookup_value_field = "<source_field>";

# Lookup display template, use %FIELDNAME meta-characters to insert field content
my $lookup_display_template
     = "%location_id - %location_name (%location_state)";

# Configuration complete, don't edit below

my @values=("");
my @display_values=("--please select--");
my $lookup_table = table->new($lookup_table_name);
$lookup_table->Open("r");

while ( $lookup_table->Next) {
  my %f = %{$lookup_table->{FieldByName}};
  push (@values, $f{$lookup_value_field});
  my $display = $lookup_display_template;
  $display =~ s/%(\w+)/$f{$1}/esg;
  push (@display_values, $display);
}
$lookup_table->Close;
my $res=qq |<input name="$name" value="$value" onkeypress="this.form['$name.select'].selectedIndex=0"><select name="$name.select"
onchange="this.form['$name'].value=this.options[this.selectedIndex].value">\n|;
my $i=0; foreach (@values){$res.='<option value="'.safe_tag($_).'"'.(($val eq $_)?"
SELECTED":"").">".$display_values[$i++]."</option>";
};
$res.="</select>";
$res;

Replace <source_table> and <source_field> placeholders with appropriate table and field name to take values from.
 

Custom field validations (Perl expressions)...

On the screen "Field properties" you can specify own format definitions (parameter "Verification rules") using Perl expressions. This feature is recommended for experienced users having some Perl knowledge.

Important notes: System fields cannot have custom formats; data type "text" is mainly recommended for table fields with customized format definitions. It is recommended to be slightly experienced in Perl before working with custom verifications.

Furthermore it is possible to specify a custom error message shown when the verification failed (used instead of the default one "Field ... doesn't match format of this field."): format:<regular expression>::<custom error message>.

Here are some interesting sample applications for the "Verification rules" parameter:

1. Check for local/nationwide US telephone numbers - 123-456-7890 or 1234567890:
 
  format:^(\d\d\d\d\d\d\d\d\d\d|\d\d\d-\d\d\d-\d\d\d\d)$

2. Check for weekdays input (or any other specified values) - Mon, Tue, Wed, Thu, Fri, Sat or Sun:
 
  format:^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)$

3. Check for correct currency input (multiple digits followed by point and two digits) - e.g. 123.45:
 
  format:^\d+\.\d\d$

4. Check that exactly three items of a multi-selectlist are chosen (incl. custom error message):
 
  format:^([^\0]*?\0){2}[^\0]*$::Please select exactly three items from the list

By the way: Alternatively you can also use a default value or descriptive comment to tell other people working with the database about required field content (although verification rules should be preferred).

Verification of European data formats:

And here are some useful verification strings of data formats commonly used by European countries...

1. European date format - DD.MM.YYYY:
 
  format:^[0123]\d\.[01]\d\.[12]\d\d\d$

2. European time format - hh.mm.ss:
 
  format:^([01]\d|2[0-3])\.[0-5]\d\.[0-5]\d$

3. European date/time format - DD.MM.YYYY hh.mm.ss:
 
  format:^[0123]\d\.[01]\d\.[12]\d\d\d ([01]\d|2[0-3])\.[0-5]\d\.[0-5]\d$
 

Interaction between tables...

EasyData provides many ways allowing tables to interact with each other. In the following, we have shortly written together all possibilities and their references within this handbook.

Search operations over multiple tables:

See chapter "Web-frontend and template management", part "Web integration: HTML based forms - perform an adv. search".

Merging two (or more) tables, also partial:

See chapter "Advanced features in detail", part "Database import and export tools" (feature "Import data into database").

Tables sharing one data file:

See chapter "Web-frontend and template management", end of part "Adjust table parameters".

Important note: This feature is intended for advanced users only.

Edit controls with values from different table:

See samples at chapter "Helpful hints and technical reference", part "Edit control alterations using edit control templates".

Important note: This feature is intended for advanced users only.

Links used as record fields to start various actions at other tables:

See samples at chapter "Helpful hints and technical reference", part "Field output formatting with display masks".

Important note: This feature is intended for advanced users only.
 

Some collected tips and tricks...

"Catch all user records" after login:

If you allow users owning records, you may wish to provide also the possibility showing all owned records after an user logged in (this is especially useful to provide direct editing of records and record renewals).

Go to the screen "Table parameters" and look for a parameter called "After logging in redirect user to this URL" (located within the "Behavior" part). Replace the active template parameter with the following line:
 
  &"search.cgi?tbl=$table_name&filter._email=".escape("='$login'")."&action=search"

When using _login alternatively to _email for record owner logins, the active template parameter must contain this line:
 
  &"search.cgi?tbl=$table_name&filter._login=".escape("='$login'")."&action=search"

Pre-requisite: System field _email (or _login) must be made searchable.

Now all registered users will see their assigned records directly after logging in, but can also use all other database features of course (technically, just a search for assigned records is done after login).

Helpful hint: Alternatively users can search for their e-mail address or login information also manually.

Categories or multiple tables ?

During database planning you may ask yourself either to create one table with categories or multiple tables (each table stands for a main category) connected together as described in the part "Interaction between tables" of this chapter.

Generally it is advised to create multiple tables when having a large database (10.000+ records) to improve performance during search operations. Otherwise a category-based one-table system may be more convenient.

More useful technical notes:

Each unique record can belong to multiple categories. If a record belongs to more than one category, it will be counted to the primary category (the first in range selected for the concerned record).

When displaying search results or while browsing a category, also records from sub-categories are displayed (if search criteria applies to them). Uncheck the option "Show subcategory entries" to disable this feature.

If a record is currently in moderation queue, expiration of record is blocked unless moderation is done (moderation has a higher priority compared to expiration).

Merging two (or more) tables can be done by using the import/export feature for reading in one table's contents into an other's. During import, select "Append new records and update existing ones" option for the targeted table.

Should you wish to deactivate an entire table temporarily for being accessed over the web, simply uncheck all permissions (for both, anonymous and registered users). By doing so, only the admin is allowed to see it.

In order to achieve different views of one table, use "Table filename substitutions" settings: One datafile is shared by two table definition files (sample applications: printable versions of records, making some information of a table only available to registered members). However note that field structure is required being the same for tables connected together in this way.

EasyData is also the ideal solution to manage binary content (like software and cliparts). Use fields of binary type to store all kinds of files and provide advanced search abilities to your users - create image archives, software resources and more !
 


 
Customer services

Depending upon your license type, this software package includes various support services. Please refer to the license document or visit our website for more information about available services.

Before you contact our customer service department, please read this manual first. In most cases you find the answer here. However if you still experience problems, we will be more than happy to help you...

For all support inquiries, please contact support@sunnyscript.com and provide the following information:

* The license number of the concerned product.
* A close description of the problem or question you have (no file attachments, please).
* For technical inquiries: Used server environment, URL of admin panel & admin password.
 

Now we wish you a great time with our software products :-)

 
© SunnyScript - A subsidiary of Star Enterprise. Visit the SunnyScript website.
Please read our terms of business located at... http://www.sunnyscript.com/terms.htm