Exemplo n.º 1
0
FdoStringP FdoSmPhRdPostGisColumnReader::GetString( FdoStringP tableName, FdoStringP fieldName )
{
    FdoStringP fieldValue;
   if ( fieldName == L"default_value" ) {
        FdoStringP defValue = FdoSmPhRdColumnReader::GetString( tableName, fieldName ); // '2001-10-01 00:00:00'::timestamp without time zone
       if( defValue != NULL && defValue.GetLength() != 0 ) {
            if ( GetType() == FdoSmPhColType_Date )  {
                // reformat the string to the Fdo expected DateTime default format
                fieldValue = defValue = defValue.Left(L"::");  
                if( fieldValue != NULL && fieldValue.GetLength() != 0 )
                    fieldValue = FdoStringP(L"TIMESTAMP ") + defValue;
                else
                    fieldValue = L"";
            }
            else {
                // Remove any type casting at the end of the default value.
                FdoString* defPtr = (FdoString*) defValue;
                for ( int i = (wcslen(defPtr) - 1); i > 0; i-- ) {
                    // Don't remove anything inside brackets or quote delimiters
                    if ( (defPtr[i] == ')')|| (defPtr[i] == '\'') )
                        break;
 
                    // type casting part starts with ::
                    if ( wcsncmp(&defPtr[i], L"::", 2) == 0 ) {
                        defValue = defValue.Mid(0,i);
                        break;
                    }
                }

                fieldValue = defValue;
            }
        } 
    }
    else if ( fieldName == L"size" ) {
        fieldValue = FdoStringP::Format( L"%d", mSize );
    }
    else if ( fieldName == L"scale" ) {
        fieldValue = FdoStringP::Format( L"%d", mScale );
    }
    else {
        fieldValue = FdoSmPhRdColumnReader::GetString( tableName, fieldName );        
    }

    return fieldValue;
}
void SuperMapLpPropertyDefinition::ConvertPhysicalToLogical(UGC::UGFieldInfo* fieldInfo)
{
	if(m_fieldInfo == NULL)
	{
		m_fieldInfo = fieldInfo;
	}
    VALIDATE_POINTER(m_fieldInfo);

	// 逻辑的FDO属性名及为物理数据集的字段名
	//FdoStringP pLogicalPropertyName = fieldInfo->m_strName;
	FdoStringP pLogicalPropertyName = SuperMapUtil::StringToWString(fieldInfo->m_strName.Cstr()).c_str(); //modified by majun, 支持汉字字段
	FdoString* logicalPropertyName = (FdoString*)pLogicalPropertyName;

	FdoString* logicalPropertyDescription = L"";
	
	// 创建逻辑属性
	m_logicalProperty = FdoDataPropertyDefinition::Create(logicalPropertyName, logicalPropertyDescription);

	// 属性字段物理属性转换
	FdoDataType data_type ;
	FdoInt32 nType = fieldInfo->m_nType; // ugc的字段类型
	//TRACE(_T("SuperMapLpPropertyDefinition::ConvertPhysicalToLogical..[%ls]...[%d]\n"), logicalPropertyName, nType);
	switch(nType)
	{
	case UGC::UGFieldInfo::Boolean:
		data_type = FdoDataType_Boolean;
		break;
	case UGC::UGFieldInfo::Byte:
	case UGC::UGFieldInfo::Char:
		data_type = FdoDataType_Byte;
		break;
	case UGC::UGFieldInfo::Integer:
		data_type = FdoDataType_Int16;
		break;
	case UGC::UGFieldInfo::Long:   
		data_type = FdoDataType_Int32;
		break;
	case UGC::UGFieldInfo::Single:
	case UGC::UGFieldInfo::Float:
		data_type = FdoDataType_Single;
		break;
	case UGC::UGFieldInfo::Double:
		data_type = FdoDataType_Double;
		break;
	case UGC::UGFieldInfo::Date:
	case UGC::UGFieldInfo::Time:
		data_type = FdoDataType_DateTime;
		break;
	case UGC::UGFieldInfo::Decimal:
		data_type = FdoDataType_Decimal;
		break;
	case UGC::UGFieldInfo::Binary:
	case UGC::UGFieldInfo::LongBinary:
	case UGC::UGFieldInfo::VarBinary:
	case UGC::UGFieldInfo::TimeStamp:
		data_type = FdoDataType_BLOB;
		break;
	case UGC::UGFieldInfo::Text:
	case UGC::UGFieldInfo::Memo:
	case UGC::UGFieldInfo::NVarChar:
		//data_type = FdoDataType_CLOB;
		data_type = FdoDataType_String; 
		break;
	default:
		return;  //其他可能类型字段暂不转换
	}


	m_logicalProperty->SetDataType(data_type);

	// 如果是字符串类型设置长度
	if (data_type == FdoDataType_String)
	{
		if(fieldInfo->m_nType == UGC::UGFieldInfo::NVarChar)
			m_logicalProperty->SetLength(fieldInfo->m_nSize * 2);
		else
			m_logicalProperty->SetLength(fieldInfo->m_nSize);
	}
		
	// 如果是十进制类型设置位数和精度
	if (data_type == FdoDataType_Decimal)
	{
		m_logicalProperty->SetPrecision(fieldInfo->m_nPrecision);
		m_logicalProperty->SetScale(fieldInfo->m_nScale);
	}

	FdoPtr<FdoClassDefinition> logicalClass = m_parentLpClass->GetLogicalClass(); //各种逻辑属性要加入此类中
		
	FdoPtr<FdoPropertyDefinitionCollection> logicalProperties = logicalClass->GetProperties();

	// 如果有重复字段名返回
	if (logicalProperties->Contains (m_logicalProperty->GetName ())) 
		return;

	// modified by zhouxu 2007-12-18
	// 对Sm开头的字段除了SmUserId以外都设为只读。/ 并且加为逻辑类的标识属性
	if((0 == wcscmp (L"SmGeometry", pLogicalPropertyName)) 
	|| (0 == wcscmp(L"SMGEOMETRY",pLogicalPropertyName))) //modified by zhouxu 2007-12-7 //added by majun ,要素类中去掉SmGeometry字段
	{
		return;
	}
	else if((0 == wcscmp(L"SmUserID", pLogicalPropertyName))
	|| (0 == wcscmp(L"SMUSERID", pLogicalPropertyName)))
	{
		m_logicalProperty->SetReadOnly(false);
		m_logicalProperty->SetIsAutoGenerated(false);	
		m_logicalProperty->SetNullable(false);
		logicalProperties->Add(m_logicalProperty);
	}
	else if((0 == wcscmp(L"Sm", pLogicalPropertyName.Mid(0,2)))
		|| (0 == wcscmp(L"SM", pLogicalPropertyName.Mid(0,2))))
	{
		m_logicalProperty->SetReadOnly(true);//m_logicalProperty->SetReadOnly(true);
		m_logicalProperty->SetIsAutoGenerated(true);
		m_logicalProperty->SetNullable(false);
		//// 作为一个标识属性
		//FdoPtr<FdoDataPropertyDefinitionCollection> pIdentityProperties = logicalClass->GetIdentityProperties();
		//VALIDATE_POINTER(pIdentityProperties);
		logicalProperties->Add(m_logicalProperty);
		//pIdentityProperties->Add(m_logicalProperty);
	}
	else
	{
		m_logicalProperty->SetReadOnly(false);
		m_logicalProperty->SetIsAutoGenerated(false);	
		m_logicalProperty->SetNullable(true);
		logicalProperties->Add(m_logicalProperty);
	}

}