From: CVS to git conversion script Date: Mon, 4 Nov 2002 17:14:30 +0000 (+0000) Subject: This commit was manufactured by cvs2git to create branch 'REL7_3_STABLE'. X-Git-Tag: REL7_3~80 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=503b41f6e5db97b79911c140310d9d2abbac0232;p=thirdparty%2Fpostgresql.git This commit was manufactured by cvs2git to create branch 'REL7_3_STABLE'. Sprout from master 2002-11-04 17:14:29 UTC Tom Lane 'Remove extraneous semicolons after routine bodies. These don't bother' Cherrypick from master 2002-09-04 07:23:04 UTC Bruce Momjian 'Brand 7.3. Ready for beta!': contrib/xml/README contrib/retep/CHANGELOG contrib/retep/Implementation contrib/retep/Makefile contrib/retep/README contrib/retep/build.xml contrib/retep/data/cds.dtd contrib/retep/data/cds.xml contrib/retep/uk/org/retep/tools.properties contrib/retep/uk/org/retep/dtu/DCollection.java contrib/retep/uk/org/retep/dtu/DConstants.java contrib/xml/pgxml_dom.source contrib/retep/uk/org/retep/dtu/DElement.java contrib/retep/uk/org/retep/dtu/DEnvironment.java contrib/retep/uk/org/retep/dtu/DModule.java contrib/retep/uk/org/retep/dtu/DModuleXML.java contrib/retep/uk/org/retep/dtu/DNode.java contrib/retep/uk/org/retep/dtu/DProcessor.java contrib/retep/uk/org/retep/dtu/DTransform.java contrib/retep/uk/org/retep/tools/Tool.java contrib/retep/uk/org/retep/util/ExceptionDialog.java contrib/retep/uk/org/retep/util/Globals.java contrib/retep/uk/org/retep/util/Logger.java contrib/retep/uk/org/retep/util/Main.java contrib/retep/uk/org/retep/util/StandaloneApp.java contrib/retep/uk/org/retep/util/hba/Editor.java contrib/retep/uk/org/retep/util/misc/IPAddress.java contrib/retep/uk/org/retep/util/misc/PropertiesIO.java contrib/retep/uk/org/retep/util/misc/WStringTokenizer.java contrib/retep/uk/org/retep/util/models/HBATableModel.java contrib/retep/uk/org/retep/util/models/PropertiesTableModel.java contrib/retep/uk/org/retep/util/proped/PropertyEditor.java contrib/retep/uk/org/retep/xml/core/XMLFactory.java contrib/retep/uk/org/retep/xml/core/XMLFactoryException.java contrib/retep/uk/org/retep/xml/jdbc/XMLDatabase.java contrib/retep/uk/org/retep/xml/jdbc/XMLResultSet.java contrib/retep/uk/org/retep/xml/parser/TagListener.java contrib/retep/uk/org/retep/xml/test/XMLExport.java doc/src/sgml/libpgeasy.sgml doc/src/sgml/odbc.sgml contrib/xml/pgxml.source doc/src/sgml/recovery.sgml src/test/regress/expected/geometry-bsdi-precision.out contrib/retep/uk/org/retep/xml/parser/TagHandler.java doc/src/sgml/version.sgml doc/src/sgml/y2k.sgml contrib/retep/retep.jpx src/interfaces/jdbc/utils/CheckVersion.java src/interfaces/jdbc/utils/changelog.pl contrib/retep/uk/org/retep/util/hba/Main.java contrib/retep/uk/org/retep/util/hba/Record.java contrib/retep/uk/org/retep/util/proped/Main.java src/interfaces/jdbc/CHANGELOG src/interfaces/jdbc/Implementation src/interfaces/jdbc/utils/buildDriver src/interfaces/jdbc/jdbc.jpx --- diff --git a/contrib/retep/CHANGELOG b/contrib/retep/CHANGELOG new file mode 100644 index 00000000000..188c40129e2 --- /dev/null +++ b/contrib/retep/CHANGELOG @@ -0,0 +1,7 @@ +Fri Mar 02 16:08:00 GMT 2001 peter@retep.org.uk + - Started importing in the rest of the retep tools. + +Tue Jan 23 10:19:00 GMT 2001 peter@retep.org.uk + - Finished the XML Export classes + - First of the test data suite now in CVS. + diff --git a/contrib/retep/Implementation b/contrib/retep/Implementation new file mode 100644 index 00000000000..b3125acf0ed --- /dev/null +++ b/contrib/retep/Implementation @@ -0,0 +1,116 @@ +Retep Tools Implementation +-------------------------- + + +The tools are designed to be put into a single jar file, but each one is +executable either individually or part of one single application. + +To run the big application, you can either: + + java -jar retepTools.jar + +or with the retepTools.jar in the classpath run: + + java uk.org.retep.tools.Main + +Windows users: For you you can also double click the retepTools.jar as windows +will automatically run javac for you. + +To run the individual tools, you must have the .jar file in your classpath and +then run the relevant Main class. + +Tool Type Class +------------------------------------------------------------------------------ +pg_hba.conf Editor/repairer Editor uk.org.retep.util.hba.Main +Properties Editor Editor uk.org.retep.util.proped.Main + + +Layout of the classes +--------------------- + +Simply, tools that work on property files (Java properties, resource files, +configuration settings - pg_hba.conf for example) go under uk.org.retep.util in +their own package. Other utility classes (like PropertyIO) go in to the +uk.org.retep.util.misc package except for certain ones where they are related. + +ie: TableModels. In swing you have JTable which uses a TableModel to display +(and possibly update) some data. These go under uk.org.retep.util.models where +you will find PropertiesTableModel for example. This one allows a Properties +object to be displayed & updated. + +Come core classes like Logger, ExceptionDialog etc go into the main +uk.org.retep.util package. + +Directory/Package Contents +------------------------------------------------------------------------------ +uk.org.retep Home of the tools.properties file +uk.org.retep.tools The main all-in-one application +uk.org.retep.dtu The Data Transform Unit +uk.org.retep.util Core utility classes +uk.org.retep.util.hba pg_hba.conf editor/repairer +uk.org.retep.util.misc Misc utility classes +uk.org.retep.util.models Swing table models +uk.org.retep.util.proped Property Editor +uk.org.retep.util.xml.core Basic XML Factory +uk.org.retep.util.xml.jdbc JDBC/XML interface +uk.org.retep.util.xml.parser Simple SAX parser + +Structure of a tool +------------------- + +Each tool has at least 2 base classes, and an entry in the tools.properties +file. For this example, I'll show you the Properties Editor: + +Base package uk.org.retep.util.proped +Main tool class uk.org.retep.util.proped.PropertyEditor +Standalone class uk.org.retep.util.proped.Main + +The main tool class is the entry point used by the main application. Because +they are used in a GUI, this class must extend javax.swing.JComponent and +implement the uk.org.retep.tools.Tool interface. (NB: You will find I always +use JPanel, but JComponent is used here so that any swing class can be used +you are not limited to JPanel.) + +The standalone class is a basic static class that implements the main method. +It should extend the uk.org.retep.misc.StandaloneApp class and be written along +the lines of the following example: + + import uk.org.retep.util.StandaloneApp; + import javax.swing.JComponent; + + public class Main extends StandaloneApp + { + public Main(String[] args) + throws Exception + { + super(args); + } + + public JComponent init() + throws Exception + { + // Your initialisation here. In this case the PropertyEditor + PropertyEditor panel = new PropertyEditor(); + + // do stuff here, ie load a file if supplied + + // return the tool + return panel; + } + + public static void main(String[] args) + throws Exception + { + Main main = new Main(args); + main.pack(); + main.setVisible(true); + } + } + +you will find a template in the uk.org.retep.util.Main class. Simply copy this +classes source, as it gives you the basic stub. Just add your own implementation +if init() like the one above. Look at the full Main class for the +PropertiesEditor to see how to get at the command line args. + +By convention, the standalone class is named Main. + diff --git a/contrib/retep/Makefile b/contrib/retep/Makefile new file mode 100644 index 00000000000..e5de9c7ac80 --- /dev/null +++ b/contrib/retep/Makefile @@ -0,0 +1,30 @@ +#------------------------------------------------------------------------- +# +# Makefile for contributed retep tools +# +# Copyright (c) 2001, PostgreSQL Global Development Group +# +# $Header: /cvsroot/pgsql/contrib/retep/Attic/Makefile,v 1.1 2001/07/06 23:07:20 petere Exp $ +# +#------------------------------------------------------------------------- + +subdir = contrib/retep +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global + +all: + $(ANT) -buildfile $(srcdir)/build.xml all + +install: installdirs + $(ANT) -buildfile $(srcdir)/build.xml install \ + -Dinstall.directory=$(javadir) + +installdirs: + $(mkinstalldirs) $(javadir) + +uninstall: + $(ANT) -buildfile $(srcdir)/build.xml uninstall \ + -Dinstall.directory=$(javadir) + +clean distclean maintainer-clean: + $(ANT) -buildfile $(srcdir)/build.xml clean diff --git a/contrib/retep/README b/contrib/retep/README new file mode 100644 index 00000000000..5355c9d99f3 --- /dev/null +++ b/contrib/retep/README @@ -0,0 +1,35 @@ +Before you ask what retepTools are, they are my personal suite of utilities. +About 90% of them are JDBC related (either they use JDBC, or I use them in +developing the JDBC driver). + +Now, because of various reasons I won't go into now, in January 2001 I decided +to release the entire lot to the public. I could have used something like +SourceForge, but as they are mainly JDBC related I thought here is the best +place. + +Now all (bar retepPDF, see end-note) will over the next few months be going +into the /contrib/retep directory. They range from simple XML Inport/Export +classes to entire sub-systems that can be plugged into applications. + +All this lot were never released, so I'm placing them under PostgreSQL's +licence. + +Please refer to Implementation for details of what package does what. + +It all requires Java2SE (JDK1.2) as a minimum. I do have some plans for some +EJB tools later, so those will need Java2EE, but not yet ;-) + +Peter Mount +peter@retep.org.uk +March 2 2001 + +retepPDF: This is not included for two reasons: + +1: It's big and not really related in any way to PostgreSQL +2: More importantly, I (may be foolishly) released it some 3 years ago under + the LGPL. As a few people have added to it, it's not really possible to + change the licence, and I don't want to polute PostgreSQL's source tree ;-) + +retepGraph: This was an old graphics library. It's been obsolete for 3 years +now, so it's not going in. + diff --git a/contrib/retep/build.xml b/contrib/retep/build.xml new file mode 100644 index 00000000000..04a8db5c2f0 --- /dev/null +++ b/contrib/retep/build.xml @@ -0,0 +1,98 @@ + + + + +]> + + + + + + + + + + + + + + + + + + + +*** WARNING: Contributed retep tools need jdk1.2 or later. +*** Compilation NOT done + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/retep/data/cds.dtd b/contrib/retep/data/cds.dtd new file mode 100644 index 00000000000..df542c34768 --- /dev/null +++ b/contrib/retep/data/cds.dtd @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/contrib/retep/data/cds.xml b/contrib/retep/data/cds.xml new file mode 100644 index 00000000000..fb0203bda90 --- /dev/null +++ b/contrib/retep/data/cds.xml @@ -0,0 +1,2691 @@ + + + + 01 - Kiling Time + 02 - Waiting To Die + 03 - Feel Good + 04 - Bartender + 05 - Crazy Legs + 06 - Pac Bell + 07 - I Got You + 08 - Boom (How You Like That) + 09 - Swan Dive + 10 - Stevie + 11 - Jesus (Of Nazareth) + 12 - The Meadow + + + + + jump for joy + + + 01 - No Limit + 02 - Tribal Dance + 03 - Mysterious + 04 - Faces + 05 - Maximum Overdrive + 06 - The Power Age + 07 - Break The Chain + 08 - Kiss Me Bliss Me + 09 - Thow The Groove Down + 10 - R.U.O.K + 11 - Let The Beat Control Your Body + 12 - Invinite Me To Trance + 13 - Where Are You Now + 14 - Shelter For A Rainy Day + 15 - Get Ready For This (WILDE MIX) + 16 - No Limit - (AUTOMATIC BREAKBEAT REMIX) + + + + + 01 - 2-Raum Wohnung - Wir trafen uns in einem Garten + 02 - 2-Raum Wohnung - Wir trafen uns in einem Garten (Inga Humpes Version) + 03 - 2-Raum Wohnung - Wir trafen uns in einem Garten mit Max + 04 - 2-Raum Wohnung - Wir trafen uns in einem Garten (i-oI - Remix) + + + + + 01 - Track 1 + 02 - Track 2 + 03 - Track 3 + 04 - Track 4 + 05 - Track 5 + 06 - Track 6 + 07 - Track 7 + 08 - Track 8 + 09 - Track 9 + 10 - Track 10 + 11 - Track 11 + 12 - Track 12 + 13 - Track 13 + + + + + 01 - Show me something good + 02 - Feel 'ya + 03 - Find Your Own Peace + 04 - Nourishing The Ocean + 05 - Walking + 06 - Bring Out Your Love + 07 - Primetime + 08 - Stormy + 09 - Philosophie + 10 - No + 11 - Dharma + 12 - Shine On + + + + + 01 - Ambitionz As A Ridah + 02 - All bout u + 03 - Skandalouz + 04 - Got My Mind Made Up + 05 - How Do You Want It + 06 - 2 Of Amerikaz Most Wanted + 07 - No More Pain + 08 - Heartz of Men + 09 - Life Goes On + 10 - Only God can judge me + 11 - Tradin War Stories + 12 - California Love(RMX) + 13 - I Ain't Mad At Cha + 14 - What'z Ya Phone Number + + + 01 - Radio Mix + 02 - Instrumental + 03 - Album Mix + + + 01 - Redemption + 02 - Open Fire + 03 - R U Still Down_ (Remeber Me) + 04 - Hellrazor + 05 - Thug Style + 06 - Where Do We Go From Here + 07 - I Wonder If Heaven Got A Ghetto + 08 - Nothing To Lose + 09 - I'm Gettin Money + 10 - Lie To Kick It + 11 - Fuck All Y'all + 12 - Let Them Thangs Go + 13 - Definition Of A Thug Nigga + + + 01 - Ready 4 Whatever + 02 - When I Get Free + 03 - Hold On Be Strong + 04 - I'm Losin It + 05 - Fake Ass Bitches + 06 - Do For Love + 07 - Enemies With Me + 08 - Nothin But Love + 09 - 16 On Death Row + 10 - I Wonder If Heaven Got A Ghetto (Hip-hop Version) + 11 - When I Get Free + 12 - Black Starry Night (Interlude) + 13 - Only Fear Of Death + + + + + 01 - Original Version + 02 - SNA Club Mix + 03 - Jack Daniel´s + + + + + 01-Loveless + 02-Golden Age of Life + 03-Planeteria + 04-Third Stream + 05-Escape That + 06-Cosmic Tree + 07-Spirits in Transit + 08-The Action + 09-Star Chasers + 10-Wishful Thinking + 11-Universal Reprise + + + 01-We who are not as others + 02-Humans + 03-In the shadows + 04-Mathmatical Probability + 05-Greys + 06-Pegasus 51 + 07-!$^^$% + 08-Wormholes + 09-Dauntless + + + 01-Planetaria (Hefner Remix) + 02-We Who Are Not As Others (Jazzaova Version) + 03-Mathematical Probability (Mustang Remix) + 04-Escape That (New Sector Movements Selekshan 2 Sector Rub Remix) + 05-Escape That (Off-World Remix) + 06-Dauntless (Restless Soul South Pacific Remix) + 07-Star Chasers (Masters at Work Main Mix) + 08-Star Chasers (Azymuth Remix) + 09-The Action (Shawn J Period Remix) + 10-We Who Are Not As Others (Alpha Omega Remix) + 11-We Who Are Not As Others (Sonar Circle Remix) + + + + + 01 - Train + 02 - Superfly + 03 - What's Up + 04 - Pleasantly Blue + 05 - Morphin & Chocolate + 06 - Spaceman + 07 - Old Mr. Heffer + 08 - Calling All The People + 09 - Dear Mr. President + 10 - Drifting + 11 - No Place Like Home + + + + + 01 - Owner Of A Lonely Heart + 02 - Hold On + 03 - It Can Happen + 04 - Changes + 05 - Cinema + 06 - Leave It + 07 - Our Song + 08 - City Of Love + 09 - Hearts + + + + + 01 - For Starters + 02 - Monkey Kong + 03 - A + 04 - Old Folks + 05 - Hopper Jonnus Fang + 06 - Summer On The Underground + 07 - Warning + 08 - If It Ain't Broke Fix It Anyway + 09 - I Love Lake Tahoe + 10 - Don't Be Punks + 11 - Down On The Floor + 12 - Jason's Addiction + 13 - Miles Away + 14 - Getting Around + + + + + 01-The Universe-A Guy Called Gerald + 02-The First Breath-A Guy Called Gerald + 03-Humanity-A Guy Called Gerald + 04-Multiplies-A Guy Called Gerald + 05-Fever (Or a Flame)-A Guy Called Gerald + 06-Could you Understand-A Guy Called Gerald + 07-Alien Report-A Guy Called Gerald + 08-Glow-A Guy Called Gerald + 09-Beaches & Deserts-A Guy Called Gerald + 10-Final Call-A Guy Called Gerald + 11-I Make It-A Guy Called Gerald + 12-Universal Spirit-A Guy Called Gerald + 13-Hurry To Go Easy-A Guy Called Gerald + 14-Scale Circle-A Guy Called Gerald + 15-Landed-A Guy Called Gerald + + + + + 01 A Teens - Mamma Mia + 03 A Teens - Super Trouper + 02 A Teens - gimme gimme gimme (a man after midnight) + 04 A Teens - One of us + 05 A Teens - Voulez vous + 06 A Teens - SOS + 07 A Teens - Dancing Queen + 08 A Teens - Take a chance on me + 09 A Teens - Lay all your love on me + 10 A Teens - The name of the game + 11 ATeens - Our last summer + + + + + 01 - Take On Me + 02 - Cry Wolf + 03 - Touchy + 04 - You Are The One + 05 - Manhattan Skyline + 06 - The Blood That Moves The Body + 07 - Early Morning + 08 - Hunting High And Low + 09 - Move To Memphis + 10 - I've Been Losing You + 11 - The Living Daylights + 12 - Crying In The Rain + 13 - I Call Your Name + 14 - Stay On These Roads + 15 - Train Of Thought + 16 - The Sun Always Shines On TV + + + 01 - Take on me + 02 - Train of Thought + 03 - Hunting High and Low + 04 - The Blue Sky + 05 - Living a Boy's Adventure Tale + 06 - The Sun Always Shines On TV + 07 - And You Tell Me + 08 - Love Is Reason + 09 - I Dream Myself Alive + 10 - Here I Stand and Face the Rain + + + 01 - minor earth major sky + 02 - little black heart + 03 - velvet + 04 - summer moved on + 05 - the sun never shone that day + 06 - to let you win + 07 - the company man + 08 - thought that it was you + 09 - i wish i cared + 10 - barely hanging on + 11 - you will never get over me + 12 - i wont forget here + 13 - mary ellen makes the moment count + + + + + 01 - Dancing Queen + 02 - Knowing Me, Knowing You + 03 - Take A Chance On Me + 04 - Mamma Mia + 05 - Lay All Your Love On Me + 06 - Super Trouper + 07 - I Have A Dream + 08 - The Winner Takes It All + 09 - Money, Money, Money + 10 - S.O.S + 11 - Chiquitita + 12 - Fernando + 13 - Voulez Vous + 14 - Gimme! Gimme! Gimme! + 15 - Does Your Mother Know + 16 - One Of Us + 17 - The Name Of The Game + 18 - Thank You For The Musik + 19 - Waterloo + + + 01 - Waterloo + 02 - Honey, Honey + 03 - So long + 04 - I do + 05 - SOS + 06 - Mamma mia + 07 - Fernando + 09 - Money, Money, Money + 10 - The name of the game + 11 - Take a chance on me + 12 - Chiquitita + 13 - I have a dream + 14 - The winner takes it all + 15 - Super trouper + 16 - Thank you for the music + + + 01 - Summer Night City + 02 - Angeleyes + 03 - The Day Before You Came + 04 - Eagle + 05 - I Do, I Do, I Do, I Do, I Do + 06 - So Long + 07 - Honey Honey + 08 - The Visitors + 09 - Our Last Summer + 10 - On & On + 11 - Ring Ring + 12 - I Wonder + 13 - Lovelight + 14 - Head Over Heels + 15 - When I Kissed The Teacher + 16 - I Am The City + 17 - Cassandra + 18 - Under Attack + 19 - When All Is Said And Done + 20 - The Way Old Friends Do + + + 01 - People Need Love + 02 - Ring Ring + 03 - Waterloo + 04 - Waterloo (German Version) + 05 - Honey Honey + 06 - So Long + 07 - I Do, I Do, I Do, I Do, I Do + 08 - S.O.S + 09 - Mamma Mia + 10 - Fernando + 11 - Dancing Queen + 12 - Money, Money, Money + 13 - Knowing Me, Knowing You + 14 - The Name Of The Game + 15 - Take A Chance On Me + 16 - Eagle + 17 - Thank You For The Music + 18 - Summer Night City + + + 01 - Chiquitita + 02 - Does Your Mother Know + 03 - Voulez-Vous + 04 - Gimme! Gimme! Gimme! (A Man After Midnight) + 05 - I Have A Dream + 06 - The Winner Takes It All + 07 - Super Trouper + 08 - Lay All Your Love On Me + 09 - One Of Us + 10 - Head Over Heels + 11 - The Day Before You Came + 12 - Under Attack + 13 - Ring Ring (German Version) + 14 - Happy New Year + 15 - Wer Im Wartesaal Der Liebe Steht + + + + + 01. Absolute Beginner - Das Boot + 02. Absolute Beginner - Hammerhart + 03. Absolute Beginner - Rock On + 04. Absolute Beginner - Liebeslied + 05. Absolute Beginner - Füchse + 06. Absolute Beginner - Fahr'n + 07. Absolute Beginner - Showmaster + 08. Absolute Beginner - Geht Was + 09. Absolute Beginner - Geh bitte + 10. Absolute Beginner - Nie Nett + 11. Absolute Beginner - Mikro in der Hand + 12. Absolute Beginner - Nicht Allein + 5Sterne Delux - Dein Herz schlägt schneller + + + + + 01-Zonenzombie + 02-Papier + 03-Friss den Stahl + 04-Charly + 05-Die Ballade von Karl Arsch + 06-Europa + 07-Terror und Schrott + 08-Küss mich + 09-Weit daneben gepisst + 10-Welt voll Harmonie + 11-Die Zeit + 12-Unfall + 13-Ich und die Wirklichkeit + 14Die Reise + + + + + 01 AC-DC - Riff Raff + 02 AC-DC - Let There Be Rock + 03 AC-DC - Whole Lotta Rosie + 04 AC-DC - Sin City + 05 AC-DC - Dirty Deeds Done Dirt Cheap + 06 AC-DC - Baby Please Don't Go + 07 AC-DC - Big Balls + 08 AC-DC - Walk All Over You + 09 AC-DC - Hard As Rock + 10 AC-DC - Hells Bells + 11 AC-DC - What Next To The Moon + 12 AC-DC - Shake Your Foundations + 13 AC-DC - Gone Shooting + 14 AC-DC - Thunderstuck + + + + + 01 - Life Is A Flower + 02 - Always Have, Always Will + 03 - Cruel Summer + 04 - Travel To Romantis + 05 - Adventures In Paradise + 06 - Dr. Sun + 07 - Cecilia + 08 - He Decides + 09 - I Pray + 10 - Tokyo Girl + 11 - Don't Go Away + 12 - Captain Nemo + 13 - Donnie + 14 - Cruel Summer (Big Bonus Mix) + + + 01 - Voules-Vous Dancer + 02 - All That She Wants + 03 - Münchhausen (Just Chaos) + 04 - Happy Nation + 05 - Waiting For Magic + 06 - Fashion Party + 07 - Wheel Of Fortune + 08 - Dancer In A Daydream + 09 - My Mind -Mindles Mix- + 10 - W.O.F. -Original Club Mix- + 11 - Dimension Of Depth + 12 - Young And Proud + 13 - A.T.S.W. -Banghra Version- + + + 01 - The sign (radio edit) + 02 - The sign (long version) + + + + + 01 - Made in Paradise + 02 - Auf der Rolltreppe + 03 - Kuddel Daddel Du + 04 - Die Zauberin + 06 - Sturmflut + 07 - Robert der Roboter + 08 - Melancholie + 09 - Karawane ins Glück + 10 - Das Lied von Susi und Johnny + 11 - Mein Herz ist ein Ufo + + + + + 01 - acid marathon 1 + 02 - acid marathon 2 + 03 - acid marathon 3 + 04 - washaa + 05 - acid marathon 4 + 06 - jing jang + 07 - in front of da outland + 08 - mondonon + 09 - clock seven + 10 - 4 degrees + 11 - balance + 12 - + + + acid + + + + + 01 - Intro + 02 - 73 + 03 - Metropolis + 04 - Music in my Mind + 05 - Jaxx + 06 - Mother Death + 07 - The Tree Knows Everything + 08 - Circles + 09 - Dirty Happy + 10 - F-Jam + 11 - Colours + 12 - Aromatherapy + + + + + 01 - Tiro Ao lvaro + 02 - Iracema + 03 - Trem Das Onze + 04 - Saudosa Maloca + 05 - O Samba Do Arnesto + 06 - Torresmo Milanesa + 07 - Viaduto Santa Efig nia + 08 - Bom Dia Tristeza + 09 - As Mariposas + 10 - Despejo Na Favela + 11 - Ag enta a M o, Jo o + 12 - Vide Verso Meu Endere o + 13 - Acende O Candieiro + 14 - No Morro Da Casa Verde + 15 - Vila Esperan a + 16 - Fica Mais Um Pouco Amor + 17 - Apaga O Fogo Man + + + + + 01 - Por que voc faz cinema- + 02 - A f brica do Poema + 03 - Bagatelas + 04 - Metade + 05 - Sudoeste + 06 - O verme e a estrela + 07 - Estrelas + 08 - Aconteceu + 09 - Cariocas + 10 - Morro dois irm os + 11 - Inverno + 12 - Roleta russa + 13 - Tema de Alice + 14 - Portrait of Gertrude + 15 - Minha m sica + + + + + Amazing + Boogie Man + Can't Stop Messin' + Crazy + Cryin' + Eat the Rich + Fever + Flesh + Get a Grip + Gotta Love It + Intro + Line Up + Livin' on the Edge + Shut Up And Dance + Walk On Down + + + 01 - Nine Lives + 02 - Falling In Love + 03 - Hole In My Soul + 04 - Taste Of India + 05 - Full Circle + 06 - Something's Gotta Give + 07 - Ain't That A Bitch + 08 - Take Me To The Farm + 09 - Crash + 10 - Kiss Your Past Good-bye + 11 - Pink + 12 - Falling Off + 13 - Attitude Adjustment + + + + + 01 - Amor Verdadero + 02 - Alto Songo + 03 - Habana Del Este + 04 - A Toda Cuba Le Gusta + 05 - Fiesta de la Rumba + 06 - Los Sitio' Asere + 07 - Pio Mentiroso + 08 - Maria Caracoles + 09 - Clasiqueando con Ruben + 10 - Elube Chango + + + + + 01 - Das Möbiusband - Zeychen und Wunder + 02 - Triebwerk + 03 - Felix + 04 - Kosmonauten + 05 - Fingerwalze + 06 - So sollte es nicht sein! + 07 - Küchenlied + 08 - Das Scheusal + 09 - Déjà vu (Snap Mix #2) + 10 - Hasensong + 11 - Schöner leben + 12 - Rohleder's + 13 - Maximale Gier + 14 - Nach Hause (instr.) + 15 - Gesichter + 16 - Stadt-Fisch + + + + + 01-Intro + 02-Cold Water Music + 03-The Force + 04-Sail + 05-Downstate + 06-Ain't Got Time To Waste + 07-Fat City (Interlude) + 08-True To Hip Hop + 09-Demonique + 10-A Tree, A Rock And A Cloud + 11-Journey To The End Of The Night + 12-From Here To Fame + + + + + 01 - Original mix + 02 - Sexy boy + 03 - Album version + 04 - Remember + + + 01 - La Femme D'Argent + 02 - Sexy Boy + 03 - All I Need + 04 - Kelly Watch The Stars + 05 - Talisman + 06 - Remember + 07 - You Make It Easy + 08 - Ce Matin La + 09 - New Star In The Sky + 10 - Le Voyage De Pénélope + + + 01 - Modular Mix + 02 - Casanova 70 + 03 - Les Professionnels + 04 - J'ai dormi sous l'Eau + 05 - Le Soleil est pres de Moi + 06 - Californie + 07 - Brakes On + + + 01 - playground love + 02 - clouds up + 03 - bathroom girl + 04 - cemetary party + 05 - dark messages + 06 - the word 'hurricane' + 07 - dirty trip + 08 - highschool lover + 09 - afternoon sister + 10 - ghost song + 11 - empty house + 12 - dead bodies + 13 - suicide underground + + + + + A Teens - Super Trouper + Aqua - Cartoon Heroes + Backstreet Boys - Show Me The Meaning Of Being Lonely + Bloodhound Gang - The Bad Touch + Die Toten Hosen - Unsterblich + Enrique Iglesias - Rhythm Divine + Highland - Bella Stella + HIM - Join me + Lene Marlin - Sitting Down Here + Madonna - American Pie + Marc Anthony - I Need To Know + Melanie C - Northern Star + Metallica - Nothing Else Matters + Modern Talking - China In Your Eyes (Ext.Version) + N'Sync - Bye Bye Bye + Natural Born Hippies - Am I Not Sweet + Oli.P - Niemals Mehr + Prezioso feat. Marvin- Tell Me Why + Santana - Maria Maria + Sash! - Adelante [Original Mix] + Stefan Raab - Wadde Hadde Dudde Da + Sting - Desert Rose + Thomas D. - Liebesbrief + Vengaboys - Shalala Lala + Yamboo - Come With Me + + + 01_Blank & Jones - The Nightfly + 02_Passion Fruit - Wonderland + 03_GIGI D'AGOSTINO - The Riddle + 04_Echt - Junimond + 05_Bon Jovi - It´s My Life + 06_Backstreet Boys - The One + 07_Venga Boys - Uncle John From Jamaica + 08_GIGI D'AGOSTINO - Another Way + 09_Ace Of Base - Hallo Hallo + 10_Melanie C - Never Be The Same Again + 11_Anton Aus Tirol Feat DJ Ötzi - Gemma Bier Trinken + 12_Britney Spears - Oops I Did It Again + 13_GIGI D'AGOSTINO - La Passion + 14_Reamonn - Supergirl + 15_John Davies - I Promised Myself + 16_Fools Garden - Suzy + 17_Bomfunk MC's - Freestyler + 18_Die Toten Hosen - Bayern + 19_Die Band Ohne Namen - Take My Heart + + + Anastacia - I'm Outta Love + Andreas Stenschke - Just When I Needed You Most + Antonia Feat. Sandra - ...Ich Bin Viel Schöner + Azuca - Este Chico (I Fall In Love With You) (Radio Mix) + Bastian Raagas - You Complete Me (Radio Dance Version) + Captain Jack - Only You + Celine Dion - I Want You To Need Me (Radio Edit) + Celine Dion - I Want You To Need Me (Thunderpuss Radio Mix) + Chayanne - Boom Boom (Spanglish Version) + Eskobar - Good Day For Dying (Radio Edit) + Hooverphonic - Mad About You (Radio Edit) + Madonna - Music (CD Version) + Monaco - I´ve Got A Feeling (Radio Edit) + Red Sector - Invasion Over Berlin (Short Energy Mix) + Senait - Aura (Radio Edit) + Sharon Williams - Life Is So Strong (Single Edit) + Sladdgo - Was Du Woll + Sonique - It Feels So Good + Sound Convoy - Hey Baby ( Radio Edit ) + Verena - Ist das alles + + + Berger - Zeig mir Dein Gesicht + Britney Spears - Lucky + Darude - Sandstorm + Marque - Electronic Lady + Mel C - I Turn To You + Mr President - Up´n Away 2k + N Sync 02 - It's Gonna Be Me + Orange Blue - She's Got That Light + Rednex - Hold Me (For A While) + Rednex - The Spirit Of The Hawk + Ronan Keating - Life is a Rollercoaster + Sasha - Owner Of My Heart + Tic Tac Toe - Ich liebe Disch + Toploader - Dancing in the Moonlight + Vanessa Amorosi - Absolutely Everybody + Whitney Houston & Enrique Iglesias - Could I Have This Kiss Forever + + + + + 01 - Che Angelo Sei (Amore Mio) + 02 - Tu Soltanto Tu (Mi Hai Fatto Innamorare) + 03 - Ci Sara + 04 - Imagini 77 + 05 - Canto Di Libertá + 06 - Abbandonati + 07 - Prima Notte D´amore + 08 - Sharazan + 09 - Felicitá + 10 - Meditando + 11 - Caro Gesú + 12 - E Fu Subito Amore + 13 - Angeli + 14 - Aria Pura + 15 - Lo Ti Cerco + 16 - Canzone Blu + + + + + 01 - All I Really Want + 02 - You Oughta Know + 03 - Perfect + 04 - Hand In My Pocket + 05 - Right Through You + 06 - Forgiven + 07 - You Learn + 08 - Head Over Feet + 09 - Mary Jane + 10 - Ironic + 11 - Not the Doctor + 12 - Wake Up + 13 - You Oughta Know (remix) + + + 01 - You Learn-1 + 01 - You Learn + 02 - Joining You + 03 - No Pressure Over Cappuccino + 04 - That I Would Be Good + 05 - Head Over Feet + 06 - Princes Familiar + 07 - I Was Hoping + 08 - Ironic + 09 - These R The Thoughts + 10 - King Of Pain + 11 - You Oughta Know + 12 - Uninvited + + + Alanis Morisette - 01 Front Row + Alanis Morisette - 02 Baba + Alanis Morisette - 03 Thank U + Alanis Morisette - 04 Are You Still Mad + Alanis Morisette - 05 Sympathetic Character + Alanis Morisette - 06 That I Would be Good + Alanis Morisette - 07 The Couch + Alanis Morisette - 08 Can't Not + + + + + 01 - Time + 02 - Tryin' + 03 - The Child + 04 - Ralph & Kathy + 05 - With U + 06 - You, my Baby & I + 07 - 06 10 98 + 08 - Party People + 09 - Consolidated + 10 - Quiet Storm + + + + + 01 - Feel the Sunshine + 02 - Jazz Master + 03 - Intro 1 + 04 - Acid Lab + 05 - Pulp Friction + 06 - Candles + 07 - Ibiza + 08 - Intro 2 + 09 - Out of Time + 10 - U R + + + + + 01 - Big In Japan + 02 - Sounds Like A Melody + 03 - Sensations + 04 - The Mysteries Of Love + 05 - Lassie Come Home + 06 - Jerusalem + 07 - Dance With Me + 08 - For A Million + 09 - A Victory Of Love + 10 - The Jet Set + 11 - Red Rose + 12 - Romeos + 13 - Summer Rain + 14 - Forever Young + 15 - Big In Japan [Culture Mix] + + + A Victory Of Love + Big In Japan + Fallen Angel + Forever Young + In The Mood + Lies + Sounds Like A Melody + Summer In Berlin + The Jet Set + To Germany With Love + + + + + 01 - Follow Me + 02 - Gold + 03 - Mother Look What They've Done To Me + 04 - Run Baby Run + 05 - Queen Of China Town + 06 - The Sphinx + 07 - Blood And Honey + 08 - Fashion Pack + 09 - Fabulous Lover Love Me + 10 - Diamonds + 11 - Egal + 12 - Fever + 13 - Never Trus A Pretty Face + 14 - Alphabet + 15 - Im A Photograph + 16 - Blue Tango + 17 - Tomorrow + 18 - The Lady In Black + 19 - I Need A Man + 20 - Nymphomania + + + + + 01 - Let it rain + 02 - Birmingham + 03 - Fall from grace + 04 - Dark Horse + 05 - Beautiful goodbye + 06 - Sitting on the top of the world + 07 - Last exit to eden + 08 - Trust me (This is love) + 09 - Let's got lost + 10 - Promises + + + 01 - Dark Horse + 02 - Let It Rain + 03 - Birmingham + + + 01 - Believe in you + 02 - Love lift me + 03 - Why don't you love me- + 04 - Too little, too late + 05 - If I didn't have you + 06 - Ride + 07 - Right here all along + 08 - Wishful thinking + 09 - Shades of grey + 10 - Give up giving in + 11 - Best of me + 12 - Never said goodbye + 13 - Out of bounds + + + + + 01 - Stoney Street + 02 - Easy Muffin + 03 - Yasawas + 04 - Creatures + 05 - Chomp Samba + 06 - The New York Editor + 07 - Defocus + 08 - The Nasty + 09 - Bitter & Twisted + 10 - Wires & Snakes + 11 - One Day In My Garden + 12 - Dream Sequence + 13 - One Small Step + 14 - Mission + + + 01 - Get Your Snack On + 02 - Four Ton Mantis + 03 - Slowly + 04 - Marine Machines + 05 - Golfer vrs Boxer + 06 - Deo + 07 - Precursor (feat. Quadraceptor) + 08 - Saboteur + 09 - Chocolate Lovely + 10 - Rhino Jockey + 11 - Keepin' It Steel (The Anvil Track) + 12 - Natureland + + + + + 01 - Not That Kind + 02 - I'm Outta Love + 03 - Cowboys & Kisses + 04 - Who's Gonna Stop The Rain + 05 - Love Is Alive + 06 - I Ask Of You + 07 - Wishing Well + 08 - Made For Lovin' You + 09 - Black Roses + 10 - Yo Trippin' + 11 - One More Chance + 12 - Some Old Story + + + + + 01 - Get you closer + 02 - Michael caine + 03 - Evil boys + 04 - Pimmelmann + 05 - Und wieder + 06 - Love & fingers + 07 - Pray + 08 - Men in uniform + 09 - Hypnotize + 10 - Der erste Schritt + + + 01 - Devil airlines + 02 - Second front + 03 - Metalhammer + 04 - Menschen + 05 - And one + 06 - Only one + 07 - Crimetime + 08 - Synthetik + 09 - Geld + 10 - Second voice + 11 - Exit + 12 - Anguish + 13 - Deliverance + 14 - Metalhammer (Heavy mix) + + + 01 - Get You Closer (Radio Mix) + 02 - Get You Closer (Club Mix) + 03 - Pimmelmann (Nixmix) + + + 01 - Ego + 02 - Murder murder + 03 - Driving with my darling + 04 - The only guest + 05 - Dein Duft + 06 - It happend last night + 07 - When the feet hurt + 08 - The secret + 09 - Fuer + 10 - Second day + 11 - Body nerv + 12 - Take some more + 13 - Deutschmaschine + 14 - Heart of stone + 15 - Ghama voodoo + 16 - Bonus + + + 01 - Nachtschicht in der hassfabrik + 02 - Teufel oder engel + 03 - Klon mich lieber nicht! + 04 - Maschinenstuermer + 05 - Bedienungsanleitungen + + + 01 - Und dafuer + 02 - Sometimes + 03 - Movie star + 04 - Uns geht's gut + 05 - My warrior + 06 - Creatures + 07 - Sweety sweety + 08 - Schluss mit lustig + 09 - Sitata tirulala + 10 - Friends in heaven + 11 - Mirror in your heart + 12 - Nordhausen + + + 01 - Sometimes (Radio Edit) + 02 - High (Bonus) + 03 - White Doves (Bonus) + 04 - Technoman (Live !) + 05 - Sometimes (Instr.) + 06 - Nordhausen (Album Mix) + + + 01 - Wild pain + 02 - Life isnt easy in germany + 03 - Consequence of time + 04 - Spontanverkehr + 05 - Friend of stars + 06 - Hall of souls + 07 - Recover you + 08 - Der erste Stein + 09 - Tanz der Arroganz + 10 - The and + 11 - Spot + 41 - Wild pain (maxi) + + + 01 - Virgin superstar + 02 - Wasted + 03 - You don't love me anymore + 04 - Goodbye Germany + 05 - Wet spot + 06 - Panzer Mensch + 07 - My story + 08 - Life to lose + 09 - Not the only one + 10 - Don't need the drugs + 11 - Mr Jenka + + + 01 - Wasted (Radio Edit) + 02 - Forever J (Bonus) + 03 - Wasted (Naghavi Mix) + 04 - Maschinenhimmel (Bonus) + 05 - Lawrence Of Arabia (Bonus) + + + + + 01-Track 1 + 02-Track 2 + 03-Track 3 + 04-Track 4 + 05-Track 5 + 06-Track 6 + 07-Track 7 + 08-Track 8 + 09-Track 9 + 10-Track 10 + 11-Track 11 + 12-Track 12 + 13-Track 13 + 14-Track 14 + 15-Track 15 + 16-Track 16 + 17-Track 17 + 18-Track 18 + + + + + 01 - lass uns brennen + 02 - girls in love + 03 - so ist das nun mal + 04 - ab + 05 - allein im park + 06 - das weisst nur du + 07 - du bist da + 08 - blaumeise yvonne + 09 - es ist nur der rauch + 10 - in mich selbst verliebt + 11 - wenn du menschen triffst + 12 - das maedchen auf dem foto + 13 - scheinzahm + + + 01 - girls in love (original version) + 02 - girls in love (grungerman remix) + 03 - girls in love (forever sweet remix) + 04 - singen hoeren + + + 01 - girls in love + 02 - ich weiss es nicht (tegel a23) + 03 - es ist nur der rauch + 04 - ich weiss es nicht + + + 01 - so ist das nun mal + 02 - linda + 03 - so ist das nun mal (mike ink mix) + 04 - so ist das nun mal (reinhard & tobias happy sundays mix) + + + + + 01 - Il giocatore di biliardo + 02 - La comica finale + 03 - Il dito e la luna + 04 - L'ultimo giorno del circo + 05 - Per ogni matematico + 06 - La parola ai mimi + 07 - L'uso dell'amore + 08 - Lamento di un uomo di neve + 09 - La regola del filo a piombo + 10 - Vita quotidana di uno spettro + 11 - La leggenda del collezionista + 12 - Confesso che ho vissuto + + + 01 - il ladro + 02 - Madame + 03 - bella faccia + 04 - uomini di passaggio + 05 - Ballerina + 06 - Amazzonia + 07 - il bambino dei topi + 08 - il tempo di partire + 09 - il grido + 10 - ai confini dell'asia + 11 - Festa + + + 01 - Il Cantico Delle Creature + 02 - Il Sultano Di Babilonia E La Prostituta + 03 - Il Lupo Di Gubbio + 04 - Audite Poverelle + 05 - Divina Commedia - Paradiso, Canto XI + 06 - Il Trattato Dei Miracoli + 07 - Nelle Paludi Di Venezia Francesco Si Fermò Per Pregare E Tutto Tacue + 08 - La Regola + 09 - La Predica Della Perfetta Letizia + 10 - La Morte Di Francesco + 11 - Salmo + + + + + 01 - Nothing at all + 02 - Weltschmerz + 03 - Killing time + 04 - True love tales + 05 - Self destruct + 06 - Out darkness + 07 - The sitting room + 08 - Swimming + 09 - An ordinary life + 10 - Shades + 11 - Short story + 12 - The power game + 13 - All we have to be thankful for + + + Letter Of Thanks To A Friend (club edit) + Letter Of Thanks To A Friend (instrumental edit) + Letter Of Thanks To A Friend (radio edit) + + + 01 - Hardfloor 97 Radio edit + 02 - Hardfloor 97 version + 03 - Total eclipse remix + + + 01 - Heaven + 02 - Red Sands + 03 - Alarm Call + 04 - Tide + 05 - The Interruption + 06 - The Power Game + 07 - World Without Warning + 08 - Bursting + 09 - Lovers Retreat + + + If I could + Our Darkness-2 + Our Darkness + + + At Midnight + Closed Circuit + Come In + Dedication + Echoes Remain Forever + Fragility + Improvisation + Interlude + Journey By Night + Killing Time + So Quiet Here + Swallow Song + That We Have Been Here + The Sitting Room + The Spinning Turning Of The Summer Earth + This Be The Verse + Unstill Life + Windmills Of Your Mind + World Without Warning + + + 01 - Up + 02 - Homecoming + 03 - Red sands + 04 - The power game + 05 - Cane hill + 06 - Leaving + 07 - Heaven + 08 - The last emotion + 09 - Killing time + 10 - Wallies + 11 - Out darkness + 12 - Now + 13 - This be the verse + 14 - Sleeper in metropolis + + + 01 - the sitting room + 02 - swimming + 03 - an ordinary live + 04 - shades + 06 - the power game + 07 - all we have to be thankful + 08 - contact + 09 - sleeper in metropolis + 10 - poem for a nuclear romance + 11 - wallies + 12 - the lovers audition + 13 - poets turmoil no 364 + 14 - echoes remain forever + 15 - all night party + 16 - pandoras box + 17 - feel + 18 - the last emotion + 19 - nothing at all + 20 - true love tales + 21 - self destruct + 23 - weltschmerz + 24 - our darkness remix 12 + x0 - killing time + y0 - for + + + Acropolis + Athens + Dream Made Real + Elegy For A Lost Summer + Letter Of Thanks To A Friend + Mundesley Beach + Painting + The Healing + The Key + Virtuality + + + 01 Anne Clark - Virtuality ( Global Youth Remix ) + 02 Anne Clark - The Healing ( Aural Float Treatment ) + 03 Anne Clark - Sleeper In Metropolis ( Hardfloor 97 Version ) + 04 Anne Clark - Letter Of Thanks To A Friend ( Radi Mate Mix By Mouse On Mars ) + 05 Anne Clark - Nida ( Saafi Bros. Remix ) + 06 Anne Clark - Our Darkness ( Hardfloor 97 Version ) + 07 Anne Clark - Homecoming ( Pascal F.E.O.S. Remix ) + 08 Anne Clark - Sleeper In Metropolis ( Sleepers Revenge Mix by Sven Väth & Ralf Hildenbeutel ) + 09 Anne Clark - Contact ( Contact 2017 Mix by the Mover ) + 10 Anne Clark - Wallies ( Night Of The Hunter Remix By Juno Reactor ) + 11 Anne Clark - Our Darkness ( Total Eclipse Remix ) + + + + + 01 - Radio edit + 02 - Album version + 03 - Instrumental + 04 - It is a shame + + + + + abe + barney2 + barney3 + bart + bfpvny + bush + cfuture + duffy + eckat + fett + feuerste + homer + homer2 + homer3 + homer4 + homer5 + krusty + moe + moe2 + nafzu + ned + nick + prfsimon + roehrich + sexchat + simpson + spd + spd2 + troymc + + + 0190maen + 0190weib + anonym + bettdecke + domina + hotline + otto + peppig + sexchat + sexshop + sigilive + susi3 + telsex + + + 3_schritte + abends + ali + anwalt + baby + bananen + beichte + bleib_ma_dran + boehme + butler + f-prinzp + franzoesisch + friedhof + geld + genervt + heller + hengst + horoskop + hypnose + indianer + inkasso + kind + klh-ende + klhradio + kontonr + lauter + mallorca + mamifix + maschine + maxmanu + mensch + mir + mkp + morgens + nervoes + omm + polizei + privater_anschiss + rezept4 + talent + toupet + versteigerung + werbung + y2kfrau + y2kmann + + + bayer + beatles + chanchan + delasoul + dtkuhn + feschajaga + george + helge2 + howard + kaktus + mouskour + python + python2 + raab + ringdong + ruehmann + schwein + spice + tmwywfm + + + 12oder3 + 24uhr + anschlu2 + arabia + assigned + cutoff + d1_1 + d2_3 + d2_4 + ende + erreicht + gehalten + geschaltet + importan + interoute + japan + kingcall1 + kingcall2 + maschendrahtzaun + mittagspause + nachrich + nica + talkline + tmobil + urlaub + vorwahl + + + bbecker + bbecker2 + brandt + bushkohl + cdu + coolman + faust + gerdschroeder + gerdschroeder2 + gerdschroeder3 + gerdschroeder4 + gott + grizmek3 + halrvord + helge4 + honikohl + kohl + kohl2 + kohl3 + kohl4 + kohlsingt + kork + lndnberg + loddar + loriot + michael + mission + moser + papst2 + ranicki + ranicki2 + scherz + supereh + susi3 + weihnachtsmann + wiebitte + wummwend + + + 3947 + borg + c3po + cluster + dsn + dukat + dukat2 + hansolo + holodoc + janeway + kim2 + kira + kirk + mib + nog + obrien + obrien2 + odo + picard + r2d2 + riker + schatten + sisko + sisko2 + spock + spock2 + tng + tos + uhura + voyager + worfdax + zimmerm + + + ab_lilo_5 + airforc2 + airforce + albundy + alf + alf2 + berti + bestofrichie + bond + bond2 + boning + bully + bvogts + clousea2 + clouseau + conan + ddf + delasoul + drebin + drebins + dtkuhn + duke + elaine + emil + erhardt + george + georgebush + ghostbusters + hartman + helge + helge2 + helge3 + krause + lector + lose + mulder + mulder2 + nypd + ohotte + osterwelle + python3 + python4 + python5 + raab + renegade + richie + richie2 + richie3 + richie4 + richie5 + rockfor2 + rockford + scully + scully2 + scully3 + seinfeld + seth + sigi + smeister + thejade + tnet-box + tooltime + twachter + venkman + ventura + ventura2 + verona + wallace + xfiles + + + + + 01 - Girl Boy (nls mix) + 02 - Milk Man + 03 - Inkey$ + 04 - Girl Boy [£18 snarerush mix] + 05 - Beetles + 06 - Girl Boy [redruth mix] + + + 01 - Acrid Avid Jamshred + 02 - The Waxen Pith + 03 - Wax the Nip + 04 - Icct Hedral (Edit) + 05 - Ventolin (Video Version) + 06 - Come On You Slags + 07 - Start As You Mean To Go On + 08 - Wet Tip Hen Ax + 09 - Mookid + 10 - Alberto Balsam + 11 - Cow Cud Is A Twin + 12 - Next Heap With + + + 01 - .215061 + 02 - .1993841 + 03 - .0180871R + 04 - .942937 + 05 - .0180871L + 06 - .000890569 + 07 - .55278037732581 + 08 - (CAT 00897-AA1) + 09 - (CAT 00897-A1) + 10 - AFX 6-B + 11 - (CD Only Track #1) + 12 - (CD Only Track #2) + 13 - (CAT 00897-A2) + + + 01 - Digeridoo + 02 - Flaphead + 03 - Phloam + 04 - Isopropanol + 05 - Polynomial-C + 06 - Tamphex (Hedphuq Mix) + 07 - Phlange Phace + 08 - Dodeccaheedron + 09 - Analogue Bubblebath 1 + 10 - Metapharstic + 11 - We have arrived (Aphex Twin QQT Mix) + 12 - We have arrived (Aphex Twin TTQ Mix) + 13 - Digeridoo (Live in Cornwall, 1990) + + + 01 - Come To Daddy, Pappy Mix + 02 - Flim + 03 - Come To Daddy, Little Lord Faulteroy Mix + 04 - Bucephalus Bouncing Ball + 05 - To Cure A Weakling Child, Contour Regard + 06 - Funny Little Man + 07 - Come To Daddy, Mummy Mix + 08 - IZ-US + + + 01 - Donkey Rhubarb + 02 - Vaz Deferenz + 03 - Icct Hedral (Philip Glass Orchestration) + 04 - Pancake Lizard + + + 01 - Mr. Frosty + 02 - Jelly Fish + 03 - Eggy Toast + 04 - Reg + 05 - Vodka + 06 - Winner Takes All + 07 - Giant Deflating Football + 08 - Upright Kangaroo + 09 - The Sound of Beady Eyes + 10 - Bu Bu Bu Ba + + + 01 - on + 02 - 73-yips + 03 - d-scape + 04 - xepha + + + 01 - d-scape mix + 02 - reload mix + 03 - mu-ziq mix + 04 - 28 mix + + + 01 - Quoth (Original) + 02 - Iketa + 03 - Quoth (Wooden Thump Mix) + 04 - Bike Pump Meets Bucket + 05 - (Unlisted) + + + 01 - Polygon Window + 02 - Audax Powder + 03 - Quoth + 04 - If It Really Is Me + 05 - Supremacy II + 06 - UT1 - dot + 07 - -no title- + 08 - Quixote + 09 - Quino-phec + + + 01 - 4 + 02 - Cornish Acid + 03 - Peek 824545201 + 04 - Fingerbib + 05 - Corn Mouth + 06 - To Cure A Weakling Child + 07 - Goon Gumpas + 08 - Yellow Calx + 09 - Girl-Boy Song + 10 - Logon Rock Witch + + + 01 - Xtal + 02 - Tha + 03 - Pulsewidth + 04 - Ageispolis + 05 - i + 06 - Green Calx + 07 - Heliosphan + 08 - We are the Music Makers + 09 - Schottkey 7th Path + 10 - Ptolemy + 11 - Hedphelym + 12 - Delphium + 13 - Actium + + + 01 - Cliffs + 02 - Radiator + 03 - Rhubarb + 04 - Hankie + 05 - Grass + 06 - Mold + 07 - Curtains + 08 - Blur + 09 - Weathered stone + 10 - Tree + 11 - Domino + 12 - White blur 1 + + + 01 - Ventolin (Salbutamol Mix) + 02 - Ventolin (Praze-An-Beeble Mix) + 03 - Ventolin (Marazanvose Mix) + 04 - Ventolin (Plain-An-Gwarry Mix) + 05 - Ventolin (The Coppice Mix) + 06 - Ventolin (Crowsmengegus Mix) + + + 01 - Ventolin (wheeze mix) + 02 - Ventolin CARHARRACK mix + 03 - Ventolin PROBUS mix + 04 - Ventolin (cylob mix) + 05 - Ventolin (deep gong mix) + 06 - Ventolin (asthma beats mix) + + + + + 01 (Aphrodite) - Aphromoods + 02 (Amazon II) - King Of The Beats + 03 (Aladdin) - Woman That Rolls! + 04 (Aphrodite) - Spice (Of The Gods Remix) + 05 (Aladdin) - Summer Breeze + 06 (Amazon II) - Music's Hypnotising + 07 (Aphrodite (Vortex Mix)) - Listen To The Rythm + 08 (Aphrodite) - Dub Moods (The Greatest Trick) + 09 (Aphrodite) - Style From The Dark Side + 10 (Aphrodite) - Tower Bass! + 11 (Aphrodite feat. Gail Mclean) - I Wanted It More And + 12 (Aphrodite) - Sweet Mind + + + + + 01 - Sealth Overture + 02 - Ain't Talkin' 'Bout Dub + 03 - Altamont Super-Highway Revisted + 04 - Electro Glide In Blue + 05 - Vanishing Point + 06 - Tears Of The Gods + 07 - Carrera Rapida + 08 - Krupa + 09 - White Man's Throat!s + 10 - Pain In Any Language + 11 - Stealth Mass In F#m!s + + + 01 - Are we a rock band or what + 02 - Stop the rock + 03 - Crazee Horse + 04 - Cold Rock the Mic + 05 - Lost in Space (Theme) + 06 - For forty days + 07 - Heart Go Boom + 08 - The Machine in the ghost + 09 - Blackbeat + 10 - Stadium parking lot + 11 - YO, Future + 12 - High on your own supply + 13 - The Perfect crime + + + 02 - Liquid Cool + 03 - Film Me And Finish Me Off + 04 - I Need Something Stronger + 05 - Pain Is A Close Up + 06 - Omega Point + 07 - Don't Fear The Reaper + 08 - Astral Amerika + 09 - Millennium Fever + 10 - Stealth Requiem + + + + + 01 - Love Never Dies, Part I + 02 - Mourn + 03 - Non-Stop Violence + 04 - 25 Cromwell St. + 05 - Rebel + 06 - Deep Red + 07 - Nearer + 08 - Half Asleep + 09 - Love Never Dies, Part II + + + 01_-_Kathy's_Song_(Ferry_Corsten_RMX) + 02_-_Kathy's_Song_(Single_version) + 03_-_Kathy's_Song_(Victoria_mix_by_VNV_Nation) + 04_-_Kathy's_Song_(Beborn_Beton_RMX) + 05_-_Kathy's_Song_(Ferry_Corsten_RMX)(12-_version) + 06_-_Kathy's_Song_(C-64_version) + + + 01 - Mourn (APB Remix) + 02 - Mourn (Ihrmx) + 03 - Mourn (Original Version) + 04 - Untitled Too (Sweep remix) + 05 - Ohm Sweet Ohm + 06 - Electricity + 07 - Snutt 7 + + + 01 - Non-Stop Violence [CNN version] + 02 - Near [Banilla Dream version] + 03 - Burnin' Heretic [Live] + + + 01 - Like Blood From The Beloved (part 1) + 02 - Bitch + 03 - Burnin Heretic (album version) + 04 - Stich + 05 - Walk With Me + 06 - Backdraft + 07 - Arp (808 edit) + 08 - Spiritual Reality + 09 - Skyscraping (schizophreniac) + 10 - All Tomorrows Parties + 11 - The Sentinel + 12 - Ashes To Ashes `93 + 13 - Like Blood From The Beloved (part 2) + + + 01 - Apb goes C-64 + 02 - Deep Red + 03 - Bitch + 04 - Stitch + 05 - Spiritual Reality + 06 - Electronic Warfare + 07 - All Tomorrows Parties + 08 - Arp + 09 - Burnin´ Heretic (Album version) + 10 - Ledelsens Mening + 11 - Backdraft + 12 - Ashes to Ashes (German Slam version) + 13 - The Approach of Death + 14 - Ashes to Ashes (Original 12- version) + 15 - Wrack´em to Pieces + 16 - Burning Heretics (Crisp version) + + + 01 - Everything We Know Is Wrong + 02 - Starsign + 03 - Eclipse + 04 - Help Me + 05 - Kathy's Song (Come Lie Next To Me) + 06 - Untiled 3 + 07 - Moment Of Tranquililty + 08 - Fade To Black + 09 - 64K + 10 - Paranoia + 11 - Soultaker + 12 - LNDP 3 + 13 - Time To Move On + Bonus (ABP Goes C-64 Again) + + + + + 01 Aretha Franklin - Freeway Of Love + 02 Aretha Franklin - I Knew You Were Waiting + 03 Aretha Franklin - Jump To It + 04 Aretha Franklin - Willing To Forgive + 05 Aretha Franklin - Doctor's Orders + 06 Aretha Franklin - United Together + 07 Aretha Franklin - Who's Zoomin' Who + 08 Aretha Franklin - A Deeper Love + 09 Aretha Franklin - Honey + 10 Aretha Franklin - Get It Right + 11 Aretha Franklin - Another Night + 12 Aretha Franklin - Ever Changing Times + 13 Aretha Franklin - Jimmy Lee + 14 Aretha Franklin - You Make Me Feel + 15 Aretha Franklin - I Dreamed A Dream + 16 Aretha Franklin - Jumpin' Jack Flash + + + + + SN1B6208B_Trk01A + SN1B6208B_Trk02A + SN1B6208B_Trk03A + SN1B6208B_Trk04A + SN1B6208B_Trk05A + SN1B6208B_Trk06A + SN1B6208B_Trk07A + SN1B6208B_Trk08A + SN1B6208B_Trk09A + SN1B6208B_Trk10A + SN1B6208B_Trk11A + SN1B6208B_Trk12A + SN1B6208B_Trk13A + SN1B6208B_Trk14A + + + + + 01 - Adoro + 02 - Somos novios + 03 - Cuando estoy contigo + 04 - Pensando en ti + 05- Contigo amor + 06 - Cariño mio + 07 - Yo te quiero + 08 - Esta tarde vi llover + 09 - Voy a apagar la luz + 10 - Contigo aprendi + 11 - No + 12 - Esperare + 13 - Pero te extraño + 14 - Me vas a recordar + 15 - Mia + + + + + (01).im.wagen.vor.mir + (02).ferien.auf.dem.bauernhof + (03).das.frivole.wiedersehen + (04).spermadin + + + 02 - No Man's Land + + + + + 16 - Poppen muss Spass machen + 19 - Der Ausdenker + 17 - Heiligabend + 15 - Drei Eier + 18 - Gertrud ist abgerissen + 12 - Einbruch bei Gertrud - In der Haseluenner Lubjanka + 13 - Einbruch bei Gertrud - Die Verhandlung + 14 - Oeffentlicher Nahverkehr + 10 - Ruesselwaesche + 11 - Einbruch bei Gertrud - Gertrud hat noch zu + 09 - Schneeraeumen am Arsch + 08 - Oedipus Kurt + 01 - Ferkel nervt + 02 - Arschkrampen im Krieg - Der Kessel von Goebelgrad + 03 - Arschkrampen im Krieg - Der 7 Mai 1945 + 04 - Arschkrampen im Krieg - Nacht ueber Gotenhafen + 05 - Es plaestert + 06 - Pflaumen pfluecken + 07 - Weitstrullen + + + 19 - Kampfruf des Negers + 02 - Die alte Kultur + 08 - Schwanzmessen + 20 - Die Leguane greifen an + 01 - Was hier denn los + 18 - Schluepfer rasseln in Fickstadt + 05 - Am Tag als der Leguan + 03 - Entfuehrer und Enthueller + 04 - Wie gehts eigentlich Praenki + 21 - Erste Kritik + 07 - Excusez-moi + 06 - Zu den Quellen des Amazonas + 09 - Gelegenheit zum Gespraech + 13 - Gehts Praenki besser + 16 - Praenki is kaputt + 14 - An den Ufern des Urinoko + 15 - Zicken her + 12 - Eckis Plattentip + 11 - Brettermeier duebelt + 10 - Goebelblanca + 17 - Feuchte BIRAFO + + + 04 - Brettermeier (Karaoke Version) + 03 - Brettermeier (Radio Version) + 02 - 18 Bier mit Tsatsiki + 01 - Brettermeier die Pottsau + + + 02 - Der kleine Pisser + 03 - Die Alpen + 01 - Damals in der Bretterpenne + 04 - Gedichte + 10 - Telephonsex + 09 - Bluemel und Laesch + 12 - Gurkenrost + 11 - Groehlen un Suppe + 16 - Jingle - Arschkrampenzeit + 15 - Arschregen + 14 - Kurtin + 13 - Cassette im Arsch + + + 01 - Ich bin ein Ferkelwaemser + 05 - Der Iwan is nich ohne + 03 - Allegorie ueber Stalingrad + 02 - Frauen stehen auf Macht + 04 - Der Negerueberfall + 06 - Hier Bretter-Control + 07 - Goebel-Solo + 08 - Kurt is in Kur + 20 - Absage + 17 - Kurt im Schrank + 19 - Gertrud hat zu + 09 - Guergen erinnert sich + 10 - Der Tomatenkopp + 16 - Ab inne Truhe + 12 - Der Gammel + 15 - Gesucht wird Albert Brettermeier + 11 - Kurt Kong + 13 - Bei Gertrud + 18 - Kurt hat Geburtstag + 14 - Wir fahn nach Wakaluba + + + 01 - Stracciatella + 22 - Die letzte Folge + 21 - Ferkels Schwester + 20 - Hier spricht Ramke + 16 - Wuggi baut um + 14 - Zasta Krockett der verwarzte Rochen + 15 - Die Ex-Verlobte + 17 - Robinson Kurt + 11 - dammte Pekinesenkotze - Telephon + 13 - Wischmeyer ruft an + 19 - Reingeroemert + 18 - Der grosse Hatti Mueller + 02 - The Making of Arschkrampen + 03 - Der Vollidiot + 04 - Geheimagent Ferkel + 05 - Die Hackfresse + 06 - Die Kimmen der Adler + 07 - Schrappige Zicken + 08 - Wie gehzn Wuggi + 09 - Kurt will heiraten 1 - Krissa die Hundekopffegerin + 10 - Kurt will heiraten 2 - Der Hochzeitstag + 12 - Kurt will heiraten 3 - Die Vermaehlung + + + + + 01 - Madagasca + 02 - Madagasca Cygnus X Remix + + + 01 - Breathe + 02 - Monsoon + 03 - The Hummer + 04 - Madagascar + 05 - Requiem + 06 - Dud UK + 07 - Easter Island + 08 - Stealth + 09 - Panorama + 10 - Voice Of Earth + + + + + 01 - Movin Too Fast - Radio Mix + 02 - Movin Too Fast - Bump & Flex Vocal + 03 - Movin Too Fast - Pussy 2000 Vocal + + + Re-Rewind - The artful dodger + + + 01 - woman trouble (radio edit) + 02 - woman trouble (original version radio edit) + 03 - woman trouble (sunkids future discotech edit) + 04 - woman trouble (wideboy's pickapocket or two radio edit) + + + + + 01 - The Dice Man - Polygon Window + 02 - Musicology - Telefone 529 + 03 - Autechre - Crystel + 04 - I.A.O - The Clan + 05 - Speedy J - De-Orbit + 06 - Musicology - Preminition + 07 - UP! - Spiritual High + 08 - Autechre - The Egg + 09 - Speedy J - Fill 3 + 10 - Dr Alex Paterson - Loving You Live + + + 01 - Mark Franklin - Release to the System + 02 - The Higher Intelligence Agency - Selinite + 03 - Link - Arcadian + 04 - B12 - Scriptures + 05 - Autechre - Chatter + 06 - Speedy J - Symmetry + 07 - Beaumont Hannant - Utuba + 08 - Richard H. Kirk - Reality Net + 09 - Balil - Parasight + 10 - Seefeel - Spangle + + + + + 01 - Sick And Beautiful Radio Edit + 02 - Sick And Beautiful Quick Fix Mix + 03 - My Heaven + + + + + 01 - Track 1 + 02 - Track 2 + 03 - Track 3 + 04 - Track 4 + 05 - Track 5 + 06 - Track 6 + 07 - Track 7 + 08 - Track 8 + 09 - Track 9 + 10 - Track 10 + 11 - Track 11 + 12 - Track 12 + + + 01 - Track 1 + 02 - Track 2 + 03 - Track 3 + 04 - Track 4 + 05 - Track 5 + 06 - Track 6 + 07 - Track 7 + 08 - Track 8 + 09 - Track 9 + 10 - Track 10 + 11 - Track 11 + 12 - Track 12 + 13 - Track 13 + 14 - Track 14 + 15 - Track 15 + 16 - Track 16 + 17 - Track 17 + 18 - Track 18 + + + + + 01 - naxalite + 02 - buzzin' + 03 - black white + 04 - assassin + 05 - hypocrite + 06 - charge + 07 - free satpal ram + 08 - dub mentality + 09 - culture move + 10 - operation eagle lie + 11 - change + 12 - tribute to john stevens + + + + + 01 - The Fields Of Love Airplay Mix + 02 - The Fields Of Love Original Club Mix + 03 - The Fields Of Love York Remix + 04 - The Fields Of Love Instrumental + + + 01 - Aiplay mix + 02 - Clubb mix + 03 - Instrumental clubb mix + 04 - Ibiza influence mix + + + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + AudioTrack 12 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + AudioTrack 12 + AudioTrack 13 + AudioTrack 14 + AudioTrack 15 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + AudioTrack 12 + AudioTrack 13 + AudioTrack 14 + AudioTrack 15 + AudioTrack 16 + AudioTrack 17 + AudioTrack 18 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + AudioTrack 12 + AudioTrack 13 + AudioTrack 14 + AudioTrack 15 + AudioTrack 16 + AudioTrack 17 + AudioTrack 18 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + AudioTrack 09 + AudioTrack 10 + AudioTrack 11 + + + AudioTrack 01 + AudioTrack 02 + AudioTrack 03 + AudioTrack 04 + AudioTrack 05 + AudioTrack 06 + AudioTrack 07 + AudioTrack 08 + + + + + 01 - Peel Session + 02 - Peel Sesion + 03 - Peel Sesion + + + + + 01 - Radio mix + 02 - Extended mix + 03 - Club mix + 04 - Atmosphere mix + + + + + (01) Radio Version + (02) Extended Mix + (03) Extended Track Masters Remix + (04) Original Instrumental + + + + + 01 - Riding With The King + 02 - Ten Long Years + 03 - Key To The Highway + 04 - Marry You + 05 - Three O'Clock Blues + 06 - Help The Poor + 07 - I Wanna Be + 08 - Worried Life Blues + 09 - Days Of Old + 10 - When My Heart Beats Like A Hammer + 11 - Hold On I'm Coming + 12 - Come Rain Or Come Shine + + + + + 01 - Animal Army + 02 - Spaceman + 03 - Zodiac Sign + 04 - Paris Green + 05 - Confused Art + 06 - Caffeine + 07 - The Boy With The X-Ray Eyes + 08 - Don't Feed The Animals + 09 - Fire Guided Light + 10 - Is Your Soul For Sale + 11 - I'm Cracking Up I Need A Pill + + + + + (There's) Always Something There To Remind Me - Sandie Shaw + (They Long To Be) Close To You - Isaac Hayes + A House Is Not A Home - Luther Vandross + Anyone Who Had A Heart - Luther Vandross + Arthur's Theme (Best That You Can Do) - Christopher Cross + I Just Don't Know What To Do With Myself - Dusty Springfield + I Say A Little Prayer - Aretha Franklin + I'll Never Fall In Love Again - Bobby Gentry + Make It Easy On Yourself - The Walker Brothers + Reach Out For Me - Dionne Warwick + The Look Of Love - Dusty Springfield + This Guy's In Love With You - Burt Bacharach + Trains And Boats And Planes - Billy J Kramer & The Dakotas + Walk On By - Dionne Warwick + What The World Needs Now Is Love - Jackie De Shannon + Windows Of The World - The Pretenders + You'll Never Get To Heaven (If You Break My Heart) - The Stylistics + + + + + 01 - Lady In Black (Radio Edit) + 02 - Come Back And Stay + 03 - Gimme, Gimme Your Lovin' (Little Lady) + 04 - Hungry For Love (Radio Edit) + 05 - Don't Walk Away, Suzanne + 06 - L.O.V.E. In My Car + 07 - You're A Woman + 08 - A World Without You (Michelle) - Radio Edit + 09 - I Wanna Hear Your Heartbeat (Sunday Girl) + 10 - Pretty Young Girl + 11 - Kisses And Tears (My One And Only) + 12 - Love Really Hurts Without You + 13 - Lovers In The Sand + 14 - Kiss You All Over, Baby (New Version) + 15 - Hot Girls - Bad Boys + 16 - One Night In Heaven + 17 - Baby I Love You + 18 - Love Is No Crime + 19 - Inside Of Me + + + + + 01 - The Gray Race + 02 - Them And Us + 03 - A Walk + 04 - Parallel + 05 - Punk Rock Song + 06 - Empty Causes + 07 - Nobody Listens + 08 - Pitty The Dead + 09 - Spirit Shine + 10 - The Streets Of America + 11 - Ten In 2010 + 12 - Victory + 13 - Drunk Sincerity + 14 - Come Join Us + 15 - Cease + 16 - Punk Rock Song (In German) + + + + + 01 - Weckruf + 02 - I want your Sex + 03 - Papa + 04 - Bako + 05 - Hassi Janes + 06 - Operation + 07 - In der Waschanlach + 08 - Sound + 09 - Was glaubst du + 10 - German Music + 11 - Papa + 12 - Immer schlimmer + 13 - Lichterkette + 14 - Thomas und Heidi + 15 - Dixi-Band + 16 - Bubblegum-Time + 17 - Richie und Headbanger + 18 - Schwarz und Weiß + 19 - 6,50 Sicherheitsgebühr + 20 - Gesang + 21 - Wahltag + 22 - Mabadaja Mabadaga ja + 23 - Megabreit Computerdeppen + 24 - Papa + 25 - Neschperblues + 26 - Revolte in der Schule + 27 - Bongo Karl + 28 - Babu + 29 - Gereizt + 30 - Parfüm + 31 - Halleluja + 32 - Papa + 33 - Superdepp + 34 - Dialog + 35 - Belgische Äpfel + 36 - Dressur + + + 01 - viel zu harmlos + 02 - handy song + 04 - tamagotchi + 05 - wetzlar + 06 - der erste kontakt + 07 - versprochen + 08 - gianni + 09 - pappa vol.17 + 10 - ying und yang + 11 - styling + 12 - kasperle gegen drogen + 13 - der spanische apotheker + 14 - gute argumente + 15 - session + 16 - nachdenklichkeit + 17 - naturschauspiel + 18 - schmusebär + 19 - hobbies + 20 - bali mach uff! + 21 - was war das... + 22 - der kunde ist könig + 23 - jazz + 24 - pappa vol.18 + 25 - die hochzeit + 26 - der neue star + 27 - route 66 + 28 - ziegenkäsegeschäft + 29 - mutter und tochter + 30 - alle jahre wieder + 31 - besorgt + 32 - kreuzworträtsel + 33 - sensibilität + 34 - die wahrscheinlichkeit + 35 - f.e.v.a + 36 - private geheimnisse + 37 - back for good (leider live) + + + 01 - Zarte Metzger + 02 - Jesu S. + 03 - Seelachs + 04 - Aufgespürt + 05 - Fitneß-Tom + 06 - Der Brautstrauß + 07 - Der Rollo + 08 - Pappa Vol. 15 + 09 - Zivilcourage + 10 - Kamm tugesser + 11 - Tobias + 12 - Radlacka + 13 - Kevin Costner + 14 - Moderne Väter + 15 - 0190634 . . . + 16 - Dabrauchemergarnetdrübberredde + 17 - Stones-Revival-Revival + 18 - Weichei - Das Musical 1. Akt + 19 - Themenabend + 20 - Song für Witta Pohl + 21 - Herr Seiler + 22 - Duell bei Hanau 1420 (Orginal-Aufnahme) + 23 - Pappa Vol. 16 + 24 - Kippen holen + 25 - Wie bei Axel + 26 - Die Demo + 27 - Sin kaa breetsche da + 28 - Natur + 29 - Die Gaby und Ich + 30 - Glück gehabt + 31 - Weichei - Das Musical 3. Akt + 32 - Der Wettkönig + 33 - Waldfest + 34 - Tierfreunde + 35 - Der australische Freund + 36 - Du + + + + + 01-Intro + 02-Word Play + 03-Spontaneity + 04-Rugged ruff + 05-Interlude + 06-I confess + 07-UKNOWHOWWEDU + 08-Interlude + 09-Total wreck + 10-Innovation + 11-Da jawn + 12-Interlude + 13-True honey buns (dat freak sht) + 14-3 tha hard way + 15-Biggest part of me + 16-Path to rhythm + + + + + 1 - Spirit of the forest + 2 - The man who danced too slowly + 3 - Ngombi + 4 - Baka play baka + 5 - Nahwia + 6 - Eeya be + 7 - Canya Jam + 8 - Bounaka + + + diff --git a/contrib/retep/retep.jpx b/contrib/retep/retep.jpx new file mode 100644 index 00000000000..dcf68ac8ceb --- /dev/null +++ b/contrib/retep/retep.jpx @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/retep/uk/org/retep/dtu/DCollection.java b/contrib/retep/uk/org/retep/dtu/DCollection.java new file mode 100644 index 00000000000..e97fc067c43 --- /dev/null +++ b/contrib/retep/uk/org/retep/dtu/DCollection.java @@ -0,0 +1,228 @@ +package uk.org.retep.dtu; + +import uk.org.retep.xml.core.XMLFactory; +import uk.org.retep.xml.core.XMLFactoryException; + +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; + +public class DCollection implements Collection +{ + protected int num,max,inc; + + protected DElement elements[]; + + public DCollection() + { + this(10); + } + + public DCollection(int aIncrement) + { + num=0; + max=0; + inc=aIncrement; + elements=null; + } + + protected void resize() + { + if(num>=max) { + max+=inc; + DElement n[] = new DElement[max]; + if(elements!=null) { + System.arraycopy(elements,0,n,0,elements.length); + } + elements=n; + } + } + + public int size() + { + return num; + } + + public boolean isEmpty() + { + return (num==0); + } + + /** + * Checks the list using it's XML id. + */ + public synchronized boolean contains(Object parm1) + { + if(parm1 instanceof DElement) { + DElement e = (DElement) parm1; + int ei = e.getID(); + + // out of range? + if(ei<0 || ei>=num) + return false; + + return elements[ei].equals(e); + } + + return false; + } + + public Iterator iterator() + { + return new iterator(this); + } + + /** + * Inner class to implement an Iterator + */ + protected class iterator implements Iterator + { + protected DCollection c; + protected int i; + + public iterator(DCollection aCollection) + { + c=aCollection; + i=0; + } + + public boolean hasNext() + { + return i-1) { + return false; + } + + // Add to the Collection + resize(); + e.setID(num); + elements[num++] = e; + return true; + } + return false; + } + + public synchronized boolean remove(Object parm1) + { + if(parm1 instanceof DElement) { + DElement e = (DElement) parm1; + int ei = e.getID(); + if(ei<0 || ei>=num) + return false; + + // Mark the node as parentless + e.setID(-1); + + // Now remove from the array by moving latter nodes, fixing their ids + // in the process + for(int j=ei,k=ei+1;k=num) + return null; + + return elements[id]; + } + + /** + * Repairs the collection, ensuring all id's are correct + */ + public synchronized void repair() + { + for(int i=0;iNB: args is volatile, so if you use it beyond the lifetime of + * this call, then you must make a copy of the HashMap (and not use simply + * store this HashMap). + * @param level The number of tags above this + * @param tag The tag name + * @param args A HashMap of any arguments + */ + public void tagStart(int level,String tag,HashMap args) + { + Logger.log(Logger.DEBUG,"DModuleXML.tagStart",tag); + + // Prefetch some common attributes + String sType = (String) args.get(DConstants.XML_TYPE); + String sX = (String) args.get(DConstants.XML_X); + String sY = (String) args.get(DConstants.XML_Y); + + int type=-1,x=-1,y=-1; + + if(sType!=null) { + type = Integer.parseInt(sType); + } + + if(sX!=null) { + y = Integer.parseInt(sX); + } + + if(sY!=null) { + x = Integer.parseInt(sY); + } + + // Match the tag against the tags array (used for switch() ) + int tagID=T_DEFAULT; + for(int i=0;iNB: content is volatile, so you must copy its contents if you use + * it beyond the lifetime of this call. + * @param content CharArrayWriter containing the content of the tag. + */ + public void tagContent(CharArrayWriter content) + { + // Ignore + } + + public void fixTransforms() + { + DNode to; + Iterator it = txmap.iterator(); + + while(it.hasNext()) { + tx x = (tx) it.next(); + + //Logger.log(Logger.DEBUG,"Fixing transform "+x.toID,x.transform,Integer.toString(x.node.getID()),Integer.toString(module.getNode(x.toID).getID())); + to = module.getNode(x.toID); + + x.transform.setFrom(x.node); + x.transform.setTo(to); + //to.setFrom(x.transform); + } + + } + + /** + * Parse an InputSource and return the contained module. + * @return DModule loaded, null if the xml file does not contain a module. + */ + public DModule parse(InputSource is) + throws IOException,SAXException + { + getTagHandler().parse(is); + fixTransforms(); + return module; + } + + /** + * Parse an uri and return the contained module. + * @return DModule loaded, null if the xml file does not contain a module. + */ + public DModule parse(String uri) + throws IOException,SAXException + { + getTagHandler().parse(uri); + fixTransforms(); + return module; + } + + /** + * Debug test - read xml from one file and save to another. + */ + public static void main(String args[]) throws Exception + { + if(args.length!=2) { + System.err.println("Syntax: java DModuleXML in-file out-file"); + System.exit(1); + } + + Logger.setLevel(Logger.DEBUG); + + Logger.log(Logger.INFO,"DModuleXML Read test1.xml"); + DModuleXML dm = new DModuleXML(); + DModule module = dm.parse(new InputSource(new FileInputStream(args[0]))); + + Logger.log(Logger.INFO,"Parse complete"); + + Logger.log(Logger.INFO,"DModuleXML Write XML"); + FileWriter fw = new FileWriter(args[1]); + module.saveXML(new XMLFactory(fw)); + fw.close(); + Logger.log(Logger.INFO,"Write complete"); + + DProcessor.run(module); + } +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/dtu/DNode.java b/contrib/retep/uk/org/retep/dtu/DNode.java new file mode 100644 index 00000000000..7a8321741cd --- /dev/null +++ b/contrib/retep/uk/org/retep/dtu/DNode.java @@ -0,0 +1,233 @@ +package uk.org.retep.dtu; + +import uk.org.retep.util.Logger; +import uk.org.retep.xml.core.XMLFactory; +import uk.org.retep.xml.core.XMLFactoryException; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Iterator; + +/** + * This is the base class for all nodes. + */ +public class DNode implements DElement, Serializable +{ + // The id of this node + protected int id; + + // The type of this node + protected int type; + + protected int x,y; + + public static final int OK = 0; // Node last ran fine + public static final int ERROR = 1; // Node failed on last run + + /** + * This type of node does nothing + */ + public static int NOP = 0; // No action + + public DNode() + { + this(NOP); + } + + public DNode(int aType) + { + id=-1; + type=aType; + + // Init the transform linkage + mf=mt=5; + nf=nt=0; + fn = new DTransform[mf]; + tn = new DTransform[mt]; + + Logger.log(Logger.DEBUG,"new DNode"); + } + + public int getID() + { + return id; + } + + public void setID(int aID) + { + id=aID; + Logger.log(Logger.DEBUG,"DNode.setID",aID); + } + + public int getType() + { + return type; + } + + public void setType(int aType) + { + type=aType; + Logger.log(Logger.DEBUG,"DNode.setType",aType); + } + + /** + */ + public void saveXML(XMLFactory aFactory) + throws IOException, XMLFactoryException + { + Logger.log(Logger.DEBUG,"DNode.saveXML start",this); + Iterator it; + + aFactory.startTag(DConstants.XML_NODE); + aFactory.addAttribute(DConstants.XML_ID,new Integer(getID())); + aFactory.addAttribute(DConstants.XML_TYPE,new Integer(getType())); + + // used for display only + aFactory.addAttribute(DConstants.XML_X,new Integer(getX())); + aFactory.addAttribute(DConstants.XML_Y,new Integer(getY())); + + // Save the transforms here (only the from list required) + for(int i=0;i=mf) { + mf+=5; + DTransform nn[] = new DTransform[mf]; + System.arraycopy(fn,0,nn,0,nf); + fn=nn; + } + fn[nf++]=aTransform; + } + + /** + * Adds a transform to this node (called by DTransform) + */ + protected synchronized void setTo(DTransform aTransform) + { + for(int i=0;i=mt) { + mt+=5; + DTransform nn[] = new DTransform[mt]; + System.arraycopy(tn,0,nn,0,nt); + tn=nn; + } + tn[nt++]=aTransform; + } + + /** + * Removes a transform (called by DTransform) + */ + protected synchronized void removeFrom(DTransform aTransform) + { + for(int i=0;i0) { + int numThreads = group.activeCount(); + Thread threads[] = new Thread[numThreads]; + cnt = group.enumerate(threads,false); + + //Logger.log(Logger.DEBUG,"Waiting on threads",cnt); + while(cnt>0) { + //Logger.log(Logger.DEBUG,"Waiting on thread",cnt); + threads[--cnt].join(timeout); + } + + Logger.log(Logger.DEBUG,"All threads appear to have died, retesting"); + } + } catch(InterruptedException ie) { + Logger.log(Logger.ERROR,"DProcessor, exception caught while waiting for threads to die",ie); + } + + // finally close any open datasources + Logger.log(Logger.DEBUG,"DProcessor cleanup"); + + Logger.log(Logger.DEBUG,"DProcessor finished"); + } + + class proc implements Runnable + { + protected DModule module; // The module being run + protected DNode pc; // current Program Counter + + protected DEnvironment env; // Shared environment + + // Used when launching new threads only + protected DTransform trans; // If not null, a transform to run first + protected int status; + + protected Thread thread; + + /** + * Start processing from DNode aNode. This is called by DProcessor at + * initialisation only. + */ + protected proc(ThreadGroup aGroup,DModule aModule,DNode aNode,DEnvironment aEnv) + { + // aGroup will be null when forking... + if(aGroup==null) { + thread = new Thread(this); + } else { + thread = new Thread(aGroup,this); + } + + module = aModule; + pc = aNode; + env = aEnv; + } + + /** + * Start processing the DTransform aTransform from aNode (does not execute + * the node). This is called by this inner class itself when forking new + * threads. + */ + protected proc(DModule aModule,DNode aNode,DEnvironment aEnv,DTransform aTransform,int aStatus) + { + this(null,aModule,aNode,aEnv); + trans = aTransform; + status = aStatus; + } + + /** + * Start this thread + */ + public void start() + { + thread.start(); + } + + public void run() + { + // Handle an initial transform first. It's used when a new Thread was created. + if(trans!=null) { + transform(trans,false,status); + trans=null; + } + + while(pc!=null) { + //Logger.log(Logger.DEBUG,"running node ",pc.getID()); + + // Process the node + int status = pc.run(env); + //Logger.log(Logger.DEBUG," status ",status); + + // Now the transforms. This thread continues with the first one that runs, + // but any others that will also run will do so in their own thread. + // If no transform runs (or there are none), then the thread will die. + int numTrans = pc.getToTransforms(); + boolean fork=false; + for(int i=0;i1) { + // Split the option at the first '=' char if any + int s = arg.startsWith("--") ? 2 : 1 ; // -- or - + int e = arg.indexOf("="); + String key,val; + if(e>s) { + // Format: -key=value + key=arg.substring(s,e-1); + val=arg.substring(e+1); + } else if(e>-1 && e<=s) { + // Can't have a property without a key! + throw new Exception("Invalid option -="); + } else { + key=arg.substring(s); + val=""; // can't be null + } + + if(key.equals("d")) { + // -d | --d is reserved to set the Logger level + int level=0; + if(!val.equals("")) { + level=Integer.parseInt(val); + } + Logger.setLevel(level); + } else { + // Add all other properties into the Properties object + props.put(key,val); + Logger.log(Logger.INFO,"Argument",key,val); + } + + } else { + // Just a - on its own? + System.out.println("Unknown option: -"); + } + } else { + // Add the argument to the array + args.add(arg); + } + } + } + +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/util/Logger.java b/contrib/retep/uk/org/retep/util/Logger.java new file mode 100644 index 00000000000..c272f1d005a --- /dev/null +++ b/contrib/retep/uk/org/retep/util/Logger.java @@ -0,0 +1,150 @@ +package uk.org.retep.util; + +import java.io.CharArrayWriter; +import java.io.PrintWriter; + +public class Logger +{ + protected static int level; + protected static PrintWriter logger; + + public static final int NONE = -1; + public static final int INFO = 0; + public static final int ERROR = 1; + public static final int DEBUG = 2; + public static final int ALL = 3; + + static { + level = NONE; + logger = null; + }; + + private static final String levels[] = { + "INFO :", + "ERROR:", + "DEBUG:", + "ALL :" + }; + + public static void setLevel(int aLevel) + { + // Incase we have not yet set a logger + if(logger==null) { + logger = new PrintWriter(System.out); + } + + if(aLevelALL) { + aLevel=ALL; + } + + level=aLevel; + + if(level>NONE) { + log(INFO,"Log level changed to",level,levels[level]); + } + } + + public static void setLogger(PrintWriter pw) + { + if(logger!=null) { + try { + logger.flush(); + logger.close(); + } catch(Exception ex) { + logger=pw; + log(ERROR,"Exception while closing logger",ex); + } + } + logger=pw; + } + + public static void log(String msg) + { + log(INFO,msg); + } + + public static void log(int aLevel,String msg) + { + write(aLevel,msg,null); + } + + public static void log(int aLevel,String msg,int arg1) + { + Object o[] = {new Integer(arg1)}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,int arg1,Object arg2) + { + Object o[] = {new Integer(arg1),arg2}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,double arg1) + { + Object o[] = {new Double(arg1)}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,double arg1,Object arg2) + { + Object o[] = {new Double(arg1),arg2}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,Object arg1) + { + Object o[] = {arg1}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,Object arg1,Object arg2) + { + Object o[] = {arg1,arg2}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,Object arg1,Object arg2,Object arg3) + { + Object o[] = {arg1,arg2,arg3}; + write(aLevel,msg,o); + } + + public static void log(int aLevel,String msg,Throwable t) + { + CharArrayWriter buffer = new CharArrayWriter(); + PrintWriter printWriter = new PrintWriter(buffer); + t.printStackTrace(printWriter); + Object o[] = {buffer.toString()}; + buffer.close(); + write(aLevel,msg,o); + } + + private static void write(int aLevel,String aMsg,Object args[]) + { + // Can't be above ALL + if(aLevel>ALL) { + aLevel=ALL; + } + + // Ignore if below or equal to NONE + if(aLevellevel) { + return; + } + + logger.print("Logger:"); + logger.print(levels[aLevel]); + logger.print(aMsg); + if(args!=null) { + for(int a=0;a0) { + editor.openFile(globals.getArgument(0)); + } + + return editor; + } + + public static void main(String[] args) + throws Exception + { + Main main = new Main(args); + main.pack(); + main.setVisible(true); + } +} diff --git a/contrib/retep/uk/org/retep/util/hba/Record.java b/contrib/retep/uk/org/retep/util/hba/Record.java new file mode 100644 index 00000000000..b91e6dc49df --- /dev/null +++ b/contrib/retep/uk/org/retep/util/hba/Record.java @@ -0,0 +1,238 @@ +package uk.org.retep.util.hba; + +import uk.org.retep.util.Logger; +import uk.org.retep.util.misc.IPAddress; +import uk.org.retep.util.misc.WStringTokenizer; + +/** + * Used to store the entries of a pg_hba.conf file + * @author + * @version 1.0 + */ + +public class Record +{ + int type; + String dbname; + IPAddress ip; + IPAddress mask; + int authType; + String authArg; + + public static final int TYPE_LOCAL = 0; + public static final int TYPE_HOST = 1; + public static final int TYPE_HOSTSSL = 2; + + public static final String types[] = { + "local","host","hostssl" + }; + + public static final int AUTH_TRUST = 0; + public static final int AUTH_PASSWORD = 1; + public static final int AUTH_CRYPT = 2; + public static final int AUTH_IDENT = 3; + public static final int AUTH_KRB4 = 4; + public static final int AUTH_KRB5 = 5; + public static final int AUTH_REJECT = 6; + + public static final String auths[] = { + "trust","password","crypt", + "ident", + "krb4","krb5", + "reject" + }; + + private static final String spc = " "; + + public Record() + { + } + + public int getType() + { + return type; + } + + public void setType(int aType) + { + type=aType; + } + + public String getDatabase() + { + return dbname; + } + + public void setDatabase(String aDB) + { + dbname=aDB; + } + + public int getAuthType() + { + return authType; + } + + public void setAuthType(int aType) + { + authType=aType; + } + + public String getAuthArgs() + { + return authArg; + } + + public void setAuthArgs(String aArg) + { + authArg=aArg; + } + + public IPAddress getIP() + { + return ip; + } + + public void setIP(String aArg) + { + setIP(new IPAddress(aArg)); + } + + public void setIP(IPAddress aArg) + { + ip=aArg; + } + + public IPAddress getMask() + { + return mask; + } + + public void setMask(String aArg) + { + setMask(new IPAddress(aArg)); + } + + public void setMask(IPAddress aArg) + { + mask=aArg; + } + + public String toString() + { + StringBuffer buf = new StringBuffer(); + write(buf); + return buf.toString(); + } + + public void write(StringBuffer buf) + { + buf.append(types[type]).append(spc); + + if(type==TYPE_HOST || type==TYPE_HOSTSSL) { + buf.append(getIP()).append(spc); + buf.append(getMask()).append(spc); + } + + buf.append(auths[authType]); + + // Now the authArg + switch(type) + { + // These have no authArgs + case AUTH_TRUST: + case AUTH_REJECT: + case AUTH_KRB4: + case AUTH_KRB5: + break; + + // These must have an arg + case AUTH_IDENT: + buf.append(spc).append(getAuthArgs()); + break; + + // These may have an optional arg + case AUTH_PASSWORD: + case AUTH_CRYPT: + if(!(authArg==null || authArg.equals(""))) + buf.append(spc).append(getAuthArgs()); + break; + } + } + + private static WStringTokenizer tok; + + public static Record parseLine(String s) + { + Record res = new Record(); + int type; + + if(s==null || s.equals("") || s.startsWith("#")) + return null; + + if(tok==null) + tok=new WStringTokenizer(); + + tok.setString(s); + + type=WStringTokenizer.matchToken(types,tok.nextToken()); + res.setType(type); + + res.setDatabase(tok.nextToken()); + + if(type==TYPE_HOST || type==TYPE_HOSTSSL) { + res.setIP(new IPAddress(tok.nextToken())); + res.setMask(new IPAddress(tok.nextToken())); + } + + res.setAuthType(WStringTokenizer.matchToken(auths,tok.nextToken())); + res.setAuthArgs(tok.nextToken()); + + return res; + } + + public static final int VALID = 0; + public static final int INVALID_TYPE = 1; + public static final int INVALID_IPREQUIRED = 2; + + /** + * Validates the record + */ + public int validate() + { + switch(type) + { + case TYPE_HOST: + case TYPE_HOSTSSL: + if(ip==null || ip.isInvalid()) { + Logger.log(Logger.INFO,"pg_hba.conf: IP missing or invalid - repairing"); + setMask("127.0.0.1"); + } + + if(mask==null || mask.isInvalid() || !ip.validateMask(mask)) { + Logger.log(Logger.INFO,"pg_hba.conf: IP address without mask - repairing"); + setMask(ip.getMask()); + } + + break; + + case TYPE_LOCAL: + break; + + default: + return INVALID_TYPE; + } + + return VALID; + } + + /* +# host all 192.168.54.1 255.255.255.255 reject +# host all 0.0.0.0 0.0.0.0 krb5 +# host all 192.168.0.0 255.255.0.0 ident omicron +# + +local all trust +host all 127.0.0.1 255.255.255.255 trust +*/ +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/util/misc/IPAddress.java b/contrib/retep/uk/org/retep/util/misc/IPAddress.java new file mode 100644 index 00000000000..a04babde3a2 --- /dev/null +++ b/contrib/retep/uk/org/retep/util/misc/IPAddress.java @@ -0,0 +1,125 @@ +package uk.org.retep.util.misc; + +import java.util.StringTokenizer; + +/** + * Represent an IP address + * @author + * @version 1.0 + */ + +public class IPAddress +{ + protected long address; + protected long b[] = new long[4]; + protected boolean invalid=true; + + public IPAddress() + { + } + + public IPAddress(String s) + { + setAddress(s); + } + + public synchronized void setAddress(String s) + { + if(s==null || s.equals("")) { + invalid=true; + return; + } + + address=0; + StringTokenizer tok = new StringTokenizer(s,"."); + int i=0; + while(i<4 && tok.hasMoreElements()) { + b[i++] = Long.parseLong(tok.nextToken()); + } + while(i<4) { + b[i++]=0; + } + + invalid=false; + refresh(); + } + + public void refresh() + { + if(invalid) + return; + address = (b[0]<<24) | (b[1]<<16) | (b[2]<<8) | (b[3]); + } + + public boolean isInvalid() + { + refresh(); + return invalid; + } + + public String toString() + { + refresh(); + if(invalid) + return "*INVALID*"; + + return Long.toString(b[0])+"."+Long.toString(b[1])+"."+Long.toString(b[2])+"."+Long.toString(b[3]); + } + + public boolean equals(Object o) + { + if(o instanceof IPAddress) { + IPAddress ip = (IPAddress) o; + + refresh(); + ip.refresh(); + + if(ip.invalid == invalid) + return false; + + return address==ip.address; + } + return false; + } + + private static int gethoststart(long b) + { + if((b & 0x80)==0x00) return 1; // class A + if((b & 0xc0)==0x80) return 2; // class B + if((b & 0xe0)==0xc0) return 3; // class C + return 4; // class D + } + + public boolean validateMask(IPAddress mask) + { + // If were a network check the host mask + int i=gethoststart(b[0]); +System.out.println("Host start "+i); + while(i<4 && b[i]==0) { + if(mask.b[i++]>0) + return false; + } + + for(i=0;i<4;i++) { + if((b[i]&mask.b[i])!=b[i]) + return false; + } + + return true; + } + + public IPAddress getMask() + { + IPAddress mask = new IPAddress(); + int i=3; + while(i>-1 && b[i]==0) { + mask.b[i--]=0; + } + while(i>-1) { + mask.b[i--]=255; + } + mask.invalid=false; + mask.refresh(); + return mask; + } +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/util/misc/PropertiesIO.java b/contrib/retep/uk/org/retep/util/misc/PropertiesIO.java new file mode 100644 index 00000000000..7bed62c4d28 --- /dev/null +++ b/contrib/retep/uk/org/retep/util/misc/PropertiesIO.java @@ -0,0 +1,157 @@ +package uk.org.retep.util.misc; + +import java.io.*; +import java.util.Date; +import java.util.Iterator; +import java.util.Properties; +import java.util.TreeMap; + +/** + * Misc Properties utilities.. + * @author + * @version 1.0 + */ + +public class PropertiesIO +{ + + public PropertiesIO() + { + } + + /** + * Builds a TreeMap based on the given Properties object. This is useful + * because the keys will be in sorted order. + */ + public static TreeMap getTreeMap(Properties p) + { + TreeMap map = new TreeMap(); + Iterator e = p.keySet().iterator(); + while(e.hasNext()) { + Object k = e.next(); + map.put(k,p.get(k)); + } + return map; + } + + /** + * Writes a Properties file to the writer. This is similar to Properties.save + * except you can pick the key/value separator + */ + public static synchronized void save(Properties p,OutputStream out,char sep,String header) + throws IOException + { + save(p,p.keySet().iterator(),out,sep,header); + } + + /** + * Writes a Properties file to the writer. This is similar to Properties.save + * except you can pick the key/value separator and the keys are written + * in a sorted manner + */ + public static synchronized void saveSorted(Properties p,OutputStream out,char sep,String header) + throws IOException + { + save(p,getTreeMap(p).keySet().iterator(),out,sep,header); + } + + /** + * This is the same as save, only the keys in the enumeration are written. + */ + public static synchronized void save(Properties p,Iterator e, OutputStream out,char sep,String header) + throws IOException + { + BufferedWriter w = new BufferedWriter(new OutputStreamWriter(out, "8859_1")); + + if (header != null) { + w.write('#'); + w.write(header); + w.newLine(); + } + + w.write('#'); + w.write(new Date().toString()); + w.newLine(); + + while(e.hasNext()) { + String key = (String)e.next(); + w.write(encode(key,true)); + w.write(sep); + w.write(encode((String)p.get(key),false)); + w.newLine(); + } + w.flush(); + } + + private static final String specialSaveChars = "=: \t\r\n\f#!"; + + /** + * Encodes a string in a way similar to the JDK's Properties method + */ + public static String encode(String s, boolean escapeSpace) + { + int l=s.length(); + StringBuffer buf = new StringBuffer(l<<1); + + for(int i=0;i0x7e)) { + buf.append('\\').append('u'); + buf.append(toHex((c >> 12) & 0xF)); + buf.append(toHex((c >> 8) & 0xF)); + buf.append(toHex((c >> 4) & 0xF)); + buf.append(toHex( c & 0xF)); + } else { + if (specialSaveChars.indexOf(c) != -1) + buf.append('\\'); + buf.append(c); + } + } + } + return buf.toString(); + } + + /** + * Convert a nibble to a hex character + * @param nibble the nibble to convert. + */ + public static char toHex(int n) { + return hd[(n & 0xF)]; + } + + /** A table of hex digits */ + private static final char[] hd = { + '0','1','2','3','4','5','6','7', + '8','9','A','B','C','D','E','F' + }; +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/util/misc/WStringTokenizer.java b/contrib/retep/uk/org/retep/util/misc/WStringTokenizer.java new file mode 100644 index 00000000000..763676cfb3b --- /dev/null +++ b/contrib/retep/uk/org/retep/util/misc/WStringTokenizer.java @@ -0,0 +1,102 @@ +package uk.org.retep.util.misc; + +/** + * Similar to StringTokenizer but handles white spaces and multiple delimiters + * between tokens. It also handles quotes + * + * @author + * @version 1.0 + */ + +public class WStringTokenizer +{ + String string; + int pos,len; + + /** + * Constructor + */ + public WStringTokenizer() + { + } + + /** + * Constructor: set the initial string + * @param aString String to tokenise + */ + public WStringTokenizer(String aString) + { + setString(aString); + } + + /** + * @param aString String to tokenise + */ + public void setString(String aString) + { + string=aString; + pos=0; + len=string.length(); + } + + /** + * @return true if more tokens may be possible + */ + public boolean hasMoreTokens() + { + return !(string==null || pos==len); + } + + /** + * @return next token, null if complete. + */ + public String nextToken() + { + char c; + boolean q=false; + + if(!hasMoreTokens()) + return null; + + // find start of token + while(pos=keys.length || aColumn<0 || aColumn>=cols.length) + return null; + + Object key = keys[aRow]; + + switch(aColumn) + { + case 0: + return key; + + case 1: + return properties.get(key); + + default: + return null; + } + } + + public int getRowCount() + { + return keys.length; + } + + public String getColumnName(int aColumn) + { + return cols[aColumn]; + } + + public void setValueAt(Object aValue, int aRow, int aColumn) + { + if(aRow<0 || aRow>=keys.length || aColumn<0 || aColumn>=cols.length) + return; + + switch(aColumn) + { + // Rename the key (only if not already present). If already present + // the refresh() will replace with the old one anyhow... + case 0: + if(!properties.containsKey(aValue)) { + Object oldValue = get(keys[aRow]); + remove(keys[aRow]); + put(aValue,oldValue); + } + refresh(); + break; + + // Update the value... + case 1: + put(keys[aRow],aValue); + //refresh(); + break; + + default: + // Should never be called + Logger.log(Logger.ERROR,"PropertiesTableModel: Column range",aColumn); + } + } + + public boolean isCellEditable(int aRow, int aColumn) + { + return true; + } + +} diff --git a/contrib/retep/uk/org/retep/util/proped/Main.java b/contrib/retep/uk/org/retep/util/proped/Main.java new file mode 100644 index 00000000000..6f2c73bc68f --- /dev/null +++ b/contrib/retep/uk/org/retep/util/proped/Main.java @@ -0,0 +1,53 @@ +package uk.org.retep.util.proped; + +import uk.org.retep.util.ExceptionDialog; +import uk.org.retep.util.Globals; +import uk.org.retep.util.Logger; +import uk.org.retep.util.StandaloneApp; + +import java.io.IOException; +import java.util.Iterator; +import javax.swing.JComponent; + +/** + * Standalone entry point for the Properties editor + * + * $Id: Main.java,v 1.1 2001/03/05 09:15:38 peter Exp $ + */ + +public class Main extends StandaloneApp +{ + public Main(String[] args) + throws Exception + { + super(args); + } + + public JComponent init() + throws Exception + { + Globals globals = Globals.getInstance(); + + PropertyEditor panel = new PropertyEditor(); + + // Only handle 1 open at a time in standalone mode + if(globals.getArgumentCount()>0) { + try { + panel.openFile(globals.getArgument(0)); + } catch(IOException ioe) { + ExceptionDialog.displayException(ioe,"while loading "+globals.getArgument(0)); + throw (Exception) ioe.fillInStackTrace(); + } + } + + return panel; + } + + public static void main(String[] args) + throws Exception + { + Main main = new Main(args); + main.pack(); + main.setVisible(true); + } +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/util/proped/PropertyEditor.java b/contrib/retep/uk/org/retep/util/proped/PropertyEditor.java new file mode 100644 index 00000000000..b5c19e10876 --- /dev/null +++ b/contrib/retep/uk/org/retep/util/proped/PropertyEditor.java @@ -0,0 +1,381 @@ +package uk.org.retep.util.proped; + +import uk.org.retep.util.ExceptionDialog; +import uk.org.retep.util.misc.PropertiesIO; +import uk.org.retep.util.models.PropertiesTableModel; + +import java.awt.*; +import java.io.*; +import java.util.*; +import javax.swing.*; +import java.awt.event.*; + +/** + * A property file editor + * + * $Id: PropertyEditor.java,v 1.1 2001/03/05 09:15:38 peter Exp $ + * + * @author + * @version 1.0 + */ + +public class PropertyEditor +extends JPanel +implements uk.org.retep.tools.Tool +{ + BorderLayout borderLayout1 = new BorderLayout(); + + // The filename, null if not set + String filename; + File file; + + JScrollPane jScrollPane1 = new JScrollPane(); + JTable contentTable = new JTable(); + + PropertiesTableModel model = new PropertiesTableModel(); + + boolean standaloneMode; + + private static final String TITLE_PREFIX = "Retep PropertyEditor"; + JPopupMenu popupMenu = new JPopupMenu(); + JMenuItem newPopupItem = new JMenuItem(); + JMenuItem dupPopupItem = new JMenuItem(); + JMenuItem delPopupItem = new JMenuItem(); + JMenuBar menuBar = new JMenuBar(); + JMenu jMenu1 = new JMenu(); + JMenuItem jMenuItem4 = new JMenuItem(); + JMenuItem jMenuItem5 = new JMenuItem(); + JMenuItem jMenuItem6 = new JMenuItem(); + JMenuItem jMenuItem7 = new JMenuItem(); + JMenuItem jMenuItem8 = new JMenuItem(); + JMenuItem closeMenuItem = new JMenuItem(); + + public PropertyEditor() + { + try + { + jbInit(); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + } + + /** + * @return the default menubar + */ + public JMenuBar getMenuBar() + { + return menuBar; + } + + /** + * @return the File menu + */ + public JMenu getMenu() + { + return jMenu1; + } + + /** + * @return the recomended title string for the parent JFrame/JInternalFrame + */ + public String getTitle() + { + if(filename==null) { + return TITLE_PREFIX; + } + return TITLE_PREFIX+": "+filename; + } + + /** + * Sets menus up to Standalone mode + */ + public void setStandaloneMode(boolean aMode) + { + standaloneMode=aMode; + if(aMode) { + closeMenuItem.setText("Exit"); + } else { + closeMenuItem.setText("Close"); + } + } + + public boolean isStandalone() + { + return standaloneMode; + } + + public void openFile(String aFile) + throws IOException + { + openFile(new File(aFile)); + } + + public void openFile(File aFile) + throws IOException + { + FileInputStream fis = new FileInputStream(aFile); + Properties p = new Properties(); + p.load(fis); + fis.close(); + model.setProperties(p); + + file=aFile; + filename = aFile.getAbsolutePath(); + } + + public void saveFile(File aFile) + throws IOException + { + FileOutputStream fis = new FileOutputStream(aFile); + PropertiesIO.save(model.getProperties(),fis,'=',"Written by "+TITLE_PREFIX); + fis.close(); + + filename = aFile.getAbsolutePath(); + file = aFile; + } + + void jbInit() throws Exception + { + this.setLayout(borderLayout1); + contentTable.setToolTipText(""); + contentTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); + contentTable.setModel(model); + contentTable.addMouseListener(new java.awt.event.MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + contentTable_mouseClicked(e); + } + public void mouseReleased(MouseEvent e) + { + contentTable_mouseReleased(e); + } + }); + newPopupItem.setText("New"); + newPopupItem.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + newPopupItem_actionPerformed(e); + } + }); + dupPopupItem.setText("Duplicate"); + dupPopupItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(67, java.awt.event.KeyEvent.CTRL_MASK, false)); + dupPopupItem.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + dupPopupItem_actionPerformed(e); + } + }); + delPopupItem.setText("Delete"); + delPopupItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(68, java.awt.event.KeyEvent.CTRL_MASK, false)); + delPopupItem.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + delPopupItem_actionPerformed(e); + } + }); + jMenu1.setText("File"); + jMenuItem4.setText("Open"); + jMenuItem4.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + jMenuItem4_actionPerformed(e); + } + }); + jMenuItem5.setText("Save"); + jMenuItem5.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + jMenuItem5_actionPerformed(e); + } + }); + jMenuItem6.setText("Save As"); + jMenuItem6.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + jMenuItem6_actionPerformed(e); + } + }); + jMenuItem7.setText("Revert"); + jMenuItem7.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + jMenuItem7_actionPerformed(e); + } + }); + jMenuItem8.setText("Print"); + closeMenuItem.setText("Close"); + closeMenuItem.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + closeMenuItem_actionPerformed(e); + } + }); + jMenu2.setText("Edit"); + jMenuItem1.setText("New"); + jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, java.awt.event.KeyEvent.CTRL_MASK, false)); + jMenuItem1.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + newPopupItem_actionPerformed(e); + } + }); + jMenuItem2.setText("Duplicate"); + jMenuItem3.setText("Delete"); + this.add(jScrollPane1, BorderLayout.CENTER); + jScrollPane1.getViewport().add(contentTable, null); + popupMenu.add(newPopupItem); + popupMenu.add(dupPopupItem); + popupMenu.add(delPopupItem); + menuBar.add(jMenu1); + menuBar.add(jMenu2); + jMenu1.add(jMenuItem4); + jMenu1.add(jMenuItem5); + jMenu1.add(jMenuItem6); + jMenu1.add(jMenuItem7); + jMenu1.addSeparator(); + jMenu1.add(jMenuItem8); + jMenu1.addSeparator(); + jMenu1.add(closeMenuItem); + jMenu2.add(jMenuItem1); + jMenu2.add(jMenuItem2); + jMenu2.add(jMenuItem3); + } + + Point popupPoint = new Point(); + JMenu jMenu2 = new JMenu(); + JMenuItem jMenuItem1 = new JMenuItem(); + JMenuItem jMenuItem2 = new JMenuItem(); + JMenuItem jMenuItem3 = new JMenuItem(); + void contentTable_mouseClicked(MouseEvent e) + { + if(e.isPopupTrigger()) { + popupPoint.setLocation(e.getX(),e.getY()); + popupMenu.show(contentTable,e.getX(),e.getY()); + } + } + + void contentTable_mouseReleased(MouseEvent e) + { + contentTable_mouseClicked(e); + } + + void jMenuItem4_actionPerformed(ActionEvent e) + { + JFileChooser fc = new JFileChooser(); + if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + try { + openFile(fc.getSelectedFile()); + } catch(IOException ioe) { + ExceptionDialog.displayException(ioe); + } + } + } + + void closeMenuItem_actionPerformed(ActionEvent e) + { + if(standaloneMode) { + System.exit(0); + } else { + filename=""; + file=null; + model.setProperties(new Properties()); + } + } + + void newPopupItem_actionPerformed(ActionEvent e) + { + int y = contentTable.rowAtPoint(popupPoint); + + // create a new unique key based on the current one + String key=(String) model.getValueAt(y,0); + + if(key==null) { + key="new-key"; + } + + int uid=1; + while(model.containsKey(key+uid)) { + uid++; + } + + key=key+uid; + model.put(key,""); + contentTable.clearSelection(); + } + + void dupPopupItem_actionPerformed(ActionEvent e) + { + int y = contentTable.rowAtPoint(popupPoint); + + // create a new unique key based on the current one + String key=(String) model.getValueAt(y,0); + Object val=model.get(key); + + int uid=1; + while(model.containsKey(key+uid)) { + uid++; + } + + key=key+uid; + model.put(key,val); + contentTable.clearSelection(); + } + + void delPopupItem_actionPerformed(ActionEvent e) + { + int y = contentTable.rowAtPoint(popupPoint); + model.remove(model.getValueAt(y,0)); + } + + void jMenuItem6_actionPerformed(ActionEvent e) + { + JFileChooser fc = new JFileChooser(); + if(fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { + try { + saveFile(fc.getSelectedFile()); + } catch(IOException ioe) { + ExceptionDialog.displayException(ioe); + } + } + } + + void jMenuItem5_actionPerformed(ActionEvent e) + { + if(filename==null) { + jMenuItem6_actionPerformed(e); + } else { + try { + saveFile(file); + } catch(IOException ioe) { + ExceptionDialog.displayException(ioe); + } + } + } + + void jMenuItem7_actionPerformed(ActionEvent e) + { + // add check here + if(file!=null) { + try { + openFile(file); + } catch(IOException ioe) { + ExceptionDialog.displayException(ioe); + } + } else { + jMenuItem4_actionPerformed(e); + } + } +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/core/XMLFactory.java b/contrib/retep/uk/org/retep/xml/core/XMLFactory.java new file mode 100644 index 00000000000..09565b00110 --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/core/XMLFactory.java @@ -0,0 +1,334 @@ +package uk.org.retep.xml.core; + +import java.io.IOException; +import java.io.Writer; + +/** + * An XMLFactory is used to render XML Tags, accounting for nesting etc + */ +public class XMLFactory +{ + /** + * The lest level (ie, how many tags down the tree we are) + */ + protected int level; + + /** + * The size of our tag name cache + */ + protected int maxlevel; + + /** + * Our tag name cache + */ + protected String[] names; + + /** + * Used to keep track of how formatting is done + */ + protected boolean hascontent; + protected boolean[] contbuf; + + /** + * Scratch used by nest() + */ + private char[] nestbuf; + + /** + * The destination Writer + */ + protected Writer out; + + /** + * True if we are still within a tag + */ + protected boolean inTag; + + /** + * True if we have just created a tag so parameters are valid + */ + protected boolean inArg; + + /** + * Constructs an XMLFactory with no output Writer + */ + public XMLFactory() + { + this(10); + } + + /** + * Constructs an XMLFactory with no output Writer + * @param m Expected number of leaves in the XML Tree + */ + public XMLFactory(int m) + { + // Initialise the names cache + level=0; + maxlevel=m; + names=new String[maxlevel]; + contbuf=new boolean[maxlevel]; + + // This is used by nest() + nestbuf=new char[maxlevel]; + for(int i=0;i\n"); + } + + /** + * @return Writer the XML is being sent out on. + */ + public Writer getWriter() { + return out; + } + + /** + * This starts a tag + * @param name The tag name + */ + public void startTag(String name) + throws IOException + { + if(inTag && inArg) { + // Handles two startTag() calls in succession. + out.write(">"); + } + + nest(level); + out.write('<'); + out.write(name); + inTag=true; + inArg=true; + + // cache the current tag name + names[level]=name; + + // cache the current hascontent value & reset + contbuf[level]=hascontent; + hascontent=false; + + // increase the level and the cache's as necessary + level++; + if(level>maxlevel) { + maxlevel=maxlevel+10; + + String n[]=new String[maxlevel]; + System.arraycopy(names,0,n,0,level); + names=n; + + boolean b[] = new boolean[maxlevel]; + System.arraycopy(contbuf,0,b,0,level); + contbuf=b; + } + } + + /** + * This ends a tag + */ + public void endTag() + throws IOException, XMLFactoryException + { + if(level<1) + throw new XMLFactoryException("endTag called above root node"); + + level--; + + if(inArg) { + // We are still within the opening tag + out.write(" />"); + } else { + // We must have written some content or child tags + + // hascontent is true if addContent() was called. If it was never called + // to get here some child tags must have been written, so we call nest() + // so that the close tag is on it's own line, and everything looks neat + // and tidy. + if(!hascontent) + nest(level); + + out.write("'); + } + + inArg=false; // The parent tag must be told it now has content + inTag= level>0; // Are we still in a tag? + hascontent=contbuf[level]; // retrieve this level's hascontent value + } + + /** + * This completes the document releasing any open resources. + */ + public void close() + throws IOException, XMLFactoryException + { + while(level>0) + endTag(); + out.write('\n'); + out.flush(); + } + + /** + * This writes an attribute to the current tag. If the value is null, then no action is taken. + * @param name Name of the parameter + * @param value Value of the parameter + * @throw XMLFactoryException if out of context + */ + public void addAttribute(String name,Object value) + throws IOException, XMLFactoryException + { + if(value==null) + return; + + if(inArg) { + out.write(' '); + out.write(name); + out.write("=\""); + out.write(encode(value.toString())); + out.write("\""); + } else + throw new XMLFactoryException("Cannot add attribute outside of a tag"); + } + + /** + * This writes some content to the current tag. Once this has been called, + * you cannot add any more attributes to the current tag. Note, if c is null, + * no action is taken. + * @param c content to add. + */ + public void addContent(Object c) + throws IOException, XMLFactoryException + { + if(c==null) + return; + + if(inTag) { + if(inArg) { + // close the open tag + out.write('>'); + inArg=false; + } + out.write(c.toString()); + + // This is used by endTag() + hascontent=true; + } else + throw new XMLFactoryException("Cannot add content outside of a tag"); + } + + /** + * This adds a comment to the XML file. This is normally used at the start of + * any XML output. + * @parm c Comment to include + */ + public void addComment(Object c) + throws IOException, XMLFactoryException + { + if(inTag) + throw new XMLFactoryException("Cannot add comments within a tag"); + + out.write("\n"); + } + + /** + * Indents the output according to the level + * @param level The indent level to generate + */ + protected void nest(int level) + throws IOException + { + out.write('\n'); + while(level>nestbuf.length) { + out.write(nestbuf,0,nestbuf.length); + level-=nestbuf.length; + } + out.write(nestbuf,0,level); + } + + /** + * Encodes the string so that any XML tag chars are translated + */ + protected String encode(String s) { + return s; + } + +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/core/XMLFactoryException.java b/contrib/retep/uk/org/retep/xml/core/XMLFactoryException.java new file mode 100644 index 00000000000..5f9d4972097 --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/core/XMLFactoryException.java @@ -0,0 +1,19 @@ +package uk.org.retep.xml.core; + +/** + * Title: + * Description: + * Copyright: Copyright (c) 2001 + * Company: + * @author + * @version 1.0 + */ + +public class XMLFactoryException extends Exception +{ + + public XMLFactoryException(String s) + { + super(s); + } +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/jdbc/XMLDatabase.java b/contrib/retep/uk/org/retep/xml/jdbc/XMLDatabase.java new file mode 100644 index 00000000000..50aaaa1d905 --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/jdbc/XMLDatabase.java @@ -0,0 +1,237 @@ +package uk.org.retep.xml.jdbc; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import uk.org.retep.xml.core.XMLFactory; +import uk.org.retep.xml.core.XMLFactoryException; + +public class XMLDatabase +{ + /** + * The XMLFactory being used by this instance + */ + protected XMLFactory factory; + + /** + * Constructor. setXMLFactory() must be called if this method is used. + */ + public XMLDatabase() + { + } + + /** + * Constructor + * @param fac XMLFactory to use + */ + public XMLDatabase(XMLFactory fac) + { + this(); + setXMLFactory(fac); + } + + /** + * Sets the factory to use. + * @param factory XMLFactory to use + */ + public void setXMLFactory(XMLFactory factory) + { + this.factory=factory; + } + + /** + * @return the XMLFactory being used. + */ + public XMLFactory getXMLFactory() + { + return factory; + } + + /** + * Flushes all output to the Writer. + * @throw IOException from Writer + * @throw XMLFactoryException from XMLFactory + */ + public void close() + throws IOException, XMLFactoryException + { + factory.close(); + } + + /** + * writes the schema of a table. + * @param con Connection to database + * @param table Table name + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + */ + public void writeTable(Connection con,String table) + throws IOException,SQLException,XMLFactoryException + { + writeTable(con.getMetaData(),table); + } + + /** + * writes the schema of a table. + * @param db DatabaseMetaData for the database + * @param table Table name + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + */ + public void writeTable(DatabaseMetaData db,String table) + throws IOException,SQLException,XMLFactoryException + { + writeTable(db,null,null,table); + } + + /** + * writes the schema of a table. + * @param db DatabaseMetaData for the database + * @param table Table name + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + */ + public void writeTable(DatabaseMetaData db,String cat,String schem,String table) + throws IOException,SQLException,XMLFactoryException + { + ResultSet trs; + + factory.startTag("TABLE"); + factory.addAttribute("NAME",table); + // fetch the remarks for this table (if any) + trs = db.getTables(null,null,table,null); + if(trs!=null) { + if(trs.next()) { + String rem = trs.getString(5); + if(rem!=null) + factory.addContent(rem); + } + trs.close(); + } + + trs = db.getColumns(null,null,table,"%"); + if(trs!=null) { + while(trs.next()) { + factory.startTag("COLUMN"); + factory.addAttribute("NAME",trs.getString(4)); + factory.addAttribute("TYPE",trs.getString(6)); + factory.addAttribute("COLUMN_SIZE",trs.getString(7)); + factory.addAttribute("DECIMAL_DIGITS",trs.getString(9)); + factory.addAttribute("NUM_PREC_RADIX",trs.getString(10)); + factory.addAttribute("NULLABLE",trs.getString(11)); + factory.addAttribute("COLUMN_DEF",trs.getString(13)); + factory.addAttribute("CHAR_OCTET_LENGTH",trs.getString(16)); + factory.addAttribute("ORDINAL_POSITION",trs.getString(17)); + factory.addAttribute("IS_NULLABLE",trs.getString(18)); + factory.addAttribute("TABLE_CAT",trs.getString(1)); + factory.addAttribute("TABLE_SCHEM",trs.getString(2)); + String rem = trs.getString(12); + if(rem!=null) + factory.addContent(rem); + factory.endTag(); + } + trs.close(); + } + + factory.endTag(); + } + + /** + * This generates the schema of an entire database. + * @param db Connection to database + * @param table Table pattern + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + * @see java.sql.DatabaseMetaData.getTables() + */ + public void writeDatabase(Connection db,String table) + throws IOException, SQLException, XMLFactoryException + { + writeDatabase(db.getMetaData(),null,null,table); + } + + /** + * This generates the schema of an entire database. + * @param db DatabaseMetaData of database + * @param table Table pattern + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + * @see java.sql.DatabaseMetaData.getTables() + */ + public void writeDatabase(DatabaseMetaData db,String table) + throws IOException, SQLException, XMLFactoryException + { + writeDatabase(db,null,null,table); + } + + /** + * This generates the schema of an entire database. + * @param db DatabaseMetaData of database + * @param cat Catalog (may be null) + * @param schem Schema (may be null) + * @param table Table pattern + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + * @see java.sql.DatabaseMetaData.getTables() + */ + public void writeDatabase(Connection db) + throws IOException, SQLException, XMLFactoryException + { + writeDatabase(db.getMetaData(),null,null,"%"); + } + + /** + * This generates the schema of an entire database. + * @param db DatabaseMetaData of database + * @param cat Catalog (may be null) + * @param schem Schema (may be null) + * @param table Table pattern + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + * @see java.sql.DatabaseMetaData.getTables() + */ + public void writeDatabase(DatabaseMetaData db) + throws IOException, SQLException, XMLFactoryException + { + writeDatabase(db,null,null,"%"); + } + + /** + * This generates the schema of an entire database. + * @param db DatabaseMetaData of database + * @param cat Catalog (may be null) + * @param schem Schema (may be null) + * @param table Table pattern + * @throw IOException from Writer + * @throw SQLException from JDBC + * @throw XMLFactoryException from XMLFactory + * @see java.sql.DatabaseMetaData.getTables() + */ + public void writeDatabase(DatabaseMetaData db,String cat,String schem,String table) + throws IOException, SQLException, XMLFactoryException + { + ResultSet rs = db.getTables(cat,schem,table,null); + if(rs!=null) { + factory.startTag("DATABASE"); + factory.addAttribute("PRODUCT",db.getDatabaseProductName()); + factory.addAttribute("VERSION",db.getDatabaseProductVersion()); + + while(rs.next()) { + writeTable(db,rs.getString(1),rs.getString(2),rs.getString(3)); + } + + factory.endTag(); + rs.close(); + } + } + +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/jdbc/XMLResultSet.java b/contrib/retep/uk/org/retep/xml/jdbc/XMLResultSet.java new file mode 100644 index 00000000000..ee020df940d --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/jdbc/XMLResultSet.java @@ -0,0 +1,505 @@ +package uk.org.retep.xml.jdbc; + +import java.io.IOException; +import java.io.Writer; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.Properties; +import uk.org.retep.xml.core.XMLFactory; +import uk.org.retep.xml.core.XMLFactoryException; + +/** + * This class takes a java.sql.ResultSet object and generates an XML stream + * based on it's contents. + * + * $Id: XMLResultSet.java,v 1.1 2001/01/23 10:22:20 peter Exp $ + */ +public class XMLResultSet +{ + /** + * The current ResultSet to process + */ + protected ResultSet rs; + + /** + * The XMLFactory being used by this instance + */ + protected XMLFactory factory; + + /** + * The default properties used when none are supplied by the user + */ + protected static Properties defaults; + + /** + * The default property name for defining the tag name used to define a + * ResultSet + */ + public static String RESULTSET_NAME = "resultset.name"; + + /** + * The default tag name for a resultset + */ + public static String DEFAULT_RESULTSET_NAME = "RESULTSET"; + + /** + * The default property name for defining the tag name used to define a row + */ + public static String ROW_NAME = "row.name"; + + /** + * The default tag name for a row + */ + public static String DEFAULT_ROW_NAME = "RECORD"; + + /** + * The default tag name for a resultset + */ + public static String COLNAME = ".name"; + + /** + * The value of the property (named as its related column) used to define + * how the column is generated. This indicates that the columns data is + * enclosed within a pair of tags, ie: <id>1234</id> + */ + public static String CONTENT = "content"; + + /** + * The value of the property (named as its related column) used to define + * how the column is generated. This indicates that the columns data is + * an attribute in the columns tag. ie: + */ + public static String ATTRIBUTE = "attribute"; + + /** + * This is the default attribute name used when the ATTRIBUTE option is set. + */ + public static String DEFAULT_ATTRIBUTE = "VALUE"; + + /** + * The value of the property (named as its related column) used to define + * how the column is generated. This indicates that the columns data is + * an attribute in the parent's tag. ie: + */ + public static String ROW_ATTRIBUTE = "row"; + + /** + * This property name marks the begining row number within the ResultSet to + * start processing. + */ + public static String FIRST_ROW = "row.first"; + + /** + * This property name marks the last row number within the ResultSet to + * end processing. + */ + public static String LAST_ROW = "row.last"; + + /** + * Constructor + */ + public XMLResultSet() + { + factory = new XMLFactory(); + } + + /** + * Constructor + */ + public XMLResultSet(ResultSet rs) + { + this(); + setResultSet(rs); + } + + /** + * Sets the ResultSet to use + * @param rs ResultSet + */ + public void setResultSet(ResultSet rs) + { + this.rs=rs; + } + + /** + * @return the current ResultSet + * + */ + public ResultSet getResultSet() + { + return rs; + } + + /** + * Sets the Writer to send all output to + * @param out Writer + * @throws IOException from XMLFactory + * @see XMLFactory.setWriter + */ + public void setWriter(Writer out) + throws IOException + { + factory.setWriter(out); + } + + /** + * @return Writer output is going to + */ + public Writer getWriter() + { + return factory.getWriter(); + } + + /** + * @return XMLFactory being used + */ + public XMLFactory getXMLFactory() + { + return factory; + } + + /** + * Flushes all output to the Writer + * @throw IOException from Writer + * @throw XMLFactoryException from XMLFactory + */ + public void close() + throws IOException, XMLFactoryException + { + factory.close(); + } + + /** + * Returns the default properties used by translate() and buildDTD() + * @return Properties default property settings + */ + public static Properties getDefaultProperties() + { + if(defaults==null) { + defaults=new Properties(); + defaults.setProperty(RESULTSET_NAME,DEFAULT_RESULTSET_NAME); + defaults.setProperty(ROW_NAME,DEFAULT_ROW_NAME); + } + return defaults; + } + + /** + * This generates an XML version of a ResultSet sending it to the supplied + * Writer. + * @param rs ResultSet to convert + * @param p Properties for the conversion + * @param out Writer to send output to (replaces existing one) + * @throws XMLFactoryException from XMLFactory + * @throws IOException from Writer + * @throws SQLException from ResultSet + */ + public void translate(ResultSet rs,Properties p,Writer out) + throws XMLFactoryException, IOException, SQLException + { + factory.setWriter(out); + translate(rs,p); + } + + /** + * This generates an XML version of a ResultSet sending it to the supplied + * Writer using a default tag struct + * @param rs ResultSet to convert + * @param out Writer to send output to (replaces existing one) + * @throws XMLFactoryException from XMLFactory + * @throws IOException from Writer + * @throws SQLException from ResultSet + */ + public void translate(ResultSet rs,Writer out) + throws XMLFactoryException, IOException, SQLException + { + factory.setWriter(out); + translate(rs,(Properties)null); + } + + /** + * This generates an XML version of a ResultSet sending it to the current + * output stream using a default tag structure. + * @param rs ResultSet to convert + * @throws XMLFactoryException from XMLFactory + * @throws IOException from Writer + * @throws SQLException from ResultSet + */ + public void translate(ResultSet rs) + throws XMLFactoryException, IOException, SQLException + { + translate(rs,(Properties)null); + } + + /** + * This generates an XML version of a ResultSet sending it to the current + * output stream. + * @param rs ResultSet to convert + * @param p Properties for the conversion + * @throws XMLFactoryException from XMLFactory + * @throws IOException from Writer + * @throws SQLException from ResultSet + */ + public void translate(ResultSet rs,Properties p) + throws XMLFactoryException, IOException, SQLException + { + // if we don't pass any properties, create an empty one and cache it if + // further calls do the same + if(p==null) { + p=getDefaultProperties(); + } + + // Fetch some common values + String setName = p.getProperty(RESULTSET_NAME,DEFAULT_RESULTSET_NAME); + String rowName = p.getProperty(ROW_NAME,DEFAULT_ROW_NAME); + + ResultSetMetaData rsmd = rs.getMetaData(); + int numcols = rsmd.getColumnCount(); + + String colname[] = new String[numcols]; // field name cache + int coltype[] = new int[numcols]; // true to use attribute false content + String colattr[] = new String[numcols]; // Attribute name + + // These deal with when an attribute is to go into the row's tag parameters + int parentFields[] = getRowAttributes(numcols,colname,colattr,coltype,rsmd,p); // used to cache the id's + int numParents= parentFields==null ? 0 : parentFields.length; // number of parent fields + boolean haveParent= numParents>0; // true only if we need to us these + + // This allows some limiting of the output result + int firstRow = Integer.parseInt(p.getProperty(FIRST_ROW,"0")); + int lastRow = Integer.parseInt(p.getProperty(LAST_ROW,"0")); + int curRow=0; + + // Start the result set's tag + factory.startTag(setName); + + while(rs.next()) { + if(firstRow<=curRow && (lastRow==0 || curRowToDo:
    + *
  1. Add ability to have NULLABLE columns appear as optional (ie instead of + * x, have x? (DTD for Optional). Can't use + or * as that indicates more than + * 1 instance). + *
+ * + * @param rs ResultSet + * @param p Properties defining tag types (as translate) + * @param out Writer to send output to + */ + public void buildDTD(ResultSet rs,Properties p,Writer out) + throws IOException, SQLException + { + // if we don't pass any properties, create an empty one and cache it if + // further calls do the same + if(p==null) { + p=getDefaultProperties(); + } + + // Fetch some common values + String setName = p.getProperty(RESULTSET_NAME,DEFAULT_RESULTSET_NAME); + String rowName = p.getProperty(ROW_NAME,DEFAULT_ROW_NAME); + + ResultSetMetaData rsmd = rs.getMetaData(); + int numcols = rsmd.getColumnCount(); + + String colname[] = new String[numcols]; // field name cache + int coltype[] = new int[numcols]; // true to use attribute false content + String colattr[] = new String[numcols]; // Attribute name + + // These deal with when an attribute is to go into the row's tag parameters + int parentFields[] = getRowAttributes(numcols,colname,colattr,coltype,rsmd,p); // used to cache the id's + int numParents= parentFields==null ? 0 : parentFields.length; // number of parent fields + boolean haveParent= numParents>0; // true only if we need to us these + + // Now the dtd defining the ResultSet + out.write("\n"); + + // Now the dtd defining each row + out.write("\n"); + + // Now handle any ROW_ATTRIBUTE's + if(haveParent) { + out.write("\n"); + } + + // Now add any CONTENT & ATTRIBUTE fields + for(int i=0;i\n"); + + // ATTRIBUTE + if(coltype[i]==1) { + out.write("\n"); + } + } + } + } + + /** + * Private method used by the core translate and buildDTD methods. + * @param numcols Number of columns in ResultSet + * @param colname Array of column names + * @param colattr Array of column attribute names + * @param coltype Array of column types + * @param rsmd ResultSetMetaData for ResultSet + * @param p Properties being used + * @return array containing field numbers which should appear as attributes + * within the rows tag. + * @throws SQLException from JDBC + */ + private int[] getRowAttributes(int numcols, + String colname[],String colattr[], + int coltype[], + ResultSetMetaData rsmd,Properties p) + throws SQLException + { + int pf[] = null; + int nf = 0; + + // Now we put a columns value as an attribute if the property + // fieldname=attribute (ie myname=attribute) + // and if the fieldname.name property exists, use it as the attribute name + for(int i=0;i0) { + int r[] = new int[nf]; + System.arraycopy(pf,0,r,0,nf); + return r; + } + + // Return null if no tags are to appear as attributes to the row's tag + return null; + } + +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/parser/TagHandler.java b/contrib/retep/uk/org/retep/xml/parser/TagHandler.java new file mode 100644 index 00000000000..78deb0ec0aa --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/parser/TagHandler.java @@ -0,0 +1,201 @@ +package uk.org.retep.xml.parser; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.util.List; +import java.util.Iterator; +import java.util.HashSet; +import java.util.ArrayList; +import java.util.HashMap; +import org.xml.sax.AttributeList; +import org.xml.sax.HandlerBase; +import org.xml.sax.InputSource; +import org.xml.sax.Parser; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +/** + * This class implements the base of the XML handler. You create an instance, + * register classes (who implement TagListener) that are interested in the tags + * and pass it to SAX. + * + *

Or you create an instance, register the TagListeners and use the getParser() + * method to create a Parser. Then start parsing by calling it's parse() method. + */ + +public class TagHandler extends HandlerBase { + + /** + * The current active level + */ + private int level; + + /** + * cache used to handle nesting of tags + */ + private List contents; + + /** + * cache used to handle nesting of tags + */ + private List tags; + + /** + * cache used to handle nesting of tags + */ + private List args; + + // Current active content writer + private CharArrayWriter content; + + // List of TagListener's who want to be fed data + private HashSet tagListeners; + + /** + * default constructor + */ + public TagHandler() { + level=0; + contents = new ArrayList(); + tags = new ArrayList(); + args = new ArrayList(); + tagListeners = new HashSet(); + } + + /** + * Called by SAX when a tag is begun. This simply creates a new level in the + * cache and stores the parameters and tag name in there. + */ + public void startElement(String p0, AttributeList p1) throws SAXException { + + // Now move up and fetch a CharArrayWriter from the cache + // creating if this is the first time at this level + if(contents.size()<=level) { + contents.add(new CharArrayWriter()); + tags.add(p0); + args.add(new HashMap()); + } + + content=(CharArrayWriter) contents.get(level); + content.reset(); + + // Also cache the tag's text and argument list + tags.set(level,p0); + + HashMap h = (HashMap) args.get(level); + h.clear(); + for(int i=p1.getLength()-1;i>-1;i--) { + h.put(p1.getName(i),p1.getValue(i)); + } + + // Now notify any TagListeners + Iterator it = tagListeners.iterator(); + while(it.hasNext()) + ( (TagListener) it.next() ).tagStart(level,p0,h); + + // Now move up a level + level++; + } + + /** + * This is called by SAX at the end of a tag. This calls handleTag() and then + * raises the level, so that the previous parent tag may continue. + */ + public void endElement(String p0) throws SAXException { + // move up a level retrieving that level's current content + // Now this exception should never occur as the underlying parser should + // actually trap it. + if(level<1) + throw new SAXException("Already at top level?"); + level--; + + // Now notify any TagListeners + Iterator it = tagListeners.iterator(); + while(it.hasNext()) + ( (TagListener) it.next() ).tagContent(content); + + // allows large content to be released early + content.reset(); + + // Now reset content to the previous level + content=(CharArrayWriter) contents.get(level); + } + + /** + * Called by SAX so that content between the start and end tags are captured. + */ + public void characters(char[] p0, int p1, int p2) throws SAXException { + content.write(p0,p1,p2); + } + + /** + * Adds a TagListener so that it is notified of tags as they are processed. + * @param handler TagListener to add + */ + public void addTagListener(TagListener h) { + tagListeners.add(h); + } + + /** + * Removes the TagListener so it no longer receives notifications of tags + */ + public void removeTagListener(TagListener h) { + tagListeners.remove(h); + } + + /** + * This method returns a org.xml.sax.Parser object that will parse the + * contents of a URI. + * + *

Normally you would call this method, then call the parse(uri) method of + * the returned object. + * @return org.xml.sax.Parser object + */ + public Parser getParser() + throws SAXException + { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + + String validation = System.getProperty ("javax.xml.parsers.validation", "false"); + if (validation.equalsIgnoreCase("true")) + spf.setValidating (true); + + SAXParser sp = spf.newSAXParser(); + Parser parser = sp.getParser (); + + parser.setDocumentHandler(this); + + return(parser); + } catch(ParserConfigurationException pce) { + throw new SAXException(pce.toString()); + } + } + + /** + * This method will parse the specified URI. + * + *

Internally this is the same as getParser().parse(uri); + * @param uri The URI to parse + */ + public void parse(String uri) + throws IOException, SAXException + { + getParser().parse(uri); + } + + /** + * This method will parse the specified InputSource. + * + *

Internally this is the same as getParser().parse(is); + * @param is The InputSource to parse + */ + public void parse(InputSource is) + throws IOException, SAXException + { + getParser().parse(is); + } + +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/parser/TagListener.java b/contrib/retep/uk/org/retep/xml/parser/TagListener.java new file mode 100644 index 00000000000..24146b3e245 --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/parser/TagListener.java @@ -0,0 +1,30 @@ +package uk.org.retep.xml.parser; + +import java.util.HashMap; +import java.io.CharArrayWriter; + +/** + * This interface defines the methods a class needs to implement if it wants the + * xml parser to notify it of any xml tags. + */ + +public interface TagListener { + /** + * This is called when a tag has just been started. + *

NB: args is volatile, so if you use it beyond the lifetime of + * this call, then you must make a copy of the HashMap (and not use simply + * store this HashMap). + * @param level The number of tags above this + * @param tag The tag name + * @param args A HashMap of any arguments + */ + public void tagStart(int level,String tag,HashMap args); + /** + * This method is called by ContHandler to process a tag once it has been + * fully processed. + *

NB: content is volatile, so you must copy its contents if you use + * it beyond the lifetime of this call. + * @param content CharArrayWriter containing the content of the tag. + */ + public void tagContent(CharArrayWriter content); +} \ No newline at end of file diff --git a/contrib/retep/uk/org/retep/xml/test/XMLExport.java b/contrib/retep/uk/org/retep/xml/test/XMLExport.java new file mode 100644 index 00000000000..116f2509060 --- /dev/null +++ b/contrib/retep/uk/org/retep/xml/test/XMLExport.java @@ -0,0 +1,191 @@ +package uk.org.retep.xml.test; + +import java.lang.Exception; +import java.io.*; +import java.sql.*; +import java.util.Properties; +import uk.org.retep.xml.core.XMLFactoryException; +import uk.org.retep.xml.jdbc.XMLDatabase; +import uk.org.retep.xml.jdbc.XMLResultSet; + +/** + * This "test" class is a fully functional tool in its own right. It utilises + * the xml classes to query and export to XML, or to dump database structures + * into XML. + */ + +public class XMLExport +{ + /** + * The current Database Connection + */ + protected Connection conn; + protected Statement stat; + protected String drvr,url,table; + + protected XMLResultSet xrs; + protected XMLDatabase xdb; + protected Properties prop; + protected boolean outXML; + protected boolean outDTD; + protected boolean outTAB; + protected int maxRows=0; + + public XMLExport(String[] args) + throws IOException,SQLException,XMLFactoryException,ClassNotFoundException + { + xrs = new XMLResultSet(); + xrs.setWriter(new OutputStreamWriter(System.out)); + //Properties p = new Properties(xrs.getDefaultProperties()); + prop = (Properties) xrs.getDefaultProperties().clone(); + + xdb = new XMLDatabase(xrs.getXMLFactory()); + + for(int i=0;i2) { + String table=arg.substring(2); + System.out.println("Generating XML Schema of table "+table); + xdb.writeTable(conn,table); + xdb.close(); + } else { + System.out.println("Generating XML Schema of database"); + xdb.writeDatabase(conn); + xdb.close(); + } + } else if(arg.equals("-V")) { + // Select table output + outXML=outDTD=false; + } else if(arg.equals("-X")) { + // Select XML output + outXML=true; + outDTD=outTAB=false; + } else if(arg.equals("-Y")) { + // Select DTD output + outXML=outTAB=false; + outDTD=true; + } else if(arg.startsWith("-")) { + System.err.println("Unknown argument: "+arg); + System.exit(1); + } else { + // Ok, anything not starting with "-" are queries + if(stat==null) + stat=conn.createStatement(); + + System.out.println("Executing "+arg); + ResultSet rs = stat.executeQuery(arg); + if(rs!=null) { + if(outXML) { + xrs.translate(rs,prop); + xrs.close(); + } else if(outDTD) { + // Output the DTD + xrs.buildDTD(rs,prop); + xrs.close(); + } else { + // Normal resultset output + int rc=0; + + ResultSetMetaData rsmd = rs.getMetaData(); + int nc = rsmd.getColumnCount(); + boolean us=false; + for(int c=0;c... and each result node wrapped in +. toptag and septag may be empty strings, in which +case the respective tag will be omitted. + +Example: + +Given a table docstore: + + Attribute | Type | Modifier +-----------+---------+---------- + docid | integer | + document | text | + +containing documents such as (these are archaeological site +descriptions, in case anyone is wondering): + + + + Church Farm, Ashton Keynes + watching brief + SU04209424 + + +one can type: + +select docid, +pgxml_xpath(document,'//site/name/text()','','') as sitename, +pgxml_xpath(document,'//site/location/text()','','') as location + from docstore; + +and get as output: + + docid | sitename | location +-------+--------------------------------------+------------ + 1 | Church Farm, Ashton Keynes | SU04209424 + 2 | Glebe Farm, Long Itchington | SP41506500 + 3 | The Bungalow, Thames Lane, Cricklade | SU10229362 +(3 rows) + +or, to illustrate the use of the extra tags: + +select docid as id, +pgxml_xpath(document,'//find/type/text()','set','findtype') +from docstore; + + id | pgxml_xpath +----+------------------------------------------------------------------------- + 1 | + 2 | Urn + 3 | PotteryAnimal bone +(3 rows) + +Which produces a new, well-formed document. Note that document 1 had +no matching instances, so the set returned contains no +elements. document 2 has 1 matching element and document 3 has 2. + +This is just scratching the surface because XPath allows all sorts of +operations. + +Note: I've only implemented the return of nodeset and string values so +far. This covers (I think) many types of queries, however. + +John Gray 16 August 2001 + + diff --git a/contrib/xml/pgxml.source b/contrib/xml/pgxml.source new file mode 100644 index 00000000000..8a04fa2c9b2 --- /dev/null +++ b/contrib/xml/pgxml.source @@ -0,0 +1,7 @@ +--SQL for XML parser + +CREATE FUNCTION pgxml_parse(text) RETURNS bool + AS '_OBJWD_/pgxml_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict); + +CREATE FUNCTION pgxml_xpath(text,text,text,text) RETURNS text + AS '_OBJWD_/pgxml_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict); \ No newline at end of file diff --git a/contrib/xml/pgxml_dom.source b/contrib/xml/pgxml_dom.source new file mode 100644 index 00000000000..a8582398b1e --- /dev/null +++ b/contrib/xml/pgxml_dom.source @@ -0,0 +1,7 @@ +--SQL for XML parser + +CREATE FUNCTION pgxml_parse(text) RETURNS bool + AS '_OBJWD_/pgxml_dom_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict); + +CREATE FUNCTION pgxml_xpath(text,text,text,text) RETURNS text + AS '_OBJWD_/pgxml_dom_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict); \ No newline at end of file diff --git a/doc/src/sgml/libpgeasy.sgml b/doc/src/sgml/libpgeasy.sgml new file mode 100644 index 00000000000..4bb1b7949bd --- /dev/null +++ b/doc/src/sgml/libpgeasy.sgml @@ -0,0 +1,152 @@ + + + + <application>libpgeasy</application> - Simplified C Library + + + Author + + + Written by Bruce Momjian + (pgman@candle.pha.pa.us) + and last updated 2002-03-04 + + + + + pgeasy allows you to cleanly interface + to the libpq library, more like a 4GL + SQL interface. Refer to for more + information about libpq. + + + + It consists of a set of simplified C functions that encapsulate the + functionality of libpq. The functions are: + + + + +PGresult *doquery(char *query); + + + + + +PGconn *connectdb(char *options); + + + + + +void disconnectdb(); + + + + + +int fetch(void *param,...); + + + + + +int fetchwithnulls(void *param,...); + + + + + +void reset_fetch(); + + + + + +void on_error_continue(); + + + + + +void on_error_stop(); + + + + + +PGresult *get_result(); + + + + + +void set_result(PGresult *newres); + + + + + + + + Many functions return a structure or value, so you can work + with the result if required. + + + + You basically connect to the database with + connectdb, issue your query with + doquery, fetch the results with + fetch, and finish with + disconnectdb. + + + + For SELECT queries, fetch + allows you to pass pointers as parameters, and on return the + variables are filled with data from the binary cursor you opened. + These binary cursors cannot be used if you are running the + pgeasy client on a system with a different + architecture than the database server. If you pass a NULL pointer + parameter, the column is skipped. fetchwithnulls + allows you to retrieve the NULL status of the field by passing an + int* after each result pointer, which returns true + or false to indicate if the field is null. You can always use + libpq functions on the + PGresult pointer returned by + doquery. reset_fetch starts + the fetch back at the beginning. + + + + get_result and set_result + allow you to handle multiple open result sets. Use + get_result to save a result into an application + variable. You can then later use set_result to + return to the previously save result. + + + + There are several demonstration programs in + pgsql/src/interfaces/libpgeasy/examples. + + + + diff --git a/doc/src/sgml/odbc.sgml b/doc/src/sgml/odbc.sgml new file mode 100644 index 00000000000..cbc40624767 --- /dev/null +++ b/doc/src/sgml/odbc.sgml @@ -0,0 +1,805 @@ + + + + + + + Tim + Goeke + + + Thomas + Lockhart + + + 1998-10-21 + + + ODBC Interface + + + ODBC + + + + Introduction + + + + Background information originally by Tim Goeke + (tgoeke@xpressway.com) + + + + + ODBC (Open Database Connectivity) is an abstract + API + that allows you to write applications that can interoperate + with various RDBMS servers. + ODBC provides a product-neutral interface + between frontend applications and database servers, + allowing a user or developer to write applications that are + portable between servers from different manufacturers.. + + + + The ODBC API matches up + on the backend to an ODBC-compatible data source. + This could be anything from a text file to an Oracle or + PostgreSQL RDBMS. + + + + The backend access comes from ODBC drivers, + or vendor-specific drivers that + allow data access. psqlODBC, which is included in the PostgreSQL distribution, is such a driver, + along with others that are + available, such as the OpenLink ODBC drivers. + + + + Once you write an ODBC application, + you should be able to connect to any + back-end database, regardless of the vendor, as long as the database schema + is the same. + + + + For example. you could have MS SQL Server + and PostgreSQL servers that have + exactly the same data. Using ODBC, + your Windows application would make exactly the + same calls and the back-end data source would look the same (to the Windows + application). + + + + + Installation + + + In order to make use of an ODBC driver there must + exist a driver manager on the system where the + ODBC driver is to be used. There are two free + ODBC driver managers for Unix-like operating systems + known to us: iODBC + iODBC + and unixODBC unixODBC. + Instructions for installing these driver managers are to be found + in the respective distribution. Software that provides database + access through ODBC should provide its own + driver manager (which may well be one of these two). Having said + that, any driver manager that you can find for your platform + should support the PostgreSQL ODBC + driver, or any other ODBC driver for that matter. + + + + + The unixODBC distribution ships with a + PostgreSQL ODBC driver of its own, + which is similar to the one contained in the + PostgreSQL distribution. It is up to you which + one you want to use. We plan to coordinate the development of + both drivers better in the future. + + + + + To install the ODBC you simply need to supply the + + + + It is also possible to build the driver to be specifically tuned + for use with iODBC or unixODBC. + This means in particular that the driver will use the driver + manager's routines to process the configuration files, which is + probably desirable since it creates a more consistent + ODBC environment on your system. If you want to do + that, then supply the configure options + + + + If you build a stand-alone driver (not tied to + iODBC or unixODBC), then you can + specify where the driver should look for the configuration file + odbcinst.ini. By default it will be the directory + /usr/local/pgsql/etc/, or equivalent, depending on + what + + + odbc.sql + Additionally, you should install the ODBC catalog extensions. That will + provide a number of functions mandated by the ODBC standard that are not + supplied by PostgreSQL by default. The file + /usr/local/pgsql/share/odbc.sql (in the default installation layout) + contains the appropriate definitions, which you can install as follows: + +psql -d template1 -f LOCATION/odbc.sql + + where specifying template1 as the target + database will ensure that all subsequent new databases will have + these same definitions. If for any reason you want to remove + these functions again, run the file + odbc-drop.sql through + psql. + + + + + Configuration Files + + .odbc.ini + + + ~/.odbc.ini contains user-specified access information + for the psqlODBC driver. + The file uses conventions typical for Windows + Registry files. + + + + The .odbc.ini file has three required sections. + The first is [ODBC Data Sources] + which is a list of arbitrary names and descriptions for each database + you wish to access. The second required section is the + Data Source Specification and there will be one of these sections + for each database. + Each section must be labeled with the name given in + [ODBC Data Sources] and must contain the following entries: + + +Driver = prefix/lib/libpsqlodbc.so +Database = DatabaseName +Servername = localhost +Port = 5432 + + + + + Remember that the PostgreSQL database name is + usually a single word, without path names of any sort. + The PostgreSQL server manages the actual access + to the database, and you need only specify the name from the client. + + + + Other entries may be inserted to control the format of the display. + The third required section is [ODBC] + which must contain the InstallDir keyword + and which may contain other options. + + + + Here is an example .odbc.ini file, + showing access information for three databases: + + +[ODBC Data Sources] +DataEntry = Read/Write Database +QueryOnly = Read-only Database +Test = Debugging Database +Default = Postgres Stripped + +[DataEntry] +ReadOnly = 0 +Servername = localhost +Database = Sales + +[QueryOnly] +ReadOnly = 1 +Servername = localhost +Database = Sales + +[Test] +Debug = 1 +CommLog = 1 +ReadOnly = 0 +Servername = localhost +Username = tgl +Password = "no$way" +Port = 5432 +Database = test + +[Default] +Servername = localhost +Database = tgl +Driver = /opt/postgres/current/lib/libpsqlodbc.so + +[ODBC] +InstallDir = /opt/applix/axdata/axshlib + + + + + + <productname>Windows</productname> Applications + + + In the real world, differences in drivers and the level of + ODBC support + lessens the potential of ODBC: + + + + + Access, Delphi, and Visual Basic all support ODBC directly. + + + + + Under C++, such as Visual C++, + you can use the C++ ODBC API. + + + + + + In Visual C++, you can use the CRecordSet class, which wraps the + ODBC API + set within an MFC 4.2 class. This is the easiest route if you are doing + Windows C++ development under Windows NT. + + + + + + + Writing Applications + + + + If I write an application for PostgreSQL + can I write it using ODBC calls + to the PostgreSQL server, + or is that only when another database program + like MS SQL Server or Access needs to access the data? + + + + The ODBC API + is the way to go. + For Visual C++ coding you can find out more at + Microsoft's web site or in your Visual C++ + documentation. + + + + Visual Basic and the other RAD tools have Recordset objects + that use ODBC + directly to access data. Using the data-aware controls, you can quickly + link to the ODBC back-end database + (very quickly). + + + + Playing around with MS Access will help you sort this out. Try using + FileGet External Data. + + + + + You'll have to set up a DSN first. + + + + + + + + <application>ApplixWare</application> + + + Applixware + + + + Applixware has an + ODBC database interface + supported on at least some platforms. + Applixware 4.4.2 has been + demonstrated under Linux with PostgreSQL 7.0 + using the psqlODBC + driver contained in the PostgreSQL distribution. + + + + Configuration + + + Applixware must be configured correctly + in order for it to + be able to access the PostgreSQL + ODBC software drivers. + + + + Enabling <application>Applixware</application> Database Access + + + These instructions are for the 4.4.2 release of + Applixware on Linux. + Refer to the Linux Sys Admin on-line book + for more detailed information. + + + + + You must modify axnet.cnf so that + elfodbc can + find libodbc.so + (the ODBC driver manager) shared library. + This library is included with the Applixware distribution, + but axnet.cnf needs to be modified to point to the + correct location. + + + + As root, edit the file + applixroot/applix/axdata/axnet.cnf. + + + + + + + At the bottom of axnet.cnf, + find the line that starts with + + +#libFor elfodbc /ax/... + + + + + + Change line to read + + +libFor elfodbc applixroot/applix/axdata/axshlib/lib + + + which will tell elfodbc to look in this directory + for the ODBC support library. + Typically Applix is installed in + /opt so the full path would be + /opt/applix/axdata/axshlib/lib, + but if you have installed Applix + somewhere else then change the path accordingly. + + + + + + + + Create .odbc.ini as + described in . You may also want to add the flag + + +TextAsLongVarchar=0 + + + to the database-specific portion of .odbc.ini + so that text fields will not be shown as **BLOB**. + + + + + + Testing <application>Applixware</application> ODBC Connections + + + + Bring up Applix Data + + + + + + Select the PostgreSQL database of interest. + + + + + + + Select QueryChoose Server. + + + + + Select ODBC, and click Browse. + The database you configured in .odbc.ini + should be shown. Make sure that the Host: field + is empty (if it is not, axnet will try to contact axnet on another machine + to look for the database). + + + + + Select the database in the box that was launched by Browse, + then click OK. + + + + + Enter user name and password in the login identification dialog, + and click OK. + + + + + + You should see Starting elfodbc server + in the lower left corner of the + data window. If you get an error dialog box, see the debugging section + below. + + + + + The Ready message will appear in the lower left corner of the data + window. This indicates that you can now enter queries. + + + + + Select a table from + QueryChoose + tables, and then select + QueryQuery + to access the database. The first 50 or so rows from the table + should appear. + + + + + + + Common Problems + + + The following messages can appear while trying to make an + ODBC connection through + Applix Data: + + + + + Cannot launch gateway on server + + + + elfodbc can't find libodbc.so. + Check your axnet.cnf. + + + + + + + Error from ODBC Gateway: + IM003::[iODBC][Driver Manager]Specified driver could not be loaded + + + + libodbc.so cannot find the driver listed in + .odbc.ini. Verify the settings. + + + + + + + Server: Broken Pipe + + + + + The driver process has terminated due to some other + problem. You might not have an up-to-date version + of the PostgreSQL + ODBC package. + + + + + + + setuid to 256: failed to launch gateway + + + + + The September release of Applixware 4.4.1 (the first release with official + ODBC support under Linux) shows problems when user names + exceed eight (8) characters in length. + Problem description contributed by Steve Campbell + (scampbell@lear.com). + + + + + + + + + + Author + + + Contributed by Steve Campbell (scampbell@lear.com), + 1998-10-20 + + + + The axnet program's security system + seems a little suspect. axnet does things + on behalf of the user and on a true + multiuser system it really should be run with root security + (so it can read/write in each user's directory). + I would hesitate to recommend this, however, since we have no idea what + security holes this creates. + + + + + Debugging <application>Applixware</application> ODBC Connections + + + One good tool for debugging connection problems uses the Unix system + utility strace. + + + Debugging with <command>strace</command> + + + + Start Applixware. + + + + + Start an strace on + the axnet process. For example, if + + +$ ps -aucx | grep ax + + + shows + + +cary 10432 0.0 2.6 1740 392 ? S Oct 9 0:00 axnet +cary 27883 0.9 31.0 12692 4596 ? S 10:24 0:04 axmain + + + + + Then run + + +$ strace -f -s 1024 -p 10432 + + + + + + + Check the strace output. + + + Note from Cary + + + Many of the error messages from Applixware + go to stderr, + but I'm not sure where stderr + is sent, so strace is the way to find out. + + + + + + + For example, after getting + a Cannot launch gateway on server, + I ran strace on axnet and got + + +[pid 27947] open("/usr/lib/libodbc.so", O_RDONLY) = -1 ENOENT (No such file or directory) +[pid 27947] open("/lib/libodbc.so", O_RDONLY) = -1 ENOENT (No such file or directory) +[pid 27947] write(2, "/usr2/applix/axdata/elfodbc: can't load library 'libodbc.so'\n", 61) = -1 EIO (I/O error) + + So what is happening is that applix elfodbc is searching for libodbc.so, but it + cannot find it. That is why axnet.cnf needed to be changed. + + + + + Running the <application>Applixware</application> Demo + + I think the condition this refers to is gone. -- petere 2002-01-07 + + + In order to go through the + Applixware Data Tutorial, you need to create + the sample tables that the Tutorial refers to. The ELF Macro used to + create the tables tries to use a NULL condition + on many of the database columns, + and PostgreSQL does not currently allow this option. + + + + To get around this problem, you can do the following: + + + + Modifying the <application>Applixware</application> Demo + + + + Copy /opt/applix/axdata/eng/Demos/sqldemo.am + to a local directory. + + + + + + Edit this local copy of sqldemo.am: + + + + + + + Search for null_clause = "NULL". + + + + + + Change this to null_clause = "". + + + + + + + + Start Applix Macro Editor. + + + + + + Open the sqldemo.am file from the Macro Editor. + + + + + + Select FileCompile and Save. + + + + + + Exit Macro Editor. + + + + + + Start Applix Data. + + + + + + Select *Run Macro. + + + + + + Enter the value sqldemo, then click OK. + + + + You should see the progress in the status line of the data window + (in the lower left corner). + + + + + + You should now be able to access the demo tables. + + + + + + + Useful Macros + + + You can add information about your + database login and password to the standard Applix start-up + macro file. This is an example + ~/axhome/macros/login.am file: + + +macro login +set_set_system_var@("sql_username@","tgl") +set_system_var@("sql_passwd@","no$way") +endmacro + + + + + You should be careful about the file protections on any file containing + user name and password information. + + + + + + + + + diff --git a/doc/src/sgml/recovery.sgml b/doc/src/sgml/recovery.sgml new file mode 100644 index 00000000000..aa10b8cf640 --- /dev/null +++ b/doc/src/sgml/recovery.sgml @@ -0,0 +1,104 @@ + + Database Failures + + + Database failures (or the possibility of such) must be assumed to be + lurking, ready to strike at some time in the future. A prudent + database administrator will plan for the inevitability of failures + of all possible kinds, and will have appropriate plans and + procedures in place before the failure occurs. + + + + Database recovery is necessary in the event of hardware or software + failure. There are several categories of failures; some of these + require relatively minor adjustments to the database, while others + may depend on the existence of previously prepared database dumps + and other recovery data sets. It should be emphasized that if your + data is important and/or difficult to regenerate, then you should + have considered and prepared for various failure scenarios. + + + + Disk Filled + + + A filled data disk may result in subsequent corruption of database + indexes, but not of the fundamental data tables. If the WAL files + are on the same disk (as is the case for a default configuration) + then a filled disk during database initialization may result in + corrupted or incomplete WAL files. This failure condition is + detected and the database will refuse to start up. You must free + up additional space on the disk (or move the WAL area to another + disk; see ) and then restart the + postmaster to recover from this condition. + + + + + Disk Failed + + + Failure of any disk (or of a logical storage device such as a RAID + subsystem) involved with an active database will require + that the database be recovered from a previously prepared database + dump. This dump must be prepared using + pg_dumpall, and updates to the database + occurring after the database installation was dumped will be lost. + + + + + + + + diff --git a/doc/src/sgml/version.sgml b/doc/src/sgml/version.sgml new file mode 100644 index 00000000000..33ff27cd658 --- /dev/null +++ b/doc/src/sgml/version.sgml @@ -0,0 +1,7 @@ + + + + diff --git a/doc/src/sgml/y2k.sgml b/doc/src/sgml/y2k.sgml new file mode 100644 index 00000000000..60ad62e51ed --- /dev/null +++ b/doc/src/sgml/y2k.sgml @@ -0,0 +1,95 @@ + + + + Y2K Statement + + + Author + + + Written by Thomas Lockhart + (lockhart@fourpalms.org) + on 1998-10-22. Updated 2000-03-31. + + + + + The PostgreSQL Global Development Group provides + the PostgreSQL software code tree as a public service, + without warranty and without liability for its behavior or performance. + However, at the time of writing: + + + + + + The author of this statement, a volunteer on the + PostgreSQL + support team since November, 1996, is not aware of + any problems in the PostgreSQL code base related + to time transitions around Jan 1, 2000 (Y2K). + + + + + + The author of this statement is not aware of any reports of Y2K problems + uncovered in regression testing + or in other field use of recent or current versions + of PostgreSQL. We might have expected + to hear about problems if they existed, given the installed base and + the active participation of users on the support mailing lists. + + + + + + To the best of the author's knowledge, the + assumptions PostgreSQL + makes about dates specified with a two-digit year + are documented in the current User's Guide + in the chapter on data types. + For two-digit years, the significant transition year is 1970, not 2000; + e.g. 70-01-01 is interpreted as 1970-01-01, + whereas 69-01-01 is interpreted as 2069-01-01. + + + + + + Any Y2K problems in the underlying OS related to obtaining the + current time may propagate into apparent Y2K problems in + PostgreSQL. + + + + + + Refer to + The GNU Project + and + The Perl Institute + for further discussion of Y2K issues, particularly + as it relates to open source, no fee software. + + + + + diff --git a/src/interfaces/jdbc/CHANGELOG b/src/interfaces/jdbc/CHANGELOG new file mode 100644 index 00000000000..863f8360ba9 --- /dev/null +++ b/src/interfaces/jdbc/CHANGELOG @@ -0,0 +1,467 @@ +Tue Mar 06 12:05:00 GMT 2001 peter@retep.org.uk + - Removed org.postgresql.xa.Test from the JDBC EE driver as it's an old + test class and prevented it from compiling. + +Fri Mar 02 10:00:00 GMT 2001 peter@retep.org.uk + - Fixed build.xml so that PGclob is not built in the JDBC1.2 driver + + +Fri Feb 17 18:25:00 GMT 2001 peter@retep.org.uk + - Removed the last deprecation warnings from the Java2 driver. Now only + the old examples give deprecation warnings. + - Added a new class into core that (JDK1.3+) ensures all connections are + closed when the VM terminates. + +Fri Feb 17 15:11:00 GMT 2001 peter@retep.org.uk + - Reduced the object overhead in PreparedStatement by reusing the same + StringBuffer object throughout. Similarly SimpleDateStamp's are alse + reused in a thread save manner. + - Implemented in PreparedStatement: setNull(), setDate/Time/Timestamp + using Calendar, setBlob(), setCharacterStream() + - Clob's are now implemented in ResultSet & PreparedStatement! + - Implemented a lot of DatabaseMetaData & ResultSetMetaData methods. + We have about 18 unimplemented methods left in JDBC2 at the current + time. + +Web Feb 14 17:29:00 GMT 2001 peter@retep.org.uk + - Fixed bug in LargeObject & BlobOutputStream where the stream's output + was not flushed when either the stream or the blob were closed. + - Fixed PreparedStatement.setBinaryStream() where it ignored the length + +Tue Feb 13 16:33:00 GMT 2001 peter@retep.org.uk + - More TestCases implemented. Refined the test suite api's. + - Removed need for SimpleDateFormat in ResultSet.getDate() improving + performance. + - Rewrote ResultSet.getTime() so that it uses JDK api's better. + +Tue Feb 13 10:25:00 GMT 2001 peter@retep.org.uk + - Added MiscTest to hold reported problems from users. + - Fixed PGMoney. + - JBuilder4/JDBCExplorer now works with Money fields. Patched Field & + ResultSet (lots of methods) for this one. Also changed cash/money to + return type DOUBLE not DECIMAL. This broke JBuilder as zero scale + BigDecimal's can't have decimal places! + - When a Statement is reused, the previous ResultSet is now closed. + - Removed deprecated call in ResultSet.getTime() + +Thu Feb 08 18:53:00 GMT 2001 peter@retep.org.uk + - Changed a couple of settings in DatabaseMetaData where 7.1 now + supports those features + - Implemented the DatabaseMetaData TestCase. + +Wed Feb 07 18:06:00 GMT 2001 peter@retep.org.uk + - Added comment to Connection.isClosed() explaining why we deviate from + the JDBC2 specification. + - Fixed bug where the Isolation Level is lost while in autocommit mode. + - Fixed bug where several calls to getTransactionIsolationLevel() + returned the first call's result. + +Tue Feb 06 19:00:00 GMT 2001 peter@retep.org.uk + - Completed first two TestCase's for the test suite. JUnit is now + recognised by ant. + +Wed Jan 31 08:46:00 GMT 2001 peter@retep.org.uk + - Some minor additions to Statement to make our own extensions more + portable. + - Statement.close() will now call ResultSet.close() rather than just + dissasociating with it. + +Tue Jan 30 22:24:00 GMT 2001 peter@retep.org.uk + - Fixed bug where Statement.setMaxRows() was a global setting. Now + limited to just itself. + - Changed LargeObject.read(byte[],int,int) to return the actual number + of bytes read (used to be void). + - LargeObject now supports InputStream's! + - PreparedStatement.setBinaryStream() now works! + - ResultSet.getBinaryStream() now returns an InputStream that doesn't + copy the blob into memory first! + - Connection.isClosed() now tests to see if the connection is still alive + rather than if it thinks it's alive. +Thu Jan 25 09:11:00 GMT 2001 peter@retep.org.uk + - Added an alternative constructor to PGSQLException so that debugging + some more osteric bugs is easier. If only 1 arg is supplied and it's + of type Exception, then that Exception's stacktrace is now included. + +Wed Jan 24 09:18:00 GMT 2001 peter@retep.org.uk + - Removed the 8k limit by setting it to 64k + +Fri Jan 19 08:47:00 GMT 2001 peter@retep.org.uk + - Applied patch submitted by John Schutz that + fixed a bug with ANT's SQL functions (not needed for building but nice + to have fixed). + +Thu Jan 18 17:30:00 GMT 2001 peter@retep.org.uk + - Added new error message into errors.properties "postgresql.notsensitive" + This is used by jdbc2.ResultSet when a method is called that should + fetch the current value of a row from the database refreshRow() for + example. + - These methods no longer throw the not implemented but the new noupdate + error. This is in preparation for the Updateable ResultSet support + which will overide these methods by extending the existing class to + implement that functionality, but needed to show something other than + notimplemented: + moveToCurrentRow() + moveToInsertRow() + rowDeleted() + rowInserted() + all update*() methods, except those that took the column as a String + as they were already implemented to convert the String to an int. + - getFetchDirection() and setFetchDirection() now throws + "postgresql.notimp" as we only support one direction. + The CursorResultSet will overide this when its implemented. + - Created a new class under jdbc2 UpdateableResultSet which extends + ResultSet and overides the relevent update methods. + This allows us to implement them easily at a later date. + - In jdbc2.Connection, the following methods are now implemented: + createStatement(type,concurrency); + getTypeMap(); + setTypeMap(Map); + - The JDBC2 type mapping scheme almost complete, just needs SQLInput & + SQLOutput to be implemented. + - Removed some Statement methods that somehow appeared in Connection. + - In jdbc2.Statement() + getResultSetConcurrency() + getResultSetType() + setResultSetConcurrency() + setResultSetType() + - Finally removed the old 6.5.x driver. + +Thu Jan 18 12:24:00 GMT 2001 peter@retep.org.uk + - These methods in org.postgresql.jdbc2.ResultSet are now implemented: + getBigDecimal(int) ie: without a scale (why did this get missed?) + getBlob(int) + getCharacterStream(int) + getConcurrency() + getDate(int,Calendar) + getFetchDirection() + getFetchSize() + getTime(int,Calendar) + getTimestamp(int,Calendar) + getType() + NB: Where int represents the column name, the associated version + taking a String were already implemented by calling the int + version. + - These methods no longer throw the not implemented but the new noupdate + error. This is in preparation for the Updateable ResultSet support + which will overide these methods by extending the existing class to + implement that functionality, but needed to show something other than + notimplemented: + cancelRowUpdates() + deleteRow() + - Added new error message into errors.properties "postgresql.noupdate" + This is used by jdbc2.ResultSet when an update method is called and + the ResultSet is not updateable. A new method notUpdateable() has been + added to that class to throw this exception, keeping the binary size + down. + - Added new error message into errors.properties "postgresql.psqlnotimp" + This is used instead of unimplemented when it's a feature in the + backend that is preventing this method from being implemented. + - Removed getKeysetSize() as its not part of the ResultSet API + +Thu Jan 18 09:46:00 GMT 2001 peter@retep.org.uk + - Applied modified patch from Richard Bullington-McGuire + . I had to modify it as some of the code + patched now exists in different classes, and some of it actually + patched obsolete code. + +Wed Jan 17 10:19:00 GMT 2001 peter@retep.org.uk + - Updated Implementation to include both ANT & JBuilder + - Updated README to reflect the changes since 7.0 + - Created jdbc.jpr file which allows JBuilder to be used to edit the + source. JBuilder _CAN_NOT_ be used to compile. You must use ANT for + that. It's only to allow JBuilders syntax checking to improve the + drivers source. Refer to Implementation for more details + +Wed Dec 20 16:19:00 GMT 2000 peter@retep.org.uk + - Finished build.xml and updated Driver.java.in and buildDriver to + match how Makefile and ANT operate. + +Tue Dec 19 17:30:00 GMT 2000 peter@retep.org.uk + - Finally created ant build.xml file + +Mon Nov 20 08:12:00 GMT 2000 peter@retep.org.uk + - Encoding patch to Connection by wrobell@posexperts.com.pl + +Tue Oct 17 15:35:00 BST 2000 petermount@maidstone.gov.uk + - Changed getTimestamp() again. This time Michael Stephenson's + solution looked far better + than the original solution put in June. + +Tue Oct 10 13:12:00 BST 2000 peter@retep.org.uk + - DatabaseMetaData.supportsAlterTableWithDropColumn() as psql doesn't + support dropping of individual columns + - Merged in some last patches. Only 1 left, which may not be compatible + with jdbc1 + - Merged in my old retepsql project. Makefile now includes it. + +Mon Oct 02 12:30:00 BST 2000 peter@retep.org.uk + - Merged in byte[] array allocation changes submitted by Gunnar R|nning + + +Mon Sep 25 14:22:00 BST 2000 peter@retep.org.uk + - Removed the DriverClass kludge. Now the org.postgresql.Driver class + is compiled from a template file, and now has both the connection + class (ie jdbc1/jdbc2) and the current version's from Makefile.global + +Thu Jul 20 16:30:00 BST 2000 petermount@it.maidstone.gov.uk + - Fixed DatabaseMetaData.getTableTypes() + +Tue Jun 06 12:00:00 BST 2000 petermount@it.maidstone.gov.uk + - Added org/postgresql/DriverClass.java to the list of files removed + by make clean (it's dynamically built) + - Fixed Statement, so that the update count is valid when an SQL + DELETE operation is done. + - While fixing the update count, made it easier to get the OID of + the last insert as well. Example is in example/basic.java + +Tue Jun 06 08:37:00 BST 2000 petermount@it.maidstone.gov.uk + - Removed a hardwired 8K limit on query strings + - Added some missing org.'s in Connection that prevented + the use of the geometric types. + +Thu Jun 01 07:26:00 BST 2000 petermount@it.maidstone.gov.uk + - Removed timezone in getTimestamp() methods in ResultSet. + +Mon May 15 22:30:00 BST 2000 peter@retep.org.uk + - Fixed the message Makefile produces after compiling. It still said + about the old Driver class, not the new package. Spotted by + Joseph Shraibman + +Thu May 04 11:38:00 BST 2000 petermount@it.maidstone.gov.uk + - Corrected incorrect date in CHANGELOG + - Fixed the ImageViewer example + +Wed May 03 16:47:00 BST 2000 petermount@it.maidstone.gov.uk + - Fixed the Makefile so that postgresql.jar is built everytime + the jdbc1 or jdbc2 rules are called. + - Fixed the threadsafe example. It had problems with autocommit + +Wed May 03 14:32:00 BST 2000 petermount@it.maidstone.gov.uk + - Rewrote the README file (the old one was 18 months old!) + - Added @deprecated tags to org.postgresql.jdbc2.ResultSet + to clear some warnings issued during compilation. + +Wed Apr 12 22:14:00 BST 2000 peter@retep.org.uk + - Implemented the JDBC2 Blob interface, and ResultSet.getBlob(). + +Wed Apr 12 20:20:00 BST 2000 peter@retep.org.uk + - Fixed bug in ResultSet.absolute(). Negative rows are now supported. + - Implemented ResultSet.relative(), afterLast(). + +Tue Feb 1 21:40:00 GMT 2000 peter@retep.org.uk + - Finally imported the contributed javax extensions by Assaf Arkin + arkin@exoffice.com + +Mon Jan 24 21:00:00 GMT 2000 peter@retep.org.uk + - Finally introduced the 7.0 additions to the core CVS repository. + - All source files are now under the org.postgresql package (previously + they were under postgresql). The package lines now changed + accordingly. + - The Makefile was rewritten so it should now work on machines that + can't handle the $( ) syntax. + - Dutch translation by Arnout Kuiper (ajkuiper@wxs.nl) + +Mon Sep 13 23:56:00 BST 1999 peter@retep.org.uk + - PG_Stream.SendChar() optimised, increased default buffer size of + output stream to 8k, and introduced an 8k buffer on the input stream + Sverre H Huseby + - Added a finalize() method to Connection class in both drivers so that + the connection to the backend is really closed. + - Due to many JVM's not returning a meaningful value for java.version + the decision for building the JDBC1.2 or JDBC2 driver is now a + compile time option. + - Replaced $$(cmd...) with `cmd...` in the Makefile. This should allow + the driver to compile when using shells other than Bash. + +Thu Sep 9 01:18:39 MEST 1999 jens@jens.de + - fixed bug in handling of DECIMAL type + +Wed Aug 4 00:25:18 CEST 1999 jens@jens.de + - updated ResultSetMetaData.getColumnDisplaySize() to return + the actual display size + - updated driver to use postgresql FE/BE-protocol version 2 + +Mon Aug 2 03:29:35 CEST 1999 jens@jens.de + - fixed bug in DatabaseMetaData.getPrimaryKeys() + +Sun Aug 1 18:05:42 CEST 1999 jens@jens.de + - added support for getTransactionIsolation and setTransactionIsolation + +Sun Jun 27 12:00:00 BST 1999 + - Fixed typo in postgresql.Driver that prevented compilation + - Implemented getTimestamp() fix submitted by Philipp Matthias Hahn + + - Cleaned up some comments in Connection + +Wed Jun 23 06:50:00 BST 1999 + - Fixed error in errors.properties where the arguments are 0 based not + 1 based + - Fixed bug in postgresql.Driver where exception is thrown, then + intercepted rather than being passed to the calling application. + - Removed the file postgresql/CallableStatement, as it's not used and + really exists in the jdbc1 & jdbc2 sub packages only. + +Wed May 19 00:20:00 BST 1999 + - Internationalisation now done. Surprising that there's 68 error + messages in the driver ;-) + +Tue May 18 07:00:00 BST 1999 + - Set the ImageViewer application to use transactions + +Tue May 18 00:00:00 BST 1999 + - Just after committing, I realised why internationalisation isn't + working. This is now fixed (in the Makefile). + +Mon May 17 23:40:00 BST 1999 + - PG_Stream.close() now attempts to send the close connection message + to the backend before closing the streams + - Added batch support in the JDBC2, supplied by Yutaka Tanida + + - Removed the old datestyle code. Now the driver uses only ISO. + - Removed some files in the postgresql directory still in CVS that were + moved since 6.4.x (DatabaseMetaData.java PreparedStatement.java + ResultSetMetaData.java Statement.java) + - Internationalisation of the error messages is partially implemented, + however it's not enabled as it only works when the jar file is + _not_ used, and work needs to be done. + +Sun Apr 11 17:00:00 BST 1999 + - getUpdateCount() now returns the actual update count (before it + simply returned 1 for everything). + - added some updates to example.basic so it would test the new update + count code. + - corrected typo in a comment in Statement.java + +Mon Jan 25 19:45:00 GMT 1999 + - created subfolders example/corba and example/corba/idl to hold the + new example showing how to hook CORBA and PostgreSQL via JDBC + - implemented some JDBC2 methods curtesy of Joachim.Gabler@t-online.de + +Sat Jan 23 10:30:00 GMT 1999 + - Changed imports in postgresql.jdbc1.ResultSetMetaData as for some + reason it didn't want to compile under jdk1.1.6 + +Tue Dec 29 15:45:00 GMT 1998 + - Refreshed the README (which was way out of date) + +Tue Dec 29 15:45:00 GMT 1998 + - Finished adding the additional methods into the JDBC2 driver. + - Had to add some explicit package references for the JDK1.2 Javac to + cope with the driver + +Tue Dec 29 12:40:00 GMT 1998 + - Fixed package imports and some references to java.sql.ResultSet in + various files. Compiled and tested the JDBC1 driver. + +Mon Dec 28 19:01:37 GMT 1998 + - created a new package postgresql.jdbc2 which will contain the JDBC 2 + specific classes. A similar new package (postgresql.jdbc1) has been + created to hold the JDBC 1 specific classes. + - modified Makefile to allow compilation of the JDBC 1 & 2 drivers, + with the possibility of building a dual-spec driver. + - changed the version number in postgresql.Driver to 6.5 + - modified postgresql.Driver class to initiate the correct driver when + used under a 1.1 or 1.2+ JVM. + - postgresql.Connection and postgresql.jdbc2.Connection now extends the + new class postgresql.ConnectionStub, which allows us to dynamically + open the JDBC1 or JDBC2 drivers. + - enabled compilation of the driver under Win32 when using the Make + from the CygWin package (Cygnus B20.1 was used). + - To make future development easier (now we have 2 specifications to + work with) the following classes have moved from the postgresql to + the postgresql.jdbc1 package: + CallableStatement Connection + DatabaseMetaData PreparedStatement + ResultSet ResultSetMetaData + Statement + Some of these classes have common code that is not dependent on + either JDBC specification. These common code are still in the + postgresql package. + Ie: postgresql.jdbc1.Connection extends postgresql.Connection + and postgresql.jdbc2.Connection extends postgresql.Connection + +Web Oct 7 22:00:00 BST 1998 + - removed syncronised from Connection.ExecSQL(). See next entry. + - added new syncronised locking in the Connection.ExecSQL() and + FastPath.fastpath() methods. They now lock against the PG_Steam + object for the connection, which now provides full Thread Safety. + - Reposted ChangeLog as it's missing from CVS. + +Modifications done since 6.3.2 was released and Sun Aug 30 11:33:06 BST 1998 + + - Fixed PreparedStatement.setObject as it didn't handle shorts + - ResultSet.getDate() now handles null dates (returns null ratrher + than a NullPointerException) + - ResultSetMetaData.getPrecision() new returns 0 for VARCHAR + - Field now caches the typename->oid in a Hashtable to speed things + up. It removes the need for some unnecessary queries to the backend. + - PreparedStatement.toString() now returns the SQL statement that it + will send to the backend. Before it did nothing. + - DatabaseMetaData.getTypeInfo() now does something. + - Connection now throws an exception if either of the user or password + properties are missing, as they are required for JDBC to work. + This occasionally occurs when the client uses the properties version + of getConnection(), and is a common question on the email lists. + +Sun Aug 30 11:33:06 BST 1998 + + - Created ChangeLog file, and entered stuff done since 6.3.2 and today + - Change version number to 6.4 in Driver.java + - Added fix to DatabaseMetaData.getTables() submitted by + Stefan Andreasen + - Added fix to DatabaseMetaData.getColumns() to handle patterns + submitted by Stefan Andreasen + - Set TcpNoDelay on the connection, as this gives us a 10x speed + improvement on FreeBSD (caused by a bug in their TCP Stack). They + should fix the bug before 6.4 is released, but will keep this + in here unless it causes more problems. + Submitted by Jason Venner + - Removed a duplicate definition of fieldCache + - Added a more meaningful message when the connection is refused. It + now says: + Connection refused. Check that the hostname and port is + correct, and that the postmaster is running with the -i flag, + which enables TCP/IP networking. + - Removed kludge in PreparedStatement.setDate() that acted as a + temporary fix to a bug in SimpleDateFormat, as it broke date + handling in JDK 1.1.6. + - Modified PG_Stream and Connection, so that outbound data is now + buffered. This should give us a speed improvement, and reduce the + ammount of network packets generated. + - Removed duplicate code and optimised PG_Stream. + - PG_Stream now returns a more meaningful message when the connection + is broken by the backend. It now returns: + The backend has broken the connection. Possibly the action you + have attempted has caused it to close. + - Removed obsolete code from Connection. + - The error message returned when the authentication scheme is unknown + has been extended. It now reads: + Authentication type ### not supported. Check that you have + configured the pg_hba.conf file to include the client's IP + address or Subnet, and is using a supported authentication + scheme. + - Connection.getMetaData() now caches the instance returned, so + multiple calls will return the same instance. + - Created a test application that tests the DatabaseMetaData and + ResultSetMetaData classes. + - Replaced getString(#).getBytes() with getBytes(#) which should speed + things up, and reduce memory useage. + - Optimised DatabaseMetaData.getProcedures(), and implemented patterns + - Fixed NullPointerExceptions thrown when a field is null (Internal + to the driver, not caused by results from the backend. + DatabaseMetaData.getProcedures() is an example of a method that + causes this): + - ResultSetMetaData.getColumnName() now returns field# where + # is the column name. + - ResultSet.getObject() fixed + - Fixed bug in psql example that was affected by null fields + - DatabaseMetaData.getTables() + - DatabaseMetaData.getPrimaryKeys() ran a query with an ambiguous field + fixed. + - getTypeInfo() optimised to increase speed and reduce memory useage + - ResultSetMetaData.isCurrency() optimised and is now smaller. + - Removed unnecessary code fromResultSetMetaData.getCatalogName() + and getSchemaName(). + - Created new class postgresql.util.PGmoney to map the money type + - Created new class postgresql.geometric.PGline to map the line type + diff --git a/src/interfaces/jdbc/Implementation b/src/interfaces/jdbc/Implementation new file mode 100644 index 00000000000..ecfc626d9d6 --- /dev/null +++ b/src/interfaces/jdbc/Implementation @@ -0,0 +1,199 @@ +This short document is provided to help programmers through the internals of +the PostgreSQL JDBC driver. + +Last update: January 17 2001 peter@retep.org.uk + +build.xml +--------- + +As of 7.1, we now use the ANT build tool to build the driver. ANT is part of +the Apache/Jakarta project, and provides far superior build capabilities. You +can find ANT from http://jakarta.apache.org/ant/index.html and being pure java +it will run on any java platform. + +So far I've tested it under JDK1.2.x & JDK1.3 (both Linux & NT) but not yet with +JDK1.1.8. Because of the latter the Makefile still works for now, but should be +gone for 7.2. + +Anyhow, to build, simply type ant and the .jar file will be created and put into +the jars directory. + +Tip: If you run ant from the sources root directory (ie: where the configure +script is located) you will find another build.xml file. It is advised to run +ant from that directory as it will then compile some auxilary Java/JDBC +utilities that are located under the /contrib/retep directory. + +Makefile +-------- + +Prior to 7.1, all compilation must be done by using Make. This is because there +are three versions of the driver, one for JDBC1 (for JDK 1.1.x) and the others +for JDBC2 (for JDK 1.2 or later, one standard and one enterprise). + +As of 7.1, ANT is the build tool of choice. Just compare Makefile and build.xml +to see why! Make just isn't suited to Java. + +Building with just the JDK +-------------------------- + +This is not advised, simply because you have to make sure you include the +correct classes, and the fact that org.postgresql.Driver is built on the fly. +Also, javac won't pick up all the classes because some (org.postgresql.geometric +for example) are loaded dynamically. + +org/postgresql/Driver.java.in +----------------------------- + +Because there are three versions of the driver, the org.postgresql.Driver class +is built dynamically. To build correctly ANT copies the Driver.java.in file to +Driver.java replacing certain values according to the required driver. + +The replaced values are of the format %VALUE%, ie: %MAJORVERSION% is replaced +with 7 in the 7.1 version of the driver. + +postgresql.jar +-------------- + +This jar file is produced by ANT, and contains the driver for your JDK platform. + +If you downloaded a precompiled binary from the web, you may find that the +jar file will be named differently. These are identical to this file but are +named according to the backend and jdk versions. + +The naming convention is of the form: jdbc-#.#-#.##.jar + +ie: for 7.1 + jdbc-7.1-1.1.jar JDBC Driver for JDK1.1.8 + jdbc-7.1-1.2.jar JDBC Driver for JDK1.2 & JDK1.3 + jdbc-7.1-1.2ent.jar JDBC Driver for JDK1.2 & JDK1.3 Enterprise Editions + +If in the future there are any 1.3 specific classes then there will be two new +jar files. + +Note: All the precompiled binaries are built under Linux. + +jdbc.jpx +-------- + +This is a JBuilder4 project file. It's here to allow JBuilder to be used to +develop the driver. Mainly for it's Editor's features like syntax checking and +auto-completion etc. + +IMPORTANT: You CAN NOT build the driver from within JBuilder. You must use ANT. + This is because of the three versions of the JDK. If you try to use + JBuilder, it will try to build everything, and it will just not work. + +Importing packages +------------------ + +In user code, you may have to import one or more packages, if and only if you +are using the non jdbc extensions (like FastPath, or LargeObject). + +DO NOT import the postgresql, postgresql.jdbc1 or postgresql.jdbc2 packages! + +Internally, some classes will import the packages when there is a link between +them and the other packages. However, the above rule still applies. It's there +because Javac becomes confused between the different places that similar class +names are present. + +However, there are places where they need to refer to classes in the postgresql +package. In this case, import the individual classes, and not the entire +package. + +ie: import postgresql.Field + + NOT import postgresql.* + +Package Layout +-------------- + +The driver is split into several packages: + +org.postgresql core classes that can be accessed by user code +org.postgresql.core core classes not normally used externally +org.postgresql.jdbc1 classes used only in implementing JDBC 1 +org.postgresql.jdbc2 classes used only in implementing JDBC 2 +org.postgresql.fastpath FastPath to backend functions +org.postgresql.geometric 2D Geometric types mapped to Java Objects +org.postgresql.largeobject Low level Large Object access +org.postgresql.util Utility classes + + +Package org.postgresql +------------------ + +This package holds the core classes. + +Driver registers the driver when it's loaded, and determines which + Connection class (in jdbc1 or jdbc2 packages) to use when + connecting to a database. + +Field Used internally to represent a Field +PG_Stream Used internally to manage the network stream. +PostgresqlDataSource + Exists in the Java2 Enterprise edition driver only and is the + enterprise equivalent to Driver + + These classes contains common code that is not dependent to the + two JDBC specifications. + +Connection Common code used in Connections, mainly Network Protocol stuff. +ResultSet Common code used in ResultSet's + +Package org.postgresql.core +----------------------- + +New in 7.1, this is where core classes (common to all versions) will exist. Any +new class that would have gone into org.postgresql must go in here instead. + +BytePoolDim1 Handles a pool of byte[] arrays. +BytePoolDim2 Handles a pool of byte[][] arrays +MemoryPool Interface for managing MemoryPools. Not used (yet). +ObjectPool Interface for an Object Pool +SimpleObjectPool Class that implements ObjectPool and used by BytePoolDim# +Encoding Character encoding logic, mainly for Connection and PG_Stream. + +Package org.postgresql.fastpath +--------------------------- + +Fastpath Handles executing a function on the PostgreSQL Backend +FastpathArg Defines an argument for a function call + +Package org.postgresql.geometric +---------------------------- + +PGbox Maps to postgresql type box +PGcircle Maps to postgresql type circle +PGline Maps to postgresql type line +PGlseg Maps to postgresql type lseg +PGpath Maps to postgresql type path +PGpoint Maps to postgresql type point +PGpolygon Maps to postgresql type polygon + +Package org.postgresql.jdbc1 +------------------------ + +The classes in this package handle the JDBC 1 Specification, for JDK 1.1.x +All interfaces in the java.sql package are present here. + +Package org.postgresql.jdbc2 +------------------------ + +The classes in this package handle the JDBC 2 Specification, for JDK 1.2 +All interfaces in the java.sql, and javax.sql packages are present here. + +Package org.postgresql.largeobject +------------------------------ + +LargeObject Represents an open LargeObject +LargeObjectManager Handles the opening and deleting of LargeObjects + +Package org.postgresql.util +----------------------- + +PGmoney Maps to postgresql type money +PGobject Used to represent postgresql types that have no Java equivalent +PGtokenizer Helper class for the geometric types +Serialize Used to serialise Java objects into tabes, rather than Blobs +UnixCrypt Used to handle crypt authentication + diff --git a/src/interfaces/jdbc/jdbc.jpx b/src/interfaces/jdbc/jdbc.jpx new file mode 100644 index 00000000000..8c17267ca1b --- /dev/null +++ b/src/interfaces/jdbc/jdbc.jpx @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/interfaces/jdbc/utils/CheckVersion.java b/src/interfaces/jdbc/utils/CheckVersion.java new file mode 100644 index 00000000000..a2438cd4f9f --- /dev/null +++ b/src/interfaces/jdbc/utils/CheckVersion.java @@ -0,0 +1,74 @@ +package utils; + +/* + * This little app checks to see what version of JVM is being used. + * It does this by checking first the java.vm.version property, and + * if that fails, it looks for certain classes that should be present. + */ +public class CheckVersion +{ + /* + * Check for the existence of a class by attempting to load it + */ + public static boolean checkClass(String c) + { + try + { + Class.forName(c); + } + catch (Exception e) + { + return false; + } + return true; + } + + /* + * This first checks java.vm.version for 1.1, 1.2 or 1.3. + * + * It writes jdbc1 to stdout for the 1.1.x VM. + * + * For 1.2 or 1.3, it checks for the existence of the javax.sql.DataSource + * interface, and if found writes enterprise to stdout. If the interface + * is not found, it writes jdbc2 to stdout. + * + * PS: It also looks for the existence of java.lang.Byte which appeared in + * JDK1.1.0 incase java.vm.version is not heeded by some JVM's. + * + * If it can't work it out, it writes huho to stdout. + * + * The make file uses the written results to determine which rule to run. + * + * Bugs: This needs thorough testing. + */ + public static void main(String args[]) + { + String vmversion = System.getProperty("java.vm.version"); + + System.out.println("postgresql.jdbc=" + System.getProperty("postgresql.jdbc")); + + // We are running a 1.1 JVM + if (vmversion.startsWith("1.1")) + { + System.out.println("jdbc1"); + //System.exit(0); + } + else + // We are running a 1.2 or 1.3 JVM + if (vmversion.startsWith("1.2") || + vmversion.startsWith("1.3") || + checkClass("java.lang.Byte") + ) + { + + // Check to see if we have the standard extensions. If so, then + // we want the enterprise edition, otherwise the jdbc2 driver. + if (checkClass("javax.sql.DataSource")) + System.out.println("enterprise"); + else + System.out.println("jdbc2"); + //System.exit(0); + } + System.setProperty("postgresql.jdbc", "yoyo"); + } +} diff --git a/src/interfaces/jdbc/utils/buildDriver b/src/interfaces/jdbc/utils/buildDriver new file mode 100755 index 00000000000..8cca1d9c36d --- /dev/null +++ b/src/interfaces/jdbc/utils/buildDriver @@ -0,0 +1,47 @@ +#!/bin/sh +# +# $Id: buildDriver,v 1.2 2000/12/20 16:22:49 peter Exp $ +# +# This script generates the org/postgresql/Driver.java file from the template +# org/postgresql/Driver.java.in +# +# We do this because we need to include the version number from Makefile.global +# and some other goodies. +# +# This used to be in Makefile, but as it's now done three times, it's better +# to have it as a separate script. +# +# If you have any problems, please let us know ;-) +# +# Syntax: buildDriver version class +# +# Where: +# version The version string from Makefile.global +# class The class implementing java.sql.Connection +# edition The driver edition being built +# source The file to build. We assume that ${source}.in exists +# + +VERSION=$1 +CLASS=$2 +EDITION=$3 +SOURCE=$4 + +#--------------------------------------------------------------------------- +# Extract the version. This will work until version x.9 (and assuming we don't +# have 7.10 etc). We only handle 1 digit for MINORVERSION to handle things like +# 7.1devel etc +# +MAJORVERSION=`echo $VERSION | cut -f1 -d'.'` +MINORVERSION=`echo $VERSION | cut -f2 -d'.' | cut -c1` + +#--------------------------------------------------------------------------- +# Now finally build the driver +sed \ + -e "s/@JDBCCONNECTCLASS@/$CLASS/g" \ + -e "s/@VERSION@/$VERSION $EDITION/g" \ + -e "s/@MAJORVERSION@/$MAJORVERSION/g" \ + -e "s/@MINORVERSION@/$MINORVERSION/g" \ + <${SOURCE}.in \ + >$SOURCE +#--------------------------------------------------------------------------- diff --git a/src/interfaces/jdbc/utils/changelog.pl b/src/interfaces/jdbc/utils/changelog.pl new file mode 100644 index 00000000000..3cba15aa91d --- /dev/null +++ b/src/interfaces/jdbc/utils/changelog.pl @@ -0,0 +1,23 @@ +#!/bin/perl + +while(<>) { + chomp(); + s/\t+/ /g; + if(substr($_,0,3) eq ' - ') { + print "

    " if !$inlist; + $inlist=1; + print "
  • ".substr($_,3)."\n"; + } else { + if($_ eq "" || $_ eq " ") { + print "
" if $inlist; + $inlist=0; + print "
\n"; + } elsif(substr($_,0,1) eq " ") { + print $_; + } else { + print "" if $inlist; + $inlist=0; + print "

".$_."

\n"; + } + } +} diff --git a/src/test/regress/expected/geometry-bsdi-precision.out b/src/test/regress/expected/geometry-bsdi-precision.out new file mode 100644 index 00000000000..7892b5dceda --- /dev/null +++ b/src/test/regress/expected/geometry-bsdi-precision.out @@ -0,0 +1,532 @@ +-- +-- GEOMETRY +-- +-- +-- Points +-- +SELECT '' AS four, center(f1) AS center + FROM BOX_TBL; + four | center +------+--------- + | (1,1) + | (2,2) + | (2.5,3) + | (3,3) +(4 rows) + +SELECT '' AS four, (@@ f1) AS center + FROM BOX_TBL; + four | center +------+--------- + | (1,1) + | (2,2) + | (2.5,3) + | (3,3) +(4 rows) + +SELECT '' AS six, point(f1) AS center + FROM CIRCLE_TBL; + six | center +-----+----------- + | (0,0) + | (1,2) + | (1,3) + | (1,2) + | (100,200) + | (100,0) +(6 rows) + +SELECT '' AS six, (@@ f1) AS center + FROM CIRCLE_TBL; + six | center +-----+----------- + | (0,0) + | (1,2) + | (1,3) + | (1,2) + | (100,200) + | (100,0) +(6 rows) + +SELECT '' AS two, (@@ f1) AS center + FROM POLYGON_TBL + WHERE (# f1) > 2; + two | center +-----+------------------------------------- + | (1.33333333333333,1.33333333333333) + | (2.33333333333333,1.33333333333333) +(2 rows) + +-- "is horizontal" function +SELECT '' AS two, p1.f1 + FROM POINT_TBL p1 + WHERE ishorizontal(p1.f1, point '(0,0)'); + two | f1 +-----+--------- + | (0,0) + | (-10,0) +(2 rows) + +-- "is horizontal" operator +SELECT '' AS two, p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?- point '(0,0)'; + two | f1 +-----+--------- + | (0,0) + | (-10,0) +(2 rows) + +-- "is vertical" function +SELECT '' AS one, p1.f1 + FROM POINT_TBL p1 + WHERE isvertical(p1.f1, point '(5.1,34.5)'); + one | f1 +-----+------------ + | (5.1,34.5) +(1 row) + +-- "is vertical" operator +SELECT '' AS one, p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?| point '(5.1,34.5)'; + one | f1 +-----+------------ + | (5.1,34.5) +(1 row) + +-- +-- Line segments +-- +-- intersection +SELECT '' AS count, p.f1, l.s, l.s # p.f1 AS intersection + FROM LSEG_TBL l, POINT_TBL p; +ERROR: Unable to identify an operator '#' for types 'lseg' and 'point' + You will have to retype this query using an explicit cast +-- closest point +SELECT '' AS thirty, p.f1, l.s, p.f1 ## l.s AS closest + FROM LSEG_TBL l, POINT_TBL p; + thirty | f1 | s | closest +--------+------------+-------------------------------+--------------------------------------- + | (0,0) | [(1,2),(3,4)] | (1,2) + | (-10,0) | [(1,2),(3,4)] | (1,2) + | (-3,4) | [(1,2),(3,4)] | (1,2) + | (5.1,34.5) | [(1,2),(3,4)] | (3,4) + | (-5,-12) | [(1,2),(3,4)] | (1,2) + | (10,10) | [(1,2),(3,4)] | (3,4) + | (0,0) | [(0,0),(6,6)] | (-0,0) + | (-10,0) | [(0,0),(6,6)] | (0,0) + | (-3,4) | [(0,0),(6,6)] | (0.5,0.5) + | (5.1,34.5) | [(0,0),(6,6)] | (6,6) + | (-5,-12) | [(0,0),(6,6)] | (0,0) + | (10,10) | [(0,0),(6,6)] | (6,6) + | (0,0) | [(10,-10),(-3,-4)] | (-2.04878048780488,-4.4390243902439) + | (-10,0) | [(10,-10),(-3,-4)] | (-3,-4) + | (-3,4) | [(10,-10),(-3,-4)] | (-3,-4) + | (5.1,34.5) | [(10,-10),(-3,-4)] | (-3,-4) + | (-5,-12) | [(10,-10),(-3,-4)] | (-1.60487804878049,-4.64390243902439) + | (10,10) | [(10,-10),(-3,-4)] | (2.39024390243902,-6.48780487804878) + | (0,0) | [(-1000000,200),(300000,-40)] | (0.0028402365895872,15.384614860264) + | (-10,0) | [(-1000000,200),(300000,-40)] | (-9.99715942258202,15.3864610140472) + | (-3,4) | [(-1000000,200),(300000,-40)] | (-2.99789812267519,15.3851688427303) + | (5.1,34.5) | [(-1000000,200),(300000,-40)] | (5.09647083221496,15.3836744976925) + | (-5,-12) | [(-1000000,200),(300000,-40)] | (-4.99494420845634,15.3855375281616) + | (10,10) | [(-1000000,200),(300000,-40)] | (10.000993741978,15.3827690473092) + | (0,0) | [(11,22),(33,44)] | (11,22) + | (-10,0) | [(11,22),(33,44)] | (11,22) + | (-3,4) | [(11,22),(33,44)] | (11,22) + | (5.1,34.5) | [(11,22),(33,44)] | (14.3,25.3) + | (-5,-12) | [(11,22),(33,44)] | (11,22) + | (10,10) | [(11,22),(33,44)] | (11,22) +(30 rows) + +-- +-- Lines +-- +-- +-- Boxes +-- +SELECT '' as six, box(f1) AS box FROM CIRCLE_TBL; + six | box +-----+---------------------------------------------------------------------------- + | (2.12132034355964,2.12132034355964),(-2.12132034355964,-2.12132034355964) + | (71.7106781186547,72.7106781186547),(-69.7106781186547,-68.7106781186547) + | (4.53553390593274,6.53553390593274),(-2.53553390593274,-0.535533905932737) + | (3.12132034355964,4.12132034355964),(-1.12132034355964,-0.121320343559642) + | (107.071067811865,207.071067811865),(92.9289321881345,192.928932188135) + | (170.710678118655,70.7106781186547),(29.2893218813453,-70.7106781186547) +(6 rows) + +-- translation +SELECT '' AS twentyfour, b.f1 + p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + twentyfour | translation +------------+------------------------- + | (2,2),(0,0) + | (-8,2),(-10,0) + | (-1,6),(-3,4) + | (7.1,36.5),(5.1,34.5) + | (-3,-10),(-5,-12) + | (12,12),(10,10) + | (3,3),(1,1) + | (-7,3),(-9,1) + | (0,7),(-2,5) + | (8.1,37.5),(6.1,35.5) + | (-2,-9),(-4,-11) + | (13,13),(11,11) + | (2.5,3.5),(2.5,2.5) + | (-7.5,3.5),(-7.5,2.5) + | (-0.5,7.5),(-0.5,6.5) + | (7.6,38),(7.6,37) + | (-2.5,-8.5),(-2.5,-9.5) + | (12.5,13.5),(12.5,12.5) + | (3,3),(3,3) + | (-7,3),(-7,3) + | (0,7),(0,7) + | (8.1,37.5),(8.1,37.5) + | (-2,-9),(-2,-9) + | (13,13),(13,13) +(24 rows) + +SELECT '' AS twentyfour, b.f1 - p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + twentyfour | translation +------------+--------------------------- + | (2,2),(0,0) + | (12,2),(10,0) + | (5,-2),(3,-4) + | (-3.1,-32.5),(-5.1,-34.5) + | (7,14),(5,12) + | (-8,-8),(-10,-10) + | (3,3),(1,1) + | (13,3),(11,1) + | (6,-1),(4,-3) + | (-2.1,-31.5),(-4.1,-33.5) + | (8,15),(6,13) + | (-7,-7),(-9,-9) + | (2.5,3.5),(2.5,2.5) + | (12.5,3.5),(12.5,2.5) + | (5.5,-0.5),(5.5,-1.5) + | (-2.6,-31),(-2.6,-32) + | (7.5,15.5),(7.5,14.5) + | (-7.5,-6.5),(-7.5,-7.5) + | (3,3),(3,3) + | (13,3),(13,3) + | (6,-1),(6,-1) + | (-2.1,-31.5),(-2.1,-31.5) + | (8,15),(8,15) + | (-7,-7),(-7,-7) +(24 rows) + +-- scaling and rotation +SELECT '' AS twentyfour, b.f1 * p.f1 AS rotation + FROM BOX_TBL b, POINT_TBL p; + twentyfour | rotation +------------+----------------------------- + | (0,0),(0,0) + | (-0,0),(-20,-20) + | (-0,2),(-14,0) + | (0,79.2),(-58.8,0) + | (14,-0),(0,-34) + | (0,40),(0,0) + | (0,0),(0,0) + | (-10,-10),(-30,-30) + | (-7,3),(-21,1) + | (-29.4,118.8),(-88.2,39.6) + | (21,-17),(7,-51) + | (0,60),(0,20) + | (0,0),(0,0) + | (-25,-25),(-25,-35) + | (-17.5,2.5),(-21.5,-0.5) + | (-73.5,104.1),(-108,99) + | (29.5,-42.5),(17.5,-47.5) + | (0,60),(-10,50) + | (0,0),(0,0) + | (-30,-30),(-30,-30) + | (-21,3),(-21,3) + | (-88.2,118.8),(-88.2,118.8) + | (21,-51),(21,-51) + | (0,60),(0,60) +(24 rows) + +SELECT '' AS twenty, b.f1 / p.f1 AS rotation + FROM BOX_TBL b, POINT_TBL p + WHERE (p.f1 <-> point '(0,0)') >= 1; + twenty | rotation +--------+----------------------------------------------------------------------------------- + | (0,-0),(-0.2,-0.2) + | (-0.1,-0.1),(-0.3,-0.3) + | (-0.25,-0.25),(-0.25,-0.35) + | (-0.3,-0.3),(-0.3,-0.3) + | (0.08,-0),(0,-0.56) + | (0.12,-0.28),(0.04,-0.84) + | (0.26,-0.7),(0.1,-0.82) + | (0.12,-0.84),(0.12,-0.84) + | (0.0651176557643925,0),(0,-0.0483449262493217) + | (0.0976764836465887,-0.0241724631246608),(0.0325588278821962,-0.0725173893739825) + | (0.109762715208919,-0.0562379754328844),(0.0813970697054906,-0.0604311578116521) + | (0.0976764836465887,-0.0725173893739825),(0.0976764836465887,-0.0725173893739825) + | (-0,0.0828402366863905),(-0.201183431952663,0) + | (-0.100591715976331,0.124260355029586),(-0.301775147928994,0.0414201183431953) + | (-0.251479289940828,0.103550295857988),(-0.322485207100592,0.0739644970414201) + | (-0.301775147928994,0.124260355029586),(-0.301775147928994,0.124260355029586) + | (0.2,0),(0,0) + | (0.3,0),(0.1,0) + | (0.3,0.05),(0.25,0) + | (0.3,0),(0.3,0) +(20 rows) + +-- +-- Paths +-- +SET geqo TO 'off'; +SELECT '' AS eight, npoints(f1) AS npoints, f1 AS path FROM PATH_TBL; + eight | npoints | path +-------+---------+--------------------------- + | 2 | [(1,2),(3,4)] + | 2 | ((1,2),(3,4)) + | 4 | [(0,0),(3,0),(4,5),(1,6)] + | 2 | ((1,2),(3,4)) + | 2 | ((1,2),(3,4)) + | 2 | [(1,2),(3,4)] + | 2 | [(11,12),(13,14)] + | 2 | ((11,12),(13,14)) +(8 rows) + +SELECT '' AS four, path(f1) FROM POLYGON_TBL; + four | path +------+--------------------- + | ((2,0),(2,4),(0,0)) + | ((3,1),(3,3),(1,0)) + | ((0,0)) + | ((0,1),(0,1)) +(4 rows) + +-- translation +SELECT '' AS eight, p1.f1 + point '(10,10)' AS dist_add + FROM PATH_TBL p1; + eight | dist_add +-------+----------------------------------- + | [(11,12),(13,14)] + | ((11,12),(13,14)) + | [(10,10),(13,10),(14,15),(11,16)] + | ((11,12),(13,14)) + | ((11,12),(13,14)) + | [(11,12),(13,14)] + | [(21,22),(23,24)] + | ((21,22),(23,24)) +(8 rows) + +-- scaling and rotation +SELECT '' AS eight, p1.f1 * point '(2,-1)' AS dist_mul + FROM PATH_TBL p1; + eight | dist_mul +-------+------------------------------ + | [(4,3),(10,5)] + | ((4,3),(10,5)) + | [(0,0),(6,-3),(13,6),(8,11)] + | ((4,3),(10,5)) + | ((4,3),(10,5)) + | [(4,3),(10,5)] + | [(34,13),(40,15)] + | ((34,13),(40,15)) +(8 rows) + +RESET geqo; +-- +-- Polygons +-- +-- containment +SELECT '' AS twentyfour, p.f1, poly.f1, poly.f1 ~ p.f1 AS contains + FROM POLYGON_TBL poly, POINT_TBL p; + twentyfour | f1 | f1 | contains +------------+------------+---------------------+---------- + | (0,0) | ((2,0),(2,4),(0,0)) | t + | (-10,0) | ((2,0),(2,4),(0,0)) | f + | (-3,4) | ((2,0),(2,4),(0,0)) | f + | (5.1,34.5) | ((2,0),(2,4),(0,0)) | f + | (-5,-12) | ((2,0),(2,4),(0,0)) | f + | (10,10) | ((2,0),(2,4),(0,0)) | f + | (0,0) | ((3,1),(3,3),(1,0)) | f + | (-10,0) | ((3,1),(3,3),(1,0)) | f + | (-3,4) | ((3,1),(3,3),(1,0)) | f + | (5.1,34.5) | ((3,1),(3,3),(1,0)) | f + | (-5,-12) | ((3,1),(3,3),(1,0)) | f + | (10,10) | ((3,1),(3,3),(1,0)) | f + | (0,0) | ((0,0)) | t + | (-10,0) | ((0,0)) | f + | (-3,4) | ((0,0)) | f + | (5.1,34.5) | ((0,0)) | f + | (-5,-12) | ((0,0)) | f + | (10,10) | ((0,0)) | f + | (0,0) | ((0,1),(0,1)) | f + | (-10,0) | ((0,1),(0,1)) | f + | (-3,4) | ((0,1),(0,1)) | f + | (5.1,34.5) | ((0,1),(0,1)) | f + | (-5,-12) | ((0,1),(0,1)) | f + | (10,10) | ((0,1),(0,1)) | f +(24 rows) + +SELECT '' AS twentyfour, p.f1, poly.f1, p.f1 @ poly.f1 AS contained + FROM POLYGON_TBL poly, POINT_TBL p; + twentyfour | f1 | f1 | contained +------------+------------+---------------------+----------- + | (0,0) | ((2,0),(2,4),(0,0)) | t + | (-10,0) | ((2,0),(2,4),(0,0)) | f + | (-3,4) | ((2,0),(2,4),(0,0)) | f + | (5.1,34.5) | ((2,0),(2,4),(0,0)) | f + | (-5,-12) | ((2,0),(2,4),(0,0)) | f + | (10,10) | ((2,0),(2,4),(0,0)) | f + | (0,0) | ((3,1),(3,3),(1,0)) | f + | (-10,0) | ((3,1),(3,3),(1,0)) | f + | (-3,4) | ((3,1),(3,3),(1,0)) | f + | (5.1,34.5) | ((3,1),(3,3),(1,0)) | f + | (-5,-12) | ((3,1),(3,3),(1,0)) | f + | (10,10) | ((3,1),(3,3),(1,0)) | f + | (0,0) | ((0,0)) | t + | (-10,0) | ((0,0)) | f + | (-3,4) | ((0,0)) | f + | (5.1,34.5) | ((0,0)) | f + | (-5,-12) | ((0,0)) | f + | (10,10) | ((0,0)) | f + | (0,0) | ((0,1),(0,1)) | f + | (-10,0) | ((0,1),(0,1)) | f + | (-3,4) | ((0,1),(0,1)) | f + | (5.1,34.5) | ((0,1),(0,1)) | f + | (-5,-12) | ((0,1),(0,1)) | f + | (10,10) | ((0,1),(0,1)) | f +(24 rows) + +SELECT '' AS four, npoints(f1) AS npoints, f1 AS polygon + FROM POLYGON_TBL; + four | npoints | polygon +------+---------+--------------------- + | 3 | ((2,0),(2,4),(0,0)) + | 3 | ((3,1),(3,3),(1,0)) + | 1 | ((0,0)) + | 2 | ((0,1),(0,1)) +(4 rows) + +SELECT '' AS four, polygon(f1) + FROM BOX_TBL; + four | polygon +------+------------------------------------------- + | ((0,0),(0,2),(2,2),(2,0)) + | ((1,1),(1,3),(3,3),(3,1)) + | ((2.5,2.5),(2.5,3.5),(2.5,3.5),(2.5,2.5)) + | ((3,3),(3,3),(3,3),(3,3)) +(4 rows) + +SELECT '' AS four, polygon(f1) + FROM PATH_TBL WHERE isclosed(f1); + four | polygon +------+------------------- + | ((1,2),(3,4)) + | ((1,2),(3,4)) + | ((1,2),(3,4)) + | ((11,12),(13,14)) +(4 rows) + +SELECT '' AS four, f1 AS open_path, polygon( pclose(f1)) AS polygon + FROM PATH_TBL + WHERE isopen(f1); + four | open_path | polygon +------+---------------------------+--------------------------- + | [(1,2),(3,4)] | ((1,2),(3,4)) + | [(0,0),(3,0),(4,5),(1,6)] | ((0,0),(3,0),(4,5),(1,6)) + | [(1,2),(3,4)] | ((1,2),(3,4)) + | [(11,12),(13,14)] | ((11,12),(13,14)) +(4 rows) + +-- convert circles to polygons using the default number of points +SELECT '' AS six, polygon(f1) + FROM CIRCLE_TBL; + six | polygon +-----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | ((-3,0),(-2.59807621135076,1.50000000000442),(-1.49999999999116,2.59807621135842),(1.53102359078377e-11,3),(1.50000000001768,2.59807621134311),(2.59807621136607,1.4999999999779),(3,-3.06204718156754e-11),(2.59807621133545,-1.50000000003094),(1.49999999996464,-2.59807621137373),(-4.59307077235131e-11,-3),(-1.5000000000442,-2.5980762113278),(-2.59807621138138,-1.49999999995138)) + | ((-99,2),(-85.6025403783588,52.0000000001473),(-48.9999999997054,88.602540378614),(1.00000000051034,102),(51.0000000005893,88.6025403781036),(87.6025403788692,51.9999999992634),(101,1.99999999897932),(87.6025403778485,-48.0000000010313),(50.9999999988214,-84.6025403791243),(0.999999998468976,-98),(-49.0000000014732,-84.6025403775933),(-85.6025403793795,-47.9999999983795)) + | ((-4,3),(-3.33012701891794,5.50000000000737),(-1.49999999998527,7.3301270189307),(1.00000000002552,8),(3.50000000002946,7.33012701890518),(5.33012701894346,5.49999999996317),(6,2.99999999994897),(5.33012701889242,0.499999999948437),(3.49999999994107,-1.33012701895622),(0.999999999923449,-2),(-1.50000000007366,-1.33012701887967),(-3.33012701896897,0.500000000081028)) + | ((-2,2),(-1.59807621135076,3.50000000000442),(-0.499999999991161,4.59807621135842),(1.00000000001531,5),(2.50000000001768,4.59807621134311),(3.59807621136607,3.4999999999779),(4,1.99999999996938),(3.59807621133545,0.499999999969062),(2.49999999996464,-0.598076211373729),(0.999999999954069,-1),(-0.500000000044197,-0.598076211327799),(-1.59807621138138,0.500000000048616)) + | ((90,200),(91.3397459621641,205.000000000015),(95.0000000000295,208.660254037861),(100.000000000051,210),(105.000000000059,208.66025403781),(108.660254037887,204.999999999926),(110,199.999999999898),(108.660254037785,194.999999999897),(104.999999999882,191.339745962088),(99.9999999998469,190),(94.9999999998527,191.339745962241),(91.3397459620621,195.000000000162)) + | ((0,0),(13.3974596216412,50.0000000001473),(50.0000000002946,86.602540378614),(100.00000000051,100),(150.000000000589,86.6025403781036),(186.602540378869,49.9999999992634),(200,-1.02068239385585e-09),(186.602540377848,-50.0000000010313),(149.999999998821,-86.6025403791243),(99.999999998469,-100),(49.9999999985268,-86.6025403775933),(13.3974596206205,-49.9999999983795)) +(6 rows) + +-- convert the circle to an 8-point polygon +SELECT '' AS six, polygon(8, f1) + FROM CIRCLE_TBL; + six | polygon +-----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | ((-3,0),(-2.12132034355423,2.12132034356506),(1.53102359078377e-11,3),(2.12132034357588,2.1213203435434),(3,-3.06204718156754e-11),(2.12132034353258,-2.12132034358671),(-4.59307077235131e-11,-3),(-2.12132034359753,-2.12132034352175)) + | ((-99,2),(-69.7106781184743,72.7106781188352),(1.00000000051034,102),(71.710678119196,72.7106781181134),(101,1.99999999897932),(71.7106781177526,-68.7106781195569),(0.999999998468976,-98),(-69.7106781199178,-68.7106781173917)) + | ((-4,3),(-2.53553390592372,6.53553390594176),(1.00000000002552,8),(4.5355339059598,6.53553390590567),(6,2.99999999994897),(4.53553390588763,-0.535533905977846),(0.999999999923449,-2),(-2.53553390599589,-0.535533905869586)) + | ((-2,2),(-1.12132034355423,4.12132034356506),(1.00000000001531,5),(3.12132034357588,4.1213203435434),(4,1.99999999996938),(3.12132034353258,-0.121320343586707),(0.999999999954069,-1),(-1.12132034359753,-0.121320343521752)) + | ((90,200),(92.9289321881526,207.071067811884),(100.000000000051,210),(107.07106781192,207.071067811811),(110,199.999999999898),(107.071067811775,192.928932188044),(99.9999999998469,190),(92.9289321880082,192.928932188261)) + | ((0,0),(29.2893218815257,70.7106781188352),(100.00000000051,100),(170.710678119196,70.7106781181134),(200,-1.02068239385585e-09),(170.710678117753,-70.7106781195569),(99.999999998469,-100),(29.2893218800822,-70.7106781173917)) +(6 rows) + +-- +-- Circles +-- +SELECT '' AS six, circle(f1, 50.0) + FROM POINT_TBL; + six | circle +-----+----------------- + | <(0,0),50> + | <(-10,0),50> + | <(-3,4),50> + | <(5.1,34.5),50> + | <(-5,-12),50> + | <(10,10),50> +(6 rows) + +SELECT '' AS four, circle(f1) + FROM BOX_TBL; + four | circle +------+------------------------- + | <(1,1),1.4142135623731> + | <(2,2),1.4142135623731> + | <(2.5,3),0.5> + | <(3,3),0> +(4 rows) + +SELECT '' AS two, circle(f1) + FROM POLYGON_TBL + WHERE (# f1) >= 3; + two | circle +-----+-------------------------------------------------------- + | <(1.33333333333333,1.33333333333333),2.04168905063636> + | <(2.33333333333333,1.33333333333333),1.47534300379185> +(2 rows) + +SELECT '' AS twentyfour, c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS distance + FROM CIRCLE_TBL c1, POINT_TBL p1 + WHERE (p1.f1 <-> c1.f1) > 0 + ORDER BY distance, circle, point using <<; + twentyfour | circle | point | distance +------------+----------------+------------+------------------ + | <(100,0),100> | (5.1,34.5) | 0.97653192697797 + | <(1,2),3> | (-3,4) | 1.47213595499958 + | <(0,0),3> | (-3,4) | 2 + | <(100,0),100> | (-3,4) | 3.07764064044152 + | <(100,0),100> | (-5,-12) | 5.68348972285122 + | <(1,3),5> | (-10,0) | 6.40175425099138 + | <(1,3),5> | (10,10) | 6.40175425099138 + | <(0,0),3> | (-10,0) | 7 + | <(1,2),3> | (-10,0) | 8.18033988749895 + | <(1,2),3> | (10,10) | 9.0415945787923 + | <(0,0),3> | (-5,-12) | 10 + | <(100,0),100> | (-10,0) | 10 + | <(0,0),3> | (10,10) | 11.142135623731 + | <(1,3),5> | (-5,-12) | 11.1554944214035 + | <(1,2),3> | (-5,-12) | 12.2315462117278 + | <(1,3),5> | (5.1,34.5) | 26.7657047773223 + | <(1,2),3> | (5.1,34.5) | 29.757594539282 + | <(0,0),3> | (5.1,34.5) | 31.8749193547455 + | <(100,200),10> | (5.1,34.5) | 180.778038568384 + | <(100,200),10> | (10,10) | 200.237960416286 + | <(100,200),10> | (-3,4) | 211.415898254845 + | <(100,200),10> | (0,0) | 213.606797749979 + | <(100,200),10> | (-10,0) | 218.254244210267 + | <(100,200),10> | (-5,-12) | 226.577682802077 +(24 rows) +