The mSQL FAQ $Revision: 1.14 $ $Date: 1996/02/29 07:15:50 $ Preamble A text copy of this FAQ can be obtained via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/faq.txt or an HTML copy can be obtained via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/faq.html It may take a couple of days for the new versions of the FAQ to be moved into the mSQL area. If you're desperate for the latest FAQ try looking for: ftp://bond.edu.au/pub/Minerva/msql/Incoming/faq.txt or ftp://bond.edu.au/pub/Minerva/msql/Incoming/faq.html Notification of the FAQ's status is posted to the mSQL mailing list twice a month - on or around the 1st and 16th of the month. This notification will occur even if the contents of the FAQ have not changed since the last notification. Additional releases of the FAQ may occur from time to time, when necessary patches are announced or when a new release of mSQL is made available for example. This FAQ is maintained by Peter Samuel . While every attempt is made to ensure that the information contained in this FAQ is accurate, no guarantees of accuracy can or will be made. Third party applications mentioned in this FAQ may not be compatible with the current release of mSQL - by necessity their development will lag that of mSQL. If you have any questions concerning their status please contact the mSQL mailing list or the author of the application in question. New questions in the FAQ are marked with (=). Questions that have been modified since the last release of the FAQ are marked with (-). NOTE: BEFORE POSTING A QUESTION TO THE mSQL MAILING LIST, PLEASE READ THE SECTION "How do I post a question to the mSQL mailing list". ---------------------------------------------------------------------------- --------------------------------------------------------- Contents * General Information 1. What is SQL? 2. What is mSQL? 3. What platforms will it run on? 4. Is it free? 5. Where can I get it? 6. What is the latest version? 7. (-) When will the next version be released? 8. Why is David called Bambi? 9. How is this FAQ prepared? * Help and Support 1. (=) Are there any known bugs or problems with the current release of mSQL? 2. Are there any recommended patches to the latest version? 3. (-) Are there any other patches available? 4. How do I apply patches to the mSQL source? 5. Is online documentation available? 6. Is there a mailing list for mSQL? 7. How do I post a question to the mSQL mailing list? (PLEASE READ THIS!) 8. I've found a bug. How can I tell if it's been fixed yet? 9. How do I report a bug in mSQL? 10. How do I contribute a patch to mSQL? 11. How do I contribute code to the mSQL community? 12. Where can I find examples of code that interface with mSQL? * Features and Limitations 1. What support programs are bundled with mSQL? 2. What datatypes are supported? 3. What SQL commands are supported? 4. Does mSQL support keys? 5. What functions does the mSQL API provide? 6. Are views or virtual tables supported? 7. Does mSQL support table aliasing? 8. Are column constraints supported? 9. Are stored procedures supported? 10. Are access privileges supported? 11. Does mSQL support BLOBs? 12. Are the transaction commands, BEGIN, COMMIT, and ROLLBACK supported? 13. What are the limits on table and field names? 14. What other limits can be modified? 15. How much data can mSQL address? 16. Are there any limitations in the way mSQL handles logical expressions? 17. How does mSQL return values? 18. How does SELECT return rows? 19. Can mSQL nest tables? 20. What storage overheads does mSQL have? 21. Does msqld allocate more RAM to itself as new databases are added? 22. Does performance degrade as the number of databases increase? 23. Does mSQL support cursors? * Installation Problems 1. Under Irix (SGI) I get problems relating to my username 2. On OSF/1 or HP-UX I have trouble starting msqld at boot time 3. Should I use cc or gcc when building mSQL on my Dec Alpha running OSF/1? 4. Does mSQL work with Linux mmap()? 5. Does mSQL work with HP-UX mmap()? 6. I'm having trouble compiling MsqlPerl-1.03 with mSQL under HP-UX 7. How can I install mSQL on a SCO Unix system? 8. Why does setup fail when building mSQL on a Linux system? 9. How can I make mSQL run on an Amiga running NetBSD 1.1? * Runtime Problems 1. msqladmin will not let me create a database 2. When I start msqld it complains about an ACL file 3. When I start msqld it complains about a PID file 4. I've just installed the latest version of mSQL and now my own applications won't work! 5. Access control doesn't work with my setuid applications 6. Why do I see an "Address already in use" error message when I attempt to start msqld? 7. How can I avoid running out of space when doing certain complex table joins? 8. msqld is suddenly dumping core and complaining about bzero() 9. (=) Why does relshow drop the first two characters from its output? * How do I ....? 1. How do I embed single quotes in a field? 2. What other characters need special treatment? 3. How do I handle null fields? 4. How do I perform case insensitive matches? 5. How do I add a column to an existing table? 6. When should I call msqlConnect() in a parent/child situation? 7. Can I use mSQL reserved words as field or table names? 8. How do I find the maximum or minimum value in a table? 9. How can I determine the structure of a database? 10. What happens when the mSQL server goes down between requests? 11. Can I run more than one copy of msqld on the same CPU? 12. (-) How can I automatically ensure that each record receives a unique primary key? * (-) Contributed Code and Third Party Applications ---------------------------------------------------------------------------- --------------------------------------------------------- General Information What is SQL? The following section is based on chapter 1 of "Oracle7 Server - SQL Language Reference Manual" - Oracle Corporation, December 1992, part number 778-70-1292. SQL is an acronym that stands for Structured Query Language. It is often pronounced "sequel". It was developed in the mid 1970s by IBM. The American National Standards Institute (ANSI) and the International Standards Organisation (ISO) have adopted SQL as the standard language for relational database management systems. SQL provides commands for a variety of tasks including: * querying data * inserting, updating and deleting rows in a table * creating, replacing, altering and dropping objects * controlling access to the database and its objects * guaranteeing database consistency and integrity SQL provides easy to learn commands that are both consistent and applicable for all users. While most relational database management systems - including mSQL - provide support for SQL, each vendor usually has their own unique extensions to the language that may hinder the portability of SQL procedures from one database platform to another. ---------------------------------------------------------------------------- What is mSQL? mSQL is mini SQL, a light weight database engine developed by David J. Hughes at Bond University, Australia. It has been designed to provide fast access to stored data with low memory requirements. As its name implies mSQL offers a subset of SQL as its query interface. Although it only supports a subset of SQL, everything it supports is in accordance with the ANSI SQL specification. ---------------------------------------------------------------------------- What platforms will it run on? mSQL has been developed under Sun OS 4.1.1 but has been tested under Solaris 2.3, Ultrix 4.3, Linux, and OSF/1 (cc not gcc). That said, it should "autoconf" and build on most BSD derived systems, SVR4 based systems or POSIX O/S's (that should cover most of them). It has been reported that it works out-of-the-box on HP-UX, NeXT, SCO, Sequent, Cray, Tandem, *BSD and a few others. ---------------------------------------------------------------------------- Is it free? David Hughes writes: "mSQL has been released in the past under terms known as 'conscience-ware', the basic concept of which was that companies that used the software could contribute a small amount to the continued development of the software without any strict rules being placed upon such 'donations'. Although the concept sounds fair, it failed badly with only 3 contributions being made from over 3,600 copies of mSQL-1.0.5 that were ftp'ed from my machine alone. Over 1,000 of those copies went to commercial organisations and I receive many questions a day from companies using mSQL behind their WWW servers etc who are looking for free support. In an attempt to balance this out and allow me to devote some time to mSQL (rather than other pursuits that I do to generate an income), mSQL is now shareware. I still believe in free software over the Internet and cooperation in research so the new license is designed not to hurt Universities, research groups and other people that _should_ have free access to software. Commercial organisations that are using this so that they don't have to buy an Oracle or an Ingres will now have to buy mSQL (at a minute fraction of the cost of one of the commercial offerings). Please read the doc/License file to see if you are required to register your copy. An invoice is included in both Postscript and ASCII format to ease the generation of payments." As of release 1.0.12, the cost of mSQL is: Commercial Installation - AUD $225 Private Installation - AUD $65 Exchange rates may vary wildly, but at the time of preparing this FAQ, the Australian dollar was trading at about 0.75 US dollars. This information is provided as an indication only. You MUST check your local exchange rates before preparing to purchase mSQL. An online currency conversion system developed by Olsen & Associates is available at http://www.olsen.ch/cgi-bin/exmenu. ---------------------------------------------------------------------------- Where can I get it? mSQL can be obtained via anonymous ftp from Bond University, Australia. The latest version can be found in the directory: ftp://bond.edu.au/pub/Minerva/msql/ ---------------------------------------------------------------------------- What is the latest version? At the time of compiling this FAQ, the latest released version was 1.0.12. The much talked about version 2 was still being developed. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/msql-1.0.12.tar.gz (191071 bytes) ---------------------------------------------------------------------------- When will the next version be released? David has suspended all development work on mSQL version 1.x and is concentrating his efforts on version 2. However, he will continue to provide any necessary bug fixes for the current release of mSQL. mSQL development is NOT David's primary role. He does this work in whatever spare time he has available so PLEASE don't pester him with requests about when we can expect version 2. Take the zen approach and just let it happen :) Just to whet your appetite, here is a current "state of play" snapshot for the up and coming 2.x release of mSQL. Complete code reorganisation completed Removal of all memory leaks completed Use of B-Trees for keys completed Support for compound keys completed API modifications completed Support for secondary indices 90% completed Support for variable length chars 90% completed Central server configuration file completed New server architecture (100 client connections) 50% Threaded back end server (multiple query paths) designed Extended scalar types (date, time etc) designed Functions (min, mac, avg etc) designed Full expression support in conditions planned Enhanced security (SSL) planned Sequence generator planned Locking / transactions planned A preliminary 2.x performance teaser follows: David Hughes writes: On the mSQL-2 front, it's coming along well. The new file format, varchar, index, and query-plan code is running and not dumping core any more (the most positive sign I've had in a while). I've been running a few tests on a 35,000 row table and it looks good. Joins using the new indices are great. I did a join of the above table onto itself and provided a condition like "where A.name='foo' and B.name='ZZZ'" (there were no matching rows for the second part of the condition). Using mSQL-1 it took 5 minutes on the dot to do the join (i.e. 35,000 * 35,000 reads, merges, matches etc) and produced a result table with 0 rows as expected. Using mSQL-2 it took 0.4 seconds! It realised that the index of the inner loop didn't produce anything so it never actually read an inner row or did any of the real work of the join. Anyway, I'm rambling (staring at code for too long me thinks), but it is starting to look good. ---------------------------------------------------------------------------- Why is David called Bambi? Bambi is a nickname that David acquired quite a long time ago. He claims there are no derogatory implications associated with the name. If you'd like to find out more send him some mail at . ---------------------------------------------------------------------------- How is this FAQ prepared? The FAQ is written in HTML and proofread using version 2.0 the Netscape Navigator running under Solaris 2.4. The HTML syntax is checked using version 1.014 of Neil Bowers' weblint package. Text versions of the FAQ are created by saving the document as a text file from within the Netscape Navigator. (See http://www.khoral.com/staff/neilb/weblint.html for more details on weblint). ---------------------------------------------------------------------------- --------------------------------------------------------- Help and Support Are there any known bugs or problems with the current release of mSQL? Since the release of mSQL 1.0.12, several problems have been reported to the mSQL mailing list. These are outlined below. * Problems with table/field name lengths The definition of NAME_LEN changed from version 1.0.10 to 1.0.12. It now seems that 18 characters is the maximum value for a table or field name. David Hughes writes: The reason it changed in 1.0.12 is because I had a couple of field_name buffers that didn't have room for a trailing NULL. Now, trying to fix that without altering the size of the struct implies that you have to shorten the name of the field (to leave the required room). I didn't want to force everyone out there to drop and reload every database they have just because of a 1 byte buffer over-run. If this is a major problem for you then .... o dump all your databases o find the definition in question o set it to a value you like o rebuild everything o reload everything If you can work out what to change to get the extra field name length then you know enough about what you are doing to do the rest of what's required. I haven't provided a step-by-step because if people can't find the value they have to change I'm sure they'd still end up asking the list about this stuff after breaking things. At present there is NO patch to fix this problem. Possible workarounds are David's method outlined above or to downgrade to version 1.0.10. * Problems with row deletion under Linux Under several releases of the Linux operating system, the msqld daemon will die when attempting the next SQL command after a DELETE operation. msqld exits with the following information: mSQL Server 1.0.12 starting ... Hit by a sig 11 Forced server shutdown due to bad signal! Forcing close on Socket 6 To date, the following combinations have been tested: Linux Version mSQL Version Symptoms 1.2.10 1.0.12 msqld dies on command after delete 1.3.30 1.0.12 msqld dies on command after delete l.3.68 1.0.12 msqld dies on command after delete 1.3.59 1.0.11 msqld dies on delete 1.3.68 1.0.11 msqld dies on delete 1.3.68 1.0.10 delete works fine 1.2.13 1.0.10 delete works fine The problem seems to be unique to Linux - Solaris 2.x installations report successful operation of version 1.0.12. The current workaround is to downgrade to version 1.0.10. A patch has been posted to the mailing list but it hasn't been verified yet. ---------------------------------------------------------------------------- Are there any recommended patches to the latest version? There are no official patches to any release of mSQL. If modifications need to be made, a new version of mSQL will be released. The above notwithstanding, there is one unofficial recommended patch that should be applied to mSQL version 1.0.12. This recommended patch comes from Dr Andreas F Muller and fixes a problem with msqldump. Andreas writes: ... to get a well defined exit status from msqldump (to tell whether the dump has succeeded or not), you need to add an exit(0) at the end of the main function in msqldump.c. It was bad in 1.0.8 and is still bad in 1.0.10. I met this problem on Solaris 2.5, Sparc, version 1.0.10 of msql. *** src/msql/msqldump.c.orig Tue Oct 3 10:34:51 1995 --- src/msql/msqldump.c Mon Jan 8 09:54:32 1996 *************** *** 387,392 **** --- 387,394 ---- } dbDisconnect(host); printf("\n"); + + exit(0); } To avoid conflicts with mismatched whitespace, apply this patch using the "-l" option of patch. (That's an "el", NOT a "one" or an "eye"). ---------------------------------------------------------------------------- Are there any other patches available? This FAQ only details those recommended patches that are necessary for the general operation of mSQL. There are a number of other user contributed patches that enhance the operation of mSQL. Some of these patches are available via anonymous ftp while others are available from the mSQL mailing list archives. Some of these patches are for older releases of mSQL. They may have been rolled into subsequent releases of mSQL or they may not work with later releases of mSQL or they may break the successful operation of later releases of mSQL. Use them at your own risk. A brief and no doubt incomplete list of these patches follows: * Case insensitive searching. You can use statements like: select name from table where name ilike 'Manu%' Contributed by Benjamin Jacquard . Available from the mSQL mailing list archives for the month of February 1996. ---------------------------------------------------------------------------- How do I apply patches to the mSQL source? Patches are distributed as context based difference listings. That is the line by line differences between the original file and the new file are listed with surrounding lines of code to provide some context information. They are usually generated by using a program such as diff. The easiest way to apply these patches is to use Larry Wall's patch program: Patch will take a patch file containing any of the four forms of difference listing produced by the diff program and apply those differences to an original file, producing a patched version. By default, the patched version is put in place of the original, with the original file backed up to the same name with the extension ".orig". Patch is available from a number of anonymous ftp sites worldwide. Latest versions of patch are being distributed by the Free Software Foundation as part of the GNU suite of products. If you're having difficulty finding the latest version of patch, you can download version 2.1 via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Misc/patch-2.1.tar.gz (74856 bytes) While some patches are fairly simple - often involving minor changes to a single line of code - others are quite complex and attempting to apply these patches by hand is definitely NOT recommended. Use the patch program whenever you need to apply a patch. To apply the patches listed in this FAQ, use this procedure: 1. Save the patch to a file - say /tmp/msql-patch1. Only save the patch information - the patch program can usually determine which parts of the file are patches and which parts are not but its easier for you to strip out any unnecessary information before running patch. You should be left with a file containing a number of sections similar to: *** ./src/msql/net.c.orig Tue Oct 17 11:24:03 1995 --- ./src/msql/net.c Tue Dec 12 15:24:11 1995 *************** *** 66,72 **** ! void writePkt(fd) int fd; { u_char *cp; --- 66,72 ---- ! int writePkt(fd) int fd; { u_char *cp; 2. Change directories to your mSQL source repository. For example: cd /usr/local/src/db/Minerva/msql/msql-1.0.12 3. Apply the patch as follows: patch -l < /tmp/msql-patch1 The "-l" option is used to tell patch to ignore any whitespace mismatches between lines in the patch file and lines in the mSQL source file. (That's an "el", NOT a "one" or an "eye"). Patch will respond with output similar to: Hmm... Looks like a new-style context diff to me... The text leading up to this was: -------------------------- |*** ./src/msql/net.c.orig Tue Oct 17 11:24:03 1995 |--- ./src/msql/net.c Tue Dec 12 15:24:11 1995 -------------------------- Patching file ./src/msql/net.c using Plan A... Hunk #1 succeeded at 66. Hunk #2 succeeded at 84. done If you have problems applying the patch, you may wish to consider using some or all of the following arguments to patch: o -b forces patch to create a backup of the original file. By default it adds a .orig suffix to the original filename. o -N forces patch to ignore patches that it thinks are reversed or already applied. o -p0 (That's a "zero", NOT an "oh"). forces patch to honour the full pathname of the files listed in the patch file. 4. Recompile mSQL. If you have third party applications that use the mSQL library, you'll probably have to recompile them as well. ---------------------------------------------------------------------------- Is online documentation available? A set of WWW pages for mSQL, w3-msql, ESL and Minerva are now available from http://Hughes.com.au ---------------------------------------------------------------------------- Is there a mailing list for mSQL? Yes. To subscribe to the list, send the word "subscribe" in the body of your message to msql-list-request@bunyip.com. To unsubscribe from the list send the word "unsubscribe" in the body of your message to msql-list-request@bunyip.com. Postings should be addressed to msql-list@bunyip.com. Archives of the mailing list are available via anonymous ftp from: ftp://ftp.bunyip.com/pub/mailing-lists/msql-list.archive/ Each month's archive is stored in a file: msql-list.archive.YYMM where YYMM represents the year and month. So the archive for October 1995 would be in the file: msql-list.archive.9510 These files are also available from the majordomo mailing list server at bunyip.com. To receive a list of the archive files available as well as the majordomo help file send a message to majordomo@bunyip.com with the text: index msql-list help END in the body of the message. To reach a human for help send a note to: owner-msql-list@bunyip.com or listmaster@bunyip.com The mailing list discusses issues that arise from the use of mSQL and w3-msql (both products developed by David Hughes). Often discussions on contributed software arise but it is probably best to take these discussions off line and summarise solutions back to the list. Traffic on the list is moderate. There were approximately 2400 postings between February 1 1995 and October 18 1995 which gives an average of around 280 messages per month. (If you think this is high, try subscribing to the firewalls list - this has an average of around 1000 postings per month!) Turn around times for postings can sometimes be a little slow. It is not unusual for messages sent from Australia to take a few hours to appear on the list. List subscribers from other countries have also reported similar turn around times. Please be patient. ---------------------------------------------------------------------------- How do I post a question to the mSQL mailing list? Before you post a question to the mSQL mailing list, read the manual that came with the mSQL distribution. Also, ask yourself the following question: Is there any way I can find the answer to this question myself? If you can figure out a way to simply find the answer, then it will probably be quicker than asking the list. If you think your answer would be helpful to others then post a summary to the mailing list. Postings should be addressed to msql-list@bunyip.com. IF YOU POST A QUESTION TO THE LIST ASKING FOR HELP, YOU MUST INCLUDE THE FOLLOWING INFORMATION! 1. The operating system you are using - for example Solaris 2.4 or Linux 1.3.1. On Unix like systems, this can usually be obtained by running the command: uname -a 2. The processor type - for example sparc, Intel 386, HP PA-RISC, mc68020. Often the same operating system may run on different processors. 3. The output of the command: msqladmin version 4. Which, if any, unofficial patches you have applied to the version of mSQL you're using. 5. The name and version details of any third party application you are using with mSQL. Failure to include these details makes it almost impossible to pinpoint the cause of your problem. ---------------------------------------------------------------------------- I've found a bug. How can I tell if it's been fixed yet? The status of the development is reflected in the HISTORY file. An on-line copy of the HISTORY file is kept on the Hughes Technology web pages. This file is updated as each modification is made to the sources. Any bugs that have been fixed in the code since it was last release will be mentioned in the on-line release history information. You can access this file on the web as: http://Hughes.com.au/product/msql/history.htm ---------------------------------------------------------------------------- How do I report a bug in mSQL? The first thing to remember is that you should NOT mail David Hughes (aka Bambi) directly with your questions - this just makes the process slower. Any questions you have or bug reports you wish to make should be sent to the mSQL mailing list. If you want to report a bug, send a report to the mSQL mailing list at msql-list@bunyip.com. Please include the following: * the operating system and version - for example Solaris 2.4 or HP-UX 9.1 * the processor you are using - for example sparc or Intel 486 * include the output of "msqladmin version" * which, if any, unofficial patches you have applied to the version of mSQL you're using * include a dump of a test database using msqldump * include an mSQL script that will show the bug You should also ensure that you are running the latest (stable) version of mSQL before posting a bug report to the mailing list as David fixes bugs in every version. ---------------------------------------------------------------------------- How do I contribute a patch to mSQL? Following this procedure will standardise the manner in which unofficial mSQL patches are distributed to the mSQL user community. 1. Ensure that you are patching the latest version of mSQL. 2. Ensure that you have applied any necessary unofficial recommended patches to the latest version. 3. Make your changes to the "src" hierarchy of mSQL. For example, if you need to patch the file: msqld.c Save the original file as follows: cp ./src/msql/msqld.c ./src/msql/msqld.c.orig Make your changes to the file: ./src/msql/msqld.c 4. Test, double test and triple test your patch to make sure it REALLY fixes a problem. 5. Generate a difference listing suitable for use by Larry Wall's patch program: diff -c ./src/msql/msqld.c.orig ./src/msql/msqld.c 6. Post this difference listing and an explanation of the patch to the mSQL mailing list. If at all possible, try to avoid posting 'monster' patches. If your patch modifies a number of separate aspects of mSQL, split each of these into different patches. This makes it easier for people to apply feature specific patches to mSQL while avoiding unwanted feature patches. ---------------------------------------------------------------------------- How do I contribute code to the mSQL community? Contributed code can be uploaded to the ftp server at Bond University Australia. Place your code in the directory: ftp://bond.edu.au/pub/Minerva/msql/Incoming then notify David at . He will move your contribution to the mSQL contributions directory: ftp://bond.edu.au/pub/Minerva/msql/Contrib You may like to discuss your proposed code with others on the mSQL mailing list. The subscribers to this list may be able to help you with improvements or modifications to your code or advise you of work already available in your area. ---------------------------------------------------------------------------- Where can I find examples of code that interface with mSQL? If you're writing code in the C programming language, examine the mSQL distribution itself. All the auxiliary programs use the mSQL API in a variety of ways. Pay particular attention to: * ./src/msql/msql.c * ./src/msql/relshow.c * ./src/msql/msqldump.c * ./src/msql/msqladmin.c If you're writing code in other languages, have a look through the distribution of the mSQL language extension itself for examples. Another good place to look is the mSQL mailing list archives. ---------------------------------------------------------------------------- --------------------------------------------------------- Features and Limitations What support programs are bundled with mSQL? mSQL is bundled with the following programs: msqld the mSQL database server. msqladmin handles administrative details such as creation and deletion of databases, server shutdown etc. msql the mSQL monitor. It provides a user interface for making SQL queries on databases. Dumps a database in ASCII format. The dump takes msqldump the form of SQL commands so that the entire database can be re-created from the dump file. relshow The mSQL schema viewer. Shows table details for a given database. For more details see the documentation that comes with mSQL. ---------------------------------------------------------------------------- What datatypes are supported? mSQL supports the following datatypes: char int (4 bytes) real (8 bytes) The internal storage for types int and real is held at 4 bytes and 8 bytes respectively regardless of the system architecture you're using. So even on 64 bit Crays a real will be 8 bytes. For more details see the documentation that comes with mSQL. mSQL version 2 will support more data types. ---------------------------------------------------------------------------- What SQL commands are supported? mSQL supports the following SQL commands: CREATE TABLE table_name ( col_name col_type [ not null | primary key ] [, col_name col_type [ not null | primary key ] ]** ) DROP TABLE table_name INSERT INTO table_name [ ( column [ , column ]** ) ] VALUES (value [, value]** ) DELETE FROM table_name WHERE column OPERATOR value [ AND | OR column OPERATOR value ]** OPERATOR can be <, >, =, <=, >=, <>, or LIKE SELECT [table.]column [ , [table.]column ]** FROM table [ = alias] [ , table [ = alias] ]** [ WHERE [table.]column OPERATOR VALUE [ AND | OR [table.]column OPERATOR VALUE]** ] [ ORDER BY [table.]column [DESC] [, [table.]column [DESC] ] OPERATOR can be <, >, =, <=, >=, <>, or LIKE VALUE can be a literal value or a column name UPDATE table_name SET column=value [ , column=value ]** WHERE column OPERATOR value [ AND | OR column OPERATOR value ]** OPERATOR can be <, >, =, <=, >=, <>, or LIKE For more details see the documentation that comes with mSQL. mSQL version 2 will support more SQL commands. ---------------------------------------------------------------------------- Does mSQL support keys? Yes. Any single field of a table can be designated as the primary key. These keys are, by definition, unique. In its current implementation, mSQL does not support multiple keys within a table. For more details see the documentation that comes with mSQL. ---------------------------------------------------------------------------- What functions does the mSQL API provide? The mSQL API provides the following functions and macros: int msqlConnect(char *host); FUNCTION int msqlSelectDB(int sock, char *dbname); FUNCTION int msqlQuery(int sock, char *query); FUNCTION m_result * msqlStoreResult(); FUNCTION void msqlFreeResult(m_result *result); FUNCTION m_row msqlFetchRow(m_result *result); FUNCTION void msqlDataSeek(m_result *result, int pos); FUNCTION int msqlNumRows(m_result *result); MACRO m_field * msqlFetchField(m_result *result); FUNCTION void msqlFieldSeek(m_result *result, int pos); FUNCTION int msqlNumFields(m_result *result); MACRO m_result * msqlListDBs(int sock); FUNCTION m_result * msqlListTables(int sock); FUNCTION m_result * msqlListFields(int sock, char *tableName); FUNCTION void msqlClose(int sock); FUNCTION For more details see the documentation that comes with mSQL. Note: The PostScript documentation that comes with mSQL lists the function msqlClose() as type int. This is incorrect. It is actually type void. ---------------------------------------------------------------------------- Are views or virtual tables supported? No. This feature may be included in mSQL version 2. ---------------------------------------------------------------------------- Does mSQL support table aliasing? Yes. As an example, consider this method to find the list of grandparents from a child/parent tuple: SELECT t1.parent, t2.child from parent_data=t1,parent_data=t2 WHERE t1.child=t2.parent mSQL also supports the SQL standard method of table aliasing which uses either a space character or the keyword AS instead of an = character. So the above example can also be written as either: SELECT t1.parent, t2.child from parent_data t1,parent_data t2 WHERE t1.child=t2.parent or SELECT t1.parent, t2.child from parent_data AS t1,parent_data AS t2 WHERE t1.child=t2.parent ---------------------------------------------------------------------------- Are column constraints supported? No. ---------------------------------------------------------------------------- Are stored procedures supported? No - that's getting beyond the scope of Mini SQL (see Oracle :) ---------------------------------------------------------------------------- Are access privileges supported? Yes. mSQL has an access control file which allows the database administrator to control access on a user and host level. For more details see the documentation that comes with mSQL. mSQL does not support access control from within SQL commands. ---------------------------------------------------------------------------- Does mSQL support BLOBs? BLOBs are Binary Large OBjects. Typical examples would be large blocks of text, graphics or audio data. The current release of mSQL has NO direct support for BLOBs. However, you can always store the path name of a file that points to the BLOB in one of the fields of your table. Then your application can deal with the file name appropriately. If you're dealing with large blocks of text, you may also wish to consider this approach from Pascal Forget : Another possible hack would be to have the "block_text" record contain a pointer to a "text_lines" table. This table would contain a linked list of text lines like this: CREATE TABLE text_lines ( line_id int primary key, string char(80), next_line int ) Later versions of mSQL may have support for BLOBs. ---------------------------------------------------------------------------- Are the transaction commands, BEGIN, COMMIT, and ROLLBACK supported? No, and they will probably never be supported (once again that's beyond the scope of mSQL). The mSQL server handles requests serially - that is only one user's request is handled at a time. Therefore there is no danger of a user reading from a table that is currently being updated by another user. However, there is the possibility that the same read operations may straddle another user's write operation so that different data will be returned from each read. mSQL version 2 will provide client initiated locking. ---------------------------------------------------------------------------- What are the limits on table and field names? A table or field name MUST begin with an alphabetic character. The remainder of the name may be any of the following 63 characters: * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z * a b c d e f g h i j k l m n o p q r s t u v w x y z * 0 1 2 3 4 5 6 7 8 9 * _ (that's an "underbar" NOT a "dash") The maximum name length is set to 20 characters. That's for a table or a field in a table. This allows for 813621925049196536663393538834956800 possible naming combinations using the characters listed above. For the mathematically inclined that's: 19 ----- \ \ i 52 * / 63 = 813621925049196536663393538834956800 / ----- i = 0 Though in practise, many of these combinations will probably remain unused. While not recommended, the default maximum name length value of 20 can be changed by editing the mSQL source code. However, if you change it AFTER you have already created ANY databases, the old databases will be unreadable. To avoid this problem, follow this procedure: 1. Dump your old databases to ASCII files using msqldump. 2. Drop your old databases using msqladmin. 3. Shutdown the mSQL database server msqld using msqladmin. 4. Edit the mSQL source and modify ./src/msql/msql_priv.h Change the line reading #define NAME_LEN 19 /* Field/table name length */ to suit your needs. Ensure that you use a number that is one less than the maximum value you desire. For example, if you wish to have a name length of 36 you would change the line to read: #define NAME_LEN 35 /* Field/table name length */ 5. Recompile and install the modified mSQL. 6. Start the new mSQL database server msqld. 7. Create new databases using msqladmin. 8. Repopulate your databases using msql and the ASCII dumps from step 1. ---------------------------------------------------------------------------- What other limits can be modified? The file ./src/msql/msql_priv.h contains the definitions of the internal mSQL limits: #define MAX_FIELDS 75 /* Max fields per query */ #define MAX_CON 24 /* Max connections */ #define BUF_SIZE (256*1024) /* Read buf size if no mmap() */ #define NAME_LEN 19 /* Field/table name length */ #define PKT_LEN (32*1024) /* Max size of client/server packet */ #define CACHE_SIZE 8 /* Size of table cache */ If you want to increase them you can just edit this file and recompile. Don't change MAX_CON or CACHE_SIZE without understanding why these limits are set (maximum file descriptors per process etc). Changing any of these parameters will almost certainly make any existing databases unreadable. To avoid this problem, follow this procedure: 1. Dump your old databases to ASCII files using msqldump. 2. Drop your old databases using msqladmin. 3. Shutdown the mSQL database server msqld using msqladmin. 4. Edit the mSQL source and modify ./src/msql/msql_priv.h changing the definitions to suit your needs. 5. Recompile and install the modified mSQL. 6. Start the new mSQL database server msqld. 7. Create new databases using msqladmin. 8. Repopulate your databases using msql and the ASCII dumps from step 1. ---------------------------------------------------------------------------- How much data can mSQL address? mSQL can theoretically address tables with a maximum size of 4 gigabytes. In practise you'll probably run up against operating system limitations well before this theoretical limit. ---------------------------------------------------------------------------- Are there any limitations in the way mSQL handles logical expressions? Yes. Consider the SQL query: SELECT something from somewhere WHERE name='jan' or country='italy' and sex='female' or title='ms' Under the current release of mSQL, the parser will scan the condition from left to right. So in this example the condition reads: ((name='jan' or country='italy') and sex='female') or title='ms' The current release of mSQL does NOT support parentheses in logical expressions, so there is NO way to change this parsing. Future versions of mSQL may support user defined levels of associativity. ---------------------------------------------------------------------------- How does mSQL return values? mSQL returns all values as ASCII strings. If, for example, you are expecting an integer result you may have to do some internal conversions depending on the language you're using. In C, for example, see the manual pages on atoi(). ---------------------------------------------------------------------------- How does SELECT return rows? On Tue, 4 Jul 1995, Karri-Pekka Laakso wrote: Does SELECT return the rows always in order 'first inserted first', if there is no ORDER statement given, and the rows are selected from one table only, and there has been no DELETEs on that table? It seems be so, but is it guaranteed? David Hughes replied: This is guaranteed. The only time the rows will be returned in another order is if you have deleted a row and it's then filled by a later insert. ---------------------------------------------------------------------------- Can mSQL nest tables? On Tue, 25 Jul 1995, Jerome Stoller wrote: I am new at mSQL, and have a beginner question: Is it possible to create a table "normally", and to have the fields of one of the column being[sic] another table? David Hughes replied: You can't nest tables in mSQL (don't think you can in ANSI SQL either). What you can do is to use a common value as a key to join the contents of two tables (eg. a part number or a user ID). ---------------------------------------------------------------------------- What storage overheads does mSQL have? mSQL stores each database in its own directory under the 'msqldb' directory of wherever you specified mSQL should be installed. For example if you specified that mSQL should be installed in: /usr/local/Minerva/ then the databases will be created in the directory: /usr/local/Minerva/msqldb/ Note that this can be overridden by specifying the MSQL_HOME environment variable when starting msqld. Each table in the database is stored as a number of files: * dbname/table.dat - table data. This file contains the data for all the rows in the table. For each field in a table, mSQL will also store an additional flag byte. mSQL also stores an additional flag byte for each row of the table. Consider the following table: CREATE TABLE test ( f0 char(13), f1 int, f2 real, f3 real, f4 real, f5 real, f6 int ) Storage space for each row of this table would be: (13 * char) + (2 * int) + (4 * double) + (7 * fields) + (1 * rows) = (13 * 1) + (2 * 4) + (4 * 8) + (7 * 1) + 1 = 61 bytes So if this table had 1000 records, it would occupy 61000 bytes of disk space. (In reality it may occupy slightly more real disk space because of the way the underlying file system behaves. This is operating system specific and not really an issue to worry about. If you do an 'ls -l' on the file it will show 61000 bytes). * dbname/table.key - table keys. This file will only exist if the table has a primary key. It contains the key pointers into the table data file. The size of this file will be the size of the key plus one flag byte times the number of rows in the table. In the above example, if the table was defined as: CREATE TABLE test ( f0 char(13) primary key, f1 int, f2 real, f3 real, f4 real, f5 real, f6 int ) and the table had 1000 rows, the size of the data file would still be 61000 bytes and the size of the key file would be: ((13 * char) + 1) * 1000 = ((13 * 1) + 1) * 1000 = 14 * 1000 = 14000 bytes * dbname/table.def - table definition. This file contains the table structure definition. Each field in the table has a 64 byte definition. Using the example above, the table has 7 fields so the size of the definition file will be: 7 * 64 = 448 bytes * dbname/table.stk - table stack. This file keeps track of the holes or empty rows in the table. For every hole in the table, this file will contain a 4 byte integer indicating the row number of the hole. It is accessed like a stack. When a row is deleted, it's index is appended to the file. When an insert is done, the last 4 bytes are "popped" off the file and the file is truncated back 4 bytes. If the table contains 20 holes, the size of the stack file will be: 20 * 4 = 80 bytes If the table contains no holes then this file will have zero length. Therefore to calculate the storage requirements for a table, use one of the following formulae: Tables with a primary key: table_storage_requirements = expected_max_rows * ( number_of_fields + 1 + total_chars + (4 * total_ints) + (8 * total_reals) + (size_of_key + 1) + (4 * expected_deletion_ratio) ) + (total_fields * 64) Tables without a primary key: table_storage_requirements = expected_max_rows * ( number_of_fields + 1 + total_chars + (4 * total_ints) + (8 * total_reals) + (4 * expected_deletion_ratio) ) + (total_fields * 64) Using the keyed table above, if we expect it to contain a maximum of 10000 rows and we expect to have a 10 percent deletion ratio (that is at any one time we expect that 10 percent of our rows have been deleted but not replaced by new rows), we should allow for: 10000 * ( 7 + 1 + 13 + (4 * 2) + (8 * 4) + (13 + 1) + (4 * 0.10) ) + (7 * 64) = 10000 * ( 21 + 8 + 32 + 14 + 0.4) + 448 = 754448 bytes plus a handful of bytes to store file names in directories. Note that this is the maximum storage allocation. Unlike some other database systems, mSQL only uses disk space when it has data to add to a table - it does NOT allocate a large block of empty disk space and then proceed to fill it. If our example only had 1000 rows the storage requirements would only be 75848 bytes. ---------------------------------------------------------------------------- Does msqld allocate more RAM to itself as new databases are added? On Fri, 11 Aug 1995, Andrew Waegel wrote: does msqld allocate more ram to itself as new db's are added? i.e. is any part of the database held in ram or does it just access the database files directly from disc? I need to do some planning, and want to know if I need to plan to get more simms... David Hughes replies: If your OS supports mmap() (e.g. Solaris, SunOS, *BSD, BSDI, Linux 1.3.x, HP-UX >9.x) then the more memory you throw at it the better things will get if you are using big databases. The data is left on disk but is accessed via the virtual memory subsystem so it will be in memory some of the time. If you are not using mmap() then data is just read from disk as it is needed. There's a small buffer in the read code to make things faster but that's about it. It doesn't matter how many databases you have defined it only uses 1 buffer. ---------------------------------------------------------------------------- Does performance degrade as the number of databases increase? On Fri, 11 Aug 1995, Andrew Waegel wrote: Does performance degrade at all as the number of databases increases? That is, say a query from database A took n seconds when database A was the only one served by msqld. After adding databases B, C, D and E, should the database A query take any longer? It seems like 'no' from my experience, but... David Hughes replies: No. It will degrade if people are hitting the new databases at the same time as they are hitting database A though. msqld only handles 1 query at a time so if 2 queries come in they are queued and processed in order. ---------------------------------------------------------------------------- Does mSQL support cursors? Pascal Forget replies to a posting by Brian Bartholomew: > To browse the database, I want mSQL to return me the first row > in the database, and keep a pointer to it. Then sometime later > I can ask it for the second row, and so on. mSQL does not provide support for cursors. You'll have to issue a SELECT query each time you want the next row. mSQL has no provisions for modifying a result set once it has been created. I suggest you add a field containing a unique identifier for each row, then fetch the next row using: SELECT ... FROM mytable where unique_field > last_id LIMIT 1 > How do I express this in sql? If you find a way to express it, it most certainly won't be in standard SQL, as the language has no support for cursors. > I see that I could add an explicit field that was an arbitrary > row number, and query for the current row number +/- 1, but over > time with insertions and deletions there would be gaps and the > query would break. How is this problem usually solved? The select statement I gave you won't break even if there are gaps in the unique identifiers. You can periodically "compact" the numbers if you want. ---------------------------------------------------------------------------- --------------------------------------------------------- Installation Problems Under Irix (SGI) I get problems relating to my username Colin Surprenant reports: The solution to the problem with using the socket and then nsl libraries with NIS in Irix 5.2 is: 1. Do not link them if they are not needed :) This is the case for mSQL. or 2. link libc BEFORE the socket and the nsl libraries. For those who didn't know, the problem is that if you use NIS and link socket or nsl, the getpwuid() function doesn't work. ---------------------------------------------------------------------------- On OSF/1 or HP-UX I have trouble starting msqld at boot time David-Michael Lincke reports: Looks like the same thing that happens under HP-UX with background processes in rc scripts. They are killed off on exit of the ksh functions. Create yourself a wrapper for msqld. In there you do a fork and exit the parent process in the child process you do a call to setsid() to get rid of the controlling terminal followed by a call to execl() to launch msqld. You might also want to close all open file descriptors before calling exec. ---------------------------------------------------------------------------- Should I use cc or gcc when building mSQL on my Dec Alpha running OSF/1? Rick Beebe writes: DEC Alphas running OSF/1 (Digital Unix): The original mSQL docs recommended using cc rather than gcc on this platform. In my experience this is still good advice. If you have gcc on the machine, however, autoconf will find it and default to it. After running 'setup' edit site.mm and change 'gcc' to 'cc' and 'bison -y' to yacc. ---------------------------------------------------------------------------- Does mSQL work with Linux mmap()? Version 1.3 or greater of the Linux operating system has full mmap() support. If you're using such a version of Linux, mSQL will work perfectly well using mmap(). If you have an earlier version of Linux you can either upgrade or ensure that mmap() support in mSQL is disabled by running the 'setup' program and then editing ./targets/your-architecture/site.mm and ensuring the mmap() directive reads: MMAP= and then recompile the mSQL package. ---------------------------------------------------------------------------- Does mSQL work with HP-UX mmap()? Arley Carter (via David Hughes) writes: I just built msql-1.0.10 on hpux 9.05. It appears that you have slain the mmap bug. Good job. The only mods I [made] are in site.mm CC= cc -Ae +O3 +Z Remove -g flags also or you'll get a lot of annoying messages about opt not compatible with debug. The test suites for msql and msqlperl ran flawlessly. ---------------------------------------------------------------------------- I'm having trouble compiling MsqlPerl-1.03 with mSQL under HP-UX Arley Carter writes: This problem has to do with the way HP-UX deals with shared libraries. Ensure the EXTRA_CFLAGS option in the file: ./targets/your-architecture/site.mm reads: EXTRA_CFLAGS= -Ae +O3 +Z and recompile mSQL. The +Z option ensures that "position independent code" is used when creating object files. For more information see the manual pages on your compiler. ---------------------------------------------------------------------------- How can I install mSQL on a SCO Unix system? NOTE: This fix has had some conflicting results. Please let me () know if it works OR fails. If it fails, let me know exactly where (if possible) and how you fixed it (if you did). The following is a summary of the efforts required by Andrew Cash to install mSQL version 1.0.8 on a SCO Unix system. It should work perfectly well for version 1.0.9 as well. * Unpack the source code and create the site dependent files as follows: gunzip -c msql-1.0.9.tar.gz | tar xvf - cd msql-1.0.9 make target cd targets/your-architecture ./setup answer questions * In the file: ./common/config.h ensure the lines referring to the sys/select.h include file are commented out as follows: /* Defined if you have sys/select.h */ /* #define HAVE_SYS_SELECT_H 1 */ * SCO Unix doesn't have an alloca() library function so you'll have to use malloc(). You need to generate the file: ./msql/msql_yacc.c so run: make until it completes (or fails). Ensure that the msql_yacc.c file has been created. If it has, apply the following patch to the file. (Use the "-l" option of patch to avoid any problems with mismatched whitespace. That's an "el", NOT a "one" or an "eye"). This patch ensures that is explicitly included and that all references to alloca() are changed to malloc(). *** msql/msql_yacc.c.orig Fri Jan 5 13:07:02 1996 --- msql/msql_yacc.c Fri Jan 5 13:09:34 1996 *************** *** 329,362 **** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #ifndef alloca - #ifdef __GNUC__ - #define alloca __builtin_alloca - #else /* not GNU C. */ - #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) - #include - #else /* not sparc */ - #if defined (MSDOS) && !defined (__TURBOC__) - #include - #else /* not MSDOS, or __TURBOC__ */ - #if defined(_AIX) #include - #pragma alloca - #else /* not MSDOS, __TURBOC__, or _AIX */ - #ifdef __hpux - #ifdef __cplusplus - extern "C" { - void *alloca (unsigned int); - }; - #else /* not __cplusplus */ - void *alloca (); - #endif /* not __cplusplus */ - #endif /* __hpux */ - #endif /* not _AIX */ - #endif /* not MSDOS, or __TURBOC__ */ - #endif /* not sparc. */ - #endif /* not GNU C. */ - #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. --- 329,335 ---- *************** *** 607,618 **** yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; ! yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); ! yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); #ifdef YYLSP_NEEDED ! yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); #endif #endif /* no yyoverflow */ --- 580,591 ---- yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; ! yyss = (short *) malloc (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); ! yyvs = (YYSTYPE *) malloc (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); #ifdef YYLSP_NEEDED ! yyls = (YYLTYPE *) malloc (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); #endif #endif /* no yyoverflow */ * Rebuild msqld with the modified msql_yacc.c file by running: make * If you are NOT going to be running mSQL as root, then you'll need to ensure that msqld can be installed correctly. Edit the makefile: ./msql/Makefile.full and comment out the mode change line for msqld as follows: # chmod 4750 $(INST_DIR)/bin/msqld Failure to make this change will result in an error during the install phase. * Install mSQL by running: make install ---------------------------------------------------------------------------- Why does setup fail when building mSQL on a Linux system? Did you install the Linux kernel sources? If you installed Slackware and didn't get the K series disks then you will be missing a lot of C header files that you need to compile mSQL. Go back and grab the kernel sources disks and install them on your box. ---------------------------------------------------------------------------- How can I make mSQL run on an Amiga running NetBSD 1.1? Note: This only applies to mSQL version 1.0.10 and previous versions. mSQL version 1.0.12 does NOT suffer from this problem. This section will be removed in future versions of the FAQ. It is included in this release to accommodate the transitional period following the recent release of version mSQL 1.0.12. George Harvey writes: Portability problem with 64bit ints and mmap() (with solution). I don't expect many people will be using an Amiga but this might apply to some other environments as well... In order to be able to take some of my work home, I needed to install mSQL 1.0.10 on my home system, which happens to be an Amiga 3000T running NetBSD 1.1. The setup and compiles ran without a hitch but when I tried to run the 'killer' test, the server died with a signal 11. I noticed that setup had selected the MMAP option so I tried re-compiling without MMAP and everything worked. Since as far as I know, NetBSD is supposed to have a working mmap, I then looked a little deeper to see why it was falling over. After some fiddling around adding 'printf()s', I found the reason. This version of NetBSD defines 'size_t' as 32 bits and 'off_t' as 64 bits. The size argument to mmap() should be of type size_t but the value it was being given was an off_t. I have added a couple of casts to lines 1505 and 1525 in msqldb.c to fix it and all seems well. I will now be running some further tests to see if any other problems show up. Casting a 64bit value into a 32bit value seems to be a bad thing to have to do but given the definition of mmap(), I can't see any alternative. Hope this may be of some use to somebody, ... I've run the standard test programs and my own application and not found any other problems so here are the diffs, the only change is to add a couple of 'size_t' casts to the mmap() call. These diffs are for msql 1.0.10 running under NetBSD 1.1 on an Amiga 3000T. *** ./src/msql/msqldb.c.orig Mon Nov 13 14:37:24 1995 --- ./src/msql/msqldb.c Wed Jan 24 11:19:37 1996 *************** *** 1502,1510 **** if (cacheEntry->size) { cacheEntry->dataMap = (caddr_t)mmap(NULL, ! cacheEntry->size, (PROT_READ | PROT_WRITE), ! MAP_SHARED, cacheEntry->dataFD, 0); if (cacheEntry->dataMap == (caddr_t)-1) return(-1); } --- 1502,1510 ---- if (cacheEntry->size) { cacheEntry->dataMap = (caddr_t)mmap(NULL, ! (size_t)cacheEntry->size, (PROT_READ | PROT_WRITE), ! MAP_SHARED, cacheEntry->dataFD, (off_t)0); if (cacheEntry->dataMap == (caddr_t)-1) return(-1); } *************** *** 1522,1530 **** if (cacheEntry->keySize) { cacheEntry->keyMap = (caddr_t) mmap(NULL, ! cacheEntry->keySize, PROT_READ | PROT_WRITE, MAP_SHARED, ! cacheEntry->keyFD, 0); if (cacheEntry->keyMap == (caddr_t)-1) return(-1); } --- 1522,1530 ---- if (cacheEntry->keySize) { cacheEntry->keyMap = (caddr_t) mmap(NULL, ! (size_t)cacheEntry->keySize, PROT_READ | PROT_WRITE, MAP_SHARED, ! cacheEntry->keyFD, (off_t)0); if (cacheEntry->keyMap == (caddr_t)-1) return(-1); } To avoid conflicts with mismatched whitespace, apply this patch using the "-l" option of patch. (That's an "el", NOT a "one" or an "eye"). ---------------------------------------------------------------------------- --------------------------------------------------------- Runtime Problems msqladmin will not let me create a database This one is straight from the manual section on msqladmin. It states that the only person who is allowed to create a database is the person nominated as the "root user" during installation. If you indicated that the database would be running as root then you must be root to create a database. If you indicated that it would not be running as root, you would have then nominated a username for the "root user". In that case, you must be logged in as the user you nominated before you can perform admin functions like creation of databases. The manual also states that you can only perform the admin functions of msqladmin (i.e. any function other than 'version') from the local host. For security reasons you cannot perform administrative functions in a client/server manner of a network. ---------------------------------------------------------------------------- When I start msqld it complains about an ACL file The ACL file is the file that contains Access Control Lists for mSQL. It is located in the installation directory and is called msql.acl (e.g. /usr/local/Minerva/msql.acl). The warning indicates that msqld couldn't locate an ACL file. This doesn't stop mSQL from operating, it just implies that everyone on every machine on your network has read/write access to your databases. A sample ACL file is installed in the installation directory. You could copy this file to msql.acl and edit it to reflect the access you want to offer to your databases. ---------------------------------------------------------------------------- When I start msqld it complains about a PID file The PID file is just a file in which msqld writes its process ID. If it can't write to the PID file, msqld will still function correctly. If you are seeing an error regarding the PID file, then one of the following could be the cause: * The directory in which msqld is attempting to create the PID file does not exist. * The directory in which msqld is attempting to create the PID file does not have sufficient permissions. During the installation, the setup program asked you where to store the PID file: Top of install tree ? [/usr/local/Minerva] Will this installation be running as root ? [y] n What username will it run under ? peters Directory for pid file ? [/var/adm] You must ensure that this directory exists. The mSQL installation procedure will NOT create this directory for you. If you did not specify root as the mSQL administration user when you answered the questions: Will this installation be running as root ? [y] n What username will it run under ? peters you must ensure that the user you specified has write permissions in the directory in which msqld will store its PID file. Under Irix 5.3 the /var/adm directory can only be written to by the root user, so if your mSQL administration user is NOT root then you'll have to choose some other location such as /var/tmp or /var/share. If you need to change the location of this directory, you can either rerun the setup program, or edit the file: ./targets/your_architecture/site.mm and change the line: PID_DIR= /var/adm to suit your needs. ---------------------------------------------------------------------------- I've just installed the latest version of mSQL and now my own applications won't work! Whenever you install a new version of mSQL you MUST remember to recompile any third party applications - including those you developed yourself - to ensure that they are linked with the new version of libmsql.a. You should also recompile third party applications after installing any patches to mSQL. Failure to do this will almost certainly guarantee that your applications will fail at some stage while talking to the new mSQL database server. You may also miss out on some new feature provided by the new mSQL API. ---------------------------------------------------------------------------- Access control doesn't work with my setuid applications Note: This only applies to mSQL version 1.0.10 and previous versions. mSQL version 1.0.12 does NOT suffer from this problem. This section will be removed in future versions of the FAQ. It is included in this release to accommodate the transitional period following the recent release of version mSQL 1.0.12. Consider the following scenario: * User peters is the ONLY user given read and write access to the database test by the appropriate additions to the msql.acl file. * An application is created to manipulate the test database and is saved such that it is a setuid peters application: -rwsr-xr-x 1 peters db 24576 Nov 13 1995 db_app * User markp wishes to use the test database using the db_app application. Instead of the setuid nature of the application allowing markp access to the database, all that happens is the error message: Access to database denied This occurs because of the way in which mSQL passes user information to the database server. It uses the getuid() system call which returns the real user id of the calling process rather than the effective user id. mSQL version 2 will have radically different security mechanisms. ---------------------------------------------------------------------------- Why do I see an "Address already in use" error message when I attempt to start msqld? If you're running Linux or SCO Unix, this message can be seen if you killed the msqld process WITHOUT executing: msqladmin shutdown The TCP/IP port will remain bound for about 90 seconds or so. After this time the port should be available and msqld can be started successfully. Another possibility to consider is that something is already using the TCP/IP port that msqld is trying to use. For a default installation these port numbers are 1112 for a root user or 4333 for an ordinary user. In this case user means the name of the user you entered when answering the setup question(s): Will this installation be running as root ? What username will it run under ? There are a number of ways you can check for something using the TCP/IP port: * msql If the mSQL monitor program msql can connect to the mSQL database server msqld then you KNOW that the database server is already running. * Telnet Telnet to the database server and specify the mSQL TCP/IP port number using one of the following commands: telnet dbhost 1112 or telnet dbhost 4333 You'll see the following types of messages: o Nothing is using that port or something is using the port exclusively: Trying 127.0.0.1 ... telnet: connect: Connection refused telnet> o msqld version 1.0.10 running protocol version 6 is using the port: Trying 127.0.0.1 ... Connected to localhost. Escape character is '^]'. 0:6:1.0.10 o Something else is using the port (or a client process is still communicating with a running msqld process: Trying 127.0.0.1 ... Connected to localhost. Escape character is '^]'. * netstat If your operating system has the netstat command, you can use it to display the contents of various network related data structures in various formats, depending on the options you select. Some of the options that may be helpful are: o To determine if something is listening on port 4333, use: netstat -a | grep 4333 If you see output similar to: *.4333 *.* 0 0 0 0 LISTEN then something is using that port. o To see if msqld is using the port, use: netstat -f unix Output similar to the following will indicate that msqld is already running: Active UNIX domain sockets Address Type Vnode Conn Addr fcf8bca8 stream-ord 231 0 /tmp/msql.sock This may not work for all operating systems. - the above examples were taken from a Solaris 2.4 system. Variations on this command include: netstat -f inet or netstat -f local If you found something using the TCP/IP port that msqld would like to use, examine the output of your operating system's ps command to check if you already have a running msqld process. If you have then shut it down it by executing: msqladmin shutdown If you don't have a running msqld process then something else may be using the port that msqld is trying to use. Examine /etc/inetd.conf and /etc/services (or the services NIS map if you're running NIS) to see if anything else is using the port. The output from one of the netstat commands listed above may be helpful. If you find such a program you have two options: 1. Change the port number the other program is using so that it doesn't conflict with mSQL 2. Ensure that mSQL uses a different port number. This can be done by either: o starting msqld with the environment variable MSQL_TCP_PORT set to another port number. You'll also have to ensure that client applications use the new port number too. o modifying the ./src/common/site.h file and changing the section /* ** TCP port for the MSQL daemon */ #ifdef ROOT_EXEC #define MSQL_PORT 1112 #else #define MSQL_PORT 4333 #endif to suit your needs. Then recompile and reinstall mSQL. ---------------------------------------------------------------------------- How can I avoid running out of space when doing certain complex table joins? Note: The section dealing with mSQL version 1.0.10 will be removed in future versions of the FAQ. It is included in this release to accommodate the transitional period following the recent release of version mSQL 1.0.12. Some mSQL operations involving table joins can consume large amounts of temporary disk space. mSQL version 1.0.10 uses the /tmp directory to store its temporary files. As this directory is also used by many other applications, it may not have sufficient space for mSQL. You can change the location of this temporary storage area using the following procedure: * Shutdown the mSQL database server. msqladmin shutdown * Apply the following patch to ./src/msql/msqldb.c *** ./src/msql/msqldb.c.orig Mon Nov 13 14:37:24 1995 --- ./src/msql/msqldb.c Wed Jan 31 14:39:52 1996 *************** *** 1009,1015 **** tmpfile = cp+1; } (void)sprintf(path,"%s/msqldb/.tmp/%s.dat",msqlHomeDir,tmpfile); - (void)sprintf(path,"/tmp/%s.dat",tmpfile); /* --- 1009,1014 ---- *************** *** 1172,1178 **** msqlTrace(TRACE_IN,"freeTmpTable()"); (void)sprintf(path,"%s/msqldb/.tmp/%s.dat",msqlHomeDir,entry->table); - (void)sprintf(path,"/tmp/%s.dat",entry->table); freeTableDef(entry->def); entry->def = NULL; *(entry->DB) = 0; --- 1171,1176 ---- * Recompile and install mSQL. As this change only affects the database server there is NO need to recompile any third party applications you may be using. * Remove the msqldb/.tmp directory from your mSQL installation directory. For example, if you installed mSQL in /usr/local/Minerva run the following command: rm -rf /usr/local/Minerva/msqldb/.tmp * Create a symbolic link from a directory with lots of space to the msqldb/.tmp directory: ln -s /lots/of/space /usr/local/Minerva/msqldb/.tmp * Restart the mSQL database server. msqld & The patch listed above has been applied to the mSQL version 1.0.12 distribution. If you find yourself running out of space during table joins with version 1.0.12, follow this procedure. * Remove the msqldb/.tmp directory from your mSQL installation directory. For example, if you installed mSQL in /usr/local/Minerva run the following command: rm -rf /usr/local/Minerva/msqldb/.tmp * Create a symbolic link from a directory with lots of space to the msqldb/.tmp directory: ln -s /lots/of/space /usr/local/Minerva/msqldb/.tmp * Restart the mSQL database server. msqld & ---------------------------------------------------------------------------- msqld is suddenly dumping core and complaining about bzero() Rasmus Lerdorf writes: This looks to me like you have compiled your msqld binary on a machine with bzero() in your libc but you are running it on a machine that does not have the bzero() function in its libc. Could it be that you compiled on a Solaris 2.5 box, but you are running it on a Solaris 2.4 machine? Sun made the brilliant decision to add bzero, bcopy and rindex to the Solaris 2.5 libc which means that Solaris 2.5 and 2.4 are not completely binary compatible anymore. When you compile msql on Solaris 2.5 it will see that bzero and bcopy are available and thus try to use them. The fix is to either link your msqld statically with the Solaris 2.5 libc, or perhaps more preferable, recompile msql to not use the silly bzero, bcopy, bcmp and rindex functions. Edit common/config.h and make sure you do not have HAVE_BCOPY and HAVE_RINDEX defined. If you do, comment out these definitions and recompile. The resulting binary should then run on both target machines. The exact error message you'll see when running a Solaris 2.5 compiled msqld on a Solaris 2.4 machine is: peters@wheel[710] ./msqld mSQL Server 1.0.10 starting ... ld.so.1: ./msqld: fatal: relocation error: symbol not found: bzero: referenced in ./msqld Killed ---------------------------------------------------------------------------- Why does relshow drop the first two characters from its output? Desmond writes: Wonder if anyone encountered this weird display while using relshow? relshow bookmarks Database = bookmarks +---------------------+ | Table | +---------------------+ | okmarks | | st | +---------------------+ notice that the first two letters of the table names are missing. Please help. Thanks in advance! David Hughes replies: I've seen this on Solaris if you link against the oh so broken BSD compatibility library (libbsd.a). Please make sure that libbsd.a isn't mentioned in you site.mm file. ---------------------------------------------------------------------------- --------------------------------------------------------- How do I ...? How do I embed single quotes in a field? To handle a single quote, escape it with a backslash character. So the string 'Bambi's' would be entered as 'Bambi\'s'. Note: This applies when using msql - the database monitor program. If you're developing your own application you may have to escape other characters that are special to the language you're using - for example perl, C or tcl. ---------------------------------------------------------------------------- What other characters need special treatment? When specifying table or field names or when inserting values into fields, the only other character that requires special handling is the mSQL escape character backslash. To handle a backslash, escape it with another backslash. So the string c:\windows\system\ would be entered as 'c:\\windows\\system\\' When using regular expressions in queries of the form: SELECT table.column FROM table WHERE table.column LIKE 'regexp' the following rules apply: To search for Use this or this To search for Use this or this this character string string this character string string $ \\\\$ [$] [ \\\\[ [[] % \\% [%] \ \\\\\\\\ [\\\\] ' \' ^ \\\\^ [^] ( \\\\( [(] _ \\_ ) \\\\) [)] | \\\\| [|] ? \\\\? [?] Note: This applies when using msql - the database monitor program. If you're developing your own application you may have to escape other characters that are special to the language you're using - for example perl, C or tcl. ---------------------------------------------------------------------------- How do I handle null fields? For the NULL values, just use the NULL keyword. For example insert into foo values ( NULL, 1, 2, 'some text' ) ---------------------------------------------------------------------------- How do I perform case insensitive matches? mSQL uses Henry Spencer's regular expression library with a few modifications. To perform case insensitive searches, your query should take the form SELECT * FROM my_table WHERE my_field LIKE '[Ss][Oo][Mm][Ee] [Vv][Aa][Ll][Uu][Ee]' Sol Katz's Object Oriented HTML API includes a C routine that converts a string into its case insensitive form. You may wish to use this in any C code that you write. See the section below on "Contributed Code and Third Party Applications" Alternatively, you can create an additional field in each table that will hold a single case version of the information you are likely to be searching for. For perl users, Michael Cowden has contributed this code example: The following statement turns mSQL into [mM][sS][qQ][lL] $string = "mSQL"; $string =~ s/(.)/\[\L$1\E\U$1\E\]/g; Vivek Khera suggests a simpler method for perl users: Personally, I use this in Perl, as there is no need to complicate the regular expression with non-alpha characters. $string =~ s/([A-Za-z])/\[\L$1\U$1\]/gi; Version 2 of mSQL will support functions similar to upper() and lower() which will obviate the need for the above. ---------------------------------------------------------------------------- How do I add a column to an existing table? You can't! Once a table is created it must stay the way it is. One possible solution is to use msqldump to create an ASCII dump of the entire database. Then edit this dump file by hand and add the extra field to the CREATE clause. You'll also need to edit each INSERT clause to ensure that the new field is referenced. Once you've modified the dump file, drop and recreate the database using msqladmin and repopulate the new database using the dump file and msql. This procedure could be automated by a shell or perl script. As an example consider this output from msqldump # # mSQL Dump (requires mSQL-1.0.6 or better) # # Host: localhost Database: test #-------------------------------------------------------- # # Table structure for table 'test' # CREATE TABLE test ( name CHAR(40), num INT ) \g # # Dumping data for table 'test' # INSERT INTO test VALUES ('item 999',999)\g ... INSERT INTO test VALUES ('item 0',0)\g If you wish to insert a field, say "discount", then you will need to modify the dump file as follows: # # mSQL Dump (requires mSQL-1.0.6 or better) # # Host: localhost Database: test #-------------------------------------------------------- # # Table structure for table 'test' # CREATE TABLE test ( name CHAR(40), num INT, discount REAL ) \g # # Dumping data for table 'test' # INSERT INTO test VALUES ('item 999',999,0.0)\g ... INSERT INTO test VALUES ('item 0',0,0.0)\g Notice that every insert clause MUST be changed as well as the table definition. ---------------------------------------------------------------------------- When should I call msqlConnect() in a parent/child situation? If both the parent and child processes want to talk to the mSQL server then you must call msqlConnect() AFTER you fork. They mustn't share the same socket. ---------------------------------------------------------------------------- Can I use mSQL reserved words as field or table names? No. The mSQL parser gets very confused if you attempt to use reserved words as the name of a table or field. The full list of reserved words (as obtained from msql_lex.c) is: < >= by distinct integer not real update <= all char drop into null select values <> and create from key or set where = as delete insert like order smallint > asc desc int limit primary table Remember that mSQL reserved words are case insensitive so UPPER case or MiXeD cAsE reserved words are also forbidden in table or field names. ---------------------------------------------------------------------------- How do I find the maximum or minimum value in a table? To obtain the maximum value use: SELECT number FROM table ORDER BY number DESC LIMIT 1 To obtain the minimum value use: SELECT number FROM table ORDER BY number LIMIT 1 This will only work with mSQL 1.0.9 and above unless you have applied the unofficial LIMIT patch to earlier versions. See the mSQL mailing list archives for details on this patch. (Before searching for this unofficial patch, you should seriously consider upgrading to the latest version of mSQL). Note: Rasmus Lerdorf writes: The LIMIT statement limits the number of records actually transferred from the server to the client. It doesn't limit the scope of the search at all in any way. That means that if you are looking for the maximum value in a table with 30,000 entries, the query will first build the entire sorted result in memory in the server, but when it comes time to transferring the result to the client, it only sends the first item. In many cases, especially when you have a lot of fields, or long fields, the time it takes to transfer the data from the server to the client is actually many times that of the actual search. And the msqld daemon is tied up and not available to other clients while it is wasting time sending result records that will never be used. So, if you do queries and you know you will only be looking at the first couple of them, you should use the limit clause and cut down on the amount of useless records being sent across the socket. ---------------------------------------------------------------------------- How can I determine the structure of a database? Use the relshow application that comes bundled with the mSQL software distribution. * To discover which databases are available use: relshow or relshow -h host This will return output similar to: +-----------------+ | Databases | +-----------------+ | test | | photos | | patches | +-----------------+ * To discover which tables are contained within a database use: relshow dbname or relshow -h host dbname This will return output similar to: Database = test +---------------------+ | Table | +---------------------+ | test_table | | addresses | | telephone | +---------------------+ * To discover the structure of a particular table use: relshow dbname tablename or relshow -h host dbname tablename This will return output similar to: Database = test Table = test_table +-----------------+----------+--------+----------+-----+ | Field | Type | Length | Not Null | Key | +-----------------+----------+--------+----------+-----+ | name | char | 40 | N | N | | num | int | 4 | N | N | +-----------------+----------+--------+----------+-----+ ---------------------------------------------------------------------------- What happens when the mSQL server goes down between requests? If the mSQL database server process, msqld, dies and is subsequently restarted, or the host on which it was running is rebooted, any processes that were connected to the mSQL database server MUST be reconnected. This is not unique to mSQL, the Oracle database server behaves in a similar manner. Programs that were connected to the mSQL database server should be either restarted or have some internal mechanism whereby they notice the server has died and attempt a reconnection. One possible method for checking the status of the database server would be to examine the return status of the msqlSelectDB() call. ---------------------------------------------------------------------------- Can I run more than one copy of msqld on the same CPU? Steve A. Olson writes: I'm looking for a way to provide the full 25 connections to each of many mSQL databases running on a single box. Here's an idea, will it work? or is there a better way? (korn shell example) $ export MSQL_TCP_PORT=3000; msqld $ export MSQL_TCP_PORT=3001; msqld $ export MSQL_TCP_PORT=3002; msqld Then connect to the database as follows: $ export MSQL_TCP_PORT=3000; msql db_a While the above runs, another user connects: $ export MSQL_TCP_PORT=3001; msql db_b David Hughes replies: Well, sort of. By running 'msql db_a' you are using the local UNIX socket not the TCP socket so you'd have to use MSQL_UNIX_PORT not MSQL_TCP_PORT. The other thing is that you should run 3 MSQL_HOME areas (/usr/local/Minerva for example). If two of these servers __ever__ access the same database at the same time then you are stuffed. So, something like export MSQL_UNIX_PORT=/dev/msql_1; export MSQL_HOME=/Minerva1; msqld& export MSQL_UNIX_PORT=/dev/msql_2; export MSQL_HOME=/Minerva2; msqld& and export MSQL_UNIX_PORT=/dev/msql_1; msql db_a export MSQL_UNIX_PORT=/dev/msql_2; msql db_b would do the job. ---------------------------------------------------------------------------- How can I automatically ensure that each record receives a unique primary key? mSQL version 1.x does not have an automatic key assignment functionality. A number of solutions to this problem are available. * Use Pascal Forget's unique sequence number generator. * Build the unique key assignment and management into your application. One suggestion on how to implement this comes from Vivek Khera . Vivek writes: What I do is take some of the fields in the record, tack on a salt like the current time and generate a hash (either SHA or MD5) of it. I use part of the the hash string value as the key. Another solution is provided by Rasmus Lerdorf . Rasmus writes: The issue here is not so much how to generate a key, but how to ensure it is unique. The way I have done it in the past is to associate a lock file with each table. Each table has a counter record. With the table locked, I pull out the current counter value, increment it, and put it back. Then I unlock the table. This is not the most efficient way to do it, but it does work nicely for systems that do not get pounded with queries. mSQL 2 may include this feature. ---------------------------------------------------------------------------- --------------------------------------------------------- Contributed Code and Third Party Applications A number of people have contributed additional software that works with mSQL. The contributed software falls into two categories - that developed by David Hughes (mSQL's author) and that developed by others. Note: Please consult the documentation that comes with each of these applications to determine the licensing obligations that may be involved in their use. Note: There is often a delay of a day or so for files to be moved from the Incoming directory to the Contrib directory on the ftp server bond.edu.au. If you can't find the software in the Contrib directory, try the Incoming directory. Third Party mSQL Applications ESL Onyx w3-msql OS/2 Apache Perl Bind Physics Pilot DBASE Python DBI QMS Digger REXX Emacs SQLBase Flatfile Importer Tcl Home Page Construction Kit Time and date utilities ICI tkmSQL Java Used gear price list MS Access & dBase III Unique sequence number generator MS Windows Visual Basic NeXTSTEP EOF WDB Object Oriented HTML API Websql OCX Z Classes for C++ ODBC ESL David developed mSQL as the database component of a larger network management project called Minerva (Minerva was the Roman goddess of knowledge and information). Another component of Minerva is an Extensible Scripting Language called ESL. This has a C like syntax and provides support for the complete mSQL API as well as full SNMP support. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/esl/esl-0.3.tar.gz (407046 bytes) w3-msql David has also developed w3-msql which is an interface between the World-Wide Web and mSQL. It is a mechanism that can be used to greatly simplify the use of an SQL database behind a web server. Using w3-msql, you can embed SQL queries within your pages and have the results generated on the fly. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/w3-msql/w3-msql-1.0.tar.gz (30203 bytes) At the time of compiling this FAQ, version 1.1 was being prepared. Apache Dirk van Gulik has developed some code for use with HTML and HTTP servers with specific reference to the Apache HTTP server. It is available via anonymous ftp from: ftp://ftp.ceo.org/pub/ewse-mSQL-apache-demos/apache-msql-demo.1.0.1.tar.gz (12723 bytes) or ftp://ftp.apache.org/pub/apache/incoming Bind Chris Seawood has extended the DNS naming service - BIND - to support mSQL databases. It is available in the contrib/msql directory of the current release of BIND which can be obtained via anonymous ftp from: ftp://ftp.vix.com/pub/bind/release/bind-4.9.3-REL.tar.gz (1682741 bytes) DBASE Maarten Boekhold has written a dbase to mSQL conversion utility. It handles the dbf data types string, num, real and date. It does not yet handle memo-fields because mSQL 1.x lacks support for variable length char fields. Maarten is aware that this may be insufficient for some users' needs but he is releasing the utility as 'do-whatever-you-want' software. It is available via anonymous ftp from: ftp://gopher.library.tudelft.nl/pub/misc/dbf2msql-0.4.tar.gz (7900 bytes) DBI Tim Bunce is working on a generic database driver (DBI) which allows perl to interface to any database in a standardised way. Details of Tim's work are available from: http://www.hermetica.com Alligator Decartes has added an mSQL driver to Tim's work and his contributions can be obtained via anonymous ftp from: ftp://ftp.mcqueen.com/pub/dbperl It is also available from any CPAN (Comprehensive Perl Archive Network) site in the "modules" directory. For more information about CPAN see: ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN The latest blurb describing Alligator's work can be obtained from: http://www.hermetica.com/technologia/DBI Digger The folks at Bunyip Information Services (the current maintainers of the mSQL mailing list) have used mSQL as the database component of their Digger system. Digger is a Distributed Directory Service for the Internet based on Whois++ technology. For more information about digger send mail to or have a look at Bunyip's web pages: http://www.bunyip.com/products/digger Emacs Igor Romanenko has contributed some lisp code to provide emacs with hooks into mSQL. It allows the msql monitor to run in an emacs window, so you can use emacs for editing and command recall. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/sql-mode.tar.gz (6883 bytes) Flat File Importer Pascal Forget has contributed a program that will import flat file databases directly into mSQL databases. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql-import-0.0.6.tar.gz (7516 bytes) Home Page Construction Kit - PHP Rasmus Lerdorf has developed a package that allows users to create WWW home pages with mSQL databases. Rasmus writes: For anybody using my FI form interpreter or David's w3-msql package, this PHP package should be of interest to you. It is an html embedded script language cgi wrapper with built-in web page access logging, access restriction, as well as support for ndbm, gdbm and mSQL databases through a powerful C-like scripting language. It is based on the original FI concept to which the functionality of the earlier PHP package has been added to form a single tool. The mSQL support is just a small set of functions supported by the package. A full set of string manipulation, regular expression, directory and file routines complement the script language. The source distribution as well as more information is available at: http://www.io.org/~rasmus. ICI Yiorgos Adamopoulos has written an mSQL extension for the ICI programming language. It is available via anonymous ftp from: ftp://ftp.ntua.gr/pub/lang/ici/iciMsql.tar.gz (249077 bytes) Yiorgos has set up a mailing list for iciMsql. Questions can be sent to: iciMsql@noc.ntua.gr Java Darryl Collins has developed a version of the mSQL API for the Java programming language. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/MsqlJava-1.1.0.tar.Z (15611 bytes) or ftp://bond.edu.au/pub/Minerva/msql/Contrib/MsqlJava-1.1.0.zip (20346 bytes) For more details see: http://www.minmet.uq.oz.au/msqljava MS Access & dBase III Brian Bartholemew has written some scripts that translate dBase III tables saved from MS Access into tab-separated formats. Brian writes: Here are three scripts, the first two are clean ones that break out tables saved from access in dBaseIII format into a tab-separated format that a set of database-operator scripts called rdb can use. The first breaks out .dbf files and the second breaks out .dbt files which contain the text of variable-length-text memo fields; the .dbf and .dbt can be joined by the block offset number given in the text field. These scripts have only been tested on the field types my database happens to have. Since the first one breaks out the table definitions it's the obvious candidate to generate table definitions for msql. The third script is a hack to get data into msql so I can play with msql, but it's a starting point. The first two scripts were written to be free of data-dependent bugs, the third is somehow confused about null fields in Pascal's msql-import program which I've hacked around to enter the complaining fields as the text "NULL"; debugging is welcomed. The third script needs rdb, available from rand.org:/pub/RDB-hobbs. I do MS Access -> rdb -> msql because I use rdb as a prototyping tool, the format is trivial to generate and modify, I have a forms-based emacs front-end to rdb, and the tables compress nicely in rcs. However, someone may wish to modify these scripts, (a) so that they generate msql dump files instead of rdb files, thereby bypassing the msql-import bug and the rdb dependency and probably some data dependencies with maximum portability, or (b) so that they talk to the database directly. If so please post diffs. Trigger the new behaviour by a command-line option so the non-msql-perl behaviour continues to run under vanilla perl. These programs are gpl'ed. They are available from the mSQL mailing list archives for the month of February 1996. MS Windows Dean Fuqua has contributed an mSQL API for MS Windows platforms. To use this software you need some Winsock compliant stack. (i.e. Trumpet Winsock, MS TCP/IP-32, Chameleon, etc.) It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/winapi.zip (87211 bytes) Not included in winapi.zip is an msql.ini file. Its contents should resemble [Server] IP=your.server.host.name Port=1112 Username=YourUsername There also appears to be a later version of Dean's work which includes compiled executables in ftp://bond.edu.au/pub/Minerva/msql/Contrib/winmsql7.zip (306827 bytes) NeXTSTEP EOF Mark Onyschuk has developed an NeXTSTEP EOF adaptor for mSQL. An Enterprise Object Framework (EOF) is an object framework that allows object oriented access to relational databases, where each row is considered an object. Besides a few limitations, it basically makes a relational database look like an OO database to the developer. By means of an adaptor, EOF can be used with virtually any database. The adaptor is responsible to transform the generic OO messages in database specific queries by subclassing a generic adaptor and modifying its behaviour. Object Oriented HTML API Sol Katz has developed an object oriented HTML API for mSQL. It is available via anonymous ftp from: ftp://ftp.blm.gov/pub/gis/msql_api.tar.gz (10317) bytes An example can be found at http://www.blm.gov/gis/msql/dbs6.html OCX Shayne Hughes has created a 32-bit OCX control that exposes all of the mSQL API (based on 1.0.12) with only slight modifications to make it work with pointer impaired languages like Visual Basic. It is available via anonymous ftp from: ftp://vgl.ucdavis.edu/pub/mSQL/ocxmsql-0.90.zip (1685189 bytes) Chin-Jin Phua has also developed a mSQL 32-bit OCX for Windows95 and WinNT. He has only tested it for Visual Basic. ftp://Bond.edu.au/pub/Minerva/msql/Contrib/msqlocx.zip (17409 bytes) ODBC Dean Fuqua has developed a collection of ODBC files which are available via anonymous ftp from: ftp://ftp.comed.com/pub/msql/odbc For more information on Dean's work see: http://alfred.niehs.nih.gov Onyx Michael Koehne has developed a rapid prototyping tool for database applications called Onyx. Onyx consists of a transaction manager, a shell like 4GL and a Simple Database Transaction Protocol engine. "Onyx is designed by the Model-View-Controller paradigm, so tables are the model, masks are the views and transactions are the controllers which can be bound to an input field, a menu, function keys or the change of the current record in a cursor." It is available via anonymous ftp from: ftp://ftp.uni-bremen.de/pub/unix/database/Onyx/Onyx.2.45.src.tar.gz (195872) bytes OS/2 Dirk Ohme has ported mSQL 1.0.12 to OS/2. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql112a-os2.lsm (1682) bytes ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql112a-os2.zip (660244) bytes Perl Andreas Koenig has contributed a Perl 5 module which allows perl to interface to mSQL databases. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/MsqlPerl-1.03.tar.gz (15037 bytes) It is also available from any CPAN (Comprehensive Perl Archive Network) site in the "modules" directory. For more information about CPAN see: ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN Physics Pilot Kenneth Holmlund from the Department of Theoretical Physics at Umee University in Sweden has used mSQL and The Personal Home Page Construction Kit to create the "The Internet Pilot to Physics". It can be seen at: http://www.tp.umu.se/TIPTOP Python Anthony Baxter has provided an mSQL extension to the Python language. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/PymSQL.tar.gz (7581 bytes) QMS James Hill has used mSQL and The Personal Home Page Construction Kit to create a searchable web based FAQ for QMS printers. It can be seen at: http://www.qms.com/www/faq James has made the source code available via anonymous ftp. It can be downloaded from: ftp://ftp.qms.com/pub/mktg/outgoing/SupportBase.tar.gz (5509 bytes) REXX Mark Hessling has provided an mSQL extension for REXX. It is available via anonymous ftp from: ftp://ftp.qut.edu.au/src/REXXSQL/ SQLBase Klaus Thiele has provided a wrapper to allow SQLBase users to interface to mSQL databases. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/mSQLBase-1.00.tgz which is a symbolic link to ftp://bond.edu.au/pub/Minerva/msql/Contrib/msqlb-1.00.tgz (38136 bytes) Tcl Hakan Soderstrom has provided an mSQL extension to the Tcl language. It has been tested with Tcl 7.3, Tk 3.6p1, TclX 7.3a-p2; Tcl 7.4b2, Tk 4.0b2, TclX 7.4a-b2, mSQL 1.0.6 under SunOS 4.1.3. Successful ports to several other platforms have been reported. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/msqltcl-1.50.tar.gz (58929 bytes) Brad Pepers has also provided an mSQL extension to Tcl. According to the documentation it supports tcl7.3 and tk3.6. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/tcl_msql.tar.gz (7998 bytes) Time and date utilities Pascal Forget has contributed a library of time and date conversion utilities. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/time_library.tar.gz (7989 bytes) tkmSQL Alligator Decartes is developing an mSQL interface that uses Perl 5, Tk, and DBD/DBD-mSQL. It is currently in alpha release for developers only but Alligator would appreciate feedback. tkmSQL requires: o perl 5.001m or above o Tk-b8 Note: This is a perl Tk module and is NOT to be confused with Tk itself. It can be obtained via anonymous ftp from: ftp://ftp.wpi.edu/perl5 There is also a FAQ available from: http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.html o DBI-0.65 o DBD::mSQL-0.60pl9 You may obtain tkmSQL via anonymous ftp from: ftp://ftp.mcqueen.com/pub/databases/dbatools/tkmSQL Used gear price list Neil Bradley has used mSQL to provide a price list for second hand music equipment. A demonstration of this system is available at http://www.synthcom.com/cgi-bin/gear and the source code can be obtained via anonymous ftp from: ftp://ftp.synthcom.com/pub/stuff Unique sequence number generator Pascal Forget has contributed a unique sequence number generator that can be used by mSQL applications (and others) to provide unique identifiers. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/sgs-1.0.0.tar.gz (24216 bytes) Visual Basic Jim Gerace has implemented a Visual Basic client API for MS Windows and mSQL. It is available via anonymous ftp from: ftp://ncremp.ag.iastate.edu/pub/incoming/msqlcvb.zip (42192 bytes) WDB Bo Frese Rasmussen has developed a Web database interface called WDB. WDB is a software tool set that tremendously simplifies the integration of SQL based databases into the World Wide Web. WDB lets you provide WWW access to the contents of databases without writing a single line of code! At the moment WDB supports Sybase, Informx and mSQL. However it is relatively easy to port it to other SQL based databases. For more details on WDB see: http://arch-http.hq.eso.org/wdb/html/wdb.html Websql Henry Minsky has developed an mSQL Table WWW browser interface. "This is a C web CGI script to examine and modify rows in tables of an mSQL database. You should use Netscape or another browser which supports HTML 3.0 tables." More details and sample output are available from: http://www.ua.com/websql Source code is available from: http://www.ua.com/websql/websql.tar.gz (24225 bytes) Z Classes for C++ Dean Fuqua has also contributed a set of C++ classes to provide access to both Oracle and mSQL databases. It is available via anonymous ftp from: ftp://bond.edu.au/pub/Minerva/msql/Contrib/zmsql-2.1.tar (40960 bytes) ---------------------------------------------------------------------------- ----------------------------------------------------------------------------