Example #1
0
void Fl_Query::disconnect() {
    if (m_database) {
        close();
        free_stmt();
        m_database->m_queryList.remove(this);
        m_database = NULL;
    }
}
Example #2
0
static void
free_stmts(List *stmts)
{
	ListCell   *s;

	foreach(s, stmts)
	{
		free_stmt((PLpgSQL_stmt *) lfirst(s));
	}
Example #3
0
void
unparse_program(Program * p, Unparser_Receiver r, void *data,
		int fully_parenthesize, int indent_lines, int f_index)
{
    Stmt *stmt = decompile_program(p, f_index);

    prog = p;
    receiver = r;
    receiver_data = data;
    list_prg(stmt, fully_parenthesize, indent_lines);
    free_stmt(stmt);
}
Example #4
0
Fl_Query::~Fl_Query() {
    close();
    free_stmt();
    disconnect();
}
Example #5
0
void Fl_Query::sql(const Fl_String& _sql) {
   // Looking up for SQL parameters
    Fl_String  paramName;
    char     delimitter[] = " ";
    char     delimitters[] = "'\":'";
    char     *s = strdup(_sql.c_str());
    char     *paramStart = s;
    char     *paramEnd;
    int      paramNumber = 0;
    for (unsigned i = 0; i < m_params.count(); i++) {
        Fl_Param& param = m_params[i];
        param.bind_clear();
    }

    Fl_String  odbcSQL = "";
    bool     endOfString;
    for (;;) {
        paramEnd = strpbrk(paramStart,delimitters);
        if ( !paramEnd ) {
            odbcSQL += paramStart;
            break;
        }
        *delimitter = *paramEnd;

        if (*paramEnd == ':') {
            if (paramEnd != s && isalnum(*(paramEnd-1)) ) {
                *paramEnd = char(0);
                odbcSQL += paramStart;
                odbcSQL += ":";
                paramStart = paramEnd + 1;
                continue;
            }
            if (paramEnd[1] == ':') {
                paramEnd++;
                *paramEnd = char(0);
                odbcSQL += paramStart;
                paramStart = paramEnd + 1;
                continue;
            }
        }

        if ( *paramEnd == '\'' || *paramEnd == '"' ) {
            paramEnd = strpbrk(paramEnd + 1,delimitter);
            if ( !paramEnd ) {
                break; // Unmatched quotes
            }
            *paramEnd = char(0);
            odbcSQL += paramStart;
            odbcSQL += delimitter;
            paramStart = paramEnd + 1;
            continue;
        }

        *paramEnd = char(0);
        odbcSQL += paramStart;
        paramStart = paramEnd + 1;

        delimitter[0] = 0;
        char *ptr = paramStart;
        for (; *ptr; ptr++) {
            char c = *ptr;
            if ( c == '_' ) continue;
            if (!isalnum(c)) {
                delimitter[0] = c;
                break;
            }
        }

        paramEnd = ptr;
        endOfString = (*paramEnd == 0);
        *paramEnd = char(0);
        if (ptr != paramStart) {
         //Fl_Param *param;
            int   index = m_params.param_index(paramStart);
            if ( index == -1 ) {
                theParam = new Fl_Param(paramStart);
                m_params.add(theParam);
            } else {
                theParam = &m_params[index];
            }
            theParam->bind_add(paramNumber);
            paramNumber++;
            odbcSQL += "?";
            odbcSQL += delimitter;
        } else {
            odbcSQL += ":";
        }
        paramStart = paramEnd + 1;
        if (endOfString) break;
    }

    free(s);

    for (int p = m_params.count() - 1; p >= 0; p--)
        if (!m_params[p].bind_count())
            m_params.remove(p);

    if (m_sql != odbcSQL) {
        m_sql = odbcSQL;
        if (m_database) {
            if ( active() )  close();
            free_stmt();
        }
    }
}