parent
8988df93fd
commit
755c65a42d
@ -0,0 +1,19 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
namespace App\Http\Middleware; |
||||||
|
|
||||||
|
|
||||||
|
use Illuminate\Routing\Middleware\ThrottleRequests; |
||||||
|
|
||||||
|
class ThrottleIfNotDebug extends ThrottleRequests |
||||||
|
{ |
||||||
|
public function handle($request, \Closure $next, $maxAttempts = 60, $decayMinutes = 1) |
||||||
|
{ |
||||||
|
if (config('app.debug')) { |
||||||
|
return $next($request); |
||||||
|
} |
||||||
|
|
||||||
|
return parent::handle($request, $next, $maxAttempts, $decayMinutes); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
|
||||||
|
class AddRowSequenceGenerator extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function up() |
||||||
|
{ |
||||||
|
// https://www.depesz.com/2008/03/20/getting-multiple-values-from-sequences/ |
||||||
|
DB::unprepared(/** @lang PostgreSQL */ |
||||||
|
<<<PGSQL |
||||||
|
CREATE OR REPLACE FUNCTION multi_nextval(use_seqname TEXT, use_increment INT4) RETURNS INT4 AS $$ |
||||||
|
DECLARE |
||||||
|
reply int4; |
||||||
|
BEGIN |
||||||
|
perform pg_advisory_lock(20180801); |
||||||
|
execute 'ALTER SEQUENCE ' || quote_ident(use_seqname) || ' INCREMENT BY ' || use_increment::text; |
||||||
|
reply := nextval(use_seqname); |
||||||
|
execute 'ALTER SEQUENCE ' || quote_ident(use_seqname) || ' INCREMENT BY 1'; |
||||||
|
perform pg_advisory_unlock(20180801); |
||||||
|
return reply; |
||||||
|
END; |
||||||
|
$$ LANGUAGE 'plpgsql'; |
||||||
|
PGSQL |
||||||
|
); |
||||||
|
DB::unprepared('CREATE SEQUENCE global_row_id_seq START 0 MINVALUE 0;'); |
||||||
|
// We have to increment manually once before the above function can be used - that is because |
||||||
|
// nextval will return the initial value the first time it's called, so it would not advance by |
||||||
|
// the given step at all. This would give us negative values - not a problem in postgres without unsigned |
||||||
|
// types, but it loooks bad. |
||||||
|
DB::select("SELECT nextval('global_row_id_seq') as nv;"); |
||||||
|
|
||||||
|
// The multi_nextval() is concurrency-safe, except it can sometimes happen that |
||||||
|
// nextval in other connection also increments by the bigger step. The only downside is "wasted IDs". |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function down() |
||||||
|
{ |
||||||
|
DB::unprepared('DROP FUNCTION IF EXISTS multi_nextval(TEXT, INT4);'); |
||||||
|
DB::unprepared('DROP SEQUENCE IF EXISTS global_row_id_seq;'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
|
||||||
|
class MakeGridColumnMandatoryInRowsTable extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function up() |
||||||
|
{ |
||||||
|
DB::unprepared("ALTER TABLE rows ADD CONSTRAINT grid_must_exist CHECK (data ? '_grid');"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function down() |
||||||
|
{ |
||||||
|
DB::unprepared("ALTER TABLE rows DROP CONSTRAINT grid_must_exist;"); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue