// JScript source code





var acCommandText = 1  // Evaluates CommandText as a textual definition of a command or stored procedure call.
var adExecuteNoRecords = 0x80 // Indicates that the command text is a command or stored procedure that does not return rows (for example, a command that only inserts data). If any rows are retrieved, they are discarded and not returned. adExecuteNoRecords can only be passed as an optional parameter to the Command or Connection Execute method
var adConnectUnspecified = -1 // Default. Opens the connection synchronously. 




//
//	prevede cas ve formatu YYYYMMDDHHMMss do jscript dattumu
function DateString2Date( s )
{
//	WriteToLog(s)
	//				yyyy			MM				DD			HH				mm			ss	
	return new Date(s.substr(0,4),s.substr(4,2)-1,s.substr(6,2),s.substr(8,2),s.substr(10,2),s.substr(12,2))
}










///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//				funkce pro praci s databazi
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var acCommandText = 1  // Evaluates CommandText as a textual definition of a command or stored procedure call.
var adExecuteNoRecords = 0x80 // Indicates that the command text is a command or stored procedure that does not return rows (for example, a command that only inserts data). If any rows are retrieved, they are discarded and not returned. adExecuteNoRecords can only be passed as an optional parameter to the Command or Connection Execute method



function Date2SQL( d )
{
	
	var d2 = new Date(d)
	var s
	//"CONVERT(DATETIME, '2003-03-01 00:00:00', 102)"
	s = d2.getFullYear() + "-" + (d2.getMonth()  +1)+"-" + d2.getDate()  + " " +d2.getHours () + ":" + d2.getMinutes () + ":" + d2.getSeconds ()
	s = "CONVERT(DATETIME, '" + s +"', 102)"
	return s
}

function JString2Sql( v )
{
	var tmpx = new Number( v )
//	if ( isNaN ( tmpx ) )   // nefungoval pak update xxx set varcharsloupec = 123
		return "'" + v.replace ("'","''")	+"'"
//	else
//		return tmpx					
}

function Values2SQL_tmp(v ,nameOfItemOptional,strTable)
{
		var ret 
			var mytmpx 
			try
			{
//				WriteToLog("type " + TablesInfo[strTable][nameOfItemOptional].type.toLowerCase()  )
				if ( nameOfItemOptional != null )
				if ( -1 < TablesInfo[strTable][nameOfItemOptional].type.toLowerCase().indexOf("varchar") )
				mytmpx = "'" + mytmpx.toString () +"'"
			}
			catch (ewasda) 
			{
				WriteToLog("error " + ewasda.description)
			}				
			if ( mytmpx != null)
				v = mytmpx				
			ret = v
			return ret
			

}
function Values2SQL( v ,nameOfItemOptional,strTable)
{
	
	if ( v == null ) return "NULL"
	var dbg 
	var ret
//	WriteToLog("ti " + v + " " + TablesInfo[strTable][nameOfItemOptional].type + " " + nameOfItemOptional)

	switch (typeof  v  )
	{
		case "object"  :
			if ( v.constructor == Date )
				ret = Date2SQL(v)
			if ( v.constructor == String )
				ret =  JString2Sql (v)
			if ( v.constructor == Number)
				ret = Values2SQL_tmp ( v ,nameOfItemOptional ,strTable )
			if ( v.constructor == Boolean)
				if ( v ) ret = -1
				else  ret = 0
			break;
		case  "date":
			ret = Date2SQL(v)
			break;
		case  "boolean":
			if ( v ) ret = -1
			else  ret = 0
			break;
		case "string":
				ret = JString2Sql ( v )
				break
		case "number":
			ret = Values2SQL_tmp ( v , nameOfItemOptional , strTable )
			break
		case "array":
			ret = "'" + parseObject(v) + "'" 
			break;
		case "undefined" :
			ret =  "NULL"
			break						
	
	}
	return ret
//	WriteToLog(typeof v + " action missing. " + v  + " " +dbg )
}

var createtable_varchar = 50
function JScriptType2SqlType( data )
{
	if ( data ==  null )
		return "[varchar] ("+createtable_varchar+")"
//	WriteToLog( typeof data  + " " + data )		
	switch ( typeof data )
	{
		case "string" : 
			if ( isNaN( Number( data) ) ) 	return "[varchar] ("+createtable_varchar+")"
			else 	return "[float]"				
		case "number" : return "[float]"
		case "object" :
		{
			if (data.constructor == Date)
				return "[datetime]"
			if (data.constructor == String)
			{
				if ( isNaN( Number( data) ) ) 	return "[varchar] ("+createtable_varchar+")"
				else 	return "[float]"				
			}
		}
		case "date" :
		{
			return "[datetime]"
		}
		case "undefined":
		case "unknow":
	
	}
	return "[varchar] ("+createtable_varchar+")"
	
}
function CreateSqlTable( table,object,PrimaryIndex)
{
	var sql2 = "( [id] [bigint] IDENTITY (1, 1) NOT NULL "
	for ( item in object )
	{
		var x = "[" + item +"]" + JScriptType2SqlType( object[item] ) 
		if ( item == PrimaryIndex ) x = x + " PRIMARY KEY"
		else x = x + " NULL"
		if ( sql2 == null )		sql2= "(" + x
		else		sql2 = sql2 + ", "  + x
	}
	if ( sql2 != null ) sql2 =sql2+ ")"
	sql =  "CREATE TABLE ["+table+"] " + sql2

	WriteToLog(sql)
	connection .Execute ( sql,0,adExecuteNoRecords )
}


function InsertArrayOfObjectsToTable(array, strTable  , ColumnPrimaryIndex)
{
	for ( var i in array )
	{
		InsertObjectToTable ( array[i] , strTable,ColumnPrimaryIndex )
	}
}

// -- alter  table Win32_ComputerSystem add DNSHostName varchar (255) null 
// to by chtelo nejak zabudovat

// vratiit do pole. if (  neni v poli , je spatmy typ ) rak alter table 
// select from syscolumns
//Select --* 
//syscolumns.name,sysobjects.name 
//from syscolumns,sysobjects 
//where syscolumns.id = sysobjects .id




var AlterColumn_bool = false
function AlterColumn(strTable,column,value)
{
	if ( ! AlterColumn_bool ) return
//	stop	
	//if ( (TablesInfo[strTable][column].type.toLowerCase() != "varchar" ) ||  ( TablesInfo[strTable][column].length < value.length ) )
	//WriteToLog( column,value, value.length,  TablesInfo[strTable][column].type.toLowerCase() ,  TablesInfo[strTable][column].type.toLowerCase() .indexOf("varchar") ,  TablesInfo[strTable][column].length )
	if ( (TablesInfo[strTable][column].type.toLowerCase() .indexOf("varchar") > -1 ) &&  ( TablesInfo[strTable][column].length <= value.length ) )
	{
		if ( 997 < value.length )
		{
			WriteToLog( "truncating length " + value.length )
			value = value.substring(0,990)
		}						 
		WriteToLog ( "Resize column " + column  )
		strSql = "alter table " + strTable + " ALTER COLUMN [" + column + "] varchar( "+ ( value.length + 3 ) + ")"
		WriteToLog( strSql )
		connection.Execute ( strSql )
		TablesInfo = GetTablesInfo()
	}
}

function InsertObjectToTable(object, strTable  , ColumnPrimaryIndex)
{
		sql_Init()
		if ( TablesInfo[strTable] == null )
		{
			CreateSqlTable(strTable,object,ColumnPrimaryIndex)
			TablesInfo = GetTablesInfo()
		}
		var strSql
		var strValues 
		var strFieldList
		var strUpdate
		for ( item in object )
		{
			if ( TablesInfo[strTable][item] == null )
			{
				WriteToLog ( "Column doesn`t exist " + item )
				strSql = "alter table " + strTable + " add  [" + item + "] " +  JScriptType2SqlType(object[item])
				WriteToLog ( strSql )
				connection .Execute (  strSql )
				TablesInfo = GetTablesInfo()
			}
			
			if ( typeof object[item] == "string" )
			if ( isNaN( Number( object[item] ) ) )
				AlterColumn(strTable,item,String(object [item]) )
			if ( object[item] != null )
			if ( typeof object[item] == "object" )
			if ( object[item].constructor == String )
			if ( isNaN( Number( object[item] ) ) )				
				AlterColumn(strTable,item,String(object [item]) )
				
//			if ( Values2SQL(object[item]) != null )
			{
				if ( strFieldList == null )		strFieldList = "(" + "[" + item + "]"
				else		strFieldList = strFieldList + ", ["  + item + "]"
				if ( strValues == null ) 	strValues = "(" + Values2SQL ( object[item],item,strTable)
				else			strValues = strValues + ", "  + Values2SQL ( object[item],item,strTable)
			}				
		}
		if ( strFieldList != null ) 	strFieldList = strFieldList + ")"
		if ( strValues != null ) 	strValues = strValues + ")"
		
		strSql = "INSERT INTO " + strTable + " " + strFieldList + " VALUES " + strValues 
		WriteToLog ( strSql )
		try
		{
		connection.Execute ( strSql ,0,adExecuteNoRecords )
		}
		catch ( e )
		{
			{
				//UPDATE titles
				//SET price = price * 1.1
				//WHERE (pub_id = '0766')
				
				if ( typeof ColumnPrimaryIndex  != "undefined" )
				{
					var strSet,x
					for ( item in object )
					{
						x = null
						x = Values2SQL( object[item] ,item,strTable)
						if ( x != null )
						{
							x = "[" + item + "]=" + Values2SQL( object[item] ,item,strTable)
							if ( strSet == null )		strSet= x
							else		strSet = strSet + ", "  + x
						}
					}
		
					var str2 = "UPDATE " + strTable + " SET "  + strSet + " WHERE  [" +ColumnPrimaryIndex +"] = "+   Values2SQL ( object[ ColumnPrimaryIndex ] ,item,strTable) 
					WriteToLog ( str2 )
					connection.Execute ( str2,0,adExecuteNoRecords )
				}
				else
				{
					throw e
				}
			}
			
		}
}



function UpdateTable(object,strTable, WhereIndex )
{
		//UPDATE titles
		//SET price = price * 1.1
		//WHERE (pub_id = '0766')
		sql_Init()
		
			var strSet,x
			for ( item in object )
			{
				x = null
				x = Values2SQL( object[item] ,item,strTable)
				if ( x != null )
				{
					x = "[" + item + "]=" + Values2SQL( object[item] ,item,strTable)
					if ( strSet == null )		strSet= x
					else		strSet = strSet + ", "  + x
				}
			}
			var str2 = "UPDATE " + strTable + " SET "  + strSet + " WHERE  [" +WhereIndex +"] = "+   Values2SQL ( object[ WhereIndex ] ,WhereIndex,strTable) 
			WriteToLog ( str2 )
			connection.Execute ( str2,0,adExecuteNoRecords )
}
function SelectObjectFromTable(strSql,RecordsAffected)
{
		sql_Init()
		var str2 = strSql

		WriteToLog ( str2 )
//		var rs  = new ActiveXObject( "ADODB.RecordSet")
try
{
		rs = connection.Execute ( str2,RecordsAffected)
		}
		catch ( e ){}
		var rets = new Array()
		var isOpen = false // jak se jmenuke ten priznak, ktery urcuje jestli je rs otevreny nebo zavreny ?
		try 
		{
			isOpen = rs.EOF // tady to vyhazuje chybu, kdyz rs je zavrenu
			isOpen = true
		}
		catch ( e ) 
		{
			isOpen = false
		}
		
		
		if ( isOpen )
		{
			var ret 
			while (  ! rs.EOF  )
			{
				for ( var i  = 0 ; i < rs.Fields .Count ; i++ ) 
				{
					if ( ret == null ) ret = new Object()
					// taky muze byt jenom  rs(i).Value  -- nejaka automaticka syntexe
//					WriteToLog ( rs.Fields.Item(i).Name  + " " + rs.Fields.Item(i).Value )
					ret[rs.Fields.Item(i).Name ] = rs.Fields.Item(i).Value
				}	
				if ( ret != null ) 	rets[rets.length ] = ret
				ret = null
				rs.MoveNext ()
			}			
			rs.close()
		}
		if ( rets.length )	WriteToLog("returned " + rets.length + " rows.")
		return rets
}



// vrati pole zaznamu z database . zaznam je ve forme objektu
//object... maska objektu
//objectWhere  .. kriterim pro vyber
//strWhere .. nepovinny zaznam pro jiny Where




var InsertObjectToFile_values = new Object()
var InsertObjectToFile_header = true
function InsertObjectToFile(object, strFile )
{
		WriteToLog( strFile)
		if ( InsertObjectToFile_values [strFile] == null )
		{
			WriteToLog( "fso.OpenTextFile (strFile,ForWriting ,true) " + strFile )
			InsertObjectToFile_values [strFile] = fso.OpenTextFile (strFile,ForWriting ,true)
			if ( InsertObjectToFile_header )
			{
			  var strFields 
			  for ( var item in object )
					if ( strFields  == null ) strFields  =  item
					else strFields  = strFields  + ";" + item
				InsertObjectToFile_values [strFile].WriteLine(strFields )			
			}				
		}			
		var strValues
		for ( var item in object )
			if ( strValues == null ) 		strValues = object[item]
			else 		strValues = strValues + ";" + object[item]
		InsertObjectToFile_values [strFile].WriteLine(strValues)			
}


///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////


var connection
var connection_ConnectionString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=SystemsMonitorings;Trusted_Connection=yes" 
var TablesInfo
function sql_Init(ConnectionString)
{
	if (ConnectionString == null) 
		ConnectionString = connection_ConnectionString 
	if ( connection  == null )
	{
		WriteToLog( ConnectionString )
		connection = new ActiveXObject("ADODB.Connection")
		connection .Open (ConnectionString )
		TablesInfo = GetTablesInfo()
	}
	
}
function sql_Done()
{	
	if ( connection != null ) connection.Close () 		
	if ( InsertObjectToFile_values != null )
		for ( var item in InsertObjectToFile_values )
		{
			WriteToLog("Close file "+item)
			InsertObjectToFile_values [item].close()
		}			
}

///////////////////////////////////////////////////////////////////////////////////


function CColumnInfo( row )
{
//	this.column = row["syscolumns.name"]
	this.type = row["systypes.name"]
	this.length = row["syscolumns.length"]
	this.isnullable = row["syscolumns.isnullable"]
}

function GetTablesInfo()
{
	var rows = SelectObjectFromTable ( "Select  sysobjects.name as [sysobjects.name] ,syscolumns.name as [syscolumns.name],systypes.name as [systypes.name],syscolumns.length as [syscolumns.length], syscolumns.isnullable as [syscolumns.isnullable] from syscolumns,sysobjects,systypes  where syscolumns.id = sysobjects.id and syscolumns.xtype = systypes.xtype and sysobjects.xtype = 'U' and systypes.name <> 'sysname'" )
	var tables = new Object()
	for ( var item in rows )
	{
//		WriteToLog(parseObject(rows[item]))
		var NameOfTable = rows[item]["sysobjects.name"]  
		var NameOfColumn = rows[item]["syscolumns.name"]
		if ( tables[NameOfTable] == null ) 
			tables[ NameOfTable ] = new Object() // { "column" : rows[item]["syscolumns.name"]  // new CRowInfo(  rows[item][item2] )
		tables[NameOfTable ][NameOfColumn]  = new CColumnInfo ( rows[item] )

	}
	return tables

}

function sql()
{
	connection_ConnectionString  = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=SystemsMonitorings;Trusted_Connection=yes" 
	
//	rows = SelectObjectFromTable2 ( "select * from sysobjects")
//	rows = SelectObjectFromTable2 ( "Select syscolumns.name as [syscolumns.name],sysobjects.name as [sysobjects.name] from syscolumns,sysobjects where syscolumns.id = sysobjects.id" )

// informace o tabulkach a jejich sloupcich
	TablesInfo = GetTablesInfo()
	var tables = TablesInfo

	for ( var table in tables)
	{
		WScript.Echo ( table )
		for ( var column in tables[table] )
		{
			WScript.Echo( " " + column  )
			for ( var item in tables[table][column] )
				WScript.Echo ( "  " + item + " " + tables[table][column][item] )
		}				
	}
	
}

