6 package Gruta
::Data
::BASE
;
10 sub fields
{ return (); }
11 sub vfields
{ return (); }
12 sub afields
{ return ($_[0]->fields(), $_[0]->vfields()); }
18 $self->{_source
} = shift;
21 return $self->{_source
};
28 my $id = $self->get('id') || '';
29 $id =~ /^[\d\w_-]+$/ or croak
"Bad id [$id]";
38 my $self = bless({ }, $class);
40 foreach my $k ($self->afields()) {
41 $self->{$k} = $args{$k};
51 croak
'get ' . ref($self) . " field '$field'?" unless exists $self->{$field};
53 return $self->{$field};
60 croak
'set ' . ref($self) . " field '$field'?" unless exists $self->{$field};
62 $self->{$field} = shift;
64 return $self->{$field};
68 package Gruta
::Data
::Topic
;
70 use base
'Gruta::Data::BASE';
72 sub fields
{ return qw(id name editors max_stories internal); }
74 package Gruta
::Data
::Story
;
76 use base
'Gruta::Data::BASE';
80 sub fields
{ return qw(id topic_id title date userid format hits ctime content); }
81 sub vfields
{ return qw(tags abstract body); }
86 $self->SUPER::_assert
();
88 my $topic_id = $self->get('topic_id') || '';
89 $topic_id =~ /^[\d\w_-]+$/ or croak
"Bad topic_id";
98 if (defined($format)) {
99 my ($y, $m, $d, $H, $M, $S) = ($self->get('date') =~
100 /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);
102 $format =~ s/%Y/$y/g;
103 $format =~ s/%y/$y/g;
104 $format =~ s/%m/$m/g;
105 $format =~ s/%d/$d/g;
106 $format =~ s/%H/$H/g;
107 $format =~ s/%M/$M/g;
108 $format =~ s/%S/$S/g;
111 $format = $self->get('date');
117 sub touch
{ return $_[0]; }
124 $self->set('tags', [ @_ ]);
127 @ret = @
{ $self->get('tags') };
136 return sprintf ('%08x', int(rand(0xffffffff)));
139 package Gruta
::Data
::User
;
141 use base
'Gruta::Data::BASE';
143 sub fields
{ return qw(id username email password can_upload is_admin xdate); }
144 sub vfields
{ return qw(sid); }
146 package Gruta
::Data
::Session
;
148 use base
'Gruta::Data::BASE';
150 sub fields
{ return qw(id time user_id ip); }