/*
 * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
 */

#include "h2odbc.h"

SQLRETURN  SQL_API SQLColumns(SQLHSTMT StatementHandle,
           SQLCHAR* CatalogName, SQLSMALLINT NameLength1,
           SQLCHAR* SchemaName, SQLSMALLINT NameLength2,
           SQLCHAR* TableName, SQLSMALLINT NameLength3,
           SQLCHAR* ColumnName, SQLSMALLINT NameLength4) {
    trace("SQLColumns");
    Statement* stat=Statement::cast(StatementHandle);
    if(stat==0) {
        return SQL_INVALID_HANDLE;
    }
    stat->setError(0);    
    char catalog[512];
    setString(catalog,sizeof(catalog),CatalogName,NameLength1);
    char schema[512];
    setString(schema,sizeof(schema),SchemaName,NameLength2);
    char table[512];
    setString(table,sizeof(table),TableName,NameLength3);
    char column[512];
    setString(column,sizeof(column),ColumnName,NameLength4);
    trace(" catalog=%s schema=%s table=%s column=%s",catalog,schema,table,column);
    stat->getMetaColumns(catalog, schema, table, column);
    return SQL_SUCCESS;
}

SQLRETURN  SQL_API SQLSpecialColumns(SQLHSTMT StatementHandle,
           SQLUSMALLINT IdentifierType, SQLCHAR* CatalogName,
           SQLSMALLINT NameLength1, SQLCHAR* SchemaName,
           SQLSMALLINT NameLength2, SQLCHAR* TableName,
           SQLSMALLINT NameLength3, SQLUSMALLINT Scope,
           SQLUSMALLINT Nullable) {
    trace("SQLSpecialColumns");
    Statement* stat=Statement::cast(StatementHandle);
    if(stat==0) {
        return SQL_INVALID_HANDLE;
    }
    stat->setError(0);
    char catalog[512];
    setString(catalog,sizeof(catalog),CatalogName,NameLength1);
    char schema[512];
    setString(schema,sizeof(schema),SchemaName,NameLength2);
    char table[512];
    setString(table,sizeof(table),TableName,NameLength3);
    switch(IdentifierType) {
    case SQL_BEST_ROWID: {
        trace(" SQL_BEST_ROWID");
        bool nullable = Nullable == SQL_NULLABLE;
        stat->getMetaBestRowIdentifier(catalog, schema, table, Scope, nullable);
        break;
    }
    case SQL_ROWVER: {
        trace(" SQL_ROWVER");
        stat->getMetaVersionColumns(catalog, schema, table);
        break;
    }
    default:
        stat->setError(E_HY097);
        return SQL_ERROR;
    }    
    return SQL_SUCCESS;
}

SQLRETURN  SQL_API SQLStatistics(SQLHSTMT StatementHandle,
           SQLCHAR* CatalogName, SQLSMALLINT NameLength1,
           SQLCHAR* SchemaName, SQLSMALLINT NameLength2,
           SQLCHAR* TableName, SQLSMALLINT NameLength3,
           SQLUSMALLINT Unique, SQLUSMALLINT Reserved) {
    trace("SQLStatistics");
    Statement* stat=Statement::cast(StatementHandle);
    if(stat==0) {
        return SQL_INVALID_HANDLE;
    }
    stat->setError(0);
    char catalog[512];
    setString(catalog,sizeof(catalog),CatalogName,NameLength1);
    char schema[512];
    setString(schema,sizeof(schema),SchemaName,NameLength2);
    char table[512];
    setString(table,sizeof(table),TableName,NameLength3);
    bool unique = Unique == SQL_INDEX_UNIQUE;
    bool approximate = Reserved == SQL_QUICK;
    stat->getMetaIndexInfo(catalog, schema, table, unique, approximate);
    return SQL_SUCCESS;
}

SQLRETURN  SQL_API SQLTables(SQLHSTMT StatementHandle,
           SQLCHAR* CatalogName, SQLSMALLINT NameLength1,
           SQLCHAR* SchemaName, SQLSMALLINT NameLength2,
           SQLCHAR* TableName, SQLSMALLINT NameLength3,
           SQLCHAR* TableType, SQLSMALLINT NameLength4) {
    trace("SQLTables");
    Statement* stat=Statement::cast(StatementHandle);
    if(stat==0) {
        return SQL_INVALID_HANDLE;
    }    
    stat->setError(0);    
    char catalog[512];
    setString(catalog,sizeof(catalog),CatalogName,NameLength1);
    char schema[512];
    setString(schema,sizeof(schema),SchemaName,NameLength2);
    char table[512];
    setString(table,sizeof(table),TableName,NameLength3);
    char tabletypes[512];
    setString(tabletypes,sizeof(tabletypes),TableType,NameLength4);
    trace(" catalog=%s schema=%s table=%s tabletypes=%s",catalog, schema, table, tabletypes);
    stat->getMetaTables(catalog, schema, table, tabletypes);
    return SQL_SUCCESS;
}

SQLRETURN  SQL_API SQLGetTypeInfo(SQLHSTMT StatementHandle,
           SQLSMALLINT DataType) {
    trace("SQLGetTypeInfo");
    Statement* stat=Statement::cast(StatementHandle);
    if(stat==0) {
        return SQL_INVALID_HANDLE;
    }    
    stat->setError(0);    
    switch(DataType) {
    case SQL_ALL_TYPES:
        trace(" SQL_ALL_TYPES");
        stat->getMetaTypeInfoAll();
        break;
        /*
    case SQL_CHAR:
        trace(" SQL_CHAR");
        break;
    case SQL_VARCHAR:
        trace(" SQL_VARCHAR");
        break;
    case SQL_LONGVARCHAR:
        trace(" SQL_LONGVARCHAR");
        break;
    case SQL_WCHAR:
        trace(" SQL_WCHAR");
        break;
    case SQL_WVARCHAR:
        trace(" SQL_WVARCHAR");
        break;
    case SQL_WLONGVARCHAR:
        trace(" SQL_WLONGVARCHAR");
        break;
    case SQL_DECIMAL:
        trace(" SQL_DECIMAL");
        break;
    case SQL_NUMERIC:
        trace(" SQL_NUMERIC");
        break;
    case SQL_INTEGER:
        trace(" SQL_INTEGER");
        break;
    case SQL_BINARY:
        trace(" SQL_BINARY");
        break;
    case SQL_SMALLINT:
        trace(" SQL_SMALLINT");
        break;
    case SQL_REAL:
        trace(" SQL_REAL");
        break;
    case SQL_FLOAT:
        trace(" SQL_FLOAT");
        break;
    case SQL_DOUBLE:
        trace(" SQL_DOUBLE");
        break;
    case SQL_BIT:
        trace(" SQL_BIT");
        break;
    case SQL_TINYINT:
        trace(" SQL_TINYINT");
        break;
    case SQL_BIGINT:
        trace(" SQL_BIGINT");
        break;
    case SQL_VARBINARY:
        trace(" SQL_VARBINARY");
        break;
    case SQL_LONGVARBINARY:
        trace(" SQL_LONGVARBINARY");
        break;
    case SQL_TYPE_DATE:
        trace(" SQL_TYPE_DATE");
        break;
    case SQL_TYPE_TIME:
        trace(" SQL_TYPE_TIME");
        break;
    case SQL_TYPE_TIMESTAMP:
        trace(" SQL_TYPE_TIMESTAMP");
        break;
    case SQL_INTERVAL_MONTH:
    case SQL_INTERVAL_YEAR:
    case SQL_INTERVAL_YEAR_TO_MONTH:
    case SQL_INTERVAL_DAY:
    case SQL_INTERVAL_HOUR:
    case SQL_INTERVAL_MINUTE:
    case SQL_INTERVAL_SECOND:
    case SQL_INTERVAL_DAY_TO_HOUR:
    case SQL_INTERVAL_DAY_TO_MINUTE:
    case SQL_INTERVAL_DAY_TO_SECOND:
    case SQL_INTERVAL_HOUR_TO_MINUTE:
    case SQL_INTERVAL_HOUR_TO_SECOND:
    case SQL_INTERVAL_MINUTE_TO_SECOND:
        trace(" SQL_INTERVAL_ %d",DataType);
        break;
    case SQL_GUID:
        trace(" SQL_GUID");
        break;
        */
    default:
        trace(" type=%d", DataType);
        stat->getMetaTypeInfo(DataType);
        break;
    }
    return SQL_SUCCESS;
}