1 package App::IdiotBox::Store::SQLite;
4 use warnings FATAL => 'all';
6 use DBIx::Data::Store::CRUD;
7 use App::IdiotBox::DataSet;
8 use Scalar::Util qw(weaken);
13 recent_announcements => {
16 my ($self, $obj) = @_;
17 bless($obj, 'App::IdiotBox::Announcement');
18 bless($obj->{bucket}, 'App::IdiotBox::Bucket');
22 my ($self, $obj) = @_;
32 my ($self, $obj) = @_;
33 bless($obj, 'App::IdiotBox::Bucket');
34 weaken (my $weak = $obj);
35 $obj->{videos} = _bind_set('bucket_videos',
37 raw_store => $self->_store->raw_store,
38 implicit_arguments => { 'bucket.slug' => $obj->{slug} },
43 my ($self, $obj) = @_;
44 bless($obj, 'App::IdiotBox::Video');
45 weaken($obj->{bucket} = $weak);
49 my ($self, $obj) = @_;
60 my ($self, $obj) = @_;
66 set_over => [ 'slug' ],
69 set_over => [ 'slug' ]
74 recent_announcements => {
75 select_column_order => [ qw(
76 id made_at video_count bucket.slug bucket.name bucket.video_count
80 announcement.id, announcement.made_at, COUNT(DISTINCT my_videos.slug),
81 bucket.slug, bucket.name, COUNT(DISTINCT all_videos.slug)
83 announcements announcement
85 ON bucket.slug = announcement.bucket_slug
87 ON my_videos.announcement_id = announcement.id
88 JOIN videos all_videos
89 ON all_videos.bucket_slug = announcement.bucket_slug
90 JOIN announcements all_announcements
91 ON all_announcements.bucket_slug = announcement.bucket_slug
93 announcement.made_at, bucket.slug, bucket.name
95 announcement.made_at = MAX(all_announcements.made_at)
97 announcement.made_at DESC
99 insert_command_constructor => sub {
100 require DBIx::Data::Store::Command::Insert::LastInsertId;
102 DBIx::Data::Store::Command::Insert::LastInsertId->new(
104 raw_store => $self->raw_store,
105 insert_call_command => $self->raw_store->new_call_command(@_)
109 INSERT INTO announcements
110 (bucket_slug, made_at)
114 insert_argument_order => [ qw(bucket.slug made_at) ],
117 select_column_order => [ qw(slug name) ],
118 select_single_sql => q{
127 select_single_argument_order => [ 'slug' ],
130 select_column_order => [ qw(slug name author details) ],
132 SELECT slug, name, author, details
134 WHERE bucket_slug = ?
137 select_argument_order => [ 'bucket.slug' ],
138 select_single_sql => q{
139 SELECT slug, name, author, details
141 WHERE bucket_slug = ? AND slug = ?
143 select_single_argument_order => [ qw(bucket.slug slug) ],
146 (announcement_id, bucket_slug, slug, name, author, details)
150 insert_argument_order => [
151 qw(announcement.id bucket.slug slug name author)
157 my ($class, $idiotbox) = @_;
158 bless({ idiotbox => $idiotbox }, $class)->_bind;
162 DBIx::Data::Store->connect("dbi:SQLite:$_[1]");
167 my $idiotbox = $self->{idiotbox};
169 my $db_store = $self->_new_db_store($idiotbox->config->{db_file});
171 foreach my $to_bind (qw(recent_announcements buckets)) {
172 $idiotbox->{$to_bind} = _bind_set($to_bind, { raw_store => $db_store });
178 my ($type, $store_args, $set_args) = @_;
179 my $store = DBIx::Data::Store::CRUD->new({
183 return App::IdiotBox::DataSet->new({