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

#include "h2odbc.h"

void setString(char* dest, int dest_len, SQLCHAR* source, SQLSMALLINT source_len) {
    if(dest==0 || dest_len==0) {
        return;
    }
    if(source==0) {
        *dest=0;
        return;
    }
    int len;
    if(source_len==SQL_NTS) {
        len=strlen((char*)source);
    } else {
        len=(int)source_len;
    }
    if(dest_len<len) {
        len=dest_len;
    }
    strncpy(dest, (char*)source, len);
    dest[len]=0;
}

void returnString(SQLPOINTER dest, SQLINTEGER dest_len, SQLINTEGER* dest_pt, const char* source) {
    if(dest_len==0) {
        return;
    }
    char* s = (char*)source;
    if(source==0) {
        s="";
    }
    int len=strlen(s);
    if(dest_len<len) {
        len=dest_len;
    }
    if(dest_pt!=0) {
        *dest_pt=len;
    }
    if(dest!=0) {
        strncpy((char*)dest, s, len);
        ((char*)dest)[len]=0;
    }
}

void returnString(SQLCHAR* dest, SQLSMALLINT dest_len, SQLSMALLINT* dest_pt, const char* source) {
    if(dest_len==0) {
        return;
    }
    char* s = (char*)source;
    if(source==0) {
        s="";
    }
    int len=strlen(s);
    if(dest_len<len) {
        len=dest_len;
    }
    if(dest_pt!=0) {
        *dest_pt=len;
    }
    if(dest!=0) {
        strncpy((char*)dest, s, len);
        dest[len]=0;
    }
}

void returnInt(SQLPOINTER InfoValue, SQLINTEGER* LengthPtr, SQLUINTEGER value) {
    if(LengthPtr!=0) {
        *LengthPtr=sizeof(SQLUINTEGER);
    }
    *((SQLUINTEGER*)InfoValue)=value;
}

void returnInt(SQLPOINTER NumericPtr, int value) {
    if(NumericPtr != 0) {
        *(SQLUINTEGER*)NumericPtr = value;
    }
}

void returnInt(SQLSMALLINT* pointer, int value) {
    if(pointer != 0) {
        *pointer = value;
    }
}

void returnInt(SQLPOINTER InfoValue, SQLSMALLINT* LengthPtr, SQLUINTEGER value) {
    if(LengthPtr!=0) {
        *LengthPtr=sizeof(SQLUINTEGER);
    }
    *((SQLUINTEGER*)InfoValue)=value;
}

void returnSmall(SQLPOINTER InfoValue, SQLINTEGER* LengthPtr, SQLUSMALLINT value) {
    if(LengthPtr!=0) {
        *LengthPtr=sizeof(SQLUSMALLINT);
    }
    *((SQLSMALLINT*)InfoValue)=value;
}

void returnSmall(SQLPOINTER InfoValue, SQLSMALLINT* LengthPtr, SQLUSMALLINT value) {
    if(LengthPtr!=0) {
        *LengthPtr=sizeof(SQLUSMALLINT);
    }
    *((SQLSMALLINT*)InfoValue)=value;
}

void returnPointer(SQLPOINTER pointer, void* value) {
    if(pointer==0) {
        return;
    }
    (*(void**)pointer)=value;
}

int getDefaultCType(int sqlType) {
    switch (sqlType) {
    case SQL_CHAR:
    case SQL_VARCHAR:
    case SQL_LONGVARCHAR:
    case SQL_DECIMAL:
    case SQL_NUMERIC:
    case SQL_GUID:
        return SQL_C_CHAR;
    case SQL_WCHAR:
    case SQL_WVARCHAR:
    case SQL_WLONGVARCHAR:
        return SQL_C_WCHAR;
    case SQL_BIT:
        return SQL_C_BIT;
    case SQL_TINYINT:
        return SQL_C_TINYINT;
    case SQL_SMALLINT:
        return SQL_C_SHORT;
    case SQL_INTEGER:
        return SQL_C_LONG;
    case SQL_BIGINT:
        return SQL_C_SBIGINT;
    case SQL_REAL:
        return SQL_C_FLOAT;
    case SQL_FLOAT:
    case SQL_DOUBLE:
        return SQL_C_DOUBLE;
    case SQL_BINARY:
    case SQL_VARBINARY:
    case SQL_LONGVARBINARY:
        return SQL_C_BINARY;
    case SQL_TYPE_DATE:
        return SQL_C_DATE;
    case SQL_TYPE_TIME:
        return SQL_C_TIME;
    case SQL_TYPE_TIMESTAMP:
        return SQL_C_TIMESTAMP;
    default:
        trace("  unsupported translation from sqlType %d TODO", sqlType);
        return SQL_C_CHAR;
    }
}