예제 #1
0
def get_record(arg):
    """ Parse data for one urlencoded record.
        Useful for turning incoming serialized data into structure usable for manipulation.
    """
    if not arg:
        return dbdict()

    # allow array of single record
    if arg[0] in ('{', '['):
        lst = skytools.parse_pgarray(arg)
        if len(lst) != 1:
            raise ValueError('get_record() expects exactly 1 row, got %d' % len(lst))
        arg = lst[0]

    # parse record
    return dbdict(skytools.db_urldecode(arg))
예제 #2
0
 def retval(self, service_name=None, params=None, **kvargs):
     """ Return collected resultsets and append to the end messages to the users
         Method is called usually as last statment in dbservice to return the results
         Also converts results into desired format
     """
     params = params or kvargs
     self.raise_if_errors()
     if len(self.messages):
         self.return_next(self.messages, "_status")
     if self.sqls is not None and len(self.sqls):
         self.return_next(self.sqls, "_sql")
     results = []
     for r in self._retval:
         res_name = r[0]
         rows = r[1]
         res_count = str(len(rows))
         if self._is_test and len(rows) > 0:
             results.append([res_name, res_count, res_name])
             n = 1
             for trow in render_table(rows, rows[0].keys()):
                 results.append([res_name, n, trow])
                 n += 1
         else:
             res_rows = make_record_array(rows)
             results.append([res_name, res_count, res_rows])
     if service_name:
         sql = "select * from %s( {i_context}, {i_params} );" % quote_fqident(
             service_name)
         par = dbdict(i_context=self._context, i_params=make_record(params))
         res = self.run_query(sql, par)
         for r in res:
             results.append((r.res_code, r.res_text, r.res_rows))
     return results
예제 #3
0
 def retval(self, service_name = None, params = None, **kvargs):
     """ Return collected resultsets and append to the end messages to the users
         Method is called usually as last statment in dbservice to return the results
         Also converts results into desired format
     """
     params = params or kvargs
     self.raise_if_errors()
     if len( self.messages ):
         self.return_next( self.messages, "_status" )
     if self.sqls is not None and len( self.sqls ):
         self.return_next( self.sqls, "_sql" )
     results = []
     for r in self._retval:
         res_name = r[0]
         rows = r[1]
         res_count = str(len(rows))
         if self._is_test and len(rows) > 0:
             results.append([res_name, res_count, res_name])
             n = 1
             for trow in render_table(rows, rows[0].keys()):
                 results.append([res_name, n, trow])
                 n += 1
         else:
             res_rows = make_record_array(rows)
             results.append([res_name, res_count, res_rows])
     if service_name:
         sql = "select * from %s( {i_context}, {i_params} );" % quote_fqident(service_name)
         par = dbdict( i_context = self._context, i_params = make_record(params) )
         res = self.run_query( sql, par )
         for r in res:
             results.append((r.res_code, r.res_text, r.res_rows))
     return results
예제 #4
0
    def execute(self):
        """Server-side query execution via plpy.

        Query can be run either cached or uncached, depending
        on C{plan_cache} setting given to L{__init__}.

        Returns result of plpy.execute().
        """

        args = self._arg_value_list
        types = self._arg_type_list

        if self._sqls is not None:
            self._sqls.append( { "sql": self.get_sql(PARAM_INLINE) } )

        if self._plan_cache is not None:
            sql = self.get_sql(PARAM_PLPY)
            plan = self._plan_cache.get_plan(sql, types)
            res = plpy.execute(plan, args)
        else:
            sql = self.get_sql(PARAM_INLINE)
            res = plpy.execute(sql)
        if res:
            res = [dbdict(r) for r in res]
        return res
예제 #5
0
    def execute(self):
        """Server-side query execution via plpy.

        Query can be run either cached or uncached, depending
        on C{plan_cache} setting given to L{__init__}.

        Returns result of plpy.execute().
        """

        args = self._arg_value_list
        types = self._arg_type_list

        if self._sqls is not None:
            self._sqls.append({"sql": self.get_sql(PARAM_INLINE)})

        if self._plan_cache is not None:
            sql = self.get_sql(PARAM_PLPY)
            plan = self._plan_cache.get_plan(sql, types)
            res = plpy.execute(plan, args)
        else:
            sql = self.get_sql(PARAM_INLINE)
            res = plpy.execute(sql)
        if res:
            res = [dbdict(r) for r in res]
        return res
예제 #6
0
 def tapi_do(self, tablename, row, **fields):
     """ Convenience function for just doing the change without creating tapi object first
         Fields object may contain aditional overriding values that are aplied before do
     """
     tapi =  TableAPI(self, tablename, self._changelog(fields))
     row = row or dbdict()
     fields and row.update(fields)
     return tapi.do( row )
예제 #7
0
def get_record(arg):
    """ Parse data for one urlencoded record.
        Useful for turning incoming serialized data into structure usable for manipulation.
    """
    if not arg:
        return dbdict()

    # allow array of single record
    if arg[0] in ('{', '['):
        lst = skytools.parse_pgarray(arg)
        if len(lst) != 1:
            raise ValueError('get_record() expects exactly 1 row, got %d' %
                             len(lst))
        arg = lst[0]

    # parse record
    return dbdict(skytools.db_urldecode(arg))
예제 #8
0
 def tapi_do(self, tablename, row, **fields):
     """ Convenience function for just doing the change without creating tapi object first
         Fields object may contain aditional overriding values that are aplied before do
     """
     tapi = TableAPI(self, tablename, self._changelog(fields))
     row = row or dbdict()
     fields and row.update(fields)
     return tapi.do(row)
예제 #9
0
def get_record_lists(tbl, field):
    """ Create dictionary of lists from given list using field as grouping criteria
        Used for master detail operatons to group detail records according to master id
    """
    dict = dbdict()
    for rec in tbl:
        id = str( rec[field] )
        dict.setdefault( id, [] ).append(rec)
    return dict
예제 #10
0
 def field_copy(self, dict, *keys):
     """ Used to copy subset of fields from one record into another
         example: dbs.copy(record, hosting) "start_date", "key_colo", "key_rack")
     """
     retval = dbdict()
     for key in keys:
         if key in dict:
             retval[key] = dict[key]
     return retval
예제 #11
0
 def field_copy(self, dict, *keys):
     """ Used to copy subset of fields from one record into another
         example: dbs.copy(record, hosting) "start_date", "key_colo", "key_rack")
     """
     retval = dbdict()
     for key in keys:
         if key in dict:
             retval[key] = dict[key]
     return retval
예제 #12
0
def get_record_lists(tbl, field):
    """ Create dictionary of lists from given list using field as grouping criteria
        Used for master detail operatons to group detail records according to master id
    """
    dict = dbdict()
    for rec in tbl:
        id = str(rec[field])
        dict.setdefault(id, []).append(rec)
    return dict
예제 #13
0
def run_query(cur, sql, params = None, **kwargs):
    """ Helper function if everything you need is just paramertisized execute
        Sets rows_found that is coneninet to use when you don't need result just
        want to know how many rows were affected
    """
    params = params or kwargs
    sql = QueryBuilder(sql, params).get_sql(0)
    cur.execute(sql)
    rows = cur.fetchall()
    # convert result rows to dbdict
    if rows:
        rows = [dbdict(r) for r in rows]
    return rows
예제 #14
0
 def run_query(self, sql, params=None, **kvargs):
     """ Helper function if everything you need is just paramertisized execute
         Sets rows_found that is coneninet to use when you don't need result just
         want to know how many rows were affected
     """
     params = params or kvargs
     rows = skytools.plpy_exec(self.global_dict, sql, params)
     # convert result rows to dbdict
     if rows:
         rows = [dbdict(r) for r in rows]
         self.rows_found = len(rows)
     else:
         self.rows_found = 0
     return rows
예제 #15
0
 def run_query(self, sql, params = None, **kvargs):
     """ Helper function if everything you need is just paramertisized execute
         Sets rows_found that is coneninet to use when you don't need result just
         want to know how many rows were affected
     """
     params = params or kvargs
     rows = skytools.plpy_exec(self.global_dict, sql, params)
     # convert result rows to dbdict
     if rows:
         rows = [dbdict(r) for r in rows]
         self.rows_found = len(rows)
     else:
         self.rows_found = 0
     return rows
예제 #16
0
 def parse_sql(self, op, sql):
     tk = self.tokenizer(sql)
     fields = []
     values = []
     try:
         if op == "I":
             self.parse_insert(tk, fields, values)
         elif op == "U":
             self.parse_update(tk, fields, values)
         elif op == "D":
             self.parse_delete(tk, fields, values)
         raise Exception("syntax error")
     except StopIteration:
         # last sanity check
         if len(fields) == 0 or len(fields) != len(values):
             raise Exception("syntax error, fields do not match values")
     fields = [unquote_ident(f) for f in fields]
     values = [unquote_literal(f) for f in values]
     return dbdict(zip(fields, values))
예제 #17
0
 def parse_sql(self, op, sql, pklist=None):
     """Main entry point."""
     if pklist is None:
         self.pklist = []
     else:
         self.pklist = pklist
     tk = self.tokenizer(sql)
     fields = []
     values = []
     try:
         if op == "I":
             self.parse_insert(tk, fields, values)
         elif op == "U":
             self.parse_update(tk, fields, values)
         elif op == "D":
             self.parse_delete(tk, fields, values)
         raise Exception("syntax error")
     except StopIteration:
         # last sanity check
         if len(fields) == 0 or len(fields) != len(values):
             raise Exception("syntax error, fields do not match values")
     fields = [unquote_ident(f) for f in fields]
     values = [unquote_literal(f) for f in values]
     return dbdict(zip(fields, values))
예제 #18
0
 def copy(self):
     """Return regular dict."""
     return dbdict(self.iteritems())
예제 #19
0
 def copy(self):
     """Return regular dict."""
     return dbdict(self.iteritems())