Banco de dados do WordPress sob controle de versão

Fiz um scriptzinho maroto pra manejar o dump de um banco de dados do WordPress. Ele serve pra exportar os dados do banco para um arquivo texto, substituindo a URL do site por uma string mágica; e também pra importar os dados do arquivo texto para o banco, desfazendo a substituição da URL. Assim, a gente consegue manter os dados do servidor de homologação/produção sob controle de versão, exportando estes dados para o arquivo texto sempre que há modificações no servidor, e importando os dados nas máquinas de desenvolvimento, mantendo o conteúdo do servidor replicado na máquina do desenvolvedor. Deu pra entender? Espero que não.
😉

dodump.sh

#!/bin/bash

function showerror {
    echo -n "ERROR: "
    echo $*
    usage
    exit 1
}

function usage {
    echo "USAGE: dodump.sh [dump|load] [[-c path/to/wp-config.php] [-f path/to/dumpfile.sql] [-u your.domain.com]]"
}

if [ $# -eq 0 ]; then
    usage
else

    SITEURL="none"
    DOMAIN="none"
    ACTION="nothing"
    DUMPFILE="dumpfile.sql"
    WP_CONFIG="default"
    while [ "$1" != "" ]; do
        case $1 in
            dump | --dump )
                ACTION="dump"
                ;;
            load | --load )
                ACTION="load"
                ;;
            -c | --config )
                shift
                WP_CONFIG=$1
                ;;
            -f | --file )
                shift
                DUMPFILE=$1
                ;;
            -u | --url )
                shift
                DOMAIN=$1
                ;;
            -h | --help | --? | /? )
                usage
                exit
                ;;
            * )
                usage
                exit 1
        esac
        shift
    done

    DB_NAME='notfound'
    DB_USER='notfound'
    DB_PASSWORD='notfound'
    DB_HOST='notfound'

    if [ "$WP_CONFIG" == "default" ]; then
      WP_CONFIG='wp-config.php'
      if [ ! -f $WP_CONFIG ]; then WP_CONFIG='www/wp-config.php'; fi
    fi

    if [ -n "$WP_CONFIG" ]; then
        if [ -f $WP_CONFIG ]; then
          DB_NAME=`cat ${WP_CONFIG} | grep "define" | grep "DB_NAME" | sed "s/define\s*(\s*'DB_NAME'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_USER=`cat ${WP_CONFIG} | grep "define" | grep "DB_USER" | sed "s/define\s*(\s*'DB_USER'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_PASSWORD=`cat ${WP_CONFIG} | grep "define" | grep "DB_PASSWORD" | sed "s/define\s*(\s*'DB_PASSWORD'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_HOST=`cat ${WP_CONFIG} | grep "define" | grep "DB_HOST" | sed "s/define\s*(\s*'DB_HOST'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
        else
          showerror "Config file \"${WP_CONFIG}\" not found."
        fi
    else
        showerror "Config file not specified."
    fi

    CONNDATA="-h ${DB_HOST} -u ${DB_USER} -p${DB_PASSWORD} ${DB_NAME}"

    if [ "$DOMAIN" == "" ]; then
        showerror "Domain not specified."
    elif [ "$DOMAIN" == "none" ]; then
        SITEURL=`mysql ${CONNDATA} -e "SELECT option_value FROM wp_options WHERE option_name='siteurl'" --skip-column-names --batch | sed "s/\\\\./\\\\\\\\\\\\./g"`

        DOMAIN=`echo ${SITEURL} | sed "s/https\?:\\\\/\\\\/\(.*\)/\1/g"`
        DOMAIN=`echo ${DOMAIN} | sed "s/\\\\//\\\\\\\\\\\\//g"`
        SITEURL=`echo ${SITEURL} | sed "s/\\\\//\\\\\\\\\\\\//g"`
    else
        SITEURL="http://${DOMAIN}"
    fi

    if [ "$SITEURL" == "none" ]; then showerror "Could not retrieve your site URL from database, and [domain] was not specified."; fi

    if [ "$ACTION" == "nothing" ]; then
        showerror "Action not specified."
    elif [ "$ACTION" == "dump" ]; then
        echo -n "Dumping... "
        mysqldump ${CONNDATA} | sed "s/${SITEURL}/[[INSERT-SITEURL-HERE]]/g" | sed "s/${DOMAIN}/[[INSERT-DOMAIN-HERE]]/g" > ${DUMPFILE}
        echo "done!"
        echo "Dump written to file \"${DUMPFILE}\"."
    elif [ "$ACTION" == "load" ]; then
        if [ ! -f $DUMPFILE ]; then
          showerror "Dump file \"${DUMPFILE}\" not found."
        else
          read -n1 -p "Ok to PERMANENTLY overwrite your database information with \"${DUMPFILE}\" file contents? (y/N) "
          case "$REPLY" in
            "y" | "Y" )
              echo
              echo -n "Loading... "
              cat ${DUMPFILE} | sed "s/\[\[INSERT-DOMAIN-HERE\]\]/${DOMAIN}/g" | sed "s/\[\[INSERT-SITEURL-HERE\]\]/${SITEURL}/g" | mysql ${CONNDATA}
              echo "done!"
              echo "Dump loaded from file \"${DUMPFILE}\"."
              ;;
            "n" | "N" | "" )
              if [ "$REPLY" != "" ]; then echo; fi
              echo "Aborted."
              ;;
            * )
              echo
              echo "What part of the question did you not understand?! Aborted."
              ;;
          esac
        fi
    fi
fi


Baixe o arquivo dodump.sh (zip)
© Compostela: “Deixe o que puder; leve o que precisar.”

Anúncios

5 ideias sobre “Banco de dados do WordPress sob controle de versão

  1. Michael Granados

    Caramba!

    O legal é que eu fiz uma solução também, mas em PHP usando o serialize/unserialize para alterar os dados do banco quando ele encontrar a URL no meio do projeto. Decidi fazer em PHP porque assim Alice Andrade (que usa windows) pode fazer o import e export usando o browser ;D

    Qualquer dia desses eu coloco num github da vida e te aviso pra você dar uma olhada.

    Ótima solução… Abraços!

    Resposta
    1. Ederson Peka Autor do post

      Pode crer, publica por aê. 😉

      Eu já nem uso mais este script (não roda na porcaria do Mac e a galera aqui enche o saco, teria que alterar, sabe como é). Tô juntando umas gambis medonhas pra fazer um bem bolado diferente, mais “amigável” também, assim que der tempo eu publico.

      Abraço.

      Resposta
  2. Pingback: Banco de dados do WordPress sob controle de versão: agora script em PHP! « Ederson Peka

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s