##
##  dgraph.spec -- OpenPKG RPM Package Specification
##  Copyright (c) 2000-2025 OpenPKG Project <http://openpkg.org/>
##
##  Permission to use, copy, modify, and distribute this software for
##  any purpose with or without fee is hereby granted, provided that
##  the above copyright notice and this permission notice appear in all
##  copies.
##
##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   package information
%define       V_dgraph_base  25.0.0
%define       V_dgraph_snap  20250607

#   package information
Name:         dgraph
Summary:      Scalable Distributed Low-Latency Graph Database
URL:          https://dgraph.io/
Vendor:       Manish R. Jain
Packager:     OpenPKG Project
Distribution: OpenPKG Community
Class:        EVAL
Group:        Database
License:      Apache
Version:      %{V_dgraph_base}.%{V_dgraph_snap}
Release:      20250607

#   package options
%option       with_zero    yes
%option       with_server  yes

#   list of sources
Source0:      http://download.openpkg.org/components/versioned/dgraph/dgraph-%{V_dgraph_snap}.tar.xz
Source1:      dgraph-zero.yaml
Source2:      dgraph-server.yaml
Source3:      rc.dgraph

#   build information
BuildPreReq:  OpenPKG, openpkg >= 20160101, go
PreReq:       OpenPKG, openpkg >= 20160101

%description
    DGraph's goal is to provide production level scale and throughput,
    with low enough latency to be serving real time user queries,
    over terabytes of structured data. DGraph supports GraphQL as
    query language, and responds in JSON. DGraph is a distributed
    graph database, based on ACID transactions and the RAFT consensus
    protocol. DGraph stores data in the log structured merge (LSM) tree
    based key-value store Badger. Clients communicate with DGraph via
    GraphQL over gRPC or HTTP.

%track
    prog dgraph = {
        version   = %{V_dgraph_base}
        url       = https://github.com/dgraph-io/dgraph/releases
        regex     = tree/v(\d+\.\d+(?:\.\d+)?)
    }

%prep
    %setup -q -n dgraph

%build
    #   build program
    export GOPATH=`pwd`
    export CGO_CFLAGS="%{l_cflags -O} %{l_cppflags icu .}"
    export CGO_CXXFLAGS="%{l_cxxflags -O} %{l_cppflags icu .}"
    export CGO_LDFLAGS="%{l_ldflags .} -lm"
    ( echo "#!/bin/sh"
      echo "echo go-c++ \${1+\"\$@\"}"
      echo "exec go-c++ \${1+\"\$@\"}"
    ) >go-cc
    chmod a+x go-cc
    export CC=`pwd`/go-cc
    cd $GOPATH/src/github.com/dgraph-io/dgraph
    go build -v -o dgraph.exe dgraph/main.go

%install
    #   create directory hierarchy
    %{l_shtool} mkdir -f -p -m 755 \
        $RPM_BUILD_ROOT%{l_prefix}/bin \
        $RPM_BUILD_ROOT%{l_prefix}/sbin \
        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d \
        $RPM_BUILD_ROOT%{l_prefix}/etc/dgraph \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/run \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/log \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/db/postings \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/db/export \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/db/zwal \
        $RPM_BUILD_ROOT%{l_prefix}/var/dgraph/db/wal

    #   install program
    %{l_shtool} install -c -s -m 755 \
        src/github.com/dgraph-io/dgraph/dgraph.exe \
        $RPM_BUILD_ROOT%{l_prefix}/sbin/dgraph

    #   install default configuration
%if "%{with_zero}" == "yes"
    %{l_shtool} install -c -m 644 %{l_value -s -a} \
        %{SOURCE dgraph-zero.yaml} \
        $RPM_BUILD_ROOT%{l_prefix}/etc/dgraph/
%endif
%if "%{with_server}" == "yes"
    %{l_shtool} install -c -m 644 %{l_value -s -a} \
        %{SOURCE dgraph-server.yaml} \
        $RPM_BUILD_ROOT%{l_prefix}/etc/dgraph/
%endif

    #   install run-command script
%if "%{with_zero}" == "yes"
    daemons="${daemons}${daemons+ }zero"
%endif
%if "%{with_server}" == "yes"
    daemons="${daemons}${daemons+ }server"
%endif
    %{l_shtool} install -c -m 755 %{l_value -s -a} \
        -e "s;@daemons@;$daemons;g" \
        %{SOURCE rc.dgraph} $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/

    #   determine installation files
    %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
        %{l_files_std} \
        '%config %{l_prefix}/etc/dgraph/*' \
        '%attr(-,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/dgraph/*' \
        '%attr(-,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/dgraph/*/*'

%files -f files

%clean

%post
    if [ $1 -eq 1 ]; then
        #   display information about next steps
        (   echo "Start DGraph with:"
            echo "    \$ $RPM_INSTALL_PREFIX/bin/openpkg rc dgraph start"
            echo "DGraph by default uses the following TCP ports:"
            echo "    Zero=5080, Internal=7080, HTTP=8080, GRPC=9080"
        ) | %{l_rpmtool} msg -b -t notice
    elif [ $1 -eq 2 ]; then
        #   after upgrade, restart service
        eval `%{l_rc} dgraph status 2>/dev/null`
        [ ".$dgraph_active" = .yes ] && %{l_rc} dgraph restart
    fi
    exit 0

%preun
    if [ $1 -eq 0 ]; then
        #   before erase, stop service and remove log files
        %{l_rc} dgraph stop 2>/dev/null
        rm -rf $RPM_INSTALL_PREFIX/var/dgraph/log/*  >/dev/null 2>&1 || true
        rm -rf $RPM_INSTALL_PREFIX/var/dgraph/run/*  >/dev/null 2>&1 || true
        rm -rf $RPM_INSTALL_PREFIX/var/dgraph/db/*/* >/dev/null 2>&1 || true
    fi
    exit 0

