예제 #1
0
파일: datum.php 프로젝트: wikimedia/avro
 /**
  *
  * @param AvroSchema $writers_schema
  * @param AvroSchema $readers_schema
  * @return boolean true if the schemas are consistent with
  *                  each other and false otherwise.
  */
 static function schemas_match($writers_schema, $readers_schema)
 {
     $writers_schema_type = $writers_schema->type;
     $readers_schema_type = $readers_schema->type;
     if (AvroSchema::UNION_SCHEMA == $writers_schema_type || AvroSchema::UNION_SCHEMA == $readers_schema_type) {
         return true;
     }
     if ($writers_schema_type == $readers_schema_type) {
         if (AvroSchema::is_primitive_type($writers_schema_type)) {
             return true;
         }
         switch ($readers_schema_type) {
             case AvroSchema::MAP_SCHEMA:
                 return self::attributes_match($writers_schema->values(), $readers_schema->values(), array(AvroSchema::TYPE_ATTR));
             case AvroSchema::ARRAY_SCHEMA:
                 return self::attributes_match($writers_schema->items(), $readers_schema->items(), array(AvroSchema::TYPE_ATTR));
             case AvroSchema::ENUM_SCHEMA:
                 return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR));
             case AvroSchema::FIXED_SCHEMA:
                 return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR, AvroSchema::SIZE_ATTR));
             case AvroSchema::RECORD_SCHEMA:
             case AvroSchema::ERROR_SCHEMA:
                 return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR));
             case AvroSchema::REQUEST_SCHEMA:
                 // XXX: This seems wrong
                 return true;
                 // XXX: no default
         }
         if (AvroSchema::INT_TYPE == $writers_schema_type && in_array($readers_schema_type, array(AvroSchema::LONG_TYPE, AvroSchema::FLOAT_TYPE, AvroSchema::DOUBLE_TYPE))) {
             return true;
         }
         if (AvroSchema::LONG_TYPE == $writers_schema_type && in_array($readers_schema_type, array(AvroSchema::FLOAT_TYPE, AvroSchema::DOUBLE_TYPE))) {
             return true;
         }
         if (AvroSchema::FLOAT_TYPE == $writers_schema_type && AvroSchema::DOUBLE_TYPE == $readers_schema_type) {
             return true;
         }
         return false;
     }
 }