Play frameworkでisucon2アプリを書く-8

シェアする

  • このエントリーをはてなブックマークに追加

このエントリはPlay frameworkひとりアドベントカレンダーの23日目です。

今日は /admin を実装します。

今日も今までと同じ流れでいきましょう。

  1. 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
  2. modelを作る
  3. viewを作る
  4. controllerを作る(TODOでよい)
  5. 表示確認
  6. controllerを作りこむ
get '/admin' => sub {
    my ($self, $c) = @_;
    $c->render('admin.tx')
};

post '/admin' => sub {
    my ($self, $c) = @_;

    open(my $fh, 'root_dir . '/../config/database/initial_data.sql') or die $!;
    for my $sql () {
        chomp $sql;
        $self->dbh->query($sql) if $sql;
    }
    close($fh);

    $c->redirect('/admin')
};

modelいらない、viewたいしたことない、というわけで、controllerをがんばりましょう。
といってもファイルからSQLを読み込んでがーっと流すだけです。

Ebean.createCallableSql を利用してがんがん流しましょう。

    public static Result adminIndex() {
        return ok(views.html.admin.render());
    }

    public static Result adminIndexPost() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(
                    "../config/database/initial_data.sql"));
            String line;
            Ebean.beginTransaction();
            while ((line = reader.readLine()) != null) {
                if (line.isEmpty()) {
                    continue;
                }
                Ebean.execute(Ebean.createCallableSql(line));
            }
            Ebean.execute(Ebean.createCallableSql("commit;"));
            Ebean.commitTransaction();
        } catch (FileNotFoundException e) {
            Logger.error(e.getMessage());
            Logger.error(e.getStackTrace().toString());
        } catch (IOException e) {
            Logger.error(e.getMessage());
            Logger.error(e.getStackTrace().toString());
        } finally {
            Ebean.endTransaction();
        }
        return found("/admin");
    }

return ok 以外は初登場かも。 return found なんてものがあるので使いましょう。

なお、↑のコードでは EBean.createCallableSql("commit;")Ebean.commitTransaction で2回コミットしてます。
本当は2回もいらないような気がするのですが、なんか試してるうちにこうじゃないと動かなかったのでこうしてます。
なんでかはわからんちん。なんでや。。。

ads

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

ads

コメント

  1. […] 詳細わかんないですが、ここらへんを参考に、 トランザクションで括って、commitを多めに発行してみましたー。 […]

  2. […] 詳細わかんないですが、ここらへんを参考に、 トランザクションで括って、commitを多めに発行してみましたー。 Ebean.beginTransaction(); […]