#!/bin/bash

# Перенаправляем stderr в stdout
exec 2>&1

MYSQL="/usr/bin/mysql"
NAME="socialdb"

TMPDIR="/opt/tmp"
TMPPREFIX="profile-dump-";
DSTDIR="/opt/profile-dump";

DAYS=5

TIME=`date '+%s'`
DATE=`date '+%F'`

DSTFILE="$DATE.tar.gz"
DSTPATH="$DSTDIR/$DSTFILE"
TMPFILE="$TMPPREFIX$TIME"
TMPPATH="$TMPDIR/$TMPFILE"
TMPARCHIVE="$TMPFILE.tar.gz"

# При составлении списка подписок:
#   - в записях с sid=2|25 смотрим на value:
#     * если value=0, пишем строку "2=0" (потом, строка будет удалена perl'ом);
#     * если value=1, не пишем ничего (потом, подписка будет добавлена perl'ом).
#   - в всех остальных записях смотрим на value:
#     * если value=0, не пишем ничего
#     * если value=1, пишем sid
QUERY=$(cat <<EOF
SELECT
  profile_id, uid, provider_id, userid, username, yandexuid, created, verified, confirmed,
  GROUP_CONCAT(
    IF(
      sid IN (2),
      IF(value = 1, NULL, CONCAT(sid, '=0')),
      IF(value = 1, sid,  NULL)
    )
  )
INTO OUTFILE '$TMPPATH'
FIELDS TERMINATED BY '\\t' ESCAPED BY '\\\\' ENCLOSED BY '\"'
LINES TERMINATED BY '\\n'
FROM profile
  LEFT JOIN subscription USING (profile_id)
GROUP BY profile_id;
EOF
)

# В системном TMPDIR не хватает места для дампа, поэтому используем каталог на HDD
export TMPDIR

echo Dumping profile-table to $TMPPATH ...
$MYSQL --database=$NAME --execute="$QUERY"

echo Processing default-true sids in temporary dump...
cd $TMPDIR
perl -i -e '
    my @default_enabled_sids = qw/2/;
    my $default_enabled_sids = join q/|/, @default_enabled_sids;
    my $disable_default_enabled_sids_re = qr/^($default_enabled_sids)=0$/;
    my %default_sids = map { $_ => 1 } @default_enabled_sids;

    while (<>) {
        next unless /^ (.*\t) (.+?) $/x;

        my ($other, $sids) = ($1, $2);
        $sids =~ s/^"//;
        $sids =~ s/"$//;
        $sids =~ s/^\\N$//;

        my @sids = split /,/, $sids;
        my %sids = %default_sids;

        for my $sid (@sids) {
            if ($sid =~ $disable_default_enabled_sids_re) {
                delete $sids{$1};
            }
            else {
                $sids{$sid} = 1;
            }
        }

        my $result_sids = join q/,/, sort { $a <=> $b } keys %sids;

        $result_sids
          = $result_sids
          ? qq/"$result_sids"/
          : q/\N/;

        print $other, $result_sids, "\n";
    }
' $TMPFILE

echo Packing temporary dump to temporary archive...
tar zcf $TMPARCHIVE $TMPFILE
echo Moving temporary archive to destination directory...
mv $TMPARCHIVE $DSTPATH
echo Removing temporary dump...
rm $TMPPATH
cd $DSTDIR
echo Cleaning old archives in destination directory...
find . -type f -mtime +$DAYS -exec rm -f {} \;
