Exemple #1
0
def setting(request):
    """
    setting方法返回目前各数据对象的配置项
    e.g. http://jdata.domain/api/setting?_o=slowspeed1h
    """
    obj = request.GET.get('_o', '')
    opt = request.GET.get('opt', '')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    DM = DataModel(obj)
    rst = DM.__dict__
    rst.pop('Data')
    rst.pop('METADB_CHART')
    #rst.pop('URL_ALIAS')
    rst.pop('obj')

    try:
        w = rst['DB']['mysql']['writerurl']
        rst['DB']['mysql']['writerurl'] = w.split('@')[1]
        r = rst['DB']['mysql']['readerurl']
        rst['DB']['mysql']['readerurl'] = r.split('@')[1]
    except:
        pass

    if opt:
        try:
            return return_http_json(rst[opt])
        except:
            raise URLParameterError('Data `' + obj + '` has not option: `' +
                                    opt + '`')
    else:
        return return_http_json(rst)
Exemple #2
0
def setting(request):
    """
    setting方法返回目前各数据对象的配置项
    e.g. http://jdata.domain/api/setting?_o=slowspeed1h
    """
    obj = request.GET.get('_o','')
    opt = request.GET.get('opt','')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    DM = DataModel(obj)
    rst = DM.__dict__
    rst.pop('Data')
    rst.pop('METADB_CHART')
    #rst.pop('URL_ALIAS')
    rst.pop('obj')
   
    try:
        w = rst['DB']['mysql']['writerurl']
        rst['DB']['mysql']['writerurl'] = w.split('@')[1]
        r = rst['DB']['mysql']['readerurl']
        rst['DB']['mysql']['readerurl'] = r.split('@')[1]
    except:
        pass
    
    if opt:
        try:return return_http_json(rst[opt])
        except:raise URLParameterError('Data `'+obj+'` has not option: `'+opt+'`')
    else:
        return return_http_json(rst)
Exemple #3
0
def gettables(request):
    """
    gettables 方法将返回此数据的表
    e.g.  http://jdata.domain/api/gettables?_o=cache_customer_bw
    """
    obj = request.GET.get('_o', '')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    DM = DataModel(obj)
    if DM.Data.dmc:
        sql = 'select oname, tname, created from jdata_dmc_tables where oname = "%s"' % obj
        rst = DM.Data.query_master(sql)
        x = [{
            'ObjectName': i[0],
            'TableName': i[1],
            'Created': i[2]
        } for i in rst]
    else:
        rst = DM.Data.queryexecute('show table status')['Data']
        x = [{
            'TableName': i[0],
            'Engine': i[1],
            'Rows': i[4],
            'DataSize': i[6],
            'IndexSize': i[8],
            'Created': i[11]
        } for i in rst]
    return return_http_json(x)
Exemple #4
0
def upload_result_file(request):
    """
    上传文件,做入库处理  POST 方法
    参数:
    file=@filename   本地文件
    _o=cdnbw         数据object名字
    _s=201203201340   这份数据的时间戳,请注意该文件中的数据时间跨度不得超过定义的拆表时间区间(table_split)
    _t=,             数据的分隔符,默认空格
    data_exists_action  数据如果存在(主键冲突)的处理方法,支持3种模式:    ignore (Default) | replace | append
                        ignore:    如果发现数据已经存在,则忽略;不存在的数据可以成功导入
                        replace:   如果已存在,则替换掉旧数据
                        append:    如果已存在,则往上累加(除主键外的其他字段,当存在百分比类似的数据时不适合使用append,除非确认可以对这些字段做累加)

    e.g. curl  -F file=@filename -F _o=cdnbw -F _s=201203201340 -F '_t=,' -F data_exists_action=replace http://jdata.domain/api/uploadresultfile

    """
    uploaddir = '/tmp/jdata/'
    if not isdir(uploaddir):mkdir(uploaddir)
    if request.method == 'POST':
        if request.META.has_key('HTTP_X_FORWARDED_FOR'):  
            client =  request.META['HTTP_X_FORWARDED_FOR']  
        else:  
            client = request.META['REMOTE_ADDR'] 
        file = request.FILES['file']
        filename = file.name
        try:obj = request.POST['_o']
        except:raise UploadDataParameterError("parameter `_o` is required")
        DM = DataModel(obj)
        try:timeline = request.POST['_s']
        except:raise UploadDataParameterError("parameter `_s` is required")
        fields_terminated = request.POST.get('_t',' ')

        objdir = join(uploaddir,obj)
        if not isdir(objdir):
            mkdir(objdir)
        now = time.strftime('%Y%m%d%H%M%S',time.localtime())
        tmpfile = join(objdir,now+'_'+timeline+'_'+filename)
        f = open(tmpfile,'wb')
        f.write(file.read())
        f.close()
        data_exists_action = request.POST.get('data_exists_action','ignore')
        t1 = time.time()

        if data_exists_action in('ignore','replace', 'append'):
            tablename = DM.Data.gettablename(timeline)
            if data_exists_action in ('replace', 'append'):
                if not DM.Data.pk:
                    raise ObjectPKNotFound('No PK Found For this Data `%s` ,so you can not use parameter `%s`' %(obj, data_exists_action))
            rst = DM.Data.loadfile2db(tmpfile, tablename, fields_terminated, data_exists_action)
            log('upload: %s %s [%s] %ss %s %s' %(client, obj, data_exists_action, int(time.time()-t1),tmpfile,rst))
            try: 
                remove(tmpfile)
            except:
                log('remove resultfile Failed: %s' %tmpfile)
            return return_http_json(rst)
        else:
            raise UploadDataParameterError(" Unknown value `"+data_exists_action+"` for data_exists_action")
    else:
        raise UploadDataMethodError("""Please POST your data like this: curl  -F file=@filename -F _o=cdnbw -F _s=201203201340 -F '_t= '  http://jdata.domain/api/uploadresultfile""")
Exemple #5
0
def getquerydict(request):
    """
    getquerydict方法返回根据url解析出来的统一格式的请求参数
    e.g. http://jdata.domain/api/getquerydict?_o=feedbacklog&_tstep=5&_dataclean=0&_fields=count&s=201203051555&e=201203061555&_lines=fields
    """
    path = request.get_full_path()
    DM = DataModel(path=path)
    return return_http_json(DM.get_query_dict(path))
Exemple #6
0
def getquerydict(request):
    """
    getquerydict方法返回根据url解析出来的统一格式的请求参数
    e.g. http://jdata.domain/api/getquerydict?_o=feedbacklog&_tstep=5&_dataclean=0&_fields=count&s=201203051555&e=201203061555&_lines=fields
    """
    path=request.get_full_path()
    DM = DataModel(path = path)
    return return_http_json(DM.get_query_dict(path))
Exemple #7
0
def q(request):
    """
    等同于qjson方法,返回字典JSON数据 ,除了包含结果数据,还包含处理时长、处理的记录条数、返回的字段含义等等
     {'Data':data, 'Metadata':display_fields, 'Elapsed':elapsed, 'RowsFromDisk':rows_disk, 'RowsFromMem':rows_mem}
    e.g. http://jdata.domain/data/q?_o=cdnbw&_tstep=5&cdn_type=qihu360&_dataclean=0&_fields=request&s=201202211504&e=201203041504&_lines=fields
    wiki: http://wiki.domain/display/sys/Jdata
    """
    path=request.get_full_path()
    DM=DataModel(path=path)
    client = request.META.get('REMOTE_ADDR','')
    if DM.ALLOWIPS and (client not in DM.ALLOWIPS):
        raise AccessDenied('Your IP `'+client+'` is not trusted  for `'+DM.objectname+'`.')
    rst=DM.Data.get(DM.get_query_dict(path))
    return return_http_json(rst)
Exemple #8
0
def q(request):
    """
    等同于qjson方法,返回字典JSON数据 ,除了包含结果数据,还包含处理时长、处理的记录条数、返回的字段含义等等
     {'Data':data, 'Metadata':display_fields, 'Elapsed':elapsed, 'RowsFromDisk':rows_disk, 'RowsFromMem':rows_mem}
    e.g. http://jdata.domain/data/q?_o=cdnbw&_tstep=5&cdn_type=qihu360&_dataclean=0&_fields=request&s=201202211504&e=201203041504&_lines=fields
    wiki: http://wiki.domain/display/sys/Jdata
    """
    path = request.get_full_path()
    DM = DataModel(path=path)
    client = request.META.get('REMOTE_ADDR', '')
    if DM.ALLOWIPS and (client not in DM.ALLOWIPS):
        raise AccessDenied('Your IP `' + client + '` is not trusted  for `' +
                           DM.objectname + '`.')
    rst = DM.Data.get(DM.get_query_dict(path))
    return return_http_json(rst)
Exemple #9
0
def gettables(request):
    """
    gettables 方法将返回此数据的表
    e.g.  http://jdata.domain/api/gettables?_o=cache_customer_bw
    """
    obj = request.GET.get('_o','')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    DM = DataModel(obj)
    if DM.Data.dmc:
        sql = 'select oname, tname, created from jdata_dmc_tables where oname = "%s"' %obj
        rst = DM.Data.query_master(sql)
        x = [ {'ObjectName':i[0], 'TableName':i[1],'Created':i[2] } for i in rst ]
    else:
        rst = DM.Data.queryexecute('show table status')['Data']
        x = [ {'TableName':i[0],'Engine': i[1],'Rows':i[4],'DataSize':i[6],'IndexSize':i[8],'Created':i[11] } for i in rst ]
    return return_http_json(x)
Exemple #10
0
def droptables(request):
    """
    droptables  删除指定MySQL Tables
    e.g. http://jdata.domain/api/droptable?_o=cache_customer_bw&_tables=t1,t2,t3
    
    """
    obj = request.GET.get('_o', '')
    tbls = request.GET.get('_tables', '')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    if not tbls:
        raise URLParameterError('parameter  `_tables` is required.')
    DM = DataModel(obj)
    num = 0
    for i in tbls.split(','):
        if i:
            try:
                t = DM.Data.droptable(tablename=i)
                num += 1
            except:
                pass
    return return_http_json({'Droped': num})
Exemple #11
0
def droptables(request):
    """
    droptables  删除指定MySQL Tables
    e.g. http://jdata.domain/api/droptable?_o=cache_customer_bw&_tables=t1,t2,t3
    
    """
    obj = request.GET.get('_o','')
    tbls = request.GET.get('_tables','')
    if not obj:
        raise URLParameterError('parameter  `_o` is required.')
    if not tbls:
        raise URLParameterError('parameter  `_tables` is required.')
    DM = DataModel(obj)
    num = 0
    for i in tbls.split(','):
        if i:
            try:
                t = DM.Data.droptable(tablename = i)
                num += 1
            except:
                pass
    return return_http_json({'Droped':num})
Exemple #12
0
def upload_result_file(request):
    """
    上传文件,做入库处理  POST 方法
    参数:
    file=@filename   本地文件
    _o=cdnbw         数据object名字
    _s=201203201340   这份数据的时间戳,请注意该文件中的数据时间跨度不得超过定义的拆表时间区间(table_split)
    _t=,             数据的分隔符,默认空格
    data_exists_action  数据如果存在(主键冲突)的处理方法,支持3种模式:    ignore (Default) | replace | append
                        ignore:    如果发现数据已经存在,则忽略;不存在的数据可以成功导入
                        replace:   如果已存在,则替换掉旧数据
                        append:    如果已存在,则往上累加(除主键外的其他字段,当存在百分比类似的数据时不适合使用append,除非确认可以对这些字段做累加)

    e.g. curl  -F file=@filename -F _o=cdnbw -F _s=201203201340 -F '_t=,' -F data_exists_action=replace http://jdata.domain/api/uploadresultfile

    """
    uploaddir = '/tmp/jdata/'
    if not isdir(uploaddir): mkdir(uploaddir)
    if request.method == 'POST':
        if request.META.has_key('HTTP_X_FORWARDED_FOR'):
            client = request.META['HTTP_X_FORWARDED_FOR']
        else:
            client = request.META['REMOTE_ADDR']
        file = request.FILES['file']
        filename = file.name
        try:
            obj = request.POST['_o']
        except:
            raise UploadDataParameterError("parameter `_o` is required")
        DM = DataModel(obj)
        try:
            timeline = request.POST['_s']
        except:
            raise UploadDataParameterError("parameter `_s` is required")
        fields_terminated = request.POST.get('_t', ' ')

        objdir = join(uploaddir, obj)
        if not isdir(objdir):
            mkdir(objdir)
        now = time.strftime('%Y%m%d%H%M%S', time.localtime())
        tmpfile = join(objdir, now + '_' + timeline + '_' + filename)
        f = open(tmpfile, 'wb')
        f.write(file.read())
        f.close()
        data_exists_action = request.POST.get('data_exists_action', 'ignore')
        t1 = time.time()

        if data_exists_action in ('ignore', 'replace', 'append'):
            tablename = DM.Data.gettablename(timeline)
            if data_exists_action in ('replace', 'append'):
                if not DM.Data.pk:
                    raise ObjectPKNotFound(
                        'No PK Found For this Data `%s` ,so you can not use parameter `%s`'
                        % (obj, data_exists_action))
            rst = DM.Data.loadfile2db(tmpfile, tablename, fields_terminated,
                                      data_exists_action)
            log('upload: %s %s [%s] %ss %s %s' %
                (client, obj, data_exists_action, int(time.time() - t1),
                 tmpfile, rst))
            try:
                remove(tmpfile)
            except:
                log('remove resultfile Failed: %s' % tmpfile)
            return return_http_json(rst)
        else:
            raise UploadDataParameterError(" Unknown value `" +
                                           data_exists_action +
                                           "` for data_exists_action")
    else:
        raise UploadDataMethodError(
            """Please POST your data like this: curl  -F file=@filename -F _o=cdnbw -F _s=201203201340 -F '_t= '  http://jdata.domain/api/uploadresultfile"""
        )
Exemple #13
0
 def to_django_response(self):
     try:
         error = eval(self.__str__())
     except:
         error = self.__str__()
     return return_http_json({'code':self.errcode,'error':error})