our
$VERSION
=
'1.10'
;
has
node
=> (
is
=>
'ro'
,
required
=> 1,
isa
=>
sub
{
blessed
$_
[0] &&
$_
[0]->isa(
'XML::LibXML::Element'
);
},
);
has
table
=> (
is
=>
'ro'
,
required
=> 1,
isa
=>
sub
{
blessed
$_
[0] &&
$_
[0]->isa(
'MySQL::Workbench::Parser::Table'
);
},
);
sub
BUILD {
my
$self
=
shift
;
$self
->_parse;
}
has
name
=> (
is
=>
'rwp'
);
has
id
=> (
is
=>
'rwp'
);
has
length
=> (
is
=>
'rwp'
);
has
datatype
=> (
is
=>
'rwp'
);
has
precision
=> (
is
=>
'rwp'
);
has
not_null
=> (
is
=>
'rwp'
);
has
autoincrement
=> (
is
=>
'rwp'
);
has
default_value
=> (
is
=>
'rwp'
);
has
comment
=> (
is
=>
'rwp'
);
has
type_info
=> (
is
=>
'rwp'
);
has
flags
=> (
is
=>
'rwp'
);
sub
as_hash {
my
$self
=
shift
;
my
%info
;
for
my
$attr
(
qw(name length datatype precision not_null autoincrement default_value comment)
) {
$info
{
$attr
} =
$self
->
$attr
();
}
return
\
%info
;
}
sub
as_string {
my
(
$self
) =
@_
;
my
$info
=
sprintf
"%s %s%s%s%s%s"
,
$self
->name,
$self
->datatype,
(
$self
->
length
> 0 ?
"("
.
$self
->
length
.
")"
:
''
),
(
$self
->not_null ?
' NOT NULL'
:
''
),
(
$self
->autoincrement ?
' AUTOINCREMENT'
:
''
),
$self
->default_value;
return
$info
;
}
sub
_parse {
my
$self
=
shift
;
my
$node
=
$self
->node;
my
$id
=
$node
->findvalue(
'@id'
);
$self
->_set_id(
$id
);
for
my
$key
(
qw(name length precision comment)
) {
my
$value
=
$node
->findvalue(
'./value[@key="'
.
$key
.
'"]'
);
my
$method
=
$self
->can(
'_set_'
.
$key
);
$self
->
$method
(
$value
);
}
my
$datatype_internal
=
$node
->findvalue(
'./link[@struct-name="db.SimpleDatatype" or @struct-name="db.UserDatatype"]'
);
my
$datatype
=
$self
->table->get_datatype(
$datatype_internal
);
$self
->_set_datatype(
$datatype
->{name} );
$self
->_set_type_info(
$datatype
);
$self
->_set_length(
$datatype
->{
length
} )
if
$datatype
->{
length
};
$self
->_set_precision(
$datatype
->{precision} )
if
$datatype
->{precision};
my
%flags
=
map
{
my
$flag
=
lc
$_
->textContent;
$flag
=> 1;
}@{
$node
->findnodes(
'./value[@key="flags"]/value'
) || [] };
$self
->_set_flags( \
%flags
);
my
$not_null
=
$node
->findvalue(
'./value[@key="isNotNull"]'
);
$self
->_set_not_null(
$not_null
);
my
$auto_increment
=
$node
->findvalue(
'./value[@key="autoIncrement"]'
);
$self
->_set_autoincrement(
$auto_increment
);
my
$default
=
$node
->findvalue(
'./value[@key="defaultValue"]'
);
$self
->_set_default_value(
$default
);
}
1;