add a basic -dt_add op and experiment with it
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / SQLite.pm
1 package # Hide from PAUSE
2   DBIx::Class::SQLMaker::SQLite;
3
4 use base qw( DBIx::Class::SQLMaker );
5
6 #
7 # SQLite does not understand SELECT ... FOR UPDATE
8 # Disable it here
9 sub _lock_select () { '' };
10
11
12 {
13   my %part_map = (
14      month               => 'm',
15      day_of_month        => 'd',
16      year                => 'Y',
17      hour                => 'H',
18      day_of_year         => 'j',
19      minute              => 'M',
20      second              => 'S',
21      day_of_week         => 'w',
22      week                => 'W',
23      julian_day          => 'J',
24      seconds_since_epoch => 's',
25      fractional_seconds  => 'f',
26   );
27
28   sub _datetime_sql {
29     die $_[0]->_unsupported_date_extraction($_[1], 'SQLite')
30        unless exists $part_map{$_[1]};
31     "STRFTIME('%$part_map{$_[1]}', $_[2])"
32   }
33 }
34
35 sub _datetime_diff_sql {
36    my ($self, $part, $left, $right) = @_;
37    if ($part eq 'day') {
38       return "(JULIANDAY($left) - JULIANDAY($right))"
39    } elsif ($part eq 'second') {
40       return "(STRFTIME('%s',$left) - STRFTIME('%s',$right))"
41    } else {
42       die $_[0]->_unsupported_date_diff($_[1], 'SQLite')
43    }
44 }
45
46 {
47   my %part_map = (
48      day                 => 'days',
49      hour                => 'hours',
50      minute              => 'minutes',
51      second              => 'seconds',
52      month               => 'months',
53      year                => 'years',
54   );
55    sub _datetime_add_sql {
56       my ($self, $part, $date, $amount) = @_;
57
58       die $self->_unsupported_date_adding($part, 'SQLite')
59          unless exists $part_map{$part};
60
61       return "(datetime($date, $amount || ' $part_map{$part}'))"
62    }
63 }
64
65 sub _reorder_add_datetime_vars {
66    my ($self, $amount, $date) = @_;
67
68    return ($date, $amount);
69 }
70
71 sub _datetime_now_sql { "datetime('now')" }
72
73 =head1 DATE FUNCTION IMPLEMENTATION
74
75 The function used to extract date information is C<STRFTIME>, which supports
76
77  month
78  day_of_month
79  year
80  hour
81  day_of_year
82  minute
83  seconds
84  day_of_week
85  week
86  year
87  julian_day
88  seconds_since_epoch
89  fractional_seconds
90
91 The function used to diff dates differs and only supports
92
93  day
94  second
95
96 =cut
97
98 1;