| 797 | |
| 798 | |
| 799 | int sql_api_update(struct db_url *url, struct sip_msg* msg, cJSON *Jcols, |
| 800 | str *table, cJSON *Jfilter) |
| 801 | { |
| 802 | static map_t ps_map = NULL; |
| 803 | db_key_t *ukeys, *keys; |
| 804 | db_op_t *uops, *ops; |
| 805 | db_val_t *uvals, *vals; |
| 806 | int nk, unk; |
| 807 | str *id; |
| 808 | db_ps_t *my_ps; |
| 809 | |
| 810 | /* convert JSON to COLs */ |
| 811 | unk = _json_to_filters( Jcols, &ukeys, &uops, &uvals, 1); |
| 812 | if (unk<0) { |
| 813 | LM_ERR("failed to extract cols from JSON\n"); |
| 814 | return -1; |
| 815 | } |
| 816 | |
| 817 | /* convert JSON to keys */ |
| 818 | if (Jfilter) { |
| 819 | nk = _json_to_filters( Jfilter, &keys, &ops, &vals, 0); |
| 820 | if (nk<0) { |
| 821 | LM_ERR("failed to extract filter from JSON\n"); |
| 822 | return -1; |
| 823 | } |
| 824 | } else { |
| 825 | keys = NULL; |
| 826 | ops = NULL; |
| 827 | vals = NULL; |
| 828 | nk = 0; |
| 829 | } |
| 830 | |
| 831 | /* set table */ |
| 832 | if (set_table( url, table ,"API update")!=0) |
| 833 | return -1; |
| 834 | |
| 835 | if ( !DB_CAPABILITY(url->dbf, DB_CAP_PREPARED_STMT) || |
| 836 | _query_id_start(table,NULL)==NULL || |
| 837 | (id=_query_id_add_filter(ukeys,uops,unk))==NULL || |
| 838 | (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) { |
| 839 | LM_DBG("not using PS\n"); |
| 840 | } else { |
| 841 | LM_DBG("PS id is <%.*s>\n",id->len,id->s); |
| 842 | if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) { |
| 843 | if ( (my_ps=map_get( ps_map, *id ))!=NULL) { |
| 844 | LM_DBG("using PS %p\n",*my_ps); |
| 845 | CON_SET_CURR_PS( url->hdl, my_ps); |
| 846 | } |
| 847 | } |
| 848 | } |
| 849 | |
| 850 | /* do the DB query */ |
| 851 | if (url->dbf.update( url->hdl, keys, ops, vals, ukeys, uvals, nk, unk)<0){ |
| 852 | const str *t = url->hdl&&url->hdl->table&&url->hdl->table->s |
| 853 | ? url->hdl->table : 0; |
| 854 | LM_ERR("update API query failed: db%d (%.*s)\n", |
| 855 | url->idx, t?t->len:0, t?t->s:""); |
| 856 | return -1; |
no test coverage detected