app/Tree.php
public function getNewXref(): string
    {
        // Lock the row, so that only one new XREF may be generated at a time.
        DB::table('site_setting')
            ->where('setting_name', '=', 'next_xref')
            ->lockForUpdate()
            ->get();

        $prefix = 'X';

        $increment = 1.0;
        do {
            $num = (int) Site::getPreference('next_xref') + (int) $increment;

            // This exponential increment allows us to scan over large blocks of
            // existing data in a reasonable time.
            $increment *= 1.01;

            $xref = $prefix . $num;

            // Records may already exist with this sequence number.
            $already_used =
                DB::table('individuals')->where('i_id', '=', $xref)->exists() ||
                DB::table('families')->where('f_id', '=', $xref)->exists() ||
                DB::table('sources')->where('s_id', '=', $xref)->exists() ||
                DB::table('media')->where('m_id', '=', $xref)->exists() ||
                DB::table('other')->where('o_id', '=', $xref)->exists() ||
                DB::table('change')->where('xref', '=', $xref)->exists();
        } while ($already_used);

        Site::setPreference('next_xref', (string) $num);

        return $xref;
    }
public function getNewXref(): string
    {
        // Lock the row, so that only one new XREF may be generated at a time.
        DB::table('site_setting')
            ->where('setting_name', '=', 'next_xref')
            ->lockForUpdate()
            ->get();

        $prefix = 'X';

        $increment = 1.0;
        do {
            $num = (int) Site::getPreference('next_xref') + (int) $increment;

            // This exponential increment allows us to scan over large blocks of
            // existing data in a reasonable time.
            $increment *= 1.01;

            $xref = $prefix . $num;

            // Records may already exist with this sequence number.
            $already_used =
                DB::table('individuals')->where('i_id', '=', $xref)->exists() ||
                DB::table('families')->where('f_id', '=', $xref)->exists() ||
                DB::table('sources')->where('s_id', '=', $xref)->exists() ||
                DB::table('media')->where('m_id', '=', $xref)->exists() ||
                DB::table('other')->where('o_id', '=', $xref)->exists() ||
                DB::table('change')->where('xref', '=', $xref)->exists();
        } while ($already_used);

        Site::setPreference('next_xref', (string) $num);

        return $xref;
    }
public function getNewXref ( ) : string { // Lock the row, so that only one new XREF may be generated at a time. DB :: table ( 'site_setting' ) -> where ( 'setting_name' , '=' , 'next_xref' ) -> lockForUpdate ( ) -> get ( ) ; $ prefix = 'X' ; $ increment = 1.0 ; do { $ num = ( int ) Site :: getPreference ( 'next_xref' ) + ( int ) $ increment ; // This exponential increment allows us to scan over large blocks of // existing data in a reasonable time. $ increment *= 1.01 ; $ xref = $ prefix . $ num ; // Records may already exist with this sequence number. $ already_used = DB :: table ( 'individuals' ) -> where ( 'i_id' , '=' , $ xref ) -> exists ( ) || DB :: table ( 'families' ) -> where ( 'f_id' , '=' , $ xref ) -> exists ( ) || DB :: table ( 'sources' ) -> where ( 's_id' , '=' , $ xref ) -> exists ( ) || DB :: table ( 'media' ) -> where ( 'm_id' , '=' , $ xref ) -> exists ( ) || DB :: table ( 'other' ) -> where ( 'o_id' , '=' , $ xref ) -> exists ( ) || DB :: table ( 'change' ) -> where ( 'xref' , '=' , $ xref ) -> exists ( ) ; } while ( $ already_used ) ; Site :: setPreference ( 'next_xref' , ( string ) $ num ) ; return $ xref ; }
Generate a new XREF, unique across all family trees

@return string
Generate a new XREF unique across all family trees