📄 log_i.cpp
字号:
notifier_->capacity_alarm_threshold_value_change (log.in (),
logid_,
old_threshs,
threshs
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
DsLogAdmin::WeekMask*
TAO_Log_i::get_week_mask (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
DsLogAdmin::WeekMask* ret_val;
ACE_NEW_THROW_EX (ret_val,
DsLogAdmin::WeekMask (this->weekmask_),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
return ret_val;
}
void
TAO_Log_i::set_week_mask (const DsLogAdmin::WeekMask &masks
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidTime,
DsLogAdmin::InvalidTimeInterval,
DsLogAdmin::InvalidMask))
{
for (CORBA::ULong i = 0; i < masks.length (); ++i)
{
if (masks[i].days > (DsLogAdmin::Sunday +
DsLogAdmin::Monday +
DsLogAdmin::Tuesday +
DsLogAdmin::Wednesday +
DsLogAdmin::Thursday +
DsLogAdmin::Friday +
DsLogAdmin::Saturday)
)
ACE_THROW (DsLogAdmin::InvalidMask ());
for (CORBA::ULong j = 0; j < masks[i].intervals.length (); ++j)
{
if (masks[i].intervals[j].start.hour > 23 ||
masks[i].intervals[j].start.minute > 59 ||
masks[i].intervals[j].stop.hour > 23 ||
masks[i].intervals[j].stop.minute > 59)
ACE_THROW (DsLogAdmin::InvalidTime ());
if (masks[i].intervals[j].stop.hour <
masks[i].intervals[j].start.hour)
ACE_THROW (DsLogAdmin::InvalidTimeInterval ());
if (masks[i].intervals[j].stop.hour ==
masks[i].intervals[j].start.hour &&
masks[i].intervals[j].stop.minute <=
masks[i].intervals[j].start.minute)
ACE_THROW (DsLogAdmin::InvalidTimeInterval ());
}
}
DsLogAdmin::WeekMask old_masks;
old_masks = weekmask_;
DsLogAdmin::TimeInterval temp_interval;
CORBA::ULong count = 0;
weekly_intervals_.length (100);
// convert the weekmask into a sequence of time intervals.
for (CORBA::ULong k = 0; k < masks.length (); ++k)
{
for (CORBA::ULong j = 0; j < masks[k].intervals.length (); ++j)
{
for (int d = 0; d < 7; ++d)
{
if ( (1 << d) & masks[k].days)
{
temp_interval.start =
CORBA::ULongLong (
(d * 3600* 24) +
(masks[k].intervals[j].start.hour * 3600) +
(masks[k].intervals[j].start.minute * 60)) * 10000000;
temp_interval.stop =
CORBA::ULongLong (
(d * 3600* 24) +
(masks[k].intervals[j].stop.hour * 3600) +
(masks[k].intervals[j].stop.minute * 60)) * 10000000;
weekly_intervals_[count] = temp_interval;
++count;
}
}
}
}
weekly_intervals_.length (count);
//TODO: SORT AND CLEAN
if (notifier_)
{
DsLogAdmin::Log_var log =
this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
notifier_->week_mask_value_change (log.in (),
logid_,
old_masks,
masks
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
DsLogAdmin::RecordList*
TAO_Log_i::query_i (const char *constraint,
DsLogAdmin::Iterator_out &iter_out,
CORBA::ULong how_many
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidConstraint))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Use an Interpreter to build an expression tree.
TAO_Log_Constraint_Interpreter interpreter (constraint
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Sequentially iterate over all the records and pick the ones that
// meet the constraints.
// get the underlying storage.
TAO_LogRecordStore::LOG_RECORD_STORE &store =
this->recordstore_.get_storage ();
// Create an iterator
TAO_LogRecordStore::LOG_RECORD_HASH_MAP_ITER iter (store);
CORBA::ULong len = ACE_static_cast (CORBA::ULong, store.current_size ());
// How many entries?
// Iterate over and populate the list.
TAO_LogRecordStore::LOG_RECORD_HASH_MAP_ENTRY *hash_entry;
DsLogAdmin::RecordList* rec_list;
// Figure out the length of the list.
// Allocate the list of <how_many> length.
ACE_NEW_THROW_EX (rec_list,
DsLogAdmin::RecordList (how_many),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
CORBA::ULong count = 0; // count of matches found.
CORBA::Boolean done = 0; // flag to end "for" operation.
CORBA::ULong i = 0;
for (;
i < len && count < how_many;
++i)
{
if (iter.next (hash_entry) == -1 || iter.advance () == -1)
{
done = 1;
break;
}
// Use an evaluator.
TAO_Log_Constraint_Visitor evaluator (hash_entry->int_id_);
// Does it match the constraint?
if (interpreter.evaluate (evaluator) == 1)
{
if (TAO_debug_level > 0)
#if defined (ACE_LACKS_LONGLONG_T)
ACE_DEBUG ((LM_DEBUG,"Matched constraint! d = %Q, Time = %Q\n",
ACE_U64_TO_U32 (hash_entry->int_id_.id),
ACE_U64_TO_U32 (hash_entry->int_id_.time)));
#else
ACE_DEBUG ((LM_DEBUG,"Matched constraint! d = %Q, Time = %Q\n",
hash_entry->int_id_.id,
hash_entry->int_id_.time));
#endif
(*rec_list)[count] = hash_entry->int_id_;
// copy the log record.
count++;
}
}
rec_list->length (count);
if (i < len && done == 0) // There are more records to process.
{
// Create an iterator to pass out.
TAO_Iterator_i *iter_query = 0;
ACE_NEW_THROW_EX (iter_query,
TAO_Iterator_i (store,
i,
constraint,
len,
how_many),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (rec_list);
// Transfer ownership to the POA.
PortableServer::ServantBase_var safe_iter_query = iter_query;
// Activate it.
iter_out = iter_query->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (rec_list);
}
return rec_list;
}
DsLogAdmin::RecordList*
TAO_Log_i::query (const char *grammar,
const char *constraint,
DsLogAdmin::Iterator_out iter_out
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidGrammar,
DsLogAdmin::InvalidConstraint))
{
this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
return this->query_i (constraint,
iter_out,
this->max_rec_list_len_
ACE_ENV_ARG_PARAMETER);
}
DsLogAdmin::RecordList*
TAO_Log_i::retrieve (DsLogAdmin::TimeT from_time,
CORBA::Long how_many,
DsLogAdmin::Iterator_out iter_out
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Decide between forward vs backward retrieval.
char constraint[32];
char uint64_formating[32];
#if defined (ACE_LACKS_LONGLONG_T)
ACE_OS::sprintf (uint64_formating,
"%u",
ACE_U64_TO_U32 (from_time));
#else
ACE_OS::sprintf (uint64_formating,
ACE_UINT64_FORMAT_SPECIFIER,
from_time);
#endif
if (how_many >= 0)
ACE_OS::sprintf (constraint, "time >= %s", uint64_formating);
else
{
ACE_OS::sprintf (constraint, "time < %s", uint64_formating);
how_many = -(how_many);
}
return this->query_i (constraint,
iter_out,
how_many
ACE_ENV_ARG_PARAMETER);
}
CORBA::ULong
TAO_Log_i::match_i (const char *constraint,
CORBA::Boolean delete_rec
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidConstraint))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Use an Interpreter to build an expression tree.
TAO_Log_Constraint_Interpreter interpreter (constraint
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Get the underlying storage.
TAO_LogRecordStore::LOG_RECORD_STORE &store =
this->recordstore_.get_storage ();
// Create an iterator
TAO_LogRecordStore::LOG_RECORD_STORE_ITER iter (store);
CORBA::ULong len = ACE_static_cast (CORBA::ULong, store.current_size ());
// How many entries?
// Iterate over and populate the list.
TAO_LogRecordStore::LOG_RECORD_HASH_MAP_ENTRY *hash_entry;
CORBA::ULong count = 0; // count of matches found.
for (CORBA::ULong i = 0; i < len; ++i)
{
if (iter.next (hash_entry) == -1 || iter.advance () == -1)
{
break;
}
// Use an evaluator.
TAO_Log_Constraint_Visitor evaluator (hash_entry->int_id_);
// Does it match the constraint?
if (interpreter.evaluate (evaluator) == 1)
{
if (delete_rec == 1)
{
if (this->recordstore_.remove (hash_entry->int_id_.id) == 0)
count++;
}
else
count++;
}
}
return count;
}
CORBA::ULong
TAO_Log_i::match (const char* grammar,
const char *constraint
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidGrammar,
DsLogAdmin::InvalidConstraint))
{
this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
CORBA::ULong count =
this->match_i (constraint, 0 ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (count);
return count;
}
CORBA::ULong
TAO_Log_i::delete_records (const char *grammar,
const char *constraint
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidGrammar,
DsLogAdmin::InvalidConstraint))
{
this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
CORBA::ULong count =
this->match_i (constraint, 1 ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (count);
this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
return count;
}
CORBA::ULong
TAO_Log_i::delete_records_by_id (const DsLogAdmin::RecordIdList &ids
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
CORBA::ULong numdone (0);
for (CORBA::ULong i = 0; i < ids.length (); i++)
{
if (this->recordstore_.remove (ids [i]) == 0)
{
numdone++;
}
}
if (numdone > 0)
{
const CORBA::ULongLong current_size =
this->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
const CORBA::ULongLong max_size =
this->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
if (current_size < max_size)
{
avail_status_.log_full = 0;
}
}
this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
return numdone;
}
void
TAO_Log_i::write_records (const DsLogAdmin::Anys &records
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::LogFull,
DsLogAdmin::LogLocked,
DsLogAdmin::LogDisabled))
{
// create a record list..
DsLogAdmin::RecordList reclist (records.length ());
reclist.length (records.length ());
for (CORBA::ULong i = 0; i < records.length (); ++i)
{
reclist [i].info = records[i];
}
this->write_recordlist (reclist ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
TAO_Log_i::write_recordlist (const DsLogAdmin::RecordList &reclist
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::LogFull,
DsLogAdmin::LogLocked,
DsLogAdmin::LogDisabled))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// Check if the log is on duty
// @@ Wait for Comittee ruling on the proper behavior
DsLogAdmin::AvailabilityStatus avail_stat =
this->get_availability_status (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// Log is not available for writing. Throw specific reason why.
if (avail_stat.off_duty == 1)
{
// why are we off duty? investigate ...
// Check if the log is full.
if (avail_stat.log_full == 1
&& this->log_full_action_ == DsLogAdmin::halt)
{
ACE_THROW (DsLogAdmin::LogFull (0));
}
else // Check the administrative state.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -