1999-08-16 21:50:52 +00:00
|
|
|
/*
|
1999-11-22 20:25:35 +00:00
|
|
|
*******************************************************************************
|
|
|
|
* Copyright (C) 1997-1999, International Business Machines Corporation and *
|
|
|
|
* others. All Rights Reserved. *
|
|
|
|
*******************************************************************************
|
1999-08-16 21:50:52 +00:00
|
|
|
*/
|
|
|
|
//===============================================================================
|
|
|
|
//
|
|
|
|
// File colcache.cpp
|
|
|
|
//
|
|
|
|
// CollationCache implements a persistent in-memory cache for
|
|
|
|
// TableCollationData objects. The goal of CollationCache is to improve
|
|
|
|
// the memory footprint of a process which may have multiple threads
|
|
|
|
// loading up the same TableCollation object. Performance improvement is
|
|
|
|
// strictly a secondary goal.
|
|
|
|
//
|
|
|
|
// Created by: Alan Liu
|
|
|
|
//
|
|
|
|
// Modification History:
|
|
|
|
//
|
|
|
|
// Date Name Description
|
|
|
|
// 2/11/97 aliu Creation.
|
|
|
|
// 2/12/97 aliu Modified to work with TableCollationData.
|
|
|
|
//
|
|
|
|
//===============================================================================
|
|
|
|
|
|
|
|
#include "colcache.h"
|
|
|
|
#include "tcoldata.h"
|
|
|
|
#include "uhash.h"
|
|
|
|
|
|
|
|
#ifdef COLLDEBUG
|
|
|
|
#include <iostream.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
// CollationCache implementation
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
1999-11-16 01:05:10 +00:00
|
|
|
static void U_CALLCONV deleteTCD(void* TCD)
|
1999-08-16 21:50:52 +00:00
|
|
|
{
|
|
|
|
delete (TableCollationData*)TCD;
|
|
|
|
}
|
|
|
|
|
|
|
|
CollationCache::CollationCache()
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode err = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
fHashtable = uhash_open((UHashFunction) uhash_hashUString, &err);
|
|
|
|
uhash_setValueDeleter(fHashtable, deleteTCD);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CollationCache::~CollationCache()
|
|
|
|
{
|
|
|
|
uhash_close(fHashtable);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CollationCache::Add(const UnicodeString& key, TableCollationData* value)
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode err = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
TableCollationData* previous = (TableCollationData*)uhash_putKey(fHashtable, key.hashCode() & 0x7FFFFFFF , value, &err);
|
|
|
|
}
|
|
|
|
|
|
|
|
TableCollationData* CollationCache::Find(const UnicodeString& keyString)
|
|
|
|
{
|
|
|
|
return (TableCollationData*)uhash_get(fHashtable,keyString.hashCode() & 0x7FFFFFFF);
|
|
|
|
}
|
|
|
|
|
|
|
|
//eof
|