interface TlsOptions {
        pfx?: any;   //string or buffer
        key?: any;   //string or buffer
        passphrase?: string;
        cert?: any;
        ca?: any;    //string or buffer
        crl?: any;   //string or string array
        ciphers?: string;
        honorCipherOrder?: any;
        requestCert?: boolean;
        rejectUnauthorized?: boolean;
        NPNProtocols?: any;  //array or Buffer;
        SNICallback?: (servername: string) => any;
    }

interface cassandra_IClientOption {
	contactPoints?:string[];
	keyspace?:string;
	authProvider?:any;
    sslOptions?:TlsOptions;
}

interface cassandra_IlogFunction {
	(level, className, message, furtherInfo):void;
}
interface cassandra_IhostInfo {
	domain:string;
	address:string;
	_events:Object;
	_eventsCount:number;
	unhealthyAt:number;
	cassandraVersion:string;
	datacenter:string;
	rack:string;
	tokens:string;
	reconnectionSchedule:Object;
}
interface cassandra_Imap {
	map:(cb:(IhostInfo:cassandra_IhostInfo)=>void)=>void;
}
interface cassandra_Ihosts {
	slice(num:number):cassandra_Imap;
}
interface cassandra_Iinfo {
	queriedHost:string;
	triedHosts:Object;
	achievedConsistency:number;
	traceId:string;
	warnings:string;
	customPayload:Object;
}
interface cassandra_IRow {
	keyspace_name:string;
	durable_writes:boolean;
	strategy_class:string;
	strategy_options:Object;
}
interface cassandra_IColumns {
	name:string;
	type:Object;
}
interface cassandra_IResultSet {
	info:cassandra_Iinfo;
	rows:any[];
	rowLength:number;
	pageState:Object[];
	columns:cassandra_IColumns[];
}
interface cassandra_IexecStringObj {
	query:string;
	params:any[];
}
interface cassandra_Client {
	new ( IClientOption:cassandra_IClientOption ): cassandra_Client;
	connect ( cb: ( err, result ) => void ): void;
	on ( eventName: string, cb: cassandra_IlogFunction );
	hosts: cassandra_Ihosts;
    shutdown: (callback?: () => void ) => void;
	execute ( execString: string, cb: ( err: Error, result: cassandra_IResultSet ) => void ): void;
	execute ( execString: string, parament:any [], cb: ( err:Error, result:cassandra_IResultSet ) => void ): void;
	execute ( execString: string, parament: any [], option: Object, cb: ( err:Error, result: cassandra_IResultSet ) => void ):void;
	batch ( execStringObj: cassandra_IexecStringObj [], parament: any, cb: ( err:Error ) => void): void;
    eachRow ( execString: string, parament:any [], dataCallBack: ( n: number, data: any ) => void, errCallBack: ( err:Error ) => void ): void;
}
interface cassandra_IBigDecimal {
	new (unscaledValue:number, scale:number);
	fromBuffer(buff:Buffer):cassandra_IBigDecimal;
	fromNumber(value:number):cassandra_IBigDecimal;
	fromString(value:string):cassandra_IBigDecimal;
}
interface cassandra_IInteger {
	constructor(bits:number[], sign:number);	//Array containing the bits of the number.
}

interface cassandra_Iauth {
	PlainTextAuthProvider:cassandra_IPlainTextAuthProvider;
}
interface cassandra_IPlainTextAuthProvider {
	new (user:string, password:string);
}
interface cassandra_ITimeUuid {
	now: () => cassandra_ITimeUuid;
    getBuffer: () => Buffer;
	fromDate: ( date: Date | String, ticks ?: number, nodename ?: string, clock?: string) => cassandra_ITimeUuid;
	getDate: () => Date;
	fromString: ( text: string ) => cassandra_ITimeUuid;
    getNodeId: () => Buffer;
    getNodeIdString: () => string;
    inspect: () => string;
    toJSON: () => JSON;
    toString: () => string;
    equals: ( uuid: UuidTypes ) => boolean;
    min: () => cassandra_ITimeUuid;
    max: () => cassandra_ITimeUuid;
}
interface UuidTypes {
	random:()=>UuidTypes;
	fromString:(fromString:string)=>UuidTypes;
	toString:()=>string;
}
interface cassandra_types {
	Uuid:UuidTypes;
	BigDecimal:cassandra_IBigDecimal;
	Integer:cassandra_IInteger;
	TimeUuid:cassandra_ITimeUuid;
}
interface cassandra_IexecCommand {
	Client:cassandra_Client;
	auth:cassandra_Iauth;
	types:cassandra_types
}


	
declare module "cassandra-driver" {
	let execCommand:cassandra_IexecCommand;
	export = execCommand;
}	


