СОЛО на клавиатуре

вторник, февраля 21, 2006

Транслитерация в ECO III

Так про транслитерацию.
Проблема:
1. при генерации базы данных из схемы, которая содержит русские символы происходит ошибка SQL которая говорит о том что база не позволяет создавать имена на национальных языках.
С подобной проблемой сталкивались и в Болд.
Задача: обнаружить и обезвредить проблемы в работе с NLS – сделать компонент или тулзу для транслитерации.
Обнаружено следующее:
1. при нажатии кнопки «Generate Schema» - вызывается метод соответствующего маппера базы данных.
public override void Execute(ExecuteArgs executeArgs)
{
if (executeArgs == null)
{
throw new ArgumentNullException("executeArgs");
}
try
{
PersistenceMapperDb db1 = DBToolBase.GetPersistenceMapper(executeArgs, PersistenceStringRes.sOperationCreateDatabase, false);
if (db1 != null)
{
ITypeSystemService service1 = DBToolBase.GetTypeSystemService(executeArgs);
db1.CreateDataBaseSchema(service1, new FormBasedConfigureCleanPS(executeArgs.ServiceProvider));
MessageHelper.AddMessage(PersistenceStringRes.sSchemaGenerationCaption, PersistenceStringRes.sSchemaCreated);
}
else
{
MessageHelper.AddMessage(PersistenceStringRes.sNoPMapper);
}
}
catch (Exception exception1)
{
MessageHelper.AddMessage(PersistenceStringRes.sSchemaGenerationCaption, exception1.ToString());
}
}
Далее генерируем базу db1 имеет тип PersistenceMapperDB.
public void CreateDataBaseSchema(ITypeSystemService typeSystemService)
{
this.CreateDataBaseSchema(typeSystemService, new DefaultCleanPsConfig(false));
}
public void CreateDataBaseSchema(ITypeSystemService typeSystemService, IConfigureCleanPS configureCleanPS)
{
if (configureCleanPS == null)
{
throw new ArgumentNullException("configureCleanPS");
}
if (typeSystemService == null)
{
throw new ArgumentNullException("typeSystemService");
}
IDatabase database1 = null;
try
{
database1 = this.m_ConnectionPool.RetrieveDatabaseConnection(true);
this.EffectiveNewMappingProvider.Initialize(typeSystemService.TypeSystem, null, database1.Config, true);
this.EffectiveNewMappingProvider.Mapping.Validate(database1.Config, typeSystemService.TypeSystem);
this.EffectiveOldMappingProvider.Initialize(null, null, database1.Config, false);
string text1 = this.GetNewDbName();
base.PersistenceHandleDb.CreateDataBaseSchema(typeSystemService, PersistenceMapperDb.GetDatabaseCollection(database1, text1), text1, this.EffectiveNewMappingProvider, this.EffectiveOldMappingProvider, configureCleanPS);
}
finally
{
if (database1 != null)
{
database1.Close();
this.m_ConnectionPool.ReturnDatabaseConnection(database1);
}
}
}

ORMapper должен реализовать интерфейс
public interface IORMappingProvider
{
// Methods
void Initialize(IEcoTypeSystem typeSystem, IDatabase db, SqlDatabaseConfig config, bool addMissingTypes);
void PostCreateDb(IDatabase db, SqlDatabaseConfig sqlDatabaseConfig, ORMappingDefinition newMapping);
void PostEvolveDb(IDatabase db, SqlDatabaseConfig sqlDatabaseConfig, ORMappingDefinition newMapping);
void SaveMappingInfo(IDatabase db, SqlDatabaseConfig sqlDatabaseConfig, ORMappingDefinition newMapping);
StringCollection SystemTableNames(SqlDatabaseConfig config);

// Properties
ORMappingDefinition Mapping { get; }
}
Имеет три реализации этого интерфейса
DBMapperProvider
DefaultORMappingBuilder
FileMappingProvider

Так все станосится очень интересно
DBMapperProvider – складывает инфу о маппинге в базу и позволяет работать с ним.
FileMappingProvider – хранит инфу о маппинге в файле.
DefaultORMappingBuilder – как раз делает все что нам и нужно делает маппинг.

Комментариев нет: