что-то вроде этого (код не проверен)
Код:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.contract.bean.ContractParamUtils;
import bitel.billing.server.contract.bean.ContractUtils;
import bitel.billing.server.util.TimeUtils;
import bitel.billing.server.util.Utils;
mid = 0; //код dialup модуля
dealerGroup = 0; //группа договоров дилеры
unsetGroup = 0; //группа договоров непривязанные
paramRegexpFromNumber = 0; //параметр договора дилера - regexp для from_number
paramDealerCid = 0; //параметр договора - ссылка на договор дилера
now = new java.util.GregorianCalendar();
now.set( java.util.Calendar.DATE, -1 );
tableName = Utils.getModuleMonthTableName( "log_session", now, mid );
cpu = new ContractParamUtils( con );
selectContractPS = con
.prepareStatement( "SELECT id, title FROM contract WHERE (gr&(1<<?))>0" );
dealerMap = new HashMap();
print( "Select dealers:" );
selectContractPS.setInt( 1, dealerGroup );
selectContractRS = selectContractPS.executeQuery();
while( selectContractRS.next() )
{
cid = selectContractRS.getInt( 1 );
title = selectContractRS.getString( 2 );
regexp = cpu.getStringParam( cid, paramRegexpFromNumber );
dealerMap.put( cid, java.util.regex.Pattern.compile( regexp ) );
print( title + ": " + regexp );
}
selectContractRS.close();
print( "Set dealer by from_number:" );
selectLoginsPS = con.prepareStatement( "SELECT id FROM user_login_" + mid + " WHERE cid=?" );
selectContractPS.setInt( 1, unsetGroup );
selectContractRS = selectContractPS.executeQuery();
while( selectContractRS.next() )
{
cid = selectContractRS.getInt( 1 );
title = selectContractRS.getString( 2 );
print( "Processing " + title );
logins = new StringBuilder();
selectLoginsPS.setInt( 1, cid );
selectLoginsRS = selectLoginsPS.executeQuery();
while(selectLoginsRS.next())
{
logins.append( selectLoginsRS.getInt( 1 ) );
logins.append( "," );
}
selectLoginsRS.close();
if( logins.length() > 0 )
{
logins.setLength( logins.length() - 1 );
}
else
{
print( "Logins not found!" );
continue;
}
selectFromNumberPS = con.prepareStatement( "SELECT from_number FROM " + tableName
+ " ORDER BY session_start WHERE lid IN (" + logins + ") LIMIT 0,1" );
rs = selectFromNumberPS.executeQuery();
if( rs.next() )
{
fromNumber = rs.getString( 1 );
iter = dealerMap.entrySet().iterator();
while( iter.hasNext() )
{
e = iter.next();
pattern = e.getValue();
dealerCid = e.getKey();
if( pattern.matcher( fromNumber ).matches() )
{
//устанавливаем параметр-ссылку на договор дилера
ps = con.prepareStatement( "UPDATE contract_parameter_type_8 SET val=? WHERE cid=? AND pid=?" );
ps.setInt( 1, dealerCid );
ps.setInt( 2, cid );
ps.setInt( 3, paramDealerCid );
if( ps.executeUpdate() == 0 )
{
ps.close();
ps = con.prepareStatement( "INSERT INTO contract_parameter_type_7 (cid, pid, val) VALUES(?, ?, ?)" );
ps.setInt( 1, cid );
ps.setInt( 2, paramDealerCid );
ps.setInt( 3, dealerCid );
ps.executeUpdate();
}
ps.close();
cpu.unsetGroup( cid, unsetGroup ); //убираем договор из группы непривязанные
break;
}
}
}
selectFromNumberPS.close();
}