# *************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
# *************************************************************

How to write my own sdbc driver

Pre implementation steps
- search all occurrences of skeleton and replace them to a name which you prefer

1. Implement a class called driver or modify the existing skeleton	-> have a look at SDriver.?xx 
2. Implement a class called connection					-> have a look at SConnection.?xx 	
3. Have a look at the DatabaseMetaData					-> see SDatabaseMetaData.cxx
	The methods which should be implemented at least are
		- getTableTypes
		- getTables
		- getTypeInfo
		- getColumns

4. You need a statement to show/access some data				-> have a look at SStatement.cxx
										-> especially executeQuery()

5. The ResultSet: without you see nothing					-> look at SResultSet.cxx
6. The ResultSetMetaData needed to get some information about what are waiting for us
										-> look at SResultSetMetaData.cxx

7. The prepared statement is the last class we have to implement now
	-> you have to allow statements like "SELECT * FROM table WHERE id = ?"

8. congratulations you have now implement your own driver :-)
