mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Html_dump: Lock calls to cat_core Select [#389]
This commit is contained in:
parent
a94a9f0c7f
commit
ad317bd90e
@ -20,6 +20,7 @@ public class Xowd_cat_core_tbl implements Db_tbl {
|
|||||||
private final String fld_id, fld_pages, fld_subcats, fld_files, fld_hidden, fld_link_db_id;
|
private final String fld_id, fld_pages, fld_subcats, fld_files, fld_hidden, fld_link_db_id;
|
||||||
private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select;
|
private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select;
|
||||||
private final Xowd_cat_core_tbl__in_wkr in_wkr = new Xowd_cat_core_tbl__in_wkr();
|
private final Xowd_cat_core_tbl__in_wkr in_wkr = new Xowd_cat_core_tbl__in_wkr();
|
||||||
|
private final Object thread_lock = new Object();
|
||||||
public Db_conn Conn() {return conn;}
|
public Db_conn Conn() {return conn;}
|
||||||
public Xowd_cat_core_tbl(Db_conn conn, boolean schema_is_1) {
|
public Xowd_cat_core_tbl(Db_conn conn, boolean schema_is_1) {
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
@ -73,25 +74,31 @@ public class Xowd_cat_core_tbl implements Db_tbl {
|
|||||||
}
|
}
|
||||||
public Xowd_category_itm Select(int id) {
|
public Xowd_category_itm Select(int id) {
|
||||||
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_id);
|
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_id);
|
||||||
Db_rdr rdr = stmt_select.Clear().Crt_int(fld_id, id).Exec_select__rls_manual();
|
synchronized (thread_lock) {// THREAD: pagesincategory can call this from multiple threads which can cause db-locking; ERROR:"database link_db_1 is already in use"; PAGE:en.d:Category:Clothing; ISSUE#:389; DATE:2019-03-20
|
||||||
try {return rdr.Move_next() ? Load_itm(rdr) : Xowd_category_itm.Null;} finally {rdr.Rls();}
|
Db_rdr rdr = stmt_select.Clear().Crt_int(fld_id, id).Exec_select__rls_manual();
|
||||||
|
try {return rdr.Move_next() ? Load_itm(rdr) : Xowd_category_itm.Null;} finally {rdr.Rls();}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void Select_by_cat_id_in(Cancelable cancelable, Ordered_hash rv, int bgn, int end) {
|
public void Select_by_cat_id_in(Cancelable cancelable, Ordered_hash rv, int bgn, int end) {
|
||||||
in_wkr.Init(rv);
|
synchronized (thread_lock) {// THREAD: locking pre-emptively; ISSUE#:389; DATE:2019-03-20
|
||||||
in_wkr.Select_in(cancelable, conn, bgn, end);
|
in_wkr.Init(rv);
|
||||||
|
in_wkr.Select_in(cancelable, conn, bgn, end);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void Select_by_cat_id_many(Select_in_cbk cbk) {
|
public void Select_by_cat_id_many(Select_in_cbk cbk) {
|
||||||
int pos = 0;
|
synchronized (thread_lock) {// THREAD: locking pre-emptively; ISSUE#:389; DATE:2019-03-20
|
||||||
Bry_bfr bfr = Bry_bfr_.New();
|
int pos = 0;
|
||||||
Select_in_wkr wkr = Select_in_wkr.New(bfr, tbl_name, String_.Ary(fld_id, fld_pages, fld_subcats, fld_files, fld_hidden), fld_id);
|
Bry_bfr bfr = Bry_bfr_.New();
|
||||||
while (true) {
|
Select_in_wkr wkr = Select_in_wkr.New(bfr, tbl_name, String_.Ary(fld_id, fld_pages, fld_subcats, fld_files, fld_hidden), fld_id);
|
||||||
pos = wkr.Make_sql_or_null(bfr, cbk, pos);
|
while (true) {
|
||||||
if (pos == -1) break;
|
pos = wkr.Make_sql_or_null(bfr, cbk, pos);
|
||||||
Db_rdr rdr = conn.Stmt_sql(bfr.To_str_and_clear()).Exec_select__rls_auto();
|
if (pos == -1) break;
|
||||||
try {
|
Db_rdr rdr = conn.Stmt_sql(bfr.To_str_and_clear()).Exec_select__rls_auto();
|
||||||
while (rdr.Move_next())
|
try {
|
||||||
cbk.Read_data(rdr);
|
while (rdr.Move_next())
|
||||||
} finally {rdr.Rls();}
|
cbk.Read_data(rdr);
|
||||||
|
} finally {rdr.Rls();}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public Xowd_category_itm Load_itm(Db_rdr rdr) {
|
public Xowd_category_itm Load_itm(Db_rdr rdr) {
|
||||||
|
Loading…
Reference in New Issue
Block a user