id_spreadsheet = par_id;
__CREATE_QUERY( "
DELETE FROM co_sys_expression_deps WHERE id_session = %d ;
INSERT INTO co_sys_expression_deps
SELECT DISTINCT %d as id_session, id_column as c_id, id_row as r_id, 1 as n
FROM co_sys_expression_cell AS CELL
WHERE CELL.id_ref_column = %d AND
CELL.id_ref_row = %d
;
INSERT INTO co_sys_expression_deps
SELECT DISTINCT %d as id_session, RANGE.id_column as c_id, RANGE.id_row as r_id,
1 AS n
FROM co_sys_spreadsheet_row AS ROWSRC, co_sys_spreadsheet_column AS COLSRC,
co_sys_expression_range AS RANGE,
co_sys_spreadsheet_row AS ROWREF1, co_sys_spreadsheet_column AS COLREF1,
co_sys_spreadsheet_row AS ROWREF2, co_sys_spreadsheet_column AS COLREF2
WHERE
ROWSRC.id = %d AND
COLSRC.id = %d AND
ROWREF1.id=RANGE.id_ref_row AND
COLREF1.id=RANGE.id_ref_column AND
ROWREF2.id=RANGE.id_ref_row2 AND
COLREF2.id=RANGE.id_ref_column2 AND
ROWSRC.spreadsheet_id = ROWREF1.spreadsheet_id AND -- range within the same spreadsheet as our cell
ROWSRC.row_number >= ROWREF1.row_number AND
ROWSRC.row_number <= ROWREF2.row_number AND
COLSRC.column_number >= COLREF1.column_number AND
COLSRC.column_number <= COLREF2.column_number
;
", cnx->id_session,
cnx->id_session, id_column, id_row,
cnx->id_session, id_row, id_column)
__SQL_EXEC
{
int n;
int cell_deps, range_deps;
int loops; /* loops in expression? */
for(n=1; n<20; n++) {
__CREATE_QUERY( "
INSERT INTO co_sys_expression_deps
SELECT DISTINCT DEP.id_session as id_session, CELL.id_column as c_id, CELL.id_row as r_id, DEP.n+1 as n
FROM co_sys_expression_deps AS DEP, co_sys_expression_cell AS CELL
WHERE
DEP.id_session = %d AND
DEP.n = %d AND -- used in loop
CELL.id_ref_column = DEP.c_id AND
CELL.id_ref_row = DEP.r_id
;
",
cnx->id_session, n)
__SQL_EXEC
cell_deps = ok; /* atoi(PQcmdTuple(res)); */
__CREATE_QUERY( "
INSERT INTO co_sys_expression_deps
SELECT DISTINCT DEP.id_session as id_session, RANGE.id_column as c_id, RANGE.id_row as r_id, DEP.n+1 as n
FROM co_sys_expression_deps AS DEP, co_sys_spreadsheet_row AS ROWSRC, co_sys_spreadsheet_column AS COLSRC,
co_sys_expression_range AS RANGE,
co_sys_spreadsheet_row AS ROWREF1, co_sys_spreadsheet_column AS COLREF1,
co_sys_spreadsheet_row AS ROWREF2, co_sys_spreadsheet_column AS COLREF2
WHERE
DEP.id_session = %d AND
ROWSRC.id=DEP.r_id AND
COLSRC.id=DEP.c_id AND
ROWREF1.id=RANGE.id_ref_row AND
COLREF1.id=RANGE.id_ref_column AND
ROWREF2.id=RANGE.id_ref_row2 AND
COLREF2.id=RANGE.id_ref_column2 AND
ROWSRC.spreadsheet_id = ROWREF1.spreadsheet_id AND -- range within the same spreadsheet as our cell
ROWSRC.row_number >= ROWREF1.row_number AND
ROWSRC.row_number <= ROWREF2.row_number AND
COLSRC.column_number >= COLREF1.column_number AND
COLSRC.column_number <= COLREF2.column_number AND
DEP.n = %d -- used in loop
;
",
cnx->id_session, n)
__SQL_EXEC
range_deps = ok; /* atoi(PQcmdTuple(res)); */
if( (cell_deps==0) && (range_deps==0) ) break;
if((n+1)>=20) {
/* last loop in for... and we are still getting dependent cells? */
cou_error( cnx, "Max dependency depth exceeded");
}
loops = 0;
__SQL_GET_INTEGER( loops, "
SELECT count(*) FROM co_sys_expression_deps AS DEP
WHERE DEP.id_session=%d AND
DEP.c_id=%d AND DEP.r_id=%d
;
",
cnx->id_session, id_column, id_row)
if (loops>0) {
cou_error( cnx, "Expression Loop occured");
}
}
} /* deps generation */
__CREATE_QUERY( "
SELECT DEP.c_id, DEP.r_id, EXPR.expression_parsed, EXPR.id_spreadsheet
FROM co_sys_expression_deps AS DEP, co_sys_expression AS EXPR
WHERE DEP.id_session=%d AND
EXPR.id_column = DEP.c_id AND EXPR.id_row=DEP.r_id
GROUP BY DEP.c_id, DEP.r_id, EXPR.expression_parsed, EXPR.id_spreadsheet
ORDER BY MAX(n)
;
",
cnx->id_session)
__SQL_GET_RESULT
cou_logError(cnx, CO_LOG_DEBUG, "ntuples=%d", cor_GetTupleCount(cnx, corec));
{
int i;
if (cor_GetTupleCount(cnx, corec)>0) for (i=0; i<cor_GetTupleCount(cnx, corec); i++) {
int dep_id_spreadsheet;
int dep_id_column;
int dep_id_row;
const char *expression_result;
const char *expression_script;
const char *source;
const char *context;
cou_logError(cnx, CO_LOG_DEBUG, "%s,%s,%s,%s",
cor_GetValue(cnx, corec,i,0),cor_GetValue(cnx, corec,i,1),cor_GetValue(cnx, corec,i,2),cor_GetValue(cnx, corec,i,3));
dep_id_spreadsheet = atoi(cor_GetValue(cnx, corec,i,3));
dep_id_column = atoi(cor_GetValue(cnx, corec,i,0));
dep_id_row = atoi(cor_GetValue(cnx, corec,i,1));
expression_script = cor_GetValue(cnx, corec,i,2);
context = ap_psprintf(p, "
var context = new Object();\n
context.column_id = %d;\n
context.row_id = %d;\n
context.spreadsheet_id = %d;
",
dep_id_column, dep_id_row, dep_id_spreadsheet );
source = ap_psprintf(p, "return %s", ++expression_script); /* with beginning '=' */
@co_call('"sys"','"js_code"', "evaluate", par_area=>'"sys"', par_class=>'"js_code"', par_id=>-2, prolog=>context, direct_code=>source, direct_libs=>'"expression_runtime"', asp=>0 );
expression_result = (char*)cou_getReturnValue( cnx, CO_STRING, &err );
/* set cell value */
@co_call('"sys"', '"spreadsheet_cell"', "setAttribute", par_id => dep_id_spreadsheet, par_area => '"sys"', par_class => '"spreadsheet_cell"', column_id => dep_id_column, row_id => dep_id_row, attribute_name => '"value_noeval"' , attribute_value => expression_result );
if (cnx->putJS) {
snprintf(JSOutBuf, JSBUFSIZE, "w_c_by_id(%d,%d);\n", dep_id_column, dep_id_row);
cou_putJS(cnx,JSOutBuf);
}
} /* for ... */
}
__CLEAR_RESULT